Improved, thread compatible. Adds new features

Dependents:   GroveGPS-Example

Fork of GroveGPS by Michael Ray

Revision:
1:403eb5e9e994
Parent:
0:56d6407653a7
Child:
2:073674e3f5bf
--- a/GroveGPS.h	Tue Jan 30 13:04:53 2018 -0600
+++ b/GroveGPS.h	Sat Apr 14 00:03:58 2018 +0000
@@ -35,13 +35,61 @@
 		char    geoid_separation_units;
 		long    age_of_diff;
 		long    diff_ref_station_id;
+		int		new_flag;
 		std::string  checksum;
 	} gps_gga;
+	
+	struct ZDA {
+		double  utc_time; 		// Format: hhmmss.sss
+		int day;
+		int month;
+		int year;
+		int	new_flag;
+		std::string  checksum;
+	} gps_zda;
 
+	struct VTG {
+		double  course1; 
+		int truec;
+		double  course2; 
+		int magnetic;
+		double  speed1; 
+		int knots;
+		double  speed2; 
+		int kmh;
+		int	new_flag;
+		std::string  checksum;
+	} gps_vtg;
+
+    
+	void getAltitude(char* buffer) {
+		if (gps_gga.position_fix==0)
+			sprintf(buffer, "N/A");
+		else
+			sprintf(buffer, "%f", gps_gga.msl_altitude);
+	}
+   
+	void getCourse(char* buffer) {
+		if (gps_gga.position_fix==0)
+			sprintf(buffer, "N/A");
+		else
+			sprintf(buffer, "%f", gps_vtg.course1);
+	}
+    
+	void getSpeed(char* buffer) {
+		if (gps_gga.position_fix==0)
+			sprintf(buffer, "N/A");
+		else
+			sprintf(buffer, "%f", gps_vtg.speed1);
+	}
+     
 	void getTimestamp(char* buffer) {
-		sprintf(buffer, "%f", gps_gga.utc_time);
+		if (gps_gga.position_fix==0)
+			sprintf(buffer, "N/A");
+		else
+			sprintf(buffer, "%f", gps_gga.utc_time);
 	}
-
+    
 	void getLatitude(char* buffer) {
 		double coordinate = convertGPSToDecimal(gps_gga.latitude);
 		if (gps_gga.position_fix==0)
@@ -61,6 +109,7 @@
 private:
 	std::string _last_line;
 
+
 	double convertGPSToDecimal(double coordinate) {
 		int degrees = coordinate/100.0;
 		int minutes = ((int)coordinate) % 100;
@@ -73,6 +122,50 @@
 		if (_last_line.find("GPGGA") != std::string::npos) {
 			parseGGA();
 		}
+		if (_last_line.find("GPZDA") != std::string::npos) {
+			parseZDA();
+		}
+		if (_last_line.find("GPVTG") != std::string::npos) {
+			parseVTG();
+		}
+	}
+	
+void parseVTG() {
+  		char* pEnd;
+		for (int i=0; i<5; 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_vtg.course1 = strtod(current_item.c_str(), &pEnd);
+			} else if (i==3) {
+				gps_vtg.course2 = strtod(current_item.c_str(), &pEnd);
+			} else if (i==5) {
+				gps_vtg.speed1 = strtod(current_item.c_str(), &pEnd);
+			} else if (i==7) {
+				gps_vtg.speed2 = strtod(current_item.c_str(), &pEnd);
+			}
+		}
+	gps_vtg.new_flag = 1;	
+	}
+		
+void parseZDA() {
+  		char* pEnd;
+		for (int i=0; i<5; 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_zda.utc_time = strtod(current_item.c_str(), &pEnd);
+			} else if (i==2) {
+				gps_zda.day = strtod(current_item.c_str(), &pEnd);
+			} else if (i==3) {
+				gps_zda.month = strtod(current_item.c_str(), &pEnd);
+			} else if (i==4) {
+				gps_zda.year = strtod(current_item.c_str(), &pEnd);
+			}
+		}
+	gps_zda.new_flag = 1;	
 	}
 
 	void parseGGA() {
@@ -93,9 +186,17 @@
 				gps_gga.ew_indicator = current_item[0];
 			} else if (i==6) {
 				gps_gga.position_fix = strtod(current_item.c_str(), &pEnd);
+			}else if (i==7) {
+				gps_gga.sats_used = strtod(current_item.c_str(), &pEnd);
+			} else if (i==8) {
+				gps_gga.hdop = strtod(current_item.c_str(), &pEnd);
+			} else if (i==9) {
+				gps_gga.msl_altitude = strtod(current_item.c_str(), &pEnd);
 			}
 		}
+	gps_gga.new_flag = 1;
 	}
+	
 };
 
 #endif
\ No newline at end of file