X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/8aff54f26665480064de7bc3d98bff6063c9b57d..6339640601c48c559aed48a573946fc25785a6e9:/src/vikgpslayer.c diff --git a/src/vikgpslayer.c b/src/vikgpslayer.c index 0d81e70c..95391739 100644 --- a/src/vikgpslayer.c +++ b/src/vikgpslayer.c @@ -49,7 +49,7 @@ static VikGpsLayer *vik_gps_layer_create (VikViewport *vp); static void vik_gps_layer_realize ( VikGpsLayer *val, VikTreeview *vt, GtkTreeIter *layer_iter ); static void vik_gps_layer_free ( VikGpsLayer *val ); -static void vik_gps_layer_draw ( VikGpsLayer *val, gpointer data ); +static void vik_gps_layer_draw ( VikGpsLayer *val, VikViewport *vp ); static VikGpsLayer *vik_gps_layer_new ( VikViewport *vp ); static void gps_layer_marshall( VikGpsLayer *val, guint8 **data, gint *len ); @@ -132,6 +132,35 @@ static gchar *params_groups[] = { enum {GROUP_DATA_MODE, GROUP_REALTIME_MODE}; + +static VikLayerParamData gps_protocol_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( "garmin" ); + return data; +} + +static VikLayerParamData gps_port_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( "usb:" ); +#ifndef WINDOWS + /* Attempt to auto set default USB serial port entry */ + /* Ordered to make lowest device favourite if available */ + if (g_access ("/dev/ttyUSB1", R_OK) == 0) { + if ( data.s ) + g_free ( (gchar *)data.s ); + data.s = g_strdup ("/dev/ttyUSB1"); + } + if (g_access ("/dev/ttyUSB0", R_OK) == 0) { + if ( data.s ) + g_free ( (gchar *)data.s ); + data.s = g_strdup ("/dev/ttyUSB0"); + } +#endif + return data; +} + #if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) static gchar *params_vehicle_position[] = { N_("Keep vehicle at center"), @@ -144,24 +173,51 @@ enum { VEHICLE_POSITION_ON_SCREEN, VEHICLE_POSITION_NONE, }; + +static VikLayerParamData moving_map_method_default ( void ) { return VIK_LPD_UINT ( VEHICLE_POSITION_ON_SCREEN ); } + +static VikLayerParamData gpsd_host_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( "localhost" ); + return data; +} + +static VikLayerParamData gpsd_port_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( DEFAULT_GPSD_PORT ); + return data; +} + +static VikLayerParamData gpsd_retry_interval_default ( void ) +{ + VikLayerParamData data; + data.s = g_strdup ( "10" ); + return data; +} + #endif static VikLayerParam gps_layer_params[] = { - { "gps_protocol", VIK_LAYER_PARAM_STRING, GROUP_DATA_MODE, N_("GPS Protocol:"), VIK_LAYER_WIDGET_COMBOBOX, NULL, NULL, NULL }, // List now assigned at runtime - { "gps_port", VIK_LAYER_PARAM_STRING, GROUP_DATA_MODE, N_("Serial Port:"), VIK_LAYER_WIDGET_COMBOBOX, params_ports, NULL, NULL }, - { "gps_download_tracks", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Tracks:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL }, - { "gps_upload_tracks", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Tracks:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL }, - { "gps_download_routes", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Routes:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL }, - { "gps_upload_routes", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Routes:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL }, - { "gps_download_waypoints", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Waypoints:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL }, - { "gps_upload_waypoints", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Waypoints:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL }, + // NB gps_layer_inst_init() is performed after parameter registeration + // thus to give the protocols some potential values use the old static list + // TODO: find another way to use gps_layer_inst_init()? + { VIK_LAYER_GPS, "gps_protocol", VIK_LAYER_PARAM_STRING, GROUP_DATA_MODE, N_("GPS Protocol:"), VIK_LAYER_WIDGET_COMBOBOX, protocols_args, NULL, NULL, gps_protocol_default }, // List reassigned at runtime + { VIK_LAYER_GPS, "gps_port", VIK_LAYER_PARAM_STRING, GROUP_DATA_MODE, N_("Serial Port:"), VIK_LAYER_WIDGET_COMBOBOX, params_ports, NULL, NULL, gps_port_default }, + { VIK_LAYER_GPS, "gps_download_tracks", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Tracks:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default }, + { VIK_LAYER_GPS, "gps_upload_tracks", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Tracks:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default }, + { VIK_LAYER_GPS, "gps_download_routes", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Routes:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default }, + { VIK_LAYER_GPS, "gps_upload_routes", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Routes:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default }, + { VIK_LAYER_GPS, "gps_download_waypoints", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Waypoints:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default }, + { VIK_LAYER_GPS, "gps_upload_waypoints", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Waypoints:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default }, #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, NULL, NULL, NULL }, - { "center_start_tracking", VIK_LAYER_PARAM_BOOLEAN, GROUP_REALTIME_MODE, N_("Jump to current position on start"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL }, - { "moving_map_method", VIK_LAYER_PARAM_UINT, GROUP_REALTIME_MODE, N_("Moving Map Method:"), VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_vehicle_position, NULL, NULL }, - { "gpsd_host", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Host:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL }, - { "gpsd_port", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Port:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL }, - { "gpsd_retry_interval", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Retry Interval (seconds):"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL }, + { VIK_LAYER_GPS, "record_tracking", VIK_LAYER_PARAM_BOOLEAN, GROUP_REALTIME_MODE, N_("Recording tracks"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_true_default }, + { VIK_LAYER_GPS, "center_start_tracking", VIK_LAYER_PARAM_BOOLEAN, GROUP_REALTIME_MODE, N_("Jump to current position on start"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL, NULL, vik_lpd_false_default }, + { VIK_LAYER_GPS, "moving_map_method", VIK_LAYER_PARAM_UINT, GROUP_REALTIME_MODE, N_("Moving Map Method:"), VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_vehicle_position, NULL, NULL, moving_map_method_default }, + { VIK_LAYER_GPS, "gpsd_host", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Host:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, gpsd_host_default }, + { VIK_LAYER_GPS, "gpsd_port", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Port:"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, gpsd_port_default }, + { VIK_LAYER_GPS, "gpsd_retry_interval", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Retry Interval (seconds):"), VIK_LAYER_WIDGET_ENTRY, NULL, NULL, NULL, gpsd_retry_interval_default }, #endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ }; enum { @@ -317,8 +373,7 @@ static void gps_layer_inst_init ( VikGpsLayer *self ) } new_protocols[new_proto] = NULL; - vik_gps_layer_interface.params[0].widget_data = new_protocols; - // assigned to [0] because this^ is the GPS protocol in the params list + vik_gps_layer_interface.params[PARAM_PROTOCOL].widget_data = new_protocols; } GType vik_gps_layer_get_type () @@ -488,14 +543,18 @@ static gboolean gps_layer_set_param ( VikGpsLayer *vgl, guint16 id, VikLayerPara break; #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); - vgl->gpsd_host = g_strdup(data.s); + if (data.s) { + if (vgl->gpsd_host) + g_free(vgl->gpsd_host); + vgl->gpsd_host = g_strdup(data.s); + } break; case PARAM_GPSD_PORT: - if (vgl->gpsd_port) + if (data.s) { + if (vgl->gpsd_port); g_free(vgl->gpsd_port); - vgl->gpsd_port = g_strdup(data.s); /* TODO: check for number */ + vgl->gpsd_port = g_strdup(data.s); + } break; case PARAM_GPSD_RETRY_INTERVAL: vgl->gpsd_retry_interval = strtol(data.s, NULL, 10); @@ -587,7 +646,6 @@ VikGpsLayer *vik_gps_layer_new (VikViewport *vp) vgl->cur_read_child = 0; #if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION) - vgl->realtime_tracking = FALSE; vgl->first_realtime_trackpoint = FALSE; vgl->vgpsd = NULL; vgl->realtime_io_channel = NULL; @@ -601,73 +659,44 @@ VikGpsLayer *vik_gps_layer_new (VikViewport *vp) vgl->realtime_track_pt_gc = vgl->realtime_track_pt1_gc; } vgl->realtime_track = NULL; +#endif // VIK_CONFIG_REALTIME_GPS_TRACKING - /* Setting params here */ - vgl->gpsd_host = g_strdup("localhost"); - vgl->gpsd_port = g_strdup(DEFAULT_GPSD_PORT); - vgl->realtime_record = TRUE; - vgl->realtime_jump_to_start = TRUE; - vgl->vehicle_position = VEHICLE_POSITION_ON_SCREEN; - vgl->gpsd_retry_interval = 10; -#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ - vgl->protocol = g_strdup("garmin"); - vgl->serial_port = NULL; - vgl->download_tracks = TRUE; - vgl->download_waypoints = TRUE; - vgl->download_routes = TRUE; - vgl->upload_routes = TRUE; - vgl->upload_tracks = TRUE; - vgl->upload_waypoints = TRUE; - -#ifndef WINDOWS - /* Attempt to auto set default USB serial port entry */ - /* Ordered to make lowest device favourite if available */ - if (g_access ("/dev/ttyUSB1", R_OK) == 0) { - if (vgl->serial_port != NULL) - g_free (vgl->serial_port); - vgl->serial_port = g_strdup ("/dev/ttyUSB1"); - } - if (g_access ("/dev/ttyUSB0", R_OK) == 0) { - if (vgl->serial_port != NULL) - g_free (vgl->serial_port); - vgl->serial_port = g_strdup ("/dev/ttyUSB0"); - } -#endif + vik_layer_set_defaults ( VIK_LAYER(vgl), vp ); return vgl; } -static void vik_gps_layer_draw ( VikGpsLayer *vgl, gpointer data ) +static void vik_gps_layer_draw ( VikGpsLayer *vgl, VikViewport *vp ) { gint i; VikLayer *vl; - VikLayer *trigger = VIK_LAYER(vik_viewport_get_trigger( VIK_VIEWPORT(data) )); + VikLayer *trigger = VIK_LAYER(vik_viewport_get_trigger( vp )); for (i = 0; i < NUM_TRW; i++) { vl = VIK_LAYER(vgl->trw_children[i]); if (vl == trigger) { - if ( vik_viewport_get_half_drawn ( VIK_VIEWPORT(data) ) ) { - vik_viewport_set_half_drawn ( VIK_VIEWPORT(data), FALSE ); - vik_viewport_snapshot_load( VIK_VIEWPORT(data) ); + if ( vik_viewport_get_half_drawn ( vp ) ) { + vik_viewport_set_half_drawn ( vp, FALSE ); + vik_viewport_snapshot_load( vp ); } else { - vik_viewport_snapshot_save( VIK_VIEWPORT(data) ); + vik_viewport_snapshot_save( vp ); } } - if (!vik_viewport_get_half_drawn( VIK_VIEWPORT(data))) - vik_layer_draw ( vl, data ); + if (!vik_viewport_get_half_drawn(vp)) + vik_layer_draw ( vl, vp ); } #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) ) ) { - vik_viewport_set_half_drawn ( VIK_VIEWPORT(data), FALSE ); - vik_viewport_snapshot_load( VIK_VIEWPORT(data) ); + if ( vik_viewport_get_half_drawn ( vp ) ) { + vik_viewport_set_half_drawn ( vp, FALSE ); + vik_viewport_snapshot_load( vp ); } else { - vik_viewport_snapshot_save( VIK_VIEWPORT(data) ); + vik_viewport_snapshot_save( vp ); } } - if (!vik_viewport_get_half_drawn( VIK_VIEWPORT(data))) - realtime_tracking_draw(vgl, VIK_VIEWPORT(data)); + if (!vik_viewport_get_half_drawn(vp)) + realtime_tracking_draw(vgl, vp); } #endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */ } @@ -810,7 +839,7 @@ static void vik_gps_layer_realize ( VikGpsLayer *vgl, VikTreeview *vt, GtkTreeIt for (ix = 0; ix < NUM_TRW; ix++) { VikLayer * trw = VIK_LAYER(vgl->trw_children[ix]); vik_treeview_add_layer ( VIK_LAYER(vgl)->vt, layer_iter, &iter, - _(trw_names[ix]), vgl, + _(trw_names[ix]), vgl, TRUE, trw, trw->type, trw->type ); if ( ! trw->visible ) vik_treeview_item_set_visible ( VIK_LAYER(vgl)->vt, &iter, FALSE ); @@ -1301,7 +1330,7 @@ gint vik_gps_comm ( VikTrwLayer *vtl, gtk_window_set_title ( GTK_WINDOW(sess->dialog), sess->window_title ); sess->status_label = gtk_label_new (_("Status: detecting gpsbabel")); - gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(sess->dialog)->vbox), sess->status_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->status_label, FALSE, FALSE, 5 ); gtk_widget_show_all(sess->status_label); sess->gps_label = gtk_label_new (_("GPS device: N/A")); @@ -1311,10 +1340,10 @@ gint vik_gps_comm ( VikTrwLayer *vtl, sess->trk_label = gtk_label_new (""); sess->rte_label = gtk_label_new (""); - gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(sess->dialog)->vbox), sess->gps_label, FALSE, FALSE, 5 ); - gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(sess->dialog)->vbox), sess->wp_label, FALSE, FALSE, 5 ); - gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(sess->dialog)->vbox), sess->trk_label, FALSE, FALSE, 5 ); - gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(sess->dialog)->vbox), sess->rte_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->gps_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->wp_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->trk_label, FALSE, FALSE, 5 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(sess->dialog))), sess->rte_label, FALSE, FALSE, 5 ); gtk_widget_show_all(sess->dialog); @@ -1322,7 +1351,11 @@ gint vik_gps_comm ( VikTrwLayer *vtl, sess->total_count = -1; // Starting gps read/write thread - g_thread_create((GThreadFunc)gps_comm_thread, sess, FALSE, NULL ); +#if GLIB_CHECK_VERSION (2, 32, 0) + g_thread_try_new ( "gps_comm_thread", (GThreadFunc)gps_comm_thread, sess, NULL ); +#else + g_thread_create ( (GThreadFunc)gps_comm_thread, sess, FALSE, NULL ); +#endif gtk_dialog_set_default_response ( GTK_DIALOG(sess->dialog), GTK_RESPONSE_ACCEPT ); gtk_dialog_run(GTK_DIALOG(sess->dialog)); @@ -1553,7 +1586,7 @@ static void create_realtime_trackpoint(VikGpsLayer *vgl, gboolean forced) vik_coord_load_from_latlon(&tp->coord, vik_trw_layer_get_coord_mode(vgl->trw_children[TRW_REALTIME]), &ll); - vgl->realtime_track->trackpoints = g_list_append(vgl->realtime_track->trackpoints, tp); + vik_track_add_trackpoint ( vgl->realtime_track, tp, TRUE ); // Ensure bounds is recalculated vgl->realtime_fix.dirty = FALSE; vgl->realtime_fix.satellites_used = 0; vgl->last_fix = vgl->realtime_fix;