dd

Dependencies:   C12832 LM75B mbed

Ah_main.cpp

Committer:
pfe
Date:
2015-04-21
Revision:
0:05a20e3e3179

File content as of revision 0:05a20e3e3179:

#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;
//----------------

}