Dave Turner / GPS
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?

UserRevisionLine numberNew 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 }