Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
MAA
Date:
Thu May 11 13:42:32 2017 +0000
Revision:
21:325cb82f1838
Parent:
14:400ecb93c6a2
Child:
22:9f5955f051f5
Corrected crc value calculation failure; Corrected error with sps lines containing extra carriage returns and newlines.;

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