Révision 434
Ajouté par Hatim EL MAADI il y a presque 3 ans
branch/ELMAADI/sp4a12/main.c | ||
---|---|---|
"$GPVTG,99.4,T,,M,0.4,N,0.7,K*57",
|
||
"$GPZDA,141914.00,01,02,2006,00,00*69",
|
||
0};
|
||
/*D?claration des structure*/
|
||
typedef struct
|
||
{
|
||
float latitude;
|
||
... | ... | |
Position rpos;
|
||
float vitmax;
|
||
}Zone;
|
||
|
||
/*D?finition des zone dangereuses*/
|
||
Zone zones[]=
|
||
{
|
||
{{44.788762, -3.012},50},
|
||
... | ... | |
|
||
};
|
||
|
||
|
||
/*Fonction qui renvoie 1 si la trame commence par la cha?ne de caract?re type et z?ro dans les autres cas*/
|
||
int trame_cmp(char *trame,char *type)
|
||
|
||
{
|
||
int i;
|
||
int res=1;
|
||
for (i=0;i<5;i++)
|
||
{
|
||
if(trame[i+1]!=type[i])
|
||
if(trame[i+1]!=type[i]) /*V?rification si la trame commence par GPGGA */
|
||
{
|
||
res=0;
|
||
}
|
||
... | ... | |
return res;
|
||
}
|
||
|
||
/*Fonction qui renvoie la valeur d?cimale associ?e ? un caract?re donn? en param?tre.*/
|
||
int decode_int(char c)
|
||
{
|
||
int val;
|
||
val = c-48;
|
||
val = c-48;/* Convertir caract?re ASCII en entier*/
|
||
if (val>9)
|
||
{
|
||
val=-1;
|
||
... | ... | |
return val;
|
||
}
|
||
|
||
/*Fonction qui renvoie la valeur d?cimale des n premiers caract?res de la cha?ne ch en utilisant decode_int()*/
|
||
int decode_nombre(char *ch, int n)
|
||
{
|
||
int i;
|
||
... | ... | |
}
|
||
return S;
|
||
}
|
||
|
||
/*Fonction qui permet de convertir la cha?ne de caract?re contenant la latitude en nombre flottant*/
|
||
float latitude (char *ch)
|
||
{
|
||
float degre, min1, min2, result;
|
||
degre=(float)decode_nombre(&ch[0],2);
|
||
degre=(float)decode_nombre(&ch[0],2); /* acc?der au caract?re qui nous int?resse*/
|
||
min1=(float)decode_nombre(&ch[0+2],2);
|
||
min2=(float)decode_nombre(&ch[0+5],4);
|
||
result=degre+(min1/60)+(min2/600000);
|
||
result=degre+(min1/60)+(min2/600000);/* Additionner tout apr?s avoir tout converti en degr?*/
|
||
return result;
|
||
}
|
||
|
||
/* Fonction qui permet de convertir la cha?ne de caract?re contenant la longitude en nombre flottant */
|
||
float longitude (char *ch)
|
||
{
|
||
float degre, min1, min2, result;
|
||
degre=(float)decode_nombre(&ch[0],3);
|
||
degre=(float)decode_nombre(&ch[0],3);/*Idem*/
|
||
min1=(float)decode_nombre(&ch[0+3],2);
|
||
min2=(float)decode_nombre(&ch[0+6],4);
|
||
result=degre+(min1/60)+(min2/600000);
|
||
result=degre+(min1/60)+(min2/600000);/*Idem*/
|
||
return result;
|
||
}
|
||
|
||
/* Fonction g?n?rique qui d?code indiff?remment une latitude ou une longitude*/
|
||
float latitude_longitude (char * ch)
|
||
{
|
||
float result;
|
||
if(ch[4]==46)
|
||
if(ch[4]==46)/*On determine la nature du carat?re 5 pour choisir la bonne op?ration ? faire*/
|
||
{
|
||
result=latitude(ch);
|
||
}
|
||
... | ... | |
return result;
|
||
}
|
||
|
||
/*Fonction qui d?termine la latitude et la lonngitude de la position*/
|
||
float decode_trame(char *trame, Position *p)
|
||
{
|
||
p->latitude=latitude(trame);
|
||
p->longitude=longitude(trame);
|
||
}
|
||
|
||
float calcule_distance(Position p_1, Position p_2)
|
||
float calcule_distance(Position p_1, Position p_2) /*Calcul de la distance entre deux positions*/
|
||
{
|
||
float dist;
|
||
dist=((2*3.14*6370)/360)*sqrt(pow((p_2.latitude-p_1.latitude),2)+pow((p_2.longitude-p_1.longitude),2));
|
||
dist=((2*3.14*6370)/360)*sqrt(pow((p_2.latitude-p_1.latitude),2)+pow((p_2.longitude-p_1.longitude),2));/* 6370 est le rayon de la terre*/
|
||
return dist;
|
||
}
|
||
|
||
float calcule_vitesse(Position p_1, Position p_2)
|
||
float calcule_vitesse(Position p_1, Position p_2)/*calcul de la vitesse ? l'aide de la distance entre deux positions */
|
||
{
|
||
float vit;
|
||
vit=(calcule_distance(p_1,p_2)*3600);
|
||
return vit;
|
||
}
|
||
|
||
/*Fonction qui renvoie le num?ro de la zone la plus proche du point p ainsi que sa distance.*/
|
||
int distance_a_la_plus_proche_zone(Position p, Zone r[], int nb_zones, float *d)
|
||
{
|
||
int i,j;
|
||
float D0;
|
||
D0=calcule_distance(p, r[0].rpos);
|
||
D0=calcule_distance(p, r[0].rpos); /*Initialisation d'une distance de r?f?rence qui est la distnace initiale*/
|
||
if (nb_zones>0)
|
||
{
|
||
for(i=1;i>nb_zones;i++)
|
||
... | ... | |
*d=calcule_distance(p,r[i].rpos);
|
||
if(*d<D0)
|
||
{
|
||
j=i;
|
||
D0=*d;
|
||
j=i; /* changement de l'indice */
|
||
D0=*d; /* changement de la r?f?rence*/
|
||
}
|
||
}
|
||
return j;
|
||
... | ... | |
cpt++;
|
||
if (trame_cmp(trame,"GPGGA"))
|
||
{
|
||
printf ("> %s\n",trame);
|
||
printf ("> %s\n",trame); /*Afficher que les trames GPGGA*/
|
||
}*/
|
||
Position P,P0;
|
||
float vit, dist;
|
||
int zone_nb, trameOK, alarme=0, Dmax=1;
|
||
int zone_nb, trameOK, alarme=0, Dmax=1;/*Dmax:distance maximale pour d?clencher l'alarme*/
|
||
trameOK=1;
|
||
if (trame_cmp(trame,"GPGGA")==1)
|
||
{
|
||
... | ... | |
|
||
/*Ajouter vos tests unitaires dans cette fonction.*/
|
||
void tests_unitaires(void){
|
||
|
||
/*Test de v?rification du bon fonctionnement*/
|
||
if (5!=5)
|
||
{
|
||
printf ("Erreur Test unitaire basique.\n");
|
||
exit(-1);
|
||
}
|
||
|
||
/*Tests de la fonction tram_cmp*/
|
||
if (trame_cmp("$GPGGA suite chaine","GPGGA")!=1)
|
||
{
|
||
printf ("Erreur Test unitaire trame_cmp.\n");
|
||
... | ... | |
printf ("Erreur Test unitaire trame_cmp.\n");
|
||
exit(-1);
|
||
}
|
||
|
||
/*Test de la fonction decode_int*/
|
||
if (decode_int('2')!=2)
|
||
{
|
||
printf ("Erreur Test unitaire decode_int.\n");
|
||
exit(-1);
|
||
}
|
||
|
||
/*Test de la fonction decode_nombre*/
|
||
if (decode_nombre("1234",2)!=12)
|
||
{
|
||
printf ("Erreur Test unitaire decode_nombre.\n");
|
||
exit(-1);
|
||
}
|
||
|
||
/*Test de la fonction latitude*/
|
||
if (latitude("3723.2475")-37.387458>0.0001)
|
||
{
|
||
printf ("Erreur Test unitaire latitude.\n");
|
||
exit(-1);
|
||
}
|
||
|
||
/*Test de la fonction longitude */
|
||
if (longitude("00306.6043")-3.110071667>0.01)
|
||
{
|
||
printf ("Erreur Test unitaire longitude.\n");
|
||
exit(-1);
|
||
}
|
||
|
||
/*Tests de la fonction latitude_longitude*/
|
||
if (latitude_longitude("00306.6043")-3.110071667>0.01)
|
||
{
|
||
printf ("Erreur Test unitaire latitude_longitude.\n");
|
||
... | ... | |
printf ("Erreur Test unitaire latitude_longitude.\n");
|
||
exit(-1);
|
||
}
|
||
/*Position p;
|
||
if (decode_trame("$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D",&p)!=1)
|
||
/*Position p;*/ /*Tests de la fonction decode_trame*/
|
||
/*if (decode_trame("$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D",&p)!=1)
|
||
{
|
||
printf ("Erreur Test unitaire decode_trame.\n");
|
||
exit(-1);
|
||
... | ... | |
p_3.longitude = 1.2877314;
|
||
printf("distance Paris-Lyon : %f\n",calcule_distance(p_1,p_2));
|
||
printf("distance Lyon-Toulouse : %f\n",calcule_distance(p_2,p_3));*/
|
||
int nb_zone;
|
||
int nb_zone; /*Test de la fonction distance_a_la_plus_proche_zone*/
|
||
float *d;
|
||
Position p,p1,p2;
|
||
nb_zone=distance_a_la_plus_proche_zone(p,zones,2,&d);
|
Formats disponibles : Unified diff
Indentation du programe + Commentaires