]> git.street.me.uk Git - andy/viking.git/blobdiff - src/vikgpslayer.c
When manually creating a track, automatically give it a default name.
[andy/viking.git] / src / vikgpslayer.c
index 60cb91dac7048923b2980da7ab3b18e492f34f14..d3e877ba50923fdd9c047a6233d043d10d7e9ee8 100644 (file)
 #include "icons/icons.h"
 #include "babel.h"
 
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 #ifdef HAVE_STRING_H
 #include <string.h>
 #endif
-#include <glib.h>
+#include <glib/gstdio.h>
 #include <glib/gprintf.h>
 #include <glib/gi18n.h>
 #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;