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-2015, 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_process_options ( gpointer user_data, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 );
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_AUTO_LAYER_MANAGEMENT,
57 VIK_DATASOURCE_INPUTTYPE_NONE,
61 (VikDataSourceInitFunc) datasource_gps_init_func,
62 (VikDataSourceCheckExistenceFunc) NULL,
63 (VikDataSourceAddSetupWidgetsFunc) datasource_gps_add_setup_widgets,
64 (VikDataSourceGetProcessOptionsFunc) datasource_gps_get_process_options,
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,
78 /*********************************************************
79 * Definitions and routines for acquiring data from GPS
80 *********************************************************/
82 /* widgets in setup dialog specific to GPS */
83 /* widgets in progress dialog specific to GPS */
84 /* also counts needed for progress */
91 GtkWidget *off_request_l;
92 GtkCheckButton *off_request_b;
93 GtkWidget *get_tracks_l;
94 GtkCheckButton *get_tracks_b;
95 GtkWidget *get_routes_l;
96 GtkCheckButton *get_routes_b;
97 GtkWidget *get_waypoints_l;
98 GtkCheckButton *get_waypoints_b;
100 /* progress dialog */
101 GtkWidget *gps_label;
102 GtkWidget *wpt_label;
103 GtkWidget *trk_label;
104 GtkWidget *rte_label;
105 vik_gps_xfer_type progress_type;
107 // Maintain separate counts for each type
115 // Know which way xfer is so xfer setting types are only stored for download
116 vik_gps_dir direction;
124 #define VIK_SETTINGS_GPS_GET_TRACKS "gps_download_tracks"
125 #define VIK_SETTINGS_GPS_GET_ROUTES "gps_download_routes"
126 #define VIK_SETTINGS_GPS_GET_WAYPOINTS "gps_download_waypoints"
127 #define VIK_SETTINGS_GPS_PROTOCOL "gps_protocol"
128 #define VIK_SETTINGS_GPS_PORT "gps_port"
129 #define VIK_SETTINGS_GPS_POWER_OFF "gps_power_off"
131 static gpointer datasource_gps_init_func ( acq_vik_t *avt )
133 gps_user_data_t *gps_ud = g_malloc0 (sizeof(gps_user_data_t));
134 gps_ud->direction = GPS_DOWN;
139 * datasource_gps_get_protocol:
141 * Method to get the communication protocol of the GPS device from the widget structure
143 gchar* datasource_gps_get_protocol ( gpointer user_data )
145 // Uses the list of supported devices
146 gps_user_data_t *w = (gps_user_data_t *)user_data;
147 last_active = gtk_combo_box_get_active(GTK_COMBO_BOX(w->proto_b));
148 if (a_babel_device_list) {
149 gchar *protocol = ((BabelDevice*)g_list_nth_data(a_babel_device_list, last_active))->name;
150 a_settings_set_string ( VIK_SETTINGS_GPS_PROTOCOL, protocol );
158 * datasource_gps_get_descriptor:
160 * Method to get the descriptor from the widget structure
161 * "Everything is a file"
162 * Could actually be normal file or a serial port
164 gchar* datasource_gps_get_descriptor ( gpointer user_data )
166 gps_user_data_t *w = (gps_user_data_t *)user_data;
168 #if GTK_CHECK_VERSION (2, 24, 0)
169 gchar *descriptor = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(w->ser_b));
171 gchar *descriptor = gtk_combo_box_get_active_text(GTK_COMBO_BOX(w->ser_b));
173 a_settings_set_string ( VIK_SETTINGS_GPS_PORT, descriptor );
178 * datasource_gps_get_do_tracks:
180 * Method to get the track handling behaviour from the widget structure
182 gboolean datasource_gps_get_do_tracks ( gpointer user_data )
184 gps_user_data_t *w = (gps_user_data_t *)user_data;
185 gboolean get_tracks = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->get_tracks_b));
186 if ( w->direction == GPS_DOWN )
187 a_settings_set_boolean ( VIK_SETTINGS_GPS_GET_TRACKS, get_tracks );
192 * datasource_gps_get_do_routes:
194 * Method to get the route handling behaviour from the widget structure
196 gboolean datasource_gps_get_do_routes ( gpointer user_data )
198 gps_user_data_t *w = (gps_user_data_t *)user_data;
199 gboolean get_routes = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->get_routes_b));
200 if ( w->direction == GPS_DOWN )
201 a_settings_set_boolean ( VIK_SETTINGS_GPS_GET_ROUTES, get_routes );
206 * datasource_gps_get_do_waypoints:
208 * Method to get the waypoint handling behaviour from the widget structure
210 gboolean datasource_gps_get_do_waypoints ( gpointer user_data )
212 gps_user_data_t *w = (gps_user_data_t *)user_data;
213 gboolean get_waypoints = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->get_waypoints_b));
214 if ( w->direction == GPS_DOWN )
215 a_settings_set_boolean ( VIK_SETTINGS_GPS_GET_WAYPOINTS, get_waypoints );
216 return get_waypoints;
219 static void datasource_gps_get_process_options ( gpointer user_data, ProcessOptions *po, gpointer not_used, const gchar *not_used2, const gchar *not_used3 )
224 char *waypoints = NULL;
226 if (gps_acquire_in_progress) {
227 po->babelargs = po->filename = NULL;
230 gps_acquire_in_progress = TRUE;
232 device = datasource_gps_get_protocol ( user_data );
234 if ( datasource_gps_get_do_tracks ( user_data ) )
239 if ( datasource_gps_get_do_routes ( user_data ) )
244 if ( datasource_gps_get_do_waypoints ( user_data ) )
249 po->babelargs = g_strdup_printf("-D 9 %s %s %s -i %s", tracks, routes, waypoints, device);
250 /* device points to static content => no free */
256 po->filename = g_strdup(datasource_gps_get_descriptor(user_data));
258 g_debug(_("using cmd '%s' and file '%s'\n"), po->babelargs, po->filename);
262 * datasource_gps_get_off:
264 * Method to get the off behaviour from the widget structure
266 gboolean datasource_gps_get_off ( gpointer user_data )
268 gps_user_data_t *w = (gps_user_data_t *)user_data;
269 gboolean power_off = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->off_request_b));
270 a_settings_set_boolean ( VIK_SETTINGS_GPS_POWER_OFF, power_off );
274 static void datasource_gps_off ( gpointer user_data, gchar **babelargs, gchar **file_descriptor )
278 gps_user_data_t *w = (gps_user_data_t *)user_data;
280 if (gps_acquire_in_progress) {
281 *babelargs = *file_descriptor = NULL;
284 /* See if we should turn off the device */
285 if (!datasource_gps_get_off ( user_data )){
289 if (!a_babel_device_list)
291 last_active = gtk_combo_box_get_active(GTK_COMBO_BOX(w->proto_b));
292 device = ((BabelDevice*)g_list_nth_data(a_babel_device_list, last_active))->name;
293 if (!strcmp(device, "garmin")) {
294 device = "garmin,power_off";
296 else if (!strcmp(device, "navilink")) {
297 device = "navilink,power_off";
303 *babelargs = g_strdup_printf("-i %s", device);
304 /* device points to static content => no free */
307 #if GTK_CHECK_VERSION (2, 24, 0)
308 ser = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(w->ser_b));
310 ser = gtk_combo_box_get_active_text(GTK_COMBO_BOX(w->ser_b));
312 *file_descriptor = g_strdup(ser);
316 static void datasource_gps_cleanup ( gpointer user_data )
318 gps_user_data_t *gud = (gps_user_data_t *)user_data;
319 // Remove any outstanding GUI update requests
320 if ( gud->id_status )
321 g_source_remove ( gud->id_status );
323 g_source_remove ( gud->id_info );
324 if ( gud->id_total_count )
325 g_source_remove ( gud->id_total_count );
327 g_source_remove ( gud->id_count );
328 g_free ( gud->info );
330 gps_acquire_in_progress = FALSE;
334 * datasource_gps_clean_up:
336 * External method to tidy up
338 void datasource_gps_clean_up ( gpointer user_data )
340 datasource_gps_cleanup ( user_data );
343 static gboolean show_total_count(acq_dialog_widgets_t *w)
345 gps_user_data_t *gps_data = (gps_user_data_t *)w->user_data;
348 GtkWidget *progress_label;
349 const gchar *tmp_str;
350 switch (gps_data->progress_type) {
352 progress_label = gps_data->wpt_label;
353 tmp_str = ngettext("Downloading %d waypoint...", "Downloading %d waypoints...", gps_data->wpt_total_count);
354 tmp_count = gps_data->wpt_total_count;
357 progress_label = gps_data->trk_label;
358 tmp_str = ngettext("Downloading %d trackpoint...", "Downloading %d trackpoints...", gps_data->trk_total_count);
359 tmp_count = gps_data->trk_total_count;
362 progress_label = gps_data->rte_label;
363 tmp_str = ngettext("Downloading %d routepoint...", "Downloading %d routepoints...", gps_data->rte_total_count);
364 tmp_count = gps_data->rte_total_count;
367 gchar *s = g_strdup_printf(tmp_str, tmp_count);
368 gtk_label_set_text ( GTK_LABEL(progress_label), s );
369 gtk_widget_show ( progress_label );
372 gps_data->id_total_count = 0;
376 static gboolean show_current_count(acq_dialog_widgets_t *w)
378 gps_user_data_t *gps_data = (gps_user_data_t *)w->user_data;
380 GtkWidget *progress_label;
382 switch (gps_data->progress_type) {
384 progress_label = gps_data->wpt_label;
385 if ( gps_data->wpt_count < gps_data->wpt_total_count )
386 s = g_strdup_printf(_("Downloaded %d out of %d %s..."), gps_data->wpt_count, gps_data->wpt_total_count, "waypoints");
388 s = g_strdup_printf(_("Downloaded %d %s."), gps_data->wpt_count, "waypoints");
391 progress_label = gps_data->trk_label;
392 if ( gps_data->trk_count < gps_data->trk_total_count )
393 s = g_strdup_printf(_("Downloaded %d out of %d %s..."), gps_data->trk_count, gps_data->trk_total_count, "trackpoints");
395 s = g_strdup_printf(_("Downloaded %d %s."), gps_data->trk_count, "trackpoints");
398 progress_label = gps_data->rte_label;
399 if ( gps_data->rte_count < gps_data->rte_total_count )
400 s = g_strdup_printf(_("Downloaded %d out of %d %s..."), gps_data->rte_count, gps_data->rte_total_count, "routepoints");
402 s = g_strdup_printf(_("Downloaded %d %s."), gps_data->rte_count, "routepoints");
405 gtk_label_set_text ( GTK_LABEL(progress_label), s );
408 gps_data->id_count = 0;
412 static gboolean show_gps_info(acq_dialog_widgets_t *w)
414 gps_user_data_t *gps_data = (gps_user_data_t*)w->user_data;
416 gchar *s = g_strdup_printf ( _("GPS Device: %s"), gps_data->info );
417 gtk_label_set_text ( GTK_LABEL(gps_data->gps_label), s );
420 gps_data->id_info = 0;
424 static gboolean show_gps_status(acq_dialog_widgets_t *w)
426 gps_user_data_t *gps_data = (gps_user_data_t*)w->user_data;
428 gtk_label_set_text ( GTK_LABEL(w->status), _("Status: Working...") );
430 gps_data->id_status = 0;
435 * This routine relies on gpsbabel's diagnostic output to display the progress information.
436 * These outputs differ when different GPS devices are used, so we will need to test
437 * them on several and add the corresponding support.
439 static void datasource_gps_progress ( BabelProgressCode c, gpointer data, acq_dialog_widgets_t *w )
442 gps_user_data_t *gps_data = (gps_user_data_t *)w->user_data;
445 case BABEL_DIAG_OUTPUT:
446 line = (gchar *)data;
448 gps_data->id_status = gdk_threads_add_idle ( (GSourceFunc)show_gps_status, w );
450 /* tells us the type of items that will follow */
451 if (strstr(line, "Xfer Wpt")) {
452 gps_data->progress_type = WPT;
454 if (strstr(line, "Xfer Trk")) {
455 gps_data->progress_type = TRK;
457 if (strstr(line, "Xfer Rte")) {
458 gps_data->progress_type = RTE;
461 if (strstr(line, "PRDDAT")) {
462 gchar **tokens = g_strsplit(line, " ", 0);
468 while (tokens[n_tokens])
472 for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) {
474 sscanf(tokens[i], "%x", &ch);
478 gps_data->info = g_strdup (info);
479 gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w );
483 /* eg: "Unit:\teTrex Legend HCx Software Version 2.90\n" */
484 if (strstr(line, "Unit:")) {
485 gchar **tokens = g_strsplit(line, "\t", 0);
487 while (tokens[n_tokens])
491 gps_data->info = g_strdup (tokens[1]);
492 gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w );
496 /* Capture some potential errors */
497 if (strstr(line, "[ERROR] GPS")) {
498 gchar **tokens = g_strsplit(line, "\n", 0);
499 gps_data->info = g_strdup(tokens[0]);
500 gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w );
503 if (strstr(line, "an't in")) {
504 gchar **tokens = g_strsplit(line, "\n", 0);
505 gps_data->info = g_strdup(tokens[0]);
506 gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w );
510 if (strstr(line, "Can't get waypoint")) {
511 gchar **tokens = g_strsplit(line, "\n", 0);
512 gps_data->info = g_strdup(tokens[0]);
513 gps_data->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, w );
516 /* tells us how many items there will be */
517 if (strstr(line, "RECORD")) {
520 if (strlen(line) > 20) {
521 sscanf(line+17, "%x", &lsb);
522 sscanf(line+20, "%x", &msb);
523 cnt = lsb + msb * 256;
524 if ( gps_data->progress_type == RTE ) {
525 // 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
526 gint mycnt = (cnt / 2) + 1;
527 gps_data->rte_total_count = mycnt;
528 gps_data->rte_count = 0;
530 else if ( gps_data->progress_type == TRK ) {
531 gps_data->trk_total_count = cnt;
532 gps_data->trk_count = 0;
535 gps_data->wpt_total_count = cnt;
536 gps_data->wpt_count = 0;
539 gps_data->id_total_count = gdk_threads_add_idle ( (GSourceFunc)show_total_count, w);
542 if ( strstr(line, "WPTDAT") || strstr(line, "TRKHDR") || strstr(line, "TRKDAT") || strstr(line, "RTEHDR") || strstr(line, "RTEWPT") ) {
543 if ( strstr(line, "WPTDAT") )
544 gps_data->wpt_count++;
545 else if ( strstr(line, "TRKHDR") || strstr(line, "TRKDAT") )
546 gps_data->trk_count++;
548 // "RTEHDR" || "RTEWPT"
549 gps_data->rte_count++;
550 gps_data->id_count = gdk_threads_add_idle ( (GSourceFunc)show_current_count, w);
560 void append_element (gpointer elem, gpointer user_data)
562 const gchar *text = ((BabelDevice*)elem)->label;
563 vik_combo_box_text_append (GTK_WIDGET(user_data), text);
566 static gint find_entry = -1;
567 static gint wanted_entry = -1;
569 static void find_protocol (gpointer elem, gpointer user_data)
571 const gchar *name = ((BabelDevice*)elem)->name;
572 const gchar *protocol = user_data;
574 if (!strcmp(name, protocol)) {
575 wanted_entry = find_entry;
579 static void datasource_gps_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data )
581 gps_user_data_t *w = (gps_user_data_t *)user_data;
582 GtkTable *box, *data_type_box;
584 w->proto_l = gtk_label_new (_("GPS Protocol:"));
585 w->proto_b = vik_combo_box_text_new ();
586 g_list_foreach (a_babel_device_list, append_element, w->proto_b);
588 if ( last_active < 0 ) {
591 gchar *protocol = NULL;
592 if ( a_settings_get_string ( VIK_SETTINGS_GPS_PROTOCOL, &protocol ) ) {
595 g_list_foreach (a_babel_device_list, find_protocol, protocol);
598 // Attempt to maintain default to Garmin devices (assumed most popular/numerous device)
599 g_list_foreach (a_babel_device_list, find_protocol, "garmin");
601 // If not found set it to the first entry, otherwise use the entry
602 last_active = ( wanted_entry < 0 ) ? 0 : wanted_entry;
605 gtk_combo_box_set_active (GTK_COMBO_BOX(w->proto_b), last_active);
606 g_object_ref(w->proto_b);
608 w->ser_l = gtk_label_new (_("Serial Port:"));
609 #if GTK_CHECK_VERSION (2, 24, 0)
610 w->ser_b = gtk_combo_box_text_new_with_entry ();
612 w->ser_b = gtk_combo_box_entry_new_text ();
614 // Value from the settings is promoted to the top
615 gchar *gps_port = NULL;
616 if ( a_settings_get_string ( VIK_SETTINGS_GPS_PORT, &gps_port ) ) {
617 // Use setting if available
620 if ( !strncmp (gps_port, "/dev/tty", 6) ) {
621 if (g_access (gps_port, R_OK) == 0) {
622 vik_combo_box_text_append (w->ser_b, gps_port);
627 vik_combo_box_text_append (w->ser_b, gps_port);
631 // Note avoid appending the port selected from the settings
633 if ( gps_port && strcmp (gps_port, "com1") )
634 vik_combo_box_text_append (w->ser_b, "com1");
636 /* Here just try to see if the device is available which gets passed onto gpsbabel
637 List USB devices first as these will generally only be present if autogenerated by udev or similar
638 User is still able to set their own free text entry */
639 if ( gps_port && strcmp (gps_port, "/dev/ttyUSB0") )
640 if (g_access ("/dev/ttyUSB0", R_OK) == 0)
641 vik_combo_box_text_append (w->ser_b, "/dev/ttyUSB0");
642 if ( gps_port && strcmp (gps_port, "/dev/ttyUSB1") )
643 if (g_access ("/dev/ttyUSB1", R_OK) == 0)
644 vik_combo_box_text_append (w->ser_b, "/dev/ttyUSB1");
645 if ( gps_port && strcmp (gps_port, "/dev/ttyS0") )
646 if (g_access ("/dev/ttyS0", R_OK) == 0)
647 vik_combo_box_text_append (w->ser_b, "/dev/ttyS0");
648 if ( gps_port && strcmp (gps_port, "/dev/ttyS1") )
649 if (g_access ("/dev/ttyS1", R_OK) == 0)
650 vik_combo_box_text_append (w->ser_b, "/dev/ttyS1");
652 if ( gps_port && strcmp (gps_port, "usb:") )
653 vik_combo_box_text_append (w->ser_b, "usb:");
655 gtk_combo_box_set_active (GTK_COMBO_BOX(w->ser_b), 0);
656 g_object_ref(w->ser_b);
658 w->off_request_l = gtk_label_new (_("Turn Off After Transfer\n(Garmin/NAViLink Only)"));
659 w->off_request_b = GTK_CHECK_BUTTON ( gtk_check_button_new () );
661 if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_POWER_OFF, &power_off ) )
663 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->off_request_b), power_off);
665 w->get_tracks_l = gtk_label_new (_("Tracks:"));
666 w->get_tracks_b = GTK_CHECK_BUTTON ( gtk_check_button_new () );
668 if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_GET_TRACKS, &get_tracks ) )
670 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->get_tracks_b), get_tracks);
672 w->get_routes_l = gtk_label_new (_("Routes:"));
673 w->get_routes_b = GTK_CHECK_BUTTON ( gtk_check_button_new () );
675 if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_GET_ROUTES, &get_routes ) )
677 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->get_routes_b), get_routes);
679 w->get_waypoints_l = gtk_label_new (_("Waypoints:"));
680 w->get_waypoints_b = GTK_CHECK_BUTTON ( gtk_check_button_new () );
681 gboolean get_waypoints;
682 if ( ! a_settings_get_boolean ( VIK_SETTINGS_GPS_GET_WAYPOINTS, &get_waypoints ) )
683 get_waypoints = TRUE;
684 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w->get_waypoints_b), get_waypoints);
686 box = GTK_TABLE(gtk_table_new(2, 4, FALSE));
687 data_type_box = GTK_TABLE(gtk_table_new(4, 1, FALSE));
689 gtk_table_attach_defaults(box, GTK_WIDGET(w->proto_l), 0, 1, 0, 1);
690 gtk_table_attach_defaults(box, GTK_WIDGET(w->proto_b), 1, 2, 0, 1);
691 gtk_table_attach_defaults(box, GTK_WIDGET(w->ser_l), 0, 1, 1, 2);
692 gtk_table_attach_defaults(box, GTK_WIDGET(w->ser_b), 1, 2, 1, 2);
693 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_tracks_l), 0, 1, 0, 1);
694 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_tracks_b), 1, 2, 0, 1);
695 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_routes_l), 2, 3, 0, 1);
696 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_routes_b), 3, 4, 0, 1);
697 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_waypoints_l), 4, 5, 0, 1);
698 gtk_table_attach_defaults(data_type_box, GTK_WIDGET(w->get_waypoints_b), 5, 6, 0, 1);
699 gtk_table_attach_defaults(box, GTK_WIDGET(data_type_box), 0, 2, 2, 3);
700 gtk_table_attach_defaults(box, GTK_WIDGET(w->off_request_l), 0, 1, 3, 4);
701 gtk_table_attach_defaults(box, GTK_WIDGET(w->off_request_b), 1, 3, 3, 4);
702 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), GTK_WIDGET(box), FALSE, FALSE, 5 );
704 gtk_widget_show_all ( dialog );
708 * datasource_gps_setup:
709 * @dialog: The GTK dialog. The caller is responsible for managing the dialog creation/deletion
710 * @xfer: The default type of items enabled for transfer, others disabled.
711 * @xfer_all: When specified all items are enabled for transfer.
713 * Returns: A gpointer to the private structure for GPS progress/information widgets
714 * Pass this pointer back into the other exposed datasource_gps_X functions
716 gpointer datasource_gps_setup ( GtkWidget *dialog, vik_gps_xfer_type xfer, gboolean xfer_all )
718 gps_user_data_t *w_gps = (gps_user_data_t *)datasource_gps_init_func ( NULL );
719 w_gps->direction = GPS_UP;
720 datasource_gps_add_setup_widgets ( dialog, NULL, w_gps );
722 gboolean way = xfer_all;
723 gboolean trk = xfer_all;
724 gboolean rte = xfer_all;
726 // Selectively turn bits on
729 case WPT: way = TRUE; break;
730 case RTE: rte = TRUE; break;
731 default: trk = TRUE; break;
736 gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(w_gps->get_tracks_b), trk );
737 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_tracks_l), trk );
738 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_tracks_b), trk );
740 gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(w_gps->get_routes_b), rte );
741 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_routes_l), rte );
742 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_routes_b), rte );
744 gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(w_gps->get_waypoints_b), way );
745 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_waypoints_l), way );
746 gtk_widget_set_sensitive ( GTK_WIDGET(w_gps->get_waypoints_b), way );
748 return (gpointer)w_gps;
751 void datasource_gps_add_progress_widgets ( GtkWidget *dialog, gpointer user_data )
753 gps_user_data_t *w_gps = (gps_user_data_t *)user_data;
755 w_gps->gps_label = gtk_label_new (_("GPS device: N/A"));
756 w_gps->wpt_label = gtk_label_new ("");
757 w_gps->trk_label = gtk_label_new ("");
758 w_gps->rte_label = gtk_label_new ("");
760 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), w_gps->gps_label, FALSE, FALSE, 5 );
761 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), w_gps->wpt_label, FALSE, FALSE, 5 );
762 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), w_gps->trk_label, FALSE, FALSE, 5 );
763 gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), w_gps->rte_label, FALSE, FALSE, 5 );
765 gtk_widget_show_all ( dialog );