fix cordinate and speed data
Fork of GPS by
Diff: GPS.cpp
- Revision:
- 1:014d955e3c29
- Parent:
- 0:15611c7938a3
diff -r 15611c7938a3 -r 014d955e3c29 GPS.cpp --- a/GPS.cpp Tue Jun 08 14:10:27 2010 +0000 +++ b/GPS.cpp Mon Jun 13 07:15:55 2016 +0000 @@ -21,44 +21,72 @@ */ #include "GPS.h" - +#define GPS_KMPH_PER_KNOT 1.852 + + GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) { _gps.baud(4800); longitude = 0.0; latitude = 0.0; } - + int GPS::sample() { - float time; - char ns, ew; + float time, timefix; + char ns, ew, ns2, ew2, warning; int lock; - + while(1) { getline(); - + // Check if it is a GPGGA msg (matches both locked and non-locked msg) - if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d", &time, &latitude, &ns, &longitude, &ew, &lock) >= 1) { - if(!lock) { - longitude = 0.0; - latitude = 0.0; + if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d", &time, &latitude, &ns, &longitude, &ew, &lock) >= 1) + { + if(!lock) + { + longitude = 0.0; + latitude = 0.0; return 0; - } else { - if(ns == 'S') { latitude *= -1.0; } - if(ew == 'W') { longitude *= -1.0; } - float degrees = trunc(latitude / 100.0f); - float minutes = latitude - (degrees * 100.0f); - latitude = degrees + minutes / 60.0f; - degrees = trunc(longitude / 100.0f * 0.01f); - minutes = longitude - (degrees * 100.0f); - longitude = degrees + minutes / 60.0f; - return 1; + } else + + { + if(ns == 'S') { latitude *= -1.0; } + if(ew == 'W') { longitude *= -1.0; } + float degrees = trunc(latitude / 100.0f); + float minutes = latitude - (degrees * 100.0f); + latitude = degrees + minutes / 60.0f; + degrees = trunc(longitude / 100.0f ); + // Edit:original GPS.h had, degrees = trunc(longitude/100.f*0.01f); + minutes = longitude - (degrees * 100.0f); + longitude = degrees + minutes / 60.0f; + return 1; } + } + else + { +if (sscanf(msg, "GPRMC,%f,%c,%f,%c,%f,%c,%f,%f", &timefix,&warning,&lat2,&ns2,&lon2, + &ew2,&speedgnd,&course) >=1) + + { + speedgnd*=GPS_KMPH_PER_KNOT;//speedgnd is in knots + if(ns == 'S') {lat2 *= -1.0;} + if(ew == 'W') { lon2 *= -1.0;} + float deg = trunc( lat2/100.0f); + float min= lat2 - (deg*100.0f); + lat2 = deg + min/60.0f; +deg = trunc(lon2/100.0f); // This line too maybe should have had (lon/100.0f*0.0f); + min= lon2 - (deg*100.0f); + lon2 = deg + min/60.0f; + + return 1; + + } } + } } - + float GPS::trunc(float v) { - if(v < 0.0) { + if(v < 0.0) { // floor(x) returns the largest integer value not greater than x. v*= -1.0; v = floor(v); v*=-1.0; @@ -67,7 +95,7 @@ } return v; } - + void GPS::getline() { while(_gps.getc() != '$'); // wait for the start of a line for(int i=0; i<256; i++) { @@ -79,3 +107,4 @@ } error("Overflowed message limit"); } + \ No newline at end of file