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:
Sun May 19 16:26:28 2013 +0000
Revision:
22:1cbdbc856660
Parent:
20:3f04a0bde484
Child:
24:353322495742
added WMsg to all messages to PC to improve startup. Blink LEDs on 1PPS to indicate main loop activity

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