Bmag incl gps rettelse
Dependencies: mbed WDT MODSERIAL BME280
Diff: main.cpp
- Revision:
- 23:2e914b705b99
- Parent:
- 22:9f5955f051f5
- Child:
- 24:099df3fa2b13
--- a/main.cpp Mon May 15 12:46:50 2017 +0000 +++ b/main.cpp Tue May 16 09:33:12 2017 +0000 @@ -12,19 +12,41 @@ //change BARCODE string inside double quotes to barcode of BMAG equipment char BARCODE[6] = "06655"; +//pointerstruct + +struct VarPtrStruct{ + + EA_OLED * displayPtr; + ErrorHandler * ehPtr; + Timer * clockPtr; + DigitalIn * pushButtonPtr; + + bool * GPS_Override_ActivePtr; + bool * gpsStringsReceivedPtr; + char * gpsOverridePushButtonCounterPtr; + int * GpsCntWithoutMagDataPtr; + + + bool * magStringsReceivedPtr; + int * magCntWithoutGpsDataPtr; + +}; //Global GPS variables bool GPS_Data_Rdy = false; bool GPS_Data_Valid = false; +bool GPS_Override_Active = false; bool GGA_Fix_Present = false; bool firstLineWritten = false; bool fileNameUpdated = false; bool lastErrStatus = true; bool firstErrsWritten = false; +bool gpsStringsReceived = false; char tmpGpsRxString[128]; int missingGpsCnt = 0; int GpsCntWithoutMagData = 0; int magCntWithoutGpsData = 0; +char gpsOverridePushButtonCounter = 0; string INTERPRETERID = ""; char interpreterTmpID[10]; @@ -35,9 +57,11 @@ int togglecount = 0; + //global BMAG variables bool BMAG_Data_Rdy = false; bool magTimeSetManually = false; +bool magStringsReceived = false; char tmpBMAGRxString[128]; char magnTarr[15]; int magTimePromptCount = 0; @@ -51,12 +75,19 @@ //Write to file prototype bool writeToUsb(string line, FILE * f); +//clock/watch verification func prototype +void watch_ver_func(VarPtrStruct * varPtrs); + +//Display update function prototype +void display_update_func(VarPtrStruct * varPtrs); + + int main(void){ //initializing watchdog, timeout 10 seconds Watchdog wd; wd.init(10.0); - + //Led outputs DigitalOut redLed(p24); DigitalOut greenLed(p23); @@ -132,7 +163,7 @@ int barcodeint = atoi(BARCODE); memset(interpreterTmpID,'\0',10); sprintf(interpreterTmpID,"%4x", barcodeint); - INTERPRETERID.assign(interpreterTmpID); + INTERPRETERID.assign(interpreterTmpID); //Init Done! display.clear_display(); @@ -140,6 +171,36 @@ //Init errorhandler ErrorHandler dispTxtHandler(&batteryvoltage, &GGA_Fix_Present, &magParser, &gpsNMEA); + + //initializing timer / clock, clock check interrupt, and start clock + Timer clock; + clock.start(); + + //creating threads + Thread watch_verification_thread; + Thread display_update_thread; + + //Generating pointer structure and init thereof + VarPtrStruct pointerStruct; + + pointerStruct.displayPtr = &display; + pointerStruct.ehPtr = &dispTxtHandler; + pointerStruct.clockPtr = &clock; + pointerStruct.pushButtonPtr = &timeSetManuallyButton; + pointerStruct.GPS_Override_ActivePtr = &GPS_Override_Active; + pointerStruct.gpsStringsReceivedPtr = &gpsStringsReceived; + pointerStruct.gpsOverridePushButtonCounterPtr = &gpsOverridePushButtonCounter; + pointerStruct.GpsCntWithoutMagDataPtr = &GpsCntWithoutMagData; + pointerStruct.magStringsReceivedPtr = &magStringsReceived; + pointerStruct.magCntWithoutGpsDataPtr = &magCntWithoutGpsData; + + //initiating threads with callbacks and setting priorities + watch_verification_thread.start(callback(watch_ver_func, &pointerStruct)); + watch_verification_thread.set_priority(osPriorityBelowNormal); + + display_update_thread.start(callback(display_update_func, &pointerStruct)); + display_update_thread.set_priority(osPriorityLow); + //infinite loop running after initialization while(run) { @@ -164,13 +225,26 @@ //if bmag data string is available if(BMAG_Data_Rdy) { + //change magStrinsReceived flag to true when mag data is available + if(magStringsReceived == false){ + magStringsReceived = true; + } + + //if gps override is active reset magCntWithoutGpsData + if(GPS_Override_Active){ + magCntWithoutGpsData = 0; + } + + dbg.printf("GGA_Fix_Present val: %d\r\n", GGA_Fix_Present); - //if mag data is present but gps data is not - if(magCntWithoutGpsData < 100) { + //if mag data is present but gps data is not and gps override is not active + if(magCntWithoutGpsData < 100 && !GPS_Override_Active) { magCntWithoutGpsData += 1; } + + bmag.move(tmpBMAGRxString, bmag.rxBufferGetCount()); //copy c_string to string @@ -312,8 +386,8 @@ } //show message on display - display.clear_display(); - display.write_lines(dispTxtHandler.getLine1(), dispTxtHandler.getLine2()); + //display.clear_display(); + //display.write_lines(dispTxtHandler.getLine1(), dispTxtHandler.getLine2()); BMAG_Data_Rdy = false; } @@ -321,6 +395,10 @@ if(GPS_Data_Rdy){ + if(gpsStringsReceived == false){ + gpsStringsReceived = true; + } + //clear mag data string counter, counting mag data received since last gps string received magCntWithoutGpsData = 0; @@ -480,3 +558,36 @@ return true; } +//clock/watch verification func +void watch_ver_func(VarPtrStruct * varPtrs){ + + float timer_val = varPtrs->clockPtr->read(); + + + //If timer is above 30 seconds, and no data has been received from gps yet, + //the error state gets changed to prompt the user to override gps usage, and set time manually on mag + if((timer_val > 30) && (*(varPtrs->gpsStringsReceivedPtr) == false)){ + varPtrs->ehPtr->setErrorState(GPS_OVERRIDE_NEEDED); + + //if pushbutton is pressed increment gps override counter + if(*(varPtrs->pushButtonPtr) == 0){ + *(varPtrs->gpsOverridePushButtonCounterPtr) += 1; + } + + if(*(varPtrs->gpsOverridePushButtonCounterPtr) > 3){ + *(varPtrs->GPS_Override_ActivePtr) = true; + } + + } + + + wait(5); + +} + +//Display update function +void display_update_func(VarPtrStruct * varPtrs){ + varPtrs->displayPtr->clear_display(); + varPtrs->displayPtr->write_lines(varPtrs->ehPtr->getLine1(), varPtrs->ehPtr->getLine2()); + wait(1); +}