---
 src/globals.h           |    1 +
 src/gpx.c               |   59 ++++++++++++++++++++++++++++++++++++++++++++++-
 src/viktrack.h          |    3 ++
 src/viktrwlayer_tpwin.c |   32 ++++++++++++++++++++++++-
 4 files changed, 92 insertions(+), 3 deletions(-)

diff --git a/src/globals.h b/src/globals.h
index b941dbf..60fb690 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -33,6 +33,7 @@
 #define MPP_TO_ALTI 0.7134044
 
 #define VIK_DEFAULT_ALTITUDE 0.0
+#define VIK_DEFAULT_DOP 0.0
 
 #define VIK_GTK_WINDOW_FROM_WIDGET(x) 
GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(x)))
 #define VIK_GTK_WINDOW_FROM_LAYER(x) 
VIK_GTK_WINDOW_FROM_WIDGET(VIK_LAYER(x)->vt)
diff --git a/src/gpx.c b/src/gpx.c
index 2c0f117..6c611a8 100644
--- a/src/gpx.c
+++ b/src/gpx.c
@@ -66,6 +66,10 @@ typedef enum {
         tt_trk_trkseg_trkpt_fix,
         tt_trk_trkseg_trkpt_sat,
 
+        tt_trk_trkseg_trkpt_hdop,
+        tt_trk_trkseg_trkpt_vdop,
+        tt_trk_trkseg_trkpt_pdop,
+
         tt_waypoint,
         tt_waypoint_coord,
         tt_waypoint_name,
@@ -117,6 +121,9 @@ tag_mapping tag_path_map[] = {
         { tt_trk_trkseg_trkpt_fix, "/gpx/trk/trkseg/trkpt/fix" },
         { tt_trk_trkseg_trkpt_sat, "/gpx/trk/trkseg/trkpt/sat" },
 
+        { tt_trk_trkseg_trkpt_hdop, "/gpx/trk/trkseg/trkpt/hdop" },
+        { tt_trk_trkseg_trkpt_vdop, "/gpx/trk/trkseg/trkpt/vdop" },
+        { tt_trk_trkseg_trkpt_pdop, "/gpx/trk/trkseg/trkpt/pdop" },
         {0}
 };
 
@@ -208,6 +215,9 @@ static void gpx_start(VikTrwLayer *vtl, const char *el, 
const char **attr)
        if ( set_c_ll( attr ) ) {
          c_tp = vik_trackpoint_new ();
          c_tp->altitude = VIK_DEFAULT_ALTITUDE;
+         c_tp->hdop = VIK_DEFAULT_DOP;
+         c_tp->vdop = VIK_DEFAULT_DOP;
+         c_tp->pdop = VIK_DEFAULT_DOP;
          vik_coord_load_from_latlon ( &(c_tp->coord), 
vik_trw_layer_get_coord_mode ( vtl ), &c_ll );
          if ( f_tr_newseg ) {
            c_tp->newsegment = TRUE;
@@ -364,6 +374,24 @@ static void gpx_end(VikTrwLayer *vtl, const char *el)
        g_string_erase ( c_cdata, 0, -1 );
        break;
 
+     case tt_trk_trkseg_trkpt_hdop:
+       c_tp->extended = TRUE;
+       c_tp->hdop = g_strtod ( c_cdata->str, NULL );
+       g_string_erase ( c_cdata, 0, -1 );
+       break;
+
+     case tt_trk_trkseg_trkpt_vdop:
+       c_tp->extended = TRUE;
+       c_tp->vdop = g_strtod ( c_cdata->str, NULL );
+       g_string_erase ( c_cdata, 0, -1 );
+       break;
+
+     case tt_trk_trkseg_trkpt_pdop:
+       c_tp->extended = TRUE;
+       c_tp->pdop = g_strtod ( c_cdata->str, NULL );
+       g_string_erase ( c_cdata, 0, -1 );
+       break;
+
      default: break;
   }
 
@@ -386,6 +414,9 @@ static void gpx_cdata(void *dta, const XML_Char *s, int len)
     case tt_trk_trkseg_trkpt_speed:
     case tt_trk_trkseg_trkpt_fix:
     case tt_trk_trkseg_trkpt_sat:
+    case tt_trk_trkseg_trkpt_hdop:
+    case tt_trk_trkseg_trkpt_vdop:
+    case tt_trk_trkseg_trkpt_pdop:
     case tt_waypoint_name: /* .loc name is really description. */
       g_string_append_len ( c_cdata, s, len );
       break;
@@ -645,7 +676,7 @@ static void gpx_write_trackpoint ( VikTrackpoint *tp, 
GpxWritingContext *context
 {
   FILE *f = context->file;
   static struct LatLon ll;
-  gchar *s_lat,*s_lon, *s_alt;
+  gchar *s_lat,*s_lon, *s_alt, *s_dop;
   gchar *time_iso8601;
   vik_coord_to_latlon ( &(tp->coord), &ll );
 
@@ -710,6 +741,32 @@ static void gpx_write_trackpoint ( VikTrackpoint *tp, 
GpxWritingContext *context
       fprintf ( f, "    <sat>%d</sat>\n", tp->nsats );
   }
 
+  s_dop = NULL;
+  if ( tp->hdop != VIK_DEFAULT_DOP )
+  {
+    s_dop = a_coords_dtostr ( tp->hdop );
+  }
+  if (s_dop != NULL)
+    fprintf ( f, "    <hdop>%s</hdop>\n", s_dop );
+  g_free ( s_dop ); s_dop = NULL;
+
+  if ( tp->vdop != VIK_DEFAULT_DOP )
+  {
+    s_dop = a_coords_dtostr ( tp->vdop );
+  }
+  if (s_dop != NULL)
+    fprintf ( f, "    <vdop>%s</vdop>\n", s_dop );
+  g_free ( s_dop ); s_dop = NULL;
+
+  if ( tp->pdop != VIK_DEFAULT_DOP )
+  {
+    s_dop = a_coords_dtostr ( tp->pdop );
+  }
+  if (s_dop != NULL)
+    fprintf ( f, "    <pdop>%s</pdop>\n", s_dop );
+  g_free ( s_dop ); s_dop = NULL;
+
+
   fprintf ( f, "  </trkpt>\n" );
 }
 
diff --git a/src/viktrack.h b/src/viktrack.h
index 06a1c91..7a8b465 100644
--- a/src/viktrack.h
+++ b/src/viktrack.h
@@ -50,6 +50,9 @@ struct _VikTrackpoint {
 #define VIK_GPS_MODE_2D        2       /* good for latitude/longitude */
 #define VIK_GPS_MODE_3D        3       /* good for altitude/climb too */
   gint fix_mode;
+  gdouble hdop;
+  gdouble vdop;
+  gdouble pdop;
 };
 
 typedef struct _VikTrack VikTrack;
diff --git a/src/viktrwlayer_tpwin.c b/src/viktrwlayer_tpwin.c
index 406d392..530d1e3 100644
--- a/src/viktrwlayer_tpwin.c
+++ b/src/viktrwlayer_tpwin.c
@@ -39,7 +39,7 @@
 struct _VikTrwLayerTpwin {
   GtkDialog parent;
   GtkSpinButton *lat, *lon, *alt;
-  GtkLabel *track_name, *ts, *localtime, *diff_dist, *diff_time, *diff_speed;
+  GtkLabel *track_name, *ts, *localtime, *diff_dist, *diff_time, *diff_speed, 
*hdop, *vdop, *pdop, *sat;
   GList *buttons;
   VikTrackpoint *cur_tp;
   gboolean cur_tp_is_endpoint; /* for join */
@@ -106,7 +106,12 @@ VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow 
*parent )
                                       N_("<b>Time:</b>") };
   static gchar *right_label_texts[] = { N_("<b>Distance Difference:</b>"),
                                         N_("<b>Time Difference:</b>"),
-                                       N_("<b>\"Speed\" Between:</b>") };
+                                       N_("<b>\"Speed\" Between:</b>"),
+                                       N_("<b>VDOP:</b>"),
+                                       N_("<b>HDOP:</b>"),
+                                       N_("<b>PDOP:</b>"),
+                                       N_("<b>SAT/FIX:</b>")
+                                       };
 
   VikTrwLayerTpwin *tpwin = VIK_TRW_LAYER_TPWIN ( g_object_new ( 
VIK_TRW_LAYER_TPWIN_TYPE, NULL ) );
   GtkWidget *main_hbox, *left_vbox, *right_vbox;
@@ -161,11 +166,21 @@ VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow 
*parent )
   tpwin->diff_time = GTK_LABEL(gtk_label_new(NULL));
   tpwin->diff_speed = GTK_LABEL(gtk_label_new(NULL));
 
+  tpwin->vdop = GTK_LABEL(gtk_label_new(NULL));
+  tpwin->hdop = GTK_LABEL(gtk_label_new(NULL));
+  tpwin->pdop = GTK_LABEL(gtk_label_new(NULL));
+  tpwin->sat = GTK_LABEL(gtk_label_new(NULL));
+
   diff_right_vbox = gtk_vbox_new ( TRUE, 3 );
   gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_dist), 
FALSE, TRUE, 5 );
   gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_time), 
FALSE, TRUE, 5 );
   gtk_box_pack_start ( GTK_BOX(diff_right_vbox), 
GTK_WIDGET(tpwin->diff_speed), FALSE, TRUE, 5 );
 
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->vdop), 
FALSE, TRUE, 5 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->hdop), 
FALSE, TRUE, 5 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->pdop), 
FALSE, TRUE, 5 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->sat), 
FALSE, TRUE, 5 );
+
   main_hbox = gtk_hbox_new( TRUE, 0 );
   gtk_box_pack_start ( GTK_BOX(main_hbox), left_vbox, TRUE, TRUE, 0 );
   gtk_box_pack_start ( GTK_BOX(main_hbox), right_vbox, TRUE, TRUE, 0 );
@@ -197,6 +212,10 @@ void vik_trw_layer_tpwin_set_empty ( VikTrwLayerTpwin 
*tpwin )
   gtk_label_set_text ( tpwin->diff_dist, NULL );
   gtk_label_set_text ( tpwin->diff_time, NULL );
   gtk_label_set_text ( tpwin->diff_speed, NULL );
+  gtk_label_set_text ( tpwin->vdop, NULL );
+  gtk_label_set_text ( tpwin->hdop, NULL );
+  gtk_label_set_text ( tpwin->pdop, NULL );
+  gtk_label_set_text ( tpwin->sat, NULL );
   tpwin->cur_tp = NULL;
 }
 
@@ -272,6 +291,15 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, 
GList *tpl, gchar *tr
       gtk_label_set_text ( tpwin->diff_time, NULL );
       gtk_label_set_text ( tpwin->diff_speed, NULL );
     }
+        g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->vdop );
+        gtk_label_set_text ( tpwin->vdop, tmp_str );
+        g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->hdop );
+        gtk_label_set_text ( tpwin->hdop, tmp_str );
+        g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->pdop );
+        gtk_label_set_text ( tpwin->pdop, tmp_str );
+        g_snprintf ( tmp_str, sizeof(tmp_str), "%d / %d", tp->nsats, 
tp->fix_mode );
+        gtk_label_set_text ( tpwin->sat, tmp_str );
+
   }
 
 
-- 
1.6.0.4


------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://www.creativitycat.com 
_______________________________________________
Viking-devel mailing list
Viking-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/viking-devel
Viking home page: http://viking.sf.net/

Reply via email to