hattori&ide

Dependencies:   mbed

Committer:
hattori_atsushi
Date:
Sun Dec 18 08:16:01 2022 +0000
Revision:
0:f77369cabd75
hattori

Who changed what in which revision?

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