Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
GroveGPS.h
00001 #ifndef _GROVE_GPS_H_ 00002 #define _GROVE_GPS_H_ 00003 00004 #include "mbed.h" 00005 #include <stdlib.h> 00006 #include <string> 00007 00008 class GroveGPS { 00009 00010 public: 00011 00012 GroveGPS() : _last_line("") {} 00013 00014 void readCharacter(char newCharacter) { 00015 if (newCharacter == '\n') { 00016 parseLine(); 00017 _last_line = ""; 00018 } else { 00019 _last_line += newCharacter; 00020 } 00021 } 00022 00023 struct GGA { 00024 double utc_time; // Format: hhmmss.sss 00025 double latitude; // Format: ddmm.mmmm 00026 char ns_indicator; // Format: N=north or S=south 00027 double longitude; // Format: dddmm.mmmm 00028 char ew_indicator; // Format: E=east or W=west 00029 int position_fix; // Options: [0=not available, 1=GPS SPS mode, 2=Differential GPS, 6=dead reckoning] 00030 int sats_used; // Range: 0-12 00031 double hdop; // Horizontal Dilution of Precision 00032 double msl_altitude; 00033 char msl_altitude_units; 00034 double geoid_separation; 00035 char geoid_separation_units; 00036 long age_of_diff; 00037 long diff_ref_station_id; 00038 std::string checksum; 00039 } gps_gga; 00040 00041 void getTimestamp(char* buffer) { 00042 sprintf(buffer, "%f", gps_gga.utc_time); 00043 } 00044 00045 void getLatitude(char* buffer) { 00046 double coordinate = convertGPSToDecimal(gps_gga.latitude); 00047 if (gps_gga.position_fix==0) 00048 sprintf(buffer, "N/A"); 00049 else 00050 sprintf(buffer, "%c%f", (gps_gga.ns_indicator == 'N') ? '0' : '-', coordinate); 00051 } 00052 00053 void getLongitude(char* buffer) { 00054 double coordinate = convertGPSToDecimal(gps_gga.longitude); 00055 if (gps_gga.position_fix==0) 00056 sprintf(buffer, "N/A"); 00057 else 00058 sprintf(buffer, "%c%f", (gps_gga.ew_indicator == 'E') ? '0' : '-', coordinate); 00059 } 00060 00061 private: 00062 std::string _last_line; 00063 00064 double convertGPSToDecimal(double coordinate) { 00065 int degrees = coordinate/100.0; 00066 int minutes = ((int)coordinate) % 100; 00067 double seconds = coordinate - ((int)coordinate); 00068 return degrees + (minutes+seconds)/60; 00069 00070 } 00071 00072 void parseLine() { 00073 if (_last_line.find("GPGGA") != std::string::npos) { 00074 parseGGA(); 00075 } 00076 } 00077 00078 void parseGGA() { 00079 char* pEnd; 00080 for (int i=0; i<14; i++) { 00081 std::string current_item = _last_line.substr(0,_last_line.find(",")); 00082 _last_line = _last_line.substr(_last_line.find(",")+1); 00083 if (i==0) { // NMEA Tag 00084 } else if (i==1) { // UTC time 00085 gps_gga.utc_time = strtod(current_item.c_str(), &pEnd); 00086 } else if (i==2) { // Latitude 00087 gps_gga.latitude = strtod(current_item.c_str(), &pEnd); 00088 } else if (i==3) { // Latitude North/South indicator 00089 gps_gga.ns_indicator = current_item[0]; 00090 } else if (i==4) { // Longitude 00091 gps_gga.longitude = strtod(current_item.c_str(), &pEnd); 00092 } else if (i==5) { // Longitude indicator 00093 gps_gga.ew_indicator = current_item[0]; 00094 } else if (i==6) { 00095 gps_gga.position_fix = strtod(current_item.c_str(), &pEnd); 00096 } 00097 } 00098 } 00099 }; 00100 00101 #endif
Generated on Mon Jul 18 2022 23:39:50 by
1.7.2
Grove GPS