Generation 3 of the Harp project

Dependencies:   Servo TMP36 GZ buffered-serial1 chan_fatfs_sd nmea_parser watchdog mbed-rtos mbed

Fork of HARP2 by Tyler Weaver

Files at this revision

API Documentation at this revision

Comitter:
tylerjw
Date:
Wed Feb 22 04:15:52 2012 +0000
Parent:
0:ce5f06c3895f
Child:
2:0c9ade531a5b
Commit message:
RMC messages and non-waiting sample function

Changed in this revision

GPS/GPS.cpp Show annotated file Show diff for this revision Revisions of this file
GPS/GPS.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/GPS/GPS.cpp	Wed Feb 22 03:52:43 2012 +0000
+++ b/GPS/GPS.cpp	Wed Feb 22 04:15:52 2012 +0000
@@ -1,7 +1,7 @@
 #include "GPS.h"
 
 GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) {
-    _gps.baud(4800);    
+    _gps.baud(4800);
     nmea_longitude = 0.0;
     nmea_latitude = 0.0;
     utc_time = 0;
@@ -12,14 +12,14 @@
     hdop = 0.0;
     msl_altitude = 0.0;
     msl_units = ' ';
-    
+
     rmc_status = ' ';
     ground_speed_k = 0.0;
     ground_course_d = 0.0;
-    date = 0;     
-    
+    date = 0;
+
     dec_longitude = 0.0;
-    dec_latitude = 0.0;   
+    dec_latitude = 0.0;
 }
 
 float GPS::nmea_to_dec(float deg_coord, char nsew) {
@@ -27,43 +27,40 @@
     float minutes = deg_coord - degree*100;
     float dec_deg = minutes / 60;
     float decimal = degree + dec_deg;
-    if(nsew == 'S' || nsew == 'W') // return negative
-    {
+    if (nsew == 'S' || nsew == 'W') { // return negative
         decimal *= -1;
     }
     return decimal;
 }
 
 int GPS::sample() {
-    
-    while(1) {        
+    int line_parsed = 0;
+
+    if (_gps.readable()) {
         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", &utc_time, &nmea_latitude, &ns, &nmea_longitude, &ew, &lock, &satelites, &hdop, &msl_altitude, &msl_units) >= 1) { 
-            if(!lock) {   
-                return 0;
-            } else {
-                dec_latitude = nmea_to_dec(nmea_latitude, ns);
-                dec_longitude = nmea_to_dec(nmea_longitude, ew);
-                return 1;
-            }
+        if (sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d,%d,%f,%f,%c", &utc_time, &nmea_latitude, &ns, &nmea_longitude, &ew, &lock, &satelites, &hdop, &msl_altitude, &msl_units) >= 1) {
+            line_parsed = 1;
+        }
+        // Check if it is a GPRMC msg
+        else if (sscanf(msg, "GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d", &utc_time, &rmc_status, &nmea_latitude, &ns, &nmea_longitude, &ew, &ground_speed_k, &ground_course_d, &date) >= 1) {
+            line_parsed = 1;
         }
-        // Check if it is a GPRMC msg)
-        else if(sscanf(msg, "GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d", &utc_time, &rmc_status, &nmea_latitude, &ns, &nmea_longitude, &ew, &ground_speed_k, &ground_course_d, &date) >= 1) { 
-            if(!lock) {   
-                return 0;
-            } else {
-                dec_latitude = nmea_to_dec(nmea_latitude, ns);
-                dec_longitude = nmea_to_dec(nmea_longitude, ew);
-                return 1;
-            }
+        if (!lock) {
+            return NO_LOCK;
+        } else if (line_parsed) {
+            return PARSED;
+        } else {
+            return NOT_PARSED;
         }
+    } else {
+        return NO_MSG;
     }
 }
 
 float GPS::trunc(float v) {
-    if(v < 0.0) {
+    if (v < 0.0) {
         v*= -1.0;
         v = floor(v);
         v*=-1.0;
@@ -74,10 +71,10 @@
 }
 
 void GPS::getline() {
-    while(_gps.getc() != '$');    // wait for the start of a line
-    for(int i=0; i<256; i++) {
+    while (_gps.getc() != '$');   // wait for the start of a line
+    for (int i=0; i<256; i++) {
         msg[i] = _gps.getc();
-        if(msg[i] == '\r') {
+        if (msg[i] == '\r') {
             msg[i] = 0;
             return;
         }
@@ -86,42 +83,44 @@
 }
 
 float GPS::get_msl_altitude() {
-    if(!lock) 
+    if (!lock)
         return 0.0;
     else
         return msl_altitude;
 }
 
 int GPS::get_satelites() {
-    if(!lock) 
+    if (!lock)
         return 0;
     else
         return satelites;
 }
 
 float GPS::get_nmea_longitude() {
-    if(!lock) 
+    if (!lock)
         return 0.0;
     else
         return nmea_longitude;
 }
 
 float GPS::get_dec_longitude() {
-    if(!lock) 
+    dec_longitude = nmea_to_dec(nmea_longitude, ew);
+    if (!lock)
         return 0.0;
     else
         return dec_longitude;
 }
 
 float GPS::get_nmea_latitude() {
-    if(!lock) 
+    if (!lock)
         return 0.0;
     else
         return nmea_latitude;
 }
 
 float GPS::get_dec_latitude() {
-    if(!lock) 
+    dec_latitude = nmea_to_dec(nmea_latitude, ns);
+    if (!lock)
         return 0.0;
     else
         return nmea_latitude;
--- a/GPS/GPS.h	Wed Feb 22 03:52:43 2012 +0000
+++ b/GPS/GPS.h	Wed Feb 22 04:15:52 2012 +0000
@@ -25,6 +25,11 @@
 #ifndef MBED_GPS_H
 #define MBED_GPS_H
 
+#define NO_MSG      0
+#define NO_LOCK     1
+#define NOT_PARSED  2
+#define PARSED      3
+
 /**  A GPS interface for reading from a Globalsat EM-406 GPS Module */
 class GPS {
 public:
--- a/main.cpp	Wed Feb 22 03:52:43 2012 +0000
+++ b/main.cpp	Wed Feb 22 04:15:52 2012 +0000
@@ -5,13 +5,19 @@
 GPS gps(p9, p10);
 
 int main() {
-    while(1) {
-        if(gps.sample()) {
-            pc.printf("I'm at %f, %f\n", gps.get_dec_longitude(), gps.get_dec_latitude());
-            pc.printf("%d satelites used\n", gps.get_satelites());
-            pc.printf("altitude = %f M\n\n", gps.get_msl_altitude());
-        } else {
-            pc.printf("Oh Dear! No lock :(\n");
+    int gps_message;
+    while (1) {
+        gps_message = gps.sample();
+        if (gps_message != NO_MSG) { // 0 is no message
+            if (gps_message == PARSED) {
+                pc.printf("I'm at %f, %f\n", gps.get_dec_longitude(), gps.get_dec_latitude());
+                pc.printf("%d satelites used\n", gps.get_satelites());
+                pc.printf("altitude = %f M\n\n", gps.get_msl_altitude());
+            } else if (gps_message == NO_LOCK) {
+                pc.printf("Oh Dear! No lock :(\n");
+            } else if (gps_message == NOT_PARSED) {
+                pc.printf("\n\n -- Message not Parsed --\n\n");
+            }
         }
     }
 }
\ No newline at end of file