Ahmed_PFE_Embarq_300415

Dependencies:   C12832 LM75B mbed

Fork of Ahmed_Embarq_Prog by ahmed ahmed

Files at this revision

API Documentation at this revision

Comitter:
pfe
Date:
Thu Apr 30 12:24:33 2015 +0000
Parent:
0:05a20e3e3179
Commit message:
Ahmed_PFE_Embarq_300415

Changed in this revision

Ah_main.cpp Show annotated file Show diff for this revision Revisions of this file
Define.h Show annotated file Show diff for this revision Revisions of this file
_GPS/DecMsgGPGGA.h Show diff for this revision Revisions of this file
_GPS/Dec_GPS.cpp Show annotated file Show diff for this revision Revisions of this file
_GPS/Dec_GPS.h Show annotated file Show diff for this revision Revisions of this file
_GPS/RecGPS.h Show diff for this revision Revisions of this file
--- a/Ah_main.cpp	Tue Apr 21 10:16:20 2015 +0000
+++ b/Ah_main.cpp	Thu Apr 30 12:24:33 2015 +0000
@@ -3,370 +3,503 @@
 #include "MSCFileSystem.h"
 //-----------------------
 #include "Define.h"
-#include "RecGPS.h"
+#include "Dec_GPS.h"
 //-----------------------
- MSCFileSystem fsLog("USB");    //  Enregsetement des doonées "Flash Disque USB" 
- FILE    *Fs_Log;
- I2C     _I2C(p28,p27);         //  I2C    SCL,SDA
- Serial  _ComGPS(p13, p14);     //  TX non connecté, pin14 RX.   
- Serial  _ComXbee(p9,p10);      //  Serial tx(p9),rx(10)
- #define  pRST_Xbee   p30       //  pin RST Xbee
- Ticker  _Ticker5ms;
- Timer   _Timer1;               // Timer pour mesurer le temps
- 
- DigitalIn  boutonStart(p13);   // Joystique Left  : Boutton pour pouvoir controler le debut de l'enregistrement
- DigitalIn  boutonEnd(p16);     // Joystique Right : Boutton pour pouvoir controler la fin de l'enregistrement
+MSCFileSystem fsLog("USB");    //  Enregsetement des doonées "Flash Disque USB"
+FILE    *Fs_Log;
+I2C     _I2C(p28,p27);         //  I2C    SCL,SDA
+Serial  _ComGPS(NC, p14);     //  TX non connecté, pin14 RX.
+Serial  _ComXbee(p9,p10);      //  Serial tx(p9),rx(10)
+#define  pRST_Xbee   p30       //  pin RST Xbee
+Ticker  _Ticker1ms;
+Timer   _Timer1;               // Timer pour mesurer le temps
 
- DigitalOut  RSTXbee (p30); 
- DigitalOut  LedGPS  (LED1); 
- DigitalOut  LedLog  (LED2);
- DigitalOut  LedXbee (LED3);
- DigitalOut  LedError(LED4);
+DigitalIn  boutonStart(p13);   // Joystique Left  : Boutton pour pouvoir controler le debut de l'enregistrement
+DigitalIn  boutonEnd(p16);     // Joystique Right : Boutton pour pouvoir controler la fin de l'enregistrement
+
+DigitalOut  RSTXbee (p30);
+DigitalOut  LedGPS  (LED1);
+DigitalOut  LedLog  (LED2);
+DigitalOut  LedXbee (LED3);
+DigitalOut  LedError(LED4);
 //-----------------------
-StructGPS GPS;
+StructGPS GPS,OldGPS;
 unsigned long TimeBtpress=0,TIMER_10ms;
-unsigned long FileIndex;
+unsigned long FileIndex0,FileIndex;
 char          Txt[16],Txt_Log[100],Txt_Tx2GSC[100],DataLogFileName[32];
-unsigned long tk1; // des variables pour stocker les temps de mesure
 //----------------------------------- Reception des données GPS  10Hz
-void AutoMat_GPS(){
-static unsigned char i=0,j=0,GPSDataType=0,ET_AutoMat_GPS=ET_01;
-static char gps_mess;
-  while(_ComGPS.readable()){
-        gps_mess=_ComGPS.getc();      
- 
-        switch(ET_AutoMat_GPS){
-           case ET_01:  if(gps_mess==prompt$GP[i]){
-                            i++;
-                            if(i==3){
-                                i=0;
-                                j=0;
-                                ET_AutoMat_GPS=ET_02;                            
-                            }
-                        }else i=0;                        
+
+void AutoMat_GPS()
+{
+    static unsigned char i=0,j=0,GPSDataType=0,ET_AutoMat_GPS=ET_01;
+    static char gps_mess;
+    while(_ComGPS.readable()) {
+        gps_mess=_ComGPS.getc();
+
+        switch(ET_AutoMat_GPS) {
+            case ET_01:
+                if(gps_mess==prompt$GP[i]) {
+                    i++;
+                    if(i==3) {
+                        i=0;
+                        j=0;
+                        ET_AutoMat_GPS=ET_02;
+                    }
+                } else i=0;
+                break;
+            case ET_02:
+                if(gps_mess==promptGGA[i]) {
+                    i++;
+                    if(i==3) {
+                        i=0;
+                        j=0;
+                        ET_AutoMat_GPS = ET_03;
+                        GPSDataType = GGA;
+                    }
+                    break;
+                } else i=0;
+
+                if(gps_mess==promptRMC[j]) {
+                    j++;
+                    if(j==3) {
+                        j=0;
+                        ET_AutoMat_GPS=ET_03;
+                        GPSDataType=RMC;
+                    }
+                    break;
+                } else j=0;
+
+                ET_AutoMat_GPS=ET_01;
+                break;
+
+            case ET_03:
+                _MsgGPSRx[i]=gps_mess;
+                i++;
+                if((i<NData_GPS_Max)&&(gps_mess!=0x0D))break;
+
+                switch(GPSDataType) {
+
+                    case GGA:
+                        DecodageGPGGA(MsgGPSRx,i-1,&OldGPS);// l'appel de la fonction de decodage du message GPGGA                        
+                        if (OldGPS.GGA_Valid == 0x01) {                            
+                            OldGPS.GGA_Valid = 0x00;                            
+                            LedGPS = !LedGPS;
+                        }
                         break;
-           case ET_02:  if(gps_mess==promptGGA[i]){
-                            i++;
-                            if(i==3){
-                                i=0;
-                                j=0;
-                                ET_AutoMat_GPS = ET_03;
-                                GPSDataType = GGA;                                
-                               }
-                            break;
-                        }else i=0;
-                     
-                        if(gps_mess==promptRMC[j]){
-                            j++;                            
-                            if(j==3){
-                                 j=0;
-                                 ET_AutoMat_GPS=ET_03;
-                                 GPSDataType=RMC;                               
-                            }
-                            break;
-                        }else j=0;
-                        
-                        ET_AutoMat_GPS=ET_01;
+                    case RMC: //DecodageGPRMC(i-1);// l'appel de la fonction de decodage du message GPGGA  //DecodageGPRMC(i-1);
+                        break;
+                    default:
                         break;
-             
-           case ET_03:  _MsgGPSRx[i]=gps_mess;
-                        i++;
-                        if((i<NData_GPS_Max)&&(gps_mess!=0x0D))break;
-                           
-                        switch(GPSDataType){
-                             
-                                case GGA: DecodageGPGGA(i-1);// l'appel de la fonction de decodage du message GPGGA  
-                                          LedGPS=!LedGPS;
-                                          if (GpsData.GGA_Valid==0x01){
-                                                GpsData.GGA_Valid=0x00;                                            
-                                                GPS=GpsData;                  
-                                          }
-                                          break;
-                                case RMC: //DecodageGPRMC(i-1);// l'appel de la fonction de decodage du message GPGGA  //DecodageGPRMC(i-1);                                    
-                                          break;
-                                default:  break;                         
-                               }
-                        ET_AutoMat_GPS=ET_01;                        
-                        GPSDataType=0;
-           default : break;
+                }
+                ET_AutoMat_GPS=ET_01;
+                GPSDataType = NULL;
+            default :
+                break;
         }
-   }
-}    
+    }
+}
 //----------------------------------- Transmission données au sol 10 packet/s
-void AutoMat_Xbee_Tx(){
-             switch  (ET_AutoMat_Xbee_Tx) { 
-                    case ET_01:
-                           LedXbee = !LedXbee;
-                           sprintf(Txt_Tx2GSC,"$GPS;%lu;%lu;",OldTimer_10ms,GPS.Qual);                         
-                           _ComXbee.printf("%s",Txt_Tx2GSC);                     
-                           ET_AutoMat_Xbee_Tx = ET_02;
-                           break;                  
-                    case ET_02 : 
-                           sprintf(Txt_Tx2GSC,"%2u:%2u:%2u;",GPS.hh,GPS.mm,GPS.ss);
-                           _ComXbee.printf("%s",Txt_Tx2GSC);                           
-                           ET_AutoMat_Xbee_Tx = ET_03;
-                           break;
-                    case ET_03 :
-                           sprintf(Txt_Tx2GSC,"%2u;%2u.%u;%c;",GPS.LatDeg,GPS.LatMin,GPS.Latmmmm,GPS.LatDir);
-                           _ComXbee.printf("%s",Txt_Tx2GSC);                
-                           ET_AutoMat_Xbee_Tx = ET_04;
-                           break;
-                    case ET_04 :
-                           sprintf(Txt_Tx2GSC,"%3u;%2u.%u;%c;",GPS.LongDeg,GPS.LongMin,GPS.Longmmmm,GPS.LongDir);
-                           _ComXbee.printf("%s",Txt_Tx2GSC);
-                           ET_AutoMat_Xbee_Tx = ET_05;                                                     
-                          break;
-                    case ET_05 :
-                           sprintf(Txt_Tx2GSC,"%c%u\r\n",GPS.SignHMSL,GPS.HMSL);
-                           _ComXbee.printf("%s",Txt_Tx2GSC);
-                           ET_AutoMat_Xbee_Tx = ET_06;
-                          break;
-                    //------------       
-                    case ET_06 :                          
-                           sprintf(Txt_Tx2GSC,"$PDV;%lu;%4u;%4u;%4u;%4d\r\n",OldTimer_10ms,OldCAP,OldALT,OldTAS,OldTEMPRE);
-                           _ComXbee.printf("%s",Txt_Tx2GSC);
-                           ET_AutoMat_Xbee_Tx = ET_00;
-                          break;                                        
-                   default: ET_AutoMat_Xbee_Tx=ET_00; break;       
-           }  
+void AutoMat_Xbee_Tx()
+{
+   static char LIndex=0;
+    switch  (ET_AutoMat_Xbee_Tx) {
+        case ET_01:
+             LIndex++;                    
+             ET_AutoMat_Xbee_Tx = ET_00;
+             if(LIndex>=5) ET_AutoMat_Xbee_Tx = ET_02;
+            break;
+        case ET_02:            
+            LIndex = 0;
+            LedXbee = !LedXbee;
+            sprintf(Txt_Tx2GSC,"$TIME:%lu\r\n",OldTIMER_10ms);
+            _ComXbee.printf("%s",Txt_Tx2GSC);
+            ET_AutoMat_Xbee_Tx = ET_03;
+            break;
+        case ET_03 :
+            sprintf(Txt_Tx2GSC,"!!!UTC:%2u%2u%2u,***\r\n",GPS.hh,GPS.mm,GPS.ss);
+            _ComXbee.printf("%s",Txt_Tx2GSC);
+            ET_AutoMat_Xbee_Tx = ET_04;
+            break;
+        case ET_04 :           
+            //delay 10ms
+            ET_AutoMat_Xbee_Tx = ET_05;
+            break;
+        case ET_05 :                   
+            sprintf(Txt_Tx2GSC,"!!!LAT:%ld,LON:%ld,***\r\n",GPS.LatDeg,GPS.LonDeg);
+            _ComXbee.printf("%s",Txt_Tx2GSC);
+            ET_AutoMat_Xbee_Tx = ET_06;
+            break;
+        case ET_06 :
+            //delay 10ms
+            ET_AutoMat_Xbee_Tx = ET_07;
+            break;
+        case ET_07 :                   
+            sprintf(Txt_Tx2GSC,"!!!PCH:%.2f,RLL:%.2f,CRS:%.2f,SPD:%.2f,ALT:%.2f,***\r\n",HK_PCH,HK_RLL,HK_CRS,HK_SPD,HK_ALT);  
+            _ComXbee.printf("%s",Txt_Tx2GSC);
+            ET_AutoMat_Xbee_Tx = ET_08;       
+            break;
+        case ET_08 :
+            ET_AutoMat_Xbee_Tx = ET_00;
+            break;        
+        default:
+            ET_AutoMat_Xbee_Tx=ET_00;
+            break;
+    }
 }
 //----------------------------------- LogData 100Hz,  LogGPS 10Hz
-void AutoMat_DataLog(){
-        switch  (ET_AutoMat_DataLog){ 
-                                           
-         case ET_01:
-                LedLog=!LedLog;
-                //--------------
-                OldTimer_10ms = TIMER_10ms;
-                // au max 100us    (0.1ms)
-                sprintf(Txt_Log,"PDV;%lu;%5d;%5d;%5d;%5d\r\n",TIMER_10ms,CAP,ALT,TAS,TEMPRE);           
-                // au max 5000 us  (5ms)
-                fprintf(Fs_Log,Txt_Log);                 
-                // 100us
-                sprintf(Txt_Log,"GPS;%lu;%1u;%2u:%2u:%2u;%2u;%2u.%u;%c;%3u;%2u.%u;%c;%c%u\r\n",TIMER_10ms,GPS.Qual,GPS.hh,GPS.mm,GPS.ss,GPS.LatDeg,GPS.LatMin,GPS.Latmmmm,GPS.LatDir,GPS.LongDeg,GPS.LongMin,GPS.Longmmmm,GPS.LongDir,GPS.SignHMSL,GPS.HMSL);
-                // au max 5 ms
-                fprintf(Fs_Log,Txt_Log);                 
-                //------------------                  
-                ET_AutoMat_DataLog++;                 
-                break;                                
-         case ET_02:
-         case ET_03:
-         case ET_04:
-         case ET_05:
-         case ET_06:                
-         case ET_07:
-         case ET_08:
-         case ET_09:                                                    
-         case ET_10: 
-                // au max 100us    (0.1ms)
-                sprintf(Txt_Log,"PDV;%lu;%5d;%5d;%5d;%5d\r\n",TIMER_10ms,CAP,ALT,TAS,TEMPRE);            
-                // au max 5000 us  (5ms)
-                fprintf(Fs_Log,Txt_Log);                                                                                          
-                break;
-                
-         default: break ;
-      }    
-}
-//------------------------------------------ Sansors
-void AutoMat_ALT_EAGLE_V4(){      
-    static char     L_i2c_Data[2],error;    
-    switch (ET_AutoMat_ALT) {
-        case ET_01 : 
-                    L_i2c_Data[0] = 0x07; // Send "register number" command to sensor 
-                    error = _I2C.write(Add_Sensor_ALT_EG4, L_i2c_Data, 1,true); // Send command string
-                    if (error==0) ET_AutoMat_ALT = ET_02;                
-                    break;
-        case ET_02 : 
-                    error = _I2C.read(Add_Sensor_ALT_EG4, L_i2c_Data, 2, true);
-                    if (error==0) {
-                    ALT = *((unsigned short*)L_i2c_Data)&0xffff; //altitude en décimètre
-                    ALT = ALT-3000;
-                    }
-                    ET_AutoMat_ALT = ET_01;
-                    break;
-        default : break;
+#ifdef EN_AutoMat_DataLog
+void AutoMat_DataLog()
+{
+    static char ET_Sub_AutoMat = ET_00;
+    switch  (ET_AutoMat_DataLog) {
+
+        case ET_01:
+            LedLog=!LedLog;
+            //--------------
+            // au max 100us    (0.1ms)
+            sprintf(Txt_Log,"%lu;GPS;%1u;%2u:%2u:%2u;%10ld;%10ld;%ld;",TIMER_10ms,GPS.Qual,GPS.hh,GPS.mm,GPS.ss,GPS.LatDeg,GPS.LonDeg,GPS.HMSL);
+            // au max 5000 us  (5ms)
+            fprintf(Fs_Log,Txt_Log);
+            // 100us
+            sprintf(Txt_Log,"P;%5d;%5d;%5d;%5d\r\n",CRS,ALT,SPD,TEM);
+            // au max 5 ms
+            fprintf(Fs_Log,Txt_Log);
+            //------------------
+            ET_Sub_AutoMat     = ET_01;
+            ET_AutoMat_DataLog = ET_02;
+            break;
+        case ET_02:
+            // au max 100us    (0.1ms)
+            sprintf(Txt_Log,"%lu;;;;;;;",TIMER_10ms);
+            // au max 5000 us  (5ms)
+            fprintf(Fs_Log,Txt_Log);
+            // au max 100us    (0.1ms)
+            sprintf(Txt_Log,"P;%5d;%5d;%5d;%5d\r\n",CRS,ALT,SPD,TEM);
+            // au max 5000 us  (5ms)
+            fprintf(Fs_Log,Txt_Log);
+            ET_Sub_AutoMat++;
+            if(ET_Sub_AutoMat>=ET_10) ET_AutoMat_DataLog = ET_00;
+            break;
+
+        default:  break ;
     }
-} 
-
-void AutoMat_TAS_EAGLE_V4(){      
-    static char     L_i2c_Data[2],error;    
-    switch (ET_AutoMat_TAS) {
-        case ET_01 : 
-                    L_i2c_Data[0] = 0x07; // Send "register number" command to sensor 
-                    error = _I2C.write(Add_Sensor_TAS_EG4, L_i2c_Data, 1,true); // Send command string
-                    if (error==0) ET_AutoMat_TAS = ET_02;                
-                    break;
+}
+#endif
+//------------------------------------------ Sansors
+void AutoMat_ALT_EAGLE_V4()
+{
+    static char  L_i2c_Data[2],LIndex,Lerror;
+    switch (ET_AutoMat_ALT) {
+        case ET_01 :
+            L_i2c_Data[0] = 0x07; // Send "register number" command to sensor
+            Lerror = _I2C.write(Add_Sensor_ALT_EG4, L_i2c_Data, 1,true); // Send command string
+            if (Lerror==0) ET_AutoMat_ALT = ET_02;
+            LIndex = 1;
+            break;
+            
         case ET_02 : 
-                    error = _I2C.read(Add_Sensor_TAS_EG4, L_i2c_Data, 2, true);
-                    if (error==0) {
-                    TAS = *((unsigned short*)L_i2c_Data)&0xffff; //altitude en décimètre
-                    TAS = sqrt((float)(TAS-offset_TAS)*5.87755102);
-                    }
-                    ET_AutoMat_TAS = ET_01;
-                    break;
-        default : break;
+             LIndex++;
+             if(LIndex>=Wait_Time1_ms) ET_AutoMat_ALT = ET_03;
+             break;
+                            
+        case ET_03 :
+            Lerror = _I2C.read(Add_Sensor_ALT_EG4, L_i2c_Data, 2, true);
+            if (Lerror==0) {
+                ALT = *((unsigned short*)L_i2c_Data)&0xffff; //altitude en décimètre
+                ALT = ALT-3000;
+            }
+            ET_AutoMat_ALT = ET_01;
+            break;
+        default :  break;
     }
-} 
-void AutoMat_CAP_HMC(){      
-    static char     L_i2c_Data[2],error;    
+}
+
+void AutoMat_TAS_EAGLE_V4()
+{
+    static char  L_i2c_Data[2],LIndex,Lerror;
+    unsigned short SPD_short;
+    float SPD_float;
+    switch (ET_AutoMat_TAS) {
+        case ET_01 :
+            L_i2c_Data[0] = 0x07; // Send "register number" command to sensor
+            Lerror = _I2C.write(Add_Sensor_TAS_EG4, L_i2c_Data, 1,true); // Send command string
+            if (Lerror==0) ET_AutoMat_TAS = ET_02;
+            LIndex = 1;
+            break;
+            
+        case ET_02 : 
+             LIndex++;
+             if(LIndex>=Wait_Time1_ms) ET_AutoMat_TAS = ET_03;
+             break;
+                            
+        case ET_03 :
+            Lerror = _I2C.read(Add_Sensor_TAS_EG4, L_i2c_Data, 2, true);
+            if (Lerror==0) {
+                SPD_short = *((unsigned short*)L_i2c_Data)&0xffff; 
+                SPD_float = 10*sqrt((float)(SPD_short-Offset_SPD)*5.87755102);
+                SPD = 10*SPD_float; // mph*10
+            }
+            ET_AutoMat_TAS = ET_01;
+            break;
+        default :
+            break;
+    }
+}
+void AutoMat_CAP_HMC()
+{
+    static char  L_i2c_Data[2],LIndex,Lerror;
     switch (ET_AutoMat_CAP) {
-        case ET_01 : 
-                    L_i2c_Data[0] = 0x07; // Send "register number" command to sensor 
-                    error = _I2C.write(Add_Sensor_CAP_HMC, L_i2c_Data, 1,true); // Send command string
-                    if (error==0) ET_AutoMat_CAP = ET_02;                
-                    break;
+        case ET_01 :
+            L_i2c_Data[0] = 0x07; // Send "register number" command to sensor
+            Lerror = _I2C.write(Add_Sensor_CAP_HMC, L_i2c_Data, 1,true); // Send command string
+            if (Lerror==0) ET_AutoMat_CAP = ET_02;
+            LIndex = 1;
+            break;
+            
         case ET_02 : 
-                    error = _I2C.read(Add_Sensor_CAP_HMC , L_i2c_Data, 2, true);
-                    if (error==0) {
-                    CAP = *((unsigned short*)L_i2c_Data)&0xffff; //altitude en décimètre                    
-                    }
-                    ET_AutoMat_CAP = ET_01;
-                    break;
-        default : break;
+             LIndex++;
+             if(LIndex>=Wait_Time1_ms) ET_AutoMat_CAP = ET_03;
+             break;
+                            
+        case ET_03 :
+            Lerror = _I2C.read(Add_Sensor_CAP_HMC , L_i2c_Data, 2, true);
+            if (Lerror==0) {
+                CRS = *((unsigned short*)L_i2c_Data)&0xffff; //Cap en deg*10
+            }
+            ET_AutoMat_CAP = ET_01;
+            break;
+        default :
+            break;
     }
-} 
-//------------------- 
-void Sansors_Init(){ 
-    char  L_i2c_Data[3];        
-     //------------ init Compass HMC //Continuous mode, periodic set/reset, 20Hz measurement rate.
-     L_i2c_Data[0] = HMC6352_CONTINUOUS;
-     L_i2c_Data[1] = 0x01;
-     L_i2c_Data[2] = 20;  
-     _I2C.write(Add_Sensor_CAP_HMC,L_i2c_Data,3); // Send command          
-     //----------------------------
-     wait_ms(1);         //attendre 1mS 
-     //------------- Get Offset TAS
-     L_i2c_Data[0] = 0x01; // Send "read data" command to sensor 
-     _I2C.write(Add_Sensor_TAS_EG4,L_i2c_Data,1); // Send command string
-     wait_ms(1);         //attendre 400µS avant de relancer
-     _I2C.read(Add_Sensor_TAS_EG4,L_i2c_Data, 2);
-     offset_TAS = *((unsigned short*)L_i2c_Data)&0xffff; // Altitude en décimètre      
 }
 
-void Irq05ms(){
-static unsigned char L_Flag_Timer=0, LTIMER005ms=0,LTIMER010ms=0;
-     LTIMER005ms++;       
-     L_Flag_Timer  = 1;
-     //-----------------------------
-     if(LTIMER005ms >= 2){
-          //-----------------                  
-          TIMER_10ms  = TIMER_10ms+1;
-          LTIMER005ms = 0;          
-          LTIMER010ms++;
-          L_Flag_Timer  = 2;
-          //-----------------
-          if(LTIMER010ms >= 10){
-               LTIMER010ms   = 0;
-               L_Flag_Timer  = 3;                           
-          }
-          //-----------------
-     }
-     
-     AutoMat_ALT_EAGLE_V4();
-     AutoMat_TAS_EAGLE_V4();
-     AutoMat_CAP_HMC();
-                
-     if (Flag_Timer != 0xFF) Flag_Timer = L_Flag_Timer;
-     //-----------------------------
- }
-     
-int main() {
+void AutoMat_TEM_LM75B()
+{
+    static char  L_i2c_Data[2],LIndex,Lerror;
+    switch (ET_AutoMat_TEM) {
+        case ET_01 :
+            L_i2c_Data[0] = 0x07; // Send "register number" command to sensor
+            Lerror = _I2C.write(Add_Sensor_TEM_LM75B, L_i2c_Data, 1,true); // Send command string
+            if (Lerror==0) ET_AutoMat_TEM = ET_02;
+            LIndex = 1;
+            break;
+            
+        case ET_02 : 
+             LIndex++;
+             if(LIndex>=Wait_Time1_ms) ET_AutoMat_TEM = ET_03;
+             break;
+                            
+        case ET_03 :
+            Lerror = _I2C.read(Add_Sensor_TEM_LM75B, L_i2c_Data, 2, true);
+            if (Lerror==0) {
+               // CRS = *((unsigned short*)L_i2c_Data)&0xffff; //Cap en deg*10
+            }
+            ET_AutoMat_TEM = ET_01;
+            break;
+        default :
+            break;
+    }
+}
+//----------------- LCD ------------
+void AutoMat_LCD_Ext()
+{
+    static char Lerror;
+    switch (ET_AutoMat_LCD) {
+        case ET_01 :            
+            Lerror = _I2C.write(Add_LCD_Ext, NULL, 0,true);
+            if (Lerror==0) ET_AutoMat_LCD = ET_02;
+            break;
+        case ET_02 :
+            // Code ici 
+            ET_AutoMat_LCD = ET_01;
+            break; 
+        default :
+            break;
+    }
+}
+//---------------------------------
+
+void Sansors_Init()
+{
+    char  L_i2c_Data[3];
+    //------------ init Compass HMC //Continuous mode, periodic set/reset, 20Hz measurement rate.
+    L_i2c_Data[0] = HMC6352_CONTINUOUS;
+    L_i2c_Data[1] = 0x01;
+    L_i2c_Data[2] = 20;
+    _I2C.write(Add_Sensor_CAP_HMC,L_i2c_Data,3); // Send command
+    //----------------------------
+    wait_ms(1);         //attendre 1mS
+    //------------- Get Offset TAS
+    L_i2c_Data[0] = 0x01; // Send "read data" command to sensor
+    _I2C.write(Add_Sensor_TAS_EG4,L_i2c_Data,1); // Send command string
+    wait_ms(1);         //attendre 400µS avant de relancer
+    _I2C.read(Add_Sensor_TAS_EG4,L_i2c_Data, 2);
+    Offset_SPD = *((unsigned short*)L_i2c_Data)&0xffff; // Altitude en décimètre
+}
+
+void Irq01ms()
+{
+    static unsigned char LFlag_Timer=0, LTIMER001ms=0,LTIMER010ms=0;
+    LTIMER001ms++;
+    LFlag_Timer  = 1;
+    //-----------------------------
+    if(LTIMER001ms >= 10) {
+        //-----------------
+        LTIMER001ms = 0; 
+        LFlag_Timer = 3;
+        LTIMER010ms = LTIMER010ms+1;        
+        //-----------------
+        if(LTIMER010ms >= 10) {
+            LTIMER010ms  = 0;
+            LFlag_Timer  = 7;
+        }
+        //-----------------
+        TIMER_10ms  = TIMER_10ms+1;  
+    }
+    AutoMat_ALT_EAGLE_V4();
+    AutoMat_TAS_EAGLE_V4();
+    AutoMat_CAP_HMC();
+    AutoMat_TEM_LM75B();// temperateur LM75B
     
-     CAP = 0;
-     TAS = 0;
-     ALT = 0;
-     LedError = 0;           
-     //-------------------- 
-     _I2C.frequency(100000);             
-     _ComGPS.baud(38400); //GPS V4 EAGLE
-     _ComGPS.attach(&AutoMat_GPS,Serial::RxIrq); // defini une interruption chaque foix que le recepteur GPS envoi un charactere   
-     _ComXbee.baud(38400); 
-     RSTXbee=0;
-     wait(0.5);
-     RSTXbee=1;          
-     Sansors_Init();
-     //--------------------
-     //-------------- File Creat RGPSLogX.csv and DataLogX.csv          X=FileIndex
-     FileIndex = 5;
-     //--------------------
-     sprintf(DataLogFileName,"/USB/DataLog%lu.csv",FileIndex);
-     Fs_Log = fopen(DataLogFileName, "w");//ajouter un nouveau fichier et écraser l'ancien     
-     //-------------------- Verification de la creations des fichers 
-     if(Fs_Log==NULL) goto LabError;     
-     fprintf(Fs_Log,"LogData\r\n");    
-     fprintf(Fs_Log,"GPS;TIMER1;Qual;Heur;LatD;LatMin;LatDir;LongD;LongMin;LongDir;HMSL\r\n"); 
-     fprintf(Fs_Log,"PDV;TIMER1;CAP;ALT;TAS;Tem\r\n");      
-     //--------------------
-     // Active les Automat
-     ET_AutoMat_ALT = ET_01;
-     ET_AutoMat_TAS = ET_01;
-     ET_AutoMat_CAP = ET_01;
-     _Ticker5ms.attach_us(&Irq05ms,5000);   
-     // la variable  un nom de 1ms mais on fait ca sur 5ms ce n'est pas cohérent !!!!!!!
-     // Samir
-     //--------------------
-     CAP    = 9991;
-     ALT    = 9992;
-     TAS    = 9993;
-     TEMPRE = 9994;   
-     TimeBtpress=0;  
-     while(TimeBtpress<100){
+    if (Flag_Timer != 0xFF) Flag_Timer = LFlag_Timer;
+    //-----------------------------
+}
+
+int main()
+{
+    
+    CRS = 0;
+    SPD = 0;
+    ALT = 0;
+    LedError = 0;
+    //--------------------
+    _I2C.frequency(100000);
+    _ComGPS.baud(38400); //GPS V4 EAGLE
+    _ComGPS.attach(&AutoMat_GPS,Serial::RxIrq); // defini une interruption chaque foix que le recepteur GPS envoi un charactere
+    _ComXbee.baud(38400);
+    RSTXbee=0;
+    wait(0.5);
+    RSTXbee=1;
+    Sansors_Init();
+    //--------------------
+    //-------------- File Creat RGPSLogX.csv and DataLogX.csv          X=FileIndex
+#ifdef EN_AutoMat_DataLog  
+    FileIndex = 0;
+Started:
+    FileIndex++;
+  
+    //--------------------
+    sprintf(DataLogFileName,"/USB/DataLog%4lu.csv",FileIndex);
+    Fs_Log = fopen(DataLogFileName, "r");//ajouter un nouveau fichier et écraser l'ancien
+    if (Fs_Log!=NULL) goto Started;
+
+    Fs_Log = fopen(DataLogFileName, "w");//ajouter un nouveau fichier et écraser l'ancien
+    //-------------------- Verification de la creations des fichers
+    if(Fs_Log==NULL) goto LabError;
+    fprintf(Fs_Log,"LogData\r\n");
+    fprintf(Fs_Log,"TIMER;GPS;Qual;Heur;LatD;LongD;HMSL;");
+    fprintf(Fs_Log,"PDV;CRS;ALT;SPD;TEM\r\n");
+#endif      
+    //--------------------
+    // Active les Automat
+    ET_AutoMat_ALT = ET_01;
+    ET_AutoMat_TAS = ET_01;
+    ET_AutoMat_CAP = ET_01;
+    ET_AutoMat_TEM = ET_01;
+    ET_AutoMat_LCD = ET_01;
+    _Ticker1ms.attach_us(&Irq01ms,Irq_Time_us);
+    // la variable  un nom de 1ms mais on fait ca sur 5ms ce n'est pas cohérent !!!!!!!
+    // Samir
+    //--------------------
+    CRS    = 9991;// initialisation
+    ALT    = 9992;// initialisation
+    SPD    = 9993;// initialisation
+    TEM    = 9994;// initialisation
+    Flag_Timer = 0;
+    //-------------------
+    TimeBtpress=0;
+    while(TimeBtpress<100) { // Boutton pour pouvoir controler le debut de l'enregistrement
         if(boutonStart == 1)TimeBtpress++;
-        if(boutonStart == 0)TimeBtpress=0; 
-        wait(0.005);
-     }    
-     //while(boutonStart==0); // Boutton pour pouvoir controler le debut de l'enregistrement
-     Flag_Timer = 0;
-     TimeBtpress=0; 
-     while(boutonEnd==0){   // Boutton pour pouvoir controler la fin de l'enregistrement
-       
-       switch  (Flag_Timer) {                                     
+        else TimeBtpress=0;
+        wait_ms(10);
+    }
+    //-------------------
+    TimeBtpress=0;
+    while(TimeBtpress<0xFFFF) {
+
+        switch  (Flag_Timer) {
 
-         case 0x01:
+            case 0x01:// 05 ms
+                Flag_Timer = 0;
+                // Boutton pour pouvoir controler la fin de l'enregistrement
+                if(boutonEnd == 1)TimeBtpress++;
+                else TimeBtpress=0; 
+                //------------------
+                break;
+            case 0x03:// 10 ms
+                Flag_Timer = 0xFF;
+                #ifdef EN_AutoMat_DataLog
+                AutoMat_DataLog();
+                #endif
+                AutoMat_Xbee_Tx();
                 Flag_Timer = 0;
                 break;
-         case 0x02:               
-                Flag_Timer = 0xFF;              
-                AutoMat_DataLog(); 
-                AutoMat_Xbee_Tx();
+            case 0x07:// 100 ms
+                Flag_Timer = 0xFF;     
+
+                GPS    = OldGPS;
+                OldTIMER_10ms = TIMER_10ms;
+                OldALT = ALT;
+                OldSPD = SPD;
+                OldCRS = CRS;
+                OldTEM = TEM;
+                
+                HK_ALT = OldALT/10.0;
+                HK_SPD = OldSPD/10.0;
+                HK_CRS = OldCRS/10.0;
                 
-                Flag_Timer = 0;
-                break;
-         case 0x03:
-                Flag_Timer = 0xFF;             
-         
-                GPS    = GpsData;
-                OldALT = ALT;
-                OldTAS = TAS;
-                OldCAP = CAP;
-                OldTEMPRE = TEMPRE;
+                ET_AutoMat_Xbee_Tx = ET_01;
+                ET_AutoMat_DataLog = ET_01;
                 
-                ET_AutoMat_Xbee_Tx = ET_01; 
-                ET_AutoMat_DataLog = ET_01;                  
+                //------------------ vérification si le Bt de fin est press pendent un Dt=100 ms
+                if(TimeBtpress>100) {
+                    TimeBtpress = 0xFFFF;
+                    ET_AutoMat_Xbee_Tx = ET_00;
+                    ET_AutoMat_DataLog = ET_00;
+                }
+                //------------------
+                #ifdef EN_AutoMat_DataLog
                 AutoMat_DataLog();
-                AutoMat_Xbee_Tx();       
-    
+                #endif
+                AutoMat_Xbee_Tx();
+
                 Flag_Timer = 0x00;
                 break;
-                                
-         default: break;    
-        }// fin switch 
-      } 
-      _Ticker5ms.detach(); 
-      _ComGPS.attach(NULL,Serial::RxIrq);
-      LedXbee = 0;
-      LedGPS  = 0;      
-      LedLog  = 1;
-      fclose(Fs_Log);
-      wait(1);
-      LedLog  = 0;       
-      while(1){
+
+            default:
+                break;
+        }// fin switch
+    }// fin while
+    _Ticker1ms.detach(); // ticker detach
+    _ComGPS.attach(NULL,Serial::RxIrq); // detach Com GPS
+    LedXbee = 0;
+    LedGPS  = 0;
+#ifdef EN_AutoMat_DataLog
+    LedLog  = 1;
+     fprintf(Fs_Log,"END\r\n");
+     fclose(Fs_Log);
+    wait(1);
+    LedLog  = 0;
+#endif
+    while(1) {
         LedError=!LedError;
         wait(0.5);
-      }   
+    }
 //----------------
-LabError:    
+#ifdef EN_AutoMat_DataLog
+LabError:
     LedError=1;
+#endif    
 //----------------
 
 }
--- a/Define.h	Tue Apr 21 10:16:20 2015 +0000
+++ b/Define.h	Thu Apr 30 12:24:33 2015 +0000
@@ -1,6 +1,13 @@
-#define  Add_Sensor_CAP_HMC      0x0042
-#define  Add_Sensor_TAS_EG4      0x00EA
-#define  Add_Sensor_ALT_EG4      0x00EC
+#define EN_AutoMat_DataLog 
+#define EN_AutoMat_GPS
+#define EN_AutoMat_Xbee
+#define EN_AutoMat_Hid_PC
+//-----------------------------
+#define  Add_Sensor_CAP_HMC      0x42
+#define  Add_Sensor_TAS_EG4      0xEA
+#define  Add_Sensor_ALT_EG4      0xEC
+#define  Add_Sensor_TEM_LM75B    0x01
+#define  Add_LCD_Ext             0x02
 
 #define  Cmd_Sensor_CAP          0x41
 #define  Cmd_Sensor_TAS          0x07
@@ -27,15 +34,25 @@
 #define RMC 2
 #define NData_GPS_Max 100
 //-----------------------------
+#define Irq_Time_us   1000
+#define Wait_Time1_ms 5
+unsigned char MsgGPSRx[100];
+
 unsigned char ET_AutoMat_GPS     = ET_00;
 unsigned char ET_AutoMat_Xbee_Tx = ET_00;
 unsigned char ET_AutoMat_DataLog = ET_00;
 unsigned char ET_AutoMat_ALT     = ET_00;  
 unsigned char ET_AutoMat_TAS     = ET_00;
 unsigned char ET_AutoMat_CAP     = ET_00;
+unsigned char ET_AutoMat_TEM     = ET_00;
+unsigned char ET_AutoMat_LCD     = ET_00;
 
-unsigned int offset_TAS,OldTimer_10ms;
-unsigned int CAP,TAS,ALT,TEMPRE;
-unsigned int OldCAP,OldTAS,OldALT,OldTEMPRE;
+char         HK_MSG_Tx[100];
+float        HK_RLL,HK_PCH,HK_CRS,HK_SPD,HK_ALT;
 
-unsigned char Flag_Timer = 0;
\ No newline at end of file
+unsigned int Offset_SPD,OldTIMER_10ms;
+unsigned int CRS,SPD,ALT,TEM;
+unsigned int OldCRS,OldSPD,OldALT,OldTEM;
+
+unsigned char Flag_Timer = 0;
+
--- a/_GPS/DecMsgGPGGA.h	Tue Apr 21 10:16:20 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-void DecodageGPGGA(unsigned char Ldata)  //-------------------------------------------------------
-{
-    static unsigned short CommaNbr;
-    static unsigned short ii,jj;
-    GpsData.GGA_Valid  = 0;
-    CommaNbr = 0;
-    for(ii=0;ii<Ldata;ii++)
-    {
-     if(_MsgGPSRx[ii]==',')
-      {
-        _PosV[CommaNbr] = ii;
-        CommaNbr++;
-      }
-    }
-    if(CommaNbr<11)goto LabFin; //Vérification de la longueur du message GPGGA
-                                //par le nombre des vergules
-//UTC of position
-    //extraction du temps UTC
-    jj=0;//Identification de la position de la première virgule dans le MsgGPS
-    _DL=Get_Length(jj);
-    if((_DL<9)||(_DL>10)) goto LabFin;//Vérification de la longueur du message de temps
-    Set_Data(jj);
-    Validation_StrToFloat(_DL);
-    if(_Npt  !=1)    goto LabFin;
-    if(_Pospt!=6)    goto LabFin;
-    //Vérification de Time "hhmmss"
-    _hh=10*(_Data[0]-48)+(_Data[1]-48);//Extraction de l'heur
-    _mm=10*(_Data[2]-48)+(_Data[3]-48);//Extraction des minutes
-    _ss=10*(_Data[4]-48)+(_Data[5]-48);//Extraction des secondes
-    if((_hh>24)||(_mm>59)||(_ss>59))goto LabFin;
-//Latitude of position
-    //extraction du Lattitude
-    jj=1;//Identification de la position de la deuxième virgule dans le MsgGPS
-    _DL=Get_Length(jj);
-    if((_DL<9)||(_DL>10)) goto LabFin;//Vérification de la longueur du message de lattitude
-    Set_Data(jj);
-    Validation_StrToFloat(_DL);
-    if(_Npt  !=1)    goto LabFin;
-    if(_Pospt!=4)    goto LabFin;
-    
-    //Vérification du Lattitude "LatDegLatMin,LatMin1LatMin2"
-    _LatDeg =10*(_Data[0]-48)+(_Data[1]-48);//Extraction des degrés du lattitude
-    _LatMin =10*(_Data[2]-48)+(_Data[3]-48);//Extraction des minutes du lattitude
-    _LatMin1=10*(_Data[5]-48)+(_Data[6]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
-    _LatMin2=10*(_Data[7]-48)+(_Data[8]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
-    if((_LatDeg>90)||(_LatMin>59)||(_LatMin1>99)||(_LatMin2>99))goto LabFin;
-    //Vérification de la direction du Lattitude LatDir(N ou S)
-    jj=2;//Identification de la position de la troisième virgule dans le MsgGPS
-    _DL=Get_Length(jj);
-    if(_DL!=1) goto LabFin;//Vérification de la longueur du message de direction de latittude
-    Set_Data(jj);
-    _LatDir=_Data[0];//Extraction de le direction du latitude
-    if((_LatDir!='N')&&(_LatDir!='S'))goto LabFin;
-    // 01 byte
-    //Longitude of position
-    //extraction de la Longitude
-    jj=3;//Identification de la position de la quatrième virgule dans le MsgGPS
-    _DL=Get_Length(jj);
-    if((_DL<10)||(_DL>11)) goto LabFin;//Vérification de la longueur du message de la longitude
-    Set_Data(jj);
-    Validation_StrToFloat(_DL);
-    if(_Npt  !=1)    goto LabFin;
-    if(_Pospt!=5)    goto LabFin;
-    //Vérification du La Longitude "LongDegLongMin,LongMin1LongMin2"
-    _LongDeg =100*(_Data[0]-48)+10*(_Data[1]-48)+(_Data[2]-48);//Extraction des degrés de la longitude
-    _LongMin =10*(_Data[3]-48)+(_Data[4]-48);//Extraction des minutes de la longitude
-    _LongMin1=10*(_Data[6]-48)+(_Data[7]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
-    _LongMin2=10*(_Data[8]-48)+(_Data[9]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
-    if((_LongDeg>180)||(_LongMin>59)||(_LongMin1>99)||(_LongMin2>99))goto LabFin;
-    //Vérification de la direction du Longitude LonDir(E ou W)
-    jj=4;//Identification de la position de la cinquième virgule dans le MsgGPS
-    _DL=Get_Length(jj);
-    if(_DL!=1) goto LabFin;//Vérification de la longueur du message de direction de la longitude
-    Set_Data(jj);
-    _LongDir=_Data[0];//Extraction de le direction de la longitude
-    if((_LongDir!='E')&&(_LongDir!='W'))goto LabFin;
-//GPS Quality indicator
-    jj=5;//Identification de la position de la sixième virgule dans le MsgGPS
-    _DL=Get_Length(jj);
-    if(_DL!=1) goto LabFin;//Vérification de la longueur du message de l'ndicateur de qualité GPS
-    Set_Data(jj);
-    Validation_StrToFloat(_DL);
-    if(_Npt  !=0)    goto LabFin;
-    if(_Pospt!=0)    goto LabFin;
-    _Qual=_Data[0]-48;//Extraction de l'information de la qualité du MsgGPs
-    if((_Qual<1)||(_Qual>2))goto LabFin;
-//Antenna altitude above mean-sea-level "SignHMSLHMSL_HHMSL_L,HMSL_1HMSL_2"  .
-    jj=8;//Identification de la position de la neuvième virgule dans le MsgGPS
-    _DL=Get_Length(jj);
-    if(_DL<3) goto LabFin;//Vérification de la longueur du message de l'altitude
-    Set_Data(jj);
-    _SignHMSL='+';
-    if(_Data[0]=='-')
-    {
-      _DL=_DL-1;
-      _SignHMSL='-';
-      for(ii=0;ii<_DL;ii++) _Data[ii]=_Data[ii+1];
-    }
-    Validation_StrToFloat(_DL);
-    if(_Npt   !=1)  goto LabFin;
-    if(_Pospt ==0)  goto LabFin;    
-    switch (_Pospt)
-     {
-      case 1: {_HMSL_L = (_Data[0]-48)                ; _HMSL_H = 0; break;}
-      case 2: {_HMSL_L = (_Data[1]-48)+10*(_Data[0]-48); _HMSL_H = 0; break;}
-      case 3: {_HMSL_L = (_Data[2]-48)+10*(_Data[1]-48); _HMSL_H = (_Data[0]-48); break;}
-      case 4: {_HMSL_L = (_Data[3]-48)+10*(_Data[2]-48); _HMSL_H = (_Data[1]-48)+10*(_Data[0]-48); break;}
-      default : break;
-    }
-    _DL=_DL-_Pospt-1; //La longure de chiffre après la virgule
-    switch (_DL)
-     {
-      case 1: {_HMSL_1 = (_Data[_Pospt+1]-48)                      ; _HMSL_2 = 0; break;}
-      case 2: {_HMSL_1 = (_Data[_Pospt+2]-48)+10*(_Data[_Pospt+1]-48); _HMSL_2 = 0; break;}
-      case 3: {_HMSL_1 = (_Data[_Pospt+2]-48)+10*(_Data[_Pospt+1]-48); _HMSL_2 = _Data[_Pospt+3]-48; break;}
-      case 4: {_HMSL_1 = (_Data[_Pospt+2]-48)+10*(_Data[_Pospt+1]-48); _HMSL_2 = 10*(_Data[_Pospt+3]-48)+_Data[_Pospt+4]-48; break;}
-      default : break;
-    }    
-    //Antenna height unit
-    jj=9;//Identification de la position de la dixième virgule dans le MsgGPS
-    _DL=Get_Length(jj);
-    if(_DL!=1) goto LabFin;//Vérification de la longueur du message de l'unité de la hauteur
-    Set_Data(jj);
-    _HUnite=_Data[0];//Extraction de l'unité de la hauteur
-    if((_HMSL_H>35)||(_HUnite!='M'))goto LabFin;
-    
-          GpsData.GGA_Valid = 1;
-          GpsData.hh = _hh;
-          GpsData.mm = _mm;
-          GpsData.ss = _ss;
-         //----------------------------------------------------------------------------
-          GpsData.LatDeg   = _LatDeg;
-          GpsData.LatMin   = _LatMin;
-          GpsData.Latmmmm  = _LatMin1*100+_LatMin2;
-          GpsData.LatDir   = _LatDir;
-         //-----------------------------------------------------------------------------
-          GpsData.LongDeg  = _LongDeg;
-          GpsData.LongMin  = _LongMin;
-          GpsData.Longmmmm = _LongMin1*100+_LongMin2;
-          GpsData.LongDir  = _LongDir;
-         //-----------------------------------------------------------------------------
-          GpsData.Qual     = _Qual;
-         //-----------------------------------------------------------------------------
-          GpsData.HMSL     = _HMSL_H*100+_HMSL_L;
-          GpsData.SignHMSL = _SignHMSL;
-          GpsData.HUnite   = _HUnite;
-LabFin:
-asm{NOP}
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/_GPS/Dec_GPS.cpp	Thu Apr 30 12:24:33 2015 +0000
@@ -0,0 +1,195 @@
+#include "Dec_GPS.h"
+
+ unsigned char _DL,_Npt,_Pospt;
+ unsigned char _Data[16],_PosV[16];
+ unsigned char _MsgGPSRx[100];   
+
+//------------------------------------------------------------------------------
+//Calcul de la longueur des sous message
+unsigned char Get_Length(unsigned short index)
+ {
+    static unsigned char LongData;
+    LongData=_PosV[index+1]-_PosV[index]-1;
+    return LongData;
+ }
+//Décomposition du message en Sub message
+void Set_Data(unsigned char index){
+    static unsigned char ii,jj;
+    static unsigned char Start,End;
+    ii=0;
+    Start = _PosV[index]+1;    
+    End   = _PosV[index+1];  
+    
+    for(jj=Start;jj<End;jj++){
+       _Data[ii] = _MsgGPSRx[jj];      
+       ii++;
+    }
+ } 
+//Vérification des sub message
+void Validation_StrToFloat(unsigned char LongData)
+ {
+    unsigned char ii;
+    _Npt   = 0;
+    _Pospt = 0;
+    for(ii=0;ii<LongData;ii++){
+       if(_Data[ii]=='.')
+        {
+          _Npt++;
+          _Pospt=ii;
+        }
+        else if((_Data[ii]<48)||(_Data[ii]>57)) _Npt=_Npt+2;
+     }
+ }
+
+void DecodageGPGGA(unsigned char *_MsgGPS_Rx,unsigned char Ldata, StructGPS *GpsData)
+{
+    static unsigned char CommaNbr;
+    static unsigned char ii,jj;
+    StructGPS L_GpsData;
+    
+    unsigned char _hh,_mm,_ss;
+    unsigned char _LatDeg,_LatMin,_LatMin1,_LatMin2,_LatDir;
+    unsigned char _LonDeg,_LonMin,_LonMin1,_LonMin2,_LonDir;
+    unsigned char _Qual;
+    unsigned char _HMSL_L,_HMSL_H;
+    char          _SignHMSL,_HUnite;
+    float         _fLatGpsDD,_fLonGpsDD;
+     
+    ii=0;
+    while(ii<=Ldata){
+     _MsgGPSRx[ii]=*_MsgGPS_Rx;
+     _MsgGPS_Rx++;
+     ii++;
+    }
+    L_GpsData.GGA_Valid  = 0;
+    CommaNbr = 0;
+    for(ii=0;ii<Ldata;ii++) {
+     if(_MsgGPSRx[ii]==',') {
+        _PosV[CommaNbr] = ii;
+        CommaNbr++;
+      }
+    }
+    if(CommaNbr<11)goto LabFin; //Vérification de la longueur du message GPGGA
+                                //par le nombre des vergules
+//UTC of position
+    //extraction du temps UTC
+    jj=0;//Identification de la position de la première virgule dans le MsgGPS
+    _DL=Get_Length(jj);
+    if((_DL<9)||(_DL>10)) goto LabFin;//Vérification de la longueur du message de temps
+    Set_Data(jj);
+    Validation_StrToFloat(_DL);
+    if(_Npt  !=1)    goto LabFin;
+    if(_Pospt!=6)    goto LabFin;
+    //Vérification de Time "hhmmss"
+    _hh=10*(_Data[0]-48)+(_Data[1]-48);//Extraction de l'heur
+    _mm=10*(_Data[2]-48)+(_Data[3]-48);//Extraction des minutes
+    _ss=10*(_Data[4]-48)+(_Data[5]-48);//Extraction des secondes
+    if((_hh>24)||(_mm>59)||(_ss>59))goto LabFin;
+//Latitude of position
+    //extraction du Lattitude
+    jj=1;//Identification de la position de la deuxième virgule dans le MsgGPS
+    _DL=Get_Length(jj);
+    if((_DL<9)||(_DL>10)) goto LabFin;//Vérification de la longueur du message de lattitude
+    Set_Data(jj);
+    Validation_StrToFloat(_DL);
+    if(_Npt  !=1)    goto LabFin;
+    if(_Pospt!=4)    goto LabFin;
+    
+    //Vérification du Lattitude "LatDegLatMin,LatMin1LatMin2"
+    _LatDeg =10*(_Data[0]-48)+(_Data[1]-48);//Extraction des degrés du lattitude
+    _LatMin =10*(_Data[2]-48)+(_Data[3]-48);//Extraction des minutes du lattitude
+    _LatMin1=10*(_Data[5]-48)+(_Data[6]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
+    _LatMin2=10*(_Data[7]-48)+(_Data[8]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
+    if((_LatDeg>90)||(_LatMin>59)||(_LatMin1>99)||(_LatMin2>99))goto LabFin;
+    //Vérification de la direction du Lattitude LatDir(N ou S)
+    jj=2;//Identification de la position de la troisième virgule dans le MsgGPS
+    _DL=Get_Length(jj);
+    if(_DL!=1) goto LabFin;//Vérification de la longueur du message de direction de latittude
+    Set_Data(jj);
+    _LatDir=_Data[0];//Extraction de le direction du latitude
+    if((_LatDir!='N')&&(_LatDir!='S'))goto LabFin;
+    // 01 byte
+    //Longitude of position
+    //extraction de la Longitude
+    jj=3;//Identification de la position de la quatrième virgule dans le MsgGPS
+    _DL=Get_Length(jj);
+    if((_DL<10)||(_DL>11)) goto LabFin;//Vérification de la longueur du message de la longitude
+    Set_Data(jj);
+    Validation_StrToFloat(_DL);
+    if(_Npt  !=1)    goto LabFin;
+    if(_Pospt!=5)    goto LabFin;
+    //Vérification du La Longitude "LongDegLongMin,LongMin1LongMin2"
+    _LonDeg =100*(_Data[0]-48)+10*(_Data[1]-48)+(_Data[2]-48);//Extraction des degrés de la longitude
+    _LonMin =10*(_Data[3]-48)+(_Data[4]-48);//Extraction des minutes de la longitude
+    _LonMin1=10*(_Data[6]-48)+(_Data[7]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
+    _LonMin2=10*(_Data[8]-48)+(_Data[9]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
+    if((_LonDeg>180)||(_LonMin>59)||(_LonMin1>99)||(_LonMin2>99))goto LabFin;
+    //Vérification de la direction du Longitude LonDir(E ou W)
+    jj=4;//Identification de la position de la cinquième virgule dans le MsgGPS
+    _DL=Get_Length(jj);
+    if(_DL!=1) goto LabFin;//Vérification de la longueur du message de direction de la longitude
+    Set_Data(jj);
+    _LonDir=_Data[0];//Extraction de le direction de la longitude
+    if((_LonDir!='E')&&(_LonDir!='W'))goto LabFin;
+//GPS Quality indicator
+    jj=5;//Identification de la position de la sixième virgule dans le MsgGPS
+    _DL=Get_Length(jj);
+    if(_DL!=1) goto LabFin;//Vérification de la longueur du message de l'ndicateur de qualité GPS
+    Set_Data(jj);
+    Validation_StrToFloat(_DL);
+    if(_Npt  !=0)    goto LabFin;
+    if(_Pospt!=0)    goto LabFin;
+    _Qual=_Data[0]-48;//Extraction de l'information de la qualité du MsgGPs
+    if((_Qual<1)||(_Qual>2))goto LabFin;
+//Antenna altitude above mean-sea-level "SignHMSLHMSL_HHMSL_L,HMSL_1HMSL_2"  .
+    jj=8;//Identification de la position de la neuvième virgule dans le MsgGPS
+    _DL=Get_Length(jj);
+    if(_DL<3) goto LabFin;//Vérification de la longueur du message de l'altitude
+    Set_Data(jj);
+    _SignHMSL='+';
+    
+    if(_Data[0]=='-'){
+      _DL=_DL-1;
+      _SignHMSL='-';
+      for(ii=0;ii<_DL;ii++) _Data[ii]=_Data[ii+1];
+    }
+    Validation_StrToFloat(_DL);
+    if(_Npt   !=1)  goto LabFin;
+    if(_Pospt ==0)  goto LabFin;  
+      
+    switch (_Pospt) {
+      case 1: {_HMSL_L = (_Data[0]-48)                 ; _HMSL_H = 0; break;}
+      case 2: {_HMSL_L = (_Data[1]-48)+10*(_Data[0]-48); _HMSL_H = 0; break;}
+      case 3: {_HMSL_L = (_Data[2]-48)+10*(_Data[1]-48); _HMSL_H = (_Data[0]-48); break;}
+      case 4: {_HMSL_L = (_Data[3]-48)+10*(_Data[2]-48); _HMSL_H = (_Data[1]-48)+10*(_Data[0]-48); break;}
+      default : break;
+    }
+    //Antenna height unit
+     jj=9; // Identification de la position de la dixième virgule dans le MsgGPS
+    _DL=Get_Length(jj);
+    if(_DL!=1) goto LabFin;//Vérification de la longueur du message de l'unité de la hauteur
+    Set_Data(jj);
+    _HUnite=_Data[0];//Extraction de l'unité de la hauteur
+    if((_HMSL_H>35)||(_HUnite!='M'))goto LabFin;
+
+          L_GpsData.hh = _hh;
+          L_GpsData.mm = _mm;
+          L_GpsData.ss = _ss;
+         //----------------------------------------------------------------------------
+          L_GpsData.LatDeg   = _LatDeg;
+         //-----------------------------------------------------------------------------
+          _fLatGpsDD = 1000000.0*_LatDeg+100000.0*_LatMin/6.0+10.0*(_LatMin1*100+_LatMin2)/6.0;
+          _fLonGpsDD = 1000000.0*_LonDeg+100000.0*_LonMin/6.0+10.0*(_LonMin1*100+_LonMin2)/6.0;
+          
+          L_GpsData.LatDeg = (_fLatGpsDD);//*0.99998537);
+          L_GpsData.LonDeg = (_fLonGpsDD);//*0.99981997);              
+         //-----------------------------------------------------------------------------
+          L_GpsData.Qual     = _Qual;
+         //-----------------------------------------------------------------------------
+          L_GpsData.HMSL     = _HMSL_H*100+_HMSL_L;
+          if (_SignHMSL=='-') L_GpsData.HMSL = -L_GpsData.HMSL;          
+          L_GpsData.GGA_Valid = 1;
+          *GpsData=L_GpsData;
+LabFin:
+asm{NOP}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/_GPS/Dec_GPS.h	Thu Apr 30 12:24:33 2015 +0000
@@ -0,0 +1,26 @@
+#ifndef Dec_GPS_H
+
+#define Dec_GPS_H
+
+typedef struct {
+          unsigned char GGA_Valid;
+          unsigned char Qual;
+          unsigned char hh;
+          unsigned char mm;
+          unsigned char ss;  
+          signed long   LatDeg;        
+          signed long   LonDeg;
+          signed long   HMSL;  
+
+}StructGPS;
+
+unsigned char Get_Length(unsigned short index); 
+void Set_Data(unsigned char index);
+void Validation_StrToFloat(unsigned char LongData);
+void DecodageGPGGA(unsigned char *_MsgGPSRx,unsigned char Ldata,StructGPS *GpsData);
+
+#endif
+
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
--- a/_GPS/RecGPS.h	Tue Apr 21 10:16:20 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-unsigned char _DL,_Npt,_Pospt;
-unsigned char _hh,_mm,_ss;
-unsigned char _LatDeg,_LatMin,_LatMin1,_LatMin2,_LatDir;
-unsigned char _LongDeg,_LongMin,_LongMin1,_LongMin2,_LongDir;
-unsigned char _Qual;
-unsigned char _SignHMSL,_HMSL_L,_HMSL_H,_HMSL_1,_HMSL_2,_HUnite;
-unsigned char _dd,_yy,_mn,_val;
-
-unsigned char _Data[16],_PosV[16],_MsgGPSRx[100];
-
-// defini un structure
-typedef struct {
-          unsigned char GGA_Valid;
-          unsigned char hh;
-          unsigned char mm;
-          unsigned char ss; 
-  
-          unsigned char LatDeg; 
-          unsigned char LatMin;
-          unsigned char LatMin1;
-          unsigned char LatMin2;
-          unsigned int  Latmmmm;
-          unsigned char LatDir;
-          
-          unsigned char LongDeg;
-          unsigned char LongMin;
-          unsigned char LongMin1;
-          unsigned char LongMin2;
-          unsigned int  Longmmmm;
-          unsigned char LongDir;
-          
-          unsigned char Qual;
-                  
-          unsigned int  HMSL;          
-          unsigned char SignHMSL;
-          unsigned char HUnite;  
-}StructGPS;
-
-StructGPS GpsData;
-//------------------------------------------------------------------------------
-//Calcul de la longueur des sous message
-unsigned char Get_Length(unsigned short index)
- {
-    static unsigned char LongData;
-    LongData=_PosV[index+1]-_PosV[index]-1;
-    return LongData;
- }
-//Décomposition du message en Sub message
-void Set_Data(unsigned char index){
-    static unsigned char ii,jj;
-    static unsigned char Start,End;
-    ii=0;
-    Start = _PosV[index]+1;    
-    End   = _PosV[index+1];  
-    
-    for(jj=Start;jj<End;jj++){
-       _Data[ii] = _MsgGPSRx[jj];      
-       ii++;
-    }
- } 
-//Vérification des sub message
-void Validation_StrToFloat(unsigned char LongData)
- {
-    unsigned char ii;
-    _Npt   = 0;
-    _Pospt = 0;
-    for(ii=0;ii<LongData;ii++){
-       if(_Data[ii]=='.')
-        {
-          _Npt++;
-          _Pospt=ii;
-        }
-        else if((_Data[ii]<48)||(_Data[ii]>57)) _Npt=_Npt+2;
-     }
- }
- 
-void DecodageGPGGA(unsigned char Ldata);
- 
-//------------------------------------------------------------------------------
-#include "DecMsgGPGGA.h"       // GPGGA
-//------------------------------------------------------------------------------