Updated

Dependents:   Assignment_5

Fork of GPS by Boris Adryan

Files at this revision

API Documentation at this revision

Comitter:
canterol
Date:
Tue Nov 18 03:03:52 2014 +0000
Parent:
1:1d60e6a0ffd9
Commit message:
Updated

Changed in this revision

GPS.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 1d60e6a0ffd9 -r 233e5e68fbfb GPS.cpp
--- a/GPS.cpp	Sat Nov 02 16:17:58 2013 +0000
+++ b/GPS.cpp	Tue Nov 18 03:03:52 2014 +0000
@@ -1,4 +1,5 @@
-/* mbed GPS Module Library
+/* 
+ * mbed GPS Module Library
  * Copyright (c) 2008-2010, sford
  * Copyright (c) 2013, B.Adryan
  *
@@ -19,26 +20,39 @@
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
+ * 
+ * Modified by:  Ben Wallace
+ * Modification Date:  10/20/2014
+ * GPS Module:  Adafruit Ultimate GPS V3
+ * uController:  LPC1768
  */
  
 #include "GPS.h"
 
-GPS::GPS(PinName tx, PinName rx, int Baud) : _gps(tx, rx) {
+GPS::GPS(PinName tx, PinName rx, int Baud) : _gps(tx, rx)
+{
     _gps.baud(Baud);    
     longitude = 0.0;
     latitude = 0.0;        
 }
 
-int GPS::sample() {
+int GPS::sample()
+{
     char ns, ew, unit;
     int lock;
+    
+    float degrees;
+    float minutes;
 
-    while(1) {        
+    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,%d,%f,%f,%c,%f", &time, &latitude, &ns, &longitude, &ew, &lock, &sats, &hdop, &alt, &unit, &geoid) >= 1) { 
-            if(!lock) {
+        if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d,%d,%f,%f,%c,%f", &time, &latitude, &ns, &longitude, &ew, &lock, &sats, &hdop, &alt, &unit, &geoid) >= 1)
+        { 
+            if(!lock)
+            {
                 time = 0.0;
                 longitude = 0.0;
                 latitude = 0.0;
@@ -47,42 +61,66 @@
                 alt = 0.0;
                 geoid = 0.0;        
                 return 0;
-            } else {
+            }
+            
+            else
+            {
                 //GPGGA format according http://aprs.gids.nl/nmea/#gga
                 // time (float), lat (f), (N/S) (c), long (f), (E/W) (c), fix (d), sats (d),
                 // hdop (float), altitude (float), M, geoid (float), M, , ,  
                 //GPGGA,092010.000,5210.9546,N,00008.8913,E,1,07,1.3,9.7,M,47.0,M,,0000*5D
                 
-                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;
+                minutes = fmod((double)latitude, 100.0);    //Modulate by 100.0 to convert dddmm.mmmm to mm.mmmm
+                minutes /= 60.0;                            //Convert minutes to degrees (1 degree = 60 minutes)
+                degrees = ((int)latitude / 100);            //Divide by 100 and truncate to convert dddmm.mmmm to ddd.000000
+                latitude = degrees + minutes;               //Combine degrees and minutes into a single degree value
+                
+                minutes = fmod((double)longitude, 100.0);   //Modulate by 100.0 to convert dddmm.mmmm to mm.mmmm
+                minutes /= 60.0;                            //Convert minutes to degrees (1 degree = 60 minutes)
+                degrees = ((int)longitude / 100);           //Divide by 100 and truncate to convert dddmm.mmmm to ddd.000000
+                longitude = degrees + minutes;              //Combine degrees and minutes into a single degree value
+                
+                //If the latitude is designated 'South" then multiply the latitude by -1.0
+                if(ns == 'S')
+                {
+                    latitude  *= -1.0;
+                }
+                
+                //If the longitude is designated 'West" then multiply the longitude by -1.0
+                if(ew == 'W')
+                {
+                    longitude *= -1.0;
+                }
+                
                 return 1;
             }
         }
     }
 }
 
-float GPS::trunc(float v) {
+float GPS::trunc(float v)
+{
     if(v < 0.0) {
         v*= -1.0;
         v = floor(v);
         v*=-1.0;
-    } else {
+    }
+    
+    else 
+    {
         v = floor(v);
     }
     return v;
 }
 
-void GPS::getline() {
+void GPS::getline()
+{
     while(_gps.getc() != '$');    // wait for the start of a line
-    for(int i=0; i<256; i++) {
+    for(int i=0; i<256; i++)
+    {
         msg[i] = _gps.getc();
-        if(msg[i] == '\r') {
+        if(msg[i] == '\r')
+        {
             msg[i] = 0;
             return;
         }