summaryrefslogtreecommitdiff
path: root/navit/vehicle
diff options
context:
space:
mode:
authorsleske <sleske@ffa7fe5e-494d-0410-b361-a75ebd5db220>2013-11-25 20:25:31 +0000
committersleske <sleske@ffa7fe5e-494d-0410-b361-a75ebd5db220>2013-11-25 20:25:31 +0000
commit08c84dd61ac2bd136a7bbfaca1a5339ba626dcfc (patch)
tree69a9efb9d0c5b7b44fac98f239a5230c6d7b8470 /navit/vehicle
parent0ad3ec89516b48e158aba6c8e263d526c8963870 (diff)
downloadnavit-08c84dd61ac2bd136a7bbfaca1a5339ba626dcfc.tar.gz
Fix:vehicle_gpsd:Mostly revert rev.5642 to allow N810 to use old libgps. Warn in CMake build.|Fixes #1179.
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@5719 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/vehicle')
-rw-r--r--navit/vehicle/gpsd/CMakeLists.txt7
-rw-r--r--navit/vehicle/gpsd/vehicle_gpsd.c56
2 files changed, 63 insertions, 0 deletions
diff --git a/navit/vehicle/gpsd/CMakeLists.txt b/navit/vehicle/gpsd/CMakeLists.txt
index 1c204f6b4..091df2f71 100644
--- a/navit/vehicle/gpsd/CMakeLists.txt
+++ b/navit/vehicle/gpsd/CMakeLists.txt
@@ -1 +1,8 @@
module_add_library(vehicle_gpsd vehicle_gpsd.c)
+if (LIBGPS19_FOUND)
+ set_property(
+ TARGET vehicle_gpsd
+ APPEND PROPERTY COMPILE_DEFINITIONS HAVE_LIBGPS19=1
+ )
+endif (LIBGPS19_FOUND)
+
diff --git a/navit/vehicle/gpsd/vehicle_gpsd.c b/navit/vehicle/gpsd/vehicle_gpsd.c
index 766a454d3..cb3ebd0c1 100644
--- a/navit/vehicle/gpsd/vehicle_gpsd.c
+++ b/navit/vehicle/gpsd/vehicle_gpsd.c
@@ -70,7 +70,12 @@ static struct vehicle_priv {
static void vehicle_gpsd_io(struct vehicle_priv *priv);
static void
+#ifdef HAVE_LIBGPS19
vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len)
+#else
+vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len,
+ int level)
+#endif
{
char *pos,*nmea_data_buf;
int i=0,sats_signal=0;
@@ -112,16 +117,34 @@ vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len)
data->set &= ~ALTITUDE_SET;
}
if (data->set & SATELLITE_SET) {
+// We cannot rely on GPSD_API_MAJOR_VERSION here because it was not
+// incremented for this change :-(.
+#ifdef HAVE_LIBGPS19
if(data->satellites_visible > 0) {
+#else
+ if(data->satellites > 0) {
+#endif
sats_signal=0;
+#ifdef HAVE_LIBGPS19
for( i=0;i<data->satellites_visible;i++) {
+#else
+ for( i=0;i<data->satellites;i++) {
+#endif
if (data->ss[i] > 0)
sats_signal++;
}
}
+#ifdef HAVE_LIBGPS19
if (priv->sats_used != data->satellites_used || priv->sats != data->satellites_visible || priv->sats_signal != sats_signal ) {
+#else
+ if (priv->sats_used != data->satellites_used || priv->sats != data->satellites || priv->sats_signal != sats_signal ) {
+#endif
priv->sats_used = data->satellites_used;
+#ifdef HAVE_LIBGPS19
priv->sats = data->satellites_visible;
+#else
+ priv->sats = data->satellites;
+#endif
priv->sats_signal = sats_signal;
callback_list_call_attr_0(priv->cbl, attr_position_sats);
}
@@ -139,10 +162,17 @@ vehicle_gpsd_callback(struct gps_data_t *data, const char *buf, size_t len)
priv->fix_time = data->fix.time;
data->set &= ~TIME_SET;
}
+#ifdef HAVE_LIBGPS19
if (data->set & DOP_SET) {
dbg(1, "pdop : %g\n", data->dop.pdop);
priv->hdop = data->dop.pdop;
data->set &= ~DOP_SET;
+#else
+ if (data->set & PDOP_SET) {
+ dbg(1, "pdop : %g\n", data->pdop);
+ priv->hdop = data->hdop;
+ data->set &= ~PDOP_SET;
+#endif
}
if (data->set & LATLON_SET) {
priv->geo.lat = data->fix.latitude;
@@ -177,19 +207,31 @@ vehicle_gpsd_try_open(struct vehicle_priv *priv)
}
dbg(0,"Trying to connect to %s:%s\n",source+7,port?port:"default");
+#if GPSD_API_MAJOR_VERSION >= 5
/* gps_open returns 0 on success */
if (gps_open(source + 7, port, priv->gps)) {
+#else
+ priv->gps = gps_open(source + 7, port);
+ if(!priv->gps) {
+#endif
dbg(0,"gps_open failed for '%s'. Retrying in %d seconds. Have you started gpsd?\n", priv->source, priv->retry_interval);
g_free(source);
return TRUE;
}
g_free(source);
+#ifdef HAVE_LIBGPS19
if (strchr(priv->gpsd_query,'r'))
gps_stream(priv->gps, WATCH_ENABLE|WATCH_NMEA|WATCH_JSON, NULL);
else
gps_stream(priv->gps, WATCH_ENABLE|WATCH_JSON, NULL);
+#else
+ gps_query(priv->gps, priv->gpsd_query);
+#endif
+#if GPSD_API_MAJOR_VERSION < 5
+ gps_set_raw_hook(priv->gps, vehicle_gpsd_callback);
+#endif
priv->cb = callback_new_1(callback_cast(vehicle_gpsd_io), priv);
priv->cbt = callback_new_1(callback_cast(vehicle_gpsd_try_open), priv);
priv->evwatch = event_add_watch((void *)priv->gps->gps_fd, event_watch_cond_read, priv->cb);
@@ -251,7 +293,9 @@ vehicle_gpsd_close(struct vehicle_priv *priv)
}
if (priv->gps) {
gps_close(priv->gps);
+#if GPSD_API_MAJOR_VERSION >= 5
g_free(priv->gps);
+#endif
priv->gps = NULL;
}
#ifdef HAVE_GPSBT
@@ -269,6 +313,7 @@ vehicle_gpsd_io(struct vehicle_priv *priv)
dbg(1, "enter\n");
if (priv->gps) {
vehicle_last = priv;
+#if GPSD_API_MAJOR_VERSION >= 5
if(gps_read(priv->gps)==-1) {
dbg(0,"gps_poll failed\n");
vehicle_gpsd_close(priv);
@@ -279,6 +324,13 @@ vehicle_gpsd_io(struct vehicle_priv *priv)
buf = gps_data(priv->gps);
vehicle_gpsd_callback(priv->gps,buf,strlen(buf));
}
+#else
+ if (gps_poll(priv->gps)) {
+ dbg(0,"gps_poll failed\n");
+ vehicle_gpsd_close(priv);
+ vehicle_gpsd_open(priv);
+ }
+#endif
}
}
@@ -290,7 +342,9 @@ vehicle_gpsd_destroy(struct vehicle_priv *priv)
g_free(priv->source);
if (priv->gpsd_query)
g_free(priv->gpsd_query);
+#if GPSD_API_MAJOR_VERSION >= 5
g_free(priv->gps);
+#endif
g_free(priv);
}
@@ -376,7 +430,9 @@ vehicle_gpsd_new_gpsd(struct vehicle_methods
dbg(1, "enter\n");
source = attr_search(attrs, NULL, attr_source);
ret = g_new0(struct vehicle_priv, 1);
+#if GPSD_API_MAJOR_VERSION >= 5
ret->gps = g_new0(struct gps_data_t, 1);
+#endif
ret->source = g_strdup(source->u.str);
query = attr_search(attrs, NULL, attr_gpsd_query);
if (query) {