* viking -- GPS Data and Topo Analyzer, Explorer, and Manager
*
* Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net>
+ * Copyright (C) 2006-2008, Quy Tonthat <qtonthat@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
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 );
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};
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);
(VikLayerFuncSublayerRenameRequest) NULL,
(VikLayerFuncSublayerToggleVisible) NULL,
+ (VikLayerFuncSublayerTooltip) NULL,
+ (VikLayerFuncLayerTooltip) gps_layer_tooltip,
+ (VikLayerFuncLayerSelected) NULL,
(VikLayerFuncMarshall) gps_layer_marshall,
(VikLayerFuncUnmarshall) gps_layer_unmarshall,
(VikLayerFuncWriteFileData) NULL,
(VikLayerFuncDeleteItem) NULL,
+ (VikLayerFuncCutItem) NULL,
(VikLayerFuncCopyItem) NULL,
(VikLayerFuncPasteItem) NULL,
(VikLayerFuncFreeCopiedItem) NULL,
(VikLayerFuncDragDropRequest) gps_layer_drag_drop_request,
+
+ (VikLayerFuncSelectClick) NULL,
};
enum {TRW_DOWNLOAD=0, TRW_UPLOAD,
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 )
{
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 */
}
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();
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 );
/* 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);
{
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] )