Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MBed_Adafruit-GPS-Library by
MBed_Adafruit_GPS.cpp@1:ff72e93bcb0e, 2014-05-20 (annotated)
- Committer:
- m5171135
- Date:
- Tue May 20 14:51:14 2014 +0000
- Revision:
- 1:ff72e93bcb0e
- Parent:
- 0:a23e3099bb0a
- Child:
- 2:8203e954d8e1
change -> add Auth mode;
Who changed what in which revision?
User | Revision | Line number | New 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? |
mlee350 | 0:a23e3099bb0a | 16 | #define MAXLINELENGTH 120 |
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 |
mlee350 | 0:a23e3099bb0a | 49 | if (strstr(nmea, "$GPGGA")) { |
mlee350 | 0:a23e3099bb0a | 50 | // found GGA |
mlee350 | 0:a23e3099bb0a | 51 | char *p = nmea; |
mlee350 | 0:a23e3099bb0a | 52 | // get time |
mlee350 | 0:a23e3099bb0a | 53 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 54 | float timef = atof(p); |
mlee350 | 0:a23e3099bb0a | 55 | uint32_t time = timef; |
mlee350 | 0:a23e3099bb0a | 56 | hour = time / 10000; |
mlee350 | 0:a23e3099bb0a | 57 | minute = (time % 10000) / 100; |
mlee350 | 0:a23e3099bb0a | 58 | seconds = (time % 100); |
mlee350 | 0:a23e3099bb0a | 59 | |
mlee350 | 0:a23e3099bb0a | 60 | milliseconds = fmod((double) timef, 1.0) * 1000; |
mlee350 | 0:a23e3099bb0a | 61 | |
mlee350 | 0:a23e3099bb0a | 62 | // parse out latitude |
mlee350 | 0:a23e3099bb0a | 63 | p = strchr(p, ',')+1; |
m5171135 | 1:ff72e93bcb0e | 64 | latitudeH = atol(p); |
m5171135 | 1:ff72e93bcb0e | 65 | p = strchr(p, '.')+1; |
m5171135 | 1:ff72e93bcb0e | 66 | latitudeL = atol(p); |
mlee350 | 0:a23e3099bb0a | 67 | |
mlee350 | 0:a23e3099bb0a | 68 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 69 | if (p[0] == 'N') lat = 'N'; |
mlee350 | 0:a23e3099bb0a | 70 | else if (p[0] == 'S') lat = 'S'; |
mlee350 | 0:a23e3099bb0a | 71 | else if (p[0] == ',') lat = 0; |
mlee350 | 0:a23e3099bb0a | 72 | else return false; |
mlee350 | 0:a23e3099bb0a | 73 | |
mlee350 | 0:a23e3099bb0a | 74 | // parse out longitude |
mlee350 | 0:a23e3099bb0a | 75 | p = strchr(p, ',')+1; |
m5171135 | 1:ff72e93bcb0e | 76 | longitudeH = atol(p); |
m5171135 | 1:ff72e93bcb0e | 77 | p = strchr(p, '.')+1; |
m5171135 | 1:ff72e93bcb0e | 78 | longitudeL = atol(p); |
mlee350 | 0:a23e3099bb0a | 79 | |
mlee350 | 0:a23e3099bb0a | 80 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 81 | if (p[0] == 'W') lon = 'W'; |
mlee350 | 0:a23e3099bb0a | 82 | else if (p[0] == 'E') lon = 'E'; |
mlee350 | 0:a23e3099bb0a | 83 | else if (p[0] == ',') lon = 0; |
mlee350 | 0:a23e3099bb0a | 84 | else return false; |
mlee350 | 0:a23e3099bb0a | 85 | |
mlee350 | 0:a23e3099bb0a | 86 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 87 | fixquality = atoi(p); |
mlee350 | 0:a23e3099bb0a | 88 | |
mlee350 | 0:a23e3099bb0a | 89 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 90 | satellites = atoi(p); |
mlee350 | 0:a23e3099bb0a | 91 | |
mlee350 | 0:a23e3099bb0a | 92 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 93 | HDOP = atof(p); |
mlee350 | 0:a23e3099bb0a | 94 | |
mlee350 | 0:a23e3099bb0a | 95 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 96 | altitude = atof(p); |
mlee350 | 0:a23e3099bb0a | 97 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 98 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 99 | geoidheight = atof(p); |
mlee350 | 0:a23e3099bb0a | 100 | return true; |
mlee350 | 0:a23e3099bb0a | 101 | } |
mlee350 | 0:a23e3099bb0a | 102 | if (strstr(nmea, "$GPRMC")) { |
mlee350 | 0:a23e3099bb0a | 103 | // found RMC |
mlee350 | 0:a23e3099bb0a | 104 | char *p = nmea; |
mlee350 | 0:a23e3099bb0a | 105 | |
mlee350 | 0:a23e3099bb0a | 106 | // get time |
mlee350 | 0:a23e3099bb0a | 107 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 108 | float timef = atof(p); |
mlee350 | 0:a23e3099bb0a | 109 | uint32_t time = timef; |
mlee350 | 0:a23e3099bb0a | 110 | hour = time / 10000; |
mlee350 | 0:a23e3099bb0a | 111 | minute = (time % 10000) / 100; |
mlee350 | 0:a23e3099bb0a | 112 | seconds = (time % 100); |
mlee350 | 0:a23e3099bb0a | 113 | |
mlee350 | 0:a23e3099bb0a | 114 | milliseconds = fmod((double) timef, 1.0) * 1000; |
mlee350 | 0:a23e3099bb0a | 115 | |
mlee350 | 0:a23e3099bb0a | 116 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 117 | // Serial.println(p); |
mlee350 | 0:a23e3099bb0a | 118 | if (p[0] == 'A') |
mlee350 | 0:a23e3099bb0a | 119 | fix = true; |
mlee350 | 0:a23e3099bb0a | 120 | else if (p[0] == 'V') |
mlee350 | 0:a23e3099bb0a | 121 | fix = false; |
mlee350 | 0:a23e3099bb0a | 122 | else |
mlee350 | 0:a23e3099bb0a | 123 | return false; |
mlee350 | 0:a23e3099bb0a | 124 | |
mlee350 | 0:a23e3099bb0a | 125 | // parse out latitude |
mlee350 | 0:a23e3099bb0a | 126 | p = strchr(p, ',')+1; |
m5171135 | 1:ff72e93bcb0e | 127 | latitudeH = atol(p); |
m5171135 | 1:ff72e93bcb0e | 128 | p = strchr(p, '.')+1; |
m5171135 | 1:ff72e93bcb0e | 129 | latitudeL = atol(p); |
mlee350 | 0:a23e3099bb0a | 130 | |
mlee350 | 0:a23e3099bb0a | 131 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 132 | if (p[0] == 'N') lat = 'N'; |
mlee350 | 0:a23e3099bb0a | 133 | else if (p[0] == 'S') lat = 'S'; |
mlee350 | 0:a23e3099bb0a | 134 | else if (p[0] == ',') lat = 0; |
mlee350 | 0:a23e3099bb0a | 135 | else return false; |
mlee350 | 0:a23e3099bb0a | 136 | |
mlee350 | 0:a23e3099bb0a | 137 | // parse out longitude |
mlee350 | 0:a23e3099bb0a | 138 | p = strchr(p, ',')+1; |
m5171135 | 1:ff72e93bcb0e | 139 | longitudeH = atol(p); |
m5171135 | 1:ff72e93bcb0e | 140 | p = strchr(p, '.')+1; |
m5171135 | 1:ff72e93bcb0e | 141 | longitudeL = atol(p); |
m5171135 | 1:ff72e93bcb0e | 142 | |
mlee350 | 0:a23e3099bb0a | 143 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 144 | if (p[0] == 'W') lon = 'W'; |
mlee350 | 0:a23e3099bb0a | 145 | else if (p[0] == 'E') lon = 'E'; |
mlee350 | 0:a23e3099bb0a | 146 | else if (p[0] == ',') lon = 0; |
mlee350 | 0:a23e3099bb0a | 147 | else return false; |
mlee350 | 0:a23e3099bb0a | 148 | |
mlee350 | 0:a23e3099bb0a | 149 | // speed |
mlee350 | 0:a23e3099bb0a | 150 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 151 | speed = atof(p); |
mlee350 | 0:a23e3099bb0a | 152 | |
mlee350 | 0:a23e3099bb0a | 153 | // angle |
mlee350 | 0:a23e3099bb0a | 154 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 155 | angle = atof(p); |
mlee350 | 0:a23e3099bb0a | 156 | |
mlee350 | 0:a23e3099bb0a | 157 | p = strchr(p, ',')+1; |
mlee350 | 0:a23e3099bb0a | 158 | uint32_t fulldate = atof(p); |
mlee350 | 0:a23e3099bb0a | 159 | day = fulldate / 10000; |
mlee350 | 0:a23e3099bb0a | 160 | month = (fulldate % 10000) / 100; |
mlee350 | 0:a23e3099bb0a | 161 | year = (fulldate % 100); |
mlee350 | 0:a23e3099bb0a | 162 | |
mlee350 | 0:a23e3099bb0a | 163 | // we dont parse the remaining, yet! |
mlee350 | 0:a23e3099bb0a | 164 | return true; |
mlee350 | 0:a23e3099bb0a | 165 | } |
mlee350 | 0:a23e3099bb0a | 166 | |
mlee350 | 0:a23e3099bb0a | 167 | return false; |
mlee350 | 0:a23e3099bb0a | 168 | } |
mlee350 | 0:a23e3099bb0a | 169 | |
mlee350 | 0:a23e3099bb0a | 170 | char Adafruit_GPS::read(void) { |
mlee350 | 0:a23e3099bb0a | 171 | char c = 0; |
mlee350 | 0:a23e3099bb0a | 172 | |
mlee350 | 0:a23e3099bb0a | 173 | if (paused) return c; |
mlee350 | 0:a23e3099bb0a | 174 | |
mlee350 | 0:a23e3099bb0a | 175 | if(!gpsSerial->readable()) return c; |
mlee350 | 0:a23e3099bb0a | 176 | c = gpsSerial->getc(); |
mlee350 | 0:a23e3099bb0a | 177 | |
mlee350 | 0:a23e3099bb0a | 178 | //Serial.print(c); |
mlee350 | 0:a23e3099bb0a | 179 | |
mlee350 | 0:a23e3099bb0a | 180 | if (c == '$') { |
mlee350 | 0:a23e3099bb0a | 181 | currentline[lineidx] = 0; |
mlee350 | 0:a23e3099bb0a | 182 | lineidx = 0; |
mlee350 | 0:a23e3099bb0a | 183 | } |
mlee350 | 0:a23e3099bb0a | 184 | if (c == '\n') { |
mlee350 | 0:a23e3099bb0a | 185 | currentline[lineidx] = 0; |
mlee350 | 0:a23e3099bb0a | 186 | |
mlee350 | 0:a23e3099bb0a | 187 | if (currentline == line1) { |
mlee350 | 0:a23e3099bb0a | 188 | currentline = line2; |
mlee350 | 0:a23e3099bb0a | 189 | lastline = line1; |
mlee350 | 0:a23e3099bb0a | 190 | } else { |
mlee350 | 0:a23e3099bb0a | 191 | currentline = line1; |
mlee350 | 0:a23e3099bb0a | 192 | lastline = line2; |
mlee350 | 0:a23e3099bb0a | 193 | } |
mlee350 | 0:a23e3099bb0a | 194 | |
mlee350 | 0:a23e3099bb0a | 195 | lineidx = 0; |
mlee350 | 0:a23e3099bb0a | 196 | recvdflag = true; |
mlee350 | 0:a23e3099bb0a | 197 | } |
mlee350 | 0:a23e3099bb0a | 198 | |
mlee350 | 0:a23e3099bb0a | 199 | currentline[lineidx++] = c; |
mlee350 | 0:a23e3099bb0a | 200 | if (lineidx >= MAXLINELENGTH) |
mlee350 | 0:a23e3099bb0a | 201 | lineidx = MAXLINELENGTH-1; |
mlee350 | 0:a23e3099bb0a | 202 | |
mlee350 | 0:a23e3099bb0a | 203 | return c; |
mlee350 | 0:a23e3099bb0a | 204 | } |
mlee350 | 0:a23e3099bb0a | 205 | |
mlee350 | 0:a23e3099bb0a | 206 | Adafruit_GPS::Adafruit_GPS (Serial *ser) |
mlee350 | 0:a23e3099bb0a | 207 | { |
mlee350 | 0:a23e3099bb0a | 208 | common_init(); // Set everything to common state, then... |
mlee350 | 0:a23e3099bb0a | 209 | gpsSerial = ser; // ...override gpsSwSerial with value passed. |
mlee350 | 0:a23e3099bb0a | 210 | } |
mlee350 | 0:a23e3099bb0a | 211 | |
mlee350 | 0:a23e3099bb0a | 212 | // Initialization code used by all constructor types |
mlee350 | 0:a23e3099bb0a | 213 | void Adafruit_GPS::common_init(void) { |
mlee350 | 0:a23e3099bb0a | 214 | gpsSerial = NULL; |
mlee350 | 0:a23e3099bb0a | 215 | recvdflag = false; |
mlee350 | 0:a23e3099bb0a | 216 | paused = false; |
mlee350 | 0:a23e3099bb0a | 217 | lineidx = 0; |
mlee350 | 0:a23e3099bb0a | 218 | currentline = line1; |
mlee350 | 0:a23e3099bb0a | 219 | lastline = line2; |
mlee350 | 0:a23e3099bb0a | 220 | |
mlee350 | 0:a23e3099bb0a | 221 | hour = minute = seconds = year = month = day = |
mlee350 | 0:a23e3099bb0a | 222 | fixquality = satellites = 0; // uint8_t |
mlee350 | 0:a23e3099bb0a | 223 | lat = lon = mag = 0; // char |
mlee350 | 0:a23e3099bb0a | 224 | fix = false; // bool |
mlee350 | 0:a23e3099bb0a | 225 | milliseconds = 0; // uint16_t |
m5171135 | 1:ff72e93bcb0e | 226 | geoidheight = altitude = speed = angle = magvariation = HDOP = 0.0; // float |
m5171135 | 1:ff72e93bcb0e | 227 | latitudeH = latitudeL = longitudeH = longitudeL = 0; |
m5171135 | 1:ff72e93bcb0e | 228 | |
mlee350 | 0:a23e3099bb0a | 229 | } |
mlee350 | 0:a23e3099bb0a | 230 | |
mlee350 | 0:a23e3099bb0a | 231 | void Adafruit_GPS::begin(int baud) |
mlee350 | 0:a23e3099bb0a | 232 | { |
mlee350 | 0:a23e3099bb0a | 233 | gpsSerial->baud(baud); |
mlee350 | 0:a23e3099bb0a | 234 | wait_ms(10); |
mlee350 | 0:a23e3099bb0a | 235 | } |
mlee350 | 0:a23e3099bb0a | 236 | |
mlee350 | 0:a23e3099bb0a | 237 | void Adafruit_GPS::sendCommand(char *str) { |
mlee350 | 0:a23e3099bb0a | 238 | gpsSerial->printf("%s",str); |
mlee350 | 0:a23e3099bb0a | 239 | } |
mlee350 | 0:a23e3099bb0a | 240 | |
mlee350 | 0:a23e3099bb0a | 241 | bool Adafruit_GPS::newNMEAreceived(void) { |
mlee350 | 0:a23e3099bb0a | 242 | return recvdflag; |
mlee350 | 0:a23e3099bb0a | 243 | } |
mlee350 | 0:a23e3099bb0a | 244 | |
mlee350 | 0:a23e3099bb0a | 245 | void Adafruit_GPS::pause(bool p) { |
mlee350 | 0:a23e3099bb0a | 246 | paused = p; |
mlee350 | 0:a23e3099bb0a | 247 | } |
mlee350 | 0:a23e3099bb0a | 248 | |
mlee350 | 0:a23e3099bb0a | 249 | char *Adafruit_GPS::lastNMEA(void) { |
mlee350 | 0:a23e3099bb0a | 250 | recvdflag = false; |
mlee350 | 0:a23e3099bb0a | 251 | return (char *)lastline; |
mlee350 | 0:a23e3099bb0a | 252 | } |
mlee350 | 0:a23e3099bb0a | 253 | |
mlee350 | 0:a23e3099bb0a | 254 | // read a Hex value and return the decimal equivalent |
mlee350 | 0:a23e3099bb0a | 255 | uint8_t Adafruit_GPS::parseHex(char c) { |
mlee350 | 0:a23e3099bb0a | 256 | if (c < '0') |
mlee350 | 0:a23e3099bb0a | 257 | return 0; |
mlee350 | 0:a23e3099bb0a | 258 | if (c <= '9') |
mlee350 | 0:a23e3099bb0a | 259 | return c - '0'; |
mlee350 | 0:a23e3099bb0a | 260 | if (c < 'A') |
mlee350 | 0:a23e3099bb0a | 261 | return 0; |
mlee350 | 0:a23e3099bb0a | 262 | if (c <= 'F') |
mlee350 | 0:a23e3099bb0a | 263 | return (c - 'A')+10; |
mlee350 | 0:a23e3099bb0a | 264 | } |
mlee350 | 0:a23e3099bb0a | 265 | |
mlee350 | 0:a23e3099bb0a | 266 | bool Adafruit_GPS::waitForSentence(char *wait4me, uint8_t max) { |
mlee350 | 0:a23e3099bb0a | 267 | char str[20]; |
mlee350 | 0:a23e3099bb0a | 268 | |
mlee350 | 0:a23e3099bb0a | 269 | uint8_t i=0; |
mlee350 | 0:a23e3099bb0a | 270 | while (i < max) { |
mlee350 | 0:a23e3099bb0a | 271 | if (newNMEAreceived()) { |
mlee350 | 0:a23e3099bb0a | 272 | char *nmea = lastNMEA(); |
mlee350 | 0:a23e3099bb0a | 273 | strncpy(str, nmea, 20); |
mlee350 | 0:a23e3099bb0a | 274 | str[19] = 0; |
mlee350 | 0:a23e3099bb0a | 275 | i++; |
mlee350 | 0:a23e3099bb0a | 276 | |
mlee350 | 0:a23e3099bb0a | 277 | if (strstr(str, wait4me)) |
mlee350 | 0:a23e3099bb0a | 278 | return true; |
mlee350 | 0:a23e3099bb0a | 279 | } |
mlee350 | 0:a23e3099bb0a | 280 | } |
mlee350 | 0:a23e3099bb0a | 281 | |
mlee350 | 0:a23e3099bb0a | 282 | return false; |
mlee350 | 0:a23e3099bb0a | 283 | } |
mlee350 | 0:a23e3099bb0a | 284 | |
mlee350 | 0:a23e3099bb0a | 285 | bool Adafruit_GPS::LOCUS_StartLogger(void) { |
mlee350 | 0:a23e3099bb0a | 286 | sendCommand(PMTK_LOCUS_STARTLOG); |
mlee350 | 0:a23e3099bb0a | 287 | recvdflag = false; |
mlee350 | 0:a23e3099bb0a | 288 | return waitForSentence(PMTK_LOCUS_LOGSTARTED); |
mlee350 | 0:a23e3099bb0a | 289 | } |
mlee350 | 0:a23e3099bb0a | 290 | |
mlee350 | 0:a23e3099bb0a | 291 | bool Adafruit_GPS::LOCUS_ReadStatus(void) { |
mlee350 | 0:a23e3099bb0a | 292 | sendCommand(PMTK_LOCUS_QUERY_STATUS); |
mlee350 | 0:a23e3099bb0a | 293 | |
mlee350 | 0:a23e3099bb0a | 294 | if (! waitForSentence("$PMTKLOG")) |
mlee350 | 0:a23e3099bb0a | 295 | return false; |
mlee350 | 0:a23e3099bb0a | 296 | |
mlee350 | 0:a23e3099bb0a | 297 | char *response = lastNMEA(); |
mlee350 | 0:a23e3099bb0a | 298 | uint16_t parsed[10]; |
mlee350 | 0:a23e3099bb0a | 299 | uint8_t i; |
mlee350 | 0:a23e3099bb0a | 300 | |
mlee350 | 0:a23e3099bb0a | 301 | for (i=0; i<10; i++) parsed[i] = -1; |
mlee350 | 0:a23e3099bb0a | 302 | |
mlee350 | 0:a23e3099bb0a | 303 | response = strchr(response, ','); |
mlee350 | 0:a23e3099bb0a | 304 | for (i=0; i<10; i++) { |
mlee350 | 0:a23e3099bb0a | 305 | if (!response || (response[0] == 0) || (response[0] == '*')) |
mlee350 | 0:a23e3099bb0a | 306 | break; |
mlee350 | 0:a23e3099bb0a | 307 | response++; |
mlee350 | 0:a23e3099bb0a | 308 | parsed[i]=0; |
mlee350 | 0:a23e3099bb0a | 309 | while ((response[0] != ',') && |
mlee350 | 0:a23e3099bb0a | 310 | (response[0] != '*') && (response[0] != 0)) { |
mlee350 | 0:a23e3099bb0a | 311 | parsed[i] *= 10; |
mlee350 | 0:a23e3099bb0a | 312 | char c = response[0]; |
mlee350 | 0:a23e3099bb0a | 313 | if (isdigit(c)) |
mlee350 | 0:a23e3099bb0a | 314 | parsed[i] += c - '0'; |
mlee350 | 0:a23e3099bb0a | 315 | else |
mlee350 | 0:a23e3099bb0a | 316 | parsed[i] = c; |
mlee350 | 0:a23e3099bb0a | 317 | response++; |
mlee350 | 0:a23e3099bb0a | 318 | } |
mlee350 | 0:a23e3099bb0a | 319 | } |
mlee350 | 0:a23e3099bb0a | 320 | LOCUS_serial = parsed[0]; |
mlee350 | 0:a23e3099bb0a | 321 | LOCUS_type = parsed[1]; |
mlee350 | 0:a23e3099bb0a | 322 | if (isalpha(parsed[2])) { |
mlee350 | 0:a23e3099bb0a | 323 | parsed[2] = parsed[2] - 'a' + 10; |
mlee350 | 0:a23e3099bb0a | 324 | } |
mlee350 | 0:a23e3099bb0a | 325 | LOCUS_mode = parsed[2]; |
mlee350 | 0:a23e3099bb0a | 326 | LOCUS_config = parsed[3]; |
mlee350 | 0:a23e3099bb0a | 327 | LOCUS_interval = parsed[4]; |
mlee350 | 0:a23e3099bb0a | 328 | LOCUS_distance = parsed[5]; |
mlee350 | 0:a23e3099bb0a | 329 | LOCUS_speed = parsed[6]; |
mlee350 | 0:a23e3099bb0a | 330 | LOCUS_status = !parsed[7]; |
mlee350 | 0:a23e3099bb0a | 331 | LOCUS_records = parsed[8]; |
mlee350 | 0:a23e3099bb0a | 332 | LOCUS_percent = parsed[9]; |
mlee350 | 0:a23e3099bb0a | 333 | |
mlee350 | 0:a23e3099bb0a | 334 | return true; |
mlee350 | 0:a23e3099bb0a | 335 | } |
mlee350 | 0:a23e3099bb0a | 336 | |
mlee350 | 0:a23e3099bb0a | 337 | // Standby Mode Switches |
mlee350 | 0:a23e3099bb0a | 338 | bool Adafruit_GPS::standby(void) { |
mlee350 | 0:a23e3099bb0a | 339 | if (inStandbyMode) { |
mlee350 | 0:a23e3099bb0a | 340 | 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 | 341 | } |
mlee350 | 0:a23e3099bb0a | 342 | else { |
mlee350 | 0:a23e3099bb0a | 343 | inStandbyMode = true; |
mlee350 | 0:a23e3099bb0a | 344 | sendCommand(PMTK_STANDBY); |
mlee350 | 0:a23e3099bb0a | 345 | //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 | 346 | return true; |
mlee350 | 0:a23e3099bb0a | 347 | } |
mlee350 | 0:a23e3099bb0a | 348 | } |
mlee350 | 0:a23e3099bb0a | 349 | |
mlee350 | 0:a23e3099bb0a | 350 | bool Adafruit_GPS::wakeup(void) { |
mlee350 | 0:a23e3099bb0a | 351 | if (inStandbyMode) { |
mlee350 | 0:a23e3099bb0a | 352 | inStandbyMode = false; |
mlee350 | 0:a23e3099bb0a | 353 | sendCommand(""); // send byte to wake it up |
mlee350 | 0:a23e3099bb0a | 354 | return waitForSentence(PMTK_AWAKE); |
mlee350 | 0:a23e3099bb0a | 355 | } |
mlee350 | 0:a23e3099bb0a | 356 | else { |
mlee350 | 0:a23e3099bb0a | 357 | return false; // Returns false if not in standby mode, nothing to wakeup |
mlee350 | 0:a23e3099bb0a | 358 | } |
mlee350 | 0:a23e3099bb0a | 359 | } |