Révision 671
Ajouté par jcguifodjo il y a presque 4 ans
main.c | ||
---|---|---|
#include <strings.h>
|
||
#include "trame.h"
|
||
#include "math.h"
|
||
#define k 111120
|
||
#define k 111.120 //Constante a utiliser pour calculer la distance en utilisant la m?thode de Pythagore
|
||
#define N 200
|
||
#define rads 0.01745329252
|
||
#define t 1/6
|
||
#define h 1/60
|
||
#define rads 0.01745329252 //rads=pie/180 puisque le langage C utilise les angles en radians
|
||
|
||
|
||
//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",
|
||
... | ... | |
"$GPGSA,A,3,,03,,22,14,,01,,18,,,,3.9,3.4,1.9*39",
|
||
"$GPVTG,99.4,T,,M,0.4,N,0.7,K*57",
|
||
"$GPZDA,141914.00,01,02,2006,00,00*69",
|
||
|
||
|
||
0};
|
||
|
||
|
||
typedef struct {
|
||
float latitude;
|
||
float longitude;
|
||
} Position ;
|
||
|
||
|
||
//Comparaison des trames pour savoir si la trame est du bon type
|
||
int trame_cmp(char* trame,char* type)
|
||
{
|
||
... | ... | |
return d;
|
||
|
||
}
|
||
|
||
//Conversion d'un caract?re en decimal
|
||
int decode_int(char c)
|
||
{
|
||
... | ... | |
}
|
||
return d;
|
||
}
|
||
|
||
//Renvoi la valeur decimal des n premiers caract?res entr?e en param?tre
|
||
int decode_nombre(char *c, int n)
|
||
{
|
||
... | ... | |
}
|
||
return valeur;
|
||
}
|
||
|
||
//Conversion de la latitude et longitude en degree floatant
|
||
float conversion(char *c)
|
||
{
|
||
int i=0;
|
||
float deg_lat,deg_long;
|
||
float test;
|
||
|
||
while(c[i]!='\0'){
|
||
|
||
i++;
|
||
... | ... | |
}
|
||
else{
|
||
d=0;
|
||
printf("\nNe peut decode cette trame");
|
||
|
||
}
|
||
printf("\nTrames: %s", trame);
|
||
... | ... | |
printf("\nLongitude: %2.7f", (*p).longitude);
|
||
|
||
}
|
||
//Test pour d?coder la latitude et la longitude des trames "$GPGGA" en degr? d?cimaux
|
||
|
||
// calcule la racine carr?e en se basant sur l'algorithme de Heron
|
||
float racine_carree(float nb){
|
||
float a,fa,e;
|
||
e=1;
|
||
a=1;
|
||
while(e>0.0001){
|
||
|
||
fa=((nb/a)+a)/2;
|
||
if(fa>a)
|
||
{
|
||
e=fa-a;
|
||
|
||
}
|
||
else
|
||
e=a-fa;
|
||
a=fa;
|
||
|
||
}
|
||
return a;
|
||
}
|
||
|
||
//Fonction qui calcule la distance entre deux positions
|
||
float calcul_distance(Position p1,Position p2){
|
||
float x,a,y,z,distance,b;
|
||
... | ... | |
b=(p1.latitude+p2.latitude)/2;
|
||
x=a*cos(b*rads);
|
||
y=p2.latitude-p1.latitude;
|
||
z=sqrt((x*x)+(y*y));
|
||
z=racine_carree((x*x)+(y*y));
|
||
distance=k*z;
|
||
return distance;
|
||
|
||
}
|
||
|
||
//Fonction qui calcule la vitesse du vehicule par seconde
|
||
/*float calcule_vitesse(Position p1, Position p2){
|
||
float calcule_vitesse(Position p1, Position p2){
|
||
|
||
float distance,vitesse;
|
||
distance=calcul_distance(Position p1, Position p2);
|
||
distance=calcul_distance( p1, p2);
|
||
vitesse=3.6*distance;
|
||
return vitesse;*
|
||
return vitesse;
|
||
|
||
}*/
|
||
}
|
||
typedef struct {
|
||
Position rpos;
|
||
float vitmax;
|
||
} Zone ;
|
||
|
||
Zone zones[] = {
|
||
{{44.7887762, -3.012}, 50}, /* Descripteur de la premi?re zone */
|
||
{{44.7891220, -3,013}, 70},
|
||
};
|
||
|
||
//Calcul de la distance ? la zone dangereuse la plus proche
|
||
int distance_a_la_proche_zone(Position p, Zone r[],int nb_zones, float *d){
|
||
int i;
|
||
float dist;
|
||
if(nb_zones!=0){
|
||
(*d)=calcul_distance(p,r[0].rpos);
|
||
|
||
for(i=1;i<nb_zones;i++){
|
||
|
||
dist=calcul_distance(p,r[i].rpos);
|
||
|
||
if(dist<(*d)){
|
||
(*d)=dist;
|
||
}
|
||
}
|
||
|
||
}
|
||
return i;
|
||
|
||
}
|
||
//Fonction ? modifier !!!!!
|
||
void traitement(char * trame)
|
||
{
|
||
Position p;
|
||
int d;
|
||
|
||
static int cpt=0 ;
|
||
cpt++ ;
|
||
if (trame_cmp(trame,"GPGGA")==1)
|
Formats disponibles : Unified diff
Creation de la table zones