From 728db5b53b1496c65c7dfe5d8016173c1ccf0718 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Thu, 26 May 2011 00:22:22 +0100 Subject: [PATCH] Rework gpsd interface for conditional compiling using GPSD_API_MAJOR_VERSION. This supports gpsd versions 2.39 + 2.9[12345]. --- configure.ac | 7 ----- src/vikgpslayer.c | 67 +++++++++++++++++++++++++---------------------- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/configure.ac b/configure.ac index 97b5dd18..fd4924cc 100644 --- a/configure.ac +++ b/configure.ac @@ -263,13 +263,6 @@ case $ac_cv_enable_realtimegpstracking in ;; esac AM_CONDITIONAL([REALTIME_GPS_TRACKING], [test x$ac_cv_enable_realtimegpstracking = xyes]) -# Viking supports two incompatibles versions of GPSd: 2.39 and 2.90 -# But GPSd does not provides easy way to test features. -if test x$ac_cv_enable_realtimegpstracking = xyes -then - AC_CHECK_FUNCS(gps_stream) - AC_CHECK_FUNCS(gps_open_r) -fi AC_ARG_WITH(search, [AC_HELP_STRING([--with-search], diff --git a/src/vikgpslayer.c b/src/vikgpslayer.c index 76390b14..8b18025d 100644 --- a/src/vikgpslayer.c +++ b/src/vikgpslayer.c @@ -74,7 +74,7 @@ static void gps_download_cb( gpointer layer_and_vlp[2] ); static void gps_empty_upload_cb( gpointer layer_and_vlp[2] ); static void gps_empty_download_cb( gpointer layer_and_vlp[2] ); static void gps_empty_all_cb( gpointer layer_and_vlp[2] ); -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) static void gps_empty_realtime_cb( gpointer layer_and_vlp[2] ); static void gps_start_stop_tracking_cb( gpointer layer_and_vlp[2] ); static void realtime_tracking_draw(VikGpsLayer *vgl, VikViewport *vp); @@ -119,7 +119,7 @@ typedef struct { GtkWidget *progress_label; GtkWidget *trk_label; VikViewport *vvp; -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) gboolean realtime_tracking; #endif } GpsSession; @@ -127,14 +127,14 @@ static void gps_session_delete(GpsSession *sess); static gchar *params_groups[] = { "Data Mode", -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) "Realtime Tracking Mode", #endif }; enum {GROUP_DATA_MODE, GROUP_REALTIME_MODE}; -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) static gchar *params_vehicle_position[] = { "Keep vehicle at center", "Keep vehicle on screen", @@ -152,7 +152,7 @@ static VikLayerParam gps_layer_params[] = { { "gps_protocol", VIK_LAYER_PARAM_UINT, GROUP_DATA_MODE, N_("GPS Protocol:"), VIK_LAYER_WIDGET_COMBOBOX, params_protocols, NULL}, { "gps_port", VIK_LAYER_PARAM_STRING, GROUP_DATA_MODE, N_("Serial Port:"), VIK_LAYER_WIDGET_COMBOBOX, params_ports, NULL}, -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) { "record_tracking", VIK_LAYER_PARAM_BOOLEAN, GROUP_REALTIME_MODE, N_("Recording tracks"), VIK_LAYER_WIDGET_CHECKBUTTON}, { "center_start_tracking", VIK_LAYER_PARAM_BOOLEAN, GROUP_REALTIME_MODE, N_("Jump to current position on start"), VIK_LAYER_WIDGET_CHECKBUTTON}, { "moving_map_method", VIK_LAYER_PARAM_UINT, GROUP_REALTIME_MODE, N_("Moving Map Method:"), VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_vehicle_position, NULL}, @@ -163,7 +163,7 @@ static VikLayerParam gps_layer_params[] = { }; enum { PARAM_PROTOCOL=0, PARAM_PORT, -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) PARAM_REALTIME_REC, PARAM_REALTIME_CENTER_START, PARAM_VEHICLE_POSITION, PARAM_GPSD_HOST, PARAM_GPSD_PORT, PARAM_GPSD_RETRY_INTERVAL, #endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ NUM_PARAMS}; @@ -226,18 +226,18 @@ VikLayerInterface vik_gps_layer_interface = { }; enum {TRW_DOWNLOAD=0, TRW_UPLOAD, -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) TRW_REALTIME, #endif NUM_TRW}; static gchar * trw_names[] = { N_("GPS Download"), N_("GPS Upload"), -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) N_("GPS Realtime Tracking"), #endif }; -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) typedef struct { struct gps_data_t gpsd; VikGpsLayer *vgl; @@ -255,7 +255,7 @@ struct _VikGpsLayer { VikTrwLayer * trw_children[NUM_TRW]; GList * children; /* used only for writing file */ int cur_read_child; /* used only for reading file */ -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) VglGpsd *vgpsd; gboolean realtime_tracking; /* set/reset only by the callback */ gboolean first_realtime_trackpoint; @@ -422,7 +422,7 @@ static gboolean gps_layer_set_param ( VikGpsLayer *vgl, guint16 id, VikLayerPara else g_warning(_("Unknown serial port device")); break; -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) case PARAM_GPSD_HOST: if (vgl->gpsd_host) g_free(vgl->gpsd_host); @@ -465,7 +465,7 @@ static VikLayerParamData gps_layer_get_param ( VikGpsLayer *vgl, guint16 id, gbo rv.s = vgl->serial_port; g_debug("%s: %s", __FUNCTION__, rv.s); break; -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) case PARAM_GPSD_HOST: rv.s = vgl->gpsd_host ? vgl->gpsd_host : ""; break; @@ -503,7 +503,7 @@ VikGpsLayer *vik_gps_layer_new (VikViewport *vp) vgl->children = NULL; vgl->cur_read_child = 0; -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) vgl->realtime_tracking = FALSE; vgl->first_realtime_trackpoint = FALSE; vgl->vgpsd = NULL; @@ -565,7 +565,7 @@ static void vik_gps_layer_draw ( VikGpsLayer *vgl, gpointer data ) if (!vik_viewport_get_half_drawn( VIK_VIEWPORT(data))) vik_layer_draw ( vl, data ); } -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) if (vgl->realtime_tracking) { if (VIK_LAYER(vgl) == trigger) { if ( vik_viewport_get_half_drawn ( VIK_VIEWPORT(data) ) ) { @@ -610,7 +610,7 @@ static void gps_layer_add_menu_items( VikGpsLayer *vgl, GtkMenu *menu, gpointer gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show ( item ); -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) item = gtk_menu_item_new_with_mnemonic ( vgl->realtime_tracking ? "_Stop Realtime Tracking" : "_Start Realtime Tracking" ); @@ -666,7 +666,7 @@ static void vik_gps_layer_free ( VikGpsLayer *vgl ) disconnect_layer_signal(VIK_LAYER(vgl->trw_children[i]), vgl); g_object_unref(vgl->trw_children[i]); } -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) if (vgl->realtime_track_gc != NULL) g_object_unref(vgl->realtime_track_gc); if (vgl->realtime_track_bg_gc != NULL) @@ -1039,7 +1039,7 @@ static void gps_comm_thread(GpsSession *sess) gtk_dialog_set_response_sensitive ( GTK_DIALOG(sess->dialog), GTK_RESPONSE_REJECT, FALSE ); /* Do not change the view if we are following the current GPS position */ -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) if (!sess->realtime_tracking) #endif { @@ -1080,7 +1080,7 @@ static gint gps_comm(VikTrwLayer *vtl, gps_dir dir, vik_gps_proto proto, gchar * (dir == GPS_DOWN) ? 'i' : 'o', protocols_args[proto]); sess->window_title = (dir == GPS_DOWN) ? _("GPS Download") : _("GPS Upload"); sess->vvp = vvp; -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) sess->realtime_tracking = tracking; #endif sess->dialog = gtk_dialog_new_with_buttons ( "", VIK_GTK_WINDOW_FROM_LAYER(vtl), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); @@ -1142,7 +1142,7 @@ static void gps_download_cb( gpointer layer_and_vlp[2] ) VikTrwLayer *vtl = vgl->trw_children[TRW_DOWNLOAD]; VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vgl)); VikViewport *vvp = vik_window_viewport(vw); -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) gps_comm(vtl, GPS_DOWN, vgl->protocol_id, vgl->serial_port, vgl->realtime_tracking, vvp); #else gps_comm(vtl, GPS_DOWN, vgl->protocol_id, vgl->serial_port, FALSE, vvp); @@ -1173,7 +1173,7 @@ static void gps_empty_download_cb( gpointer layer_and_vlp[2] ) vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_DOWNLOAD]); } -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) static void gps_empty_realtime_cb( gpointer layer_and_vlp[2] ) { VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0]; @@ -1199,13 +1199,13 @@ static void gps_empty_all_cb( gpointer layer_and_vlp[2] ) vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_UPLOAD]); vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_DOWNLOAD]); vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_DOWNLOAD]); -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_REALTIME]); vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_REALTIME]); #endif } -#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING +#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) static void rt_gpsd_disconnect(VikGpsLayer *vgl); static gboolean rt_gpsd_connect(VikGpsLayer *vgl, gboolean ask_if_failed); @@ -1430,21 +1430,23 @@ static gchar *make_track_name(VikTrwLayer *vtl) static gboolean rt_gpsd_try_connect(gpointer *data) { VikGpsLayer *vgl = (VikGpsLayer *)data; -#ifndef HAVE_GPS_OPEN_R +#if GPSD_API_MAJOR_VERSION == 3 struct gps_data_t *gpsd = gps_open(vgl->gpsd_host, vgl->gpsd_port); if (gpsd == NULL) { -#else +#elif GPSD_API_MAJOR_VERSION == 4 vgl->vgpsd = g_malloc(sizeof(VglGpsd)); if (gps_open_r(vgl->gpsd_host, vgl->gpsd_port, /*(struct gps_data_t *)*/vgl->vgpsd) != 0) { +#else + // Delibrately break compilation... #endif g_warning("Failed to connect to gpsd at %s (port %s). Will retry in %d seconds", vgl->gpsd_host, vgl->gpsd_port, vgl->gpsd_retry_interval); return TRUE; /* keep timer running */ } -#ifndef HAVE_GPS_OPEN_R +#if GPSD_API_MAJOR_VERSION == 3 vgl->vgpsd = realloc(gpsd, sizeof(VglGpsd)); #endif vgl->vgpsd->vgl = vgl; @@ -1466,11 +1468,14 @@ static gboolean rt_gpsd_try_connect(gpointer *data) vgl->realtime_io_channel = g_io_channel_unix_new(vgl->vgpsd->gpsd.gps_fd); vgl->realtime_io_watch_id = g_io_add_watch( vgl->realtime_io_channel, G_IO_IN | G_IO_ERR | G_IO_HUP, gpsd_data_available, vgl); -#if HAVE_GPS_STREAM - gps_stream(&vgl->vgpsd->gpsd, WATCH_ENABLE, NULL); -#else + +#if GPSD_API_MAJOR_VERSION == 3 gps_query(&vgl->vgpsd->gpsd, "w+x"); #endif +#if GPSD_API_MAJOR_VERSION == 4 + gps_stream(&vgl->vgpsd->gpsd, WATCH_ENABLE, NULL); +#endif + return FALSE; /* no longer called by timeout */ } @@ -1524,10 +1529,10 @@ static void rt_gpsd_disconnect(VikGpsLayer *vgl) } if (vgl->vgpsd) { gps_close(&vgl->vgpsd->gpsd); -#ifdef HAVE_GPS_OPEN_R - g_free(vgl->vgpsd); -#else +#if GPSD_API_MAJOR_VERSION == 3 free(vgl->vgpsd); +#elif GPSD_API_MAJOR_VERSION == 4 + g_free(vgl->vgpsd); #endif vgl->vgpsd = NULL; } -- 2.39.5