GPS精度実験

Dependents:   GPSLOG_program

Fork of MBed_Adafruit-GPS-Library by aigamozu

Committer:
s1200058
Date:
Fri Oct 14 07:58:49 2016 +0000
Revision:
8:f1c5757af8dd
Parent:
7:3f389529228e
test;

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;
s1200058 8:f1c5757af8dd 53 count_[0]++;
s1200058 8:f1c5757af8dd 54 if(count_[0] %5 == 0){
s1200058 7:3f389529228e 55 printf("%s\n",nmea);
s1200058 7:3f389529228e 56 count_[0] = 0;
s1200058 7:3f389529228e 57 }
s1200058 7:3f389529228e 58 //printf("%s\n",GPGSAdata);
kityann 5:ce26d53dc358 59
kityann 5:ce26d53dc358 60 return true;
kityann 5:ce26d53dc358 61 }
kityann 5:ce26d53dc358 62
kityann 5:ce26d53dc358 63 // look for a few common sentences
mlee350 0:a23e3099bb0a 64 if (strstr(nmea, "$GPGGA")) {
mlee350 0:a23e3099bb0a 65 // found GGA
mlee350 0:a23e3099bb0a 66 char *p = nmea;
kityann 5:ce26d53dc358 67 GPGGAdata = nmea;
s1200058 8:f1c5757af8dd 68 count_[1]++;
s1200058 8:f1c5757af8dd 69 if(count_[1]%5 == 0){
s1200058 7:3f389529228e 70 printf("%s\n",nmea);
s1200058 7:3f389529228e 71 count_[1] = 0;
s1200058 7:3f389529228e 72 }
s1200058 7:3f389529228e 73 //printf("%s\n",GPGGAdata);
s1200058 7:3f389529228e 74 /* // get time
mlee350 0:a23e3099bb0a 75 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 76 float timef = atof(p);
mlee350 0:a23e3099bb0a 77 uint32_t time = timef;
mlee350 0:a23e3099bb0a 78 hour = time / 10000;
mlee350 0:a23e3099bb0a 79 minute = (time % 10000) / 100;
mlee350 0:a23e3099bb0a 80 seconds = (time % 100);
mlee350 0:a23e3099bb0a 81
mlee350 0:a23e3099bb0a 82 milliseconds = fmod((double) timef, 1.0) * 1000;
mlee350 0:a23e3099bb0a 83
mlee350 0:a23e3099bb0a 84 // parse out latitude
m5171135 2:8203e954d8e1 85 /*
mlee350 0:a23e3099bb0a 86 p = strchr(p, ',')+1;
m5171135 1:ff72e93bcb0e 87 latitudeH = atol(p);
m5171135 1:ff72e93bcb0e 88 p = strchr(p, '.')+1;
m5171135 1:ff72e93bcb0e 89 latitudeL = atol(p);
m5171135 2:8203e954d8e1 90 */
s1200058 7:3f389529228e 91 /*
m5171135 2:8203e954d8e1 92 p = strchr(p, ',')+1;
m5171135 2:8203e954d8e1 93 long sub_latitudeH = atol(p);
m5171135 2:8203e954d8e1 94 p = strchr(p, '.')+1;
m5171135 2:8203e954d8e1 95 long sub_latitudeL = atol(p);
m5171135 2:8203e954d8e1 96
m5171135 2:8203e954d8e1 97 latitudeH = sub_latitudeH / 100;
m5171135 2:8203e954d8e1 98 latitudeL = ((sub_latitudeH % 100) *10000) + sub_latitudeL;
m5171135 2:8203e954d8e1 99
mlee350 0:a23e3099bb0a 100
mlee350 0:a23e3099bb0a 101 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 102 if (p[0] == 'N') lat = 'N';
mlee350 0:a23e3099bb0a 103 else if (p[0] == 'S') lat = 'S';
mlee350 0:a23e3099bb0a 104 else if (p[0] == ',') lat = 0;
mlee350 0:a23e3099bb0a 105 else return false;
mlee350 0:a23e3099bb0a 106
mlee350 0:a23e3099bb0a 107 // parse out longitude
m5171135 2:8203e954d8e1 108 /*p = strchr(p, ',')+1;
m5171135 1:ff72e93bcb0e 109 longitudeH = atol(p);
m5171135 1:ff72e93bcb0e 110 p = strchr(p, '.')+1;
m5171135 1:ff72e93bcb0e 111 longitudeL = atol(p);
m5171135 2:8203e954d8e1 112 */
s1200058 7:3f389529228e 113 /*
m5171135 2:8203e954d8e1 114 p = strchr(p, ',')+1;
m5171135 2:8203e954d8e1 115 long sub_longitudeH = atol(p);
m5171135 2:8203e954d8e1 116 p = strchr(p, '.')+1;
m5171135 2:8203e954d8e1 117 long sub_longitudeL = atol(p);
m5171135 2:8203e954d8e1 118
m5171135 2:8203e954d8e1 119 longitudeH = sub_longitudeH / 100;
m5171135 2:8203e954d8e1 120 longitudeL = ((sub_longitudeH % 100) *10000) + sub_longitudeL;
m5171135 2:8203e954d8e1 121
mlee350 0:a23e3099bb0a 122
mlee350 0:a23e3099bb0a 123 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 124 if (p[0] == 'W') lon = 'W';
mlee350 0:a23e3099bb0a 125 else if (p[0] == 'E') lon = 'E';
mlee350 0:a23e3099bb0a 126 else if (p[0] == ',') lon = 0;
mlee350 0:a23e3099bb0a 127 else return false;
mlee350 0:a23e3099bb0a 128
mlee350 0:a23e3099bb0a 129 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 130 fixquality = atoi(p);
mlee350 0:a23e3099bb0a 131
mlee350 0:a23e3099bb0a 132 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 133 satellites = atoi(p);
mlee350 0:a23e3099bb0a 134
mlee350 0:a23e3099bb0a 135 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 136 HDOP = atof(p);
mlee350 0:a23e3099bb0a 137
mlee350 0:a23e3099bb0a 138 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 139 altitude = atof(p);
mlee350 0:a23e3099bb0a 140 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 141 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 142 geoidheight = atof(p);
s1200058 7:3f389529228e 143 */
mlee350 0:a23e3099bb0a 144 return true;
mlee350 0:a23e3099bb0a 145 }
mlee350 0:a23e3099bb0a 146 if (strstr(nmea, "$GPRMC")) {
mlee350 0:a23e3099bb0a 147 // found RMC
mlee350 0:a23e3099bb0a 148 char *p = nmea;
s1200058 7:3f389529228e 149 GPRMCdata = nmea;
s1200058 8:f1c5757af8dd 150 count_[2]++;
s1200058 8:f1c5757af8dd 151 if(count_[2]%5== 0){
s1200058 7:3f389529228e 152 printf("%s\n",nmea);
s1200058 7:3f389529228e 153 count_[2] = 0;
s1200058 7:3f389529228e 154 }
mlee350 0:a23e3099bb0a 155 // get time
s1200058 7:3f389529228e 156 /* p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 157 float timef = atof(p);
mlee350 0:a23e3099bb0a 158 uint32_t time = timef;
mlee350 0:a23e3099bb0a 159 hour = time / 10000;
mlee350 0:a23e3099bb0a 160 minute = (time % 10000) / 100;
mlee350 0:a23e3099bb0a 161 seconds = (time % 100);
mlee350 0:a23e3099bb0a 162
mlee350 0:a23e3099bb0a 163 milliseconds = fmod((double) timef, 1.0) * 1000;
mlee350 0:a23e3099bb0a 164
mlee350 0:a23e3099bb0a 165 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 166 // Serial.println(p);
mlee350 0:a23e3099bb0a 167 if (p[0] == 'A')
mlee350 0:a23e3099bb0a 168 fix = true;
mlee350 0:a23e3099bb0a 169 else if (p[0] == 'V')
mlee350 0:a23e3099bb0a 170 fix = false;
mlee350 0:a23e3099bb0a 171 else
mlee350 0:a23e3099bb0a 172 return false;
mlee350 0:a23e3099bb0a 173
mlee350 0:a23e3099bb0a 174 // parse out latitude
m5171135 2:8203e954d8e1 175 /*
mlee350 0:a23e3099bb0a 176 p = strchr(p, ',')+1;
m5171135 1:ff72e93bcb0e 177 latitudeH = atol(p);
m5171135 1:ff72e93bcb0e 178 p = strchr(p, '.')+1;
m5171135 1:ff72e93bcb0e 179 latitudeL = atol(p);
m5171135 2:8203e954d8e1 180 */
s1200058 7:3f389529228e 181 /*
m5171135 2:8203e954d8e1 182 p = strchr(p, ',')+1;
m5171135 2:8203e954d8e1 183 long sub_latitudeH = atol(p);
m5171135 2:8203e954d8e1 184 p = strchr(p, '.')+1;
m5171135 2:8203e954d8e1 185 long sub_latitudeL = atol(p);
m5171135 2:8203e954d8e1 186
m5171135 2:8203e954d8e1 187 latitudeH = sub_latitudeH / 100;
m5171135 2:8203e954d8e1 188 latitudeL = ((sub_latitudeH % 100) *10000) + sub_latitudeL;
m5171135 2:8203e954d8e1 189
mlee350 0:a23e3099bb0a 190
mlee350 0:a23e3099bb0a 191 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 192 if (p[0] == 'N') lat = 'N';
mlee350 0:a23e3099bb0a 193 else if (p[0] == 'S') lat = 'S';
mlee350 0:a23e3099bb0a 194 else if (p[0] == ',') lat = 0;
mlee350 0:a23e3099bb0a 195 else return false;
mlee350 0:a23e3099bb0a 196
mlee350 0:a23e3099bb0a 197 // parse out longitude
m5171135 2:8203e954d8e1 198 /*
mlee350 0:a23e3099bb0a 199 p = strchr(p, ',')+1;
m5171135 1:ff72e93bcb0e 200 longitudeH = atol(p);
m5171135 1:ff72e93bcb0e 201 p = strchr(p, '.')+1;
m5171135 1:ff72e93bcb0e 202 longitudeL = atol(p);
m5171135 2:8203e954d8e1 203 */
s1200058 7:3f389529228e 204 /*
m5171135 2:8203e954d8e1 205 p = strchr(p, ',')+1;
m5171135 2:8203e954d8e1 206 long sub_longitudeH = atol(p);
m5171135 2:8203e954d8e1 207 p = strchr(p, '.')+1;
m5171135 2:8203e954d8e1 208 long sub_longitudeL = atol(p);
m5171135 2:8203e954d8e1 209
m5171135 2:8203e954d8e1 210 longitudeH = sub_longitudeH / 100;
m5171135 2:8203e954d8e1 211 longitudeL = ((sub_longitudeH % 100) *10000) + sub_longitudeL;
m5171135 2:8203e954d8e1 212
m5171135 2:8203e954d8e1 213
m5171135 1:ff72e93bcb0e 214
mlee350 0:a23e3099bb0a 215 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 216 if (p[0] == 'W') lon = 'W';
mlee350 0:a23e3099bb0a 217 else if (p[0] == 'E') lon = 'E';
mlee350 0:a23e3099bb0a 218 else if (p[0] == ',') lon = 0;
mlee350 0:a23e3099bb0a 219 else return false;
mlee350 0:a23e3099bb0a 220
mlee350 0:a23e3099bb0a 221 // speed
mlee350 0:a23e3099bb0a 222 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 223 speed = atof(p);
mlee350 0:a23e3099bb0a 224
mlee350 0:a23e3099bb0a 225 // angle
mlee350 0:a23e3099bb0a 226 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 227 angle = atof(p);
mlee350 0:a23e3099bb0a 228
mlee350 0:a23e3099bb0a 229 p = strchr(p, ',')+1;
mlee350 0:a23e3099bb0a 230 uint32_t fulldate = atof(p);
mlee350 0:a23e3099bb0a 231 day = fulldate / 10000;
mlee350 0:a23e3099bb0a 232 month = (fulldate % 10000) / 100;
mlee350 0:a23e3099bb0a 233 year = (fulldate % 100);
s1200058 7:3f389529228e 234 */
mlee350 0:a23e3099bb0a 235 // we dont parse the remaining, yet!
mlee350 0:a23e3099bb0a 236 return true;
mlee350 0:a23e3099bb0a 237 }
s1200058 7:3f389529228e 238 if (strstr(nmea, "$GPGSV")) {
s1200058 7:3f389529228e 239 // found GSV
s1200058 7:3f389529228e 240 char *p = nmea;
s1200058 7:3f389529228e 241 GPGSVdata = nmea;
s1200058 7:3f389529228e 242 char flag = GPGSVdata[9];
s1200058 8:f1c5757af8dd 243 /* if(flag == '1'){
s1200058 7:3f389529228e 244 GPGSVdataA = nmea;
s1200058 7:3f389529228e 245 GPGSVdataB = "";
s1200058 7:3f389529228e 246 GPGSVdataC = "";
s1200058 7:3f389529228e 247 GPGSVdataD = "";
s1200058 7:3f389529228e 248 }
s1200058 7:3f389529228e 249 else if(flag == '2'){
s1200058 7:3f389529228e 250 GPGSVdataB = nmea;
s1200058 7:3f389529228e 251 }
s1200058 7:3f389529228e 252 else if(flag == '3'){
s1200058 7:3f389529228e 253 GPGSVdataC = nmea;
s1200058 7:3f389529228e 254 }
s1200058 7:3f389529228e 255 else if(flag == '4'){
s1200058 7:3f389529228e 256 GPGSVdataD = nmea;
s1200058 7:3f389529228e 257 }
s1200058 7:3f389529228e 258 if(flag == GPGSVdata[7]){
s1200058 7:3f389529228e 259 print_ok = 1;
s1200058 7:3f389529228e 260 }
s1200058 7:3f389529228e 261 else{
s1200058 7:3f389529228e 262 print_ok = 0;
s1200058 7:3f389529228e 263 }
s1200058 8:f1c5757af8dd 264 */ // printf("%s\n",GPGSVdata);
s1200058 7:3f389529228e 265 printf("%s\n",nmea);
s1200058 8:f1c5757af8dd 266 count_[0] = 1;
s1200058 8:f1c5757af8dd 267 count_[1] = 1;
s1200058 8:f1c5757af8dd 268 count_[2] = 1;
s1200058 7:3f389529228e 269 return true;
s1200058 7:3f389529228e 270 }
mlee350 0:a23e3099bb0a 271
mlee350 0:a23e3099bb0a 272 return false;
mlee350 0:a23e3099bb0a 273 }
mlee350 0:a23e3099bb0a 274
mlee350 0:a23e3099bb0a 275 char Adafruit_GPS::read(void) {
mlee350 0:a23e3099bb0a 276 char c = 0;
mlee350 0:a23e3099bb0a 277
mlee350 0:a23e3099bb0a 278 if (paused) return c;
mlee350 0:a23e3099bb0a 279
mlee350 0:a23e3099bb0a 280 if(!gpsSerial->readable()) return c;
mlee350 0:a23e3099bb0a 281 c = gpsSerial->getc();
mlee350 0:a23e3099bb0a 282
mlee350 0:a23e3099bb0a 283 //Serial.print(c);
mlee350 0:a23e3099bb0a 284
mlee350 0:a23e3099bb0a 285 if (c == '$') {
mlee350 0:a23e3099bb0a 286 currentline[lineidx] = 0;
mlee350 0:a23e3099bb0a 287 lineidx = 0;
mlee350 0:a23e3099bb0a 288 }
mlee350 0:a23e3099bb0a 289 if (c == '\n') {
mlee350 0:a23e3099bb0a 290 currentline[lineidx] = 0;
mlee350 0:a23e3099bb0a 291
mlee350 0:a23e3099bb0a 292 if (currentline == line1) {
mlee350 0:a23e3099bb0a 293 currentline = line2;
mlee350 0:a23e3099bb0a 294 lastline = line1;
mlee350 0:a23e3099bb0a 295 } else {
mlee350 0:a23e3099bb0a 296 currentline = line1;
mlee350 0:a23e3099bb0a 297 lastline = line2;
mlee350 0:a23e3099bb0a 298 }
mlee350 0:a23e3099bb0a 299
mlee350 0:a23e3099bb0a 300 lineidx = 0;
mlee350 0:a23e3099bb0a 301 recvdflag = true;
mlee350 0:a23e3099bb0a 302 }
mlee350 0:a23e3099bb0a 303
mlee350 0:a23e3099bb0a 304 currentline[lineidx++] = c;
mlee350 0:a23e3099bb0a 305 if (lineidx >= MAXLINELENGTH)
mlee350 0:a23e3099bb0a 306 lineidx = MAXLINELENGTH-1;
mlee350 0:a23e3099bb0a 307
mlee350 0:a23e3099bb0a 308 return c;
mlee350 0:a23e3099bb0a 309 }
mlee350 0:a23e3099bb0a 310
mlee350 0:a23e3099bb0a 311 Adafruit_GPS::Adafruit_GPS (Serial *ser)
mlee350 0:a23e3099bb0a 312 {
mlee350 0:a23e3099bb0a 313 common_init(); // Set everything to common state, then...
mlee350 0:a23e3099bb0a 314 gpsSerial = ser; // ...override gpsSwSerial with value passed.
kityann 4:7ef0dd12940c 315 latitudeH=0;latitudeL=0;longitudeH=0;longitudeL=0;
kityann 4:7ef0dd12940c 316 latitudeKH=0;latitudeKL=0;longitudeKH=0;longitudeKL=0;
mlee350 0:a23e3099bb0a 317 }
mlee350 0:a23e3099bb0a 318
mlee350 0:a23e3099bb0a 319 // Initialization code used by all constructor types
mlee350 0:a23e3099bb0a 320 void Adafruit_GPS::common_init(void) {
mlee350 0:a23e3099bb0a 321 gpsSerial = NULL;
mlee350 0:a23e3099bb0a 322 recvdflag = false;
mlee350 0:a23e3099bb0a 323 paused = false;
mlee350 0:a23e3099bb0a 324 lineidx = 0;
mlee350 0:a23e3099bb0a 325 currentline = line1;
mlee350 0:a23e3099bb0a 326 lastline = line2;
mlee350 0:a23e3099bb0a 327
mlee350 0:a23e3099bb0a 328 hour = minute = seconds = year = month = day =
mlee350 0:a23e3099bb0a 329 fixquality = satellites = 0; // uint8_t
mlee350 0:a23e3099bb0a 330 lat = lon = mag = 0; // char
mlee350 0:a23e3099bb0a 331 fix = false; // bool
mlee350 0:a23e3099bb0a 332 milliseconds = 0; // uint16_t
m5171135 1:ff72e93bcb0e 333 geoidheight = altitude = speed = angle = magvariation = HDOP = 0.0; // float
m5171135 1:ff72e93bcb0e 334 latitudeH = latitudeL = longitudeH = longitudeL = 0;
m5171135 1:ff72e93bcb0e 335
mlee350 0:a23e3099bb0a 336 }
mlee350 0:a23e3099bb0a 337
mlee350 0:a23e3099bb0a 338 void Adafruit_GPS::begin(int baud)
mlee350 0:a23e3099bb0a 339 {
mlee350 0:a23e3099bb0a 340 gpsSerial->baud(baud);
mlee350 0:a23e3099bb0a 341 wait_ms(10);
mlee350 0:a23e3099bb0a 342 }
mlee350 0:a23e3099bb0a 343
mlee350 0:a23e3099bb0a 344 void Adafruit_GPS::sendCommand(char *str) {
mlee350 0:a23e3099bb0a 345 gpsSerial->printf("%s",str);
mlee350 0:a23e3099bb0a 346 }
mlee350 0:a23e3099bb0a 347
mlee350 0:a23e3099bb0a 348 bool Adafruit_GPS::newNMEAreceived(void) {
mlee350 0:a23e3099bb0a 349 return recvdflag;
mlee350 0:a23e3099bb0a 350 }
mlee350 0:a23e3099bb0a 351
mlee350 0:a23e3099bb0a 352 void Adafruit_GPS::pause(bool p) {
mlee350 0:a23e3099bb0a 353 paused = p;
mlee350 0:a23e3099bb0a 354 }
mlee350 0:a23e3099bb0a 355
mlee350 0:a23e3099bb0a 356 char *Adafruit_GPS::lastNMEA(void) {
mlee350 0:a23e3099bb0a 357 recvdflag = false;
mlee350 0:a23e3099bb0a 358 return (char *)lastline;
mlee350 0:a23e3099bb0a 359 }
mlee350 0:a23e3099bb0a 360
mlee350 0:a23e3099bb0a 361 // read a Hex value and return the decimal equivalent
mlee350 0:a23e3099bb0a 362 uint8_t Adafruit_GPS::parseHex(char c) {
mlee350 0:a23e3099bb0a 363 if (c < '0')
mlee350 0:a23e3099bb0a 364 return 0;
mlee350 0:a23e3099bb0a 365 if (c <= '9')
mlee350 0:a23e3099bb0a 366 return c - '0';
mlee350 0:a23e3099bb0a 367 if (c < 'A')
mlee350 0:a23e3099bb0a 368 return 0;
mlee350 0:a23e3099bb0a 369 if (c <= 'F')
mlee350 0:a23e3099bb0a 370 return (c - 'A')+10;
mlee350 0:a23e3099bb0a 371 }
mlee350 0:a23e3099bb0a 372
mlee350 0:a23e3099bb0a 373 bool Adafruit_GPS::waitForSentence(char *wait4me, uint8_t max) {
mlee350 0:a23e3099bb0a 374 char str[20];
mlee350 0:a23e3099bb0a 375
mlee350 0:a23e3099bb0a 376 uint8_t i=0;
mlee350 0:a23e3099bb0a 377 while (i < max) {
mlee350 0:a23e3099bb0a 378 if (newNMEAreceived()) {
mlee350 0:a23e3099bb0a 379 char *nmea = lastNMEA();
mlee350 0:a23e3099bb0a 380 strncpy(str, nmea, 20);
mlee350 0:a23e3099bb0a 381 str[19] = 0;
mlee350 0:a23e3099bb0a 382 i++;
mlee350 0:a23e3099bb0a 383
mlee350 0:a23e3099bb0a 384 if (strstr(str, wait4me))
mlee350 0:a23e3099bb0a 385 return true;
mlee350 0:a23e3099bb0a 386 }
mlee350 0:a23e3099bb0a 387 }
mlee350 0:a23e3099bb0a 388
mlee350 0:a23e3099bb0a 389 return false;
mlee350 0:a23e3099bb0a 390 }
mlee350 0:a23e3099bb0a 391
mlee350 0:a23e3099bb0a 392 bool Adafruit_GPS::LOCUS_StartLogger(void) {
mlee350 0:a23e3099bb0a 393 sendCommand(PMTK_LOCUS_STARTLOG);
mlee350 0:a23e3099bb0a 394 recvdflag = false;
mlee350 0:a23e3099bb0a 395 return waitForSentence(PMTK_LOCUS_LOGSTARTED);
mlee350 0:a23e3099bb0a 396 }
mlee350 0:a23e3099bb0a 397
mlee350 0:a23e3099bb0a 398 bool Adafruit_GPS::LOCUS_ReadStatus(void) {
mlee350 0:a23e3099bb0a 399 sendCommand(PMTK_LOCUS_QUERY_STATUS);
mlee350 0:a23e3099bb0a 400
mlee350 0:a23e3099bb0a 401 if (! waitForSentence("$PMTKLOG"))
mlee350 0:a23e3099bb0a 402 return false;
mlee350 0:a23e3099bb0a 403
mlee350 0:a23e3099bb0a 404 char *response = lastNMEA();
mlee350 0:a23e3099bb0a 405 uint16_t parsed[10];
mlee350 0:a23e3099bb0a 406 uint8_t i;
mlee350 0:a23e3099bb0a 407
mlee350 0:a23e3099bb0a 408 for (i=0; i<10; i++) parsed[i] = -1;
mlee350 0:a23e3099bb0a 409
mlee350 0:a23e3099bb0a 410 response = strchr(response, ',');
mlee350 0:a23e3099bb0a 411 for (i=0; i<10; i++) {
mlee350 0:a23e3099bb0a 412 if (!response || (response[0] == 0) || (response[0] == '*'))
mlee350 0:a23e3099bb0a 413 break;
mlee350 0:a23e3099bb0a 414 response++;
mlee350 0:a23e3099bb0a 415 parsed[i]=0;
mlee350 0:a23e3099bb0a 416 while ((response[0] != ',') &&
mlee350 0:a23e3099bb0a 417 (response[0] != '*') && (response[0] != 0)) {
mlee350 0:a23e3099bb0a 418 parsed[i] *= 10;
mlee350 0:a23e3099bb0a 419 char c = response[0];
mlee350 0:a23e3099bb0a 420 if (isdigit(c))
mlee350 0:a23e3099bb0a 421 parsed[i] += c - '0';
mlee350 0:a23e3099bb0a 422 else
mlee350 0:a23e3099bb0a 423 parsed[i] = c;
mlee350 0:a23e3099bb0a 424 response++;
mlee350 0:a23e3099bb0a 425 }
mlee350 0:a23e3099bb0a 426 }
mlee350 0:a23e3099bb0a 427 LOCUS_serial = parsed[0];
mlee350 0:a23e3099bb0a 428 LOCUS_type = parsed[1];
mlee350 0:a23e3099bb0a 429 if (isalpha(parsed[2])) {
mlee350 0:a23e3099bb0a 430 parsed[2] = parsed[2] - 'a' + 10;
mlee350 0:a23e3099bb0a 431 }
mlee350 0:a23e3099bb0a 432 LOCUS_mode = parsed[2];
mlee350 0:a23e3099bb0a 433 LOCUS_config = parsed[3];
mlee350 0:a23e3099bb0a 434 LOCUS_interval = parsed[4];
mlee350 0:a23e3099bb0a 435 LOCUS_distance = parsed[5];
mlee350 0:a23e3099bb0a 436 LOCUS_speed = parsed[6];
mlee350 0:a23e3099bb0a 437 LOCUS_status = !parsed[7];
mlee350 0:a23e3099bb0a 438 LOCUS_records = parsed[8];
mlee350 0:a23e3099bb0a 439 LOCUS_percent = parsed[9];
mlee350 0:a23e3099bb0a 440
mlee350 0:a23e3099bb0a 441 return true;
mlee350 0:a23e3099bb0a 442 }
mlee350 0:a23e3099bb0a 443
mlee350 0:a23e3099bb0a 444 // Standby Mode Switches
mlee350 0:a23e3099bb0a 445 bool Adafruit_GPS::standby(void) {
mlee350 0:a23e3099bb0a 446 if (inStandbyMode) {
mlee350 0:a23e3099bb0a 447 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 448 }
mlee350 0:a23e3099bb0a 449 else {
mlee350 0:a23e3099bb0a 450 inStandbyMode = true;
mlee350 0:a23e3099bb0a 451 sendCommand(PMTK_STANDBY);
mlee350 0:a23e3099bb0a 452 //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 453 return true;
mlee350 0:a23e3099bb0a 454 }
mlee350 0:a23e3099bb0a 455 }
mlee350 0:a23e3099bb0a 456
mlee350 0:a23e3099bb0a 457 bool Adafruit_GPS::wakeup(void) {
mlee350 0:a23e3099bb0a 458 if (inStandbyMode) {
mlee350 0:a23e3099bb0a 459 inStandbyMode = false;
mlee350 0:a23e3099bb0a 460 sendCommand(""); // send byte to wake it up
mlee350 0:a23e3099bb0a 461 return waitForSentence(PMTK_AWAKE);
mlee350 0:a23e3099bb0a 462 }
mlee350 0:a23e3099bb0a 463 else {
mlee350 0:a23e3099bb0a 464 return false; // Returns false if not in standby mode, nothing to wakeup
mlee350 0:a23e3099bb0a 465 }
mlee350 0:a23e3099bb0a 466 }