Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
MAA
Date:
Wed Sep 27 06:57:20 2017 +0000
Branch:
MbedBMAGThrRev
Revision:
37:fdd60dde174a
Parent:
36:4d7a41f97ff5
Child:
38:a1615de4ee64
added missing char arrays for temp data at time resync

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MAA 0:b3313c5ffca3 1 #include "main.h"
MAA 0:b3313c5ffca3 2
MAA 14:400ecb93c6a2 3 //please note that mbed library should be of revision 137 or before.
MAA 14:400ecb93c6a2 4
MAA 9:ddc774114729 5 //change GPSACQTIMELIMITINSECONDS to change the duration in seconds, allowed for the gps to get gps fix.
MAA 9:ddc774114729 6 //After this duration, an error indication will occur if fix is not present.
MAA 22:9f5955f051f5 7 #define GPSACQTIMELIMITINSECONDS 120
MAA 8:d6287c33b54a 8
MAA 13:45b333983206 9 //to change battery low indication change this value
MAA 13:45b333983206 10 #define BATTERYLOWLIMIT 10.5
MAA 13:45b333983206 11
MAA 8:d6287c33b54a 12 //change BARCODE string inside double quotes to barcode of BMAG equipment
MAA 36:4d7a41f97ff5 13 char BARCODE[6] = "11915";
MAA 8:d6287c33b54a 14
MAA 0:b3313c5ffca3 15 //Global GPS variables
MAA 34:c6c5e7ec9163 16 Timer t;
MAA 34:c6c5e7ec9163 17 char time_buffer[32];
MAA 34:c6c5e7ec9163 18 bool RTC_set = false;
MAA 0:b3313c5ffca3 19 bool GPS_Data_Rdy = false;
MAA 0:b3313c5ffca3 20 bool GPS_Data_Valid = false;
MAA 23:2e914b705b99 21 bool GPS_Override_Active = false;
MAA 0:b3313c5ffca3 22 bool GGA_Fix_Present = false;
MAA 5:11782a2008c2 23 bool firstLineWritten = false;
MAA 6:6d1683c8b26b 24 bool fileNameUpdated = false;
MAA 7:872984a67d5b 25 bool lastErrStatus = true;
MAA 7:872984a67d5b 26 bool firstErrsWritten = false;
MAA 23:2e914b705b99 27 bool gpsStringsReceived = false;
MAA 8:d6287c33b54a 28 char tmpGpsRxString[128];
MAA 34:c6c5e7ec9163 29 char timer_ms[5];
MAA 34:c6c5e7ec9163 30 int secCount = 0;
MAA 8:d6287c33b54a 31 int missingGpsCnt = 0;
MAA 8:d6287c33b54a 32 int GpsCntWithoutMagData = 0;
MAA 10:eb026e023a3c 33 int magCntWithoutGpsData = 0;
MAA 24:099df3fa2b13 34 char missingGpsConnectionCounter = 0;
MAA 23:2e914b705b99 35 char gpsOverridePushButtonCounter = 0;
MAA 7:872984a67d5b 36
MAA 8:d6287c33b54a 37 string INTERPRETERID = "";
MAA 8:d6287c33b54a 38 char interpreterTmpID[10];
MAA 8:d6287c33b54a 39
MAA 6:6d1683c8b26b 40 //global system variables
MAA 32:a8d74b3c9d6f 41 bool gpsRunning = false;
MAA 32:a8d74b3c9d6f 42 bool gpsCheckedAfter10Sec = false;
MAA 0:b3313c5ffca3 43 bool run = true;
MAA 8:d6287c33b54a 44 bool toggler = true;
MAA 24:099df3fa2b13 45 bool dispFlag = false;
MAA 24:099df3fa2b13 46 bool checkStateFlag = false;
MAA 8:d6287c33b54a 47 int togglecount = 0;
MAA 24:099df3fa2b13 48 ErrorState prevState = NONE;
MAA 24:099df3fa2b13 49 ErrorState presentState = NONE;
MAA 21:325cb82f1838 50
MAA 0:b3313c5ffca3 51
MAA 8:d6287c33b54a 52 //global BMAG variables
MAA 33:a7f044b3e057 53 string lastUTCTimestamp;
MAA 8:d6287c33b54a 54 bool BMAG_Data_Rdy = false;
MAA 10:eb026e023a3c 55 bool magTimeSetManually = false;
MAA 23:2e914b705b99 56 bool magStringsReceived = false;
MAA 8:d6287c33b54a 57 char tmpBMAGRxString[128];
MAA 8:d6287c33b54a 58 char magnTarr[15];
MAA 10:eb026e023a3c 59 int magTimePromptCount = 0;
MAA 10:eb026e023a3c 60 int timeSetManuallyCount = 0;
MAA 34:c6c5e7ec9163 61 int tmpTime = 0;
MAA 28:ed0d29f63b55 62 char tmpChar1[5];
MAA 28:ed0d29f63b55 63 char tmpChar2[5];
MAA 34:c6c5e7ec9163 64 int lastGPRMC_CNT = 0;
MAA 28:ed0d29f63b55 65 int timeDiffInt = 0;
MAA 28:ed0d29f63b55 66 int timeDiffStrLen = 0;
MAA 8:d6287c33b54a 67
MAA 28:ed0d29f63b55 68 //PTH vars
MAA 28:ed0d29f63b55 69 void getPthValues();
MAA 28:ed0d29f63b55 70 bool PTHValuesReadyFlag = false;
MAA 28:ed0d29f63b55 71 bool PTHSensorActive = false;
MAA 28:ed0d29f63b55 72 float PTH_Preassure = 0;
MAA 28:ed0d29f63b55 73 float PTH_Temperature = 0;
MAA 28:ed0d29f63b55 74 float PTH_Humidity = 0;
MAA 28:ed0d29f63b55 75 char PreassureArr[10] = "";
MAA 28:ed0d29f63b55 76 char TemperatureArr[10] = "";
MAA 28:ed0d29f63b55 77 char HumidityArr[10] = "";
MAA 28:ed0d29f63b55 78
MAA 8:d6287c33b54a 79 //batteryvoltage
MAA 8:d6287c33b54a 80 char batteryvoltagearr[5];
MAA 8:d6287c33b54a 81 string batteryvoltage;
MAA 0:b3313c5ffca3 82
MAA 34:c6c5e7ec9163 83 //time
MAA 34:c6c5e7ec9163 84 time_t t_of_day;
MAA 34:c6c5e7ec9163 85
MAA 5:11782a2008c2 86 //Write to file prototype
MAA 6:6d1683c8b26b 87 bool writeToUsb(string line, FILE * f);
MAA 5:11782a2008c2 88
MAA 32:a8d74b3c9d6f 89 //Gps available check prototype
MAA 32:a8d74b3c9d6f 90 void gpsAvailCheck(void);
MAA 32:a8d74b3c9d6f 91
MAA 34:c6c5e7ec9163 92
MAA 34:c6c5e7ec9163 93 //epoch time conversion
MAA 34:c6c5e7ec9163 94 time_t setMbedTime(string GPRMCDate, string GPRMCUtc, Serial * debug){
MAA 34:c6c5e7ec9163 95
MAA 34:c6c5e7ec9163 96 char tmpYear[6];
MAA 34:c6c5e7ec9163 97 char tmpMonth[5];
MAA 34:c6c5e7ec9163 98 char tmpDay[5];
MAA 34:c6c5e7ec9163 99 char tmpHour[5];
MAA 34:c6c5e7ec9163 100 char tmpMinute[5];
MAA 34:c6c5e7ec9163 101 char tmpSecond[5];
MAA 34:c6c5e7ec9163 102
MAA 34:c6c5e7ec9163 103 struct tm str_time;
MAA 34:c6c5e7ec9163 104
MAA 34:c6c5e7ec9163 105 memset(tmpYear,'\0',6);
MAA 34:c6c5e7ec9163 106 memset(tmpMonth,'\0',5);
MAA 34:c6c5e7ec9163 107 memset(tmpDay,'\0',5);
MAA 34:c6c5e7ec9163 108 memset(tmpHour,'\0',5);
MAA 34:c6c5e7ec9163 109 memset(tmpMinute,'\0',5);
MAA 34:c6c5e7ec9163 110 memset(tmpSecond,'\0',5);
MAA 34:c6c5e7ec9163 111
MAA 34:c6c5e7ec9163 112 snprintf(tmpYear, 6, "%s", GPRMCDate.substr(0, 4));
MAA 34:c6c5e7ec9163 113 snprintf(tmpMonth, 5, "%s", GPRMCDate.substr(5, 2));
MAA 34:c6c5e7ec9163 114 snprintf(tmpDay, 5, "%s", GPRMCDate.substr(8, 2));
MAA 34:c6c5e7ec9163 115
MAA 34:c6c5e7ec9163 116 snprintf(tmpHour, 5, "%s", GPRMCUtc.substr(0, 2));
MAA 34:c6c5e7ec9163 117 snprintf(tmpMinute, 5, "%s", GPRMCUtc.substr(3, 2));
MAA 34:c6c5e7ec9163 118 snprintf(tmpSecond, 5, "%s", GPRMCUtc.substr(6, 2));
MAA 34:c6c5e7ec9163 119
MAA 34:c6c5e7ec9163 120 str_time.tm_year = atoi(tmpYear) - 1900;
MAA 34:c6c5e7ec9163 121 str_time.tm_mon = atoi(tmpMonth) - 1; // Month, 0 - jan
MAA 34:c6c5e7ec9163 122 str_time.tm_mday = atoi(tmpDay); // Day of the month
MAA 34:c6c5e7ec9163 123 str_time.tm_hour = atoi(tmpHour);
MAA 34:c6c5e7ec9163 124 str_time.tm_min = atoi(tmpMinute);
MAA 34:c6c5e7ec9163 125 str_time.tm_sec = atoi(tmpSecond)+2;
MAA 34:c6c5e7ec9163 126 str_time.tm_isdst = 0; // Is DST on? 1 = yes, 0 = no, -1 = unknown
MAA 34:c6c5e7ec9163 127 t_of_day = mktime(&str_time);
MAA 34:c6c5e7ec9163 128
MAA 34:c6c5e7ec9163 129 debug->printf("-------------------------------\r\n");
MAA 34:c6c5e7ec9163 130 debug->printf("Setting time as seen below:\r\n");
MAA 34:c6c5e7ec9163 131 debug->printf("Year: %s\r\n", tmpYear);
MAA 34:c6c5e7ec9163 132 debug->printf("Month: %s\r\n", tmpMonth);
MAA 34:c6c5e7ec9163 133 debug->printf("Day: %s\r\n", tmpDay);
MAA 34:c6c5e7ec9163 134 debug->printf("Hour: %s\r\n", tmpHour);
MAA 34:c6c5e7ec9163 135 debug->printf("Minute: %s\r\n", tmpMinute);
MAA 34:c6c5e7ec9163 136 debug->printf("Second: %s\r\n", tmpSecond);
MAA 34:c6c5e7ec9163 137 debug->printf("-------------------------------\r\n");
MAA 34:c6c5e7ec9163 138 debug->printf("time since epoch in seconds:");
MAA 34:c6c5e7ec9163 139 debug->printf("%d", (unsigned long)t_of_day);
MAA 34:c6c5e7ec9163 140 debug->printf("\r\n");
MAA 34:c6c5e7ec9163 141 debug->printf("-------------------------------\r\n");
MAA 34:c6c5e7ec9163 142
MAA 34:c6c5e7ec9163 143 set_time((unsigned long)t_of_day);
MAA 34:c6c5e7ec9163 144
MAA 34:c6c5e7ec9163 145 RTC_set = true;
MAA 34:c6c5e7ec9163 146
MAA 34:c6c5e7ec9163 147
MAA 34:c6c5e7ec9163 148 return t_of_day;
MAA 34:c6c5e7ec9163 149 }
MAA 34:c6c5e7ec9163 150
MAA 34:c6c5e7ec9163 151
MAA 24:099df3fa2b13 152 //dispflag func
MAA 24:099df3fa2b13 153 void setDispFlag(void){
MAA 24:099df3fa2b13 154 dispFlag = true;
MAA 24:099df3fa2b13 155 }
MAA 23:2e914b705b99 156
MAA 24:099df3fa2b13 157 //set check state flag func
MAA 24:099df3fa2b13 158 void setCheckStateFlag(void){
MAA 24:099df3fa2b13 159 checkStateFlag = true;
MAA 24:099df3fa2b13 160 }
MAA 23:2e914b705b99 161
MAA 35:ccc79f4147f2 162 //timer reset // clock update
MAA 34:c6c5e7ec9163 163 void resetTimer(void){
MAA 35:ccc79f4147f2 164 t.reset();
MAA 35:ccc79f4147f2 165 clk.pps_Tick();
MAA 34:c6c5e7ec9163 166 }
MAA 34:c6c5e7ec9163 167
MAA 0:b3313c5ffca3 168 int main(void){
MAA 28:ed0d29f63b55 169 //init pth char arrays
MAA 28:ed0d29f63b55 170 memset(PreassureArr,'\0',10);
MAA 28:ed0d29f63b55 171 memset(TemperatureArr,'\0',10);
MAA 28:ed0d29f63b55 172 memset(HumidityArr,'\0',10);
MAA 34:c6c5e7ec9163 173 memset(timer_ms,'\0',5);
MAA 34:c6c5e7ec9163 174 memset(time_buffer,'\0',32);
MAA 28:ed0d29f63b55 175
MAA 28:ed0d29f63b55 176 t.start();
MAA 28:ed0d29f63b55 177
MAA 27:efd122db8855 178 EA_OLED();
MAA 27:efd122db8855 179
MAA 30:072e918663b8 180 //initializing watchdog, timeout 5 seconds
MAA 6:6d1683c8b26b 181 Watchdog wd;
MAA 30:072e918663b8 182 wd.init(5.0);
MAA 34:c6c5e7ec9163 183
MAA 34:c6c5e7ec9163 184 //PPS
MAA 34:c6c5e7ec9163 185 InterruptIn PPS(p12);
MAA 34:c6c5e7ec9163 186 PPS.rise(&resetTimer);
MAA 23:2e914b705b99 187
MAA 8:d6287c33b54a 188 //Led outputs
MAA 36:4d7a41f97ff5 189 DigitalOut redLed(p25);
MAA 8:d6287c33b54a 190 DigitalOut greenLed(p23);
MAA 8:d6287c33b54a 191
MAA 10:eb026e023a3c 192 //MagTime manually set by user input
MAA 10:eb026e023a3c 193 DigitalIn timeSetManuallyButton(p30);
MAA 10:eb026e023a3c 194 timeSetManuallyButton.mode(PullUp);
MAA 10:eb026e023a3c 195
MAA 8:d6287c33b54a 196 redLed = 0;
MAA 11:d3d26d0e71ea 197 greenLed = 0;
MAA 8:d6287c33b54a 198
MAA 30:072e918663b8 199 //init of battery string
MAA 8:d6287c33b54a 200 memset(batteryvoltagearr,'\0',5);
MAA 8:d6287c33b54a 201 batteryvoltage = "";
MAA 8:d6287c33b54a 202
MAA 8:d6287c33b54a 203 //Analog battery reading
MAA 8:d6287c33b54a 204 AnalogIn battery(A5);
MAA 8:d6287c33b54a 205
MAA 4:c70ef089a3fd 206 string currentFilename, nextFilename;
MAA 4:c70ef089a3fd 207
MAA 5:11782a2008c2 208 currentFilename = "/usb/tempFile.sps";
MAA 5:11782a2008c2 209
MAA 0:b3313c5ffca3 210 //Initializing string buffer for GPS data
MAA 0:b3313c5ffca3 211 string GPS_String_Buff;
MAA 0:b3313c5ffca3 212 GPS_String_Buff.resize(128);
MAA 0:b3313c5ffca3 213 memset(tmpGpsRxString,'\0',128);
MAA 0:b3313c5ffca3 214
MAA 8:d6287c33b54a 215 //Initializing string buffer for BMAG data
MAA 8:d6287c33b54a 216 string BMAG_String_Buff;
MAA 8:d6287c33b54a 217 BMAG_String_Buff.resize(128);
MAA 8:d6287c33b54a 218 memset(tmpBMAGRxString,'\0',128);
MAA 8:d6287c33b54a 219
MAA 2:39c4a85dc2a4 220 //debug comm setup
MAA 0:b3313c5ffca3 221 dbg.baud(115200);
MAA 6:6d1683c8b26b 222 dbg.printf("Init...\r\n");
MAA 28:ed0d29f63b55 223
MAA 28:ed0d29f63b55 224 //bme pth sensor init
MAA 28:ed0d29f63b55 225 if(!BME.init(BME280_i2c, 0x77)){
MAA 28:ed0d29f63b55 226 dbg.printf("BME280 init failed!\r\n");
MAA 28:ed0d29f63b55 227
MAA 28:ed0d29f63b55 228 }
MAA 28:ed0d29f63b55 229 if(!BME.start()){
MAA 28:ed0d29f63b55 230 dbg.printf("BME280 start failed!\r\n");
MAA 28:ed0d29f63b55 231 }
MAA 0:b3313c5ffca3 232
MAA 28:ed0d29f63b55 233 if(BME.is_ok()){
MAA 28:ed0d29f63b55 234 PTHSensorActive = true;
MAA 28:ed0d29f63b55 235 }
MAA 28:ed0d29f63b55 236
MAA 0:b3313c5ffca3 237 //setting up USB device
MAA 0:b3313c5ffca3 238 USBHostMSD msd("usb");
MAA 0:b3313c5ffca3 239
MAA 28:ed0d29f63b55 240 clear_display_waiting();
MAA 28:ed0d29f63b55 241
MAA 9:ddc774114729 242 //USB message
MAA 27:efd122db8855 243 l1 = "Mounting";
MAA 27:efd122db8855 244 l2 = "USB pen";
MAA 27:efd122db8855 245 thr_writelines.start(write_lines);
MAA 28:ed0d29f63b55 246 wait_ms(1000);
MAA 10:eb026e023a3c 247
MAA 0:b3313c5ffca3 248 while(!msd.connect()){
MAA 0:b3313c5ffca3 249 dbg.printf("Trying to connect to usb flash disk\r\n");
MAA 6:6d1683c8b26b 250 wait_ms(500);
MAA 0:b3313c5ffca3 251 }
MAA 0:b3313c5ffca3 252
MAA 0:b3313c5ffca3 253 //Opening a file on usb disk
MAA 34:c6c5e7ec9163 254 FILE * fp;
MAA 34:c6c5e7ec9163 255 fp = fopen(currentFilename.c_str(), "a");
MAA 4:c70ef089a3fd 256 wait_ms(100);
MAA 0:b3313c5ffca3 257
MAA 2:39c4a85dc2a4 258 //initializing SPS generation
MAA 2:39c4a85dc2a4 259 SPS spsGen;
MAA 6:6d1683c8b26b 260
MAA 6:6d1683c8b26b 261 //GPS communication init
MAA 6:6d1683c8b26b 262 gps.baud(9600);
MAA 6:6d1683c8b26b 263 gps.attach(&rxCallback, MODSERIAL::RxIrq);
MAA 32:a8d74b3c9d6f 264
MAA 28:ed0d29f63b55 265 clear_display_waiting();
MAA 28:ed0d29f63b55 266
MAA 27:efd122db8855 267 //GPS message
MAA 27:efd122db8855 268 l1 = "GPS";
MAA 27:efd122db8855 269 l2 = "Startup";
MAA 27:efd122db8855 270 thr_writelines.start(write_lines);
MAA 27:efd122db8855 271 wait_ms(1000);
MAA 10:eb026e023a3c 272
MAA 8:d6287c33b54a 273 //BMAG communication init
MAA 8:d6287c33b54a 274 bmag.baud(115200);
MAA 8:d6287c33b54a 275 bmag.attach(&bmagrxCallback, MODSERIAL::RxIrq);
MAA 8:d6287c33b54a 276
MAA 7:872984a67d5b 277 dbg.printf("Init.... Done!\r\n");
MAA 8:d6287c33b54a 278
MAA 8:d6287c33b54a 279 //init interpreterid
MAA 8:d6287c33b54a 280 int barcodeint = atoi(BARCODE);
MAA 8:d6287c33b54a 281 memset(interpreterTmpID,'\0',10);
MAA 8:d6287c33b54a 282 sprintf(interpreterTmpID,"%4x", barcodeint);
MAA 23:2e914b705b99 283 INTERPRETERID.assign(interpreterTmpID);
MAA 11:d3d26d0e71ea 284
MAA 11:d3d26d0e71ea 285 //Init Done!
MAA 27:efd122db8855 286 clear_display_waiting();
MAA 27:efd122db8855 287 l1 = "Init";
MAA 27:efd122db8855 288 l2 = "Done";
MAA 27:efd122db8855 289 thr_writelines.start(write_lines);
MAA 27:efd122db8855 290 wait_ms(1000);
MAA 11:d3d26d0e71ea 291
MAA 11:d3d26d0e71ea 292 //Init errorhandler
MAA 21:325cb82f1838 293 ErrorHandler dispTxtHandler(&batteryvoltage, &GGA_Fix_Present, &magParser, &gpsNMEA);
MAA 24:099df3fa2b13 294 dispTxtHandler.setErrorState(NONE);
MAA 23:2e914b705b99 295
MAA 24:099df3fa2b13 296 //init of display timer
MAA 24:099df3fa2b13 297 Ticker dispTicker;
MAA 27:efd122db8855 298 dispTicker.attach(&setDispFlag, 1.0);
MAA 23:2e914b705b99 299
MAA 24:099df3fa2b13 300 //init of state ticker
MAA 24:099df3fa2b13 301 Ticker stateTicker;
MAA 24:099df3fa2b13 302 stateTicker.attach(&setCheckStateFlag, 1.0);
MAA 23:2e914b705b99 303
MAA 28:ed0d29f63b55 304 //BME280 pth ticker
MAA 28:ed0d29f63b55 305 Ticker PTHTicker;
MAA 28:ed0d29f63b55 306 PTHTicker.attach(&getPthValues, 11.0);
MAA 28:ed0d29f63b55 307
MAA 32:a8d74b3c9d6f 308 //gps available ticker
MAA 32:a8d74b3c9d6f 309 Ticker gpsAvailableTicker;
MAA 32:a8d74b3c9d6f 310 gpsAvailableTicker.attach(gpsAvailCheck, 10.0);
MAA 32:a8d74b3c9d6f 311
MAA 30:072e918663b8 312 snprintf(PreassureArr, 10, "%s", "NaN");
MAA 30:072e918663b8 313 snprintf(TemperatureArr, 10, "%s", "NaN");
MAA 30:072e918663b8 314 snprintf(HumidityArr, 10, "%s", "NaN");
MAA 24:099df3fa2b13 315
MAA 5:11782a2008c2 316 //infinite loop running after initialization
MAA 0:b3313c5ffca3 317 while(run) {
MAA 0:b3313c5ffca3 318
MAA 24:099df3fa2b13 319 //display txt on disp
MAA 24:099df3fa2b13 320 if(dispFlag){
MAA 27:efd122db8855 321
MAA 24:099df3fa2b13 322 //get state to be displayed
MAA 24:099df3fa2b13 323 presentState = dispTxtHandler.getErrorState();
MAA 24:099df3fa2b13 324 //ensure that display is only cleared if the state to be displayed has changed.
MAA 24:099df3fa2b13 325 //this ensures that a minimum time duration is used to clear the display.
MAA 24:099df3fa2b13 326 if(presentState != prevState){
MAA 28:ed0d29f63b55 327 thr_writelines.start(clear_display);
MAA 24:099df3fa2b13 328 }
MAA 27:efd122db8855 329
MAA 27:efd122db8855 330 //update display text
MAA 27:efd122db8855 331 l1 = dispTxtHandler.getLine1();
MAA 27:efd122db8855 332 l2 = dispTxtHandler.getLine2();
MAA 27:efd122db8855 333
MAA 27:efd122db8855 334 if(prevState == presentState){
MAA 27:efd122db8855 335 thr_writelines.start(write_lines);
MAA 27:efd122db8855 336 }
MAA 27:efd122db8855 337
MAA 24:099df3fa2b13 338 //Ensure that next check will have the current state as previous state, as expected.
MAA 24:099df3fa2b13 339 prevState = presentState;
MAA 24:099df3fa2b13 340
MAA 24:099df3fa2b13 341 //clear display flag
MAA 24:099df3fa2b13 342 dispFlag = false;
MAA 24:099df3fa2b13 343 }
MAA 24:099df3fa2b13 344
MAA 24:099df3fa2b13 345 //check state / set state
MAA 24:099df3fa2b13 346 if(checkStateFlag){
MAA 24:099df3fa2b13 347
MAA 32:a8d74b3c9d6f 348 //inform of missing GPS
MAA 32:a8d74b3c9d6f 349 if(gpsCheckedAfter10Sec && !gpsRunning){
MAA 32:a8d74b3c9d6f 350 dispTxtHandler.setErrorState(NO_GPS);
MAA 32:a8d74b3c9d6f 351 }
MAA 32:a8d74b3c9d6f 352
MAA 32:a8d74b3c9d6f 353 if(gpsCheckedAfter10Sec && gpsRunning){
MAA 32:a8d74b3c9d6f 354 gpsAvailableTicker.attach(NULL, 10.0);
MAA 32:a8d74b3c9d6f 355
MAA 32:a8d74b3c9d6f 356 //bme pth sensor init
MAA 32:a8d74b3c9d6f 357 if(!BME.init(BME280_i2c, 0x77)){
MAA 32:a8d74b3c9d6f 358 dbg.printf("BME280 init failed!\r\n");
MAA 32:a8d74b3c9d6f 359
MAA 32:a8d74b3c9d6f 360 }
MAA 32:a8d74b3c9d6f 361 if(!BME.start()){
MAA 32:a8d74b3c9d6f 362 dbg.printf("BME280 start failed!\r\n");
MAA 32:a8d74b3c9d6f 363 }
MAA 32:a8d74b3c9d6f 364
MAA 32:a8d74b3c9d6f 365 if(BME.is_ok()){
MAA 32:a8d74b3c9d6f 366 PTHSensorActive = true;
MAA 32:a8d74b3c9d6f 367 }
MAA 32:a8d74b3c9d6f 368 }
MAA 32:a8d74b3c9d6f 369
MAA 24:099df3fa2b13 370 //missingGpsConnectionCounter gets cleared at every received gps string
MAA 26:68277a308839 371 if(!GPS_Override_Active && missingGpsConnectionCounter < 10){
MAA 24:099df3fa2b13 372
MAA 24:099df3fa2b13 373 missingGpsConnectionCounter += 1;
MAA 24:099df3fa2b13 374 }
MAA 24:099df3fa2b13 375
MAA 34:c6c5e7ec9163 376 if(gpsOverridePushButtonCounter > 1){
MAA 24:099df3fa2b13 377 GPS_Override_Active = true;
MAA 24:099df3fa2b13 378 }
MAA 24:099df3fa2b13 379
MAA 26:68277a308839 380
MAA 26:68277a308839 381 //pushbutton check gpsOverridePushButtonCounter
MAA 26:68277a308839 382 if(!timeSetManuallyButton){
MAA 26:68277a308839 383 gpsOverridePushButtonCounter += 1;
MAA 26:68277a308839 384 }
MAA 26:68277a308839 385
MAA 24:099df3fa2b13 386 if(missingGpsConnectionCounter > 30 && !GPS_Override_Active){
MAA 24:099df3fa2b13 387 dispTxtHandler.setErrorState(GPS_OVERRIDE_NEEDED);
MAA 24:099df3fa2b13 388
MAA 24:099df3fa2b13 389 redLed = 1;
MAA 24:099df3fa2b13 390 greenLed = 0;
MAA 24:099df3fa2b13 391
MAA 24:099df3fa2b13 392 }
MAA 24:099df3fa2b13 393
MAA 24:099df3fa2b13 394 if((toggler && magStringsReceived &&(missingGpsCnt < GPSACQTIMELIMITINSECONDS)) || (toggler && dispTxtHandler.getMagTimePromtStatus()) && magStringsReceived) {
MAA 24:099df3fa2b13 395 //show battery voltage and gps fix status for 10 seconds
MAA 24:099df3fa2b13 396 dispTxtHandler.setErrorState(DISPLAY_VBAT_FIX);
MAA 24:099df3fa2b13 397
MAA 24:099df3fa2b13 398 togglecount += 1;
MAA 24:099df3fa2b13 399 if(togglecount >= 10) {
MAA 24:099df3fa2b13 400 toggler = false;
MAA 24:099df3fa2b13 401 togglecount = 0;
MAA 24:099df3fa2b13 402 }
MAA 24:099df3fa2b13 403
MAA 24:099df3fa2b13 404 }
MAA 24:099df3fa2b13 405
MAA 24:099df3fa2b13 406 if((!toggler && (missingGpsCnt < GPSACQTIMELIMITINSECONDS) && magStringsReceived) || (!toggler && dispTxtHandler.getMagTimePromtStatus()) && magStringsReceived) {
MAA 24:099df3fa2b13 407 //show magnT reading for 10 seconds
MAA 24:099df3fa2b13 408 dispTxtHandler.setErrorState(DISPLAY_MAG_MEASUREMENT);
MAA 24:099df3fa2b13 409
MAA 24:099df3fa2b13 410 togglecount += 1;
MAA 24:099df3fa2b13 411 if(togglecount >= 10) {
MAA 24:099df3fa2b13 412 toggler = true;
MAA 24:099df3fa2b13 413 togglecount = 0;
MAA 24:099df3fa2b13 414 }
MAA 24:099df3fa2b13 415 }
MAA 24:099df3fa2b13 416
MAA 24:099df3fa2b13 417
MAA 24:099df3fa2b13 418 //if battery voltage is below BATTERYLOW limit, initiate battery low error state
MAA 24:099df3fa2b13 419 if((0.00036621652)*battery.read_u16() < BATTERYLOWLIMIT){
MAA 24:099df3fa2b13 420 dispTxtHandler.setErrorState(BATTERY_LOW);
MAA 24:099df3fa2b13 421 redLed = 1;
MAA 24:099df3fa2b13 422 greenLed = 0;
MAA 24:099df3fa2b13 423 }
MAA 24:099df3fa2b13 424
MAA 24:099df3fa2b13 425 //if gga fix is not present for a prolonged period of time, prompt user
MAA 24:099df3fa2b13 426 if((missingGpsCnt > GPSACQTIMELIMITINSECONDS) && !dispTxtHandler.getMagTimePromtStatus()) {
MAA 24:099df3fa2b13 427
MAA 24:099df3fa2b13 428 //Prompt user to set mag time manually
MAA 24:099df3fa2b13 429 dispTxtHandler.setErrorState(NO_FIX);
MAA 24:099df3fa2b13 430 }
MAA 24:099df3fa2b13 431
MAA 24:099df3fa2b13 432 //if gps data is missing for more than 10 mag reading cycles
MAA 24:099df3fa2b13 433 if((magCntWithoutGpsData > 10) && !magTimeSetManually) {
MAA 24:099df3fa2b13 434 //show error indication of gps data missing
MAA 24:099df3fa2b13 435 dispTxtHandler.setErrorState(NO_GPS);
MAA 24:099df3fa2b13 436
MAA 24:099df3fa2b13 437 //set led error status
MAA 24:099df3fa2b13 438 redLed = 1;
MAA 24:099df3fa2b13 439 greenLed = 0;
MAA 24:099df3fa2b13 440
MAA 24:099df3fa2b13 441 GGA_Fix_Present = false;
MAA 24:099df3fa2b13 442
MAA 24:099df3fa2b13 443 //knaptryk check
MAA 24:099df3fa2b13 444 if(!timeSetManuallyButton){
MAA 24:099df3fa2b13 445 timeSetManuallyCount += 1;
MAA 24:099df3fa2b13 446 }
MAA 24:099df3fa2b13 447
MAA 24:099df3fa2b13 448 if(timeSetManuallyCount > 3){
MAA 24:099df3fa2b13 449 magTimeSetManually = true;
MAA 24:099df3fa2b13 450 }
MAA 24:099df3fa2b13 451
MAA 24:099df3fa2b13 452 }
MAA 24:099df3fa2b13 453
MAA 24:099df3fa2b13 454
MAA 24:099df3fa2b13 455 if(!GGA_Fix_Present && GpsCntWithoutMagData < 20){
MAA 24:099df3fa2b13 456 //Missing GGA fix LED indicator
MAA 24:099df3fa2b13 457 greenLed = 0;
MAA 24:099df3fa2b13 458 redLed = 1;
MAA 24:099df3fa2b13 459 }
MAA 24:099df3fa2b13 460
MAA 24:099df3fa2b13 461 if(GpsCntWithoutMagData > 20){
MAA 24:099df3fa2b13 462 //Missing MAG data prompt
MAA 24:099df3fa2b13 463 dispTxtHandler.setErrorState(NO_MAG_DATA);
MAA 24:099df3fa2b13 464 greenLed = 0;
MAA 24:099df3fa2b13 465 redLed = 1;
MAA 24:099df3fa2b13 466 }
MAA 24:099df3fa2b13 467
MAA 24:099df3fa2b13 468 if((GGA_Fix_Present && GpsCntWithoutMagData < 20) || (magTimeSetManually && GpsCntWithoutMagData < 20)){
MAA 24:099df3fa2b13 469 //GGA fix LED indicator / time set manually unless battery is low
MAA 24:099df3fa2b13 470 if(dispTxtHandler.getErrorState() != BATTERY_LOW){
MAA 24:099df3fa2b13 471 greenLed = 1;
MAA 24:099df3fa2b13 472 redLed = 0;
MAA 24:099df3fa2b13 473 }
MAA 24:099df3fa2b13 474 }
MAA 24:099df3fa2b13 475
MAA 24:099df3fa2b13 476 checkStateFlag = false;
MAA 24:099df3fa2b13 477 }
MAA 24:099df3fa2b13 478
MAA 24:099df3fa2b13 479 //if the gps rx buffer is full, flush the buffer.
MAA 6:6d1683c8b26b 480 if(gps.rxBufferFull()){
MAA 6:6d1683c8b26b 481 gps.rxBufferFlush();
MAA 6:6d1683c8b26b 482 }
MAA 6:6d1683c8b26b 483
MAA 24:099df3fa2b13 484 //if the bmag rx buffer is full, flush the buffer.
MAA 8:d6287c33b54a 485 if(bmag.rxBufferFull()){
MAA 8:d6287c33b54a 486 bmag.rxBufferFlush();
MAA 8:d6287c33b54a 487 }
MAA 8:d6287c33b54a 488
MAA 13:45b333983206 489
MAA 21:325cb82f1838 490 //if bmag data string is available
MAA 21:325cb82f1838 491 if(BMAG_Data_Rdy) {
MAA 22:9f5955f051f5 492
MAA 34:c6c5e7ec9163 493 //reset last read ms val
MAA 34:c6c5e7ec9163 494 memset(timer_ms,'\0',5);
MAA 34:c6c5e7ec9163 495 tmpTime = t.read_ms();
MAA 34:c6c5e7ec9163 496 snprintf (timer_ms, 5, "%d",tmpTime);
MAA 28:ed0d29f63b55 497
MAA 34:c6c5e7ec9163 498 //dbg.printf("Timer: %d\r\n", tmpTime);
MAA 34:c6c5e7ec9163 499 //dbg.printf("ms timer val = %s\r\n", timer_ms);
MAA 28:ed0d29f63b55 500
MAA 35:ccc79f4147f2 501
MAA 34:c6c5e7ec9163 502 if(RTC_set){
MAA 35:ccc79f4147f2 503 //t_of_day = time(NULL);
MAA 35:ccc79f4147f2 504 //char buffer[15];
MAA 35:ccc79f4147f2 505 //strftime(buffer, 15, "%T", localtime(&t_of_day));
MAA 35:ccc79f4147f2 506 //dbg.printf("Time: %s\r\n", buffer);
MAA 35:ccc79f4147f2 507
MAA 35:ccc79f4147f2 508 string tmpTime = clk.getTime();
MAA 35:ccc79f4147f2 509
MAA 34:c6c5e7ec9163 510
MAA 34:c6c5e7ec9163 511 //HH
MAA 35:ccc79f4147f2 512 gpsNMEA.currentUTCFromGPRMC[0] = tmpTime[0];
MAA 35:ccc79f4147f2 513 gpsNMEA.currentUTCFromGPRMC[1] = tmpTime[1];
MAA 34:c6c5e7ec9163 514
MAA 34:c6c5e7ec9163 515 //MM
MAA 35:ccc79f4147f2 516 gpsNMEA.currentUTCFromGPRMC[3] = tmpTime[3];
MAA 35:ccc79f4147f2 517 gpsNMEA.currentUTCFromGPRMC[4] = tmpTime[4];
MAA 34:c6c5e7ec9163 518
MAA 34:c6c5e7ec9163 519 //SS
MAA 35:ccc79f4147f2 520 gpsNMEA.currentUTCFromGPRMC[6] = tmpTime[6];
MAA 35:ccc79f4147f2 521 gpsNMEA.currentUTCFromGPRMC[7] = tmpTime[7];
MAA 30:072e918663b8 522 }
MAA 30:072e918663b8 523
MAA 35:ccc79f4147f2 524
MAA 34:c6c5e7ec9163 525 if(strlen(timer_ms) == 1){
MAA 30:072e918663b8 526 gpsNMEA.currentUTCFromGPRMC[9] = '0';
MAA 30:072e918663b8 527 gpsNMEA.currentUTCFromGPRMC[10] = '0';
MAA 34:c6c5e7ec9163 528 gpsNMEA.currentUTCFromGPRMC[11] = timer_ms[0];
MAA 34:c6c5e7ec9163 529 }
MAA 34:c6c5e7ec9163 530
MAA 34:c6c5e7ec9163 531 if(strlen(timer_ms) == 2){
MAA 34:c6c5e7ec9163 532 gpsNMEA.currentUTCFromGPRMC[9] = '0';
MAA 34:c6c5e7ec9163 533 gpsNMEA.currentUTCFromGPRMC[10] = timer_ms[0];
MAA 34:c6c5e7ec9163 534 gpsNMEA.currentUTCFromGPRMC[11] = timer_ms[1];
MAA 34:c6c5e7ec9163 535 }
MAA 33:a7f044b3e057 536
MAA 34:c6c5e7ec9163 537 if(strlen(timer_ms) == 3){
MAA 34:c6c5e7ec9163 538 gpsNMEA.currentUTCFromGPRMC[9] = timer_ms[0];
MAA 34:c6c5e7ec9163 539 gpsNMEA.currentUTCFromGPRMC[10] = timer_ms[1];
MAA 34:c6c5e7ec9163 540 gpsNMEA.currentUTCFromGPRMC[11] = timer_ms[2];
MAA 34:c6c5e7ec9163 541 }
MAA 34:c6c5e7ec9163 542
MAA 34:c6c5e7ec9163 543 if(strlen(timer_ms) > 3 || strlen(timer_ms) == 0){
MAA 34:c6c5e7ec9163 544 gpsNMEA.currentUTCFromGPRMC[9] = '0';
MAA 34:c6c5e7ec9163 545 gpsNMEA.currentUTCFromGPRMC[10] = '0';
MAA 34:c6c5e7ec9163 546 gpsNMEA.currentUTCFromGPRMC[11] = '0';
MAA 34:c6c5e7ec9163 547 }
MAA 34:c6c5e7ec9163 548
MAA 34:c6c5e7ec9163 549
MAA 24:099df3fa2b13 550 //change magStringsReceived flag to true when mag data is available
MAA 23:2e914b705b99 551 if(magStringsReceived == false){
MAA 23:2e914b705b99 552 magStringsReceived = true;
MAA 23:2e914b705b99 553 }
MAA 23:2e914b705b99 554
MAA 23:2e914b705b99 555 //if gps override is active reset magCntWithoutGpsData
MAA 23:2e914b705b99 556 if(GPS_Override_Active){
MAA 23:2e914b705b99 557 magCntWithoutGpsData = 0;
MAA 23:2e914b705b99 558 }
MAA 23:2e914b705b99 559
MAA 23:2e914b705b99 560 //if mag data is present but gps data is not and gps override is not active
MAA 23:2e914b705b99 561 if(magCntWithoutGpsData < 100 && !GPS_Override_Active) {
MAA 10:eb026e023a3c 562 magCntWithoutGpsData += 1;
MAA 10:eb026e023a3c 563 }
MAA 23:2e914b705b99 564
MAA 24:099df3fa2b13 565 //move bmag data from rxbuffer to temporary array
MAA 21:325cb82f1838 566 bmag.move(tmpBMAGRxString, bmag.rxBufferGetCount());
MAA 21:325cb82f1838 567
MAA 8:d6287c33b54a 568 //copy c_string to string
MAA 21:325cb82f1838 569 BMAG_String_Buff.assign(tmpBMAGRxString);
MAA 21:325cb82f1838 570
MAA 8:d6287c33b54a 571 //clear tmpRxBuffer
MAA 21:325cb82f1838 572 memset(tmpBMAGRxString,'\0',128);
MAA 21:325cb82f1838 573
MAA 21:325cb82f1838 574 //parse bmag string
MAA 21:325cb82f1838 575 magParser.parseBMAGString(BMAG_String_Buff);
MAA 21:325cb82f1838 576
MAA 21:325cb82f1838 577 //reset counter containing gps string count without mag data
MAA 8:d6287c33b54a 578 GpsCntWithoutMagData = 0;
MAA 21:325cb82f1838 579
MAA 10:eb026e023a3c 580 //update filename when date is available with gga fix
MAA 21:325cb82f1838 581 if(!fileNameUpdated && GGA_Fix_Present) {
MAA 6:6d1683c8b26b 582 spsGen.generateSpsFilename(gpsNMEA.currentDATEFromGPRMC);
MAA 6:6d1683c8b26b 583 nextFilename.assign(spsGen.getSpsFileName());
MAA 6:6d1683c8b26b 584 fclose(fp);
MAA 6:6d1683c8b26b 585 currentFilename.assign(nextFilename);
MAA 6:6d1683c8b26b 586 nextFilename = "";
MAA 21:325cb82f1838 587
MAA 34:c6c5e7ec9163 588 fp = fopen(currentFilename.c_str(), "a");
MAA 21:325cb82f1838 589
MAA 7:872984a67d5b 590 fileNameUpdated = true;
MAA 24:099df3fa2b13 591
MAA 24:099df3fa2b13 592 spsGen.UpdateHeaderString(BARCODE, IDENTIFIERID, GROUP, TIMEZONE, ENCODING,SOURCEIDENTIFICATION, INTERPRETERID, DATALINEVERSION, FWSRCVERSION, FWIVERSION);
MAA 21:325cb82f1838 593 //add header to top of file
MAA 21:325cb82f1838 594 writeToUsb(spsGen.getHeaderString(), fp);
MAA 21:325cb82f1838 595 }
MAA 21:325cb82f1838 596
MAA 7:872984a67d5b 597 //if date has changed, ensure new file creation.
MAA 7:872984a67d5b 598 spsGen.generateSpsFilename(gpsNMEA.currentDATEFromGPRMC);
MAA 21:325cb82f1838 599 if(currentFilename != spsGen.getSpsFileName()) {
MAA 21:325cb82f1838 600 fileNameUpdated = false;
MAA 21:325cb82f1838 601 }
MAA 21:325cb82f1838 602
MAA 8:d6287c33b54a 603 //read battery voltage
MAA 8:d6287c33b54a 604 sprintf(batteryvoltagearr, "%0.1f",(0.00036621652)*battery.read_u16());
MAA 8:d6287c33b54a 605 batteryvoltage.assign(batteryvoltagearr);
MAA 21:325cb82f1838 606
MAA 8:d6287c33b54a 607 //generate default sps string
MAA 28:ed0d29f63b55 608 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);
MAA 21:325cb82f1838 609
MAA 8:d6287c33b54a 610 //write data strings to sps file
MAA 21:325cb82f1838 611 if(GGA_Fix_Present) {
MAA 21:325cb82f1838 612
MAA 8:d6287c33b54a 613 missingGpsCnt = 0;
MAA 34:c6c5e7ec9163 614
MAA 36:4d7a41f97ff5 615 writeToUsb(spsGen.getCurrentString(), fp);
MAA 21:325cb82f1838 616
MAA 21:325cb82f1838 617 if(!firstLineWritten) {
MAA 24:099df3fa2b13 618 spsGen.UpdateHeaderString(BARCODE, IDENTIFIERID, GROUP, TIMEZONE, ENCODING,SOURCEIDENTIFICATION, INTERPRETERID, DATALINEVERSION, FWSRCVERSION, FWIVERSION);
MAA 8:d6287c33b54a 619 writeToUsb(spsGen.getHeaderString(), fp);
MAA 21:325cb82f1838 620 firstLineWritten = true;
MAA 21:325cb82f1838 621 }
MAA 21:325cb82f1838 622
MAA 34:c6c5e7ec9163 623
MAA 21:325cb82f1838 624
MAA 21:325cb82f1838 625 if(!lastErrStatus && firstErrsWritten) {
MAA 37:fdd60dde174a 626 //clock resync
MAA 37:fdd60dde174a 627 char tmpHour[5];
MAA 37:fdd60dde174a 628 char tmpMinute[5];
MAA 37:fdd60dde174a 629 char tmpSecond[5];
MAA 36:4d7a41f97ff5 630
MAA 37:fdd60dde174a 631 memset(tmpHour, '/0', 5);
MAA 37:fdd60dde174a 632 memset(tmpMinute, '/0', 5);
MAA 37:fdd60dde174a 633 memset(tmpSecond, '/0', 5);
MAA 37:fdd60dde174a 634
MAA 36:4d7a41f97ff5 635 snprintf(tmpHour, 5, "%s", gpsNMEA.currentUTCFromGPRMC.substr(0, 2));
MAA 36:4d7a41f97ff5 636 snprintf(tmpMinute, 5, "%s", gpsNMEA.currentUTCFromGPRMC.substr(3, 2));
MAA 36:4d7a41f97ff5 637 snprintf(tmpSecond, 5, "%s", gpsNMEA.currentUTCFromGPRMC.substr(6, 2));
MAA 36:4d7a41f97ff5 638 int hours = atoi(tmpHour);
MAA 36:4d7a41f97ff5 639 int minutes = atoi(tmpMinute);
MAA 36:4d7a41f97ff5 640 int seconds = atoi(tmpSecond);
MAA 36:4d7a41f97ff5 641 clk.setTime(seconds, minutes, hours);
MAA 36:4d7a41f97ff5 642
MAA 36:4d7a41f97ff5 643 //error end string
MAA 21:325cb82f1838 644 spsGen.UpdateCurrentErrString("ERRE", IDENTIFIERID, GROUP, gpsNMEA.currentDATEFromGPRMC, gpsNMEA.currentUTCFromGPRMC, TIMEZONE, ENCODING, SOURCEIDENTIFICATION, INTERPRETERID, DATALINEVERSION, FWSRCVERSION, FWIVERSION, gpsNMEA.currentLatitude, gpsNMEA.currentLongitude, GGA_Fix_Present, magParser.getMagTimeStr(), magParser.getMagNTStr(), magParser.getMagSq(), &dbg);
MAA 8:d6287c33b54a 645 writeToUsb(spsGen.getCurrentErrString(), fp);
MAA 8:d6287c33b54a 646 lastErrStatus = true;
MAA 8:d6287c33b54a 647 firstErrsWritten = false;
MAA 21:325cb82f1838 648 firstLineWritten = false;
MAA 8:d6287c33b54a 649 }
MAA 8:d6287c33b54a 650 }
MAA 21:325cb82f1838 651
MAA 21:325cb82f1838 652 //write data strings to sps file, with error messages as defined in *.sps definition
MAA 21:325cb82f1838 653 if(!GGA_Fix_Present) {
MAA 21:325cb82f1838 654
MAA 21:325cb82f1838 655 if(missingGpsCnt <= GPSACQTIMELIMITINSECONDS) {
MAA 8:d6287c33b54a 656 missingGpsCnt += 1;
MAA 21:325cb82f1838 657 }
MAA 21:325cb82f1838 658
MAA 21:325cb82f1838 659 if(!firstLineWritten) {
MAA 24:099df3fa2b13 660 spsGen.UpdateHeaderString(BARCODE, IDENTIFIERID, GROUP, TIMEZONE, ENCODING,SOURCEIDENTIFICATION, INTERPRETERID, DATALINEVERSION, FWSRCVERSION, FWIVERSION);
MAA 8:d6287c33b54a 661 writeToUsb(spsGen.getHeaderString(), fp);
MAA 21:325cb82f1838 662 firstLineWritten = true;
MAA 11:d3d26d0e71ea 663 }
MAA 21:325cb82f1838 664
MAA 25:57f9e3273979 665 if(firstErrsWritten){
MAA 25:57f9e3273979 666 writeToUsb(spsGen.getCurrentString(), fp);
MAA 25:57f9e3273979 667 }
MAA 21:325cb82f1838 668
MAA 21:325cb82f1838 669 if(lastErrStatus && !firstErrsWritten) {
MAA 21:325cb82f1838 670 spsGen.UpdateCurrentErrString("ERRS", IDENTIFIERID, GROUP, gpsNMEA.currentDATEFromGPRMC, gpsNMEA.currentUTCFromGPRMC, TIMEZONE, ENCODING, SOURCEIDENTIFICATION, INTERPRETERID, DATALINEVERSION, FWSRCVERSION, FWIVERSION, gpsNMEA.currentLatitude, gpsNMEA.currentLongitude, GGA_Fix_Present, magParser.getMagTimeStr(), magParser.getMagNTStr(), magParser.getMagSq(), &dbg);
MAA 8:d6287c33b54a 671 writeToUsb(spsGen.getCurrentErrString(), fp);
MAA 8:d6287c33b54a 672 lastErrStatus = false;
MAA 21:325cb82f1838 673 firstErrsWritten = true;
MAA 21:325cb82f1838 674 }
MAA 21:325cb82f1838 675
MAA 10:eb026e023a3c 676 }
MAA 21:325cb82f1838 677
MAA 12:2b46960a5d41 678 //if user has been notified of time settings needed on bmag, pushbutton can be held for a few cycles to circumvent the set mag time display prompt.
MAA 21:325cb82f1838 679 if(!timeSetManuallyButton && dispTxtHandler.getMagTimePromtStatus()) {
MAA 10:eb026e023a3c 680 timeSetManuallyCount += 1;
MAA 21:325cb82f1838 681
MAA 21:325cb82f1838 682 if(timeSetManuallyCount > 3) {
MAA 21:325cb82f1838 683 magTimeSetManually = true;
MAA 21:325cb82f1838 684 }
MAA 21:325cb82f1838 685 }
MAA 11:d3d26d0e71ea 686
MAA 21:325cb82f1838 687 BMAG_Data_Rdy = false;
MAA 8:d6287c33b54a 688 }
MAA 21:325cb82f1838 689
MAA 10:eb026e023a3c 690
MAA 8:d6287c33b54a 691 if(GPS_Data_Rdy){
MAA 8:d6287c33b54a 692
MAA 32:a8d74b3c9d6f 693 gpsRunning = true;
MAA 32:a8d74b3c9d6f 694
MAA 24:099df3fa2b13 695 missingGpsConnectionCounter = 0;
MAA 24:099df3fa2b13 696
MAA 23:2e914b705b99 697 if(gpsStringsReceived == false){
MAA 23:2e914b705b99 698 gpsStringsReceived = true;
MAA 23:2e914b705b99 699 }
MAA 23:2e914b705b99 700
MAA 10:eb026e023a3c 701 //clear mag data string counter, counting mag data received since last gps string received
MAA 10:eb026e023a3c 702 magCntWithoutGpsData = 0;
MAA 10:eb026e023a3c 703
MAA 10:eb026e023a3c 704 //if gps data has been received without mag data since last gps string, increment counter.
MAA 8:d6287c33b54a 705 if(GpsCntWithoutMagData < 200){
MAA 8:d6287c33b54a 706
MAA 8:d6287c33b54a 707 GpsCntWithoutMagData += 1;
MAA 8:d6287c33b54a 708
MAA 8:d6287c33b54a 709 }
MAA 24:099df3fa2b13 710
MAA 0:b3313c5ffca3 711 gps.scanf("%s", &tmpGpsRxString);
MAA 0:b3313c5ffca3 712
MAA 0:b3313c5ffca3 713 //copy c_string to string
MAA 0:b3313c5ffca3 714 GPS_String_Buff.assign(tmpGpsRxString);
MAA 32:a8d74b3c9d6f 715 dbg.printf(tmpGpsRxString);
MAA 32:a8d74b3c9d6f 716 dbg.printf("\r\n");
MAA 0:b3313c5ffca3 717
MAA 0:b3313c5ffca3 718 //clear tmpRxBuffer
MAA 0:b3313c5ffca3 719 memset(tmpGpsRxString,'\0',128);
MAA 0:b3313c5ffca3 720
MAA 0:b3313c5ffca3 721 //Validate CRC
MAA 5:11782a2008c2 722 GPS_Data_Valid = gpsNMEA.ValidateData(GPS_String_Buff);
MAA 0:b3313c5ffca3 723
MAA 0:b3313c5ffca3 724 //store valid string, either gga or rmc
MAA 0:b3313c5ffca3 725 if(GPS_Data_Valid){
MAA 2:39c4a85dc2a4 726 gpsNMEA.StoreString(GPS_String_Buff/*, &dbg*/);
MAA 0:b3313c5ffca3 727 }
MAA 0:b3313c5ffca3 728
MAA 5:11782a2008c2 729 //Get gga fix flag
MAA 2:39c4a85dc2a4 730 GGA_Fix_Present = gpsNMEA.GGAFixVerification();
MAA 0:b3313c5ffca3 731
MAA 7:872984a67d5b 732 //Assign value to error flag
MAA 7:872984a67d5b 733 spsGen.setErrStatus(GGA_Fix_Present);
MAA 7:872984a67d5b 734
MAA 0:b3313c5ffca3 735 //Clearing RX buffer.
MAA 0:b3313c5ffca3 736 GPS_String_Buff = "";
MAA 0:b3313c5ffca3 737 GPS_String_Buff.resize(128);
MAA 0:b3313c5ffca3 738
MAA 5:11782a2008c2 739 //parse current date
MAA 5:11782a2008c2 740 gpsNMEA.ParseCurrentDateFromGPRMC();
MAA 2:39c4a85dc2a4 741
MAA 5:11782a2008c2 742 //parse current time
MAA 5:11782a2008c2 743 gpsNMEA.ParseCurrentUTCFromGPRMC();
MAA 3:38eabaa92552 744
MAA 5:11782a2008c2 745 //parse gps coordinates
MAA 5:11782a2008c2 746 gpsNMEA.ParseCurrentLatitudeFromGPRMC();
MAA 5:11782a2008c2 747 gpsNMEA.ParseCurrentLongitudeFromGPRMC();
MAA 24:099df3fa2b13 748
MAA 21:325cb82f1838 749 //clearing flags
MAA 21:325cb82f1838 750 GPS_Data_Valid = false;
MAA 21:325cb82f1838 751 GPS_Data_Rdy = false;
MAA 34:c6c5e7ec9163 752
MAA 34:c6c5e7ec9163 753 if(GGA_Fix_Present && !RTC_set && (strlen(gpsNMEA.currentDATEFromGPRMC.c_str()) > 5)){
MAA 34:c6c5e7ec9163 754 setMbedTime(gpsNMEA.currentDATEFromGPRMC, gpsNMEA.currentUTCFromGPRMC, &dbg);
MAA 35:ccc79f4147f2 755 RTC_set = true;
MAA 35:ccc79f4147f2 756
MAA 35:ccc79f4147f2 757 char tmpHour[5];
MAA 35:ccc79f4147f2 758 char tmpMinute[5];
MAA 35:ccc79f4147f2 759 char tmpSecond[5];
MAA 35:ccc79f4147f2 760
MAA 35:ccc79f4147f2 761 memset(tmpHour, '/0', 5);
MAA 35:ccc79f4147f2 762 memset(tmpMinute, '/0', 5);
MAA 35:ccc79f4147f2 763 memset(tmpSecond, '/0', 5);
MAA 35:ccc79f4147f2 764
MAA 35:ccc79f4147f2 765 snprintf(tmpHour, 5, "%s", gpsNMEA.currentUTCFromGPRMC.substr(0, 2));
MAA 35:ccc79f4147f2 766 snprintf(tmpMinute, 5, "%s", gpsNMEA.currentUTCFromGPRMC.substr(3, 2));
MAA 35:ccc79f4147f2 767 snprintf(tmpSecond, 5, "%s", gpsNMEA.currentUTCFromGPRMC.substr(6, 2));
MAA 35:ccc79f4147f2 768
MAA 35:ccc79f4147f2 769 int hours = atoi(tmpHour);
MAA 35:ccc79f4147f2 770 int minutes = atoi(tmpMinute);
MAA 35:ccc79f4147f2 771 int seconds = atoi(tmpSecond);
MAA 35:ccc79f4147f2 772
MAA 35:ccc79f4147f2 773 clk.setTime(seconds, minutes, hours);
MAA 34:c6c5e7ec9163 774 }
MAA 7:872984a67d5b 775
MAA 21:325cb82f1838 776 }
MAA 28:ed0d29f63b55 777
MAA 28:ed0d29f63b55 778 //if pth data is due, convert pth values to char arrays
MAA 28:ed0d29f63b55 779 if(PTHValuesReadyFlag){
MAA 28:ed0d29f63b55 780 memset(TemperatureArr,'\0',10);
MAA 28:ed0d29f63b55 781 memset(HumidityArr,'\0',10);
MAA 30:072e918663b8 782
MAA 30:072e918663b8 783 //assign last measured preassure to char array, and ensure correct zero padding
MAA 30:072e918663b8 784 if(PTH_Preassure <= 999){
MAA 30:072e918663b8 785 memset(PreassureArr,'\0',10);
MAA 30:072e918663b8 786 snprintf(PreassureArr, 10, "0%.0f", PTH_Preassure);
MAA 30:072e918663b8 787 }
MAA 30:072e918663b8 788
MAA 30:072e918663b8 789 if(PTH_Preassure >= 1000){
MAA 30:072e918663b8 790 memset(PreassureArr,'\0',10);
MAA 30:072e918663b8 791 snprintf(PreassureArr, 10, "%.0f", PTH_Preassure);
MAA 30:072e918663b8 792 }
MAA 30:072e918663b8 793
MAA 30:072e918663b8 794 //ensure correct temperature operator (+ or -) to show if temperature is positive or negative
MAA 30:072e918663b8 795 if(PTH_Temperature >= 0){
MAA 30:072e918663b8 796 //assign last measured temperature to char array with zero padding if needed
MAA 30:072e918663b8 797
MAA 30:072e918663b8 798 if((PTH_Temperature > -10) && (PTH_Temperature < 10)){
MAA 30:072e918663b8 799
MAA 30:072e918663b8 800 if(PTH_Temperature < 0){
MAA 30:072e918663b8 801 snprintf(TemperatureArr, 10, "-0%.0f", PTH_Temperature);
MAA 30:072e918663b8 802 }
MAA 30:072e918663b8 803
MAA 30:072e918663b8 804 if(PTH_Temperature >= 0){
MAA 30:072e918663b8 805 snprintf(TemperatureArr, 10, "+0%.0f", PTH_Temperature);
MAA 30:072e918663b8 806 }
MAA 30:072e918663b8 807 }
MAA 30:072e918663b8 808
MAA 30:072e918663b8 809 if(PTH_Temperature < -10){
MAA 30:072e918663b8 810 snprintf(TemperatureArr, 10, "-%.0f", PTH_Temperature);
MAA 30:072e918663b8 811 }
MAA 30:072e918663b8 812
MAA 30:072e918663b8 813 if(PTH_Temperature > 9){
MAA 30:072e918663b8 814 snprintf(TemperatureArr, 10, "+%.0f", PTH_Temperature);
MAA 30:072e918663b8 815 }
MAA 30:072e918663b8 816
MAA 30:072e918663b8 817 }
MAA 30:072e918663b8 818
MAA 30:072e918663b8 819 //assign last measured relative humidity to char array
MAA 30:072e918663b8 820 if(PTH_Humidity < 10){
MAA 30:072e918663b8 821 snprintf(HumidityArr, 10, "00%.0f", PTH_Humidity);
MAA 30:072e918663b8 822 }
MAA 30:072e918663b8 823
MAA 30:072e918663b8 824 if((PTH_Humidity < 100) && (PTH_Humidity >= 10)){
MAA 30:072e918663b8 825 snprintf(HumidityArr, 10, "0%.0f", PTH_Humidity);
MAA 30:072e918663b8 826 }
MAA 30:072e918663b8 827
MAA 30:072e918663b8 828 if(PTH_Humidity >= 100){
MAA 30:072e918663b8 829 snprintf(HumidityArr, 10, "%.0f", PTH_Humidity);
MAA 30:072e918663b8 830 }
MAA 30:072e918663b8 831
MAA 30:072e918663b8 832 PTHValuesReadyFlag = false;
MAA 30:072e918663b8 833
MAA 28:ed0d29f63b55 834 }
MAA 28:ed0d29f63b55 835
MAA 28:ed0d29f63b55 836 //If the pth sensor is inactive write NaN in the data columns normally containing PTH values
MAA 28:ed0d29f63b55 837 if(!PTHSensorActive){
MAA 28:ed0d29f63b55 838 memset(PreassureArr,'\0',10);
MAA 28:ed0d29f63b55 839 memset(TemperatureArr,'\0',10);
MAA 28:ed0d29f63b55 840 memset(HumidityArr,'\0',10);
MAA 30:072e918663b8 841 snprintf(PreassureArr, 10, "%s", "NaN");
MAA 30:072e918663b8 842 snprintf(TemperatureArr, 10, "%s", "NaN");
MAA 30:072e918663b8 843 snprintf(HumidityArr, 10, "%s", "NaN");
MAA 28:ed0d29f63b55 844 }
MAA 5:11782a2008c2 845
MAA 0:b3313c5ffca3 846 //If connection to USB flash disk is lost, reconnect to the flash disk
MAA 0:b3313c5ffca3 847 if(!msd.connected()){
MAA 9:ddc774114729 848
MAA 9:ddc774114729 849 //USB message
MAA 27:efd122db8855 850 clear_display_waiting();
MAA 27:efd122db8855 851 l1 = "USB pen";
MAA 27:efd122db8855 852 l2 = "Missing!";
MAA 27:efd122db8855 853 thr_writelines.start(write_lines);
MAA 9:ddc774114729 854
MAA 0:b3313c5ffca3 855 //reestablish usb connection
MAA 0:b3313c5ffca3 856 while(!msd.connect()){
MAA 0:b3313c5ffca3 857 dbg.printf("Trying to reconnect to usb flash disk\r\n");
MAA 6:6d1683c8b26b 858 wait_ms(200);
MAA 6:6d1683c8b26b 859 msd.connect();
MAA 0:b3313c5ffca3 860 }
MAA 27:efd122db8855 861
MAA 27:efd122db8855 862 thr_writelines.terminate();
MAA 0:b3313c5ffca3 863
MAA 0:b3313c5ffca3 864 //Reopening a file on usb disk
MAA 5:11782a2008c2 865 fp = fopen(currentFilename.c_str(), "a");
MAA 7:872984a67d5b 866
MAA 7:872984a67d5b 867 writeToUsb("\r\n", fp);
MAA 7:872984a67d5b 868 writeToUsb(spsGen.getHeaderString(), fp);
MAA 10:eb026e023a3c 869
MAA 0:b3313c5ffca3 870 }
MAA 0:b3313c5ffca3 871
MAA 5:11782a2008c2 872
MAA 2:39c4a85dc2a4 873 //kick / feed watchdog
MAA 2:39c4a85dc2a4 874 wd.kick();
MAA 28:ed0d29f63b55 875
MAA 28:ed0d29f63b55 876 Thread::yield();
MAA 5:11782a2008c2 877 }
MAA 5:11782a2008c2 878
MAA 0:b3313c5ffca3 879 return 0;
MAA 0:b3313c5ffca3 880 }
MAA 0:b3313c5ffca3 881
MAA 0:b3313c5ffca3 882 //Thanks to MODSERIAL!
MAA 0:b3313c5ffca3 883 // Called everytime a new character goes into
MAA 0:b3313c5ffca3 884 // the RX buffer. Test that character for \n
MAA 0:b3313c5ffca3 885 // Note, rxGetLastChar() gets the last char that
MAA 0:b3313c5ffca3 886 // we received but it does NOT remove it from
MAA 0:b3313c5ffca3 887 // the RX buffer.
MAA 0:b3313c5ffca3 888 void rxCallback(MODSERIAL_IRQ_INFO *q) {
MAA 0:b3313c5ffca3 889 MODSERIAL *serial = q->serial;
MAA 6:6d1683c8b26b 890 if (serial->rxGetLastChar() == '\n') {
MAA 0:b3313c5ffca3 891 GPS_Data_Rdy = true;
MAA 0:b3313c5ffca3 892 }
MAA 5:11782a2008c2 893 }
MAA 5:11782a2008c2 894
MAA 8:d6287c33b54a 895 //Thanks to MODSERIAL!
MAA 8:d6287c33b54a 896 // Called everytime a new character goes into
MAA 8:d6287c33b54a 897 // the RX buffer. Test that character for \r and buffer char count
MAA 8:d6287c33b54a 898 // Note, rxGetLastChar() gets the last char that
MAA 8:d6287c33b54a 899 // we received but it does NOT remove it from
MAA 8:d6287c33b54a 900 // the RX buffer.
MAA 8:d6287c33b54a 901 void bmagrxCallback(MODSERIAL_IRQ_INFO *q) {
MAA 8:d6287c33b54a 902 MODSERIAL *serial = q->serial;
MAA 8:d6287c33b54a 903 if ((serial->rxBufferGetCount() > 20) && (serial->rxGetLastChar() == '\r')) {
MAA 8:d6287c33b54a 904 BMAG_Data_Rdy = true;
MAA 8:d6287c33b54a 905 }
MAA 8:d6287c33b54a 906 }
MAA 8:d6287c33b54a 907
MAA 7:872984a67d5b 908 //Write to file
MAA 6:6d1683c8b26b 909 bool writeToUsb(string line, FILE * f){
MAA 5:11782a2008c2 910
MAA 5:11782a2008c2 911 if (f != NULL) {
MAA 5:11782a2008c2 912 fprintf(f, "\r\n");
MAA 8:d6287c33b54a 913 fprintf(f, line.c_str());
MAA 8:d6287c33b54a 914
MAA 6:6d1683c8b26b 915 }
MAA 6:6d1683c8b26b 916
MAA 5:11782a2008c2 917 if(f == NULL){
MAA 5:11782a2008c2 918 return false;
MAA 5:11782a2008c2 919 }
MAA 5:11782a2008c2 920
MAA 5:11782a2008c2 921 return true;
MAA 5:11782a2008c2 922 }
MAA 28:ed0d29f63b55 923
MAA 28:ed0d29f63b55 924
MAA 28:ed0d29f63b55 925 void getPthValues(){
MAA 28:ed0d29f63b55 926 if(BME.get(PTH_Temperature, PTH_Preassure, PTH_Humidity)){
MAA 28:ed0d29f63b55 927 PTHValuesReadyFlag = true;
MAA 28:ed0d29f63b55 928 }
MAA 28:ed0d29f63b55 929 };
MAA 32:a8d74b3c9d6f 930
MAA 32:a8d74b3c9d6f 931
MAA 32:a8d74b3c9d6f 932 void gpsAvailCheck(void){
MAA 32:a8d74b3c9d6f 933 gpsCheckedAfter10Sec = true;
MAA 32:a8d74b3c9d6f 934 };