]> git.street.me.uk Git - andy/viking.git/blobdiff - src/vikgpslayer.c
Add GPS Layer tooltip to say the protocol (aka device manufacturer) type.
[andy/viking.git] / src / vikgpslayer.c
index 8b689ca3e0e036f64a948fc3e8773c6dd7fd1228..88fe07e4a5c892cd3c6588d2fdcd2af446b15198 100644 (file)
@@ -63,6 +63,8 @@ static VikGpsLayer *gps_layer_unmarshall( guint8 *data, gint len, VikViewport *v
 static gboolean gps_layer_set_param ( VikGpsLayer *vgl, guint16 id, VikLayerParamData data, VikViewport *vp, gboolean is_file_operation );
 static VikLayerParamData gps_layer_get_param ( VikGpsLayer *vgl, guint16 id, gboolean is_file_operation );
 
+static const gchar* gps_layer_tooltip ( VikGpsLayer *vgl );
+
 static void gps_layer_change_coord_mode ( VikGpsLayer *val, VikCoordMode mode );
 static void gps_layer_add_menu_items( VikGpsLayer *vtl, GtkMenu *menu, gpointer vlp );
 static void gps_layer_drag_drop_request ( VikGpsLayer *val_src, VikGpsLayer *val_dest, GtkTreeIter *src_item_iter, GtkTreePath *dest_path );
@@ -78,9 +80,9 @@ static void gps_start_stop_tracking_cb( gpointer layer_and_vlp[2] );
 static void realtime_tracking_draw(VikGpsLayer *vgl, VikViewport *vp);
 #endif
 
-typedef enum {GARMIN_P = 0, MAGELLAN_P, NUM_PROTOCOLS} vik_gps_proto;
-static gchar * params_protocols[] = {"Garmin", "Magellan", NULL};
-static gchar * protocols_args[]   = {"garmin", "magellan"};
+typedef enum {GARMIN_P = 0, MAGELLAN_P, DELORME_P, NAVILINK_P, NUM_PROTOCOLS} vik_gps_proto;
+static gchar * params_protocols[] = {"Garmin", "Magellan", "DeLorme", "NAViLink", NULL};
+static gchar * protocols_args[]   = {"garmin", "magellan", "delbin", "navilink"};
 /*#define NUM_PROTOCOLS (sizeof(params_protocols)/sizeof(params_protocols[0]) - 1) */
 #ifdef WINDOWS
 static gchar * params_ports[] = {"com1", "usb:", NULL};
@@ -116,6 +118,10 @@ typedef struct {
   GtkWidget *wp_label;
   GtkWidget *progress_label;
   GtkWidget *trk_label;
+  VikViewport *vvp;
+#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING
+  gboolean realtime_tracking;
+#endif
 } GpsSession;
 static void gps_session_delete(GpsSession *sess);
 
@@ -193,6 +199,8 @@ VikLayerInterface vik_gps_layer_interface = {
 
   (VikLayerFuncSublayerRenameRequest)   NULL,
   (VikLayerFuncSublayerToggleVisible)   NULL,
+  (VikLayerFuncSublayerTooltip)         NULL,
+  (VikLayerFuncLayerTooltip)            gps_layer_tooltip,
 
   (VikLayerFuncMarshall)               gps_layer_marshall,
   (VikLayerFuncUnmarshall)             gps_layer_unmarshall,
@@ -309,6 +317,11 @@ static VikGpsLayer *vik_gps_layer_create (VikViewport *vp)
   return rv;
 }
 
+static const gchar* gps_layer_tooltip ( VikGpsLayer *vgl )
+{
+  return params_protocols[vgl->protocol_id];
+}
+
 /* "Copy" */
 static void gps_layer_marshall( VikGpsLayer *vgl, guint8 **data, gint *datalen )
 {
@@ -1020,6 +1033,18 @@ static void gps_comm_thread(GpsSession *sess)
       gtk_label_set_text ( GTK_LABEL(sess->status_label), _("Done.") );
       gtk_dialog_set_response_sensitive ( GTK_DIALOG(sess->dialog), GTK_RESPONSE_ACCEPT, TRUE );
       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 (!sess->realtime_tracking)
+#endif
+      {
+       if (sess->vvp) {
+         /* View the data available */
+         vik_trw_layer_auto_set_view ( sess->vtl, sess->vvp) ;
+         vik_layer_emit_update ( VIK_LAYER(sess->vtl) );
+       }
+      }
     } else {
       /* canceled */
     }
@@ -1039,7 +1064,7 @@ static void gps_comm_thread(GpsSession *sess)
   g_thread_exit(NULL);
 }
 
-static gint gps_comm(VikTrwLayer *vtl, gps_dir dir, vik_gps_proto proto, gchar *port) {
+static gint gps_comm(VikTrwLayer *vtl, gps_dir dir, vik_gps_proto proto, gchar *port, gboolean tracking, VikViewport *vvp) {
   GpsSession *sess = g_malloc(sizeof(GpsSession));
 
   sess->mutex = g_mutex_new();
@@ -1050,7 +1075,10 @@ static gint gps_comm(VikTrwLayer *vtl, gps_dir dir, vik_gps_proto proto, gchar *
   sess->cmd_args = g_strdup_printf("-D 9 -t -w -%c %s",
       (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
+  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 );
   gtk_dialog_set_response_sensitive ( GTK_DIALOG(sess->dialog),
       GTK_RESPONSE_ACCEPT, FALSE );
@@ -1079,6 +1107,7 @@ static gint gps_comm(VikTrwLayer *vtl, gps_dir dir, vik_gps_proto proto, gchar *
   /* TODO: starting gps read/write thread here */
   g_thread_create((GThreadFunc)gps_comm_thread, sess, FALSE, NULL );
 
+  gtk_dialog_set_default_response ( GTK_DIALOG(sess->dialog), GTK_RESPONSE_ACCEPT );
   gtk_dialog_run(GTK_DIALOG(sess->dialog));
 
   gtk_widget_destroy(sess->dialog);
@@ -1100,14 +1129,20 @@ static void gps_upload_cb( gpointer layer_and_vlp[2] )
 {
   VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0];
   VikTrwLayer *vtl = vgl->trw_children[TRW_UPLOAD];
-  gps_comm(vtl, GPS_UP, vgl->protocol_id, vgl->serial_port);
+  gps_comm(vtl, GPS_UP, vgl->protocol_id, vgl->serial_port, FALSE, NULL);
 }
 
 static void gps_download_cb( gpointer layer_and_vlp[2] )
 {
   VikGpsLayer *vgl = (VikGpsLayer *)layer_and_vlp[0];
   VikTrwLayer *vtl = vgl->trw_children[TRW_DOWNLOAD];
-  gps_comm(vtl, GPS_DOWN, vgl->protocol_id, vgl->serial_port);
+  VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vgl));
+  VikViewport *vvp = vik_window_viewport(vw);
+#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING
+  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);
+#endif
 }
 
 static void gps_empty_upload_cb( gpointer layer_and_vlp[2] )