Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
MAA
Date:
Fri Oct 06 13:05:07 2017 +0000
Branch:
MbedBMAGThrRev
Revision:
43:358e853ba2c9
Parent:
41:d7d77ddd32c6
Child:
44:14ec59d2170c
PTH debug output added

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