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