X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/1f78e182e7eaf305c3a10d2e145dbcc994d5e862..b1e57d16d8c5f6745ea1c70962a24e0b1de7d360:/src/vikgpslayer.c diff --git a/src/vikgpslayer.c b/src/vikgpslayer.c index 60cb91da..d3e877ba 100644 --- a/src/vikgpslayer.c +++ b/src/vikgpslayer.c @@ -31,10 +31,13 @@ #include "icons/icons.h" #include "babel.h" +#ifdef HAVE_UNISTD_H +#include +#endif #ifdef HAVE_STRING_H #include #endif -#include +#include #include #include #ifdef VIK_CONFIG_REALTIME_GPS_TRACKING @@ -52,7 +55,7 @@ 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, gpointer data ); -VikGpsLayer *vik_gps_layer_new (); +static VikGpsLayer *vik_gps_layer_new ( VikViewport *vp ); static void gps_layer_marshall( VikGpsLayer *val, guint8 **data, gint *len ); static VikGpsLayer *gps_layer_unmarshall( guint8 *data, gint len, VikViewport *vvp ); @@ -82,7 +85,8 @@ static gchar * params_ports[] = {"com1", "usb:", NULL}; #else static gchar * params_ports[] = {"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyUSB0", "/dev/ttyUSB1", "usb:", NULL}; #endif -#define NUM_PORTS (sizeof(params_ports)/sizeof(params_ports[0]) - 1) +/* NUM_PORTS not actually used */ +/* #define NUM_PORTS (sizeof(params_ports)/sizeof(params_ports[0]) - 1) */ /* Compatibility with previous versions */ #ifdef WINDOWS static gchar * old_params_ports[] = {"com1", "usb:", NULL}; @@ -168,7 +172,7 @@ VikLayerInterface vik_gps_layer_interface = { params_groups, sizeof(params_groups)/sizeof(params_groups[0]), - VIK_MENU_ITEM_ALL & ~(VIK_MENU_ITEM_CUT|VIK_MENU_ITEM_COPY), + VIK_MENU_ITEM_ALL, (VikLayerFuncCreate) vik_gps_layer_create, (VikLayerFuncRealize) vik_gps_layer_realize, @@ -344,7 +348,7 @@ static VikGpsLayer *gps_layer_unmarshall( guint8 *data, gint len, VikViewport *v len -= sizeof(gint) + alm_size; \ data += sizeof(gint) + alm_size; - VikGpsLayer *rv = vik_gps_layer_new(); + VikGpsLayer *rv = vik_gps_layer_new(vvp); VikLayer *child_layer; gint i; @@ -502,6 +506,21 @@ VikGpsLayer *vik_gps_layer_new (VikViewport *vp) vgl->protocol_id = 0; vgl->serial_port = NULL; +#ifndef WINDOWS + /* Attempt to auto set default USB serial port entry */ + /* Ordered to make lowest device favourite if available */ + if (g_access ("/dev/ttyUSB1", R_OK) == 0) { + if (vgl->serial_port != NULL) + g_free (vgl->serial_port); + vgl->serial_port = g_strdup ("/dev/ttyUSB1"); + } + if (g_access ("/dev/ttyUSB0", R_OK) == 0) { + if (vgl->serial_port != NULL) + g_free (vgl->serial_port); + vgl->serial_port = g_strdup ("/dev/ttyUSB0"); + } +#endif + return vgl; } @@ -601,7 +620,15 @@ static void gps_layer_add_menu_items( VikGpsLayer *vgl, GtkMenu *menu, gpointer static void disconnect_layer_signal ( VikLayer *vl, VikGpsLayer *vgl ) { - g_assert(DISCONNECT_UPDATE_SIGNAL(vl,vgl)==1); + guint number_handlers = DISCONNECT_UPDATE_SIGNAL(vl,vgl); + if ( number_handlers != 1 ) { + /* + NB It's not fatal if this gives 2 for example! Hence removal of the g_assert + This happens when copied GPS layer is deleted (not sure why the number_handlers would be 2) + I don't think there's any side effects and certainly better than the program just aborting + */ + g_warning(_("Unexpected number of disconnected handlers: %d"), number_handlers); + } } static void vik_gps_layer_free ( VikGpsLayer *vgl ) @@ -851,6 +878,18 @@ static void gps_download_progress_func(BabelProgressCode c, gpointer data, GpsSe } g_strfreev(tokens); } + /* eg: "Unit:\teTrex Legend HCx Software Version 2.90\n" */ + if (strstr(line, "Unit:")) { + gchar **tokens = g_strsplit(line, "\t", 0); + int n_tokens = 0; + while (tokens[n_tokens]) + n_tokens++; + + if (n_tokens > 1) { + set_gps_info(tokens[1], sess); + } + g_strfreev(tokens); + } if (strstr(line, "RECORD")) { int lsb, msb, cnt;