Index: branch/leroy/sp4b3/TP6_SP4/TP6_SP4/TP6_SP4.c
===================================================================
--- branch/leroy/sp4b3/TP6_SP4/TP6_SP4/TP6_SP4.c	(revision 859)
+++ branch/leroy/sp4b3/TP6_SP4/TP6_SP4/TP6_SP4.c	(revision 860)
@@ -8,35 +8,47 @@
 /*  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;
@@ -58,7 +70,29 @@
 
 }
 
+//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;
 
@@ -65,29 +99,66 @@
     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
     }
@@ -94,74 +165,52 @@
 
 }
 
-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){
@@ -174,34 +223,25 @@
         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;
 
@@ -208,10 +248,15 @@
     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;
 }
Index: branch/leroy/sp4b3/TP6_SP4/TP6_SP4/SessionM32C_Simulator.hsf
===================================================================
--- branch/leroy/sp4b3/TP6_SP4/TP6_SP4/SessionM32C_Simulator.hsf	(revision 859)
+++ branch/leroy/sp4b3/TP6_SP4/TP6_SP4/SessionM32C_Simulator.hsf	(revision 860)
@@ -108,7 +108,7 @@
 "{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" 
@@ -144,7 +144,7 @@
 [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" 
@@ -173,7 +173,6 @@
 [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]
