Ahmed_PFE_Embarq_300415

Dependencies:   C12832 LM75B mbed

Fork of Ahmed_Embarq_Prog by ahmed ahmed

Revision:
0:05a20e3e3179
Child:
1:197b9fed6092
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Ah_main.cpp	Tue Apr 21 10:16:20 2015 +0000
@@ -0,0 +1,372 @@
+#include "mbed.h"
+#include "C12832.h"
+#include "MSCFileSystem.h"
+//-----------------------
+#include "Define.h"
+#include "RecGPS.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
+
+ DigitalOut  RSTXbee (p30); 
+ DigitalOut  LedGPS  (LED1); 
+ DigitalOut  LedLog  (LED2);
+ DigitalOut  LedXbee (LED3);
+ DigitalOut  LedError(LED4);
+//-----------------------
+StructGPS GPS;
+unsigned long TimeBtpress=0,TIMER_10ms;
+unsigned long 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;                        
+                        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(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;
+        }
+   }
+}    
+//----------------------------------- 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;       
+           }  
+}
+//----------------------------------- 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;
+    }
+} 
+
+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;
+        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;
+    }
+} 
+void AutoMat_CAP_HMC(){      
+    static char     L_i2c_Data[2],error;    
+    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_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;
+    }
+} 
+//------------------- 
+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() {
+    
+     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(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) {                                     
+
+         case 0x01:
+                Flag_Timer = 0;
+                break;
+         case 0x02:               
+                Flag_Timer = 0xFF;              
+                AutoMat_DataLog(); 
+                AutoMat_Xbee_Tx();
+                
+                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;                  
+                AutoMat_DataLog();
+                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){
+        LedError=!LedError;
+        wait(0.5);
+      }   
+//----------------
+LabError:    
+    LedError=1;
+//----------------
+
+}