this version has all of Jim's fixes for reading the GPS and IMU data synchronously

Dependencies:   MODSERIAL SDFileSystem mbed SDShell CRC CommHandler FP LinkedList LogUtil

Committer:
jekain314
Date:
Mon May 06 04:14:23 2013 +0000
Revision:
11:88efc6048237
Parent:
10:37ff5b97cf98
Child:
12:c2f60b3ceb74
some changes were made here...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jekain314 0:432b860b6ff7 1 //these are defines for the messages that are sent from the PC across the USB
jekain314 0:432b860b6ff7 2 //these messages produce reactions on the mbed
jekain314 6:71da5b99de97 3 const unsigned char POSVEL_MSG =0;
jekain314 6:71da5b99de97 4 const unsigned char FIRE_TRIGGER_MSG =1;
jekain314 11:88efc6048237 5 const unsigned char GETFILE_MSG =2; //used to initiate the retrieval of a SD card data file
jekain314 11:88efc6048237 6 const unsigned char STATUS_MSG =3;
jekain314 11:88efc6048237 7 const unsigned char STARTDATA_MSG =4;
jekain314 11:88efc6048237 8 const unsigned char STOPDATA_MSG =5;
jekain314 11:88efc6048237 9 const unsigned char STARTSTREAM_MSG =6;
jekain314 11:88efc6048237 10 const unsigned char STOPSTREAM_MSG =7;
jekain314 11:88efc6048237 11 const unsigned char STARTLOGINFO_MSG =8;
jekain314 11:88efc6048237 12 const unsigned char STOPLOGINFO_MSG =9;
jekain314 0:432b860b6ff7 13
jekain314 0:432b860b6ff7 14 const double DEGREES_TO_RADIANS = acos(-1.0)/180.0;
jekain314 0:432b860b6ff7 15 const double eccen = 0.0818191908426; //WGS84 earth eccentricity
jekain314 0:432b860b6ff7 16 const double earthRadius = 6378137; //WGS84 earthRadius in meters
jekain314 0:432b860b6ff7 17
jekain314 6:71da5b99de97 18 const unsigned short serBuffMax = 18;
jekain314 1:8e24e633f8d8 19 char serBuf[serBuffMax];
jekain314 0:432b860b6ff7 20 int serBufChars=0;
jekain314 0:432b860b6ff7 21
jekain314 0:432b860b6ff7 22 //flags to control the PC command actions
jekain314 0:432b860b6ff7 23 bool sendPosVel =false;
jekain314 0:432b860b6ff7 24 bool sendStatus =false;
jekain314 0:432b860b6ff7 25 bool sendRecData =false;
jekain314 0:432b860b6ff7 26 bool streamPos =false;
jekain314 0:432b860b6ff7 27 bool sendStreamPos =false;
jekain314 0:432b860b6ff7 28 bool logMsgInfo =false;
jekain314 0:432b860b6ff7 29 bool sendLogMsgInfo =false;
jekain314 0:432b860b6ff7 30 bool recordData =false;
jekain314 1:8e24e633f8d8 31 bool fireTrigger =false;
jekain314 9:893481b2e488 32 bool get_file_msg =false;
jekain314 0:432b860b6ff7 33
jekain314 0:432b860b6ff7 34
jekain314 9:893481b2e488 35 const unsigned char numMessages = 10; //number of potential messages
jekain314 0:432b860b6ff7 36 char msgList[numMessages][32]; //text array storing the command messages from the PC
jekain314 0:432b860b6ff7 37 char minMessageSize = 11; //minimum size of a text message
jekain314 0:432b860b6ff7 38 unsigned char CR = 0x0d; //ASCII Carriage Return
jekain314 0:432b860b6ff7 39 unsigned char LF = 0x0a; //ASCII Line Feed
jekain314 0:432b860b6ff7 40
jekain314 6:71da5b99de97 41 char preamble[5] = "WMsg";
jekain314 6:71da5b99de97 42 char testPreamble[5];
jekain314 6:71da5b99de97 43
jekain314 0:432b860b6ff7 44 void setUpMessages(void)
jekain314 0:432b860b6ff7 45 {
jekain314 0:432b860b6ff7 46 //set up the ASCII text records that are candidates to be passed from the PC
jekain314 0:432b860b6ff7 47 sprintf(msgList[STATUS_MSG], "WMsg STATUS");
jekain314 0:432b860b6ff7 48 sprintf(msgList[POSVEL_MSG], "WMsg POSVEL");
jekain314 0:432b860b6ff7 49 sprintf(msgList[STARTDATA_MSG], "WMsg RECORDDATA Y");
jekain314 0:432b860b6ff7 50 sprintf(msgList[STOPDATA_MSG], "WMsg RECORDDATA N");
jekain314 0:432b860b6ff7 51 sprintf(msgList[STARTSTREAM_MSG], "WMsg POSSTREAM Y");
jekain314 0:432b860b6ff7 52 sprintf(msgList[STOPSTREAM_MSG], "WMsg POSSTREAM N");
jekain314 0:432b860b6ff7 53 sprintf(msgList[STARTLOGINFO_MSG], "WMsg LOGINFO Y");
jekain314 0:432b860b6ff7 54 sprintf(msgList[STOPLOGINFO_MSG], "WMsg LOGINFO N");
jekain314 1:8e24e633f8d8 55 sprintf(msgList[FIRE_TRIGGER_MSG], "WMsg TRIGGER");
jekain314 9:893481b2e488 56 sprintf(msgList[GETFILE_MSG], "WMsg GETFILE");
jekain314 0:432b860b6ff7 57 //message length is from 10 to 16 chars
jekain314 0:432b860b6ff7 58
jekain314 6:71da5b99de97 59 // toPC.printf(" finished setting up messages \n");
jekain314 0:432b860b6ff7 60 }
jekain314 0:432b860b6ff7 61
jekain314 0:432b860b6ff7 62 void readFromPC()
jekain314 0:432b860b6ff7 63 {
jekain314 6:71da5b99de97 64 // should this be a while rather than if ??? -- may have multiple bytes in buffer
jekain314 9:893481b2e488 65 while (toPC.readable()) //read a PC serial byte and test it for a command
jekain314 0:432b860b6ff7 66 {
jekain314 6:71da5b99de97 67 // Read in next character -- why not read all available??
jekain314 1:8e24e633f8d8 68 unsigned char inChar = 0;
jekain314 6:71da5b99de97 69 inChar = toPC.getc(); //read char from the USB serial link to the PC
jekain314 0:432b860b6ff7 70 //toPC.printf("%02x ",inChar);
jekain314 0:432b860b6ff7 71
jekain314 0:432b860b6ff7 72 //incoming messages will end witb a CR / LF -- disregard these chars
jekain314 9:893481b2e488 73 if (inChar == CR || inChar == LF) continue; //CR is a 0x0a
jekain314 0:432b860b6ff7 74
jekain314 6:71da5b99de97 75 //all received messages assumed to have a WMsg preamble
jekain314 6:71da5b99de97 76 //if we have read 4 chars, test these for "WMsg", if they are not WMsg, reset the buffer counter
jekain314 6:71da5b99de97 77 //if we receive an occasional bad byte that messes up a message, this will resynch fast to a next message
jekain314 6:71da5b99de97 78 //this will let us miss a message --- but hopefully only one
jekain314 6:71da5b99de97 79
jekain314 6:71da5b99de97 80 // serBuffMax = 18 -- largest serBuffMax is 16 -- but we add one below for the '\0'
jekain314 6:71da5b99de97 81 // if the following occurs we have had a trash byte following a WMsg header
jekain314 6:71da5b99de97 82 if (serBufChars >= (serBuffMax-2)) {toPC.printf("WMsg restart message search\n"); serBufChars = 0; }
jekain314 6:71da5b99de97 83
jekain314 6:71da5b99de97 84 serBuf[serBufChars] = inChar; //set this char in a char array for testing complete message
jekain314 6:71da5b99de97 85
jekain314 6:71da5b99de97 86 testPreamble[serBufChars] = inChar; //char array for testing the preamble
jekain314 5:2ce1be9d4bef 87 serBufChars++;
jekain314 0:432b860b6ff7 88
jekain314 6:71da5b99de97 89 if (serBufChars == 4) //four initial chars detected (0, 1, 2, 3)
jekain314 6:71da5b99de97 90 {
jekain314 6:71da5b99de97 91 testPreamble[4] = '\0'; //form null-terminated string for compare
jekain314 6:71da5b99de97 92 if (strncmp(testPreamble, preamble, 5) != 0) //compare the chars to the WMsg preamble
jekain314 6:71da5b99de97 93 {
jekain314 6:71da5b99de97 94 toPC.printf("WMsg preamble mismatch \n");
jekain314 6:71da5b99de97 95 serBufChars = 0; //if they dont match -- restart the search for a preamble
jekain314 9:893481b2e488 96 continue;
jekain314 6:71da5b99de97 97 }
jekain314 10:37ff5b97cf98 98 //toPC.printf("WMsg found a message header \n");
jekain314 6:71da5b99de97 99 }
jekain314 6:71da5b99de97 100
jekain314 6:71da5b99de97 101 //if we get here, we have found a preamble and we are looking for a complete message
jekain314 0:432b860b6ff7 102 //no need to continue if numChars are less than the shortest candidate message
jekain314 9:893481b2e488 103 if (serBufChars < minMessageSize) continue;
jekain314 0:432b860b6ff7 104
jekain314 0:432b860b6ff7 105 // Append end of string
jekain314 6:71da5b99de97 106 // We always assume we have a complete message string and test for this below
jekain314 0:432b860b6ff7 107 serBuf[serBufChars] = '\0';
jekain314 0:432b860b6ff7 108
jekain314 0:432b860b6ff7 109 bool validMessage = false;
jekain314 0:432b860b6ff7 110
jekain314 0:432b860b6ff7 111 // Check for valid message -- there are numMessages possible messages
jekain314 6:71da5b99de97 112 //this assumes that the message buffer contains an exact message
jekain314 0:432b860b6ff7 113 for (int m = 0; m < numMessages && !validMessage; m++) //check for all messages ...
jekain314 0:432b860b6ff7 114 {
jekain314 0:432b860b6ff7 115 //toPC.printf(" \n\n found chars to test %3d %3d %s \n\n\n ", serBufChars, strlen(msgList[m]), serBuf );
jekain314 0:432b860b6ff7 116
jekain314 0:432b860b6ff7 117 //check the current partial message against ALL possible messages
jekain314 0:432b860b6ff7 118 //messages must match in both strength length and text
jekain314 0:432b860b6ff7 119 if (serBufChars == strlen(msgList[m]) && strncmp(serBuf, msgList[m], serBufChars) == 0 )
jekain314 0:432b860b6ff7 120 {
jekain314 0:432b860b6ff7 121
jekain314 0:432b860b6ff7 122 //toPC.printf( "\n found valid message %s \n\n", serBuf);
jekain314 1:8e24e633f8d8 123 rxMsg = !rxMsg;
jekain314 0:432b860b6ff7 124
jekain314 0:432b860b6ff7 125 validMessage = true;
jekain314 0:432b860b6ff7 126 serBufChars = 0; //reset the character count to reset for next message
jekain314 2:7039be3daf6e 127
jekain314 0:432b860b6ff7 128 //set programmatic action flags based on the message
jekain314 0:432b860b6ff7 129 switch(m)
jekain314 0:432b860b6ff7 130 {
jekain314 0:432b860b6ff7 131 case STATUS_MSG:
jekain314 0:432b860b6ff7 132 sendStatus = true; //send a status message back to PC
jekain314 9:893481b2e488 133 break;
jekain314 9:893481b2e488 134
jekain314 0:432b860b6ff7 135 case POSVEL_MSG:
jekain314 0:432b860b6ff7 136 sendPosVel = true; //send a posvel message back to PC
jekain314 2:7039be3daf6e 137 timeFromPosVelMessageReceipt.reset(); //start time and close SD card file if too long
jekain314 9:893481b2e488 138 break;
jekain314 9:893481b2e488 139
jekain314 0:432b860b6ff7 140 case STARTDATA_MSG: //start the data recording to the SD card
jekain314 0:432b860b6ff7 141 recordData = true;
jekain314 0:432b860b6ff7 142 sendRecData = true;
jekain314 0:432b860b6ff7 143 break;
jekain314 9:893481b2e488 144
jekain314 0:432b860b6ff7 145 case STOPDATA_MSG: //stop the data recording to the SD card
jekain314 0:432b860b6ff7 146 recordData = false;
jekain314 0:432b860b6ff7 147 sendRecData = true;
jekain314 0:432b860b6ff7 148 break;
jekain314 9:893481b2e488 149
jekain314 0:432b860b6ff7 150 case STARTSTREAM_MSG:
jekain314 0:432b860b6ff7 151 case STOPSTREAM_MSG:
jekain314 0:432b860b6ff7 152 streamPos = (m == STARTSTREAM_MSG);
jekain314 0:432b860b6ff7 153 sendStreamPos = true;
jekain314 9:893481b2e488 154 break;
jekain314 9:893481b2e488 155
jekain314 0:432b860b6ff7 156 case STARTLOGINFO_MSG:
jekain314 0:432b860b6ff7 157 case STOPLOGINFO_MSG:
jekain314 0:432b860b6ff7 158 logMsgInfo = (m == STARTLOGINFO_MSG);
jekain314 0:432b860b6ff7 159 sendLogMsgInfo = true;
jekain314 9:893481b2e488 160 break;
jekain314 9:893481b2e488 161
jekain314 1:8e24e633f8d8 162 case FIRE_TRIGGER_MSG:
jekain314 1:8e24e633f8d8 163 fireTrigger = true;
jekain314 6:71da5b99de97 164 toPC.printf("MBED received trigger command \n");
jekain314 9:893481b2e488 165 break;
jekain314 9:893481b2e488 166
jekain314 9:893481b2e488 167 case GETFILE_MSG:
jekain314 9:893481b2e488 168 get_file_msg = true;
jekain314 10:37ff5b97cf98 169 toPC.printf("MBED received GETFILE message \n");
jekain314 11:88efc6048237 170 break;
jekain314 9:893481b2e488 171
jekain314 0:432b860b6ff7 172 } //end Switch statement
jekain314 0:432b860b6ff7 173 break;
jekain314 0:432b860b6ff7 174 } //end test for a valid message
jekain314 6:71da5b99de97 175
jekain314 0:432b860b6ff7 176 } //end message text loop
jekain314 6:71da5b99de97 177
jekain314 0:432b860b6ff7 178 } //end pc.readable
jekain314 0:432b860b6ff7 179 };
jekain314 0:432b860b6ff7 180
jekain314 0:432b860b6ff7 181 void earthCoefficients(double latitudeRad, double longitudeRad, double height, double &latRateFac, double &lonRateFac)
jekain314 0:432b860b6ff7 182 {
jekain314 0:432b860b6ff7 183 //compute the lat and lon factors for use in the interpolation of the lat and lon between 1 sec epochs
jekain314 0:432b860b6ff7 184 //latRateFac & lonRateFac multiplied by Vnorth or VEast to get latRate and lonRate
jekain314 0:432b860b6ff7 185 //see this document (page 32) www.fas.org/spp/military/program/nav/basicnav.pdf
jekain314 0:432b860b6ff7 186
jekain314 0:432b860b6ff7 187 double eccenSinLat = eccen * sin(latitudeRad);
jekain314 0:432b860b6ff7 188 double temp1 = 1.0 - eccenSinLat*eccenSinLat;
jekain314 0:432b860b6ff7 189 double temp2 = sqrt(temp1);
jekain314 0:432b860b6ff7 190 double r_meridian = earthRadius * ( 1.0 - eccen*eccen)/ (temp1 * temp2);
jekain314 0:432b860b6ff7 191 double r_normal = earthRadius / temp2;
jekain314 0:432b860b6ff7 192
jekain314 0:432b860b6ff7 193 //divide Vnorth by latRateFac to get the latitude rate in deg per sec
jekain314 0:432b860b6ff7 194 latRateFac = (r_meridian + height)* DEGREES_TO_RADIANS;
jekain314 0:432b860b6ff7 195
jekain314 0:432b860b6ff7 196 //divide VEast by lonRateFac to get the longitude rate in deg per sec
jekain314 0:432b860b6ff7 197 lonRateFac = (r_normal + height) * cos(latitudeRad)* DEGREES_TO_RADIANS;
jekain314 0:432b860b6ff7 198 }
jekain314 0:432b860b6ff7 199
jekain314 0:432b860b6ff7 200 void sendPosVelMessageToPC(OEM615BESTPOS posMsg, OEM615BESTVEL velMsg)
jekain314 0:432b860b6ff7 201 {
jekain314 0:432b860b6ff7 202 //north and east velocity from the horizontal speed and heading
jekain314 0:432b860b6ff7 203 //velMsg may not be the "current" message --- but is the one also associated with a position message
jekain314 0:432b860b6ff7 204 double nVel = velMsg.horizontalSpeed*cos(velMsg.heading*DEGREES_TO_RADIANS);
jekain314 0:432b860b6ff7 205 double eVel = velMsg.horizontalSpeed*sin(velMsg.heading*DEGREES_TO_RADIANS);
jekain314 0:432b860b6ff7 206
jekain314 0:432b860b6ff7 207 double latRateFac;
jekain314 0:432b860b6ff7 208 double lonRateFac;
jekain314 0:432b860b6ff7 209
jekain314 0:432b860b6ff7 210 earthCoefficients( posMsg.latitude*DEGREES_TO_RADIANS,
jekain314 0:432b860b6ff7 211 posMsg.longitude*DEGREES_TO_RADIANS,
jekain314 0:432b860b6ff7 212 posMsg.height,
jekain314 0:432b860b6ff7 213 latRateFac, lonRateFac);
jekain314 0:432b860b6ff7 214
jekain314 0:432b860b6ff7 215 //commented calculations are for a spherical earth (Chris's original computation)
jekain314 0:432b860b6ff7 216 // For the 1 second deltas with which we are dealing
jekain314 0:432b860b6ff7 217 // This calculation should be close enough for now
jekain314 0:432b860b6ff7 218 // Approximately 1 nautical mile / minute latitude, 60 minutes/degree, 1852 meters/nautical mile
jekain314 0:432b860b6ff7 219 //double latMetersPerDeg = 60.0*1852.0;
jekain314 0:432b860b6ff7 220 // longitude separation is approximately equal to latitude separation * cosine of latitude
jekain314 0:432b860b6ff7 221 //double lonMetersPerDeg = latMetersPerDeg*cos(posMsg.latitude*DEGREES_TO_RADIANS);
jekain314 0:432b860b6ff7 222
jekain314 0:432b860b6ff7 223 // Elapsed time since last known GPS position
jekain314 0:432b860b6ff7 224 //PPSTimeOffset is a result of possibly missing a prior GPS position message
jekain314 0:432b860b6ff7 225 // timeFromPPS.read() is always the time from the moset recent 1PPS
jekain314 0:432b860b6ff7 226 double elTime = (double)PPSTimeOffset + timeFromPPS.read();
jekain314 0:432b860b6ff7 227
jekain314 0:432b860b6ff7 228 // Position time -- GPSTime is the time of the last valid GPS position message
jekain314 1:8e24e633f8d8 229 double posTime = GPSTimemsecs/1000 + elTime;
jekain314 0:432b860b6ff7 230
jekain314 0:432b860b6ff7 231 //toPC.printf(" elTime = %6.3f PPSimeOffset = %6.3f \n", elTime, PPSTimeOffset);
jekain314 0:432b860b6ff7 232 //toPC.printf(" latRateFac = %10.3f lonRateFac = %10.3f \n", latRateFac, lonRateFac);
jekain314 0:432b860b6ff7 233 //toPC.printf(" latRateFac = %10.3f lonRateFac = %10.3f \n", latMetersPerDeg, lonMetersPerDeg);
jekain314 0:432b860b6ff7 234
jekain314 0:432b860b6ff7 235 // Estimated position based on previous position and velocity
jekain314 0:432b860b6ff7 236 // posMsg is the last time when the BESTVEL and BESTPOS messages had identical times
jekain314 0:432b860b6ff7 237 //double latPos = posMsg.latitude + (nVel/latMetersPerDeg)*elTime;
jekain314 0:432b860b6ff7 238 //double lonPos = posMsg.longitude + (eVel/lonMetersPerDeg)*elTime;
jekain314 0:432b860b6ff7 239
jekain314 0:432b860b6ff7 240 double latPos = posMsg.latitude + (nVel/latRateFac)*elTime;
jekain314 0:432b860b6ff7 241 double lonPos = posMsg.longitude + (eVel/lonRateFac)*elTime;
jekain314 0:432b860b6ff7 242 double htPos = posMsg.height + velMsg.verticalSpeed/(60*1852)*elTime;
jekain314 0:432b860b6ff7 243
jekain314 0:432b860b6ff7 244 char solReady = 'N';
jekain314 0:432b860b6ff7 245 //solStatus
jekain314 0:432b860b6ff7 246 if (posMsg.solStatus == 0) //see description of solution status in OEMV615.h
jekain314 0:432b860b6ff7 247 {
jekain314 0:432b860b6ff7 248 solReady = 'Y';
jekain314 0:432b860b6ff7 249 }
jekain314 0:432b860b6ff7 250
jekain314 0:432b860b6ff7 251 toPC.printf("WMsg POSVEL %5.3lf %1d %c %8.5lf %9.5lf %4.3lf %4.3lf %4.3lf %4.3lf\n",
jekain314 0:432b860b6ff7 252 posTime,
jekain314 0:432b860b6ff7 253 posMsg.numSolSV,
jekain314 0:432b860b6ff7 254 solReady,
jekain314 0:432b860b6ff7 255 latPos,
jekain314 0:432b860b6ff7 256 lonPos,
jekain314 0:432b860b6ff7 257 htPos,
jekain314 0:432b860b6ff7 258 nVel,
jekain314 0:432b860b6ff7 259 eVel,
jekain314 0:432b860b6ff7 260 velMsg.verticalSpeed
jekain314 0:432b860b6ff7 261 );
jekain314 1:8e24e633f8d8 262 txMsg = !txMsg;
jekain314 0:432b860b6ff7 263 }
jekain314 0:432b860b6ff7 264
jekain314 0:432b860b6ff7 265 void processPCmessages(FILE* &fpNav, OEM615BESTPOS posMsg, OEM615BESTVEL velMsg)
jekain314 0:432b860b6ff7 266 {
jekain314 0:432b860b6ff7 267
jekain314 1:8e24e633f8d8 268
jekain314 1:8e24e633f8d8 269
jekain314 0:432b860b6ff7 270 //we should put the below stuff into the readPC() procedure.
jekain314 0:432b860b6ff7 271 //only do these actions in response to a command so no need for the tests w/o an inoput byte from the PC
jekain314 0:432b860b6ff7 272 //perform the activities as a response to the commands
jekain314 0:432b860b6ff7 273 if (sendPosVel) //true if we want to return a position solution
jekain314 0:432b860b6ff7 274 {
jekain314 2:7039be3daf6e 275 //if we are receiving POSVEL requests -- always open the file for storage and store the data
jekain314 2:7039be3daf6e 276 //th file is closed(in main) if we dont receive POSVAL messages for 60 secs
jekain314 2:7039be3daf6e 277 if (fpNav == NULL)
jekain314 2:7039be3daf6e 278 {
jekain314 6:71da5b99de97 279 toPC.printf("WMsg opening the SD card file \n");
jekain314 2:7039be3daf6e 280 fpNav = fopen("/sd/Data/NAV.bin", "wb");
jekain314 2:7039be3daf6e 281 wait_ms(10);
jekain314 2:7039be3daf6e 282 recordData = true;
jekain314 2:7039be3daf6e 283 }
jekain314 0:432b860b6ff7 284 sendPosVel=false; //set to true if a POSVEL is requested from the PC
jekain314 0:432b860b6ff7 285 sendPosVelMessageToPC(posMsg, velMsg);
jekain314 0:432b860b6ff7 286 }
jekain314 0:432b860b6ff7 287
jekain314 0:432b860b6ff7 288 //all this does is assess the GPS convergence -- really available in the above
jekain314 0:432b860b6ff7 289 if (sendStatus) //send the status message to the PC
jekain314 0:432b860b6ff7 290 {
jekain314 1:8e24e633f8d8 291 txMsg = !txMsg;
jekain314 0:432b860b6ff7 292 sendStatus=false;
jekain314 0:432b860b6ff7 293 char solReady = 'N';
jekain314 0:432b860b6ff7 294 //solStatus
jekain314 0:432b860b6ff7 295 if (posMsg.solStatus == 0) //see description of solution status in OEMV615.h
jekain314 0:432b860b6ff7 296 {
jekain314 0:432b860b6ff7 297 solReady = 'Y';
jekain314 0:432b860b6ff7 298 }
jekain314 0:432b860b6ff7 299 toPC.printf("WMsg STATUS %5.3lf %c\n",
jekain314 1:8e24e633f8d8 300 GPSTimemsecs,
jekain314 0:432b860b6ff7 301 solReady
jekain314 0:432b860b6ff7 302 );
jekain314 0:432b860b6ff7 303 }
jekain314 0:432b860b6ff7 304
jekain314 0:432b860b6ff7 305 //should just record ALL the data -- can pick over it in the post-processing
jekain314 0:432b860b6ff7 306 if (sendRecData) //begin to (or stop) record the serial data
jekain314 0:432b860b6ff7 307 {
jekain314 1:8e24e633f8d8 308 sendRecData=false; //reset the flag so we dont continue to come through here
jekain314 0:432b860b6ff7 309 char recChar = 'N';
jekain314 1:8e24e633f8d8 310 //recordData set to true only if we receive a STARTDATA from the PC
jekain314 1:8e24e633f8d8 311 if (recordData) //here we have received a message to record the data
jekain314 0:432b860b6ff7 312 {
jekain314 1:8e24e633f8d8 313 if ((fpNav == NULL)) //if file not opened -- open it
jekain314 0:432b860b6ff7 314 {
jekain314 1:8e24e633f8d8 315 toPC.printf(" opening the SD card file \n");
jekain314 0:432b860b6ff7 316 fpNav = fopen("/sd/Data/NAV.bin", "wb");
jekain314 2:7039be3daf6e 317 wait_ms(10);
jekain314 0:432b860b6ff7 318 }
jekain314 1:8e24e633f8d8 319 if (fpNav != NULL) //if the fie was already opened we will respond to the PC with a Y
jekain314 0:432b860b6ff7 320 {
jekain314 0:432b860b6ff7 321 recChar = 'Y';
jekain314 0:432b860b6ff7 322 }
jekain314 1:8e24e633f8d8 323 else //is the file was not opened we will write a message to the PC
jekain314 0:432b860b6ff7 324 {
jekain314 0:432b860b6ff7 325 toPC.printf(" Could not open the SD card \n\n");
jekain314 0:432b860b6ff7 326 }
jekain314 0:432b860b6ff7 327 }
jekain314 1:8e24e633f8d8 328 //recordData set to false only if we receive a STOPDATA from the PC
jekain314 1:8e24e633f8d8 329 else //here we have received a message to stop the recording
jekain314 0:432b860b6ff7 330 {
jekain314 1:8e24e633f8d8 331 if (fpNav != NULL) //if the file is open -- close it
jekain314 0:432b860b6ff7 332 {
jekain314 0:432b860b6ff7 333 toPC.printf(" closing the SD card file \n\n");
jekain314 1:8e24e633f8d8 334 fflush(fpNav);
jekain314 0:432b860b6ff7 335 fclose(fpNav);
jekain314 1:8e24e633f8d8 336 wait_ms(1000);
jekain314 0:432b860b6ff7 337 //toPC.printf("\n after closing the SD card file \n\n");
jekain314 0:432b860b6ff7 338 fpNav = NULL;
jekain314 0:432b860b6ff7 339 }
jekain314 1:8e24e633f8d8 340 //if stop recording received and the file is already closed -- just do nothing
jekain314 1:8e24e633f8d8 341 recordData = false;
jekain314 1:8e24e633f8d8 342
jekain314 0:432b860b6ff7 343 }
jekain314 0:432b860b6ff7 344 toPC.printf("WMsg RECORDDATA %c\n",
jekain314 0:432b860b6ff7 345 recChar
jekain314 0:432b860b6ff7 346 );
jekain314 0:432b860b6ff7 347 }
jekain314 0:432b860b6ff7 348
jekain314 10:37ff5b97cf98 349 if (get_file_msg) //terminate all data recording, close the data file, and exit the while(1) loop
jekain314 10:37ff5b97cf98 350 {
jekain314 10:37ff5b97cf98 351 if (fpNav != NULL) //if the file is open -- close it
jekain314 10:37ff5b97cf98 352 {
jekain314 10:37ff5b97cf98 353 toPC.printf(" closing the SD card file \n\n");
jekain314 10:37ff5b97cf98 354 fflush(fpNav);
jekain314 10:37ff5b97cf98 355 fclose(fpNav);
jekain314 10:37ff5b97cf98 356 wait_ms(1000);
jekain314 10:37ff5b97cf98 357 //toPC.printf("\n after closing the SD card file \n\n");
jekain314 10:37ff5b97cf98 358 fpNav = NULL;
jekain314 10:37ff5b97cf98 359 }
jekain314 10:37ff5b97cf98 360 recordData = false;
jekain314 10:37ff5b97cf98 361 }
jekain314 10:37ff5b97cf98 362
jekain314 0:432b860b6ff7 363 if (sendStreamPos) //stream the position data to the PC
jekain314 0:432b860b6ff7 364 {
jekain314 0:432b860b6ff7 365 sendStreamPos=false;
jekain314 0:432b860b6ff7 366 char streamChar = 'N';
jekain314 0:432b860b6ff7 367 if (streamPos)
jekain314 0:432b860b6ff7 368 {
jekain314 0:432b860b6ff7 369 streamChar = 'Y';
jekain314 0:432b860b6ff7 370 }
jekain314 0:432b860b6ff7 371 toPC.printf("WMsg POSSTREAM %c\n",
jekain314 0:432b860b6ff7 372 streamChar
jekain314 0:432b860b6ff7 373 );
jekain314 0:432b860b6ff7 374 }
jekain314 0:432b860b6ff7 375
jekain314 0:432b860b6ff7 376 //not sure this is ever used ..
jekain314 0:432b860b6ff7 377 if (sendLogMsgInfo) //send log info to the PC
jekain314 0:432b860b6ff7 378 {
jekain314 0:432b860b6ff7 379 sendLogMsgInfo=false;
jekain314 0:432b860b6ff7 380 char logChar = 'N';
jekain314 0:432b860b6ff7 381 if (logMsgInfo)
jekain314 0:432b860b6ff7 382 {
jekain314 0:432b860b6ff7 383 logChar = 'Y';
jekain314 0:432b860b6ff7 384 }
jekain314 0:432b860b6ff7 385 toPC.printf("WMsg LOGINFO %c\n",
jekain314 0:432b860b6ff7 386 logChar
jekain314 0:432b860b6ff7 387 );
jekain314 0:432b860b6ff7 388 }
jekain314 0:432b860b6ff7 389
jekain314 0:432b860b6ff7 390
jekain314 0:432b860b6ff7 391 }