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.
gps.cpp@0:7f20540d3281, 2015-04-08 (annotated)
- Committer:
- StressedDave
- Date:
- Wed Apr 08 19:06:39 2015 +0000
- Revision:
- 0:7f20540d3281
- Child:
- 1:a091e3ca8443
Baseline for MTK GPS parser
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| StressedDave | 0:7f20540d3281 | 1 | #include "mbed.h" |
| StressedDave | 0:7f20540d3281 | 2 | #include "gps.h" |
| StressedDave | 0:7f20540d3281 | 3 | |
| StressedDave | 0:7f20540d3281 | 4 | GPS::GPS(void){ |
| StressedDave | 0:7f20540d3281 | 5 | |
| StressedDave | 0:7f20540d3281 | 6 | latitude = 0.0f; |
| StressedDave | 0:7f20540d3281 | 7 | longitude = 0.0f; |
| StressedDave | 0:7f20540d3281 | 8 | speed = 0.0f; |
| StressedDave | 0:7f20540d3281 | 9 | angle = 0.0f; |
| StressedDave | 0:7f20540d3281 | 10 | hour = 0; |
| StressedDave | 0:7f20540d3281 | 11 | minute = 0; |
| StressedDave | 0:7f20540d3281 | 12 | seconds = 0; |
| StressedDave | 0:7f20540d3281 | 13 | year = 0; |
| StressedDave | 0:7f20540d3281 | 14 | month = 0; |
| StressedDave | 0:7f20540d3281 | 15 | day = 0; |
| StressedDave | 0:7f20540d3281 | 16 | milliseconds = 0; |
| StressedDave | 0:7f20540d3281 | 17 | fix = false; |
| StressedDave | 0:7f20540d3281 | 18 | lineidx = 0; |
| StressedDave | 0:7f20540d3281 | 19 | newSentence = false; |
| StressedDave | 0:7f20540d3281 | 20 | firstfix = false; |
| StressedDave | 0:7f20540d3281 | 21 | } |
| StressedDave | 0:7f20540d3281 | 22 | |
| StressedDave | 0:7f20540d3281 | 23 | bool GPS::parse(char *nmea) { |
| StressedDave | 0:7f20540d3281 | 24 | uint16_t sum; |
| StressedDave | 0:7f20540d3281 | 25 | // do checksum check |
| StressedDave | 0:7f20540d3281 | 26 | // first look if we even have one |
| StressedDave | 0:7f20540d3281 | 27 | if (nmea[strlen(nmea)-4] == '*') { |
| StressedDave | 0:7f20540d3281 | 28 | sum = parseHex(nmea[strlen(nmea)-3]) * 16; |
| StressedDave | 0:7f20540d3281 | 29 | sum += parseHex(nmea[strlen(nmea)-2]); |
| StressedDave | 0:7f20540d3281 | 30 | // check checksum |
| StressedDave | 0:7f20540d3281 | 31 | for (uint8_t i=1; i < (strlen(nmea)-4); i++) { |
| StressedDave | 0:7f20540d3281 | 32 | sum ^= nmea[i]; |
| StressedDave | 0:7f20540d3281 | 33 | } |
| StressedDave | 0:7f20540d3281 | 34 | if (sum != 0) { |
| StressedDave | 0:7f20540d3281 | 35 | // bad checksum :( |
| StressedDave | 0:7f20540d3281 | 36 | return false; |
| StressedDave | 0:7f20540d3281 | 37 | } |
| StressedDave | 0:7f20540d3281 | 38 | } |
| StressedDave | 0:7f20540d3281 | 39 | // bad string |
| StressedDave | 0:7f20540d3281 | 40 | else return false; |
| StressedDave | 0:7f20540d3281 | 41 | |
| StressedDave | 0:7f20540d3281 | 42 | float minutes; |
| StressedDave | 0:7f20540d3281 | 43 | char degreebuff[10]; |
| StressedDave | 0:7f20540d3281 | 44 | // look for RMC sentence only |
| StressedDave | 0:7f20540d3281 | 45 | if (strstr(nmea, "$GPRMC")) { |
| StressedDave | 0:7f20540d3281 | 46 | char *p = nmea; |
| StressedDave | 0:7f20540d3281 | 47 | // get time |
| StressedDave | 0:7f20540d3281 | 48 | p = strchr(p, ',')+1; |
| StressedDave | 0:7f20540d3281 | 49 | timef = atof(p)*(float)10; |
| StressedDave | 0:7f20540d3281 | 50 | uint32_t time = timef; |
| StressedDave | 0:7f20540d3281 | 51 | hour = time / 100000; |
| StressedDave | 0:7f20540d3281 | 52 | minute = (time % 100000) / 1000; |
| StressedDave | 0:7f20540d3281 | 53 | seconds = (time % 1000)/10; |
| StressedDave | 0:7f20540d3281 | 54 | milliseconds = time % 10; |
| StressedDave | 0:7f20540d3281 | 55 | //Check for valid fix |
| StressedDave | 0:7f20540d3281 | 56 | p = strchr(p, ',')+1; |
| StressedDave | 0:7f20540d3281 | 57 | if (p[0] == 'A') fix = true; |
| StressedDave | 0:7f20540d3281 | 58 | else if (p[0] == 'V') fix = false; |
| StressedDave | 0:7f20540d3281 | 59 | else return false; |
| StressedDave | 0:7f20540d3281 | 60 | // parse out latitude |
| StressedDave | 0:7f20540d3281 | 61 | p = strchr(p, ',')+1; |
| StressedDave | 0:7f20540d3281 | 62 | if (',' != *p) |
| StressedDave | 0:7f20540d3281 | 63 | //Not empty value due to no fix |
| StressedDave | 0:7f20540d3281 | 64 | { |
| StressedDave | 0:7f20540d3281 | 65 | strncpy(degreebuff, p, 2); |
| StressedDave | 0:7f20540d3281 | 66 | p += 2; |
| StressedDave | 0:7f20540d3281 | 67 | degreebuff[2] = '\0'; |
| StressedDave | 0:7f20540d3281 | 68 | latitude = atof(degreebuff); |
| StressedDave | 0:7f20540d3281 | 69 | strncpy(degreebuff, p, 7); // float minutes |
| StressedDave | 0:7f20540d3281 | 70 | degreebuff[7] = '\0'; |
| StressedDave | 0:7f20540d3281 | 71 | minutes = atof(degreebuff)/60; |
| StressedDave | 0:7f20540d3281 | 72 | latitude += minutes; |
| StressedDave | 0:7f20540d3281 | 73 | } |
| StressedDave | 0:7f20540d3281 | 74 | p = strchr(p, ',')+1; |
| StressedDave | 0:7f20540d3281 | 75 | if (',' != *p) |
| StressedDave | 0:7f20540d3281 | 76 | { |
| StressedDave | 0:7f20540d3281 | 77 | if (p[0] == 'S') longitude *= -1.0; |
| StressedDave | 0:7f20540d3281 | 78 | } |
| StressedDave | 0:7f20540d3281 | 79 | // parse out longitude |
| StressedDave | 0:7f20540d3281 | 80 | p = strchr(p, ',')+1; |
| StressedDave | 0:7f20540d3281 | 81 | if (',' != *p) |
| StressedDave | 0:7f20540d3281 | 82 | //Not empty value due to no fix |
| StressedDave | 0:7f20540d3281 | 83 | { |
| StressedDave | 0:7f20540d3281 | 84 | strncpy(degreebuff, p, 2); |
| StressedDave | 0:7f20540d3281 | 85 | p += 2; |
| StressedDave | 0:7f20540d3281 | 86 | degreebuff[2] = '\0'; |
| StressedDave | 0:7f20540d3281 | 87 | longitude = atof(degreebuff); |
| StressedDave | 0:7f20540d3281 | 88 | strncpy(degreebuff, p, 7); // float minutes |
| StressedDave | 0:7f20540d3281 | 89 | degreebuff[7] = '\0'; |
| StressedDave | 0:7f20540d3281 | 90 | minutes = atof(degreebuff)/60; |
| StressedDave | 0:7f20540d3281 | 91 | longitude += minutes; |
| StressedDave | 0:7f20540d3281 | 92 | } |
| StressedDave | 0:7f20540d3281 | 93 | p = strchr(p, ',')+1; |
| StressedDave | 0:7f20540d3281 | 94 | if (',' != *p) |
| StressedDave | 0:7f20540d3281 | 95 | { |
| StressedDave | 0:7f20540d3281 | 96 | if (p[0] == 'W') longitude *= -1.0; |
| StressedDave | 0:7f20540d3281 | 97 | } |
| StressedDave | 0:7f20540d3281 | 98 | // speed |
| StressedDave | 0:7f20540d3281 | 99 | p = strchr(p, ',')+1; |
| StressedDave | 0:7f20540d3281 | 100 | if (',' != *p) |
| StressedDave | 0:7f20540d3281 | 101 | { |
| StressedDave | 0:7f20540d3281 | 102 | speed = atof(p)*knots_to_ms; |
| StressedDave | 0:7f20540d3281 | 103 | } |
| StressedDave | 0:7f20540d3281 | 104 | |
| StressedDave | 0:7f20540d3281 | 105 | // angle |
| StressedDave | 0:7f20540d3281 | 106 | p = strchr(p, ',')+1; |
| StressedDave | 0:7f20540d3281 | 107 | if (',' != *p) |
| StressedDave | 0:7f20540d3281 | 108 | { |
| StressedDave | 0:7f20540d3281 | 109 | angle = atof(p); |
| StressedDave | 0:7f20540d3281 | 110 | } |
| StressedDave | 0:7f20540d3281 | 111 | |
| StressedDave | 0:7f20540d3281 | 112 | p = strchr(p, ',')+1; |
| StressedDave | 0:7f20540d3281 | 113 | if (',' != *p) |
| StressedDave | 0:7f20540d3281 | 114 | { |
| StressedDave | 0:7f20540d3281 | 115 | uint32_t fulldate = atof(p); |
| StressedDave | 0:7f20540d3281 | 116 | day = fulldate / 10000; |
| StressedDave | 0:7f20540d3281 | 117 | month = (fulldate % 10000) / 100; |
| StressedDave | 0:7f20540d3281 | 118 | year = (fulldate % 100); |
| StressedDave | 0:7f20540d3281 | 119 | } |
| StressedDave | 0:7f20540d3281 | 120 | return true; |
| StressedDave | 0:7f20540d3281 | 121 | } |
| StressedDave | 0:7f20540d3281 | 122 | return false; |
| StressedDave | 0:7f20540d3281 | 123 | } |