Index: branch/REZKI/sp4a12/main.c
===================================================================
--- branch/REZKI/sp4a12/main.c	(revision 364)
+++ branch/REZKI/sp4a12/main.c	(revision 365)
@@ -1,7 +1,21 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <strings.h>
-#include "trame.h"
+#include "trame.h"
+#include<math.h>
+
+#define rayon_terre 6370
+#define PI 3.14159265
+
+typedef struct {
+    float latitude;
+    float longitude;
+    }position;
+
+typedef struct {
+    position rpos;
+    float vitmax;
+    }zone;
 
 //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",
@@ -12,8 +26,69 @@
                     "$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};
+                    0};
 
+int decode_int(char c)
+{
+    if((c-48<0)||(c-48>9)) //vérifie si le caracctère est un chiffre
+        return -1;
+    else
+        return c-48;
+}
+
+int decode_nombre(char *ch,int i,int n)
+{
+    int res=0;
+    int j;
+    for(j=i;j<i+n;j++)
+        res=(res*10)+decode_int(ch[j]);
+    return res;
+}
+
+float latitude(char *ch)
+{
+    float res, res1, res2, res3;
+    res1 = decode_nombre(ch,17,2);          //retrouve les degrés en sexagesimal dans la trame
+    res2 = decode_nombre(ch,19,2);          //retrouver les minutes en sexagesimal dans la trame
+    res3 = decode_nombre(ch,22,4);          //retrouver les secondes en sexagesimal dans la trame
+    res = res1 + (res2 + res3/10000)/60;    //conversion sexagesimal à degrés
+    if(ch[27]=='S')                         //identifie si la latitude est nord ou sud
+        res = -res;
+    return res;
+}
+
+float longitude(char *ch)
+{
+    float res, res1, res2, res3;
+    res1 = decode_nombre(ch,29,3);
+    res2 = decode_nombre(ch,32,2);
+    res3 = decode_nombre(ch,35,4);
+    res = res1 + (res2 + res3/10000)/60;
+    if(ch[40]=='W')
+        res = -res;
+    return res;
+}
+
+decode_trame(char *ch, position *p)
+{
+    p->latitude = latitude(ch);
+    p->longitude = longitude(ch);
+}
+
+float decode_trame_latitude(char *ch)
+{
+    float lat;
+    lat = latitude(ch);
+    return lat;
+}
+
+float decode_trame_longitude(char *ch)
+{
+    float lon;
+    lon = longitude(ch);
+    return lon;
+}
+
 int trame_cmp(char * trame,char * type)
 {
     int i;
@@ -27,8 +102,9 @@
 void traitement(char * trame)
 {
     static int cpt=0;
-    cpt++;
-    printf ("> %s\n",trame);
+    cpt++;
+    if(trame_cmp(trame,"GPGGA")==1)//verifie le bon format de la trame
+        printf ("> %s\n",trame);
 }
 
 //Ajouter vos tests unitaires dans cette fonction.
@@ -40,23 +116,57 @@
     }
     if (trame_cmp("$GPGGA suite chaine","GPGGA")!=1)
     {
-    printf ("Erreur Test unitaire trame_cmp.\n");
-    exit(-1);
+        printf ("Erreur Test unitaire trame_cmp.\n");
+        exit(-1);
     }
+    if (trame_cmp("$GPRMC suite chaine","GPGGA")!=0)
+    {
+        printf ("Erreur Test unitaire trame_cmp.\n");
+        exit(-1);
+    }
+    if(decode_int('0')!=0)
+    {
+        printf ("Erreur Test unitaire decode int.\n");
+        exit(-1);
+    }
+    if(decode_nombre("7558",0,2)!=75)
+    {
+        printf ("Erreur Test unitaire decode nombre.\n");
+        exit(-1);
+    }
+    if(decode_nombre("7558",3,1)!=8)
+    {
+        printf ("Erreur Test unitaire decode nombre.\n");
+        exit(-1);
+    }
+    // précise à 10e-6 près car 2 floattants ne peuvent pas être comparés directement
+    if((fabs(latitude("$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D"))-45.75) > 10e-6)
+    {
+        printf ("Erreur Test unitaire latitude.\n");
+        exit(-1);
+    }
+    if((fabs(longitude("$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D"))-3.11006) > 10e-6)
+	{
+        printf ("Erreur Test unitaire longitude.\n");
+        exit(-1);
+    }
+    if ((fabs(decode_trame_longitude("$GPGGA,141914.00,4645.5624,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D")-46.759373) > 10e-6)
+        && fabs(decode_trame_latitude("$GPGGA,141914.00,4545.0000,N,00306.6036,E,1,05,3.4,499.3,M,,M,,*7D")-3.11006) > 10e-6)
+    {
+
+    }
 }
+
 
 // Ne pas modifier cette fonction
 int main(int argc,char ** argv)
 {
-
     tests_unitaires();
-
     // Affichage des trames definies dans la table trames.
     printf ("Trames de tests tableau trames:\n");
     int i=0;
     while (trames[i])
         traitement(trames[i++]);
-
     if (!trame_init())
         exit(-1);
     // Affichage des trames du fichier gps.log
@@ -64,8 +174,6 @@
     printf ("Trames de tests du fichier gps.log\n");
     while  ((trame = trame_suivante()))
         traitement(trame);
-
-    return 0;
 }
 
 
