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