#include "viking.h"
#include "icons/icons.h"
#include "babel.h"
+#include "viktrwlayer.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#include <glib/gi18n.h>
#ifdef VIK_CONFIG_REALTIME_GPS_TRACKING
#include <gps.h>
-#include "vikutils.h"
#endif
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, VikViewport *vp );
+static void vik_gps_layer_realize ( VikGpsLayer *vgl, VikTreeview *vt, GtkTreeIter *layer_iter );
+static void vik_gps_layer_free ( VikGpsLayer *vgl );
+static void vik_gps_layer_draw ( VikGpsLayer *vgl, VikViewport *vp );
static VikGpsLayer *vik_gps_layer_new ( VikViewport *vp );
+static void vik_gps_layer_post_read ( VikGpsLayer *vgl, VikViewport *vp, gboolean from_file );
-static void gps_layer_marshall( VikGpsLayer *val, guint8 **data, gint *len );
+static void gps_layer_marshall( VikGpsLayer *vgl, guint8 **data, gint *len );
static VikGpsLayer *gps_layer_unmarshall( guint8 *data, gint len, VikViewport *vvp );
-static gboolean gps_layer_set_param ( VikGpsLayer *vgl, guint16 id, VikLayerParamData data, VikViewport *vp, gboolean is_file_operation );
+static gboolean gps_layer_set_param ( VikGpsLayer *vgl, VikLayerSetParam *vlsp );
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_change_coord_mode ( VikGpsLayer *vgl, VikCoordMode mode );
static void gps_layer_add_menu_items( VikGpsLayer *vtl, GtkMenu *menu, gpointer vlp );
static void gps_upload_cb( gpointer layer_and_vlp[2] );
(VikLayerFuncCreate) vik_gps_layer_create,
(VikLayerFuncRealize) vik_gps_layer_realize,
- (VikLayerFuncPostRead) NULL,
+ (VikLayerFuncPostRead) vik_gps_layer_post_read,
(VikLayerFuncFree) vik_gps_layer_free,
(VikLayerFuncProperties) NULL,
#undef alm_next
}
-static gboolean gps_layer_set_param ( VikGpsLayer *vgl, guint16 id, VikLayerParamData data, VikViewport *vp, gboolean is_file_operation )
+static gboolean gps_layer_set_param ( VikGpsLayer *vgl, VikLayerSetParam *vlsp )
{
- switch ( id )
+ switch ( vlsp->id )
{
case PARAM_PROTOCOL:
- if (data.s) {
+ if (vlsp->data.s) {
g_free(vgl->protocol);
// Backwards Compatibility: previous versions <v1.4 stored protocol as an array index
- int index = data.s[0] - '0';
- if (data.s[0] != '\0' &&
- g_ascii_isdigit (data.s[0]) &&
- data.s[1] == '\0' &&
+ int index = vlsp->data.s[0] - '0';
+ if (vlsp->data.s[0] != '\0' &&
+ g_ascii_isdigit (vlsp->data.s[0]) &&
+ vlsp->data.s[1] == '\0' &&
index < OLD_NUM_PROTOCOLS)
// It is a single digit: activate compatibility
vgl->protocol = g_strdup(protocols_args[index]);
else
- vgl->protocol = g_strdup(data.s);
+ vgl->protocol = g_strdup(vlsp->data.s);
g_debug("%s: %s", __FUNCTION__, vgl->protocol);
}
else
g_warning(_("Unknown GPS Protocol"));
break;
case PARAM_PORT:
- if (data.s) {
+ if (vlsp->data.s) {
g_free(vgl->serial_port);
// Backwards Compatibility: previous versions <v0.9.91 stored serial_port as an array index
- int index = data.s[0] - '0';
- if (data.s[0] != '\0' &&
- g_ascii_isdigit (data.s[0]) &&
- data.s[1] == '\0' &&
+ int index = vlsp->data.s[0] - '0';
+ if (vlsp->data.s[0] != '\0' &&
+ g_ascii_isdigit (vlsp->data.s[0]) &&
+ vlsp->data.s[1] == '\0' &&
index < OLD_NUM_PORTS)
/* It is a single digit: activate compatibility */
vgl->serial_port = g_strdup(old_params_ports[index]);
else
- vgl->serial_port = g_strdup(data.s);
+ vgl->serial_port = g_strdup(vlsp->data.s);
g_debug("%s: %s", __FUNCTION__, vgl->serial_port);
}
else
g_warning(_("Unknown serial port device"));
break;
case PARAM_DOWNLOAD_TRACKS:
- vgl->download_tracks = data.b;
+ vgl->download_tracks = vlsp->data.b;
break;
case PARAM_UPLOAD_TRACKS:
- vgl->upload_tracks = data.b;
+ vgl->upload_tracks = vlsp->data.b;
break;
case PARAM_DOWNLOAD_ROUTES:
- vgl->download_routes = data.b;
+ vgl->download_routes = vlsp->data.b;
break;
case PARAM_UPLOAD_ROUTES:
- vgl->upload_routes = data.b;
+ vgl->upload_routes = vlsp->data.b;
break;
case PARAM_DOWNLOAD_WAYPOINTS:
- vgl->download_waypoints = data.b;
+ vgl->download_waypoints = vlsp->data.b;
break;
case PARAM_UPLOAD_WAYPOINTS:
- vgl->upload_waypoints = data.b;
+ vgl->upload_waypoints = vlsp->data.b;
break;
#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION)
case PARAM_GPSD_CONNECT:
- vgl->auto_connect_to_gpsd = data.b;
+ vgl->auto_connect_to_gpsd = vlsp->data.b;
break;
case PARAM_GPSD_HOST:
- if (data.s) {
+ if (vlsp->data.s) {
if (vgl->gpsd_host)
g_free(vgl->gpsd_host);
- vgl->gpsd_host = g_strdup(data.s);
+ vgl->gpsd_host = g_strdup(vlsp->data.s);
}
break;
case PARAM_GPSD_PORT:
- if (data.s) {
+ if (vlsp->data.s) {
if (vgl->gpsd_port)
g_free(vgl->gpsd_port);
- vgl->gpsd_port = g_strdup(data.s);
+ vgl->gpsd_port = g_strdup(vlsp->data.s);
}
break;
case PARAM_GPSD_RETRY_INTERVAL:
- vgl->gpsd_retry_interval = strtol(data.s, NULL, 10);
+ vgl->gpsd_retry_interval = strtol(vlsp->data.s, NULL, 10);
break;
case PARAM_REALTIME_REC:
- vgl->realtime_record = data.b;
+ vgl->realtime_record = vlsp->data.b;
break;
case PARAM_REALTIME_CENTER_START:
- vgl->realtime_jump_to_start = data.b;
+ vgl->realtime_jump_to_start = vlsp->data.b;
break;
case PARAM_VEHICLE_POSITION:
- vgl->vehicle_position = data.u;
+ vgl->vehicle_position = vlsp->data.u;
break;
case PARAM_REALTIME_UPDATE_STATUSBAR:
- vgl->realtime_update_statusbar = data.b;
+ vgl->realtime_update_statusbar = vlsp->data.b;
break;
#endif /* VIK_CONFIG_REALTIME_GPS_TRACKING */
default:
return vgl;
}
+static void vik_gps_layer_post_read ( VikGpsLayer *vgl, VikViewport *vvp, gboolean from_file )
+{
+ for (guint i = 0; i < NUM_TRW; i++) {
+ trw_layer_calculate_bounds_waypoints ( vgl->trw_children[i] );
+ trw_layer_calculate_bounds_tracks ( vgl->trw_children[i] );
+ }
+}
+
static void vik_gps_layer_draw ( VikGpsLayer *vgl, VikViewport *vp )
{
gint i;
g_strfreev(tokens);
}
+ if (strstr(line, "[ERROR] GPS")) {
+ gchar **tokens = g_strsplit(line, "\n", 0);
+ sess->info = g_strdup(tokens[0]);
+ sess->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, sess );
+ g_strfreev(tokens);
+ }
+
+ if (strstr(line, "an't in")) {
+ gchar **tokens = g_strsplit(line, "\n", 0);
+ sess->info = g_strdup(tokens[0]);
+ sess->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, sess );
+ g_strfreev(tokens);
+ }
+
+ if (strstr(line, "Can't get waypoint")) {
+ gchar **tokens = g_strsplit(line, "\n", 0);
+ sess->info = g_strdup(tokens[0]);
+ sess->id_info = gdk_threads_add_idle ( (GSourceFunc)show_gps_info, sess );
+ g_strfreev(tokens);
+ }
+}
+
static gboolean show_gps_status_working ( GpsSession *sess )
{
g_mutex_lock(sess->mutex);
return;
vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_REALTIME]);
vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_REALTIME]);
+ vik_trw_layer_delete_all_routes ( vgl-> trw_children[TRW_REALTIME]);
}
#endif
#if defined (VIK_CONFIG_REALTIME_GPS_TRACKING) && defined (GPSD_API_MAJOR_VERSION)
vik_trw_layer_delete_all_waypoints ( vgl-> trw_children[TRW_REALTIME]);
vik_trw_layer_delete_all_tracks ( vgl-> trw_children[TRW_REALTIME]);
+ vik_trw_layer_delete_all_routes ( vgl-> trw_children[TRW_REALTIME]);
#endif
}
static gboolean rt_ask_retry(VikGpsLayer *vgl)
{
- GtkWidget *dialog = gtk_message_dialog_new (VIK_GTK_WINDOW_FROM_LAYER(vgl),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_YES_NO,
- "Failed to connect to gpsd at %s (port %s)\n"
- "Should Viking keep trying (every %d seconds)?",
- vgl->gpsd_host, vgl->gpsd_port,
- vgl->gpsd_retry_interval);
-
- gint res = gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- return (res == GTK_RESPONSE_YES);
+ gchar *msg = g_strdup_printf ( _("Failed to connect to gpsd at %s (port %s)\n"
+ "Should Viking keep trying (every %d seconds)?"),
+ vgl->gpsd_host, vgl->gpsd_port, vgl->gpsd_retry_interval );
+ gboolean ans = a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_LAYER(vgl), msg, NULL );
+ g_free ( msg );
+ return ans;
}
static gboolean rt_gpsd_connect(VikGpsLayer *vgl, gboolean ask_if_failed)
vgl->realtime_retry_timer = 0;
if (rt_gpsd_try_connect((gpointer *)vgl)) {
if (vgl->gpsd_retry_interval <= 0) {
- g_warning("Failed to connect to gpsd but will not retry because retry intervel was set to %d (which is 0 or negative)", vgl->gpsd_retry_interval);
+ g_warning("Failed to connect to gpsd but will not retry because retry interval was set to %d (which is 0 or negative)", vgl->gpsd_retry_interval);
return FALSE;
}
else if (ask_if_failed && !rt_ask_retry(vgl))