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 2:0c9ade531a5b, committed 2012-02-22
- Comitter:
- tylerjw
- Date:
- Wed Feb 22 04:37:13 2012 +0000
- Parent:
- 1:2ace7946a246
- Child:
- 3:9cba44dd2f2b
- Commit message:
- VTG parsing - no access
Changed in this revision
--- a/GPS/GPS.cpp Wed Feb 22 04:15:52 2012 +0000 +++ b/GPS/GPS.cpp Wed Feb 22 04:37:13 2012 +0000 @@ -1,127 +1,143 @@ -#include "GPS.h" - -GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) { - _gps.baud(4800); - nmea_longitude = 0.0; - nmea_latitude = 0.0; - utc_time = 0; - ns = ' '; - ew = ' '; - lock = 0; - satelites = 0; - hdop = 0.0; - msl_altitude = 0.0; - msl_units = ' '; - - rmc_status = ' '; - ground_speed_k = 0.0; - ground_course_d = 0.0; - date = 0; - - dec_longitude = 0.0; - dec_latitude = 0.0; -} - -float GPS::nmea_to_dec(float deg_coord, char nsew) { - int degree = (int)(deg_coord/100); - float minutes = deg_coord - degree*100; - float dec_deg = minutes / 60; - float decimal = degree + dec_deg; - if (nsew == 'S' || nsew == 'W') { // return negative - decimal *= -1; - } - return decimal; -} - -int GPS::sample() { - 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) { - 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; - } - 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) { - v*= -1.0; - v = floor(v); - v*=-1.0; - } else { - v = floor(v); - } - return v; -} - -void GPS::getline() { - 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') { - msg[i] = 0; - return; - } - } - error("Overflowed message limit"); -} - -float GPS::get_msl_altitude() { - if (!lock) - return 0.0; - else - return msl_altitude; -} - -int GPS::get_satelites() { - if (!lock) - return 0; - else - return satelites; -} - -float GPS::get_nmea_longitude() { - if (!lock) - return 0.0; - else - return nmea_longitude; -} - -float GPS::get_dec_longitude() { - dec_longitude = nmea_to_dec(nmea_longitude, ew); - if (!lock) - return 0.0; - else - return dec_longitude; -} - -float GPS::get_nmea_latitude() { - if (!lock) - return 0.0; - else - return nmea_latitude; -} - -float GPS::get_dec_latitude() { - dec_latitude = nmea_to_dec(nmea_latitude, ns); - if (!lock) - return 0.0; - else - return nmea_latitude; -} +#include "GPS.h" + +GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) { + _gps.baud(4800); + nmea_longitude = 0.0; + nmea_latitude = 0.0; + utc_time = 0; + ns = ' '; + ew = ' '; + lock = 0; + satelites = 0; + hdop = 0.0; + msl_altitude = 0.0; + msl_units = ' '; + + rmc_status = ' '; + speed_k = 0.0; + course_d = 0.0; + date = 0; + + dec_longitude = 0.0; + dec_latitude = 0.0; + + gll_status = ' '; + + course_t = 0.0; // ground speed true + course_t_unit = ' '; + course_m = 0.0; // magnetic + course_m_unit = ' '; + speed_k_unit = ' '; + speed_km = 0.0; // speek km/hr + speed_km_unit = ' '; +} + +float GPS::nmea_to_dec(float deg_coord, char nsew) { + int degree = (int)(deg_coord/100); + float minutes = deg_coord - degree*100; + float dec_deg = minutes / 60; + float decimal = degree + dec_deg; + if (nsew == 'S' || nsew == 'W') { // return negative + decimal *= -1; + } + return decimal; +} + +int GPS::sample() { + int line_parsed = 0; + + while (_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) { + 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, &speed_k, &course_d, &date) >= 1) { + line_parsed = 1; + } + // GLL - Geographic Position-Lat/Lon + else if (sscanf(msg, "GPGLL,%f,%c,%f,%c,%f,%c", &nmea_latitude, &ns, &nmea_longitude, &ew, &utc_time, &gll_status) >= 1) { + line_parsed = 1; + } + // VTG-Course Over Ground and Ground Speed + else if (sscanf(msg, "GPVTG,%f,%c,%f,%c,%f,%c,%f,%c", &course_t, &course_t_unit, &course_m, &course_m_unit, &speed_k, &speed_k_unit, &speed_km, &speed_km_unit) >= 1) { + line_parsed = 1; + } + } + if (!lock) { + return NO_LOCK; + } else if (line_parsed) { + return PARSED; + } else { + return NOT_PARSED; + } +} + +float GPS::trunc(float v) { + if (v < 0.0) { + v*= -1.0; + v = floor(v); + v*=-1.0; + } else { + v = floor(v); + } + return v; +} + +void GPS::getline() { + 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') { + msg[i] = 0; + return; + } + } + error("Overflowed message limit"); +} + +float GPS::get_msl_altitude() { + if (!lock) + return 0.0; + else + return msl_altitude; +} + +int GPS::get_satelites() { + if (!lock) + return 0; + else + return satelites; +} + +float GPS::get_nmea_longitude() { + if (!lock) + return 0.0; + else + return nmea_longitude; +} + +float GPS::get_dec_longitude() { + dec_longitude = nmea_to_dec(nmea_longitude, ew); + if (!lock) + return 0.0; + else + return dec_longitude; +} + +float GPS::get_nmea_latitude() { + if (!lock) + return 0.0; + else + return nmea_latitude; +} + +float GPS::get_dec_latitude() { + dec_latitude = nmea_to_dec(nmea_latitude, ns); + if (!lock) + return 0.0; + else + return nmea_latitude; +}
--- a/GPS/GPS.h Wed Feb 22 04:15:52 2012 +0000 +++ b/GPS/GPS.h Wed Feb 22 04:37:13 2012 +0000 @@ -25,7 +25,6 @@ #ifndef MBED_GPS_H #define MBED_GPS_H -#define NO_MSG 0 #define NO_LOCK 1 #define NOT_PARSED 2 #define PARSED 3 @@ -76,9 +75,21 @@ // RMC - Recommended Minimmum Specific GNS Data char rmc_status; - float ground_speed_k; - float ground_course_d; + float speed_k; + float course_d; int date; + + // GLL + char gll_status; + + // VTG - Course over ground, ground speed + float course_t; // ground speed true + char course_t_unit; + float course_m; // magnetic + char course_m_unit; + char speed_k_unit; + float speed_km; // speek km/hr + char speed_km_unit; }; #endif
--- a/main.cpp Wed Feb 22 04:15:52 2012 +0000 +++ b/main.cpp Wed Feb 22 04:37:13 2012 +0000 @@ -8,16 +8,12 @@ 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"); - } + 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"); } } } \ No newline at end of file