GPS精度実験

Dependents:   GPSLOG_program

Fork of MBed_Adafruit-GPS-Library by aigamozu

Committer:
kityann
Date:
Tue Aug 09 13:04:23 2016 +0000
Revision:
5:ce26d53dc358
Parent:
4:7ef0dd12940c
Child:
6:7b7e9dc49edd
comitto

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mlee350 0:a23e3099bb0a 1 /***********************************
mlee350 0:a23e3099bb0a 2 This is our GPS library
mlee350 0:a23e3099bb0a 3
mlee350 0:a23e3099bb0a 4 Adafruit invests time and resources providing this open source code,
mlee350 0:a23e3099bb0a 5 please support Adafruit and open-source hardware by purchasing
mlee350 0:a23e3099bb0a 6 products from Adafruit!
mlee350 0:a23e3099bb0a 7
mlee350 0:a23e3099bb0a 8 Written by Limor Fried/Ladyada for Adafruit Industries.
mlee350 0:a23e3099bb0a 9 BSD license, check license.txt for more information
mlee350 0:a23e3099bb0a 10 All text above must be included in any redistribution
mlee350 0:a23e3099bb0a 11 ****************************************/
mlee350 0:a23e3099bb0a 12
mlee350 0:a23e3099bb0a 13 #include "MBed_Adafruit_GPS.h"
mlee350 0:a23e3099bb0a 14
mlee350 0:a23e3099bb0a 15 // how long are max NMEA lines to parse?
kityann 5:ce26d53dc358 16 #define MAXLINELENGTH 200
mlee350 0:a23e3099bb0a 17
mlee350 0:a23e3099bb0a 18 // we double buffer: read one line in and leave one for the main program
mlee350 0:a23e3099bb0a 19 volatile char line1[MAXLINELENGTH];
mlee350 0:a23e3099bb0a 20 volatile char line2[MAXLINELENGTH];
mlee350 0:a23e3099bb0a 21 // our index into filling the current line
mlee350 0:a23e3099bb0a 22 volatile uint16_t lineidx=0;
mlee350 0:a23e3099bb0a 23 // pointers to the double buffers
mlee350 0:a23e3099bb0a 24 volatile char *currentline;
mlee350 0:a23e3099bb0a 25 volatile char *lastline;
mlee350 0:a23e3099bb0a 26 volatile bool recvdflag;
mlee350 0:a23e3099bb0a 27 volatile bool inStandbyMode;
mlee350 0:a23e3099bb0a 28
mlee350 0:a23e3099bb0a 29
mlee350 0:a23e3099bb0a 30 bool Adafruit_GPS::parse(char *nmea) {
mlee350 0:a23e3099bb0a 31 // do checksum check
mlee350 0:a23e3099bb0a 32
mlee350 0:a23e3099bb0a 33 // first look if we even have one
mlee350 0:a23e3099bb0a 34 if (nmea[strlen(nmea)-4] == '*') {
mlee350 0:a23e3099bb0a 35 uint16_t sum = parseHex(nmea[strlen(nmea)-3]) * 16;
mlee350 0:a23e3099bb0a 36 sum += parseHex(nmea[strlen(nmea)-2]);
mlee350 0:a23e3099bb0a 37
mlee350 0:a23e3099bb0a 38 // check checksum
mlee350 0:a23e3099bb0a 39 for (uint8_t i=1; i < (strlen(nmea)-4); i++) {
mlee350 0:a23e3099bb0a 40 sum ^= nmea[i];
mlee350 0:a23e3099bb0a 41 }
mlee350 0:a23e3099bb0a 42 if (sum != 0) {
mlee350 0:a23e3099bb0a 43 // bad checksum :(
mlee350 0:a23e3099bb0a 44 //return false;
mlee350 0:a23e3099bb0a 45 }
mlee350 0:a23e3099bb0a 46 }
mlee350 0:a23e3099bb0a 47
mlee350 0:a23e3099bb0a 48 // look for a few common sentences
kityann 5:ce26d53dc358 49 if (strstr(nmea, "$GPGSA")) {
kityann 5:ce26d53dc358 50 // found GSA
kityann 5:ce26d53dc358 51 char *p = nmea;
kityann 5:ce26d53dc358 52 GPGSAdata = nmea;
kityann 5:ce26d53dc358 53
kityann 5:ce26d53dc358 54 return true;
kityann 5:ce26d53dc358 55 }
kityann 5:ce26d53dc358 56
kityann 5:ce26d53dc358 57 // look for a few common sentences
mlee350 0:a23e3099bb0a 58 if (strstr(nmea, "$GPGGA")) {
mlee350 0:a23e3099bb0a 59 // found GGA
mlee350 0:a23e3099bb0a 60 char *p = nmea;
kityann 5:ce26d53dc358 61 GPGGAdata = nmea;
mlee350 0:a23e3099bb0a 62 // get time
mlee350 0:a23e3099bb0a 63 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 64 float timef = atof(p);
mlee350 0:a23e3099bb0a 65 uint32_t time = timef;
mlee350 0:a23e3099bb0a 66 hour = time / 10000;
mlee350 0:a23e3099bb0a 67 minute = (time % 10000) / 100;
mlee350 0:a23e3099bb0a 68 seconds = (time % 100);
mlee350 0:a23e3099bb0a 69
mlee350 0:a23e3099bb0a 70 milliseconds = fmod((double) timef, 1.0) * 1000;
mlee350 0:a23e3099bb0a 71
mlee350 0:a23e3099bb0a 72 // parse out latitude
m5171135 2:8203e954d8e1 73 /*
mlee350 0:a23e3099bb0a 74 p = strchr(p, ',')+1;
m5171135 1:ff72e93bcb0e 75 latitudeH = atol(p);
m5171135 1:ff72e93bcb0e 76 p = strchr(p, '.')+1;
m5171135 1:ff72e93bcb0e 77 latitudeL = atol(p);
m5171135 2:8203e954d8e1 78 */
m5171135 2:8203e954d8e1 79
m5171135 2:8203e954d8e1 80 p = strchr(p, ',')+1;
m5171135 2:8203e954d8e1 81 long sub_latitudeH = atol(p);
m5171135 2:8203e954d8e1 82 p = strchr(p, '.')+1;
m5171135 2:8203e954d8e1 83 long sub_latitudeL = atol(p);
m5171135 2:8203e954d8e1 84
m5171135 2:8203e954d8e1 85 latitudeH = sub_latitudeH / 100;
m5171135 2:8203e954d8e1 86 latitudeL = ((sub_latitudeH % 100) *10000) + sub_latitudeL;
m5171135 2:8203e954d8e1 87
mlee350 0:a23e3099bb0a 88
mlee350 0:a23e3099bb0a 89 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 90 if (p[0] == 'N') lat = 'N';
mlee350 0:a23e3099bb0a 91 else if (p[0] == 'S') lat = 'S';
mlee350 0:a23e3099bb0a 92 else if (p[0] == ',') lat = 0;
mlee350 0:a23e3099bb0a 93 else return false;
mlee350 0:a23e3099bb0a 94
mlee350 0:a23e3099bb0a 95 // parse out longitude
m5171135 2:8203e954d8e1 96 /*p = strchr(p, ',')+1;
m5171135 1:ff72e93bcb0e 97 longitudeH = atol(p);
m5171135 1:ff72e93bcb0e 98 p = strchr(p, '.')+1;
m5171135 1:ff72e93bcb0e 99 longitudeL = atol(p);
m5171135 2:8203e954d8e1 100 */
m5171135 2:8203e954d8e1 101
m5171135 2:8203e954d8e1 102 p = strchr(p, ',')+1;
m5171135 2:8203e954d8e1 103 long sub_longitudeH = atol(p);
m5171135 2:8203e954d8e1 104 p = strchr(p, '.')+1;
m5171135 2:8203e954d8e1 105 long sub_longitudeL = atol(p);
m5171135 2:8203e954d8e1 106
m5171135 2:8203e954d8e1 107 longitudeH = sub_longitudeH / 100;
m5171135 2:8203e954d8e1 108 longitudeL = ((sub_longitudeH % 100) *10000) + sub_longitudeL;
m5171135 2:8203e954d8e1 109
mlee350 0:a23e3099bb0a 110
mlee350 0:a23e3099bb0a 111 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 112 if (p[0] == 'W') lon = 'W';
mlee350 0:a23e3099bb0a 113 else if (p[0] == 'E') lon = 'E';
mlee350 0:a23e3099bb0a 114 else if (p[0] == ',') lon = 0;
mlee350 0:a23e3099bb0a 115 else return false;
mlee350 0:a23e3099bb0a 116
mlee350 0:a23e3099bb0a 117 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 118 fixquality = atoi(p);
mlee350 0:a23e3099bb0a 119
mlee350 0:a23e3099bb0a 120 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 121 satellites = atoi(p);
mlee350 0:a23e3099bb0a 122
mlee350 0:a23e3099bb0a 123 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 124 HDOP = atof(p);
mlee350 0:a23e3099bb0a 125
mlee350 0:a23e3099bb0a 126 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 127 altitude = atof(p);
mlee350 0:a23e3099bb0a 128 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 129 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 130 geoidheight = atof(p);
mlee350 0:a23e3099bb0a 131 return true;
mlee350 0:a23e3099bb0a 132 }
mlee350 0:a23e3099bb0a 133 if (strstr(nmea, "$GPRMC")) {
mlee350 0:a23e3099bb0a 134 // found RMC
mlee350 0:a23e3099bb0a 135 char *p = nmea;
kityann 5:ce26d53dc358 136 this->GPRMCdata = nmea;
kityann 5:ce26d53dc358 137 //printf("B%s",this->GPRMCdata);
mlee350 0:a23e3099bb0a 138 // get time
mlee350 0:a23e3099bb0a 139 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 140 float timef = atof(p);
mlee350 0:a23e3099bb0a 141 uint32_t time = timef;
mlee350 0:a23e3099bb0a 142 hour = time / 10000;
mlee350 0:a23e3099bb0a 143 minute = (time % 10000) / 100;
mlee350 0:a23e3099bb0a 144 seconds = (time % 100);
mlee350 0:a23e3099bb0a 145
mlee350 0:a23e3099bb0a 146 milliseconds = fmod((double) timef, 1.0) * 1000;
mlee350 0:a23e3099bb0a 147
mlee350 0:a23e3099bb0a 148 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 149 // Serial.println(p);
mlee350 0:a23e3099bb0a 150 if (p[0] == 'A')
mlee350 0:a23e3099bb0a 151 fix = true;
mlee350 0:a23e3099bb0a 152 else if (p[0] == 'V')
mlee350 0:a23e3099bb0a 153 fix = false;
mlee350 0:a23e3099bb0a 154 else
mlee350 0:a23e3099bb0a 155 return false;
mlee350 0:a23e3099bb0a 156
mlee350 0:a23e3099bb0a 157 // parse out latitude
m5171135 2:8203e954d8e1 158 /*
mlee350 0:a23e3099bb0a 159 p = strchr(p, ',')+1;
m5171135 1:ff72e93bcb0e 160 latitudeH = atol(p);
m5171135 1:ff72e93bcb0e 161 p = strchr(p, '.')+1;
m5171135 1:ff72e93bcb0e 162 latitudeL = atol(p);
m5171135 2:8203e954d8e1 163 */
m5171135 2:8203e954d8e1 164
m5171135 2:8203e954d8e1 165 p = strchr(p, ',')+1;
m5171135 2:8203e954d8e1 166 long sub_latitudeH = atol(p);
m5171135 2:8203e954d8e1 167 p = strchr(p, '.')+1;
m5171135 2:8203e954d8e1 168 long sub_latitudeL = atol(p);
m5171135 2:8203e954d8e1 169
m5171135 2:8203e954d8e1 170 latitudeH = sub_latitudeH / 100;
m5171135 2:8203e954d8e1 171 latitudeL = ((sub_latitudeH % 100) *10000) + sub_latitudeL;
m5171135 2:8203e954d8e1 172
mlee350 0:a23e3099bb0a 173
mlee350 0:a23e3099bb0a 174 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 175 if (p[0] == 'N') lat = 'N';
mlee350 0:a23e3099bb0a 176 else if (p[0] == 'S') lat = 'S';
mlee350 0:a23e3099bb0a 177 else if (p[0] == ',') lat = 0;
mlee350 0:a23e3099bb0a 178 else return false;
mlee350 0:a23e3099bb0a 179
mlee350 0:a23e3099bb0a 180 // parse out longitude
m5171135 2:8203e954d8e1 181 /*
mlee350 0:a23e3099bb0a 182 p = strchr(p, ',')+1;
m5171135 1:ff72e93bcb0e 183 longitudeH = atol(p);
m5171135 1:ff72e93bcb0e 184 p = strchr(p, '.')+1;
m5171135 1:ff72e93bcb0e 185 longitudeL = atol(p);
m5171135 2:8203e954d8e1 186 */
m5171135 2:8203e954d8e1 187
m5171135 2:8203e954d8e1 188 p = strchr(p, ',')+1;
m5171135 2:8203e954d8e1 189 long sub_longitudeH = atol(p);
m5171135 2:8203e954d8e1 190 p = strchr(p, '.')+1;
m5171135 2:8203e954d8e1 191 long sub_longitudeL = atol(p);
m5171135 2:8203e954d8e1 192
m5171135 2:8203e954d8e1 193 longitudeH = sub_longitudeH / 100;
m5171135 2:8203e954d8e1 194 longitudeL = ((sub_longitudeH % 100) *10000) + sub_longitudeL;
m5171135 2:8203e954d8e1 195
m5171135 2:8203e954d8e1 196
m5171135 1:ff72e93bcb0e 197
mlee350 0:a23e3099bb0a 198 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 199 if (p[0] == 'W') lon = 'W';
mlee350 0:a23e3099bb0a 200 else if (p[0] == 'E') lon = 'E';
mlee350 0:a23e3099bb0a 201 else if (p[0] == ',') lon = 0;
mlee350 0:a23e3099bb0a 202 else return false;
mlee350 0:a23e3099bb0a 203
mlee350 0:a23e3099bb0a 204 // speed
mlee350 0:a23e3099bb0a 205 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 206 speed = atof(p);
mlee350 0:a23e3099bb0a 207
mlee350 0:a23e3099bb0a 208 // angle
mlee350 0:a23e3099bb0a 209 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 210 angle = atof(p);
mlee350 0:a23e3099bb0a 211
mlee350 0:a23e3099bb0a 212 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 213 uint32_t fulldate = atof(p);
mlee350 0:a23e3099bb0a 214 day = fulldate / 10000;
mlee350 0:a23e3099bb0a 215 month = (fulldate % 10000) / 100;
mlee350 0:a23e3099bb0a 216 year = (fulldate % 100);
mlee350 0:a23e3099bb0a 217
mlee350 0:a23e3099bb0a 218 // we dont parse the remaining, yet!
mlee350 0:a23e3099bb0a 219 return true;
mlee350 0:a23e3099bb0a 220 }
mlee350 0:a23e3099bb0a 221
mlee350 0:a23e3099bb0a 222 return false;
mlee350 0:a23e3099bb0a 223 }
mlee350 0:a23e3099bb0a 224
mlee350 0:a23e3099bb0a 225 char Adafruit_GPS::read(void) {
mlee350 0:a23e3099bb0a 226 char c = 0;
mlee350 0:a23e3099bb0a 227
mlee350 0:a23e3099bb0a 228 if (paused) return c;
mlee350 0:a23e3099bb0a 229
mlee350 0:a23e3099bb0a 230 if(!gpsSerial->readable()) return c;
mlee350 0:a23e3099bb0a 231 c = gpsSerial->getc();
mlee350 0:a23e3099bb0a 232
mlee350 0:a23e3099bb0a 233 //Serial.print(c);
mlee350 0:a23e3099bb0a 234
mlee350 0:a23e3099bb0a 235 if (c == '$') {
mlee350 0:a23e3099bb0a 236 currentline[lineidx] = 0;
mlee350 0:a23e3099bb0a 237 lineidx = 0;
mlee350 0:a23e3099bb0a 238 }
mlee350 0:a23e3099bb0a 239 if (c == '\n') {
mlee350 0:a23e3099bb0a 240 currentline[lineidx] = 0;
mlee350 0:a23e3099bb0a 241
mlee350 0:a23e3099bb0a 242 if (currentline == line1) {
mlee350 0:a23e3099bb0a 243 currentline = line2;
mlee350 0:a23e3099bb0a 244 lastline = line1;
mlee350 0:a23e3099bb0a 245 } else {
mlee350 0:a23e3099bb0a 246 currentline = line1;
mlee350 0:a23e3099bb0a 247 lastline = line2;
mlee350 0:a23e3099bb0a 248 }
mlee350 0:a23e3099bb0a 249
mlee350 0:a23e3099bb0a 250 lineidx = 0;
mlee350 0:a23e3099bb0a 251 recvdflag = true;
mlee350 0:a23e3099bb0a 252 }
mlee350 0:a23e3099bb0a 253
mlee350 0:a23e3099bb0a 254 currentline[lineidx++] = c;
mlee350 0:a23e3099bb0a 255 if (lineidx >= MAXLINELENGTH)
mlee350 0:a23e3099bb0a 256 lineidx = MAXLINELENGTH-1;
mlee350 0:a23e3099bb0a 257
mlee350 0:a23e3099bb0a 258 return c;
mlee350 0:a23e3099bb0a 259 }
mlee350 0:a23e3099bb0a 260
mlee350 0:a23e3099bb0a 261 Adafruit_GPS::Adafruit_GPS (Serial *ser)
mlee350 0:a23e3099bb0a 262 {
mlee350 0:a23e3099bb0a 263 common_init(); // Set everything to common state, then...
mlee350 0:a23e3099bb0a 264 gpsSerial = ser; // ...override gpsSwSerial with value passed.
kityann 4:7ef0dd12940c 265 latitudeH=0;latitudeL=0;longitudeH=0;longitudeL=0;
kityann 4:7ef0dd12940c 266 latitudeKH=0;latitudeKL=0;longitudeKH=0;longitudeKL=0;
mlee350 0:a23e3099bb0a 267 }
mlee350 0:a23e3099bb0a 268
mlee350 0:a23e3099bb0a 269 // Initialization code used by all constructor types
mlee350 0:a23e3099bb0a 270 void Adafruit_GPS::common_init(void) {
mlee350 0:a23e3099bb0a 271 gpsSerial = NULL;
mlee350 0:a23e3099bb0a 272 recvdflag = false;
mlee350 0:a23e3099bb0a 273 paused = false;
mlee350 0:a23e3099bb0a 274 lineidx = 0;
mlee350 0:a23e3099bb0a 275 currentline = line1;
mlee350 0:a23e3099bb0a 276 lastline = line2;
mlee350 0:a23e3099bb0a 277
mlee350 0:a23e3099bb0a 278 hour = minute = seconds = year = month = day =
mlee350 0:a23e3099bb0a 279 fixquality = satellites = 0; // uint8_t
mlee350 0:a23e3099bb0a 280 lat = lon = mag = 0; // char
mlee350 0:a23e3099bb0a 281 fix = false; // bool
mlee350 0:a23e3099bb0a 282 milliseconds = 0; // uint16_t
m5171135 1:ff72e93bcb0e 283 geoidheight = altitude = speed = angle = magvariation = HDOP = 0.0; // float
m5171135 1:ff72e93bcb0e 284 latitudeH = latitudeL = longitudeH = longitudeL = 0;
m5171135 1:ff72e93bcb0e 285
mlee350 0:a23e3099bb0a 286 }
mlee350 0:a23e3099bb0a 287
mlee350 0:a23e3099bb0a 288 void Adafruit_GPS::begin(int baud)
mlee350 0:a23e3099bb0a 289 {
mlee350 0:a23e3099bb0a 290 gpsSerial->baud(baud);
mlee350 0:a23e3099bb0a 291 wait_ms(10);
mlee350 0:a23e3099bb0a 292 }
mlee350 0:a23e3099bb0a 293
mlee350 0:a23e3099bb0a 294 void Adafruit_GPS::sendCommand(char *str) {
mlee350 0:a23e3099bb0a 295 gpsSerial->printf("%s",str);
mlee350 0:a23e3099bb0a 296 }
mlee350 0:a23e3099bb0a 297
mlee350 0:a23e3099bb0a 298 bool Adafruit_GPS::newNMEAreceived(void) {
mlee350 0:a23e3099bb0a 299 return recvdflag;
mlee350 0:a23e3099bb0a 300 }
mlee350 0:a23e3099bb0a 301
mlee350 0:a23e3099bb0a 302 void Adafruit_GPS::pause(bool p) {
mlee350 0:a23e3099bb0a 303 paused = p;
mlee350 0:a23e3099bb0a 304 }
mlee350 0:a23e3099bb0a 305
mlee350 0:a23e3099bb0a 306 char *Adafruit_GPS::lastNMEA(void) {
mlee350 0:a23e3099bb0a 307 recvdflag = false;
mlee350 0:a23e3099bb0a 308 return (char *)lastline;
mlee350 0:a23e3099bb0a 309 }
mlee350 0:a23e3099bb0a 310
mlee350 0:a23e3099bb0a 311 // read a Hex value and return the decimal equivalent
mlee350 0:a23e3099bb0a 312 uint8_t Adafruit_GPS::parseHex(char c) {
mlee350 0:a23e3099bb0a 313 if (c < '0')
mlee350 0:a23e3099bb0a 314 return 0;
mlee350 0:a23e3099bb0a 315 if (c <= '9')
mlee350 0:a23e3099bb0a 316 return c - '0';
mlee350 0:a23e3099bb0a 317 if (c < 'A')
mlee350 0:a23e3099bb0a 318 return 0;
mlee350 0:a23e3099bb0a 319 if (c <= 'F')
mlee350 0:a23e3099bb0a 320 return (c - 'A')+10;
mlee350 0:a23e3099bb0a 321 }
mlee350 0:a23e3099bb0a 322
mlee350 0:a23e3099bb0a 323 bool Adafruit_GPS::waitForSentence(char *wait4me, uint8_t max) {
mlee350 0:a23e3099bb0a 324 char str[20];
mlee350 0:a23e3099bb0a 325
mlee350 0:a23e3099bb0a 326 uint8_t i=0;
mlee350 0:a23e3099bb0a 327 while (i < max) {
mlee350 0:a23e3099bb0a 328 if (newNMEAreceived()) {
mlee350 0:a23e3099bb0a 329 char *nmea = lastNMEA();
mlee350 0:a23e3099bb0a 330 strncpy(str, nmea, 20);
mlee350 0:a23e3099bb0a 331 str[19] = 0;
mlee350 0:a23e3099bb0a 332 i++;
mlee350 0:a23e3099bb0a 333
mlee350 0:a23e3099bb0a 334 if (strstr(str, wait4me))
mlee350 0:a23e3099bb0a 335 return true;
mlee350 0:a23e3099bb0a 336 }
mlee350 0:a23e3099bb0a 337 }
mlee350 0:a23e3099bb0a 338
mlee350 0:a23e3099bb0a 339 return false;
mlee350 0:a23e3099bb0a 340 }
mlee350 0:a23e3099bb0a 341
mlee350 0:a23e3099bb0a 342 bool Adafruit_GPS::LOCUS_StartLogger(void) {
mlee350 0:a23e3099bb0a 343 sendCommand(PMTK_LOCUS_STARTLOG);
mlee350 0:a23e3099bb0a 344 recvdflag = false;
mlee350 0:a23e3099bb0a 345 return waitForSentence(PMTK_LOCUS_LOGSTARTED);
mlee350 0:a23e3099bb0a 346 }
mlee350 0:a23e3099bb0a 347
mlee350 0:a23e3099bb0a 348 bool Adafruit_GPS::LOCUS_ReadStatus(void) {
mlee350 0:a23e3099bb0a 349 sendCommand(PMTK_LOCUS_QUERY_STATUS);
mlee350 0:a23e3099bb0a 350
mlee350 0:a23e3099bb0a 351 if (! waitForSentence("$PMTKLOG"))
mlee350 0:a23e3099bb0a 352 return false;
mlee350 0:a23e3099bb0a 353
mlee350 0:a23e3099bb0a 354 char *response = lastNMEA();
mlee350 0:a23e3099bb0a 355 uint16_t parsed[10];
mlee350 0:a23e3099bb0a 356 uint8_t i;
mlee350 0:a23e3099bb0a 357
mlee350 0:a23e3099bb0a 358 for (i=0; i<10; i++) parsed[i] = -1;
mlee350 0:a23e3099bb0a 359
mlee350 0:a23e3099bb0a 360 response = strchr(response, ',');
mlee350 0:a23e3099bb0a 361 for (i=0; i<10; i++) {
mlee350 0:a23e3099bb0a 362 if (!response || (response[0] == 0) || (response[0] == '*'))
mlee350 0:a23e3099bb0a 363 break;
mlee350 0:a23e3099bb0a 364 response++;
mlee350 0:a23e3099bb0a 365 parsed[i]=0;
mlee350 0:a23e3099bb0a 366 while ((response[0] != ',') &&
mlee350 0:a23e3099bb0a 367 (response[0] != '*') && (response[0] != 0)) {
mlee350 0:a23e3099bb0a 368 parsed[i] *= 10;
mlee350 0:a23e3099bb0a 369 char c = response[0];
mlee350 0:a23e3099bb0a 370 if (isdigit(c))
mlee350 0:a23e3099bb0a 371 parsed[i] += c - '0';
mlee350 0:a23e3099bb0a 372 else
mlee350 0:a23e3099bb0a 373 parsed[i] = c;
mlee350 0:a23e3099bb0a 374 response++;
mlee350 0:a23e3099bb0a 375 }
mlee350 0:a23e3099bb0a 376 }
mlee350 0:a23e3099bb0a 377 LOCUS_serial = parsed[0];
mlee350 0:a23e3099bb0a 378 LOCUS_type = parsed[1];
mlee350 0:a23e3099bb0a 379 if (isalpha(parsed[2])) {
mlee350 0:a23e3099bb0a 380 parsed[2] = parsed[2] - 'a' + 10;
mlee350 0:a23e3099bb0a 381 }
mlee350 0:a23e3099bb0a 382 LOCUS_mode = parsed[2];
mlee350 0:a23e3099bb0a 383 LOCUS_config = parsed[3];
mlee350 0:a23e3099bb0a 384 LOCUS_interval = parsed[4];
mlee350 0:a23e3099bb0a 385 LOCUS_distance = parsed[5];
mlee350 0:a23e3099bb0a 386 LOCUS_speed = parsed[6];
mlee350 0:a23e3099bb0a 387 LOCUS_status = !parsed[7];
mlee350 0:a23e3099bb0a 388 LOCUS_records = parsed[8];
mlee350 0:a23e3099bb0a 389 LOCUS_percent = parsed[9];
mlee350 0:a23e3099bb0a 390
mlee350 0:a23e3099bb0a 391 return true;
mlee350 0:a23e3099bb0a 392 }
mlee350 0:a23e3099bb0a 393
mlee350 0:a23e3099bb0a 394 // Standby Mode Switches
mlee350 0:a23e3099bb0a 395 bool Adafruit_GPS::standby(void) {
mlee350 0:a23e3099bb0a 396 if (inStandbyMode) {
mlee350 0:a23e3099bb0a 397 return false; // Returns false if already in standby mode, so that you do not wake it up by sending commands to GPS
mlee350 0:a23e3099bb0a 398 }
mlee350 0:a23e3099bb0a 399 else {
mlee350 0:a23e3099bb0a 400 inStandbyMode = true;
mlee350 0:a23e3099bb0a 401 sendCommand(PMTK_STANDBY);
mlee350 0:a23e3099bb0a 402 //return waitForSentence(PMTK_STANDBY_SUCCESS); // don't seem to be fast enough to catch the message, or something else just is not working
mlee350 0:a23e3099bb0a 403 return true;
mlee350 0:a23e3099bb0a 404 }
mlee350 0:a23e3099bb0a 405 }
mlee350 0:a23e3099bb0a 406
mlee350 0:a23e3099bb0a 407 bool Adafruit_GPS::wakeup(void) {
mlee350 0:a23e3099bb0a 408 if (inStandbyMode) {
mlee350 0:a23e3099bb0a 409 inStandbyMode = false;
mlee350 0:a23e3099bb0a 410 sendCommand(""); // send byte to wake it up
mlee350 0:a23e3099bb0a 411 return waitForSentence(PMTK_AWAKE);
mlee350 0:a23e3099bb0a 412 }
mlee350 0:a23e3099bb0a 413 else {
mlee350 0:a23e3099bb0a 414 return false; // Returns false if not in standby mode, nothing to wakeup
mlee350 0:a23e3099bb0a 415 }
mlee350 0:a23e3099bb0a 416 }