2021 mbed Grove GPS
Diff: GroveGPS.h
- Revision:
- 0:56d6407653a7
- Child:
- 1:0607ba3aa02d
diff -r 000000000000 -r 56d6407653a7 GroveGPS.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GroveGPS.h Tue Jan 30 13:04:53 2018 -0600 @@ -0,0 +1,101 @@ +#ifndef _GROVE_GPS_H_ +#define _GROVE_GPS_H_ + +#include "mbed.h" +#include <stdlib.h> +#include <string> + +class GroveGPS { + +public: + + GroveGPS() : _last_line("") {} + + void readCharacter(char newCharacter) { + if (newCharacter == '\n') { + parseLine(); + _last_line = ""; + } else { + _last_line += newCharacter; + } + } + + struct GGA { + double utc_time; // Format: hhmmss.sss + double latitude; // Format: ddmm.mmmm + char ns_indicator; // Format: N=north or S=south + double longitude; // Format: dddmm.mmmm + char ew_indicator; // Format: E=east or W=west + int position_fix; // Options: [0=not available, 1=GPS SPS mode, 2=Differential GPS, 6=dead reckoning] + int sats_used; // Range: 0-12 + double hdop; // Horizontal Dilution of Precision + double msl_altitude; + char msl_altitude_units; + double geoid_separation; + char geoid_separation_units; + long age_of_diff; + long diff_ref_station_id; + std::string checksum; + } gps_gga; + + void getTimestamp(char* buffer) { + sprintf(buffer, "%f", gps_gga.utc_time); + } + + void getLatitude(char* buffer) { + double coordinate = convertGPSToDecimal(gps_gga.latitude); + if (gps_gga.position_fix==0) + sprintf(buffer, "N/A"); + else + sprintf(buffer, "%c%f", (gps_gga.ns_indicator == 'N') ? '0' : '-', coordinate); + } + + void getLongitude(char* buffer) { + double coordinate = convertGPSToDecimal(gps_gga.longitude); + if (gps_gga.position_fix==0) + sprintf(buffer, "N/A"); + else + sprintf(buffer, "%c%f", (gps_gga.ew_indicator == 'E') ? '0' : '-', coordinate); + } + +private: + std::string _last_line; + + double convertGPSToDecimal(double coordinate) { + int degrees = coordinate/100.0; + int minutes = ((int)coordinate) % 100; + double seconds = coordinate - ((int)coordinate); + return degrees + (minutes+seconds)/60; + + } + + void parseLine() { + if (_last_line.find("GPGGA") != std::string::npos) { + parseGGA(); + } + } + + void parseGGA() { + char* pEnd; + for (int i=0; i<14; i++) { + std::string current_item = _last_line.substr(0,_last_line.find(",")); + _last_line = _last_line.substr(_last_line.find(",")+1); + if (i==0) { // NMEA Tag + } else if (i==1) { // UTC time + gps_gga.utc_time = strtod(current_item.c_str(), &pEnd); + } else if (i==2) { // Latitude + gps_gga.latitude = strtod(current_item.c_str(), &pEnd); + } else if (i==3) { // Latitude North/South indicator + gps_gga.ns_indicator = current_item[0]; + } else if (i==4) { // Longitude + gps_gga.longitude = strtod(current_item.c_str(), &pEnd); + } else if (i==5) { // Longitude indicator + gps_gga.ew_indicator = current_item[0]; + } else if (i==6) { + gps_gga.position_fix = strtod(current_item.c_str(), &pEnd); + } + } + } +}; + +#endif \ No newline at end of file