GPS for mbed

Dependents:   ecu_reader gsm_SET

Files at this revision

API Documentation at this revision

Comitter:
pangsk
Date:
Fri Jul 27 15:07:00 2012 +0000
Commit message:
[mbed] converted /ecu_reader/GPS

Changed in this revision

GPS.cpp Show annotated file Show diff for this revision Revisions of this file
GPS.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 0f423a982334 GPS.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS.cpp	Fri Jul 27 15:07:00 2012 +0000
@@ -0,0 +1,65 @@
+/* GPS class for mbed Microcontroller
+ * Copyright (c) 2008, sford
+ */
+
+#include "GPS.h"
+
+GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) {
+	_gps.baud(4800);	
+	longitude = 0.0;
+	latitude = 0.0;		
+}
+
+
+int GPS::sample() {
+	float time;
+	char ns, ew;
+	int lock;
+
+	while(1) {		
+		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", &time, &latitude, &ns, &longitude, &ew, &lock) >= 1) { 
+			if(!lock) {
+				longitude = 0.0;
+				latitude = 0.0;		
+				return 0;
+			} else {
+				if(ns == 'S') {	latitude  *= -1.0; }
+				if(ew == 'W') {	longitude *= -1.0; }
+				float degrees = trunc(latitude / 100.0f);
+				float minutes = latitude - (degrees * 100.0f);
+				latitude = degrees + minutes / 60.0f;	
+				degrees = trunc(longitude / 100.0f * 0.01f);
+				minutes = longitude - (degrees * 100.0f);
+				longitude = degrees + minutes / 60.0f;
+				return 1;
+			}
+		}
+	}
+}
+
+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");
+}
+
diff -r 000000000000 -r 0f423a982334 GPS.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS.h	Fri Jul 27 15:07:00 2012 +0000
@@ -0,0 +1,50 @@
+/* GPS class for mbed Microcontroller
+ * Copyright (c) 2008, sford
+ */
+
+#include "mbed.h"
+
+#ifndef GPS_H
+#define GPS_H
+
+/* Class: GPS
+ *  A GPS interface for reading from a Globalsat EM-406 GPS Module
+ */
+class GPS {
+
+public:
+
+	/* Constructor: GPS
+	 *  Create the GPS, connected to the specified serial port
+	 */	
+	GPS(PinName tx, PinName rx);
+	
+	/* Function: sample
+	 *  Sample the incoming GPS data, returning whether there is a lock
+	 * 
+	 * Variables:
+	 *  returns - 1 if there was a lock when the sample was taken (and therefore .longitude and .latitude are valid), else 0
+	 */
+	int sample();
+	
+	/* Variable: longitude
+	 *  The longitude (call sample() to set)
+	 */
+	float longitude;
+
+	/* Variable: latitude
+	 *  The latitude (call sample() to set)
+	 */
+	float latitude;
+	
+private:
+
+	float trunc(float v);
+	void getline();
+	
+	Serial _gps;
+	char msg[256];
+
+};
+
+#endif