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 );
static void gps_session_delete(GpsSession *sess);
static gchar *params_groups[] = {
- "Data Mode",
+ N_("Data Mode"),
#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION)
- "Realtime Tracking Mode",
+ N_("Realtime Tracking Mode"),
#endif
};
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[] = {
- "Keep vehicle at center",
- "Keep vehicle on screen",
- "Disable",
+ N_("Keep vehicle at center"),
+ N_("Keep vehicle on screen"),
+ N_("Disable"),
NULL
};
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}, // List now assigned at runtime
- { "gps_port", VIK_LAYER_PARAM_STRING, GROUP_DATA_MODE, N_("Serial Port:"), VIK_LAYER_WIDGET_COMBOBOX, params_ports, NULL},
- { "gps_download_tracks", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Tracks:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL},
- { "gps_upload_tracks", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Tracks:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL},
- { "gps_download_routes", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Routes:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL},
- { "gps_upload_routes", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Routes:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL},
- { "gps_download_waypoints", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Download Waypoints:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL},
- { "gps_upload_waypoints", VIK_LAYER_PARAM_BOOLEAN, GROUP_DATA_MODE, N_("Upload Waypoints:"), VIK_LAYER_WIDGET_CHECKBUTTON, 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},
- { "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},
- { "gpsd_host", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Host:"), VIK_LAYER_WIDGET_ENTRY},
- { "gpsd_port", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Port:"), VIK_LAYER_WIDGET_ENTRY},
- { "gpsd_retry_interval", VIK_LAYER_PARAM_STRING, GROUP_REALTIME_MODE, N_("Gpsd Retry Interval (seconds):"), VIK_LAYER_WIDGET_ENTRY},
+ { 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 {
}
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 ()
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);
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;
vgl->realtime_io_watch_id = 0;
vgl->realtime_retry_timer = 0;
- vgl->realtime_track_gc = vik_viewport_new_gc ( vp, "#203070", 2 );
- vgl->realtime_track_bg_gc = vik_viewport_new_gc ( vp, "grey", 2 );
- vgl->realtime_track_pt1_gc = vik_viewport_new_gc ( vp, "red", 2 );
- vgl->realtime_track_pt2_gc = vik_viewport_new_gc ( vp, "green", 2 );
- vgl->realtime_track_pt_gc = vgl->realtime_track_pt1_gc;
+ if ( vp ) {
+ vgl->realtime_track_gc = vik_viewport_new_gc ( vp, "#203070", 2 );
+ vgl->realtime_track_bg_gc = vik_viewport_new_gc ( vp, "grey", 2 );
+ vgl->realtime_track_pt1_gc = vik_viewport_new_gc ( vp, "red", 2 );
+ vgl->realtime_track_pt2_gc = vik_viewport_new_gc ( vp, "green", 2 );
+ 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 */
}
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 );
if (sess->direction == GPS_DOWN)
result = a_babel_convert_from (sess->vtl, sess->cmd_args, sess->port,
- (BabelStatusFunc) gps_download_progress_func, sess);
+ (BabelStatusFunc) gps_download_progress_func, sess, NULL);
else {
result = a_babel_convert_to (sess->vtl, sess->track, sess->cmd_args, sess->port,
(BabelStatusFunc) gps_upload_progress_func, sess);
if ( sess->vvp && sess->direction == GPS_DOWN ) {
/* View the data available */
vik_trw_layer_auto_set_view ( sess->vtl, sess->vvp) ;
- vik_layer_emit_update ( VIK_LAYER(sess->vtl), TRUE ); // Yes update from background thread
+ vik_layer_emit_update ( VIK_LAYER(sess->vtl) ); // NB update from background thread
}
}
} else {
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"));
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);
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));
if ( turn_off ) {
// No need for thread for powering off device (should be quick operation...) - so use babel command directly:
gchar *device_off = g_strdup_printf("-i %s,%s", protocol, "power_off");
- gboolean result = a_babel_convert_from (NULL, (const char*)device_off, (const char*)port, NULL, NULL);
+ gboolean result = a_babel_convert_from (NULL, (const char*)device_off, (const char*)port, NULL, NULL, NULL);
if ( !result )
a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not turn off device.") );
g_free ( device_off );
vik_coord_load_from_latlon ( &gps, vik_viewport_get_coord_mode(vp), &ll);
vik_viewport_coord_to_screen ( vp, &gps, &x, &y );
- gdouble heading_cos = cos(M_PI/180*vgl->realtime_fix.fix.track);
- gdouble heading_sin = sin(M_PI/180*vgl->realtime_fix.fix.track);
+ gdouble heading_cos = cos(DEG2RAD(vgl->realtime_fix.fix.track));
+ gdouble heading_sin = sin(DEG2RAD(vgl->realtime_fix.fix.track));
half_back_y = y+8*heading_cos;
half_back_x = x-8*heading_sin;
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;
vgl->first_realtime_trackpoint = FALSE;
create_realtime_trackpoint(vgl, FALSE);
- vik_layer_emit_update ( update_all ? VIK_LAYER(vgl) : VIK_LAYER(vgl->trw_children[TRW_REALTIME]), TRUE); // Yes update from background thread
+ vik_layer_emit_update ( update_all ? VIK_LAYER(vgl) : VIK_LAYER(vgl->trw_children[TRW_REALTIME]) ); // NB update from background thread
}
}