Révision 520
Ajouté par Domingos Joao BRAVO il y a presque 3 ans
main.c | ||
---|---|---|
#include <stdlib.h>
|
||
#include <strings.h>
|
||
#include <math.h>
|
||
#include "trame.h"
|
||
#include "trame.h"
|
||
|
||
#define Rterre 6370
|
||
#define PI 3.14159
|
||
|
||
//Structure
|
||
|
||
typedef struct
|
||
{
|
||
float Latitude;
|
||
float Longitude;
|
||
}Pos;
|
||
|
||
//Position p1,p2;
|
||
|
||
typedef struct
|
||
{
|
||
Pos rp;
|
||
float vitmax;
|
||
}Zone;
|
||
|
||
Zone zones[] = {
|
||
{{44.7887762, -3.012}, 50}, /* Descripteur de la premi?re zone */
|
||
{{44.7891220, -3,013}, 70},
|
||
{{46.2514780, 4.000}, 80},
|
||
};
|
||
|
||
int nb_zone=3;
|
||
|
||
|
||
//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",
|
||
"$GPGSV,3,3,10,22,39,053,50,28,15,320,*7E",
|
||
... | ... | |
"$GPZDA,141914.00,01,02,2006,00,00*69",
|
||
0};
|
||
|
||
/*void ma_fonction(){
|
||
|
||
}
|
||
void decode_trame(char * tr){
|
||
|
||
|
||
//Fontions personnelles
|
||
|
||
|
||
/*void decode_trame(char * tr){
|
||
//implanter une partie de votre code ICI.
|
||
Appel de ma_fonction() ;
|
||
}
|
||
... | ... | |
}
|
||
*/
|
||
|
||
//Structure
|
||
|
||
typedef struct
|
||
int trame_cmp(char*trame, char*type)
|
||
{
|
||
float Latitude;
|
||
float Longitude;
|
||
}Position;
|
||
|
||
Position p1,p2;
|
||
typedef struct
|
||
{
|
||
Position rpos;
|
||
float vitmax;
|
||
}Zone;
|
||
|
||
//Fontions personnelles
|
||
|
||
int trame_cmp(char * trame, char * type)
|
||
{
|
||
int i=0, ok=1;
|
||
|
||
for(i=0;i<6;i++)
|
||
... | ... | |
{
|
||
static int cpt=0 ;
|
||
cpt++ ;
|
||
Pos p;
|
||
|
||
/* if(trame_cmp("$GPGGA suite chaine","GPGGA"))
|
||
if(trame_cmp(trame,"GPGGA")==1)
|
||
{
|
||
printf("%s\n",trame);
|
||
decode_trame(trame,&p);
|
||
|
||
}*/
|
||
printf ("> %s\n",trame);
|
||
|
||
|
||
printf("Latitude= %f , Longtude= %f \n",p.Latitude,p.Longitude);
|
||
}
|
||
}
|
||
|
||
|
||
... | ... | |
|
||
int decode_int(char c)
|
||
{
|
||
int b;
|
||
|
||
if(c>='0' && (c<='9'))
|
||
{
|
||
c=c-48;
|
||
b=c-48;
|
||
}
|
||
else
|
||
{
|
||
if((c>='A') && c<='Z')
|
||
{
|
||
c=64-c;
|
||
b=64-c;
|
||
}
|
||
}
|
||
return c;
|
||
return b;
|
||
}
|
||
void test_decode_int(void)
|
||
{
|
||
... | ... | |
}
|
||
}
|
||
|
||
int decode_nombre(char *ch, int n)
|
||
int decode_nombre(char *ch,int i,int n)
|
||
{
|
||
int temp=0, i;
|
||
int temp=0, j;
|
||
|
||
for(i=0;i<n;i++)
|
||
for(j=i;j<i+n;j++)
|
||
{
|
||
temp=(temp*10) + decode_int(ch[i]);
|
||
temp=(temp*10) + decode_int(ch[j]);
|
||
}
|
||
return temp;
|
||
}
|
||
|
||
void test_decode_nombre(void)
|
||
{
|
||
if(decode_nombre("4325",2)!=43){
|
||
if(decode_nombre("4325",0,2)!=43){
|
||
printf("Erreur test decode_nombre.\n");
|
||
}
|
||
if(decode_nombre("6789",1,3)!=789){
|
||
printf("Erreur test decode_nombre.\n");
|
||
}
|
||
}
|
||
|
||
float decode_latitude(char *trame )
|
||
{
|
||
float degres,reste,flottant,res;
|
||
float deg,reste,flottant,res;
|
||
int i=17;
|
||
degres=decode_nombre(trame,i+2);
|
||
reste=decode_nombre(trame,i+4);
|
||
flottant=decode_nombre(trame,i+10);
|
||
deg=decode_nombre(trame,i+2,i);
|
||
reste=decode_nombre(trame,i+4,i+2);
|
||
flottant=decode_nombre(trame,i+10,i+5);
|
||
res=deg+((reste+(flottant/10000))/60);
|
||
|
||
res=degres+((reste+(flottant/10000))/60);
|
||
if(trame[40]=='W')
|
||
{
|
||
res-=res;
|
||
}
|
||
return res;
|
||
|
||
}
|
||
|
||
float decode_longitude(char *trame )
|
||
{
|
||
float degres,reste,flottant,res;
|
||
int i=30;
|
||
degres=decode_nombre(trame,i+2);
|
||
reste=decode_nombre(trame,i+3);
|
||
flottant=decode_nombre(trame,i+10);
|
||
float deg,reste,flottant,res;
|
||
int j=30;
|
||
deg=decode_nombre(trame,j+2,j);
|
||
reste=decode_nombre(trame,j+3,j+2);
|
||
flottant=decode_nombre(trame,j+10,j+5);
|
||
res=deg+((reste+(flottant/10000))/60);
|
||
|
||
res=degres+((reste+(flottant/10000))/60);
|
||
if(trame[40]=='S')
|
||
{
|
||
res-=res;
|
||
}
|
||
return res;
|
||
|
||
}
|
||
|
||
float decode_position(char *trame,Position Pos)
|
||
void decode_trame(char *trame,Pos *P)
|
||
{
|
||
Pos.Latitude=decode_latitude(trame);
|
||
Pos.Longitude=decode_longitude(trame);
|
||
P->Latitude=decode_latitude(trame);
|
||
P->Longitude=decode_longitude(trame);
|
||
}
|
||
|
||
|
||
float calcule_distance(Position p1, Position p2)
|
||
float calcule_distance(Pos p1, Pos p2)
|
||
{
|
||
float distance;
|
||
distance=((2*3.14*6370)/360)*sqrt((p2.Latitude-p1.Latitude)*(p2.Latitude-p1.Latitude)+(p2.Longitude-p1.Longitude)*(p2.Longitude-p1.Longitude));
|
||
distance=((2*3.14*Rterre)/360)*sqrt((p2.Latitude-p1.Latitude)*(p2.Latitude-p1.Latitude)+(p2.Longitude-p1.Longitude)*(p2.Longitude-p1.Longitude));
|
||
return distance;
|
||
}
|
||
float calcule_vitesse(Position p1, Position p2)
|
||
|
||
|
||
float calcule_vitesse(Pos p1, Pos p2)
|
||
{
|
||
float vitesse;
|
||
vitesse=(calcule_distance(p1,p2)*3600);
|
||
vitesse=(calcule_distance(p1,p2)*3600); /* v(m/s)=d/t le temps est 1s donc on multiplie par 3600 pour l'avoir en km/h */
|
||
return vitesse;
|
||
}
|
||
Zone r[] = {
|
||
{{44.7887762, -3.012}, 50}, /* Descripteur de la premi?re zone */
|
||
{{44.7891220, -3,013}, 70},
|
||
};
|
||
|
||
|
||
int distance_la_plus_proche_zone(Position p, Zone r[], int nbzones, float *d)
|
||
int distance_la_plus_proche_zone(Pos p, Zone rp[], int nbzones, float *d)
|
||
{
|
||
int min_distance;
|
||
min_distance=2000000;
|
||
float Dist_int;
|
||
int i, j;
|
||
|
||
|
||
Dist_int = calcule_distance(&p, &rp[0].rp);
|
||
for (i=0; i<nbzones; i++)
|
||
{
|
||
*d = calcul_distance(&p, &rp[i].rp);
|
||
if (*d<=Dist_int)
|
||
{
|
||
j=i;
|
||
Dist_int=*d;
|
||
}
|
||
}
|
||
return j;
|
||
}
|
||
|
||
// Ne pas modifier cette fonction
|
Formats disponibles : Unified diff
Modifications TP1 et TP2