From 0737811621d4cbb82a0c891d56b3224e839826ac Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Wed, 26 Mar 2014 21:01:30 +0000 Subject: [PATCH] Create and use a function to return the duration of a track. --- src/viktrack.c | 25 +++++++++++++++++++++++++ src/viktrack.h | 1 + src/viktrwlayer.c | 9 +++------ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/viktrack.c b/src/viktrack.c index 8cbe5315..be8d4786 100644 --- a/src/viktrack.c +++ b/src/viktrack.c @@ -555,6 +555,31 @@ void vik_track_reverse ( VikTrack *tr ) } } +/** + * vik_track_get_duration: + * @trk: The track + * + * Returns: The time in seconds that covers the whole track including gaps + * NB this may be negative particularly if the track has been reversed + */ +time_t vik_track_get_duration(const VikTrack *trk) +{ + time_t duration = 0; + if ( trk->trackpoints ) { + // Ensure times are available + if ( vik_track_get_tp_first(trk)->has_timestamp ) { + // Get trkpt only once - as using vik_track_get_tp_last() iterates whole track each time + VikTrackpoint *trkpt_last = vik_track_get_tp_last(trk); + if ( trkpt_last->has_timestamp ) { + time_t t1 = vik_track_get_tp_first(trk)->timestamp; + time_t t2 = trkpt_last->timestamp; + duration = t2 - t1; + } + } + } + return duration; +} + gdouble vik_track_get_average_speed(const VikTrack *tr) { gdouble len = 0.0; diff --git a/src/viktrack.h b/src/viktrack.h index f900d1a0..ef9d1101 100644 --- a/src/viktrack.h +++ b/src/viktrack.h @@ -113,6 +113,7 @@ guint vik_track_get_segment_count(const VikTrack *tr); VikTrack **vik_track_split_into_segments(VikTrack *tr, guint *ret_len); guint vik_track_merge_segments(VikTrack *tr); void vik_track_reverse(VikTrack *tr); +time_t vik_track_get_duration(const VikTrack *trk); gulong vik_track_get_dup_point_count ( const VikTrack *vt ); gulong vik_track_remove_dup_points ( VikTrack *vt ); diff --git a/src/viktrwlayer.c b/src/viktrwlayer.c index 1c952cd5..e77464ab 100644 --- a/src/viktrwlayer.c +++ b/src/viktrwlayer.c @@ -2916,12 +2916,9 @@ static const gchar* trw_layer_sublayer_tooltip ( VikTrwLayer *l, gint subtype, g if ( tr->trackpoints && vik_track_get_tp_first(tr)->has_timestamp ) { // %x The preferred date representation for the current locale without the time. strftime (time_buf1, sizeof(time_buf1), "%x: ", gmtime(&(vik_track_get_tp_first(tr)->timestamp))); - VikTrackpoint *trkpt = vik_track_get_tp_last(tr); - if ( trkpt->has_timestamp ) { - gint dur = ( trkpt->timestamp - (vik_track_get_tp_first(tr)->timestamp) ); - if ( dur > 0 ) - g_snprintf ( time_buf2, sizeof(time_buf2), _("- %d:%02d hrs:mins"), (int)round(dur/3600), (int)round((dur/60)%60) ); - } + time_t dur = vik_track_get_duration ( tr ); + if ( dur > 0 ) + g_snprintf ( time_buf2, sizeof(time_buf2), _("- %d:%02d hrs:mins"), (int)round(dur/3600), (int)round((dur/60)%60) ); } // Get length and consider the appropriate distance units gdouble tr_len = vik_track_get_length(tr); -- 2.39.5