Révision 394
Ajouté par lefraisse il y a presque 4 ans
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
Correction de la fonction decode_trame