root/branch/DEMAGALHAES/sp4b3/SP4b3/SP4b3.c @ 792
693 | rademagalh | /***********************************************************************/
|
|
/* */
|
|||
/* FILE :SP4b3.c */
|
|||
/* DATE :Tue, Jun 01, 2021 */
|
|||
/* DESCRIPTION :main program file. */
|
|||
/* CPU GROUP :87B */
|
|||
/* */
|
|||
/* This file is generated by Renesas Project Generator (Ver.4.18). */
|
|||
/* NOTE:THIS IS A TYPICAL EXAMPLE. */
|
|||
/***********************************************************************/
|
|||
696 | rademagalh | typedef struct{
|
|
float latitude;
|
|||
float longitude;
|
|||
}Position;
|
|||
typedef struct {
|
|||
Position rpos;
|
|||
float vitmax;
|
|||
} Zone;
|
|||
float CharVersDegre(char * ch);
|
|||
Position decode_trame(char * ch);
|
|||
float calcul_distance(Position p1,Position p2);
|
|||
float calcul_vitesse(float distance);
|
|||
float distance_a_la_plus_proche_zone(Position pos_voiture, Zone r[], int nb_zones);
|
|||
693 | rademagalh | void main(void)
|
|
{
|
|||
696 | rademagalh | Zone zones[] = {
|
|
{{44.7887762, -3.012}, 50}, /* Descripteur de la premi?re zone */
|
|||
{{44.7891220, -3.013}, 70},
|
|||
};
|
|||
while (1)
|
|||
{
|
|||
float distance=0;
|
|||
Position pos1=decode_trame("$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D");
|
|||
Position pos2=decode_trame("$GPGGA,141925.00,4545.2410,N,00306.6046,E,1,05,3.4,501.4,M,,M,,*7D");
|
|||
distance = calcul_distance(pos1,pos2);
|
|||
calcul_vitesse(distance);
|
|||
distance_a_la_plus_proche_zone(pos1, zones, 2);
|
|||
}
|
|||
693 | rademagalh | }
|
|
696 | rademagalh | ||
float distance_a_la_plus_proche_zone(Position pos_voiture, Zone r[], int nb_zones)
|
|||
{
|
|||
int i;
|
|||
int indice_rechercher=0;
|
|||
float d_min=0,d=0;
|
|||
Position t[10];
|
|||
for (i = 0; i < nb_zones; i++)
|
|||
{
|
|||
Position pos=r[i].rpos;
|
|||
t[i]=pos;
|
|||
}
|
|||
d_min=calcul_distance(pos_voiture,t[1]);
|
|||
for (i = 0; i < nb_zones; i++)
|
|||
{
|
|||
d=calcul_distance(pos_voiture,t[i]);
|
|||
if (d<d_min)
|
|||
{
|
|||
d_min=d;
|
|||
indice_rechercher=i;
|
|||
}
|
|||
if (nb_zones==0)
|
|||
{
|
|||
return -1;
|
|||
}
|
|||
}
|
|||
return d_min;
|
|||
}
|
|||
float calcul_vitesse(float distance)
|
|||
{
|
|||
return distance*3600;
|
|||
}
|
|||
float calcul_distance(Position p1,Position p2)
|
|||
{
|
|||
float R_terre=6378.137;
|
|||
float distance = R_terre*(p1.latitude-p2.latitude)*(3.14/180);
|
|||
return distance;
|
|||
}
|
|||
Position decode_trame(char * ch)
|
|||
{
|
|||
Position pos;
|
|||
int i,indice=0;
|
|||
char longitude[10]="";
|
|||
char latitude[10]="";
|
|||
int compteur_de_virgule = 0;
|
|||
if (trame_cmp(ch,"GPGGA")==0)
|
|||
{
|
|||
exit(-1);
|
|||
}
|
|||
else
|
|||
{
|
|||
do
|
|||
{
|
|||
if (ch[indice]==',')
|
|||
{
|
|||
compteur_de_virgule++;
|
|||
}
|
|||
if (compteur_de_virgule==2)
|
|||
{
|
|||
for (i = 0; i < 9; i++)
|
|||
{
|
|||
latitude[i]=ch[indice+1];
|
|||
indice++;
|
|||
}
|
|||
}
|
|||
if (compteur_de_virgule==4)
|
|||
{
|
|||
for (i = 0; i < 9; i++)
|
|||
{
|
|||
longitude[i]=ch[indice+1];
|
|||
indice++;
|
|||
}
|
|||
break;
|
|||
}
|
|||
indice++;
|
|||
} while (ch[indice]!='\0');
|
|||
pos.latitude = CharVersDegre(latitude);
|
|||
pos.longitude = CharVersDegre(longitude);
|
|||
}
|
|||
return pos;
|
|||
}
|
|||
float CharVersDegre(char * ch)
|
|||
{
|
|||
char * nombre=ch;
|
|||
float dec;
|
|||
int compte=0,n,degre;
|
|||
int virguleVu=0;
|
|||
float res = 0, fact = 1, d=0;
|
|||
if (*ch == '-')
|
|||
{
|
|||
ch++;
|
|||
fact = -1;
|
|||
}
|
|||
for (virguleVu = 0; *ch; ch++)
|
|||
{
|
|||
compte++;
|
|||
if (*ch == '.')
|
|||
{
|
|||
virguleVu = 1;
|
|||
n=compte-1;
|
|||
continue;
|
|||
}
|
|||
d = *ch - '0';
|
|||
if (d >= 0 && d <= 9)
|
|||
{
|
|||
if (virguleVu) fact /= 10.0;
|
|||
res = res * 10.0 + d;
|
|||
}
|
|||
if (*ch == ',')
|
|||
{
|
|||
break;
|
|||
}
|
|||
}
|
|||
dec=(res * fact);
|
|||
if (n==4)
|
|||
{
|
|||
degre=decode_nombre(nombre,2);
|
|||
dec=(dec-degre*100)/60;
|
|||
}
|
|||
else if (n==5)
|
|||
{
|
|||
degre=decode_nombre(nombre,3);
|
|||
dec=(dec-degre*100)/60;
|
|||
}
|
|||
dec = degre + dec;
|
|||
return dec;
|
|||
}
|
|||
int decode_nombre(char * ch, int n)
|
|||
{
|
|||
int longueurMot=0;
|
|||
char caratereCourrant=0;
|
|||
//Obtention de la longueur du Mot extrait entre le symbole $ et la virgule
|
|||
do
|
|||
{
|
|||
caratereCourrant=ch[longueurMot];
|
|||
longueurMot++;
|
|||
}
|
|||
while (caratereCourrant != '\0');
|
|||
longueurMot--;
|
|||
if (longueurMot < n ||n==0){
|
|||
return 0;
|
|||
}
|
|||
else{
|
|||
int j=0,sum=0;
|
|||
for(j=0; j<n; j++)
|
|||
{
|
|||
if(ch[j] < 48 || ch[j] > 57)
|
|||
{
|
|||
return 0;
|
|||
}
|
|||
else
|
|||
{
|
|||
sum = sum*10 + (ch[j] - 48);
|
|||
}
|
|||
}
|
|||
return sum;
|
|||
}
|
|||
}
|
|||
int decode_int(char c)
|
|||
{
|
|||
int code;
|
|||
char i;
|
|||
if(c >= '0' && c <= '9')
|
|||
// Verification que le caract?re 'c' est un caract?re entre 0 et 9 dans la table ascii
|
|||
{
|
|||
for (i= '0'; i <='9'; i++)
|
|||
//Parcourir la table ascii ? la recherche du carac. c
|
|||
{
|
|||
if (i==c)
|
|||
// Identification du carac. c dans la table ascii
|
|||
{
|
|||
code=i-48; // On ram?ne le code ascii de c entre 0 et 9
|
|||
return code;
|
|||
}
|
|||
}
|
|||
}
|
|||
else
|
|||
{
|
|||
// le caract?re 'c' n'est pas entre '0' et '9' dans la table ascii donc on renvoie -1
|
|||
return -1;
|
|||
}
|
|||
}
|
|||
int trame_cmp(char * trame, char * type)
|
|||
{
|
|||
int indice=1;
|
|||
char mot[10]="";
|
|||
int longueurMot=0;
|
|||
int longueurType=0;
|
|||
char caratereCourrant=0;
|
|||
//Extraction du mot entre le symbole $ et la virgule
|
|||
do
|
|||
{
|
|||
mot[indice-1]=trame[indice];
|
|||
indice++;
|
|||
}
|
|||
while (trame[indice]!=',');
|
|||
//Obtention de la longueur du Mot extrait entre le symbole $ et la virgule
|
|||
do
|
|||
{
|
|||
caratereCourrant=mot[longueurMot];
|
|||
longueurMot++;
|
|||
}
|
|||
while (caratereCourrant != '\0');
|
|||
longueurMot--;
|
|||
caratereCourrant=0;
|
|||
////Obtention de la longueur du type
|
|||
do
|
|||
{
|
|||
caratereCourrant=type[longueurType];
|
|||
longueurType++;
|
|||
}
|
|||
while (caratereCourrant != '\0');
|
|||
longueurType--;
|
|||
if (longueurType==longueurMot) //Verification si le type est de m?me taille que le mot extrait
|
|||
{
|
|||
int verificateur=0; //varaiable de validation
|
|||
int i;
|
|||
for (i = 0; i < longueurMot; i++)
|
|||
{
|
|||
if (mot[i]==type[i])
|
|||
{
|
|||
verificateur=1; // Valide la comparaison entre deux lettres identiques
|
|||
}
|
|||
else
|
|||
{
|
|||
verificateur=0; // Si la comparaison n'est pas bonne, on arr?te la comparaison
|
|||
break;
|
|||
}
|
|||
}
|
|||
if (verificateur==1 && type=="GPGGA")
|
|||
{
|
|||
// Condition de renvoie si le type est bien GPGGA
|
|||
return 1;
|
|||
}
|
|||
else
|
|||
{
|
|||
// return 0 pour tout les test qui ne seraient pas du type GPGGA
|
|||
return 0;
|
|||
}
|
|||
}
|
|||
else
|
|||
{
|
|||
// return 0 si aucune comparaison n'est bonne
|
|||
return 0;
|
|||
}
|
|||
}
|