dd

Dependencies:   C12832 LM75B mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Ah_main.cpp Source File

Ah_main.cpp

00001 #include "mbed.h"
00002 #include "C12832.h"
00003 #include "MSCFileSystem.h"
00004 //-----------------------
00005 #include "Define.h"
00006 #include "RecGPS.h"
00007 //-----------------------
00008  MSCFileSystem fsLog("USB");    //  Enregsetement des doonées "Flash Disque USB" 
00009  FILE    *Fs_Log;
00010  I2C     _I2C(p28,p27);         //  I2C    SCL,SDA
00011  Serial  _ComGPS(p13, p14);     //  TX non connecté, pin14 RX.   
00012  Serial  _ComXbee(p9,p10);      //  Serial tx(p9),rx(10)
00013  #define  pRST_Xbee   p30       //  pin RST Xbee
00014  Ticker  _Ticker5ms;
00015  Timer   _Timer1;               // Timer pour mesurer le temps
00016  
00017  DigitalIn  boutonStart(p13);   // Joystique Left  : Boutton pour pouvoir controler le debut de l'enregistrement
00018  DigitalIn  boutonEnd(p16);     // Joystique Right : Boutton pour pouvoir controler la fin de l'enregistrement
00019 
00020  DigitalOut  RSTXbee (p30); 
00021  DigitalOut  LedGPS  (LED1); 
00022  DigitalOut  LedLog  (LED2);
00023  DigitalOut  LedXbee (LED3);
00024  DigitalOut  LedError(LED4);
00025 //-----------------------
00026 StructGPS GPS;
00027 unsigned long TimeBtpress=0,TIMER_10ms;
00028 unsigned long FileIndex;
00029 char          Txt[16],Txt_Log[100],Txt_Tx2GSC[100],DataLogFileName[32];
00030 unsigned long tk1; // des variables pour stocker les temps de mesure
00031 //----------------------------------- Reception des données GPS  10Hz
00032 void AutoMat_GPS(){
00033 static unsigned char i=0,j=0,GPSDataType=0,ET_AutoMat_GPS=ET_01;
00034 static char gps_mess;
00035   while(_ComGPS.readable()){
00036         gps_mess=_ComGPS.getc();      
00037  
00038         switch(ET_AutoMat_GPS){
00039            case ET_01:  if(gps_mess==prompt$GP[i]){
00040                             i++;
00041                             if(i==3){
00042                                 i=0;
00043                                 j=0;
00044                                 ET_AutoMat_GPS=ET_02;                            
00045                             }
00046                         }else i=0;                        
00047                         break;
00048            case ET_02:  if(gps_mess==promptGGA[i]){
00049                             i++;
00050                             if(i==3){
00051                                 i=0;
00052                                 j=0;
00053                                 ET_AutoMat_GPS = ET_03;
00054                                 GPSDataType = GGA;                                
00055                                }
00056                             break;
00057                         }else i=0;
00058                      
00059                         if(gps_mess==promptRMC[j]){
00060                             j++;                            
00061                             if(j==3){
00062                                  j=0;
00063                                  ET_AutoMat_GPS=ET_03;
00064                                  GPSDataType=RMC;                               
00065                             }
00066                             break;
00067                         }else j=0;
00068                         
00069                         ET_AutoMat_GPS=ET_01;
00070                         break;
00071              
00072            case ET_03:  _MsgGPSRx[i]=gps_mess;
00073                         i++;
00074                         if((i<NData_GPS_Max)&&(gps_mess!=0x0D))break;
00075                            
00076                         switch(GPSDataType){
00077                              
00078                                 case GGA: DecodageGPGGA(i-1);// l'appel de la fonction de decodage du message GPGGA  
00079                                           LedGPS=!LedGPS;
00080                                           if (GpsData.GGA_Valid==0x01){
00081                                                 GpsData.GGA_Valid=0x00;                                            
00082                                                 GPS=GpsData;                  
00083                                           }
00084                                           break;
00085                                 case RMC: //DecodageGPRMC(i-1);// l'appel de la fonction de decodage du message GPGGA  //DecodageGPRMC(i-1);                                    
00086                                           break;
00087                                 default:  break;                         
00088                                }
00089                         ET_AutoMat_GPS=ET_01;                        
00090                         GPSDataType=0;
00091            default : break;
00092         }
00093    }
00094 }    
00095 //----------------------------------- Transmission données au sol 10 packet/s
00096 void AutoMat_Xbee_Tx(){
00097              switch  (ET_AutoMat_Xbee_Tx) { 
00098                     case ET_01:
00099                            LedXbee = !LedXbee;
00100                            sprintf(Txt_Tx2GSC,"$GPS;%lu;%lu;",OldTimer_10ms,GPS.Qual);                         
00101                            _ComXbee.printf("%s",Txt_Tx2GSC);                     
00102                            ET_AutoMat_Xbee_Tx = ET_02;
00103                            break;                  
00104                     case ET_02 : 
00105                            sprintf(Txt_Tx2GSC,"%2u:%2u:%2u;",GPS.hh,GPS.mm,GPS.ss);
00106                            _ComXbee.printf("%s",Txt_Tx2GSC);                           
00107                            ET_AutoMat_Xbee_Tx = ET_03;
00108                            break;
00109                     case ET_03 :
00110                            sprintf(Txt_Tx2GSC,"%2u;%2u.%u;%c;",GPS.LatDeg,GPS.LatMin,GPS.Latmmmm,GPS.LatDir);
00111                            _ComXbee.printf("%s",Txt_Tx2GSC);                
00112                            ET_AutoMat_Xbee_Tx = ET_04;
00113                            break;
00114                     case ET_04 :
00115                            sprintf(Txt_Tx2GSC,"%3u;%2u.%u;%c;",GPS.LongDeg,GPS.LongMin,GPS.Longmmmm,GPS.LongDir);
00116                            _ComXbee.printf("%s",Txt_Tx2GSC);
00117                            ET_AutoMat_Xbee_Tx = ET_05;                                                     
00118                           break;
00119                     case ET_05 :
00120                            sprintf(Txt_Tx2GSC,"%c%u\r\n",GPS.SignHMSL,GPS.HMSL);
00121                            _ComXbee.printf("%s",Txt_Tx2GSC);
00122                            ET_AutoMat_Xbee_Tx = ET_06;
00123                           break;
00124                     //------------       
00125                     case ET_06 :                          
00126                            sprintf(Txt_Tx2GSC,"$PDV;%lu;%4u;%4u;%4u;%4d\r\n",OldTimer_10ms,OldCAP,OldALT,OldTAS,OldTEMPRE);
00127                            _ComXbee.printf("%s",Txt_Tx2GSC);
00128                            ET_AutoMat_Xbee_Tx = ET_00;
00129                           break;                                        
00130                    default: ET_AutoMat_Xbee_Tx=ET_00; break;       
00131            }  
00132 }
00133 //----------------------------------- LogData 100Hz,  LogGPS 10Hz
00134 void AutoMat_DataLog(){
00135         switch  (ET_AutoMat_DataLog){ 
00136                                            
00137          case ET_01:
00138                 LedLog=!LedLog;
00139                 //--------------
00140                 OldTimer_10ms = TIMER_10ms;
00141                 // au max 100us    (0.1ms)
00142                 sprintf(Txt_Log,"PDV;%lu;%5d;%5d;%5d;%5d\r\n",TIMER_10ms,CAP,ALT,TAS,TEMPRE);           
00143                 // au max 5000 us  (5ms)
00144                 fprintf(Fs_Log,Txt_Log);                 
00145                 // 100us
00146                 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);
00147                 // au max 5 ms
00148                 fprintf(Fs_Log,Txt_Log);                 
00149                 //------------------                  
00150                 ET_AutoMat_DataLog++;                 
00151                 break;                                
00152          case ET_02:
00153          case ET_03:
00154          case ET_04:
00155          case ET_05:
00156          case ET_06:                
00157          case ET_07:
00158          case ET_08:
00159          case ET_09:                                                    
00160          case ET_10: 
00161                 // au max 100us    (0.1ms)
00162                 sprintf(Txt_Log,"PDV;%lu;%5d;%5d;%5d;%5d\r\n",TIMER_10ms,CAP,ALT,TAS,TEMPRE);            
00163                 // au max 5000 us  (5ms)
00164                 fprintf(Fs_Log,Txt_Log);                                                                                          
00165                 break;
00166                 
00167          default: break ;
00168       }    
00169 }
00170 //------------------------------------------ Sansors
00171 void AutoMat_ALT_EAGLE_V4(){      
00172     static char     L_i2c_Data[2],error;    
00173     switch (ET_AutoMat_ALT) {
00174         case ET_01 : 
00175                     L_i2c_Data[0] = 0x07; // Send "register number" command to sensor 
00176                     error = _I2C.write(Add_Sensor_ALT_EG4, L_i2c_Data, 1,true); // Send command string
00177                     if (error==0) ET_AutoMat_ALT = ET_02;                
00178                     break;
00179         case ET_02 : 
00180                     error = _I2C.read(Add_Sensor_ALT_EG4, L_i2c_Data, 2, true);
00181                     if (error==0) {
00182                     ALT = *((unsigned short*)L_i2c_Data)&0xffff; //altitude en décimètre
00183                     ALT = ALT-3000;
00184                     }
00185                     ET_AutoMat_ALT = ET_01;
00186                     break;
00187         default : break;
00188     }
00189 } 
00190 
00191 void AutoMat_TAS_EAGLE_V4(){      
00192     static char     L_i2c_Data[2],error;    
00193     switch (ET_AutoMat_TAS) {
00194         case ET_01 : 
00195                     L_i2c_Data[0] = 0x07; // Send "register number" command to sensor 
00196                     error = _I2C.write(Add_Sensor_TAS_EG4, L_i2c_Data, 1,true); // Send command string
00197                     if (error==0) ET_AutoMat_TAS = ET_02;                
00198                     break;
00199         case ET_02 : 
00200                     error = _I2C.read(Add_Sensor_TAS_EG4, L_i2c_Data, 2, true);
00201                     if (error==0) {
00202                     TAS = *((unsigned short*)L_i2c_Data)&0xffff; //altitude en décimètre
00203                     TAS = sqrt((float)(TAS-offset_TAS)*5.87755102);
00204                     }
00205                     ET_AutoMat_TAS = ET_01;
00206                     break;
00207         default : break;
00208     }
00209 } 
00210 void AutoMat_CAP_HMC(){      
00211     static char     L_i2c_Data[2],error;    
00212     switch (ET_AutoMat_CAP) {
00213         case ET_01 : 
00214                     L_i2c_Data[0] = 0x07; // Send "register number" command to sensor 
00215                     error = _I2C.write(Add_Sensor_CAP_HMC, L_i2c_Data, 1,true); // Send command string
00216                     if (error==0) ET_AutoMat_CAP = ET_02;                
00217                     break;
00218         case ET_02 : 
00219                     error = _I2C.read(Add_Sensor_CAP_HMC , L_i2c_Data, 2, true);
00220                     if (error==0) {
00221                     CAP = *((unsigned short*)L_i2c_Data)&0xffff; //altitude en décimètre                    
00222                     }
00223                     ET_AutoMat_CAP = ET_01;
00224                     break;
00225         default : break;
00226     }
00227 } 
00228 //------------------- 
00229 void Sansors_Init(){ 
00230     char  L_i2c_Data[3];        
00231      //------------ init Compass HMC //Continuous mode, periodic set/reset, 20Hz measurement rate.
00232      L_i2c_Data[0] = HMC6352_CONTINUOUS;
00233      L_i2c_Data[1] = 0x01;
00234      L_i2c_Data[2] = 20;  
00235      _I2C.write(Add_Sensor_CAP_HMC,L_i2c_Data,3); // Send command          
00236      //----------------------------
00237      wait_ms(1);         //attendre 1mS 
00238      //------------- Get Offset TAS
00239      L_i2c_Data[0] = 0x01; // Send "read data" command to sensor 
00240      _I2C.write(Add_Sensor_TAS_EG4,L_i2c_Data,1); // Send command string
00241      wait_ms(1);         //attendre 400µS avant de relancer
00242      _I2C.read(Add_Sensor_TAS_EG4,L_i2c_Data, 2);
00243      offset_TAS = *((unsigned short*)L_i2c_Data)&0xffff; // Altitude en décimètre      
00244 }
00245 
00246 void Irq05ms(){
00247 static unsigned char L_Flag_Timer=0, LTIMER005ms=0,LTIMER010ms=0;
00248      LTIMER005ms++;       
00249      L_Flag_Timer  = 1;
00250      //-----------------------------
00251      if(LTIMER005ms >= 2){
00252           //-----------------                  
00253           TIMER_10ms  = TIMER_10ms+1;
00254           LTIMER005ms = 0;          
00255           LTIMER010ms++;
00256           L_Flag_Timer  = 2;
00257           //-----------------
00258           if(LTIMER010ms >= 10){
00259                LTIMER010ms   = 0;
00260                L_Flag_Timer  = 3;                           
00261           }
00262           //-----------------
00263      }
00264      
00265      AutoMat_ALT_EAGLE_V4();
00266      AutoMat_TAS_EAGLE_V4();
00267      AutoMat_CAP_HMC();
00268                 
00269      if (Flag_Timer != 0xFF) Flag_Timer = L_Flag_Timer;
00270      //-----------------------------
00271  }
00272      
00273 int main() {
00274     
00275      CAP = 0;
00276      TAS = 0;
00277      ALT = 0;
00278      LedError = 0;           
00279      //-------------------- 
00280      _I2C.frequency(100000);             
00281      _ComGPS.baud(38400); //GPS V4 EAGLE
00282      _ComGPS.attach(&AutoMat_GPS,Serial::RxIrq); // defini une interruption chaque foix que le recepteur GPS envoi un charactere   
00283      _ComXbee.baud(38400); 
00284      RSTXbee=0;
00285      wait(0.5);
00286      RSTXbee=1;          
00287      Sansors_Init();
00288      //--------------------
00289      //-------------- File Creat RGPSLogX.csv and DataLogX.csv          X=FileIndex
00290      FileIndex = 5;
00291      //--------------------
00292      sprintf(DataLogFileName,"/USB/DataLog%lu.csv",FileIndex);
00293      Fs_Log = fopen(DataLogFileName, "w");//ajouter un nouveau fichier et écraser l'ancien     
00294      //-------------------- Verification de la creations des fichers 
00295      if(Fs_Log==NULL) goto LabError;     
00296      fprintf(Fs_Log,"LogData\r\n");    
00297      fprintf(Fs_Log,"GPS;TIMER1;Qual;Heur;LatD;LatMin;LatDir;LongD;LongMin;LongDir;HMSL\r\n"); 
00298      fprintf(Fs_Log,"PDV;TIMER1;CAP;ALT;TAS;Tem\r\n");      
00299      //--------------------
00300      // Active les Automat
00301      ET_AutoMat_ALT = ET_01;
00302      ET_AutoMat_TAS = ET_01;
00303      ET_AutoMat_CAP = ET_01;
00304      _Ticker5ms.attach_us(&Irq05ms,5000);   
00305      // la variable  un nom de 1ms mais on fait ca sur 5ms ce n'est pas cohérent !!!!!!!
00306      // Samir
00307      //--------------------
00308      CAP    = 9991;
00309      ALT    = 9992;
00310      TAS    = 9993;
00311      TEMPRE = 9994;   
00312      TimeBtpress=0;  
00313      while(TimeBtpress<100){
00314         if(boutonStart == 1)TimeBtpress++;
00315         if(boutonStart == 0)TimeBtpress=0; 
00316         wait(0.005);
00317      }    
00318      //while(boutonStart==0); // Boutton pour pouvoir controler le debut de l'enregistrement
00319      Flag_Timer = 0;
00320      TimeBtpress=0; 
00321      while(boutonEnd==0){   // Boutton pour pouvoir controler la fin de l'enregistrement
00322        
00323        switch  (Flag_Timer) {                                     
00324 
00325          case 0x01:
00326                 Flag_Timer = 0;
00327                 break;
00328          case 0x02:               
00329                 Flag_Timer = 0xFF;              
00330                 AutoMat_DataLog(); 
00331                 AutoMat_Xbee_Tx();
00332                 
00333                 Flag_Timer = 0;
00334                 break;
00335          case 0x03:
00336                 Flag_Timer = 0xFF;             
00337          
00338                 GPS    = GpsData;
00339                 OldALT = ALT;
00340                 OldTAS = TAS;
00341                 OldCAP = CAP;
00342                 OldTEMPRE = TEMPRE;
00343                 
00344                 ET_AutoMat_Xbee_Tx = ET_01; 
00345                 ET_AutoMat_DataLog = ET_01;                  
00346                 AutoMat_DataLog();
00347                 AutoMat_Xbee_Tx();       
00348     
00349                 Flag_Timer = 0x00;
00350                 break;
00351                                 
00352          default: break;    
00353         }// fin switch 
00354       } 
00355       _Ticker5ms.detach(); 
00356       _ComGPS.attach(NULL,Serial::RxIrq);
00357       LedXbee = 0;
00358       LedGPS  = 0;      
00359       LedLog  = 1;
00360       fclose(Fs_Log);
00361       wait(1);
00362       LedLog  = 0;       
00363       while(1){
00364         LedError=!LedError;
00365         wait(0.5);
00366       }   
00367 //----------------
00368 LabError:    
00369     LedError=1;
00370 //----------------
00371 
00372 }