Révision 860
Ajouté par jeleroy il y a presque 4 ans
branch/leroy/sp4b3/TP6_SP4/TP6_SP4/TP6_SP4.c | ||
---|---|---|
/* This file is generated by Renesas Project Generator (Ver.4.18). */
|
||
/* NOTE:THIS IS A TYPICAL EXAMPLE. */
|
||
/***********************************************************************/
|
||
#include <math.h>
|
||
#include "sfr32c87.h"
|
||
#define M_PI 3.14159265
|
||
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <math.h>
|
||
|
||
struct position { // d?claration structure position contenant la latitude et la longitude
|
||
int latitude;
|
||
int longitude;
|
||
long latitude;
|
||
long longitude;
|
||
};
|
||
|
||
int decode_int(char c);
|
||
int trame_cmp(char* trame,char* type);
|
||
int decode_nombre(char *ch, int n);
|
||
void decode_trame(char trame[1000], int* latitude, int* longitude);
|
||
float calcule_distance(struct position p_1,struct position p_2);
|
||
float calcule_vitesse(struct position p_1,struct position p_2);
|
||
int distance_a_la_plus_proche_zone(struct position p,float zones[100][3][2],int nb_zones, float *d);
|
||
// declaration fonctions utilis?es dans le programme
|
||
void decode_trame(char trame[1000], long* latitude, long* longitude);
|
||
long long calcule_distance_milliers_minute_angle_carre(struct position p_1,struct position p_2);
|
||
long long calcule_vitesse(struct position p_1,struct position p_2);
|
||
int distance_a_la_plus_proche_zone(struct position p,float zones[100][3][2],int nb_zones, long long *d);
|
||
|
||
int decode_int(char c){
|
||
int valeur;
|
||
long long racine(long long x){
|
||
|
||
long long racine = 0;
|
||
|
||
if ((c >= '0') && (c <= '9')){
|
||
c -= 48; // Affectation du code ASCII correspondant au caractere ASCII
|
||
valeur = c; // Transformation du caractere (0,1..9) en un entier
|
||
}else{
|
||
valeur = -1; // Si le caract?re n'est pas un chiffre alors on renvoie -1
|
||
}
|
||
return valeur;
|
||
while ((racine) * (racine) <= x){
|
||
racine += 1;
|
||
}
|
||
if (2*x - (racine-1) * (racine-1) - (racine) * (racine) < 0){
|
||
racine -= 1;
|
||
}
|
||
return racine;
|
||
}
|
||
|
||
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",
|
||
"$GPRMC,141914.00,A,4545.6424,N,00306.6036,E,0.4,99.4,010206,,*0C",
|
||
"$GPGLL,4545.6424,N,00306.6036,E,141914.00,A*0E",
|
||
"$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D",
|
||
"$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};
|
||
|
||
int trame_cmp(char* trame,char* type){
|
||
|
||
int i=0, nombre = 0;
|
||
... | ... | |
|
||
}
|
||
|
||
//Fonction ? modifier !!!!!
|
||
void traitement(char * trame)
|
||
{
|
||
static int cpt=0;
|
||
if (trame_cmp(trame,"GPGGA")==1){
|
||
printf ("> %s\n",trame);
|
||
}
|
||
cpt++;
|
||
}
|
||
|
||
int decode_int(char c){
|
||
int valeur;
|
||
|
||
|
||
if ((c >= '0') && (c <= '9')){
|
||
c -= 48; // Affectation du code ASCII correspondant au caractere ASCII
|
||
valeur = c; // Transformation du caractere (0,1..9) en un entier
|
||
}else{
|
||
valeur = -1; // Si le caract?re n'est pas un chiffre alors on renvoie -1
|
||
}
|
||
return valeur;
|
||
}
|
||
|
||
int decode_nombre(char *ch, int n){
|
||
int i;
|
||
|
||
for(i = n; i <= 10 ; i++){
|
||
ch[i] = '\0'; //effacement des cases qui ne comportent pas les valeurs ? afficher
|
||
}
|
||
|
||
|
||
}
|
||
|
||
// declaration fonctions utilis?es dans le programme
|
||
|
||
void decode_trame(char trame[1000], int* latitude, int* longitude){
|
||
int i;
|
||
void test_decode_int(){
|
||
if (decode_int('0') != 0){
|
||
|
||
}
|
||
}
|
||
|
||
/*stockage de la latitude et de la longitude dans les variables de micro controleur? partir de la trame*/
|
||
for(i = 19; i < 21;i++){
|
||
*latitude = *latitude*10 + (trame[i]-48); // r?cup?ration de la partie enti?re de la latitude
|
||
void test_decode_nombre(){
|
||
char chaine1[10] = {'7','5','4'};
|
||
char chaine2[10] = {'$','7','5','4'};
|
||
char type [10] = {'7','5'};
|
||
|
||
decode_nombre(chaine1, 2);
|
||
|
||
if (trame_cmp(chaine2,type) != 1){
|
||
|
||
}
|
||
}
|
||
|
||
//Ajouter vos tests unitaires dans cette fonction.
|
||
void tests_unitaires(void){
|
||
if (5!=5){
|
||
|
||
exit(-1);
|
||
}
|
||
if (trame_cmp("$GPGGA suite chaine","GPGGA")!=1){
|
||
|
||
exit(-1);
|
||
}
|
||
if (trame_cmp("$GPRMC suite chaine","GPGGA")!=0){
|
||
|
||
exit(-1);
|
||
}
|
||
if (trame_cmp("$GPRMC... ", "GPRMC" )!=1){
|
||
|
||
exit(-1);
|
||
}
|
||
if (trame_cmp("$APRMC...", "GPGGA")!=0){
|
||
|
||
exit(-1);
|
||
}
|
||
test_decode_int();
|
||
test_decode_nombre();
|
||
}
|
||
|
||
void decode_trame(char trame[1000], long* latitude, long* longitude){
|
||
int i;
|
||
|
||
*latitude = ((trame[17]-48)*10+(trame[18]-48))*60+(trame[19]-48)*10+(trame[20]-48);
|
||
/*stockage de la latitude et de la longitude dans les variables de micro controleur ? partir de la trame*/
|
||
for(i = 22; i < 26;i++){
|
||
*latitude = *latitude*10 + (trame[i]-48); // r?cup?ration de la partie d?cimale de la latitude
|
||
|
||
|
||
}
|
||
for(i = 29; i < 34;i++){
|
||
*longitude = *longitude*10 + (trame[i]-48);// r?cup?ration de la partie enti?re de la latitude
|
||
|
||
*longitude = ((trame[29]-48)*100+(trame[30]-48)*10+(trame[31]-48))*60+(trame[32]-48)*10+(trame[33]-48);
|
||
|
||
}
|
||
for(i = 35; i < 39;i++){
|
||
*longitude = *longitude*10 + (trame[i]-48); // r?cup?ration de la partie d?cimale de la longitude
|
||
}
|
||
|
||
}
|
||
|
||
float calcule_distance(struct position p_1, struct position p_2){
|
||
float distance;
|
||
float lat1 = p_1.latitude;
|
||
float lat2 = p_2.latitude;
|
||
long long calcule_distance_milliers_minute_angle_carre(struct position p_1, struct position p_2){
|
||
long long distance_milliers_minute_angle_carre;
|
||
long lat1 = p_1.latitude;
|
||
long lat2 = p_2.latitude;
|
||
|
||
float lon1 = p_1.longitude;
|
||
float lon2 = p_2.longitude;
|
||
long lon1 = p_1.longitude;
|
||
long lon2 = p_2.longitude;
|
||
|
||
/*conversion de la latitude et de la longitude cod?e en un entier en d?cimal*/
|
||
lat1 = lat1/1000000;
|
||
lat2 = lat2/1000000;
|
||
lon1 = lon1/1000000;
|
||
lon2 = lon2/1000000;
|
||
/*calcul de la distance entre ces deux points*/
|
||
distance_milliers_minute_angle_carre = pow(lat1-lat2,2)+pow(lon1-lon2,2);
|
||
|
||
/*affichage des coordonn?es des deux points*/
|
||
|
||
printf("D = %lli milliers minutes d'angle carre\n", distance_milliers_minute_angle_carre);
|
||
return distance_milliers_minute_angle_carre;
|
||
|
||
/*calcul de la distance entre ces deux points*/
|
||
distance = acos(sin(lat1*M_PI/180)*sin(lat2*M_PI/180)+cos(lat1*M_PI/180)*cos(lat2*M_PI/180)*cos(lon1*M_PI/180-lon2*M_PI/180))*6371;
|
||
|
||
return distance;
|
||
|
||
}
|
||
|
||
float calcule_vitesse(struct position p_1, struct position p_2){
|
||
float distance;
|
||
float vitesse;
|
||
float lat1 = p_1.latitude;
|
||
float lat2 = p_2.latitude;
|
||
long long calcule_vitesse(struct position p_1, struct position p_2){
|
||
long long vitesse;
|
||
|
||
float lon1 = p_1.longitude;
|
||
float lon2 = p_2.longitude;
|
||
|
||
/*idem que pour la fonction decode_trame*/
|
||
lat1 = lat1/1000000;
|
||
lat2 = lat2/1000000;
|
||
lon1 = lon1/1000000;
|
||
lon2 = lon2/1000000;
|
||
|
||
|
||
distance = acos(sin(lat1*M_PI/180)*sin(lat2*M_PI/180)+cos(lat1*M_PI/180)*cos(lat2*M_PI/180)*cos(lon1*M_PI/180-lon2*M_PI/180))*6371;
|
||
|
||
|
||
vitesse = distance * 3600; //calcul de la vitesse sachant qu'il s'?coule 1s 1es entre les deux trames
|
||
|
||
vitesse = calcule_distance_milliers_minute_angle_carre(p_1, p_2);
|
||
|
||
return vitesse;
|
||
|
||
}
|
||
|
||
int distance_a_la_plus_proche_zone(struct position p,float zones[100][3][2],int nb_zones, float *d){
|
||
float distance, distance_precedente;
|
||
int distance_a_la_plus_proche_zone(struct position p,float zones[100][3][2],int nb_zones, long long *d){
|
||
long long distance, distance_precedente;
|
||
int i;
|
||
struct position p_r;
|
||
long long rayon;
|
||
|
||
float lat1 = p.latitude;
|
||
float lon1 = p.longitude;
|
||
p_r.latitude = zones[0][0][0]*600000;
|
||
p_r.longitude = zones[0][0][1]*600000;
|
||
rayon = zones[0][1][0]*5405;
|
||
|
||
/*conversion de la latitude et de la longitude cod?e en un entier en d?cimal*/
|
||
lat1 = lat1/1000000;
|
||
lon1 = lon1/1000000;
|
||
distance_precedente = racine(calcule_distance_milliers_minute_angle_carre(p, p_r)) - rayon;
|
||
|
||
/*Calcul de la distance entre la premi?re zone et l'endroit o? le point de r?f?rence*/
|
||
distance_precedente = acos(sin(lat1*M_PI/180)*sin(zones[0][0][0]*M_PI/180)+cos(lat1*M_PI/180)*cos(zones[0][0][0]*M_PI/180)*cos(lon1*M_PI/180-zones[0][0][1]*M_PI/180))*6371-zones[0][1][0];
|
||
|
||
for(i=0; i < nb_zones; i++){
|
||
|
||
p_r.latitude = zones[i][0][0]*600000;
|
||
p_r.longitude = zones[i][0][1]*600000;
|
||
|
||
/*Calcul de la distance entre les zones suivantes et le point de r?f?rence*/
|
||
distance = acos(sin(lat1*M_PI/180)*sin(zones[i][0][0]*M_PI/180)+cos(lat1*M_PI/180)*cos(zones[i][0][0]*M_PI/180)*cos(lon1*M_PI/180-zones[i][0][1]*M_PI/180))*6371-zones[i][1][0];
|
||
rayon = zones[i][1][0]*5405;
|
||
distance = racine(calcule_distance_milliers_minute_angle_carre(p, p_r)) - rayon;
|
||
|
||
/*Comparaison entre la distance entre la zone pr?c?dente et le point de r?ference et celle entre la zone actuelle et ce m?me point*/
|
||
if(distance_precedente < distance){
|
||
... | ... | |
distance_precedente = distance;
|
||
|
||
|
||
}
|
||
return i;
|
||
}
|
||
return i;
|
||
|
||
}
|
||
|
||
char trame1[] = {"$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D"}; //Premi?re trame
|
||
char trame2[] = {"$GPGGA,141915.00,4545.0242,N,00306.6039,E,1,05,3.4,499.5,M,,M,,*72"}; //Deuxi?me trame
|
||
float zones[100][3][2] = {
|
||
{{44.7997762, -3.112}, {50}},
|
||
{{44.7891220, -56.013}, {70}},
|
||
{{45.7221220, -31.003}, {60}},
|
||
{{46.5111220, -9.143}, {40}},
|
||
{{47.1251220, -7.553}, {20}},
|
||
{{48.2891220, -4.123}, {10}},
|
||
{{49.4451220, -5.013}, {30}},
|
||
{{50.8121220, -3.011}, {10}},
|
||
{{37.5591220, -3.813}, {60}},
|
||
{{20.2892220, -7.113}, {90}},
|
||
}; //Tableau contenant les coordonn?es du centre du cercle et son rayon de chacune des zones
|
||
|
||
int nb_zones = 10; // Nombre de zones (ici le tableau en contient 2)
|
||
float d = 0;
|
||
struct position p_1,p_2, p;
|
||
char trame2[] = {"$GPGGA,141915.00,4545.0242,N,00306.6039,E,1,05,3.4,499.5,M,,M,,*72"}; //Deuxi?me trame
|
||
float zones[100][3][2] = {{{44.7887762, -3.012}, {50}}, {{44.7891220, -3.013}, {70}}}; //Tableau contenant les coordonn?es du centre du cercle et son rayon de chacune des zones
|
||
|
||
int nb_zones = 2; // Nombre de zones (ici le tableau en contient 2)
|
||
long long d = 0;
|
||
long long distance_a_la_zone_la_plus_proche;
|
||
struct position p_1,p_2,p;
|
||
|
||
void main(void)
|
||
int main()
|
||
{
|
||
/*Initailisation de la longitude et de la latitude des points ? 0* (ces variables contiendront ensuite les coordon?es des points p1 et p2 apr?s ex?cution de la fonction decode_trame*/
|
||
|
||
|
||
/*Initailisation de la longitude et de la latitude des points ? 0* (ces variables contiendront ensuite les coordon?es des points p1 et p2 apr?s ex?cution de la fonction decode_trame*/
|
||
p_1.longitude = 0;
|
||
p_1.latitude = 0;
|
||
|
||
p_2.longitude = 0;
|
||
p_2.latitude = 0;
|
||
|
||
decode_trame(trame1, &p_1.latitude, &p_1.longitude);
|
||
decode_trame(trame2, &p_2.latitude, &p_2.longitude);
|
||
|
||
calcule_distance(p_1,p_2);
|
||
|
||
distance_a_la_plus_proche_zone(p,zones,nb_zones, &d);
|
||
/*Ex?cution de chacunes des fonctions*/
|
||
decode_trame(trame1, &p_1.latitude, &p_1.longitude);
|
||
decode_trame(trame2, &p_2.latitude, &p_2.longitude);
|
||
calcule_distance_milliers_minute_angle_carre(p_1, p_2);
|
||
calcule_vitesse(p_1, p_2);
|
||
|
||
distance_a_la_zone_la_plus_proche = distance_a_la_plus_proche_zone(p_1,zones,nb_zones,&d);
|
||
|
||
|
||
|
||
return 0;
|
||
}
|
branch/leroy/sp4b3/TP6_SP4/TP6_SP4/SessionM32C_Simulator.hsf | ||
---|---|---|
"{C62E6398-F79C-4FAB-801E-8B1A464777C3}CWatchWnd0Num_Watch" "1"
|
||
"{C62E6398-F79C-4FAB-801E-8B1A464777C3}CWatchWnd0RamMoniterEnable" "0"
|
||
"{C62E6398-F79C-4FAB-801E-8B1A464777C3}CWatchWnd0SAMPLING" "100"
|
||
"{C62E6398-F79C-4FAB-801E-8B1A464777C3}CWatchWnd0Sym_Watch_0000" "latitude,*latitude, 16649606,3,NN,Col,N-N,Def,00000000,00000000,[Auto],"
|
||
"{C62E6398-F79C-4FAB-801E-8B1A464777C3}CWatchWnd0Sym_Watch_0000" "latitude,*latitude, 16649606,0,NN,Col,N-N,Def,00000000,00000000,[Auto],"
|
||
"{C62E6398-F79C-4FAB-801E-8B1A464777C3}CWatchWnd0Watch_Column_Address" "80"
|
||
"{C62E6398-F79C-4FAB-801E-8B1A464777C3}CWatchWnd0Watch_Column_Name" "150"
|
||
"{C62E6398-F79C-4FAB-801E-8B1A464777C3}CWatchWnd0Watch_Column_Scope" "80"
|
||
... | ... | |
[WINDOW_POSITION_STATE_DATA_VD1]
|
||
"Help" "TOOLBAR 0" 59419 1 5 "0.00" 0 0 0 0 0 17 0 "" "0.0"
|
||
"{WK_00000001_CWATCH}TP6_SP4SessionM32C_Simulator" "WINDOW" 59422 0 0 "0.50" 383 1600 -533 350 200 18 0 "32772|32773|32836|<<separator>>|32775|32776|32777|32778|<<separator>>|32780|<<separator>>|32785|<<separator>>|32837|32845|<<separator>>|32839|32841" "0.0"
|
||
"{WK_00000001_CmdLine}" "WINDOW" 59422 0 3 "0.10" 383 1600 -533 350 200 17 0 "32771|32772|32778|<<separator>>|32773|32774|<<separator>>|32820|<<separator>>|32801|32824" "0.0"
|
||
"{WK_00000001_CmdLine}" "WINDOW" 59422 0 3 "0.09" 383 1600 -533 350 200 17 0 "32771|32772|32778|<<separator>>|32773|32774|<<separator>>|32820|<<separator>>|32801|32824" "0.0"
|
||
"{WK_00000001_OUTPUT}" "WINDOW" 59422 0 2 "0.25" 383 534 287 350 200 18 0 "36756|36757|36758|36759|<<separator>>|36746|36747|<<separator>>|39531|<<separator>>|39500|39534|<<separator>>|36687" "0.0"
|
||
"{WK_00000001_STATUS}TP6_SP4SessionM32C_Simulator" "WINDOW" 59422 0 1 "0.25" 383 1600 -533 350 200 18 0 "" "0.0"
|
||
"{WK_00000002_WORKSPACE}" "WINDOW" 59420 0 0 "1.00" 180 534 287 350 200 18 0 "" "0.0"
|
||
... | ... | |
[WINDOW_POSITION_STATE_DATA_VD4]
|
||
[WINDOW_Z_ORDER]
|
||
"D:\TP-SP4_LEROY_2021\sp4b3\TP6_SP4\TP6_SP4\TP6_SP4.c"
|
||
"D:\TP-SP4_LEROY_2021\sp4b3\TP6_SP4\TP6_SP4\ncrt0.a30"
|
||
[TARGET_NAME]
|
||
"M32C Simulator" "" 0
|
||
[STATUSBAR_STATEINFO_VD1]
|
Formats disponibles : Unified diff
Fin du programme permettant de réaliser les calculs sans les nombres flottants