Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

Committer:
gert_lauritsen
Date:
Mon Jul 01 12:32:05 2019 +0000
Branch:
MbedBMAGThrRev
Revision:
60:f7c351583a2f
Parent:
58:6545ef27c228
rette data string

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MAA 0:b3313c5ffca3 1 #include "NMEA.h"
MAA 0:b3313c5ffca3 2
MAA 18:87f243168f05 3 //! NMEA, default constructor
MAA 0:b3313c5ffca3 4 NMEA::NMEA(){
MAA 0:b3313c5ffca3 5
MAA 0:b3313c5ffca3 6 currentGGAString.resize(128);
MAA 0:b3313c5ffca3 7 currentGPRMCString.resize(128);
MAA 0:b3313c5ffca3 8 currentUTCFromGPRMC.resize(20);
MAA 0:b3313c5ffca3 9 currentDATEFromGPRMC.resize(10);
MAA 4:c70ef089a3fd 10 currentLongitude.resize(15);
MAA 4:c70ef089a3fd 11 currentLatitude.resize(15);
MAA 0:b3313c5ffca3 12
MAA 30:072e918663b8 13 currentLongitude = "NaN";
MAA 30:072e918663b8 14 currentLatitude = "NaN";
MAA 30:072e918663b8 15
MAA 0:b3313c5ffca3 16 chkSumGps.resize(2);
MAA 4:c70ef089a3fd 17
MAA 4:c70ef089a3fd 18 memset(tmpArrDeg,'\0',7);
MAA 4:c70ef089a3fd 19 memset(tmpArrMin, '\0', 7);
MAA 4:c70ef089a3fd 20 memset(tmpLongitude, '\0', 15);
MAA 4:c70ef089a3fd 21 memset(tmpLatitude, '\0', 15);
MAA 0:b3313c5ffca3 22
MAA 4:c70ef089a3fd 23 iterationIndex = 0;
MAA 4:c70ef089a3fd 24 longitudeDD = 0.0;
MAA 4:c70ef089a3fd 25 latitudeDD = 0.0;
MAA 4:c70ef089a3fd 26
MAA 34:c6c5e7ec9163 27 cnt_GPRMC = 0;
MAA 34:c6c5e7ec9163 28
MAA 4:c70ef089a3fd 29 north = false;
MAA 4:c70ef089a3fd 30 south = false;
MAA 4:c70ef089a3fd 31 east = false;
MAA 4:c70ef089a3fd 32 west = false;
MAA 0:b3313c5ffca3 33 };
MAA 0:b3313c5ffca3 34
MAA 18:87f243168f05 35 //! ValidateData, method taking a text string for NMEA validation
MAA 18:87f243168f05 36 /*!
MAA 18:87f243168f05 37 ValidateData validates that the NMEA data string isn't corrupted.
MAA 18:87f243168f05 38 (Verification of crc)
MAA 18:87f243168f05 39
MAA 18:87f243168f05 40 \param cstStr An NMEA ascii string.
MAA 18:87f243168f05 41 \return boolean return value, true if crc corresponds to own calculated crc, else false.
MAA 18:87f243168f05 42 */
MAA 4:c70ef089a3fd 43 bool NMEA::ValidateData(string cstStr){
MAA 0:b3313c5ffca3 44
MAA 0:b3313c5ffca3 45 //Temporary variables used locally only
MAA 0:b3313c5ffca3 46 chkSum = 0;
MAA 0:b3313c5ffca3 47
MAA 0:b3313c5ffca3 48 //If for some reason the index is wrong, and the first character is not
MAA 0:b3313c5ffca3 49 //the beginning dollar sign of a gps string, return false at once.
MAA 0:b3313c5ffca3 50 if(cstStr[0] != '$'){
MAA 0:b3313c5ffca3 51 return false;
MAA 0:b3313c5ffca3 52 }
MAA 0:b3313c5ffca3 53
MAA 0:b3313c5ffca3 54 iterationIndex = 0;
MAA 0:b3313c5ffca3 55
MAA 0:b3313c5ffca3 56 //initializing calculated checksum
MAA 0:b3313c5ffca3 57 chkSumGps = " ";
MAA 0:b3313c5ffca3 58
MAA 0:b3313c5ffca3 59 //Calculating checksum to verify string integrity
MAA 0:b3313c5ffca3 60 for(char i = 1; i < cstStr.size(); i++){
MAA 0:b3313c5ffca3 61 //If at end of line for crc check, break
MAA 0:b3313c5ffca3 62 if(cstStr[i] == '*' || cstStr[i] == '\0'){
MAA 0:b3313c5ffca3 63 iterationIndex = i;
MAA 0:b3313c5ffca3 64 break;
MAA 0:b3313c5ffca3 65 }
MAA 0:b3313c5ffca3 66 //XOR crc calculation
MAA 0:b3313c5ffca3 67 chkSum ^= cstStr[i];
MAA 0:b3313c5ffca3 68
MAA 0:b3313c5ffca3 69 }
MAA 0:b3313c5ffca3 70
MAA 0:b3313c5ffca3 71 //Moving the checksum received into chkSumGps
MAA 0:b3313c5ffca3 72 iterationIndex++;
MAA 0:b3313c5ffca3 73 chkSumGps[0] = cstStr[iterationIndex];
MAA 0:b3313c5ffca3 74 iterationIndex++;
MAA 0:b3313c5ffca3 75 chkSumGps[1] = cstStr[iterationIndex];
MAA 0:b3313c5ffca3 76
MAA 0:b3313c5ffca3 77 GpsCheck = strtol(chkSumGps.c_str(), NULL ,16);
MAA 0:b3313c5ffca3 78
MAA 0:b3313c5ffca3 79 //Verify received and calculated crc equality
MAA 0:b3313c5ffca3 80 if(GpsCheck == chkSum){
MAA 0:b3313c5ffca3 81 return true;
MAA 0:b3313c5ffca3 82 }
MAA 0:b3313c5ffca3 83
MAA 0:b3313c5ffca3 84 //If unequal crc bytes found return false
MAA 0:b3313c5ffca3 85 return false;
MAA 0:b3313c5ffca3 86 };
MAA 0:b3313c5ffca3 87
MAA 18:87f243168f05 88 //! StoreString, method taking a text string as argument for further handling
MAA 18:87f243168f05 89 /*!
MAA 18:87f243168f05 90 StoreString, replaces current GPRMC or GGA string, with new valid GPRMC or GGA string.
MAA 0:b3313c5ffca3 91
MAA 18:87f243168f05 92 \param cstStr An NMEA ascii string.
MAA 18:87f243168f05 93 */
MAA 3:38eabaa92552 94 void NMEA::StoreString(string cstStr){
MAA 0:b3313c5ffca3 95 static std::string gga = "$GPGGA";
MAA 0:b3313c5ffca3 96 static std::string rmc = "$GPRMC";
MAA 0:b3313c5ffca3 97
MAA 0:b3313c5ffca3 98 //If received string is a GPGGA string
MAA 0:b3313c5ffca3 99 //copy GPGGA string to currentGGAString
MAA 0:b3313c5ffca3 100 if(cstStr.compare(0, 6, gga) == 0){
MAA 3:38eabaa92552 101
MAA 0:b3313c5ffca3 102 //replace current valid gga string with new valid gga string
MAA 3:38eabaa92552 103 currentGGAString.replace(0, 128, cstStr);
MAA 3:38eabaa92552 104
MAA 0:b3313c5ffca3 105 }
MAA 0:b3313c5ffca3 106
MAA 0:b3313c5ffca3 107 //If received string is a GPRMC string
MAA 0:b3313c5ffca3 108 //copy GPRMC string to currentGPRMCString
MAA 0:b3313c5ffca3 109 if(cstStr.compare(0, 6, rmc) == 0){
MAA 3:38eabaa92552 110
MAA 34:c6c5e7ec9163 111 if(cnt_GPRMC > 1000){
MAA 34:c6c5e7ec9163 112 cnt_GPRMC = 0;
MAA 34:c6c5e7ec9163 113 }
MAA 34:c6c5e7ec9163 114 cnt_GPRMC += 1;
MAA 34:c6c5e7ec9163 115
MAA 0:b3313c5ffca3 116 //replace current valid rmc string with new valid rmc string
MAA 0:b3313c5ffca3 117 currentGPRMCString.replace(0, 128, cstStr);
MAA 3:38eabaa92552 118
MAA 0:b3313c5ffca3 119 }
MAA 0:b3313c5ffca3 120
MAA 0:b3313c5ffca3 121 };
MAA 0:b3313c5ffca3 122
MAA 0:b3313c5ffca3 123
MAA 18:87f243168f05 124 //! ParseCurrentUTCFromGPRMC, grabs UTC timestamp from current stored GPRMC string.
MAA 18:87f243168f05 125 /*!
MAA 18:87f243168f05 126 ParseCurrentUTCFromGPRMC, grabs UTC timestamp from current stored GPRMC string.
MAA 18:87f243168f05 127 Stores the UTC timestamp in local text string.
MAA 18:87f243168f05 128
MAA 18:87f243168f05 129 Depending on the format it will be saved as:
MAA 18:87f243168f05 130 HH:MM:SS.FFF
MAA 18:87f243168f05 131 In this case FFF are read values fom the string.
MAA 18:87f243168f05 132 eg. 14:10:22.007
MAA 18:87f243168f05 133
MAA 18:87f243168f05 134 or
MAA 18:87f243168f05 135
MAA 18:87f243168f05 136 HH:MM:SS.FFF
MAA 18:87f243168f05 137 In this case FFF are predetermined values set to 0.
MAA 18:87f243168f05 138 eg. 14:10:22.000
MAA 18:87f243168f05 139 */
MAA 4:c70ef089a3fd 140 void NMEA::ParseCurrentUTCFromGPRMC(){
MAA 0:b3313c5ffca3 141
MAA 28:ed0d29f63b55 142 //getting utc from GPRMC string, assigned to tmpStr
MAA 4:c70ef089a3fd 143 getXFromNMEAString(1,currentGPRMCString);
MAA 2:39c4a85dc2a4 144
MAA 2:39c4a85dc2a4 145 currentUTCFromGPRMC = "";
MAA 2:39c4a85dc2a4 146 currentUTCFromGPRMC.resize(20);
MAA 2:39c4a85dc2a4 147
MAA 2:39c4a85dc2a4 148 //if time format == 10 characters
MAA 28:ed0d29f63b55 149 if(strlen(tmpStr.c_str()) > 6){
MAA 2:39c4a85dc2a4 150
MAA 2:39c4a85dc2a4 151 //HH
MAA 2:39c4a85dc2a4 152 currentUTCFromGPRMC[0] = tmpStr[0];
MAA 2:39c4a85dc2a4 153 currentUTCFromGPRMC[1] = tmpStr[1];
MAA 2:39c4a85dc2a4 154 currentUTCFromGPRMC[2] = ':';
MAA 2:39c4a85dc2a4 155
MAA 2:39c4a85dc2a4 156 //MM
MAA 2:39c4a85dc2a4 157 currentUTCFromGPRMC[3] = tmpStr[2];
MAA 2:39c4a85dc2a4 158 currentUTCFromGPRMC[4] = tmpStr[3];
MAA 2:39c4a85dc2a4 159 currentUTCFromGPRMC[5] = ':';
MAA 2:39c4a85dc2a4 160
MAA 2:39c4a85dc2a4 161 //SS
MAA 2:39c4a85dc2a4 162 currentUTCFromGPRMC[6] = tmpStr[4];
MAA 2:39c4a85dc2a4 163 currentUTCFromGPRMC[7] = tmpStr[5];
MAA 2:39c4a85dc2a4 164 currentUTCFromGPRMC[8] = '.';
MAA 2:39c4a85dc2a4 165
MAA 2:39c4a85dc2a4 166 //FFF
MAA 2:39c4a85dc2a4 167 currentUTCFromGPRMC[9] = tmpStr[7];
MAA 2:39c4a85dc2a4 168 currentUTCFromGPRMC[10] = tmpStr[8];
MAA 2:39c4a85dc2a4 169 currentUTCFromGPRMC[11] = tmpStr[9];
MAA 2:39c4a85dc2a4 170 }
MAA 2:39c4a85dc2a4 171
MAA 2:39c4a85dc2a4 172 //if time format == 6 characters
MAA 2:39c4a85dc2a4 173 if(strlen(tmpStr.c_str()) == 6){
MAA 2:39c4a85dc2a4 174
MAA 2:39c4a85dc2a4 175 //HH
MAA 2:39c4a85dc2a4 176 currentUTCFromGPRMC[0] = tmpStr[0];
MAA 2:39c4a85dc2a4 177 currentUTCFromGPRMC[1] = tmpStr[1];
MAA 2:39c4a85dc2a4 178 currentUTCFromGPRMC[2] = ':';
MAA 2:39c4a85dc2a4 179
MAA 2:39c4a85dc2a4 180 //MM
MAA 2:39c4a85dc2a4 181 currentUTCFromGPRMC[3] = tmpStr[2];
MAA 2:39c4a85dc2a4 182 currentUTCFromGPRMC[4] = tmpStr[3];
MAA 2:39c4a85dc2a4 183 currentUTCFromGPRMC[5] = ':';
MAA 2:39c4a85dc2a4 184
MAA 2:39c4a85dc2a4 185 //SS
MAA 2:39c4a85dc2a4 186 currentUTCFromGPRMC[6] = tmpStr[4];
MAA 2:39c4a85dc2a4 187 currentUTCFromGPRMC[7] = tmpStr[5];
MAA 2:39c4a85dc2a4 188 currentUTCFromGPRMC[8] = '.';
MAA 2:39c4a85dc2a4 189
MAA 2:39c4a85dc2a4 190 //FFF
MAA 2:39c4a85dc2a4 191 currentUTCFromGPRMC[9] = '0';
MAA 2:39c4a85dc2a4 192 currentUTCFromGPRMC[10] = '0';
MAA 2:39c4a85dc2a4 193 currentUTCFromGPRMC[11] = '0';
MAA 2:39c4a85dc2a4 194 }
MAA 0:b3313c5ffca3 195
MAA 0:b3313c5ffca3 196 };
MAA 0:b3313c5ffca3 197
MAA 18:87f243168f05 198 //! ParseCurrentDateFromGPRMC, grabs current date from current GPRMC string.
MAA 18:87f243168f05 199 /*!
MAA 18:87f243168f05 200 ParseCurrentDateFromGPRMC, grabs current date from current GPRMC string.
MAA 18:87f243168f05 201 Stores the Date in a local text string.
MAA 18:87f243168f05 202
MAA 18:87f243168f05 203 will be stored in the format:
MAA 18:87f243168f05 204 YYYY/MM/DD
MAA 18:87f243168f05 205 */
gert_lauritsen 58:6545ef27c228 206 int strtoint(string str, int index) {
gert_lauritsen 58:6545ef27c228 207 char value[3];
gert_lauritsen 58:6545ef27c228 208 value[0]=str[index];
gert_lauritsen 58:6545ef27c228 209 value[1]=str[index+1];
gert_lauritsen 58:6545ef27c228 210 value[2]=0;
gert_lauritsen 58:6545ef27c228 211 return atoi(value);
gert_lauritsen 58:6545ef27c228 212 }
gert_lauritsen 58:6545ef27c228 213
MAA 4:c70ef089a3fd 214 void NMEA::ParseCurrentDateFromGPRMC(){
MAA 2:39c4a85dc2a4 215
MAA 2:39c4a85dc2a4 216 //Getting date from GPRMC string, assigning to tmpStr
MAA 4:c70ef089a3fd 217 getXFromNMEAString(9,currentGPRMCString);
gert_lauritsen 58:6545ef27c228 218
MAA 2:39c4a85dc2a4 219 currentDATEFromGPRMC = "";
MAA 2:39c4a85dc2a4 220 currentDATEFromGPRMC.resize(20);
gert_lauritsen 58:6545ef27c228 221 char tmpdate[20];
MAA 2:39c4a85dc2a4 222 //if date string is the expected length
MAA 2:39c4a85dc2a4 223 if(strlen(tmpStr.c_str()) == 6){
gert_lauritsen 58:6545ef27c228 224 int y=strtoint(tmpStr,4);
gert_lauritsen 58:6545ef27c228 225 int m=strtoint(tmpStr,2);
gert_lauritsen 58:6545ef27c228 226 int d=strtoint(tmpStr,0);
gert_lauritsen 58:6545ef27c228 227 struct tm t = { .tm_year=y, .tm_mon=m-1, .tm_mday=d };
gert_lauritsen 58:6545ef27c228 228 t.tm_mday += 1024*7; //rollover compentation
gert_lauritsen 58:6545ef27c228 229 mktime(&t);
gert_lauritsen 60:f7c351583a2f 230 strftime (tmpdate,20,"%G/%m/%d",&t);
gert_lauritsen 58:6545ef27c228 231 for (int i=0; i<20; i++) currentDATEFromGPRMC[i]=tmpdate[i];
MAA 3:38eabaa92552 232 }
MAA 0:b3313c5ffca3 233 };
MAA 0:b3313c5ffca3 234
MAA 55:06c5f76e1a8c 235 //! ParseCUrrentAltitudeFromGGA, grabs current altitude from current GGA string.
MAA 55:06c5f76e1a8c 236 /*!
MAA 55:06c5f76e1a8c 237 ParseCUrrentAltitudeFromGGA, grabs current altitude from current GGA string.
MAA 55:06c5f76e1a8c 238 Stores the Altitude in a local string.
MAA 55:06c5f76e1a8c 239 */
MAA 55:06c5f76e1a8c 240 void NMEA::ParseCurrentAltitudeFromGGA(void){
MAA 55:06c5f76e1a8c 241 //Getting date from GPRMC string, assigning to tmpStr
MAA 55:06c5f76e1a8c 242 getXFromNMEAString(9, currentGGAString);
MAA 55:06c5f76e1a8c 243
MAA 55:06c5f76e1a8c 244 if(GGAFixVerification()){
MAA 55:06c5f76e1a8c 245 currentAltitude = tmpStr;
MAA 55:06c5f76e1a8c 246 }
MAA 55:06c5f76e1a8c 247 else{
MAA 55:06c5f76e1a8c 248 currentAltitude = "NaN";
MAA 55:06c5f76e1a8c 249 }
MAA 55:06c5f76e1a8c 250
MAA 55:06c5f76e1a8c 251
MAA 55:06c5f76e1a8c 252
MAA 55:06c5f76e1a8c 253 };
MAA 55:06c5f76e1a8c 254
MAA 18:87f243168f05 255
MAA 18:87f243168f05 256 //! GGAFixVerification, returns gps fix indication.
MAA 18:87f243168f05 257 /*!
MAA 18:87f243168f05 258 GGAFixVerification verifies gga fix status in current GGA string.
MAA 18:87f243168f05 259
MAA 18:87f243168f05 260 \return boolean value indicating GGA fix if true, else false.
MAA 18:87f243168f05 261 */
MAA 3:38eabaa92552 262 bool NMEA::GGAFixVerification(){
MAA 3:38eabaa92552 263
MAA 0:b3313c5ffca3 264 //accessing the string after the sixth comma, which is the gga fix column
MAA 0:b3313c5ffca3 265
MAA 0:b3313c5ffca3 266 char commaCount = 0;
MAA 0:b3313c5ffca3 267 char index = 0;
MAA 5:11782a2008c2 268 char stringLength = strlen(currentGGAString.c_str());
MAA 0:b3313c5ffca3 269
MAA 5:11782a2008c2 270 while((commaCount < 7) && (currentGGAString[index] != '\0') && (index < stringLength) ){
MAA 0:b3313c5ffca3 271 if(currentGGAString[index] == ','){
MAA 0:b3313c5ffca3 272 commaCount += 1;
MAA 0:b3313c5ffca3 273 }
MAA 0:b3313c5ffca3 274
MAA 0:b3313c5ffca3 275
MAA 0:b3313c5ffca3 276 //if gga fix is 1 or 2, gga fix is sufficient, return true
MAA 0:b3313c5ffca3 277 if(commaCount == 6){
MAA 0:b3313c5ffca3 278 if(currentGGAString[index+1] == '1'){
MAA 0:b3313c5ffca3 279 return true;
MAA 0:b3313c5ffca3 280 }
MAA 0:b3313c5ffca3 281
MAA 0:b3313c5ffca3 282 if(currentGGAString[index+1] == '2'){
MAA 0:b3313c5ffca3 283 return true;
MAA 0:b3313c5ffca3 284 }
MAA 0:b3313c5ffca3 285
MAA 0:b3313c5ffca3 286 break;
MAA 0:b3313c5ffca3 287 }
MAA 0:b3313c5ffca3 288
MAA 0:b3313c5ffca3 289 index += 1;
MAA 0:b3313c5ffca3 290
MAA 0:b3313c5ffca3 291 }
MAA 3:38eabaa92552 292
MAA 3:38eabaa92552 293 return false;
MAA 3:38eabaa92552 294 };
MAA 3:38eabaa92552 295
MAA 18:87f243168f05 296 //! ParseCurrentLatitudeFromGPRMC, grabs current latitude from current GPRMC string.
MAA 18:87f243168f05 297 /*!
MAA 18:87f243168f05 298 Converts the latitude into decimaldegrees and stores the current latitude.
MAA 18:87f243168f05 299 */
MAA 4:c70ef089a3fd 300 void NMEA::ParseCurrentLatitudeFromGPRMC(){
MAA 0:b3313c5ffca3 301
MAA 4:c70ef089a3fd 302 north = false;
MAA 4:c70ef089a3fd 303 south = false;
MAA 4:c70ef089a3fd 304
MAA 4:c70ef089a3fd 305 memset(tmpArrDeg,'\0',7);
MAA 4:c70ef089a3fd 306 memset(tmpArrMin, '\0', 7);
MAA 4:c70ef089a3fd 307 memset(tmpLatitude, '\0', 15);
MAA 3:38eabaa92552 308 currentLatitude = "";
MAA 3:38eabaa92552 309 currentLatitude.resize(20);
MAA 3:38eabaa92552 310
MAA 4:c70ef089a3fd 311
MAA 4:c70ef089a3fd 312 //Getting Latitude from GPRMC string, assigning to tmpStr
MAA 4:c70ef089a3fd 313 getXFromNMEAString(3,currentGPRMCString);
MAA 4:c70ef089a3fd 314
MAA 4:c70ef089a3fd 315 tmpArrDeg[0] = tmpStr[0];
MAA 4:c70ef089a3fd 316 tmpArrDeg[1] = tmpStr[1];
MAA 3:38eabaa92552 317
MAA 4:c70ef089a3fd 318 tmpArrMin[0] = tmpStr[2];
MAA 4:c70ef089a3fd 319 tmpArrMin[1] = tmpStr[3];
MAA 4:c70ef089a3fd 320 tmpArrMin[2] = tmpStr[4];
MAA 4:c70ef089a3fd 321 tmpArrMin[3] = tmpStr[5];
MAA 4:c70ef089a3fd 322 tmpArrMin[4] = tmpStr[6];
MAA 4:c70ef089a3fd 323
MAA 3:38eabaa92552 324 //getting N/S
MAA 5:11782a2008c2 325 getXFromNMEAString(4,currentGPRMCString);
MAA 4:c70ef089a3fd 326 if(tmpStr[0] == 'N' || tmpStr[0] == 'n'){
MAA 4:c70ef089a3fd 327 north = true;
MAA 4:c70ef089a3fd 328 currentLatitude[0] = '+';
MAA 4:c70ef089a3fd 329 }
MAA 3:38eabaa92552 330
MAA 4:c70ef089a3fd 331 if(tmpStr[0] == 'S' || tmpStr[0] == 's'){
MAA 4:c70ef089a3fd 332 south = true;
MAA 4:c70ef089a3fd 333 currentLatitude[0] = '-';
MAA 4:c70ef089a3fd 334 }
MAA 4:c70ef089a3fd 335
MAA 3:38eabaa92552 336
MAA 4:c70ef089a3fd 337 latitudeDD = ((atof(tmpArrDeg) + (atof(tmpArrMin)/60)));
MAA 4:c70ef089a3fd 338
MAA 4:c70ef089a3fd 339 sprintf(tmpLatitude, "%0.6f",latitudeDD);
MAA 4:c70ef089a3fd 340 for(int i = 0; i < strlen(tmpLatitude); i++){
MAA 4:c70ef089a3fd 341 currentLatitude[i+1] = tmpLatitude[i];
MAA 4:c70ef089a3fd 342 }
MAA 3:38eabaa92552 343 };
MAA 3:38eabaa92552 344
MAA 18:87f243168f05 345 //! ParseCurrentLongitudeFromGPRMC, grabs current longitude from current GPRMC string.
MAA 18:87f243168f05 346 /*!
MAA 18:87f243168f05 347 Converts the longitude into decimaldegrees and stores the current longitude.
MAA 18:87f243168f05 348 */
MAA 4:c70ef089a3fd 349 void NMEA::ParseCurrentLongitudeFromGPRMC(){
MAA 4:c70ef089a3fd 350
MAA 4:c70ef089a3fd 351 east = false;
MAA 4:c70ef089a3fd 352 west = false;
MAA 4:c70ef089a3fd 353
MAA 4:c70ef089a3fd 354 memset(tmpArrDeg,'\0',7);
MAA 4:c70ef089a3fd 355 memset(tmpArrMin, '\0', 7);
MAA 4:c70ef089a3fd 356 memset(tmpLongitude, '\0', 15);
MAA 3:38eabaa92552 357 currentLongitude = "";
MAA 3:38eabaa92552 358 currentLongitude.resize(20);
MAA 3:38eabaa92552 359
MAA 4:c70ef089a3fd 360
MAA 4:c70ef089a3fd 361 //Getting Longitude from GPRMC string, assigning to tmpStr
MAA 4:c70ef089a3fd 362 getXFromNMEAString(5,currentGPRMCString);
MAA 4:c70ef089a3fd 363
MAA 4:c70ef089a3fd 364 tmpArrDeg[0] = tmpStr[0];
MAA 4:c70ef089a3fd 365 tmpArrDeg[1] = tmpStr[1];
MAA 4:c70ef089a3fd 366 tmpArrDeg[2] = tmpStr[2];
MAA 3:38eabaa92552 367
MAA 4:c70ef089a3fd 368 tmpArrMin[0] = tmpStr[3];
MAA 4:c70ef089a3fd 369 tmpArrMin[1] = tmpStr[4];
MAA 4:c70ef089a3fd 370 tmpArrMin[2] = tmpStr[5];
MAA 4:c70ef089a3fd 371 tmpArrMin[3] = tmpStr[6];
MAA 4:c70ef089a3fd 372 tmpArrMin[4] = tmpStr[7];
MAA 4:c70ef089a3fd 373 tmpArrMin[5] = tmpStr[8];
MAA 4:c70ef089a3fd 374 tmpArrMin[6] = tmpStr[9];
MAA 4:c70ef089a3fd 375
MAA 3:38eabaa92552 376 //getting E/W
MAA 5:11782a2008c2 377 getXFromNMEAString(6,currentGPRMCString);
MAA 4:c70ef089a3fd 378 if(tmpStr[0] == 'E' || tmpStr[0] == 'e'){
MAA 4:c70ef089a3fd 379 east = true;
MAA 4:c70ef089a3fd 380 currentLongitude[0] = '+';
MAA 4:c70ef089a3fd 381 }
MAA 4:c70ef089a3fd 382 if(tmpStr[0] == 'W' || tmpStr[0] == 'w'){
MAA 4:c70ef089a3fd 383 west = true;
MAA 4:c70ef089a3fd 384 currentLongitude[0] = '-';
MAA 4:c70ef089a3fd 385 }
MAA 4:c70ef089a3fd 386
MAA 4:c70ef089a3fd 387 longitudeDD = ((atof(tmpArrDeg) + (atof(tmpArrMin)/60)));
MAA 3:38eabaa92552 388
MAA 4:c70ef089a3fd 389 sprintf(tmpLongitude, "%0.6f",longitudeDD);
MAA 4:c70ef089a3fd 390 for(int i = 0; i < strlen(tmpLongitude); i++){
MAA 4:c70ef089a3fd 391 currentLongitude[i+1] = tmpLongitude[i];
MAA 4:c70ef089a3fd 392 }
MAA 4:c70ef089a3fd 393
MAA 2:39c4a85dc2a4 394 };
MAA 2:39c4a85dc2a4 395
MAA 18:87f243168f05 396
MAA 18:87f243168f05 397 //! getXFromNMEAString, grabs desired data column from NMEA string, stores it for further manipulation in tmpStr
MAA 18:87f243168f05 398 /*!
MAA 18:87f243168f05 399 \param desiredCommaCount integer designating which column to store
MAA 18:87f243168f05 400 \param stringToParse string parameter containing the NMEA string.
MAA 18:87f243168f05 401 */
MAA 4:c70ef089a3fd 402 void NMEA::getXFromNMEAString(int desiredCommaCount, string stringToParse){
MAA 2:39c4a85dc2a4 403
MAA 2:39c4a85dc2a4 404 //clearing tmpStr
MAA 2:39c4a85dc2a4 405 tmpStr = "";
MAA 3:38eabaa92552 406 tmpStr.resize(15);
MAA 5:11782a2008c2 407 char stringLength = strlen(stringToParse.c_str());
MAA 2:39c4a85dc2a4 408
MAA 2:39c4a85dc2a4 409 int commaCnt = 0;
MAA 2:39c4a85dc2a4 410 int index = 0;
MAA 2:39c4a85dc2a4 411 int idx = 0;
MAA 2:39c4a85dc2a4 412
MAA 5:11782a2008c2 413 while(commaCnt < (desiredCommaCount+1) && (index < stringLength)){
MAA 2:39c4a85dc2a4 414
MAA 2:39c4a85dc2a4 415 if(stringToParse[index] == ','){
MAA 2:39c4a85dc2a4 416 commaCnt += 1;
MAA 2:39c4a85dc2a4 417 }
MAA 2:39c4a85dc2a4 418
MAA 2:39c4a85dc2a4 419 if((commaCnt == desiredCommaCount) && (stringToParse[index] != ',')){
MAA 2:39c4a85dc2a4 420 tmpStr[idx] = stringToParse[index];
MAA 2:39c4a85dc2a4 421 idx += 1;
MAA 2:39c4a85dc2a4 422 }
MAA 2:39c4a85dc2a4 423
MAA 2:39c4a85dc2a4 424 index += 1;
MAA 2:39c4a85dc2a4 425 }
MAA 2:39c4a85dc2a4 426
MAA 21:325cb82f1838 427 };
MAA 21:325cb82f1838 428
MAA 21:325cb82f1838 429 //! getCurrentTime, getter method returning current time from gps
MAA 21:325cb82f1838 430 /*!
MAA 21:325cb82f1838 431 \return returns current time from gps in format "HH:MM:SS.FFF"
MAA 21:325cb82f1838 432 */
MAA 21:325cb82f1838 433 string NMEA::getCurrentTime(void){
MAA 21:325cb82f1838 434 return this->currentUTCFromGPRMC;
MAA 0:b3313c5ffca3 435 };