Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
MAA
Date:
Wed Aug 23 13:22:54 2017 +0000
Branch:
MbedBMAGThrRev
Revision:
27:efd122db8855
Parent:
26:68277a308839
Child:
28:ed0d29f63b55
ghi

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