Bmag incl gps rettelse
Dependencies: mbed WDT MODSERIAL BME280
main.cpp@21:325cb82f1838, 2017-05-11 (annotated)
- 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?
User | Revision | Line number | New 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 |