From ac1ec486ae0cd0295166bb1dc0d5b82dc237a5b1 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sat, 5 May 2018 16:34:50 +0200 Subject: Planner: Unify final ascent rates in plan() and fake_dc() When generating fake profiles for manually entered dives, fake_dc() and plan() used different final ascent rates of 5 m/min and 4.5 m/min, respectively. This led to dives that were 6 seconds longer than entered by the user and to confusion. See #554. Therefore, use the same ascent rate taken from the preferences field flag.ascratelast6m in both cases. Signed-off-by: Berthold Stoeger --- core/device.c | 4 ++-- core/planner.c | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/device.c b/core/device.c index 57f7576e1..a22815633 100644 --- a/core/device.c +++ b/core/device.c @@ -146,7 +146,7 @@ void fake_dc(struct divecomputer *dc) if (avg_d == 0) { /* we try for a sane slope, but bow to the insanity of * the user supplied data */ - fill_samples_no_avg(fake, max_d, max_t, MAX(2.0 * max_d / max_t, 5000.0 / 60)); + fill_samples_no_avg(fake, max_d, max_t, MAX(2.0 * max_d / max_t, (double)prefs.ascratelast6m)); if (fake[3].time.seconds == 0) { // just a 4 point profile dc->samples = 4; fake[3].time.seconds = max_t; @@ -165,7 +165,7 @@ void fake_dc(struct divecomputer *dc) * Ok, first we try a basic profile with a specific ascent * rate (5 meters per minute) and d_frac (1/3). */ - if (fill_samples(fake, max_d, avg_d, max_t, 5000.0 / 60, 0.33)) + if (fill_samples(fake, max_d, avg_d, max_t, (double)prefs.ascratelast6m, 0.33)) return; /* diff --git a/core/planner.c b/core/planner.c index b4b842fcf..93f0c233b 100644 --- a/core/planner.c +++ b/core/planner.c @@ -732,7 +732,10 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i /* if all we wanted was the dive just get us back to the surface */ if (!is_planner) { - transitiontime = depth / 75; /* this still needs to be made configurable */ + /* Attn: for manually entered dives, we depend on the last segment having the + * same ascent rate as in fake_dc(). If you change it here, also change it there. + */ + transitiontime = lrint(depth / (double)prefs.ascratelast6m); plan_add_segment(diveplan, transitiontime, 0, current_cylinder, po2, false); create_dive_from_plan(diveplan, dive, is_planner); return false; -- cgit v1.2.3-70-g09d2