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

Committer:
tylerjw
Date:
Thu Feb 23 04:24:23 2012 +0000
Revision:
4:d47805009bbd
Parent:
3:9cba44dd2f2b
Child:
5:8444ec4245e7
openLog library and implementation in gps library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tylerjw 2:0c9ade531a5b 1 #include "GPS.h"
tylerjw 2:0c9ade531a5b 2
tylerjw 2:0c9ade531a5b 3 GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) {
tylerjw 2:0c9ade531a5b 4 _gps.baud(4800);
tylerjw 2:0c9ade531a5b 5 nmea_longitude = 0.0;
tylerjw 2:0c9ade531a5b 6 nmea_latitude = 0.0;
tylerjw 2:0c9ade531a5b 7 utc_time = 0;
tylerjw 2:0c9ade531a5b 8 ns = ' ';
tylerjw 2:0c9ade531a5b 9 ew = ' ';
tylerjw 2:0c9ade531a5b 10 lock = 0;
tylerjw 2:0c9ade531a5b 11 satelites = 0;
tylerjw 2:0c9ade531a5b 12 hdop = 0.0;
tylerjw 2:0c9ade531a5b 13 msl_altitude = 0.0;
tylerjw 2:0c9ade531a5b 14 msl_units = ' ';
tylerjw 2:0c9ade531a5b 15
tylerjw 2:0c9ade531a5b 16 rmc_status = ' ';
tylerjw 2:0c9ade531a5b 17 speed_k = 0.0;
tylerjw 2:0c9ade531a5b 18 course_d = 0.0;
tylerjw 2:0c9ade531a5b 19 date = 0;
tylerjw 2:0c9ade531a5b 20
tylerjw 2:0c9ade531a5b 21 dec_longitude = 0.0;
tylerjw 2:0c9ade531a5b 22 dec_latitude = 0.0;
tylerjw 4:d47805009bbd 23
tylerjw 2:0c9ade531a5b 24 gll_status = ' ';
tylerjw 4:d47805009bbd 25
tylerjw 2:0c9ade531a5b 26 course_t = 0.0; // ground speed true
tylerjw 2:0c9ade531a5b 27 course_t_unit = ' ';
tylerjw 2:0c9ade531a5b 28 course_m = 0.0; // magnetic
tylerjw 2:0c9ade531a5b 29 course_m_unit = ' ';
tylerjw 2:0c9ade531a5b 30 speed_k_unit = ' ';
tylerjw 2:0c9ade531a5b 31 speed_km = 0.0; // speek km/hr
tylerjw 2:0c9ade531a5b 32 speed_km_unit = ' ';
tylerjw 4:d47805009bbd 33 #ifdef OPEN_LOG
tylerjw 4:d47805009bbd 34 is_logging = false;
tylerjw 4:d47805009bbd 35 #endif
tylerjw 2:0c9ade531a5b 36 }
tylerjw 2:0c9ade531a5b 37
tylerjw 4:d47805009bbd 38 #ifdef OPEN_LOG
tylerjw 4:d47805009bbd 39 void init_log(PinName tx, PinName rx, PinName reset_pin) : _openLog(tx, rx, reset_pin) {
tylerjw 4:d47805009bbd 40 is_logging = true;
tylerjw 4:d47805009bbd 41 }
tylerjw 4:d47805009bbd 42
tylerjw 4:d47805009bbd 43 void new_file(void) {
tylerjw 4:d47805009bbd 44 _openLog.newFile();
tylerjw 4:d47805009bbd 45 }
tylerjw 4:d47805009bbd 46
tylerjw 4:d47805009bbd 47 void stop_log(void) {
tylerjw 4:d47805009bbd 48 is_logging = false;
tylerjw 4:d47805009bbd 49 }
tylerjw 4:d47805009bbd 50 #endif
tylerjw 4:d47805009bbd 51
tylerjw 2:0c9ade531a5b 52 float GPS::nmea_to_dec(float deg_coord, char nsew) {
tylerjw 2:0c9ade531a5b 53 int degree = (int)(deg_coord/100);
tylerjw 2:0c9ade531a5b 54 float minutes = deg_coord - degree*100;
tylerjw 2:0c9ade531a5b 55 float dec_deg = minutes / 60;
tylerjw 2:0c9ade531a5b 56 float decimal = degree + dec_deg;
tylerjw 2:0c9ade531a5b 57 if (nsew == 'S' || nsew == 'W') { // return negative
tylerjw 2:0c9ade531a5b 58 decimal *= -1;
tylerjw 2:0c9ade531a5b 59 }
tylerjw 2:0c9ade531a5b 60 return decimal;
tylerjw 2:0c9ade531a5b 61 }
tylerjw 2:0c9ade531a5b 62
tylerjw 2:0c9ade531a5b 63 int GPS::sample() {
tylerjw 2:0c9ade531a5b 64 int line_parsed = 0;
tylerjw 2:0c9ade531a5b 65
tylerjw 2:0c9ade531a5b 66 while (_gps.readable()) {
tylerjw 2:0c9ade531a5b 67 getline();
tylerjw 2:0c9ade531a5b 68
tylerjw 4:d47805009bbd 69 #ifdef OPEN_LOG
tylerjw 4:d47805009bbd 70 if (is_logging) {
tylerjw 4:d47805009bbd 71 _openLog.write(msg);
tylerjw 4:d47805009bbd 72 }
tylerjw 4:d47805009bbd 73 #endif
tylerjw 4:d47805009bbd 74
tylerjw 2:0c9ade531a5b 75 // Check if it is a GPGGA msg (matches both locked and non-locked msg)
tylerjw 2:0c9ade531a5b 76 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) {
tylerjw 3:9cba44dd2f2b 77 line_parsed = GGA;
tylerjw 2:0c9ade531a5b 78 }
tylerjw 2:0c9ade531a5b 79 // Check if it is a GPRMC msg
tylerjw 2:0c9ade531a5b 80 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) {
tylerjw 3:9cba44dd2f2b 81 line_parsed = RMC;
tylerjw 2:0c9ade531a5b 82 }
tylerjw 2:0c9ade531a5b 83 // GLL - Geographic Position-Lat/Lon
tylerjw 2:0c9ade531a5b 84 else if (sscanf(msg, "GPGLL,%f,%c,%f,%c,%f,%c", &nmea_latitude, &ns, &nmea_longitude, &ew, &utc_time, &gll_status) >= 1) {
tylerjw 3:9cba44dd2f2b 85 line_parsed = GLL;
tylerjw 2:0c9ade531a5b 86 }
tylerjw 2:0c9ade531a5b 87 // VTG-Course Over Ground and Ground Speed
tylerjw 2:0c9ade531a5b 88 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) {
tylerjw 3:9cba44dd2f2b 89 line_parsed = VTG;
tylerjw 2:0c9ade531a5b 90 }
tylerjw 2:0c9ade531a5b 91 }
tylerjw 2:0c9ade531a5b 92 if (!lock) {
tylerjw 2:0c9ade531a5b 93 return NO_LOCK;
tylerjw 2:0c9ade531a5b 94 } else if (line_parsed) {
tylerjw 3:9cba44dd2f2b 95 return line_parsed;
tylerjw 2:0c9ade531a5b 96 } else {
tylerjw 2:0c9ade531a5b 97 return NOT_PARSED;
tylerjw 2:0c9ade531a5b 98 }
tylerjw 2:0c9ade531a5b 99 }
tylerjw 2:0c9ade531a5b 100
tylerjw 2:0c9ade531a5b 101 float GPS::trunc(float v) {
tylerjw 2:0c9ade531a5b 102 if (v < 0.0) {
tylerjw 2:0c9ade531a5b 103 v*= -1.0;
tylerjw 2:0c9ade531a5b 104 v = floor(v);
tylerjw 2:0c9ade531a5b 105 v*=-1.0;
tylerjw 2:0c9ade531a5b 106 } else {
tylerjw 2:0c9ade531a5b 107 v = floor(v);
tylerjw 2:0c9ade531a5b 108 }
tylerjw 2:0c9ade531a5b 109 return v;
tylerjw 2:0c9ade531a5b 110 }
tylerjw 2:0c9ade531a5b 111
tylerjw 2:0c9ade531a5b 112 void GPS::getline() {
tylerjw 2:0c9ade531a5b 113 while (_gps.getc() != '$'); // wait for the start of a line
tylerjw 2:0c9ade531a5b 114 for (int i=0; i<256; i++) {
tylerjw 2:0c9ade531a5b 115 msg[i] = _gps.getc();
tylerjw 2:0c9ade531a5b 116 if (msg[i] == '\r') {
tylerjw 2:0c9ade531a5b 117 msg[i] = 0;
tylerjw 2:0c9ade531a5b 118 return;
tylerjw 2:0c9ade531a5b 119 }
tylerjw 2:0c9ade531a5b 120 }
tylerjw 2:0c9ade531a5b 121 error("Overflowed message limit");
tylerjw 2:0c9ade531a5b 122 }
tylerjw 2:0c9ade531a5b 123
tylerjw 2:0c9ade531a5b 124 float GPS::get_msl_altitude() {
tylerjw 2:0c9ade531a5b 125 if (!lock)
tylerjw 2:0c9ade531a5b 126 return 0.0;
tylerjw 2:0c9ade531a5b 127 else
tylerjw 2:0c9ade531a5b 128 return msl_altitude;
tylerjw 2:0c9ade531a5b 129 }
tylerjw 2:0c9ade531a5b 130
tylerjw 2:0c9ade531a5b 131 int GPS::get_satelites() {
tylerjw 2:0c9ade531a5b 132 if (!lock)
tylerjw 2:0c9ade531a5b 133 return 0;
tylerjw 2:0c9ade531a5b 134 else
tylerjw 2:0c9ade531a5b 135 return satelites;
tylerjw 2:0c9ade531a5b 136 }
tylerjw 2:0c9ade531a5b 137
tylerjw 2:0c9ade531a5b 138 float GPS::get_nmea_longitude() {
tylerjw 2:0c9ade531a5b 139 if (!lock)
tylerjw 2:0c9ade531a5b 140 return 0.0;
tylerjw 2:0c9ade531a5b 141 else
tylerjw 2:0c9ade531a5b 142 return nmea_longitude;
tylerjw 2:0c9ade531a5b 143 }
tylerjw 2:0c9ade531a5b 144
tylerjw 2:0c9ade531a5b 145 float GPS::get_dec_longitude() {
tylerjw 2:0c9ade531a5b 146 dec_longitude = nmea_to_dec(nmea_longitude, ew);
tylerjw 2:0c9ade531a5b 147 if (!lock)
tylerjw 2:0c9ade531a5b 148 return 0.0;
tylerjw 2:0c9ade531a5b 149 else
tylerjw 2:0c9ade531a5b 150 return dec_longitude;
tylerjw 2:0c9ade531a5b 151 }
tylerjw 2:0c9ade531a5b 152
tylerjw 2:0c9ade531a5b 153 float GPS::get_nmea_latitude() {
tylerjw 2:0c9ade531a5b 154 if (!lock)
tylerjw 2:0c9ade531a5b 155 return 0.0;
tylerjw 2:0c9ade531a5b 156 else
tylerjw 2:0c9ade531a5b 157 return nmea_latitude;
tylerjw 2:0c9ade531a5b 158 }
tylerjw 2:0c9ade531a5b 159
tylerjw 2:0c9ade531a5b 160 float GPS::get_dec_latitude() {
tylerjw 2:0c9ade531a5b 161 dec_latitude = nmea_to_dec(nmea_latitude, ns);
tylerjw 2:0c9ade531a5b 162 if (!lock)
tylerjw 2:0c9ade531a5b 163 return 0.0;
tylerjw 2:0c9ade531a5b 164 else
tylerjw 3:9cba44dd2f2b 165 return dec_latitude;
tylerjw 3:9cba44dd2f2b 166 }
tylerjw 3:9cba44dd2f2b 167
tylerjw 3:9cba44dd2f2b 168 float GPS::get_course_t() {
tylerjw 3:9cba44dd2f2b 169 if (!lock)
tylerjw 3:9cba44dd2f2b 170 return 0.0;
tylerjw 3:9cba44dd2f2b 171 else
tylerjw 3:9cba44dd2f2b 172 return course_t;
tylerjw 2:0c9ade531a5b 173 }
tylerjw 3:9cba44dd2f2b 174
tylerjw 3:9cba44dd2f2b 175 float GPS::get_course_m() {
tylerjw 3:9cba44dd2f2b 176 if (!lock)
tylerjw 3:9cba44dd2f2b 177 return 0.0;
tylerjw 3:9cba44dd2f2b 178 else
tylerjw 3:9cba44dd2f2b 179 return course_m;
tylerjw 3:9cba44dd2f2b 180 }
tylerjw 3:9cba44dd2f2b 181
tylerjw 3:9cba44dd2f2b 182 float GPS::get_speed_k() {
tylerjw 3:9cba44dd2f2b 183 if (!lock)
tylerjw 3:9cba44dd2f2b 184 return 0.0;
tylerjw 3:9cba44dd2f2b 185 else
tylerjw 3:9cba44dd2f2b 186 return speed_k;
tylerjw 3:9cba44dd2f2b 187 }
tylerjw 3:9cba44dd2f2b 188
tylerjw 3:9cba44dd2f2b 189 float GPS::get_speed_km() {
tylerjw 3:9cba44dd2f2b 190 if (!lock)
tylerjw 3:9cba44dd2f2b 191 return 0.0;
tylerjw 3:9cba44dd2f2b 192 else
tylerjw 3:9cba44dd2f2b 193 return speed_km;
tylerjw 3:9cba44dd2f2b 194 }