2017-04-01 15:01:36 +00:00
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#include "avion.h"
|
|
|
|
|
|
|
|
// caractéristiques du déplacement de l'avion
|
|
|
|
struct deplacement dep;
|
|
|
|
|
|
|
|
// coordonnées spatiales de l'avion
|
|
|
|
struct coordonnees coord;
|
|
|
|
|
|
|
|
// numéro de vol de l'avion : code sur 5 caractères
|
|
|
|
char numero_vol[6];
|
|
|
|
|
|
|
|
/********************************
|
|
|
|
*** 3 fonctions à implémenter
|
|
|
|
********************************/
|
|
|
|
|
2017-04-06 10:01:18 +00:00
|
|
|
int ouvrir_communication(){
|
2017-04-01 15:01:36 +00:00
|
|
|
// fonction à implémenter qui permet d'entrer en communication via TCP
|
|
|
|
// avec le gestionnaire de vols
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2017-04-06 10:01:18 +00:00
|
|
|
void fermer_communication(){
|
2017-04-01 15:01:36 +00:00
|
|
|
// fonction à implémenter qui permet de fermer la communication
|
|
|
|
// avec le gestionnaire de vols
|
|
|
|
}
|
|
|
|
|
2017-04-06 10:01:18 +00:00
|
|
|
void envoyer_caracteristiques(){
|
2017-04-01 15:01:36 +00:00
|
|
|
// fonction à implémenter qui envoie l'ensemble des caractéristiques
|
|
|
|
// courantes de l'avion au gestionnaire de vols
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************
|
|
|
|
*** Fonctions gérant le déplacement de l'avion : ne pas modifier
|
|
|
|
********************************/
|
|
|
|
|
|
|
|
// initialise aléatoirement les paramètres initiaux de l'avion
|
2017-04-06 10:01:18 +00:00
|
|
|
void initialiser_avion(){
|
2017-04-01 15:01:36 +00:00
|
|
|
// initialisation aléatoire du compteur aléatoire
|
|
|
|
int seed;
|
|
|
|
time(&seed);
|
|
|
|
srandom(seed);
|
|
|
|
|
|
|
|
// intialisation des paramètres de l'avion
|
|
|
|
coord.x = 1000 + random() % 1000;
|
|
|
|
coord.y = 1000 + random() % 1000;
|
2017-04-06 10:01:18 +00:00
|
|
|
coord.z = 900 + random() % 100;
|
2017-04-01 15:01:36 +00:00
|
|
|
|
|
|
|
dep.cap = random() % 360;
|
|
|
|
dep.vitesse = 600 + random() % 200;
|
|
|
|
|
|
|
|
// initialisation du numero de l'avion : chaine de 5 caractères
|
|
|
|
// formée de 2 lettres puis 3 chiffres
|
|
|
|
numero_vol[0] = (random() % 26) + 'A';
|
|
|
|
numero_vol[1] = (random() % 26) + 'A';
|
|
|
|
sprintf (&numero_vol[2], "%03d", (random() % 999) + 1);
|
|
|
|
numero_vol[5] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// modifie la valeur de l'avion avec la valeur passée en paramètre
|
2017-04-06 10:01:18 +00:00
|
|
|
void changer_vitesse(int vitesse){
|
2017-04-01 15:01:36 +00:00
|
|
|
if (vitesse < 0)
|
|
|
|
dep.vitesse = 0;
|
|
|
|
else if (vitesse > VITMAX)
|
|
|
|
dep.vitesse = VITMAX;
|
|
|
|
else dep.vitesse = vitesse;
|
|
|
|
}
|
|
|
|
|
|
|
|
// modifie le cap de l'avion avec la valeur passée en paramètre
|
2017-04-06 10:01:18 +00:00
|
|
|
void changer_cap(int cap){
|
2017-04-01 15:01:36 +00:00
|
|
|
if ((cap >= 0) && (cap < 360))
|
|
|
|
dep.cap = cap;
|
|
|
|
}
|
|
|
|
|
2017-04-06 10:01:18 +00:00
|
|
|
// modifie l'z de l'avion avec la valeur passée en paramètre
|
|
|
|
void changer_z(int alt){
|
2017-04-01 15:01:36 +00:00
|
|
|
if (alt < 0)
|
2017-04-06 10:01:18 +00:00
|
|
|
coord.z = 0;
|
2017-04-01 15:01:36 +00:00
|
|
|
else if (alt > ALTMAX)
|
2017-04-06 10:01:18 +00:00
|
|
|
coord.z = ALTMAX;
|
|
|
|
else coord.z = alt;
|
2017-04-01 15:01:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// affiche les caractéristiques courantes de l'avion
|
2017-04-06 10:01:18 +00:00
|
|
|
void afficher_donnees(){
|
|
|
|
printf("Avion %s -> localisation : (%d,%d), z : %d, vitesse : %d, cap : %d\n",
|
|
|
|
numero_vol, coord.x, coord.y, coord.z, dep.vitesse, dep.cap);
|
2017-04-01 15:01:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// recalcule la localisation de l'avion en fonction de sa vitesse et de son cap
|
2017-04-06 10:01:18 +00:00
|
|
|
void calcul_deplacement(){
|
2017-04-01 15:01:36 +00:00
|
|
|
float cosinus, sinus;
|
|
|
|
float dep_x, dep_y;
|
|
|
|
int nb;
|
|
|
|
|
2017-04-06 10:01:18 +00:00
|
|
|
if (dep.vitesse < VITMIN){
|
2017-04-01 15:01:36 +00:00
|
|
|
printf("Vitesse trop faible : crash de l'avion\n");
|
|
|
|
fermer_communication();
|
|
|
|
exit(2);
|
|
|
|
}
|
2017-04-06 10:01:18 +00:00
|
|
|
if (coord.z == 0){
|
2017-04-01 15:01:36 +00:00
|
|
|
printf("L'avion s'est ecrase au sol\n");
|
|
|
|
fermer_communication();
|
|
|
|
exit(3);
|
|
|
|
}
|
|
|
|
|
|
|
|
cosinus = cos(dep.cap * 2 * M_PI / 360);
|
|
|
|
sinus = sin(dep.cap * 2 * M_PI / 360);
|
|
|
|
|
|
|
|
dep_x = cos(dep.cap * 2 * M_PI / 360) * dep.vitesse * 10 / VITMIN;
|
|
|
|
dep_y = sin(dep.cap * 2 * M_PI / 360) * dep.vitesse * 10 / VITMIN;
|
|
|
|
|
|
|
|
// on se déplace d'au moins une case quels que soient le cap et la vitesse
|
|
|
|
// sauf si cap est un des angles droit
|
|
|
|
if ((dep_x > 0) && (dep_x < 1)) dep_x = 1;
|
|
|
|
if ((dep_x < 0) && (dep_x > -1)) dep_x = -1;
|
|
|
|
|
|
|
|
if ((dep_y > 0) && (dep_y < 1)) dep_y = 1;
|
|
|
|
if ((dep_y < 0) && (dep_y > -1)) dep_y = -1;
|
|
|
|
|
|
|
|
//printf(" x : %f y : %f\n", dep_x, dep_y);
|
|
|
|
|
|
|
|
coord.x = coord.x + (int)dep_x;
|
|
|
|
coord.y = coord.y + (int)dep_y;
|
|
|
|
|
|
|
|
afficher_donnees();
|
|
|
|
}
|
|
|
|
|
|
|
|
// fonction principale : gère l'exécution de l'avion au fil du temps
|
|
|
|
void se_deplacer()
|
|
|
|
{
|
|
|
|
while(1)
|
|
|
|
{
|
|
|
|
sleep(PAUSE);
|
|
|
|
calcul_deplacement();
|
|
|
|
envoyer_caracteristiques();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
// on initialise l'avion
|
|
|
|
initialiser_avion();
|
|
|
|
|
|
|
|
afficher_donnees();
|
|
|
|
// on quitte si on arrive à pas contacter le gestionnaire de vols
|
|
|
|
if (!ouvrir_communication())
|
|
|
|
{
|
|
|
|
printf("Impossible de contacter le gestionnaire de vols\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
// on se déplace une fois toutes les initialisations faites
|
|
|
|
se_deplacer();
|
|
|
|
}
|