Bmag incl gps rettelse
Dependencies: mbed WDT MODSERIAL BME280
Diff: main.cpp
- Branch:
- MbedBMAGThrRev
- Revision:
- 28:ed0d29f63b55
- Parent:
- 27:efd122db8855
- Child:
- 30:072e918663b8
--- a/main.cpp Wed Aug 23 13:22:54 2017 +0000 +++ b/main.cpp Thu Aug 31 09:27:37 2017 +0000 @@ -42,7 +42,6 @@ ErrorState presentState = NONE; - //global BMAG variables bool BMAG_Data_Rdy = false; bool magTimeSetManually = false; @@ -51,8 +50,24 @@ char magnTarr[15]; int magTimePromptCount = 0; int timeSetManuallyCount = 0; +char tmpTimeDiff[10]; +char tmpChar1[5]; +char tmpChar2[5]; +int timeDiffInt = 0; +int timeDiffStrLen = 0; +//PTH vars +void getPthValues(); +bool PTHValuesReadyFlag = false; +bool PTHSensorActive = false; +float PTH_Preassure = 0; +float PTH_Temperature = 0; +float PTH_Humidity = 0; +char PreassureArr[10] = ""; +char TemperatureArr[10] = ""; +char HumidityArr[10] = ""; + //batteryvoltage char batteryvoltagearr[5]; string batteryvoltage; @@ -72,6 +87,15 @@ int main(void){ + //init pth char arrays + memset(PreassureArr,'\0',10); + memset(TemperatureArr,'\0',10); + memset(HumidityArr,'\0',10); + + //Timer + Timer t; + t.start(); + EA_OLED(); //initializing watchdog, timeout 10 seconds @@ -113,17 +137,30 @@ //debug comm setup dbg.baud(115200); dbg.printf("Init...\r\n"); + + //bme pth sensor init + if(!BME.init(BME280_i2c, 0x77)){ + dbg.printf("BME280 init failed!\r\n"); + + } + if(!BME.start()){ + dbg.printf("BME280 start failed!\r\n"); + } + if(BME.is_ok()){ + PTHSensorActive = true; + } + //setting up USB device USBHostMSD msd("usb"); + clear_display_waiting(); + //USB message l1 = "Mounting"; l2 = "USB pen"; thr_writelines.start(write_lines); - wait_ms(1000); - thr_writelines.terminate(); - + wait_ms(1000); while(!msd.connect()){ dbg.printf("Trying to connect to usb flash disk\r\n"); @@ -141,6 +178,8 @@ gps.baud(9600); gps.attach(&rxCallback, MODSERIAL::RxIrq); + clear_display_waiting(); + //GPS message l1 = "GPS"; l2 = "Startup"; @@ -181,22 +220,23 @@ Ticker stateTicker; stateTicker.attach(&setCheckStateFlag, 1.0); + //BME280 pth ticker + Ticker PTHTicker; + PTHTicker.attach(&getPthValues, 11.0); + //infinite loop running after initialization while(run) { //display txt on disp if(dispFlag){ - //terminate last disp writing thread - thr_writelines.terminate(); //get state to be displayed presentState = dispTxtHandler.getErrorState(); //ensure that display is only cleared if the state to be displayed has changed. //this ensures that a minimum time duration is used to clear the display. if(presentState != prevState){ - thr_writelines.start(write_lines); - thr_writelines.set_priority(osPriorityLow); + thr_writelines.start(clear_display); } //update display text @@ -205,7 +245,6 @@ if(prevState == presentState){ thr_writelines.start(write_lines); - thr_writelines.set_priority(osPriorityLow); } //Ensure that next check will have the current state as previous state, as expected. @@ -340,7 +379,94 @@ //if bmag data string is available if(BMAG_Data_Rdy) { + memset(tmpTimeDiff,'\0',10); + tmpTimeDiff[0] = '0'; + tmpTimeDiff[1] = '0'; + tmpTimeDiff[2] = '0'; + + timeDiffInt = t.read_ms(); + t.reset(); + snprintf(tmpTimeDiff, 10, "%d", timeDiffInt); + + timeDiffStrLen = strlen(tmpTimeDiff); + + + //ensure correct timestamp + if(tmpTimeDiff[timeDiffStrLen-4] == '1'){ + memset(tmpChar1, '\0', 5); + memset(tmpChar2, '\0', 5); + + tmpChar1[0] = gpsNMEA.currentUTCFromGPRMC[6]; + tmpChar1[1] = gpsNMEA.currentUTCFromGPRMC[7]; + + snprintf(tmpChar2, 5, "%d", ((atoi(tmpChar1) + 1))); + + if(atoi(tmpChar2)%60 != 0){ + + if(strlen(tmpChar2) == 1){ + gpsNMEA.currentUTCFromGPRMC[6] = '0'; + gpsNMEA.currentUTCFromGPRMC[7] = tmpChar2[0]; + } + + + if(strlen(tmpChar2) == 2){ + gpsNMEA.currentUTCFromGPRMC[6] = tmpChar2[0]; + gpsNMEA.currentUTCFromGPRMC[7] = tmpChar2[1]; + } + } + + if(atoi(tmpChar2)%60 == 0){ + gpsNMEA.currentUTCFromGPRMC[6] = '0'; + gpsNMEA.currentUTCFromGPRMC[7] = '0'; + + tmpChar1[0] = gpsNMEA.currentUTCFromGPRMC[3]; + tmpChar1[1] = gpsNMEA.currentUTCFromGPRMC[4]; + + snprintf(tmpChar2, 5, "%d", ((atoi(tmpChar1) + 1))); + + if(atoi(tmpChar2)%60 != 0){ + + if(strlen(tmpChar2) == 1){ + gpsNMEA.currentUTCFromGPRMC[3] = '0'; + gpsNMEA.currentUTCFromGPRMC[4] = tmpChar2[0]; + } + + if(strlen(tmpChar2) == 2){ + gpsNMEA.currentUTCFromGPRMC[3] = tmpChar2[0]; + gpsNMEA.currentUTCFromGPRMC[4] = tmpChar2[1]; + } + } + + if(atoi(tmpChar2)%60 == 0){ + gpsNMEA.currentUTCFromGPRMC[3] = '0'; + gpsNMEA.currentUTCFromGPRMC[4] = '0'; + + tmpChar1[0] = gpsNMEA.currentUTCFromGPRMC[0]; + tmpChar1[1] = gpsNMEA.currentUTCFromGPRMC[1]; + + snprintf(tmpChar2, 5, "%d", ((atoi(tmpChar1) + 1))); + + if(strlen(tmpChar2) == 1){ + gpsNMEA.currentUTCFromGPRMC[0] = '0'; + gpsNMEA.currentUTCFromGPRMC[1] = tmpChar2[0]; + } + + if(strlen(tmpChar2) == 2){ + gpsNMEA.currentUTCFromGPRMC[0] = tmpChar2[0]; + gpsNMEA.currentUTCFromGPRMC[1] = tmpChar2[1]; + } + + } + + } + + + } + gpsNMEA.currentUTCFromGPRMC[9] = tmpTimeDiff[timeDiffStrLen-3]; + gpsNMEA.currentUTCFromGPRMC[10] = tmpTimeDiff[timeDiffStrLen-2]; + gpsNMEA.currentUTCFromGPRMC[11] = tmpTimeDiff[timeDiffStrLen-1]; + //change magStringsReceived flag to true when mag data is available if(magStringsReceived == false){ magStringsReceived = true; @@ -400,7 +526,7 @@ batteryvoltage.assign(batteryvoltagearr); //generate default sps string - spsGen.UpdateCurrentString(TAG, IDENTIFIERID, GROUP, gpsNMEA.currentDATEFromGPRMC, gpsNMEA.currentUTCFromGPRMC, TIMEZONE, ENCODING, SOURCEIDENTIFICATION, INTERPRETERID, DATALINEVERSION, FWSRCVERSION, FWIVERSION, BARCODE,gpsNMEA.currentLatitude, gpsNMEA.currentLongitude, GGA_Fix_Present, batteryvoltage, magParser.getMagTimeStr(), magParser.getMagNTStr(), magParser.getMagSq(), &dbg); + spsGen.UpdateCurrentString(TAG, IDENTIFIERID, GROUP, gpsNMEA.currentDATEFromGPRMC, gpsNMEA.currentUTCFromGPRMC, TIMEZONE, ENCODING, SOURCEIDENTIFICATION, INTERPRETERID, DATALINEVERSION, FWSRCVERSION, FWIVERSION, BARCODE,gpsNMEA.currentLatitude, gpsNMEA.currentLongitude, GGA_Fix_Present, batteryvoltage, PreassureArr, TemperatureArr, HumidityArr, magParser.getMagTimeStr(), magParser.getMagNTStr(), magParser.getMagSq(), &dbg); //write data strings to sps file if(GGA_Fix_Present) { @@ -459,7 +585,8 @@ } } - + + BMAG_Data_Rdy = false; } @@ -523,7 +650,28 @@ GPS_Data_Rdy = false; } - + + //if pth data is due, convert pth values to char arrays + if(PTHValuesReadyFlag){ + //dbg.printf("P = %.0fhPA, T = %.0fdegC, H = %.0fpct\r\n",PTH_Preassure, PTH_Temperature, PTH_Humidity); + PTHValuesReadyFlag = false; + memset(PreassureArr,'\0',10); + memset(TemperatureArr,'\0',10); + memset(HumidityArr,'\0',10); + snprintf(PreassureArr, 10, "%.0f", PTH_Preassure); + snprintf(TemperatureArr, 10, "%.0f", PTH_Temperature); + snprintf(HumidityArr, 10, "%.0f", PTH_Humidity); + } + + //If the pth sensor is inactive write NaN in the data columns normally containing PTH values + if(!PTHSensorActive){ + memset(PreassureArr,'\0',10); + memset(TemperatureArr,'\0',10); + memset(HumidityArr,'\0',10); + snprintf(PreassureArr, 10, "NaN", PTH_Preassure); + snprintf(TemperatureArr, 10, "NaN", PTH_Temperature); + snprintf(HumidityArr, 10, "NaN", PTH_Humidity); + } //If connection to USB flash disk is lost, reconnect to the flash disk if(!msd.connected()){ @@ -554,7 +702,8 @@ //kick / feed watchdog wd.kick(); - + + Thread::yield(); } return 0; @@ -602,3 +751,10 @@ return true; } + + +void getPthValues(){ + if(BME.get(PTH_Temperature, PTH_Preassure, PTH_Humidity)){ + PTHValuesReadyFlag = true; + } +};