Révision 495
Ajouté par Victor SOUDY il y a presque 3 ans
main.c | ||
---|---|---|
#include <stdlib.h>
|
||
#include <strings.h>
|
||
#include "trame.h"
|
||
#include <math.h>
|
||
#include <math.h>
|
||
|
||
#define r_Terre 6370
|
||
|
||
//Trames de tests ? modifier si n?cessaire.
|
||
char * trames[]= {"$GPGSV,3,2,10,15,03,077,,18,04,041,42,19,85,271,,20,08,214,*7C",
|
||
... | ... | |
float latitude;
|
||
}position;
|
||
|
||
position pos,pos1,pos2,pos3,pos4,pos5,pos6; //declaration de position utiles dans la suite des calculs et tests unitaires
|
||
|
||
//fcts ajout?s
|
||
int trame_cmp(char*trame,char*type)
|
||
{
|
||
... | ... | |
float lat_to_float (char*trame)
|
||
{
|
||
float latd,latm,lats,latdeg;
|
||
latd=decode_nombre(&trame[17],2);
|
||
latm=decode_nombre(&trame[19],2);
|
||
lats=decode_nombre(&trame[21],4);
|
||
latd=decode_nombre(&trame[17],2); //recupere les degres
|
||
latm=decode_nombre(&trame[19],2); //recupere les minutes
|
||
lats=decode_nombre(&trame[21],4); //recupere les secondes
|
||
latdeg=latd+((latm+(lats/10000))/60.0);
|
||
return latdeg; // retourne le r?sultat de la lattitude en degr?s de la trame
|
||
}
|
||
... | ... | |
float long_to_float (char*trame)
|
||
{
|
||
float longd,longm,longs,longdeg;
|
||
longd=decode_nombre(&trame[29],3);
|
||
longm=decode_nombre(&trame[32],2);
|
||
longs=decode_nombre(&trame[35],4);
|
||
longd=decode_nombre(&trame[29],3); //recupere les degres
|
||
longm=decode_nombre(&trame[32],2); //recupere les minutes
|
||
longs=decode_nombre(&trame[35],4); //recupere les secondes
|
||
longdeg=longd+((longm+(longs/10000))/60.0);
|
||
return longdeg; //retourne le r?sultat de la longitude en degr?s de la trame
|
||
}
|
||
|
||
//void coordonnee_to_float (char*trame,position pos)
|
||
void coordonne_to_float (char*trame,float* lat_position,float* long_position)
|
||
|
||
decode_trame(char*trame,position *p) //permet de retourner directement la longitude et la lattitude d'une position
|
||
{
|
||
*lat_position=lat_to_float (trame);
|
||
*long_position=long_to_float (trame);
|
||
p->longitude = long_to_float (trame); // '->' permet d'identifier le champ de la structure c'est comme le point sauf ici on est avec des pointeurs
|
||
p->latitude= lat_to_float(trame);
|
||
}
|
||
|
||
float calcul_distance(position *pos1, position *pos2)
|
||
{
|
||
float distance;
|
||
distance = sqrt(pow((pos2->latitude-pos1->latitude)*M_PI*r_Terre/180.0,2)+pow(((pos2->longitude-pos1->longitude)*
|
||
(cos(((pos2->latitude+pos1->latitude)/2.0)*M_PI/180.0)*M_PI*r_Terre/180.0)),2)); // calcul de la distance a partir des longitudes et lattitudes des 2 positions
|
||
return distance; //M_PI vaut pi il appartient a la bibliotheque math.h
|
||
}
|
||
|
||
|
||
float calcul_vitesse(position pos1, position pos2)
|
||
{
|
||
float vitesse;
|
||
vitesse=calcul_distance(&pos1,&pos2)*3600; // calcul de la vitesse ? partir de la distance pr?alablement calcul?e
|
||
return vitesse;
|
||
}
|
||
|
||
|
||
|
||
|
||
//Fonction ? modifier !!!!!754198
|
||
void traitement(char*trame)
|
||
... | ... | |
trame_cmp(trame,"GPGGA");
|
||
if (trame_cmp(trame,"GPGGA")==1)
|
||
{
|
||
float x,y;
|
||
coordonne_to_float(trame,&x,&y);
|
||
printf("lat=%f\nlong=%f\n",x,y);
|
||
printf ("> %s\n",trame);
|
||
printf("la vitesse est de : %d",calcul_vitesse(pos1,pos2));
|
||
}
|
||
}
|
||
|
||
|
||
// declaration des positions servant dans la suite de l'exercice
|
||
position pos1;
|
||
position pos2;
|
||
|
||
|
||
|
||
decode_trame(char*trame,position *p)
|
||
{
|
||
p->longitude =long_to_float (trame); // -> permet d'identifier le champ de la structure c'est comme le point sauf ici on est avec des pointeurs
|
||
p->latitude=lat_to_float(trame);
|
||
}
|
||
|
||
float calcul _vitesse(position pos1, position pos2)
|
||
{
|
||
int r_Terre=6371;
|
||
float D,vitesse;
|
||
D=sqrt(pow((pos2.Longitude-pos1.Longitude)*r_Terre,2)+pow((pos2.Latitude-pos1.Latitude)*r_Terre,2)); // calcul de la distance ? partir des longitudes et lattitudes des 2 positions
|
||
vitesse=(D*r_Terre)/3600; // calcul de la vitesse ? partir de la distance pr?alablement calcul?e
|
||
return vitesse;
|
||
}
|
||
|
||
//Ajouter vos tests unitaires dans cette fonction.
|
||
void tests_unitaires(void)
|
||
{
|
||
{
|
||
// test trivial pour verifier que tout va bien
|
||
if (5!=5)
|
||
{
|
||
printf ("Erreur Test unitaire basique.\n");
|
||
... | ... | |
printf("Erreur test unitaire longitude\n");
|
||
exit(-1);
|
||
}
|
||
//-------------------------//
|
||
//-----------------------------------------------------------//
|
||
//test unitaire decode_trame
|
||
decode_trame("$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D",&pos1);
|
||
if (pos1.latitude==45.75)
|
||
{
|
||
printf("decode_trame OK!\n");
|
||
decode_trame("$GPGGA,141914.00,4645.5624,N,00306.0000,E,1,05,3.4,499.3,M,,M,,*7D",&pos);
|
||
if(fabs(fabs(pos.latitude)-46.759373 >10-6)){
|
||
printf ("Erreur Test unitaire decode_trame \n");
|
||
exit(-1);
|
||
}
|
||
if (pos1.longitude==4.77)
|
||
{
|
||
printf("decode_trame OK!\n");
|
||
if(fabs(fabs(pos.longitude)-3.100000 >10-6)){
|
||
printf ("Erreur Test unitaire decode_trame\n");
|
||
exit(-1);
|
||
}
|
||
//-----------------------------------------------------------//
|
||
//test unitaire calcul_distance
|
||
|
||
/* //declaration coordonnees de 3 villes pour les tests unitaires de calcul_distance
|
||
|
||
//Paris
|
||
pos2.latitude = 48.8588897;
|
||
pos2.longitude = 2.320041;
|
||
//Lyon
|
||
pos3.latitude = 45.7578137;
|
||
pos3.longitude = 4.8320114;
|
||
//Bordeaux
|
||
pos4.latitude = 44.841225;
|
||
pos4.longitude = -0.5800364;
|
||
|
||
//test_1 de calcul_distance entre Paris et Bordeaux permettant de voir si la distance est dans l'intervalle donne sur internet
|
||
if((calcul_distance(&pos2,&pos4)>498) & (calcul_distance(&pos1,&pos2)<499)){}
|
||
else{
|
||
printf ("Erreur Test_1 unitaire calcul_distance \n");
|
||
exit(-1);
|
||
}
|
||
//test_2 de calcul_distance entre Paris et Lyon permettant de voir si la distance est dans l'intervalle donne sur internet
|
||
if((calcul_distance(&pos2,&pos3)>393) & (calcul_distance(&pos1,&pos2)<394)){}
|
||
else{
|
||
printf ("Erreur Test_2 unitaire calcul_distance \n");
|
||
exit(-1);
|
||
}
|
||
*/ // ces ? tests ne semblent pas fonctionner je ne vois pas pourquoi ...
|
||
//-----------------------------------------------------------//
|
||
//test unitaire calcul_vitesse
|
||
|
||
//declaration de 2 points de latitude et de longitude proche afin de simuler une difference de position d'une seconde
|
||
pos5.latitude = 45.752911;
|
||
pos5.longitude = 3.110066;
|
||
pos6.latitude = 45.75298;
|
||
pos6.longitude = 3.11007;
|
||
|
||
//la vitesse etant un floattant on verifie donc la precision de la mesure
|
||
if((calcul_vitesse(pos5,pos6)-27.51)>1e-2){
|
||
printf ("Erreur Test unitaire calcul vitesse.\n");
|
||
exit(-1);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
Formats disponibles : Unified diff
modification des fcts de calcul de distance et de vitesse ainsi que leurs tests unitaires associées. indentation de code et ajout de commentaires. suppression de ma fct affichant les coordonnées pour la remplacer par decode_trame comme demandé.