From 77176c2afd0ce47c94672f24441192bcd1ea7812 Mon Sep 17 00:00:00 2001 From: sellensr Date: Sun, 14 Apr 2019 19:40:39 -0400 Subject: [PATCH 1/7] #define for 115200 baud --- Adafruit_GPS.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Adafruit_GPS.h b/Adafruit_GPS.h index fa9a5cd..ec999df 100755 --- a/Adafruit_GPS.h +++ b/Adafruit_GPS.h @@ -51,8 +51,9 @@ #define PMTK_API_SET_FIX_CTL_5HZ "$PMTK300,200,0,0,0,0*2F" ///< 5 Hz // Can't fix position faster than 5 times a second! -#define PMTK_SET_BAUD_57600 "$PMTK251,57600*2C" ///< 57600 bps -#define PMTK_SET_BAUD_9600 "$PMTK251,9600*17" ///< 9600 bps +#define PMTK_SET_BAUD_115200 "$PMTK251,115200*1F" ///< 115200 bps +#define PMTK_SET_BAUD_57600 "$PMTK251,57600*2C" ///< 57600 bps +#define PMTK_SET_BAUD_9600 "$PMTK251,9600*17" ///< 9600 bps #define PMTK_SET_NMEA_OUTPUT_RMCONLY "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29" ///< turn on only the second sentence (GPRMC) #define PMTK_SET_NMEA_OUTPUT_RMCGGA "$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28" ///< turn on GPRMC and GGA From 8e17fcc9a96b583ad1a4896a765c78f3ba32de5e Mon Sep 17 00:00:00 2001 From: sellensr Date: Sun, 14 Apr 2019 20:25:59 -0400 Subject: [PATCH 2/7] Add $GPGLL sentence to parsing $GPGLL has fewer arguments in a different order. The $GPRMC code was directly copied and the order rearranged. --- Adafruit_GPS.cpp | 83 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/Adafruit_GPS.cpp b/Adafruit_GPS.cpp index 80e5f57..20a167b 100755 --- a/Adafruit_GPS.cpp +++ b/Adafruit_GPS.cpp @@ -280,6 +280,89 @@ boolean Adafruit_GPS::parse(char *nmea) { // we dont parse the remaining, yet! return true; } + if (strstr(nmea, "$GPGLL")) { + // found GLL + char *p = nmea; + + // parse out latitude + p = strchr(p, ',')+1; + if (',' != *p) + { + strncpy(degreebuff, p, 2); + p += 2; + degreebuff[2] = '\0'; + long degree = atol(degreebuff) * 10000000; + strncpy(degreebuff, p, 2); // minutes + p += 3; // skip decimal point + strncpy(degreebuff + 2, p, 4); + degreebuff[6] = '\0'; + long minutes = 50 * atol(degreebuff) / 3; + latitude_fixed = degree + minutes; + latitude = degree / 100000 + minutes * 0.000006F; + latitudeDegrees = (latitude-100*int(latitude/100))/60.0; + latitudeDegrees += int(latitude/100); + } + + p = strchr(p, ',')+1; + if (',' != *p) + { + if (p[0] == 'S') latitudeDegrees *= -1.0; + if (p[0] == 'N') lat = 'N'; + else if (p[0] == 'S') lat = 'S'; + else if (p[0] == ',') lat = 0; + else return false; + } + + // parse out longitude + p = strchr(p, ',')+1; + if (',' != *p) + { + strncpy(degreebuff, p, 3); + p += 3; + degreebuff[3] = '\0'; + degree = atol(degreebuff) * 10000000; + strncpy(degreebuff, p, 2); // minutes + p += 3; // skip decimal point + strncpy(degreebuff + 2, p, 4); + degreebuff[6] = '\0'; + minutes = 50 * atol(degreebuff) / 3; + longitude_fixed = degree + minutes; + longitude = degree / 100000 + minutes * 0.000006F; + longitudeDegrees = (longitude-100*int(longitude/100))/60.0; + longitudeDegrees += int(longitude/100); + } + + p = strchr(p, ',')+1; + if (',' != *p) + { + if (p[0] == 'W') longitudeDegrees *= -1.0; + if (p[0] == 'W') lon = 'W'; + else if (p[0] == 'E') lon = 'E'; + else if (p[0] == ',') lon = 0; + else return false; + } + + // get time + p = strchr(p, ',')+1; + float timef = atof(p); + uint32_t time = timef; + hour = time / 10000; + minute = (time % 10000) / 100; + seconds = (time % 100); + + milliseconds = fmod(timef, 1.0) * 1000; + + p = strchr(p, ',')+1; + // Serial.println(p); + if (p[0] == 'A') + fix = true; + else if (p[0] == 'V') + fix = false; + else + return false; + + return true; + } return false; } From 0f867b508a8d5c4ac89c3a902275b8407c76d39a Mon Sep 17 00:00:00 2001 From: sellensr Date: Mon, 15 Apr 2019 11:51:40 -0400 Subject: [PATCH 3/7] parse checksum to * Parse the NMEA checksum based on the location of the asterisk, rather than the end of the string. Avoids problems if line ends with other than CRLF. --- Adafruit_GPS.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Adafruit_GPS.cpp b/Adafruit_GPS.cpp index 20a167b..0535d57 100755 --- a/Adafruit_GPS.cpp +++ b/Adafruit_GPS.cpp @@ -55,13 +55,14 @@ boolean Adafruit_GPS::parse(char *nmea) { // do checksum check // first look if we even have one - if (nmea[strlen(nmea)-4] == '*') { - uint16_t sum = parseHex(nmea[strlen(nmea)-3]) * 16; - sum += parseHex(nmea[strlen(nmea)-2]); + char *ast = strchr(nmea,'*'); + if (ast != NULL) { + uint16_t sum = parseHex(*(ast+1)) * 16; + sum += parseHex(*(ast+2)); // check checksum - for (uint8_t i=2; i < (strlen(nmea)-4); i++) { - sum ^= nmea[i]; + for (char *p = nmea+2; p < ast; p++) { + sum ^= *p; } if (sum != 0) { // bad checksum :( From 8bad5eacfb5aefc15ad3f81ab4db38fd1004d3b7 Mon Sep 17 00:00:00 2001 From: sellensr Date: Mon, 15 Apr 2019 13:50:37 -0400 Subject: [PATCH 4/7] tidy lines and checksum Parse start of checksum as character after first $. Don't include '\n' or '\r' in GPS lines read. Previous code was putting '\r' at the end of each line and '\n' at the start before the $, thus having to start the checksum calculation at the third character. This may break the spacing on some code that prints out the NMEA lines. --- Adafruit_GPS.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adafruit_GPS.cpp b/Adafruit_GPS.cpp index 0535d57..c1891d0 100755 --- a/Adafruit_GPS.cpp +++ b/Adafruit_GPS.cpp @@ -61,7 +61,7 @@ boolean Adafruit_GPS::parse(char *nmea) { sum += parseHex(*(ast+2)); // check checksum - for (char *p = nmea+2; p < ast; p++) { + for (char *p = strchr(nmea,'$')+1; p < ast; p++) { sum ^= *p; } if (sum != 0) { @@ -414,7 +414,7 @@ char Adafruit_GPS::read(void) { recvdflag = true; } - currentline[lineidx++] = c; + if(c != '\n' && c != '\r') currentline[lineidx++] = c; if (lineidx >= MAXLINELENGTH) lineidx = MAXLINELENGTH-1; From 37fed7f05d2d746105556759c9eaf66cacb64d30 Mon Sep 17 00:00:00 2001 From: Rick Sellens Date: Tue, 16 Apr 2019 12:48:02 -0400 Subject: [PATCH 5/7] Revert "tidy lines and checksum" This reverts commit 8bad5eacfb5aefc15ad3f81ab4db38fd1004d3b7. --- Adafruit_GPS.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Adafruit_GPS.cpp b/Adafruit_GPS.cpp index c1891d0..0535d57 100755 --- a/Adafruit_GPS.cpp +++ b/Adafruit_GPS.cpp @@ -61,7 +61,7 @@ boolean Adafruit_GPS::parse(char *nmea) { sum += parseHex(*(ast+2)); // check checksum - for (char *p = strchr(nmea,'$')+1; p < ast; p++) { + for (char *p = nmea+2; p < ast; p++) { sum ^= *p; } if (sum != 0) { @@ -414,7 +414,7 @@ char Adafruit_GPS::read(void) { recvdflag = true; } - if(c != '\n' && c != '\r') currentline[lineidx++] = c; + currentline[lineidx++] = c; if (lineidx >= MAXLINELENGTH) lineidx = MAXLINELENGTH-1; From 968e95344c82b84ce529d8ee53212fb3b411d8f0 Mon Sep 17 00:00:00 2001 From: Rick Sellens Date: Tue, 16 Apr 2019 12:49:05 -0400 Subject: [PATCH 6/7] Revert "parse checksum to *" This reverts commit 0f867b508a8d5c4ac89c3a902275b8407c76d39a. --- Adafruit_GPS.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Adafruit_GPS.cpp b/Adafruit_GPS.cpp index 0535d57..20a167b 100755 --- a/Adafruit_GPS.cpp +++ b/Adafruit_GPS.cpp @@ -55,14 +55,13 @@ boolean Adafruit_GPS::parse(char *nmea) { // do checksum check // first look if we even have one - char *ast = strchr(nmea,'*'); - if (ast != NULL) { - uint16_t sum = parseHex(*(ast+1)) * 16; - sum += parseHex(*(ast+2)); + if (nmea[strlen(nmea)-4] == '*') { + uint16_t sum = parseHex(nmea[strlen(nmea)-3]) * 16; + sum += parseHex(nmea[strlen(nmea)-2]); // check checksum - for (char *p = nmea+2; p < ast; p++) { - sum ^= *p; + for (uint8_t i=2; i < (strlen(nmea)-4); i++) { + sum ^= nmea[i]; } if (sum != 0) { // bad checksum :( From b431f2049151cf5512bee8eac861acc0393ec25c Mon Sep 17 00:00:00 2001 From: Rick Sellens Date: Tue, 16 Apr 2019 13:41:25 -0400 Subject: [PATCH 7/7] update to strStartsWith() strStartsWith(nmea, "$GPGLL") now used to identify the sentence. --- Adafruit_GPS.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adafruit_GPS.cpp b/Adafruit_GPS.cpp index fde50c0..c53aea4 100755 --- a/Adafruit_GPS.cpp +++ b/Adafruit_GPS.cpp @@ -285,7 +285,7 @@ boolean Adafruit_GPS::parse(char *nmea) { // we dont parse the remaining, yet! return true; } - if (strstr(nmea, "$GPGLL")) { + if (strStartsWith(nmea, "$GPGLL")) { // found GLL char *p = nmea;