From d6b50e30e405433bdb1edad341ee90c65ae65419 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Wed, 29 Aug 2012 19:10:26 +0300 Subject: [PATCH] Fix profile and average depth for freedives Freedives can easily exceed the assumed ascent/descent rate, which results in wacky dive profiles. Add a check to make the ascent and descent fit within the duration of the dive. --- dive.c | 9 +++++---- profile.c | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dive.c b/dive.c index aee09d5..54784cd 100644 --- a/dive.c +++ b/dive.c @@ -478,11 +478,12 @@ struct dive *fixup_dive(struct dive *dive) int asc_desc_time = depth*60/9000; int duration = dive->duration.seconds; - /* Protect against insane dives - make mean be half of max */ - if (duration <= asc_desc_time) { + /* Some sanity checks against insane dives */ + if (duration < 2) duration = 2; - asc_desc_time = 1; - } + if (asc_desc_time * 2 >= duration) + asc_desc_time = duration/2; + dive->meandepth.mm = depth*(duration-asc_desc_time)/duration; return dive; } diff --git a/profile.c b/profile.c index d4e88c0..0039867 100644 --- a/profile.c +++ b/profile.c @@ -1387,6 +1387,8 @@ void plot(struct graphics_context *gc, cairo_rectangle_int_t *drawing_area, stru int duration = dive->duration.seconds; int maxdepth = dive->maxdepth.mm; int asc_desc_time = dive->maxdepth.mm*60/9000; + if (asc_desc_time * 2 >= duration) + asc_desc_time = duration / 2; sample = fake; fake[1].time.seconds = asc_desc_time; fake[1].depth.mm = maxdepth; -- 2.45.2