Projet

Général

Profil

« Précédent | Suivant » 

Révision 394

Ajouté par lefraisse il y a presque 4 ans

Correction de la fonction decode_trame

Voir les différences:

branch/FRAISSE/sp4a12/main.c
int i, res=0;
for(i=0; i<n; i++)
res = res + (pow(10, n-i-1)) * (decode_int(ch[i]));
res += (pow(10, n-i-1)) * (decode_int(ch[i]));
return res;
}
......
float latitude;
float longitude;
} Position ;
int decode_trame (char *trame,Position *P){
char *type="GPGGA";
int i,j,compteur_virgule=0,compteur_element=0,valide,virgule=0;
char memorisation_tps[11]={'0','0','0','0','0','0','0','0','0','0','\0'};
char memorisation_latitude[10]={'0','0','0','0','0','0','0','0','0','\0'};
char memorisation_indic_latitude[2]={'0','\0'};
char memorisation_longitude[11]={'0','0','0','0','0','0','0','0','0','0','\0'};
float conversion(char * ch){
int i=0,j;
float deglat,deglong;
while(ch[i]!='\0'){
i++;
}
//Cas de la latitude
if (i==8){
deglat=decode_nombre(ch,2);
for (j=2;j<i+1;j++){
deglat+=(ch[j]-'0')*(pow(10,-j+2))*1/6;
}
return deglat;
}
//Cas de la longitude
if (i==9){
deglong=decode_nombre(ch,3);
for (j=3;j<i+1;j++){
deglong+=(ch[j]-'0')*(pow(10,-j+3))*1/6;
}
return deglong;
}
else
printf("Erreur dans la trame %i \n",i);
}
int decode_trame (char *trame,Position P){
int i,compteur_virgule=0,compteur_element=0,valide,virgule=0;
char memorisation_latitude[]={'0','0','0','0','0','0','0','0','\0'};
char memorisation_indic_latitude[]={'0','\0'};
char memorisation_longitude[]={'0','0','0','0','0','0','0','0','0','\0'};
char memorisation_indic_longitude[2]={'0','\0'};
if (trame_cmp(trame,"GPGGA")){
if (trame_cmp(trame,"GPGGA")==1){
valide=1;
for (i=6;compteur_virgule<6;i++){
for (i=0;compteur_virgule<6;i++){
if (trame[i]==','){
compteur_element=0;
compteur_virgule++;
}
else{
switch(compteur_virgule){
case 1: memorisation_tps[compteur_element]=trame[i];
case 2: if (trame[i]!='.'){
memorisation_latitude[compteur_element]=trame[i];
compteur_element++;
break;
case 2: if (trame[i]!='.'){
memorisation_latitude[compteur_element]=trame[i];
}
}
break;
case 3: memorisation_indic_latitude[compteur_element]=trame[i];
compteur_element++;
break;
case 4: if (trame[i]!='.'){
memorisation_longitude[compteur_element]=trame[i];
compteur_element++;
break;
case 3: memorisation_indic_latitude[compteur_element]=trame[i];
compteur_element++;
break;
case 4: if (trame[i]!='.'){
memorisation_longitude[compteur_element]=trame[i];
}
compteur_element++;
break;
case 5: memorisation_indic_longitude[compteur_element]=trame[i];
compteur_element++;
default:break;
}
break;
case 5: memorisation_indic_longitude[compteur_element]=trame[i];
compteur_element++;
default:compteur_element++;
break;
}
}
}
//On d?code la longitude en degr?
P.latitude=conversion(memorisation_latitude);
P.longitude=conversion(memorisation_longitude);
//On d?code les notations S/N/E/O
if(memorisation_indic_latitude[0]=='S')
P.latitude = -P.latitude;
if(memorisation_indic_longitude[0]=='W')
P.longitude = -P.longitude;
}
else
valide=0;
//On d?code les degr?s entiers
P->latitude=decode_nombre(memorisation_latitude,2);
P->longitude=decode_nombre(memorisation_longitude,3);
//On d?code les d?gr?s flottants
for (i=2;i<9;i++){
P->longitude+=memorisation_longitude[i+1]*1/6*pow(10,-i+2);
P->latitude+=(memorisation_latitude[i]-'0')*1/6*pow(10,-i+2);
}
//On d?code les notations S/N/E/O
if(memorisation_indic_latitude[0]=='S')
P->latitude = -P->latitude;
if(memorisation_indic_longitude[0]=='O')
P->longitude = -P->longitude;
return valide;
}
......
exit(-1);
}
test_decode_int();
test_decode_nombre();
test_decode_nombre();
test_decode_trame();
}
void test_decode_int(void){
......
}
void test_decode_trame(void){
Position *p;
if (decode_trame("$GPGLL,4545.6424,N,00306.6036,E,141914.00,A*0E",p)!=1){
printf("Erreur Test decode nombre decode_nombre.\n");
Position p;
if (decode_trame("$GPGLL,4545.6424,N,00306.6036,E,141914.00,A*0E",p)!=0){
printf("Erreur Test decode trame.\n");
exit(-1);
}
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 decode nombre decode_nombre.\n");
printf("Erreur Test decode trame.\n");
exit(-1);
}
if (decode_trame("$GPZDA,141925.00,01,02,2006,00,00*6B",p)!=1){
printf("Erreur Test decode nombre decode_nombre.\n");
if (decode_trame("$GPZDA,141925.00,01,02,2006,00,00*6B",p)!=0){
printf("Erreur Test decode trame.\n");
exit(-1);
}
if (decode_trame("$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39",p)!=1){
printf("Erreur Test decode nombre decode_nombre.\n");
if (decode_trame("$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39",p)!=0){
printf("Erreur Test decode tram.\n");
exit(-1);
}
}
......
traitement(trame);
return 0;
}
}

Formats disponibles : Unified diff