2 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
4 * Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net>
5 * Copyright (C) 2006, Alex Foobarian <foobarian@gmail.com>
6 * Copyright (C) 2012, Rob Norris <rw_norris@hotmail.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include <glib/gstdio.h>
32 #include <glib/gprintf.h>
33 #include <glib/gi18n.h>
35 #include "datasource_gps.h"
41 static gboolean gps_acquire_in_progress = FALSE;
43 static gint last_active = -1;
45 static gpointer datasource_gps_init_func ( acq_vik_t *avt );
46 static void datasource_gps_get_cmd_string ( gpointer add_widgets_data_not_used, gchar **babelargs, gchar **input_file, gpointer not_used );
47 static void datasource_gps_cleanup ( gpointer user_data );
48 static void datasource_gps_progress ( BabelProgressCode c, gpointer data, acq_dialog_widgets_t *w );
49 static void datasource_gps_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data );
50 static void datasource_gps_add_progress_widgets ( GtkWidget *dialog, gpointer user_data );
51 static void datasource_gps_off ( gpointer add_widgets_data_not_used, gchar **babelargs, gchar **input_file );
53 VikDataSourceInterface vik_datasource_gps_interface = {
54 N_("Acquire from GPS"),
55 N_("Acquired from GPS"),
56 VIK_DATASOURCE_CREATENEWLAYER,
57 VIK_DATASOURCE_INPUTTYPE_NONE,
61 (VikDataSourceInitFunc) datasource_gps_init_func,
62 (VikDataSourceCheckExistenceFunc) NULL,
63 (VikDataSourceAddSetupWidgetsFunc) datasource_gps_add_setup_widgets,
64 (VikDataSourceGetCmdStringFunc) datasource_gps_get_cmd_string,
65 (VikDataSourceProcessFunc) a_babel_convert_from,
66 (VikDataSourceProgressFunc) datasource_gps_progress,
67 (VikDataSourceAddProgressWidgetsFunc) datasource_gps_add_progress_widgets,
68 (VikDataSourceCleanupFunc) datasource_gps_cleanup,
69 (VikDataSourceOffFunc) datasource_gps_off
72 /*********************************************************
73 * Definitions and routines for acquiring data from GPS
74 *********************************************************/
76 /* widgets in setup dialog specific to GPS */
77 /* widgets in progress dialog specific to GPS */
78 /* also counts needed for progress */
85 GtkWidget *off_request_l;
86 GtkCheckButton *off_request_b;
87 GtkWidget *get_tracks_l;
88 GtkCheckButton *get_tracks_b;
89 GtkWidget *get_routes_l;
90 GtkCheckButton *get_routes_b;
91 GtkWidget *get_waypoints_l;
92 GtkCheckButton *get_waypoints_b;
100 GtkWidget *rte_label;
101 GtkWidget *progress_label;
102 vik_gps_xfer_type progress_type;
107 // Know which way xfer is so xfer setting types are only stored for download
108 vik_gps_dir direction;
111 #define VIK_SETTINGS_GPS_GET_TRACKS "gps_download_tracks"
112 #define VIK_SETTINGS_GPS_GET_ROUTES "gps_download_routes"
113 #define VIK_SETTINGS_GPS_GET_WAYPOINTS "gps_download_waypoints"
114 #define VIK_SETTINGS_GPS_PROTOCOL "gps_protocol"
115 #define VIK_SETTINGS_GPS_PORT "gps_port"
116 #define VIK_SETTINGS_GPS_POWER_OFF "gps_power_off"
118 static gpointer datasource_gps_init_func ( acq_vik_t *avt )
120 gps_user_data_t *gps_ud = g_malloc (sizeof(gps_user_data_t));
121 gps_ud->direction = GPS_DOWN;
126 * datasource_gps_get_protocol:
128 * Method to get the communication protocol of the GPS device from the widget structure
130 gchar* datasource_gps_get_protocol ( gpointer user_data )
132 // Uses the list of supported devices
133 gps_user_data_t *w = (gps_user_data_t *)user_data;
134 last_active = gtk_combo_box_get_active(GTK_COMBO_BOX(w->proto_b));
135 if (a_babel_device_list) {
136 gchar *protocol = ((BabelDevice*)g_list_nth_data(a_babel_device_list, last_active))->name;
137 a_settings_set_string ( VIK_SETTINGS_GPS_PROTOCOL, protocol );
145 * datasource_gps_get_descriptor:
147 * Method to get the descriptor from the widget structure
148 * "Everything is a file"
149 * Could actually be normal file or a serial port
151 gchar* datasource_gps_get_descriptor ( gpointer user_data )
153 gps_user_data_t *w = (gps_user_data_t *)user_data;
155 #if GTK_CHECK_VERSION (2, 24, 0)
156 gchar *descriptor = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(w->ser_b));
158 gchar *descriptor = gtk_combo_box_get_active_text(GTK_COMBO_BOX(w->ser_b));
160 a_settings_set_string ( VIK_SETTINGS_GPS_PORT, descriptor );
165 * datasource_gps_get_do_tracks:
167 * Method to get the track handling behaviour from the widget structure
169 gboolean datasource_gps_get_do_tracks ( gpointer user_data )
171 gps_user_data_t *w = (gps_user_data_t *)user_data;
172 gboolean get_tracks = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->get_tracks_b));
173 if ( w->direction == GPS_DOWN )
174 a_settings_set_boolean ( VIK_SETTINGS_GPS_GET_TRACKS, get_tracks );
179 * datasource_gps_get_do_routes:
181 * Method to get the route handling behaviour from the widget structure
183 gboolean datasource_gps_get_do_routes ( gpointer user_data )
185 gps_user_data_t *w = (gps_user_data_t *)user_data;
186 gboolean get_routes = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->get_routes_b));
187 if ( w->direction == GPS_DOWN )
188 a_settings_set_boolean ( VIK_SETTINGS_GPS_GET_ROUTES, get_routes );
193 * datasource_gps_get_do_waypoints:
195 * Method to get the waypoint handling behaviour from the widget structure
197 gboolean datasource_gps_get_do_waypoints ( gpointer user_data )
199 gps_user_data_t *w = (gps_user_data_t *)user_data;
200 gboolean get_waypoints = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->get_waypoints_b));
201 if ( w->direction == GPS_DOWN )
202 a_settings_set_boolean ( VIK_SETTINGS_GPS_GET_WAYPOINTS, get_waypoints );
203 return get_waypoints;
206 static void datasource_gps_get_cmd_string ( gpointer user_data, gchar **babelargs, gchar **input_file, gpointer not_used )
211 char *waypoints = NULL;
213 if (gps_acquire_in_progress) {
214 *babelargs = *input_file = NULL;
217 gps_acquire_in_progress = TRUE;
219 device = datasource_gps_get_protocol ( user_data );
221 if ( datasource_gps_get_do_tracks ( user_data ) )
226 if ( datasource_gps_get_do_routes ( user_data ) )
231 if ( datasource_gps_get_do_waypoints ( user_data ) )
236 *babelargs = g_strdup_printf("-D 9 %s %s %s -i %s", tracks, routes, waypoints, device);
237 /* device points to static content => no free */
243 *input_file = g_strdup(datasource_gps_get_descriptor(user_data));
245 g_debug(_("using cmdline '%s' and file '%s'\n"), *babelargs, *input_file);
249 * datasource_gps_get_off:
251 * Method to get the off behaviour from the widget structure
253 gboolean datasource_gps_get_off ( gpointer user_data )
255 gps_user_data_t *w = (gps_user_data_t *)user_data;
256 gboolean power_off = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->off_request_b));
257 a_settings_set_boolean ( VIK_SETTINGS_GPS_POWER_OFF, power_off );
261 static void datasource_gps_off ( gpointer user_data, gchar **babelargs, gchar **input_file )
265 gps_user_data_t *w = (gps_user_data_t *)user_data;
267 if (gps_acquire_in_progress) {
268 *babelargs = *input_file = NULL;
271 /* See if we should turn off the device */
272 if (!datasource_gps_get_off ( user_data )){
276 if (!a_babel_device_list)
278 last_active = gtk_combo_box_get_active(GTK_COMBO_BOX(w->proto_b));
279 device = ((BabelDevice*)g_list_nth_data(a_babel_device_list, last_active))->name;
280 if (!strcmp(device, "garmin")) {
281 device = "garmin,power_off";
283 else if (!strcmp(device, "navilink")) {
284 device = "navilink,power_off";
290 *babelargs = g_strdup_printf("-i %s", device);
291 /* device points to static content => no free */
294 #if GTK_CHECK_VERSION (2, 24, 0)
295 ser = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(w->ser_b));
297 ser = gtk_combo_box_get_active_text(GTK_COMBO_BOX(w->ser_b));
299 *input_file = g_strdup(ser);
303 static void datasource_gps_cleanup ( gpointer user_data )
305 g_free ( user_data );
306 gps_acquire_in_progress = FALSE;
310 * datasource_gps_clean_up:
312 * External method to tidy up
314 void datasource_gps_clean_up ( gpointer user_data )
316 datasource_gps_cleanup ( user_data );
319 static void set_total_count(gint cnt, acq_dialog_widgets_t *w)
324 gps_user_data_t *gps_data = (gps_user_data_t *)w->user_data;
325 const gchar *tmp_str;
326 switch (gps_data->progress_type) {
327 case WPT: tmp_str = ngettext("Downloading %d waypoint...", "Downloading %d waypoints...", cnt); gps_data->total_count = cnt; break;
328 case TRK: tmp_str = ngettext("Downloading %d trackpoint...", "Downloading %d trackpoints...", cnt); gps_data->total_count = cnt; break;
331 // Maybe a gpsbabel bug/feature (upto at least v1.4.3 or maybe my Garmin device) but the count always seems x2 too many for routepoints
332 gint mycnt = (cnt / 2) + 1;
333 tmp_str = ngettext("Downloading %d routepoint...", "Downloading %d routepoints...", mycnt);
334 gps_data->total_count = mycnt;
338 s = g_strdup_printf(tmp_str, cnt);
339 gtk_label_set_text ( GTK_LABEL(gps_data->progress_label), s );
340 gtk_widget_show ( gps_data->progress_label );
346 static void set_current_count(gint cnt, acq_dialog_widgets_t *w)
351 gps_user_data_t *gps_data = (gps_user_data_t *)w->user_data;
353 if (cnt < gps_data->total_count) {
354 switch (gps_data->progress_type) {
355 case WPT: s = g_strdup_printf(_("Downloaded %d out of %d %s..."), cnt, gps_data->total_count, "waypoints"); break;
356 case TRK: s = g_strdup_printf(_("Downloaded %d out of %d %s..."), cnt, gps_data->total_count, "trackpoints"); break;
357 default: s = g_strdup_printf(_("Downloaded %d out of %d %s..."), cnt, gps_data->total_count, "routepoints"); break;
360 switch (gps_data->progress_type) {
361 case WPT: s = g_strdup_printf(_("Downloaded %d %s."), cnt, "waypoints"); break;
362 case TRK: s = g_strdup_printf(_("Downloaded %d %s."), cnt, "trackpoints"); break;
363 default: s = g_strdup_printf(_("Downloaded %d %s."), cnt, "routepoints"); break;
366 gtk_label_set_text ( GTK_LABEL(gps_data->progress_label), s );
372 static void set_gps_info(const gchar *info, acq_dialog_widgets_t *w)
377 s = g_strdup_printf(_("GPS Device: %s"), info);
378 gtk_label_set_text ( GTK_LABEL(((gps_user_data_t *)w->user_data)->gps_label), s );
385 * This routine relies on gpsbabel's diagnostic output to display the progress information.
386 * These outputs differ when different GPS devices are used, so we will need to test
387 * them on several and add the corresponding support.
389 static void datasource_gps_progress ( BabelProgressCode c, gpointer data, acq_dialog_widgets_t *w )
392 gps_user_data_t *gps_data = (gps_user_data_t *)w->user_data;
395 case BABEL_DIAG_OUTPUT:
396 line = (gchar *)data;
400 gtk_label_set_text ( GTK_LABEL(w->status), _("Status: Working...") );
404 /* tells us the type of items that will follow */
405 if (strstr(line, "Xfer Wpt")) {
406 gps_data->progress_label = gps_data->wp_label;
407 gps_data->progress_type = WPT;
409 if (strstr(line, "Xfer Trk")) {
410 gps_data->progress_label = gps_data->trk_label;
411 gps_data->progress_type = TRK;
413 if (strstr(line, "Xfer Rte")) {
414 gps_data->progress_label = gps_data->rte_label;
415 gps_data->progress_type = RTE;
418 if (strstr(line, "PRDDAT")) {
419 gchar **tokens = g_strsplit(line, " ", 0);
425 while (tokens[n_tokens])
429 for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) {
431 sscanf(tokens[i], "%x", &ch);
435 set_gps_info(info, w);
439 /* eg: "Unit:\teTrex Legend HCx Software Version 2.90\n" */
440 if (strstr(line, "Unit:")) {
441 gchar **tokens = g_strsplit(line, "\t", 0);
443 while (tokens[n_tokens])
447 set_gps_info(tokens[1], w);
451 /* tells us how many items there will be */
452 if (strstr(line, "RECORD")) {
455 if (strlen(line) > 20) {
456 sscanf(line+17, "%x", &lsb);
457 sscanf(line+20, "%x", &msb);
458 cnt = lsb + msb * 256;
459 set_total_count(cnt, w);
463 if ( strstr(line, "WPTDAT") || strstr(line, "TRKHDR") || strstr(line, "TRKDAT") || strstr(line, "RTEHDR") || strstr(line, "RTEWPT") ) {
465 set_current_count(gps_data->count, w);
475 void append_element (gpointer elem, gpointer user_data)
477 const gchar *text = ((BabelDevice*)elem)->label;
478 vik_combo_box_text_append (GTK_WIDGET(user_data), text);
481 static gint find_entry = -1;
482 static gint garmin_entry = -1;
483 static gint wanted_entry = -1;
485 static void find_protocol (gpointer elem, gpointer user_data)
487 const gchar *name = ((BabelDevice*)elem)->name;
488 const gchar *protocol = user_data;
490 if (!strcmp(name, protocol)) {
491 wanted_entry = find_entry;
495 static void datasource_gps_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data )
497 gps_user_data_t *w = (gps_user_data_t *)user_data;
498 GtkTable *box, *data_type_box;
500 w->proto_l = gtk_label_new (_("GPS Protocol:"));
501 w->proto_b = vik_combo_box_text_new ();
502 g_list_foreach (a_babel_device_list, append_element, w->proto_b);
504 if ( last_active < 0 ) {
507 gchar *protocol = NULL;
508 if ( a_settings_get_string ( VIK_SETTINGS_GPS_PROTOCOL, &protocol ) ) {
511 g_list_foreach (a_babel_device_list, find_protocol, protocol);
512 // If not found set it to the first entry, otherwise use the entry
513 last_active = ( wanted_entry < 0 ) ? 0 : wanted_entry;
516 // Maintain default to Garmin devices (assumed most popular/numerous device)
518 g_list_foreach (a_babel_device_list, find_protocol, "garmin");
519 last_active = ( garmin_entry < 0 ) ? 0 : garmin_entry;
523 gtk_combo_box_set_active (GTK_COMBO_BOX(w->proto_b), last_active);
524 g_object_ref(w->proto_b);
526 w->ser_l = gtk_label_new (_("Serial Port:"));
527 #if GTK_CHECK_VERSION (2, 24, 0)
528 w->ser_b = gtk_combo_box_text_new_with_entry ();
530 w->ser_b = gtk_combo_box_entry_new_text ();
532 // Value from the settings is promoted to the top
533 gchar *gps_port = NULL;
534 if ( a_settings_get_string ( VIK_SETTINGS_GPS_PORT, &gps_port ) ) {
535 // Use setting if available
538 if ( !strncmp (gps_port, "/dev/tty", 6) ) {
539 if (g_access (gps_port, R_OK) == 0) {
540 vik_combo_box_text_append (w->ser_b, gps_port);
545 vik_combo_box_text_append (w->ser_b, gps_port);
549 // Note avoid appending the port selected from the settings
551 if ( gps_port && strcmp (gps_port, "com1") )
552 vik_combo_box_text_append (w->ser_b, "com1");
554 /* Here just try to see if the device is available which gets passed onto gpsbabel
555 List USB devices first as these will generally only be present if autogenerated by udev or similar
556 User is still able to set their own free text entry */
557 if ( gps_port && strcmp (gps_port, "/dev/ttyUSB0") )
558 if (g_access ("/dev/ttyUSB0", R_OK) == 0)
559 vik_combo_box_text_append (w->ser_b, "/dev/ttyUSB0");
560 if ( gps_port && strcmp (gps_port, "/dev/ttyUSB1") )
561 if (g_access ("/dev/ttyUSB1", R_OK) == 0)
562 vik_combo_box_text_append (w->ser_b, "/dev/ttyUSB1");
563 if ( gps_port && strcmp (gps_port, "/dev/ttyS0") )
564 if (g_access ("/dev/ttyS0", R_OK) == 0)
565 vik_combo_box_text_append (w->ser_b, "/dev/ttyS0");
566 if ( gps_port && strcmp (gps_port, "/dev/ttyS1") )
567 if (g_access ("/dev/ttyS1", R_OK) == 0)
568 vik_combo_box_text_append (w->ser_b, "/dev/ttyS1");
570 if ( gps_port && strcmp (gps_port, "usb:") )
571 vik_combo_box_text_append (w->ser_b, "usb:");
573 gtk_combo_box_set_active (GTK_COMBO_BOX(w->ser_b), 0);
574 g_object_ref(w->ser_b);
576 w->off_request_l = gtk_label_new (_("Turn Off After Transfer\n(Garmin/NAViLink Only)"));
577 w->off_request_b = GTK_CHECK_BUTTON ( gtk_check_button_new () );
579 if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_POWER_OFF, &power_off ) )
581 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->off_request_b), power_off);
583 w->get_tracks_l = gtk_label_new (_("Tracks:"));
584 w->get_tracks_b = GTK_CHECK_BUTTON ( gtk_check_button_new () );
586 if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_GET_TRACKS, &get_tracks ) )
588 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->get_tracks_b), get_tracks);
590 w->get_routes_l = gtk_label_new (_("Routes:"));
591 w->get_routes_b = GTK_CHECK_BUTTON ( gtk_check_button_new () );
593 if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_GET_ROUTES, &get_routes ) )
595 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->get_routes_b), get_routes);
597 w->get_waypoints_l = gtk_label_new (_("Waypoints:"));
598 w->get_waypoints_b = GTK_CHECK_BUTTON ( gtk_check_button_new () );
599 gboolean get_waypoints;
600 if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_GET_WAYPOINTS, &get_waypoints ) )
601 get_waypoints = TRUE;
602 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->get_waypoints_b), get_waypoints);
604 box = GTK_TABLE(gtk_table_new(2, 4, FALSE));
605 data_type_box = GTK_TABLE(gtk_table_new(4, 1, FALSE));
607 gtk_table_attach_defaults(box, GTK_WIDGET(w->proto_l), 0, 1, 0, 1);
608 gtk_table_attach_defaults(box, GTK_WIDGET(w->proto_b), 1, 2, 0, 1);
609 gtk_table_attach_defaults(box, GTK_WIDGET(w->ser_l), 0, 1, 1, 2);
610 gtk_table_attach_defaults(box, GTK_WIDGET(w->ser_b), 1, 2, 1, 2);
611 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_tracks_l), 0, 1, 0, 1);
612 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_tracks_b), 1, 2, 0, 1);
613 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_routes_l), 2, 3, 0, 1);
614 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_routes_b), 3, 4, 0, 1);
615 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_waypoints_l), 4, 5, 0, 1);
616 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_waypoints_b), 5, 6, 0, 1);
617 gtk_table_attach_defaults(box, GTK_WIDGET(data_type_box), 0, 2, 2, 3);
618 gtk_table_attach_defaults(box, GTK_WIDGET(w->off_request_l), 0, 1, 3, 4);
619 gtk_table_attach_defaults(box, GTK_WIDGET(w->off_request_b), 1, 3, 3, 4);
620 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), GTK_WIDGET(box), FALSE, FALSE, 5 );
622 gtk_widget_show_all ( dialog );
626 * datasource_gps_setup:
627 * @dialog: The GTK dialog. The caller is responsible for managing the dialog creation/deletion
628 * @xfer: The default type of items enabled for transfer, others disabled.
629 * @xfer_all: When specified all items are enabled for transfer.
631 * Returns: A gpointer to the private structure for GPS progress/information widgets
632 * Pass this pointer back into the other exposed datasource_gps_X functions
634 gpointer datasource_gps_setup ( GtkWidget *dialog, vik_gps_xfer_type xfer, gboolean xfer_all )
636 gps_user_data_t *w_gps = (gps_user_data_t *)datasource_gps_init_func ( NULL );
637 w_gps->direction = GPS_UP;
638 datasource_gps_add_setup_widgets ( dialog, NULL, w_gps );
640 gboolean way = xfer_all;
641 gboolean trk = xfer_all;
642 gboolean rte = xfer_all;
644 // Selectively turn bits on
647 case WPT: way = TRUE; break;
648 case RTE: rte = TRUE; break;
649 default: trk = TRUE; break;
654 gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(w_gps->get_tracks_b), trk );
655 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_tracks_l), trk );
656 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_tracks_b), trk );
658 gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(w_gps->get_routes_b), rte );
659 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_routes_l), rte );
660 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_routes_b), rte );
662 gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(w_gps->get_waypoints_b), way );
663 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_waypoints_l), way );
664 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_waypoints_b), way );
666 return (gpointer)w_gps;
669 void datasource_gps_add_progress_widgets ( GtkWidget *dialog, gpointer user_data )
671 GtkWidget *gpslabel, *verlabel, *idlabel, *wplabel, *trklabel, *rtelabel;
673 gps_user_data_t *w_gps = (gps_user_data_t *)user_data;
675 gpslabel = gtk_label_new (_("GPS device: N/A"));
676 verlabel = gtk_label_new ("");
677 idlabel = gtk_label_new ("");
678 wplabel = gtk_label_new ("");
679 trklabel = gtk_label_new ("");
680 rtelabel = gtk_label_new ("");
682 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), gpslabel, FALSE, FALSE, 5 );
683 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), wplabel, FALSE, FALSE, 5 );
684 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), trklabel, FALSE, FALSE, 5 );
685 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), rtelabel, FALSE, FALSE, 5 );
687 gtk_widget_show_all ( dialog );
689 w_gps->gps_label = gpslabel;
690 w_gps->id_label = idlabel;
691 w_gps->ver_label = verlabel;
692 w_gps->progress_label = w_gps->wp_label = wplabel;
693 w_gps->trk_label = trklabel;
694 w_gps->rte_label = rtelabel;
695 w_gps->total_count = -1;