Projet

Général

Profil

« Précédent | Suivant » 

Révision 860

Ajouté par jeleroy il y a presque 4 ans

Fin du programme permettant de réaliser les calculs sans les nombres flottants

Voir les différences:

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