SkyTEM BMAG / Mbed 2 deprecated BMAGThrRev

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
MAA
Date:
Mon Sep 25 12:55:37 2017 +0000
Branch:
MbedBMAGThrRev
Revision:
35:ccc79f4147f2
Parent:
34:c6c5e7ec9163
Child:
36:4d7a41f97ff5
Shift to PPS timing, looks promising compared to internal RTC.

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 33:a7f044b3e057 13 char BARCODE[6] = "06655";
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 8:d6287c33b54a 189 DigitalOut redLed(p24);
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 34:c6c5e7ec9163 615 writeToUsb(spsGen.getCurrentString(), fp);
MAA 34:c6c5e7ec9163 616 /*
MAA 34:c6c5e7ec9163 617 if(RTC_set){
MAA 34:c6c5e7ec9163 618 t_of_day = time(NULL);
MAA 34:c6c5e7ec9163 619 printf("Time as a basic string = %s\r\n", ctime(&t_of_day));
MAA 34:c6c5e7ec9163 620 }
MAA 34:c6c5e7ec9163 621 */
MAA 21:325cb82f1838 622
MAA 21:325cb82f1838 623 if(!firstLineWritten) {
MAA 24:099df3fa2b13 624 spsGen.UpdateHeaderString(BARCODE, IDENTIFIERID, GROUP, TIMEZONE, ENCODING,SOURCEIDENTIFICATION, INTERPRETERID, DATALINEVERSION, FWSRCVERSION, FWIVERSION);
MAA 8:d6287c33b54a 625 writeToUsb(spsGen.getHeaderString(), fp);
MAA 21:325cb82f1838 626 firstLineWritten = true;
MAA 21:325cb82f1838 627 }
MAA 21:325cb82f1838 628
MAA 34:c6c5e7ec9163 629
MAA 21:325cb82f1838 630
MAA 21:325cb82f1838 631 if(!lastErrStatus && firstErrsWritten) {
MAA 21:325cb82f1838 632 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 633 writeToUsb(spsGen.getCurrentErrString(), fp);
MAA 8:d6287c33b54a 634 lastErrStatus = true;
MAA 8:d6287c33b54a 635 firstErrsWritten = false;
MAA 21:325cb82f1838 636 firstLineWritten = false;
MAA 8:d6287c33b54a 637 }
MAA 8:d6287c33b54a 638 }
MAA 21:325cb82f1838 639
MAA 21:325cb82f1838 640 //write data strings to sps file, with error messages as defined in *.sps definition
MAA 21:325cb82f1838 641 if(!GGA_Fix_Present) {
MAA 21:325cb82f1838 642
MAA 21:325cb82f1838 643 if(missingGpsCnt <= GPSACQTIMELIMITINSECONDS) {
MAA 8:d6287c33b54a 644 missingGpsCnt += 1;
MAA 21:325cb82f1838 645 }
MAA 21:325cb82f1838 646
MAA 21:325cb82f1838 647 if(!firstLineWritten) {
MAA 24:099df3fa2b13 648 spsGen.UpdateHeaderString(BARCODE, IDENTIFIERID, GROUP, TIMEZONE, ENCODING,SOURCEIDENTIFICATION, INTERPRETERID, DATALINEVERSION, FWSRCVERSION, FWIVERSION);
MAA 8:d6287c33b54a 649 writeToUsb(spsGen.getHeaderString(), fp);
MAA 21:325cb82f1838 650 firstLineWritten = true;
MAA 11:d3d26d0e71ea 651 }
MAA 21:325cb82f1838 652
MAA 25:57f9e3273979 653 if(firstErrsWritten){
MAA 25:57f9e3273979 654 writeToUsb(spsGen.getCurrentString(), fp);
MAA 25:57f9e3273979 655 }
MAA 21:325cb82f1838 656
MAA 21:325cb82f1838 657 if(lastErrStatus && !firstErrsWritten) {
MAA 21:325cb82f1838 658 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 659 writeToUsb(spsGen.getCurrentErrString(), fp);
MAA 8:d6287c33b54a 660 lastErrStatus = false;
MAA 21:325cb82f1838 661 firstErrsWritten = true;
MAA 21:325cb82f1838 662 }
MAA 21:325cb82f1838 663
MAA 10:eb026e023a3c 664 }
MAA 21:325cb82f1838 665
MAA 12:2b46960a5d41 666 //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 667 if(!timeSetManuallyButton && dispTxtHandler.getMagTimePromtStatus()) {
MAA 10:eb026e023a3c 668 timeSetManuallyCount += 1;
MAA 21:325cb82f1838 669
MAA 21:325cb82f1838 670 if(timeSetManuallyCount > 3) {
MAA 21:325cb82f1838 671 magTimeSetManually = true;
MAA 21:325cb82f1838 672 }
MAA 21:325cb82f1838 673 }
MAA 11:d3d26d0e71ea 674
MAA 21:325cb82f1838 675 BMAG_Data_Rdy = false;
MAA 8:d6287c33b54a 676 }
MAA 21:325cb82f1838 677
MAA 10:eb026e023a3c 678
MAA 8:d6287c33b54a 679 if(GPS_Data_Rdy){
MAA 8:d6287c33b54a 680
MAA 32:a8d74b3c9d6f 681 gpsRunning = true;
MAA 32:a8d74b3c9d6f 682
MAA 24:099df3fa2b13 683 missingGpsConnectionCounter = 0;
MAA 24:099df3fa2b13 684
MAA 23:2e914b705b99 685 if(gpsStringsReceived == false){
MAA 23:2e914b705b99 686 gpsStringsReceived = true;
MAA 23:2e914b705b99 687 }
MAA 23:2e914b705b99 688
MAA 10:eb026e023a3c 689 //clear mag data string counter, counting mag data received since last gps string received
MAA 10:eb026e023a3c 690 magCntWithoutGpsData = 0;
MAA 10:eb026e023a3c 691
MAA 10:eb026e023a3c 692 //if gps data has been received without mag data since last gps string, increment counter.
MAA 8:d6287c33b54a 693 if(GpsCntWithoutMagData < 200){
MAA 8:d6287c33b54a 694
MAA 8:d6287c33b54a 695 GpsCntWithoutMagData += 1;
MAA 8:d6287c33b54a 696
MAA 8:d6287c33b54a 697 }
MAA 24:099df3fa2b13 698
MAA 0:b3313c5ffca3 699 gps.scanf("%s", &tmpGpsRxString);
MAA 0:b3313c5ffca3 700
MAA 0:b3313c5ffca3 701 //copy c_string to string
MAA 0:b3313c5ffca3 702 GPS_String_Buff.assign(tmpGpsRxString);
MAA 32:a8d74b3c9d6f 703 dbg.printf(tmpGpsRxString);
MAA 32:a8d74b3c9d6f 704 dbg.printf("\r\n");
MAA 0:b3313c5ffca3 705
MAA 0:b3313c5ffca3 706 //clear tmpRxBuffer
MAA 0:b3313c5ffca3 707 memset(tmpGpsRxString,'\0',128);
MAA 0:b3313c5ffca3 708
MAA 0:b3313c5ffca3 709 //Validate CRC
MAA 5:11782a2008c2 710 GPS_Data_Valid = gpsNMEA.ValidateData(GPS_String_Buff);
MAA 0:b3313c5ffca3 711
MAA 0:b3313c5ffca3 712 //store valid string, either gga or rmc
MAA 0:b3313c5ffca3 713 if(GPS_Data_Valid){
MAA 2:39c4a85dc2a4 714 gpsNMEA.StoreString(GPS_String_Buff/*, &dbg*/);
MAA 0:b3313c5ffca3 715 }
MAA 0:b3313c5ffca3 716
MAA 5:11782a2008c2 717 //Get gga fix flag
MAA 2:39c4a85dc2a4 718 GGA_Fix_Present = gpsNMEA.GGAFixVerification();
MAA 0:b3313c5ffca3 719
MAA 7:872984a67d5b 720 //Assign value to error flag
MAA 7:872984a67d5b 721 spsGen.setErrStatus(GGA_Fix_Present);
MAA 7:872984a67d5b 722
MAA 0:b3313c5ffca3 723 //Clearing RX buffer.
MAA 0:b3313c5ffca3 724 GPS_String_Buff = "";
MAA 0:b3313c5ffca3 725 GPS_String_Buff.resize(128);
MAA 0:b3313c5ffca3 726
MAA 5:11782a2008c2 727 //parse current date
MAA 5:11782a2008c2 728 gpsNMEA.ParseCurrentDateFromGPRMC();
MAA 2:39c4a85dc2a4 729
MAA 5:11782a2008c2 730 //parse current time
MAA 5:11782a2008c2 731 gpsNMEA.ParseCurrentUTCFromGPRMC();
MAA 3:38eabaa92552 732
MAA 5:11782a2008c2 733 //parse gps coordinates
MAA 5:11782a2008c2 734 gpsNMEA.ParseCurrentLatitudeFromGPRMC();
MAA 5:11782a2008c2 735 gpsNMEA.ParseCurrentLongitudeFromGPRMC();
MAA 24:099df3fa2b13 736
MAA 21:325cb82f1838 737 //clearing flags
MAA 21:325cb82f1838 738 GPS_Data_Valid = false;
MAA 21:325cb82f1838 739 GPS_Data_Rdy = false;
MAA 34:c6c5e7ec9163 740
MAA 34:c6c5e7ec9163 741 if(GGA_Fix_Present && !RTC_set && (strlen(gpsNMEA.currentDATEFromGPRMC.c_str()) > 5)){
MAA 34:c6c5e7ec9163 742 setMbedTime(gpsNMEA.currentDATEFromGPRMC, gpsNMEA.currentUTCFromGPRMC, &dbg);
MAA 35:ccc79f4147f2 743 RTC_set = true;
MAA 35:ccc79f4147f2 744
MAA 35:ccc79f4147f2 745 char tmpHour[5];
MAA 35:ccc79f4147f2 746 char tmpMinute[5];
MAA 35:ccc79f4147f2 747 char tmpSecond[5];
MAA 35:ccc79f4147f2 748
MAA 35:ccc79f4147f2 749 memset(tmpHour, '/0', 5);
MAA 35:ccc79f4147f2 750 memset(tmpMinute, '/0', 5);
MAA 35:ccc79f4147f2 751 memset(tmpSecond, '/0', 5);
MAA 35:ccc79f4147f2 752
MAA 35:ccc79f4147f2 753 snprintf(tmpHour, 5, "%s", gpsNMEA.currentUTCFromGPRMC.substr(0, 2));
MAA 35:ccc79f4147f2 754 snprintf(tmpMinute, 5, "%s", gpsNMEA.currentUTCFromGPRMC.substr(3, 2));
MAA 35:ccc79f4147f2 755 snprintf(tmpSecond, 5, "%s", gpsNMEA.currentUTCFromGPRMC.substr(6, 2));
MAA 35:ccc79f4147f2 756
MAA 35:ccc79f4147f2 757 int hours = atoi(tmpHour);
MAA 35:ccc79f4147f2 758 int minutes = atoi(tmpMinute);
MAA 35:ccc79f4147f2 759 int seconds = atoi(tmpSecond);
MAA 35:ccc79f4147f2 760
MAA 35:ccc79f4147f2 761 clk.setTime(seconds, minutes, hours);
MAA 34:c6c5e7ec9163 762 }
MAA 7:872984a67d5b 763
MAA 21:325cb82f1838 764 }
MAA 28:ed0d29f63b55 765
MAA 28:ed0d29f63b55 766 //if pth data is due, convert pth values to char arrays
MAA 28:ed0d29f63b55 767 if(PTHValuesReadyFlag){
MAA 28:ed0d29f63b55 768 memset(TemperatureArr,'\0',10);
MAA 28:ed0d29f63b55 769 memset(HumidityArr,'\0',10);
MAA 30:072e918663b8 770
MAA 30:072e918663b8 771 //assign last measured preassure to char array, and ensure correct zero padding
MAA 30:072e918663b8 772 if(PTH_Preassure <= 999){
MAA 30:072e918663b8 773 memset(PreassureArr,'\0',10);
MAA 30:072e918663b8 774 snprintf(PreassureArr, 10, "0%.0f", PTH_Preassure);
MAA 30:072e918663b8 775 }
MAA 30:072e918663b8 776
MAA 30:072e918663b8 777 if(PTH_Preassure >= 1000){
MAA 30:072e918663b8 778 memset(PreassureArr,'\0',10);
MAA 30:072e918663b8 779 snprintf(PreassureArr, 10, "%.0f", PTH_Preassure);
MAA 30:072e918663b8 780 }
MAA 30:072e918663b8 781
MAA 30:072e918663b8 782 //ensure correct temperature operator (+ or -) to show if temperature is positive or negative
MAA 30:072e918663b8 783 if(PTH_Temperature >= 0){
MAA 30:072e918663b8 784 //assign last measured temperature to char array with zero padding if needed
MAA 30:072e918663b8 785
MAA 30:072e918663b8 786 if((PTH_Temperature > -10) && (PTH_Temperature < 10)){
MAA 30:072e918663b8 787
MAA 30:072e918663b8 788 if(PTH_Temperature < 0){
MAA 30:072e918663b8 789 snprintf(TemperatureArr, 10, "-0%.0f", PTH_Temperature);
MAA 30:072e918663b8 790 }
MAA 30:072e918663b8 791
MAA 30:072e918663b8 792 if(PTH_Temperature >= 0){
MAA 30:072e918663b8 793 snprintf(TemperatureArr, 10, "+0%.0f", PTH_Temperature);
MAA 30:072e918663b8 794 }
MAA 30:072e918663b8 795 }
MAA 30:072e918663b8 796
MAA 30:072e918663b8 797 if(PTH_Temperature < -10){
MAA 30:072e918663b8 798 snprintf(TemperatureArr, 10, "-%.0f", PTH_Temperature);
MAA 30:072e918663b8 799 }
MAA 30:072e918663b8 800
MAA 30:072e918663b8 801 if(PTH_Temperature > 9){
MAA 30:072e918663b8 802 snprintf(TemperatureArr, 10, "+%.0f", PTH_Temperature);
MAA 30:072e918663b8 803 }
MAA 30:072e918663b8 804
MAA 30:072e918663b8 805 }
MAA 30:072e918663b8 806
MAA 30:072e918663b8 807 //assign last measured relative humidity to char array
MAA 30:072e918663b8 808 if(PTH_Humidity < 10){
MAA 30:072e918663b8 809 snprintf(HumidityArr, 10, "00%.0f", PTH_Humidity);
MAA 30:072e918663b8 810 }
MAA 30:072e918663b8 811
MAA 30:072e918663b8 812 if((PTH_Humidity < 100) && (PTH_Humidity >= 10)){
MAA 30:072e918663b8 813 snprintf(HumidityArr, 10, "0%.0f", PTH_Humidity);
MAA 30:072e918663b8 814 }
MAA 30:072e918663b8 815
MAA 30:072e918663b8 816 if(PTH_Humidity >= 100){
MAA 30:072e918663b8 817 snprintf(HumidityArr, 10, "%.0f", PTH_Humidity);
MAA 30:072e918663b8 818 }
MAA 30:072e918663b8 819
MAA 30:072e918663b8 820 PTHValuesReadyFlag = false;
MAA 30:072e918663b8 821
MAA 28:ed0d29f63b55 822 }
MAA 28:ed0d29f63b55 823
MAA 28:ed0d29f63b55 824 //If the pth sensor is inactive write NaN in the data columns normally containing PTH values
MAA 28:ed0d29f63b55 825 if(!PTHSensorActive){
MAA 28:ed0d29f63b55 826 memset(PreassureArr,'\0',10);
MAA 28:ed0d29f63b55 827 memset(TemperatureArr,'\0',10);
MAA 28:ed0d29f63b55 828 memset(HumidityArr,'\0',10);
MAA 30:072e918663b8 829 snprintf(PreassureArr, 10, "%s", "NaN");
MAA 30:072e918663b8 830 snprintf(TemperatureArr, 10, "%s", "NaN");
MAA 30:072e918663b8 831 snprintf(HumidityArr, 10, "%s", "NaN");
MAA 28:ed0d29f63b55 832 }
MAA 5:11782a2008c2 833
MAA 0:b3313c5ffca3 834 //If connection to USB flash disk is lost, reconnect to the flash disk
MAA 0:b3313c5ffca3 835 if(!msd.connected()){
MAA 9:ddc774114729 836
MAA 9:ddc774114729 837 //USB message
MAA 27:efd122db8855 838 clear_display_waiting();
MAA 27:efd122db8855 839 l1 = "USB pen";
MAA 27:efd122db8855 840 l2 = "Missing!";
MAA 27:efd122db8855 841 thr_writelines.start(write_lines);
MAA 9:ddc774114729 842
MAA 0:b3313c5ffca3 843 //reestablish usb connection
MAA 0:b3313c5ffca3 844 while(!msd.connect()){
MAA 0:b3313c5ffca3 845 dbg.printf("Trying to reconnect to usb flash disk\r\n");
MAA 6:6d1683c8b26b 846 wait_ms(200);
MAA 6:6d1683c8b26b 847 msd.connect();
MAA 0:b3313c5ffca3 848 }
MAA 27:efd122db8855 849
MAA 27:efd122db8855 850 thr_writelines.terminate();
MAA 0:b3313c5ffca3 851
MAA 0:b3313c5ffca3 852 //Reopening a file on usb disk
MAA 5:11782a2008c2 853 fp = fopen(currentFilename.c_str(), "a");
MAA 7:872984a67d5b 854
MAA 7:872984a67d5b 855 writeToUsb("\r\n", fp);
MAA 7:872984a67d5b 856 writeToUsb(spsGen.getHeaderString(), fp);
MAA 10:eb026e023a3c 857
MAA 0:b3313c5ffca3 858 }
MAA 0:b3313c5ffca3 859
MAA 5:11782a2008c2 860
MAA 2:39c4a85dc2a4 861 //kick / feed watchdog
MAA 2:39c4a85dc2a4 862 wd.kick();
MAA 28:ed0d29f63b55 863
MAA 28:ed0d29f63b55 864 Thread::yield();
MAA 5:11782a2008c2 865 }
MAA 5:11782a2008c2 866
MAA 0:b3313c5ffca3 867 return 0;
MAA 0:b3313c5ffca3 868 }
MAA 0:b3313c5ffca3 869
MAA 0:b3313c5ffca3 870 //Thanks to MODSERIAL!
MAA 0:b3313c5ffca3 871 // Called everytime a new character goes into
MAA 0:b3313c5ffca3 872 // the RX buffer. Test that character for \n
MAA 0:b3313c5ffca3 873 // Note, rxGetLastChar() gets the last char that
MAA 0:b3313c5ffca3 874 // we received but it does NOT remove it from
MAA 0:b3313c5ffca3 875 // the RX buffer.
MAA 0:b3313c5ffca3 876 void rxCallback(MODSERIAL_IRQ_INFO *q) {
MAA 0:b3313c5ffca3 877 MODSERIAL *serial = q->serial;
MAA 6:6d1683c8b26b 878 if (serial->rxGetLastChar() == '\n') {
MAA 0:b3313c5ffca3 879 GPS_Data_Rdy = true;
MAA 0:b3313c5ffca3 880 }
MAA 5:11782a2008c2 881 }
MAA 5:11782a2008c2 882
MAA 8:d6287c33b54a 883 //Thanks to MODSERIAL!
MAA 8:d6287c33b54a 884 // Called everytime a new character goes into
MAA 8:d6287c33b54a 885 // the RX buffer. Test that character for \r and buffer char count
MAA 8:d6287c33b54a 886 // Note, rxGetLastChar() gets the last char that
MAA 8:d6287c33b54a 887 // we received but it does NOT remove it from
MAA 8:d6287c33b54a 888 // the RX buffer.
MAA 8:d6287c33b54a 889 void bmagrxCallback(MODSERIAL_IRQ_INFO *q) {
MAA 8:d6287c33b54a 890 MODSERIAL *serial = q->serial;
MAA 8:d6287c33b54a 891 if ((serial->rxBufferGetCount() > 20) && (serial->rxGetLastChar() == '\r')) {
MAA 8:d6287c33b54a 892 BMAG_Data_Rdy = true;
MAA 8:d6287c33b54a 893 }
MAA 8:d6287c33b54a 894 }
MAA 8:d6287c33b54a 895
MAA 7:872984a67d5b 896 //Write to file
MAA 6:6d1683c8b26b 897 bool writeToUsb(string line, FILE * f){
MAA 5:11782a2008c2 898
MAA 5:11782a2008c2 899 if (f != NULL) {
MAA 5:11782a2008c2 900 fprintf(f, "\r\n");
MAA 8:d6287c33b54a 901 fprintf(f, line.c_str());
MAA 8:d6287c33b54a 902
MAA 6:6d1683c8b26b 903 }
MAA 6:6d1683c8b26b 904
MAA 5:11782a2008c2 905 if(f == NULL){
MAA 5:11782a2008c2 906 return false;
MAA 5:11782a2008c2 907 }
MAA 5:11782a2008c2 908
MAA 5:11782a2008c2 909 return true;
MAA 5:11782a2008c2 910 }
MAA 28:ed0d29f63b55 911
MAA 28:ed0d29f63b55 912
MAA 28:ed0d29f63b55 913 void getPthValues(){
MAA 28:ed0d29f63b55 914 if(BME.get(PTH_Temperature, PTH_Preassure, PTH_Humidity)){
MAA 28:ed0d29f63b55 915 PTHValuesReadyFlag = true;
MAA 28:ed0d29f63b55 916 }
MAA 28:ed0d29f63b55 917 };
MAA 32:a8d74b3c9d6f 918
MAA 32:a8d74b3c9d6f 919
MAA 32:a8d74b3c9d6f 920 void gpsAvailCheck(void){
MAA 32:a8d74b3c9d6f 921 gpsCheckedAfter10Sec = true;
MAA 32:a8d74b3c9d6f 922 };