fix cordinate and speed data

Fork of GPS by Simon Ford

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