Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed WDT MODSERIAL BME280
main.cpp@10:eb026e023a3c, 2017-03-27 (annotated)
- 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?
| User | Revision | Line number | New 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 |