Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
MAA
Date:
Mon Jan 07 14:17:53 2019 +0000
Branch:
MbedBMAGThrRev
Revision:
54:d4d20a744b87
Parent:
53:cdaeb8938919
Child:
55:06c5f76e1a8c
Child:
61:52a6d0ffd8e5
Fw version 1.0.0.5;

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