Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
gert_lauritsen
Date:
Mon Jul 08 07:55:58 2019 +0000
Branch:
MbedBMAGThrRev
Revision:
62:b1b9e343feef
Parent:
61:52a6d0ffd8e5
Child:
63:168f5498a3c5
Chenged datestring and add ID file

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