--- 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/