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
Revision 1:2ace7946a246, committed 2012-02-22
- 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
--- 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