Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

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