Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
MAA
Date:
Thu Sep 28 16:40:15 2017 +0000
Branch:
MbedBMAGThrRev
Revision:
40:45289e57887d
Parent:
39:0aeb019323bf
Child:
41:d7d77ddd32c6
Implemented version on BMAG 11915 (pps interrupt on p26); FW 1.3;

Who changed what in which revision?

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