Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
MAA
Date:
Tue Aug 15 13:41:07 2017 +0000
Revision:
26:68277a308839
Parent:
25:57f9e3273979
Child:
27:efd122db8855
Child:
56:df9052e3808c
Documentation updated

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