Révision 198
Ajouté par mamorales il y a presque 4 ans
branch/Morales/sp4a12/main.c | ||
---|---|---|
"$GPZDA,141914.00,01,02,2006,00,00*69",
|
||
0};
|
||
|
||
// structure pour la longitude et la latitude.
|
||
typedef struct {
|
||
float latitude;
|
||
float longitude;
|
||
} Position ;
|
||
|
||
// initialisation des fonctions.
|
||
int trame_cmp(char* trame,char* type);
|
||
int decode_int (char c);
|
||
int decode_nombre(char * ch,int n);
|
||
float sexagesimal_to_float(char* value);
|
||
float lat_sexagesimal(char* trame);
|
||
float longitude_sexagesimal(char* trame);
|
||
int decode_trame (char*trame, Position *p);
|
||
|
||
|
||
|
||
|
||
//fonction comparant les trames
|
||
int trame_cmp(char* trame,char* type)
|
||
{
|
||
... | ... | |
}
|
||
|
||
//fonction covertissant des sexagesimal (latitude ou longitude) en reel
|
||
float sexagesimal_to_float(float lat)
|
||
float sexagesimal_to_float(char* value)
|
||
{
|
||
int float_deg=lat/100;
|
||
float float_minutes=0;
|
||
float value = 0;
|
||
|
||
float_minutes = (lat-float_deg*100)/60;
|
||
value = float_deg + float_minutes;
|
||
|
||
return value;
|
||
}
|
||
|
||
//fonction convertissant la cha?ne de caract?re contenant la latitude en nombre flottant
|
||
float lat_sexagesimal(char* trame)
|
||
{
|
||
int i=0;
|
||
int j=0;
|
||
int val_entiere_taille = 0;
|
||
int val_decimale_taille = 0;
|
||
int nbr_virgule=0;
|
||
float lat=0;
|
||
char val_entiere[6];
|
||
char val_decimal[6];
|
||
int val_entiere_taille = 0; // taille de la partie entiere de la valeur
|
||
int val_decimale_taille = 0; // taille de la partie decimal de la valeur
|
||
char val_entiere[10]={0}; //valeur entiere de la longitude, on reserve 6 cases par s?curite.
|
||
char val_decimal[10]={0}; //valeur decimale de la longitude, on reserve 6 cases par s?curite.
|
||
float sexages_value=0;
|
||
float float_val=0;
|
||
|
||
while (nbr_virgule<2) // on compte jusqu? la deuxi?me virgule (3?me champs)
|
||
{
|
||
if (trame[i]==',')
|
||
{
|
||
nbr_virgule = nbr_virgule+1;
|
||
}
|
||
i++;
|
||
}
|
||
// on ne peux pas passer directement d'un caract?re avec des virgule ? un flottant, du coup on passe par deux cha?ne de caract?res
|
||
// intermediares pour avoir ce qui correspond ? la partie enti?re et ce qui correspond ? la partie decimale
|
||
// on ne peux pas passer directement d'un caract?re avec des virgule ? un flottant, du coup on passe par deux cha?ne de caract?res
|
||
// intermediares pour avoir ce qui correspond ? la partie enti?re et ce qui correspond ? la partie decimale
|
||
|
||
while (trame[i]!='.')
|
||
while (value[i]!='.')
|
||
{
|
||
val_entiere[j]=trame[i];
|
||
val_entiere[j]=value[i];
|
||
j++; // stock la partie entiere
|
||
i++;
|
||
}
|
||
val_entiere_taille = j;
|
||
j=0;
|
||
i++; // on ne stock pas le point dans les chaines
|
||
while (trame[i]!=',')
|
||
|
||
j=0; //reinitialise j
|
||
i++; // on ne stock pas le point dans les 2 chaines
|
||
|
||
while (value[i]!='\0')
|
||
{
|
||
val_decimal[j]=trame[i]; // stock la partie decimale
|
||
val_decimal[j]=value[i]; // stock la partie decimale
|
||
j++;
|
||
i++;
|
||
}
|
||
val_decimale_taille = j;
|
||
|
||
// stockage de la valeur sexagesimale
|
||
sexages_value = decode_nombre(val_entiere,val_entiere_taille) + 0.0001* decode_nombre(val_decimal,val_decimale_taille);
|
||
|
||
int float_deg=sexages_value/100;
|
||
float float_minutes=0;
|
||
|
||
lat = decode_nombre(val_entiere,val_entiere_taille) + 0.0001* decode_nombre(val_decimal,val_decimale_taille); //on stock la valeur de la latitude
|
||
float_minutes = (sexages_value-float_deg*100)/60;
|
||
float_val = float_deg + float_minutes;
|
||
|
||
lat = sexagesimal_to_float(lat); // transformation en flottant
|
||
return lat;
|
||
return float_val;
|
||
}
|
||
|
||
//fonction convertissant la cha?ne de caract?re contenant la longitude en nombre flottant
|
||
float longitude_sexagesimal(char* trame)
|
||
//fonction convertissant la latitude et longitude en reels.
|
||
int decode_trame(char* trame,Position *p)
|
||
{
|
||
int i=0;
|
||
int j=0;
|
||
int val_entiere_taille = 0; // taille de la partie entiere de la longitude
|
||
int val_decimale_taille = 0; // taille de la partie d?cimal de la longitude
|
||
int nbr_virgule=0;
|
||
float longitude=0;
|
||
char val_entiere[6]; //valeur entiere de la longitude, on reserve 6 cases par s?curit?.
|
||
char val_decimal[6];
|
||
char lat[15]={0};
|
||
char longit[15]={0};
|
||
if (trame_cmp(trame,"GPGGA")==0)
|
||
{
|
||
return 0;
|
||
}
|
||
//calcul latitude
|
||
while (nbr_virgule<3) // on compte jusqu'a la troisieme virgule
|
||
{
|
||
while (nbr_virgule<2) // on compte jusqu'a la deuxieme virugle (troisieme champs)
|
||
{
|
||
if (trame[i]==',')
|
||
{
|
||
nbr_virgule = nbr_virgule+1;
|
||
}
|
||
i++;
|
||
}
|
||
|
||
while (nbr_virgule<4) // on compte jusqu? la quatri?me virgule (5?me champs)
|
||
{
|
||
lat[j]=trame[i];
|
||
j++;
|
||
i++;
|
||
if (trame[i]==',')
|
||
{
|
||
nbr_virgule = nbr_virgule+1;
|
||
}
|
||
i++;
|
||
|
||
}
|
||
// on ne peux pas passer directement d'un caract?re avec des virgule ? un flottant, du coup on passe par deux cha?ne de caract?res
|
||
// intermediares pour avoir ce qui correspond ? la partie enti?re et ce qui correspond ? la partie decimale
|
||
|
||
while (trame[i]!='.')
|
||
p->latitude = sexagesimal_to_float(lat); // transformation en flottant
|
||
|
||
j=0; //reinitialise j
|
||
i++; // une it?ration de i pour avoir i!=','
|
||
|
||
// calcul longitude
|
||
while (nbr_virgule<5) // on compte jusqu'a la troisieme virgule
|
||
{
|
||
val_entiere[j]=trame[i];
|
||
j++; // stock la partie entiere
|
||
i++;
|
||
}
|
||
val_entiere_taille = j;
|
||
j=0;
|
||
i++; // on ne stock pas le point dans les chaines
|
||
while (trame[i]!=',')
|
||
{
|
||
val_decimal[j]=trame[i]; // stock la partie decimale
|
||
while (nbr_virgule<4) // on compte jusqu'a la deuxieme virugle (cinquieme champs)
|
||
{
|
||
if (trame[i]==',')
|
||
{
|
||
nbr_virgule = nbr_virgule+1;
|
||
}
|
||
i++;
|
||
}
|
||
|
||
longit[j]=trame[i];
|
||
j++;
|
||
i++;
|
||
if (trame[i]==',')
|
||
{
|
||
nbr_virgule = nbr_virgule+1;
|
||
}
|
||
|
||
}
|
||
val_decimale_taille = j;
|
||
|
||
longitude = decode_nombre(val_entiere,val_entiere_taille) + 0.0001* decode_nombre(val_decimal,val_decimale_taille); //on stock la valeur de la longitude
|
||
longitude = sexagesimal_to_float(longitude);
|
||
p->longitude = sexagesimal_to_float(longit); // transformation en flottant
|
||
|
||
return longitude;
|
||
return 1;
|
||
}
|
||
|
||
|
||
|
||
//Fonction ? modifier !!!!!
|
||
void traitement(char * trame)
|
||
{
|
||
|
||
|
||
Position p;
|
||
static int cpt = 0;
|
||
cpt++;
|
||
if (trame_cmp(trame,"GPGGA"))
|
||
if (decode_trame(trame,&p))
|
||
{
|
||
printf ("> %s\n",trame);
|
||
printf("latitude en reel : %f\n",lat_sexagesimal(trame));
|
||
printf("longitude en reel : %f\n\n",longitude_sexagesimal(trame));
|
||
|
||
printf("latitude en reel : %f\n",p.latitude);
|
||
printf("longitude en reel : %f\n\n",p.longitude);
|
||
}
|
||
}
|
||
|
||
... | ... | |
printf ("Erreur Test unitaire decode_nombre.\n");
|
||
exit(-1);
|
||
}
|
||
/*if ((sexagesimal_to_float (3723.2475)<=37,387458)||(sexagesimal_to_float (3723.2475)>=37,387460))
|
||
if ((sexagesimal_to_float ("3723.2475")<=37.387458)||(sexagesimal_to_float ("3723.2475")>=37.387459))
|
||
{
|
||
printf ("Erreur Test unitaire sexagesimal_to_float.\n");
|
||
exit(-1);
|
||
}*/
|
||
}
|
||
if ((sexagesimal_to_float ("00306.6036")<=3.11006)||(sexagesimal_to_float ("00306.6036")>=3.11007))
|
||
{
|
||
printf ("Erreur Test unitaire sexagesimal_to_float.\n");
|
||
exit(-1);
|
||
}
|
||
}
|
||
|
||
// Ne pas modifier cette fonction
|
Formats disponibles : Unified diff
Finalisation du TP, modification de la fonction capable de convertir toute latitude/longitude sexagésimal, unification des deux fonction pour récupérer la longitude et la latitude dans les trame en une seule fonction.
Ajout des test unitaires de la question 11.