From 24673ed38d3d0b60820771de12c617c3d16cf081 Mon Sep 17 00:00:00 2001
From: Guido Guenther <agx@sigxcpu.org>
Date: Sun, 17 Aug 2008 14:37:40 +0200
Subject: [PATCH] parse nmea long and lat from GPGGA messages

useful for receivers like the DE8100
---
 src/gps_functions.c |   60 +++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 49 insertions(+), 11 deletions(-)

diff --git a/src/gps_functions.c b/src/gps_functions.c
index bafbc18..0380431 100644
--- a/src/gps_functions.c
+++ b/src/gps_functions.c
@@ -439,21 +439,59 @@ parse_nmea_rmc(char *nmea)
 void
 parse_nmea_gga(char *nmea)
 {		
-	gchar **array;
-
-
-	array = g_strsplit(nmea,",",0);
+#define GGA_UTC  1
+#define GGA_LAT  2
+#define GGA_LON  4
+#define GGA_QUAL 6
+#define GGA_SATS 7
+#define GGA_HDOP 8
+#define GGA_ALT  9
 
+	gchar **array;
+	gchar lat_dec[3], lon_dec[4];
+	double	lat_min, lat, lon_min, lon;
+	gint qual = 0;
+	gboolean valid = TRUE;
+
+	array = g_strsplit(nmea, ",", 0);
+	gpsdata->satellites_used = atoi(array[GGA_SATS]);
+
+	if (strlen(array[GGA_LAT]) == 9) {
+		strncpy(lat_dec, array[GGA_LAT], 2);
+		lat_dec[2]='\0';
+		lat_min = atof(array[GGA_LAT]+2);
+		lat = atof(lat_dec) + (lat_min/60);
+		if (strcmp(array[GGA_LAT+1], "S")==0)
+			lat = -lat;
+	} else {
+		valid = FALSE;
+		lat = 0.0;
+	}
 	
-	
-	gpsdata->satellites_used = atoi(array[7]);
-	
-	if(atoi(array[6])>0)  
-	{
-		gpsdata->hdop = atof(array[8]);
-		gpsdata->fix.altitude = atof(array[9]);
+	if (strlen(array[GGA_LON]) == 10) {
+		strncpy(lon_dec, array[GGA_LON], 3);
+		lon_dec[3]='\0';
+		lon_min = atof(array[GGA_LON]+3);
+		lon = atof(lon_dec) + (lon_min/60);
+		if (strcmp(array[GGA_LON+1],"W")==0)
+			lon = -lon;
+	} else {
+		valid = FALSE;
+		lon = 0.0;
 	}
 
+	qual = atoi(array[GGA_QUAL]) > 0;
+	if(qual) {
+		gpsdata->hdop = atof(array[GGA_HDOP]);
+		gpsdata->fix.altitude = atof(array[GGA_ALT]);
+		if (valid) {
+			gpsdata->fix.latitude = lat;
+			gpsdata->fix.longitude = lon;
+			gpsdata->fix.speed = 0;
+			gpsdata->fix.track = 0;
+			gpsdata->valid = TRUE;
+		}
+	}
 	g_strfreev(array);
 }
 
-- 
1.5.6.3

