Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Revision:
23:2e914b705b99
Parent:
22:9f5955f051f5
Child:
24:099df3fa2b13
diff -r 9f5955f051f5 -r 2e914b705b99 main.cpp
--- 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);        
+}