SkyTEM BMAG / Mbed 2 deprecated BMAGThrRev

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
MAA
Date:
Mon Mar 27 13:49:46 2017 +0000
Revision:
10:eb026e023a3c
Parent:
9:ddc774114729
Child:
11:d3d26d0e71ea
Error handling of missing gps connection, missing gpsfix from gps.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MAA 0:b3313c5ffca3 1 #include "main.h"
MAA 0:b3313c5ffca3 2
MAA 9:ddc774114729 3 //change GPSACQTIMELIMITINSECONDS to change the duration in seconds, allowed for the gps to get gps fix.
MAA 9:ddc774114729 4 //After this duration, an error indication will occur if fix is not present.
MAA 8:d6287c33b54a 5 #define GPSACQTIMELIMITINSECONDS 60
MAA 8:d6287c33b54a 6
MAA 8:d6287c33b54a 7 //change BARCODE string inside double quotes to barcode of BMAG equipment
MAA 8:d6287c33b54a 8 char BARCODE[6] = "12345";
MAA 8:d6287c33b54a 9
MAA 8:d6287c33b54a 10
MAA 0:b3313c5ffca3 11 //Global GPS variables
MAA 0:b3313c5ffca3 12 bool GPS_Data_Rdy = false;
MAA 0:b3313c5ffca3 13 bool GPS_Data_Valid = false;
MAA 0:b3313c5ffca3 14 bool GGA_Fix_Present = false;
MAA 5:11782a2008c2 15 bool firstLineWritten = false;
MAA 6:6d1683c8b26b 16 bool fileNameUpdated = false;
MAA 7:872984a67d5b 17 bool lastErrStatus = true;
MAA 7:872984a67d5b 18 bool firstErrsWritten = false;
MAA 8:d6287c33b54a 19 char tmpGpsRxString[128];
MAA 8:d6287c33b54a 20 int missingGpsCnt = 0;
MAA 8:d6287c33b54a 21 int GpsCntWithoutMagData = 0;
MAA 10:eb026e023a3c 22 int magCntWithoutGpsData = 0;
MAA 10:eb026e023a3c 23 bool userNotifiedOfNoGGAFix = false;
MAA 7:872984a67d5b 24
MAA 0:b3313c5ffca3 25
MAA 8:d6287c33b54a 26 string INTERPRETERID = "";
MAA 8:d6287c33b54a 27 char interpreterTmpID[10];
MAA 8:d6287c33b54a 28
MAA 6:6d1683c8b26b 29 //global system variables
MAA 0:b3313c5ffca3 30 bool run = true;
MAA 8:d6287c33b54a 31 bool toggler = true;
MAA 8:d6287c33b54a 32 int togglecount = 0;
MAA 8:d6287c33b54a 33 bool magMissingPrompt = false;
MAA 0:b3313c5ffca3 34
MAA 8:d6287c33b54a 35 //global BMAG variables
MAA 8:d6287c33b54a 36 bool BMAG_Data_Rdy = false;
MAA 10:eb026e023a3c 37 bool magTimeSetManually = false;
MAA 8:d6287c33b54a 38 char tmpBMAGRxString[128];
MAA 8:d6287c33b54a 39 char magnTarr[15];
MAA 10:eb026e023a3c 40 int magTimePromptCount = 0;
MAA 10:eb026e023a3c 41 int timeSetManuallyCount = 0;
MAA 8:d6287c33b54a 42
MAA 8:d6287c33b54a 43 //batteryvoltage
MAA 8:d6287c33b54a 44 char batteryvoltagearr[5];
MAA 8:d6287c33b54a 45 string batteryvoltage;
MAA 0:b3313c5ffca3 46
MAA 5:11782a2008c2 47 //Write to file prototype
MAA 6:6d1683c8b26b 48 bool writeToUsb(string line, FILE * f);
MAA 5:11782a2008c2 49
MAA 0:b3313c5ffca3 50 int main(void){
MAA 7:872984a67d5b 51
MAA 7:872984a67d5b 52 //initializing watchdog, timeout 10 seconds
MAA 6:6d1683c8b26b 53 Watchdog wd;
MAA 8:d6287c33b54a 54 wd.init(10.0);
MAA 8:d6287c33b54a 55
MAA 8:d6287c33b54a 56 //Led outputs
MAA 8:d6287c33b54a 57 DigitalOut redLed(p24);
MAA 8:d6287c33b54a 58 DigitalOut greenLed(p23);
MAA 8:d6287c33b54a 59
MAA 10:eb026e023a3c 60 //MagTime manually set by user input
MAA 10:eb026e023a3c 61 DigitalIn timeSetManuallyButton(p30);
MAA 10:eb026e023a3c 62 timeSetManuallyButton.mode(PullUp);
MAA 10:eb026e023a3c 63
MAA 8:d6287c33b54a 64 redLed = 0;
MAA 8:d6287c33b54a 65 greenLed = 0;
MAA 0:b3313c5ffca3 66
MAA 8:d6287c33b54a 67 //Display init
MAA 8:d6287c33b54a 68 OpenDisplay();
MAA 8:d6287c33b54a 69
MAA 8:d6287c33b54a 70 //init of battery strings
MAA 8:d6287c33b54a 71 memset(batteryvoltagearr,'\0',5);
MAA 8:d6287c33b54a 72 batteryvoltage = "";
MAA 8:d6287c33b54a 73
MAA 8:d6287c33b54a 74 //Analog battery reading
MAA 8:d6287c33b54a 75 AnalogIn battery(A5);
MAA 8:d6287c33b54a 76
MAA 4:c70ef089a3fd 77 string currentFilename, nextFilename;
MAA 4:c70ef089a3fd 78
MAA 5:11782a2008c2 79 currentFilename = "/usb/tempFile.sps";
MAA 5:11782a2008c2 80
MAA 0:b3313c5ffca3 81 //Initializing string buffer for GPS data
MAA 0:b3313c5ffca3 82 string GPS_String_Buff;
MAA 0:b3313c5ffca3 83 GPS_String_Buff.resize(128);
MAA 0:b3313c5ffca3 84 memset(tmpGpsRxString,'\0',128);
MAA 0:b3313c5ffca3 85
MAA 8:d6287c33b54a 86 //Initializing string buffer for BMAG data
MAA 8:d6287c33b54a 87 string BMAG_String_Buff;
MAA 8:d6287c33b54a 88 BMAG_String_Buff.resize(128);
MAA 8:d6287c33b54a 89 memset(tmpBMAGRxString,'\0',128);
MAA 8:d6287c33b54a 90
MAA 2:39c4a85dc2a4 91 //debug comm setup
MAA 0:b3313c5ffca3 92 dbg.baud(115200);
MAA 6:6d1683c8b26b 93 dbg.printf("Init...\r\n");
MAA 0:b3313c5ffca3 94
MAA 0:b3313c5ffca3 95 //setting up USB device
MAA 0:b3313c5ffca3 96 USBHostMSD msd("usb");
MAA 0:b3313c5ffca3 97
MAA 9:ddc774114729 98 //USB message
MAA 9:ddc774114729 99 ClearDisp();
MAA 9:ddc774114729 100 DispReturn();
MAA 9:ddc774114729 101 DispLine("Mounting");
MAA 9:ddc774114729 102 DispLocate(1,2);
MAA 9:ddc774114729 103 DispLine("USB pen");
MAA 9:ddc774114729 104
MAA 10:eb026e023a3c 105 wait_ms(1000);
MAA 10:eb026e023a3c 106
MAA 0:b3313c5ffca3 107 while(!msd.connect()){
MAA 0:b3313c5ffca3 108 dbg.printf("Trying to connect to usb flash disk\r\n");
MAA 6:6d1683c8b26b 109 wait_ms(500);
MAA 0:b3313c5ffca3 110 }
MAA 0:b3313c5ffca3 111
MAA 0:b3313c5ffca3 112 //Opening a file on usb disk
MAA 5:11782a2008c2 113 FILE * fp = fopen(currentFilename.c_str(), "a");
MAA 4:c70ef089a3fd 114 wait_ms(100);
MAA 0:b3313c5ffca3 115
MAA 2:39c4a85dc2a4 116 //initializing SPS generation
MAA 2:39c4a85dc2a4 117 SPS spsGen;
MAA 6:6d1683c8b26b 118
MAA 6:6d1683c8b26b 119 //GPS communication init
MAA 6:6d1683c8b26b 120 gps.baud(9600);
MAA 6:6d1683c8b26b 121 gps.attach(&rxCallback, MODSERIAL::RxIrq);
MAA 6:6d1683c8b26b 122
MAA 10:eb026e023a3c 123 //GPS message
MAA 10:eb026e023a3c 124 ClearDisp();
MAA 10:eb026e023a3c 125 DispReturn();
MAA 10:eb026e023a3c 126 DispLine("GPS");
MAA 10:eb026e023a3c 127 DispLocate(1,2);
MAA 10:eb026e023a3c 128 DispLine("INIT");
MAA 10:eb026e023a3c 129
MAA 8:d6287c33b54a 130 //BMAG communication init
MAA 8:d6287c33b54a 131 bmag.baud(115200);
MAA 8:d6287c33b54a 132 bmag.attach(&bmagrxCallback, MODSERIAL::RxIrq);
MAA 8:d6287c33b54a 133
MAA 6:6d1683c8b26b 134 //Start comms with the GPS, Enabling GPRMC and GPGGA
MAA 6:6d1683c8b26b 135 gps.printf("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n");
MAA 6:6d1683c8b26b 136
MAA 7:872984a67d5b 137 dbg.printf("Init.... Done!\r\n");
MAA 8:d6287c33b54a 138
MAA 8:d6287c33b54a 139 //init interpreterid
MAA 8:d6287c33b54a 140 int barcodeint = atoi(BARCODE);
MAA 8:d6287c33b54a 141 memset(interpreterTmpID,'\0',10);
MAA 8:d6287c33b54a 142 sprintf(interpreterTmpID,"%4x", barcodeint);
MAA 8:d6287c33b54a 143 INTERPRETERID.assign(interpreterTmpID);
MAA 7:872984a67d5b 144
MAA 5:11782a2008c2 145 //infinite loop running after initialization
MAA 0:b3313c5ffca3 146 while(run) {
MAA 0:b3313c5ffca3 147
MAA 6:6d1683c8b26b 148 //if the gps rx buffer is full, flush the buffer
MAA 6:6d1683c8b26b 149 if(gps.rxBufferFull()){
MAA 6:6d1683c8b26b 150 gps.rxBufferFlush();
MAA 6:6d1683c8b26b 151 }
MAA 6:6d1683c8b26b 152
MAA 8:d6287c33b54a 153 if(bmag.rxBufferFull()){
MAA 8:d6287c33b54a 154 bmag.rxBufferFlush();
MAA 8:d6287c33b54a 155 }
MAA 8:d6287c33b54a 156
MAA 8:d6287c33b54a 157 if(BMAG_Data_Rdy){
MAA 10:eb026e023a3c 158
MAA 10:eb026e023a3c 159 //if mag data is present but gps data is not
MAA 10:eb026e023a3c 160 if(magCntWithoutGpsData < 100){
MAA 10:eb026e023a3c 161 magCntWithoutGpsData += 1;
MAA 10:eb026e023a3c 162 }
MAA 10:eb026e023a3c 163
MAA 8:d6287c33b54a 164 magMissingPrompt = false;
MAA 0:b3313c5ffca3 165
MAA 8:d6287c33b54a 166 bmag.move(tmpBMAGRxString, bmag.rxBufferGetCount());
MAA 8:d6287c33b54a 167
MAA 8:d6287c33b54a 168 //copy c_string to string
MAA 8:d6287c33b54a 169 BMAG_String_Buff.assign(tmpBMAGRxString);
MAA 8:d6287c33b54a 170
MAA 8:d6287c33b54a 171 //clear tmpRxBuffer
MAA 8:d6287c33b54a 172 memset(tmpBMAGRxString,'\0',128);
MAA 8:d6287c33b54a 173
MAA 8:d6287c33b54a 174 magParser.parseBMAGString(BMAG_String_Buff);
MAA 8:d6287c33b54a 175
MAA 8:d6287c33b54a 176 GpsCntWithoutMagData = 0;
MAA 8:d6287c33b54a 177
MAA 10:eb026e023a3c 178 //update filename when date is available with gga fix
MAA 6:6d1683c8b26b 179 if(!fileNameUpdated && GGA_Fix_Present){
MAA 6:6d1683c8b26b 180 spsGen.generateSpsFilename(gpsNMEA.currentDATEFromGPRMC);
MAA 6:6d1683c8b26b 181 nextFilename.assign(spsGen.getSpsFileName());
MAA 6:6d1683c8b26b 182 fclose(fp);
MAA 6:6d1683c8b26b 183 currentFilename.assign(nextFilename);
MAA 6:6d1683c8b26b 184 nextFilename = "";
MAA 6:6d1683c8b26b 185
MAA 6:6d1683c8b26b 186 fopen(currentFilename.c_str(), "a");
MAA 6:6d1683c8b26b 187
MAA 7:872984a67d5b 188 fileNameUpdated = true;
MAA 7:872984a67d5b 189
MAA 7:872984a67d5b 190 //add header to top of file
MAA 7:872984a67d5b 191 writeToUsb(spsGen.getHeaderString(), fp);
MAA 6:6d1683c8b26b 192
MAA 8:d6287c33b54a 193 }
MAA 6:6d1683c8b26b 194
MAA 7:872984a67d5b 195 //if date has changed, ensure new file creation.
MAA 7:872984a67d5b 196 spsGen.generateSpsFilename(gpsNMEA.currentDATEFromGPRMC);
MAA 7:872984a67d5b 197 if(currentFilename != spsGen.getSpsFileName()){
MAA 7:872984a67d5b 198 fileNameUpdated = false;
MAA 7:872984a67d5b 199 }
MAA 8:d6287c33b54a 200
MAA 8:d6287c33b54a 201 //read battery voltage
MAA 8:d6287c33b54a 202 sprintf(batteryvoltagearr, "%0.1f",(0.00036621652)*battery.read_u16());
MAA 8:d6287c33b54a 203 batteryvoltage.assign(batteryvoltagearr);
MAA 8:d6287c33b54a 204
MAA 10:eb026e023a3c 205 if((toggler && (missingGpsCnt < GPSACQTIMELIMITINSECONDS)) || (toggler && userNotifiedOfNoGGAFix)){
MAA 10:eb026e023a3c 206 //show battery voltage and gps fix status for 10 mag reading cycles
MAA 8:d6287c33b54a 207 ClearDisp();
MAA 8:d6287c33b54a 208 DispReturn();
MAA 8:d6287c33b54a 209 DispLine("VB: ");
MAA 8:d6287c33b54a 210 DispLine(batteryvoltagearr);
MAA 8:d6287c33b54a 211 DispLocate(1,2);
MAA 8:d6287c33b54a 212 DispLine("GPS: ");
MAA 8:d6287c33b54a 213 if(GGA_Fix_Present){
MAA 8:d6287c33b54a 214 DispLine("Ok");
MAA 8:d6287c33b54a 215 }
MAA 8:d6287c33b54a 216 if(!GGA_Fix_Present){
MAA 8:d6287c33b54a 217 DispLine("No");
MAA 8:d6287c33b54a 218 }
MAA 8:d6287c33b54a 219 togglecount += 1;
MAA 8:d6287c33b54a 220
MAA 8:d6287c33b54a 221 if(togglecount >= 10){
MAA 8:d6287c33b54a 222 toggler = false;
MAA 8:d6287c33b54a 223 togglecount = 0;
MAA 8:d6287c33b54a 224 }
MAA 8:d6287c33b54a 225
MAA 8:d6287c33b54a 226 }
MAA 8:d6287c33b54a 227
MAA 10:eb026e023a3c 228 if((!toggler && missingGpsCnt < GPSACQTIMELIMITINSECONDS) || (!toggler && userNotifiedOfNoGGAFix)){
MAA 10:eb026e023a3c 229 //show magnT reading for 10 mag reading cycles
MAA 8:d6287c33b54a 230 memset(magnTarr, '\0', 15);
MAA 8:d6287c33b54a 231 ClearDisp();
MAA 8:d6287c33b54a 232 DispReturn();
MAA 8:d6287c33b54a 233 DispLine("nT: ");
MAA 8:d6287c33b54a 234 DispLocate(1,2);
MAA 8:d6287c33b54a 235
MAA 8:d6287c33b54a 236 sprintf(magnTarr, "%s",magParser.getMagNTStr().c_str());
MAA 8:d6287c33b54a 237
MAA 8:d6287c33b54a 238 DispLine(magnTarr);
MAA 8:d6287c33b54a 239
MAA 8:d6287c33b54a 240 togglecount += 1;
MAA 8:d6287c33b54a 241
MAA 8:d6287c33b54a 242 if(togglecount >= 10){
MAA 8:d6287c33b54a 243 toggler = true;
MAA 8:d6287c33b54a 244 togglecount = 0;
MAA 8:d6287c33b54a 245 }
MAA 8:d6287c33b54a 246
MAA 10:eb026e023a3c 247
MAA 8:d6287c33b54a 248 }
MAA 8:d6287c33b54a 249
MAA 10:eb026e023a3c 250
MAA 10:eb026e023a3c 251 //if gga fix is not present for a prolonged period of time, prompt user
MAA 10:eb026e023a3c 252 if((missingGpsCnt > GPSACQTIMELIMITINSECONDS) && !userNotifiedOfNoGGAFix){
MAA 10:eb026e023a3c 253
MAA 10:eb026e023a3c 254 //prompt user to set mag time in a 5 minute duration
MAA 10:eb026e023a3c 255 if(magTimePromptCount < 300){
MAA 10:eb026e023a3c 256 magTimePromptCount += 1;
MAA 10:eb026e023a3c 257
MAA 10:eb026e023a3c 258 //Prompt user to set mag time manually
MAA 10:eb026e023a3c 259 ClearDisp();
MAA 10:eb026e023a3c 260 DispReturn();
MAA 10:eb026e023a3c 261 DispLine("GPS Fix");
MAA 10:eb026e023a3c 262 DispLocate(1,2);
MAA 10:eb026e023a3c 263 DispLine("Error!");
MAA 10:eb026e023a3c 264
MAA 10:eb026e023a3c 265 }
MAA 10:eb026e023a3c 266
MAA 10:eb026e023a3c 267 if(magTimePromptCount >= 300 || magTimeSetManually){
MAA 10:eb026e023a3c 268 userNotifiedOfNoGGAFix = true;
MAA 10:eb026e023a3c 269 }
MAA 10:eb026e023a3c 270
MAA 10:eb026e023a3c 271
MAA 10:eb026e023a3c 272
MAA 10:eb026e023a3c 273 }
MAA 10:eb026e023a3c 274
MAA 10:eb026e023a3c 275
MAA 10:eb026e023a3c 276 //if gps data is missing for more than 60 mag reading cycles
MAA 10:eb026e023a3c 277 if(magCntWithoutGpsData > 60){
MAA 10:eb026e023a3c 278 //show error indication of gps data missing
MAA 8:d6287c33b54a 279 ClearDisp();
MAA 8:d6287c33b54a 280 DispReturn();
MAA 10:eb026e023a3c 281 DispLine("GPS data");
MAA 8:d6287c33b54a 282 DispLocate(1,2);
MAA 10:eb026e023a3c 283 DispLine("missing!");
MAA 10:eb026e023a3c 284
MAA 10:eb026e023a3c 285 redLed = 1;
MAA 10:eb026e023a3c 286 greenLed = 0;
MAA 10:eb026e023a3c 287 }
MAA 8:d6287c33b54a 288
MAA 8:d6287c33b54a 289 //generate default sps string
MAA 8:d6287c33b54a 290 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, magParser.getMagTimeStr(), magParser.getMagNTStr(), magParser.getMagSq(), &dbg);
MAA 8:d6287c33b54a 291
MAA 8:d6287c33b54a 292 //write data strings to sps file
MAA 8:d6287c33b54a 293 if(GGA_Fix_Present){
MAA 8:d6287c33b54a 294
MAA 8:d6287c33b54a 295 missingGpsCnt = 0;
MAA 8:d6287c33b54a 296
MAA 8:d6287c33b54a 297 if(!firstLineWritten){
MAA 8:d6287c33b54a 298 writeToUsb(spsGen.getHeaderString(), fp);
MAA 8:d6287c33b54a 299 firstLineWritten = true;
MAA 8:d6287c33b54a 300 }
MAA 8:d6287c33b54a 301
MAA 8:d6287c33b54a 302 writeToUsb(spsGen.getCurrentString(), fp);
MAA 8:d6287c33b54a 303
MAA 8:d6287c33b54a 304 if(!lastErrStatus && firstErrsWritten){
MAA 8:d6287c33b54a 305 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 306 writeToUsb(spsGen.getCurrentErrString(), fp);
MAA 8:d6287c33b54a 307 lastErrStatus = true;
MAA 8:d6287c33b54a 308 firstErrsWritten = false;
MAA 8:d6287c33b54a 309 firstLineWritten = false;
MAA 8:d6287c33b54a 310 }
MAA 8:d6287c33b54a 311 }
MAA 8:d6287c33b54a 312
MAA 8:d6287c33b54a 313 if(!GGA_Fix_Present){
MAA 8:d6287c33b54a 314
MAA 8:d6287c33b54a 315 if(missingGpsCnt <= GPSACQTIMELIMITINSECONDS){
MAA 8:d6287c33b54a 316 missingGpsCnt += 1;
MAA 8:d6287c33b54a 317 }
MAA 8:d6287c33b54a 318
MAA 8:d6287c33b54a 319 if(!firstLineWritten){
MAA 8:d6287c33b54a 320 writeToUsb(spsGen.getHeaderString(), fp);
MAA 8:d6287c33b54a 321 firstLineWritten = true;
MAA 8:d6287c33b54a 322 }
MAA 8:d6287c33b54a 323
MAA 8:d6287c33b54a 324 if(lastErrStatus && !firstErrsWritten){
MAA 8:d6287c33b54a 325 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 326 writeToUsb(spsGen.getCurrentErrString(), fp);
MAA 8:d6287c33b54a 327 lastErrStatus = false;
MAA 8:d6287c33b54a 328 firstErrsWritten = true;
MAA 8:d6287c33b54a 329 }
MAA 8:d6287c33b54a 330
MAA 10:eb026e023a3c 331 }
MAA 10:eb026e023a3c 332
MAA 10:eb026e023a3c 333 if(!timeSetManuallyButton){
MAA 10:eb026e023a3c 334 timeSetManuallyCount += 1;
MAA 10:eb026e023a3c 335
MAA 10:eb026e023a3c 336 if(timeSetManuallyCount > 3){
MAA 10:eb026e023a3c 337 magTimeSetManually = true;
MAA 10:eb026e023a3c 338 }
MAA 10:eb026e023a3c 339 }
MAA 10:eb026e023a3c 340
MAA 8:d6287c33b54a 341
MAA 8:d6287c33b54a 342 BMAG_Data_Rdy = false;
MAA 8:d6287c33b54a 343 }
MAA 8:d6287c33b54a 344
MAA 8:d6287c33b54a 345 if(GpsCntWithoutMagData > 20 && !magMissingPrompt){
MAA 8:d6287c33b54a 346
MAA 8:d6287c33b54a 347 //show error if mag data not present
MAA 8:d6287c33b54a 348 ClearDisp();
MAA 8:d6287c33b54a 349 DispReturn();
MAA 8:d6287c33b54a 350 DispLine("Mag data");
MAA 8:d6287c33b54a 351 DispLocate(1,2);
MAA 8:d6287c33b54a 352 DispLine("missing!");
MAA 8:d6287c33b54a 353
MAA 8:d6287c33b54a 354 redLed = 1;
MAA 8:d6287c33b54a 355 greenLed = 0;
MAA 8:d6287c33b54a 356 magMissingPrompt = true;
MAA 8:d6287c33b54a 357 }
MAA 8:d6287c33b54a 358
MAA 10:eb026e023a3c 359
MAA 10:eb026e023a3c 360
MAA 10:eb026e023a3c 361
MAA 8:d6287c33b54a 362 if(GPS_Data_Rdy){
MAA 8:d6287c33b54a 363
MAA 10:eb026e023a3c 364 //clear mag data string counter, counting mag data received since last gps string received
MAA 10:eb026e023a3c 365 magCntWithoutGpsData = 0;
MAA 10:eb026e023a3c 366
MAA 10:eb026e023a3c 367 //if gps data has been received without mag data since last gps string, increment counter.
MAA 8:d6287c33b54a 368 if(GpsCntWithoutMagData < 200){
MAA 8:d6287c33b54a 369
MAA 8:d6287c33b54a 370 GpsCntWithoutMagData += 1;
MAA 8:d6287c33b54a 371
MAA 8:d6287c33b54a 372 }
MAA 10:eb026e023a3c 373
MAA 0:b3313c5ffca3 374 gps.scanf("%s", &tmpGpsRxString);
MAA 0:b3313c5ffca3 375
MAA 0:b3313c5ffca3 376 //copy c_string to string
MAA 0:b3313c5ffca3 377 GPS_String_Buff.assign(tmpGpsRxString);
MAA 0:b3313c5ffca3 378
MAA 0:b3313c5ffca3 379 //clear tmpRxBuffer
MAA 0:b3313c5ffca3 380 memset(tmpGpsRxString,'\0',128);
MAA 0:b3313c5ffca3 381
MAA 0:b3313c5ffca3 382 //printing GPS string buffer
MAA 0:b3313c5ffca3 383 dbg.printf(GPS_String_Buff.c_str());
MAA 0:b3313c5ffca3 384 dbg.printf("\r\n");
MAA 5:11782a2008c2 385
MAA 0:b3313c5ffca3 386 //Validate CRC
MAA 5:11782a2008c2 387 GPS_Data_Valid = gpsNMEA.ValidateData(GPS_String_Buff);
MAA 0:b3313c5ffca3 388
MAA 0:b3313c5ffca3 389 //store valid string, either gga or rmc
MAA 0:b3313c5ffca3 390 if(GPS_Data_Valid){
MAA 2:39c4a85dc2a4 391 gpsNMEA.StoreString(GPS_String_Buff/*, &dbg*/);
MAA 0:b3313c5ffca3 392 }
MAA 0:b3313c5ffca3 393
MAA 5:11782a2008c2 394 //Get gga fix flag
MAA 2:39c4a85dc2a4 395 GGA_Fix_Present = gpsNMEA.GGAFixVerification();
MAA 0:b3313c5ffca3 396
MAA 7:872984a67d5b 397 //Assign value to error flag
MAA 7:872984a67d5b 398 spsGen.setErrStatus(GGA_Fix_Present);
MAA 7:872984a67d5b 399
MAA 0:b3313c5ffca3 400 //Clearing RX buffer.
MAA 0:b3313c5ffca3 401 GPS_String_Buff = "";
MAA 0:b3313c5ffca3 402 GPS_String_Buff.resize(128);
MAA 0:b3313c5ffca3 403
MAA 5:11782a2008c2 404 //parse current date
MAA 5:11782a2008c2 405 gpsNMEA.ParseCurrentDateFromGPRMC();
MAA 2:39c4a85dc2a4 406
MAA 5:11782a2008c2 407 //parse current time
MAA 5:11782a2008c2 408 gpsNMEA.ParseCurrentUTCFromGPRMC();
MAA 3:38eabaa92552 409
MAA 5:11782a2008c2 410 //parse gps coordinates
MAA 5:11782a2008c2 411 gpsNMEA.ParseCurrentLatitudeFromGPRMC();
MAA 5:11782a2008c2 412 gpsNMEA.ParseCurrentLongitudeFromGPRMC();
MAA 2:39c4a85dc2a4 413
MAA 0:b3313c5ffca3 414 //clearing flags
MAA 0:b3313c5ffca3 415 GPS_Data_Valid = false;
MAA 5:11782a2008c2 416 GPS_Data_Rdy = false;
MAA 8:d6287c33b54a 417
MAA 8:d6287c33b54a 418
MAA 8:d6287c33b54a 419
MAA 7:872984a67d5b 420
MAA 8:d6287c33b54a 421 if(!GGA_Fix_Present && GpsCntWithoutMagData < 20){
MAA 8:d6287c33b54a 422 //Missing GGA fix LED indicator
MAA 8:d6287c33b54a 423 greenLed = 0;
MAA 8:d6287c33b54a 424 redLed = 1;
MAA 7:872984a67d5b 425 }
MAA 7:872984a67d5b 426
MAA 7:872984a67d5b 427
MAA 10:eb026e023a3c 428 if((GGA_Fix_Present && GpsCntWithoutMagData < 20) || (magTimeSetManually && GpsCntWithoutMagData < 20)){
MAA 7:872984a67d5b 429
MAA 10:eb026e023a3c 430 //GGA fix LED indicator / time set manually
MAA 8:d6287c33b54a 431 greenLed = 1;
MAA 8:d6287c33b54a 432 redLed = 0;
MAA 8:d6287c33b54a 433
MAA 8:d6287c33b54a 434 }
MAA 7:872984a67d5b 435
MAA 7:872984a67d5b 436
MAA 5:11782a2008c2 437 }
MAA 5:11782a2008c2 438
MAA 0:b3313c5ffca3 439 //If connection to USB flash disk is lost, reconnect to the flash disk
MAA 0:b3313c5ffca3 440 if(!msd.connected()){
MAA 9:ddc774114729 441
MAA 9:ddc774114729 442 //USB message
MAA 9:ddc774114729 443 ClearDisp();
MAA 9:ddc774114729 444 DispReturn();
MAA 9:ddc774114729 445 DispLine("USB pen");
MAA 9:ddc774114729 446 DispLocate(1,2);
MAA 9:ddc774114729 447 DispLine("Missing!");
MAA 9:ddc774114729 448
MAA 0:b3313c5ffca3 449 //reestablish usb connection
MAA 0:b3313c5ffca3 450 while(!msd.connect()){
MAA 0:b3313c5ffca3 451 dbg.printf("Trying to reconnect to usb flash disk\r\n");
MAA 6:6d1683c8b26b 452 wait_ms(200);
MAA 6:6d1683c8b26b 453 msd.connect();
MAA 0:b3313c5ffca3 454 }
MAA 0:b3313c5ffca3 455
MAA 0:b3313c5ffca3 456 //Reopening a file on usb disk
MAA 5:11782a2008c2 457 fp = fopen(currentFilename.c_str(), "a");
MAA 7:872984a67d5b 458
MAA 7:872984a67d5b 459 writeToUsb("\r\n", fp);
MAA 7:872984a67d5b 460 writeToUsb(spsGen.getHeaderString(), fp);
MAA 10:eb026e023a3c 461
MAA 0:b3313c5ffca3 462 }
MAA 0:b3313c5ffca3 463
MAA 5:11782a2008c2 464
MAA 2:39c4a85dc2a4 465 //kick / feed watchdog
MAA 2:39c4a85dc2a4 466 wd.kick();
MAA 5:11782a2008c2 467
MAA 5:11782a2008c2 468 }
MAA 5:11782a2008c2 469
MAA 0:b3313c5ffca3 470 return 0;
MAA 0:b3313c5ffca3 471 }
MAA 0:b3313c5ffca3 472
MAA 0:b3313c5ffca3 473 //Thanks to MODSERIAL!
MAA 0:b3313c5ffca3 474 // Called everytime a new character goes into
MAA 0:b3313c5ffca3 475 // the RX buffer. Test that character for \n
MAA 0:b3313c5ffca3 476 // Note, rxGetLastChar() gets the last char that
MAA 0:b3313c5ffca3 477 // we received but it does NOT remove it from
MAA 0:b3313c5ffca3 478 // the RX buffer.
MAA 0:b3313c5ffca3 479 void rxCallback(MODSERIAL_IRQ_INFO *q) {
MAA 0:b3313c5ffca3 480 MODSERIAL *serial = q->serial;
MAA 6:6d1683c8b26b 481 if (serial->rxGetLastChar() == '\n') {
MAA 0:b3313c5ffca3 482 GPS_Data_Rdy = true;
MAA 0:b3313c5ffca3 483 }
MAA 5:11782a2008c2 484 }
MAA 5:11782a2008c2 485
MAA 8:d6287c33b54a 486 //Thanks to MODSERIAL!
MAA 8:d6287c33b54a 487 // Called everytime a new character goes into
MAA 8:d6287c33b54a 488 // the RX buffer. Test that character for \r and buffer char count
MAA 8:d6287c33b54a 489 // Note, rxGetLastChar() gets the last char that
MAA 8:d6287c33b54a 490 // we received but it does NOT remove it from
MAA 8:d6287c33b54a 491 // the RX buffer.
MAA 8:d6287c33b54a 492 void bmagrxCallback(MODSERIAL_IRQ_INFO *q) {
MAA 8:d6287c33b54a 493 MODSERIAL *serial = q->serial;
MAA 8:d6287c33b54a 494 if ((serial->rxBufferGetCount() > 20) && (serial->rxGetLastChar() == '\r')) {
MAA 8:d6287c33b54a 495 BMAG_Data_Rdy = true;
MAA 8:d6287c33b54a 496 }
MAA 8:d6287c33b54a 497 }
MAA 8:d6287c33b54a 498
MAA 7:872984a67d5b 499 //Write to file
MAA 6:6d1683c8b26b 500 bool writeToUsb(string line, FILE * f){
MAA 5:11782a2008c2 501
MAA 5:11782a2008c2 502 if (f != NULL) {
MAA 6:6d1683c8b26b 503
MAA 5:11782a2008c2 504 fprintf(f, "\r\n");
MAA 8:d6287c33b54a 505 fprintf(f, line.c_str());
MAA 8:d6287c33b54a 506
MAA 6:6d1683c8b26b 507 }
MAA 6:6d1683c8b26b 508
MAA 5:11782a2008c2 509 if(f == NULL){
MAA 5:11782a2008c2 510 return false;
MAA 5:11782a2008c2 511 }
MAA 5:11782a2008c2 512
MAA 5:11782a2008c2 513 return true;
MAA 5:11782a2008c2 514 }
MAA 5:11782a2008c2 515