fix cordinate and speed data

Fork of GPS by Simon Ford

Files at this revision

API Documentation at this revision

Comitter:
yanay_amir
Date:
Mon Jun 13 07:15:55 2016 +0000
Parent:
0:15611c7938a3
Commit message:
EM-406 LIBERY (FIXED CORDINATE+SPEED DATA)

Changed in this revision

GPS.cpp Show annotated file Show diff for this revision Revisions of this file
GPS.h Show annotated file Show diff for this revision Revisions of this file
--- 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
--- a/GPS.h	Tue Jun 08 14:10:27 2010 +0000
+++ b/GPS.h	Mon Jun 13 07:15:55 2016 +0000
@@ -43,7 +43,7 @@
     float longitude;
 
     /** The latitude (call sample() to set) */
-    float latitude;
+    float latitude,speedgnd,course,lat2,lon2;
     
 private:
     float trunc(float v);