From ac2a2041344177984b767a7532a94f0ed0355239 Mon Sep 17 00:00:00 2001 From: martin-s Date: Fri, 29 Feb 2008 18:29:38 +0000 Subject: [PATCH] Fix:vehicle_gpsd:Fixed nmea query git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@933 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/src/vehicle/gpsd/vehicle_gpsd.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/navit/src/vehicle/gpsd/vehicle_gpsd.c b/navit/src/vehicle/gpsd/vehicle_gpsd.c index 7e6961b..3d3aa5f 100644 --- a/navit/src/vehicle/gpsd/vehicle_gpsd.c +++ b/navit/src/vehicle/gpsd/vehicle_gpsd.c @@ -24,6 +24,8 @@ static struct vehicle_priv { int status; int sats; int sats_used; + char *nmea_data; + char *nmea_data_buf; } *vehicle_last; #define DEFAULT_RETRY_INTERVAL 10 // seconds @@ -38,7 +40,24 @@ static void vehicle_gpsd_callback(struct gps_data_t *data, char *buf, size_t len, int level) { + char *pos,*nmea_data_buf; struct vehicle_priv *priv = vehicle_last; + if (buf[0] == '$') { + char buffer[len+1]; + buffer[len+1]='\0'; + memcpy(buffer, buf, len); + pos=strchr(buffer,'\n'); + if (pos) { + *++pos='\0'; + if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { + nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, NULL); + g_free(priv->nmea_data_buf); + priv->nmea_data_buf=nmea_data_buf; + } else { + dbg(0, "nmea buffer overflow, discarding '%s'\n", buffer); + } + } + } dbg(1,"data->set=0x%x\n", data->set); // If data->fix.speed is NAN, then the drawing gets jumpy. if (isnan(data->fix.speed)) { @@ -74,6 +93,9 @@ vehicle_gpsd_callback(struct gps_data_t *data, char *buf, size_t len, priv->geo.lat = data->fix.latitude; priv->geo.lng = data->fix.longitude; dbg(1,"lat=%f lng=%f\n", priv->geo.lat, priv->geo.lng); + g_free(priv->nmea_data); + priv->nmea_data=priv->nmea_data_buf; + priv->nmea_data_buf=NULL; callback_list_call_0(priv->cbl); data->set &= ~LATLON_SET; } @@ -101,7 +123,7 @@ vehicle_gpsd_try_open(gpointer *data) g_warning("gps_open failed for '%s'. Retrying in %d seconds. Have you started gpsd?\n", priv->source, priv->retry_interval); return TRUE; } - gps_query(priv->gps, "w+x\n"); + gps_query(priv->gps, "w+xr+\n"); gps_set_raw_hook(priv->gps, vehicle_gpsd_callback); priv->iochan = g_io_channel_unix_new(priv->gps->gps_fd); priv->watch = @@ -193,6 +215,11 @@ vehicle_gpsd_position_attr_get(struct vehicle_priv *priv, case attr_position_coord_geo: attr->u.coord_geo = &priv->geo; break; + case attr_position_nmea: + attr->u.str=priv->nmea_data; + if (! attr->u.str) + return 0; + break; default: return 0; } -- 2.7.4