From 088db5e12be569ea85fc2ac34c22413a30090cba Mon Sep 17 00:00:00 2001 From: "Robert C. Helling" Date: Fri, 24 Nov 2017 14:17:01 +0100 Subject: Hand planner variables to profile Pass the planner state struct to the profile computation so it can use deco_time and first ceiling to display VPM-B ceiling. Signed-off-by: Robert C. Helling --- core/profile.c | 12 ++++++++---- core/profile.h | 4 ++-- profile-widget/profilewidget2.cpp | 2 +- qt-models/diveplannermodel.cpp | 1 + qt-models/diveplannermodel.h | 1 + qt-models/diveplotdatamodel.cpp | 3 ++- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/core/profile.c b/core/profile.c index 5a88e20c6..8821b4363 100644 --- a/core/profile.c +++ b/core/profile.c @@ -986,14 +986,18 @@ static void calculate_ndl_tts(struct deco_state *ds, struct dive *dive, struct p /* Let's try to do some deco calculations. */ -void calculate_deco_information(struct deco_state *ds, struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool print_mode) +void calculate_deco_information(struct deco_state *ds, struct deco_state *planner_ds, struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool print_mode) { int i, count_iteration = 0; double surface_pressure = (dc->surface_pressure.mbar ? dc->surface_pressure.mbar : get_surface_pressure_in_mbar(dive, true)) / 1000.0; bool first_iteration = true; int prev_deco_time = 10000000, time_deep_ceiling = 0; - if (!in_planner()) + if (!in_planner()) { ds->deco_time = 0; + } else { + ds->deco_time = planner_ds->deco_time; + ds->first_ceiling_pressure = planner_ds->first_ceiling_pressure; + } struct deco_state *cache_data_initial = NULL; lock_planner(); /* For VPM-B outside the planner, cache the initial deco state for CVA iterations */ @@ -1300,7 +1304,7 @@ static void debug_print_profiledata(struct plot_info *pi) * sides, so that you can do end-points without having to worry * about it. */ -void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool fast) +void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool fast, struct deco_state *planner_ds) { int o2, he, o2max; #ifndef SUBSURFACE_MOBILE @@ -1333,7 +1337,7 @@ void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plo fill_o2_values(dive, dc, pi); /* .. and insert the O2 sensor data having 0 values. */ calculate_sac(dive, dc, pi); /* Calculate sac */ #ifndef SUBSURFACE_MOBILE - calculate_deco_information(&plot_deco_state, dive, dc, pi, false); /* and ceiling information, using gradient factor values in Preferences) */ + calculate_deco_information(&plot_deco_state, planner_ds, dive, dc, pi, false); /* and ceiling information, using gradient factor values in Preferences) */ #endif calculate_gas_information_new(dive, dc, pi); /* Calculate gas partial pressures */ diff --git a/core/profile.h b/core/profile.h index bf29362f3..fa92070c6 100644 --- a/core/profile.h +++ b/core/profile.h @@ -74,8 +74,8 @@ struct plot_info calculate_max_limits_new(struct dive *dive, struct divecomputer void compare_samples(struct plot_data *e1, struct plot_data *e2, char *buf, int bufsize, int sum); struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer *dc, struct plot_info *pi); struct plot_info *analyze_plot_info(struct plot_info *pi); -void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool fast); -void calculate_deco_information(struct deco_state *ds, struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool print_mode); +void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool fast, struct deco_state *planner_ds); +void calculate_deco_information(struct deco_state *ds, struct deco_state *planner_de, struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool print_mode); struct plot_data *get_plot_details_new(struct plot_info *pi, int time, struct membuffer *); /* diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp index 855ec8544..04d71b6d2 100644 --- a/profile-widget/profilewidget2.cpp +++ b/profile-widget/profilewidget2.cpp @@ -640,7 +640,7 @@ void ProfileWidget2::plotDive(struct dive *d, bool force) * shown. */ plotInfo = calculate_max_limits_new(&displayed_dive, currentdc); - create_plot_info_new(&displayed_dive, currentdc, &plotInfo, !shouldCalculateMaxDepth); + create_plot_info_new(&displayed_dive, currentdc, &plotInfo, !shouldCalculateMaxDepth, &DivePlannerPointsModel::instance()->final_deco_state); int newMaxtime = get_maxtime(&plotInfo); if (shouldCalculateMaxTime || newMaxtime > maxtime) maxtime = newMaxtime; diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp index 153771c08..96b5b9c0a 100644 --- a/qt-models/diveplannermodel.cpp +++ b/qt-models/diveplannermodel.cpp @@ -924,6 +924,7 @@ void DivePlannerPointsModel::createTemporaryPlan() struct deco_state plan_deco_state; plan(&plan_deco_state, &diveplan, &displayed_dive, DECOTIMESTEP, stoptable, &cache, isPlanner(), false); //QtConcurrent::run(this, &DivePlannerPointsModel::computeVariations, &ds_after_previous_dives); + final_deco_state = plan_deco_state; emit calculatedPlanNotes(); } // throw away the cache diff --git a/qt-models/diveplannermodel.h b/qt-models/diveplannermodel.h index 0b714e608..5e04c9d79 100644 --- a/qt-models/diveplannermodel.h +++ b/qt-models/diveplannermodel.h @@ -56,6 +56,7 @@ public: int lastEnteredPoint(); void removeDeco(); static bool addingDeco; + struct deco_state final_deco_state; public slots: diff --git a/qt-models/diveplotdatamodel.cpp b/qt-models/diveplotdatamodel.cpp index ac6cf7cd8..a893cb46b 100644 --- a/qt-models/diveplotdatamodel.cpp +++ b/qt-models/diveplotdatamodel.cpp @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #include "qt-models/diveplotdatamodel.h" +#include "qt-models/diveplannermodel.h" #include "core/dive.h" #include "core/profile.h" #include "core/divelist.h" @@ -232,7 +233,7 @@ void DivePlotDataModel::calculateDecompression() { struct divecomputer *dc = select_dc(&displayed_dive); init_decompression(&plot_deco_state, &displayed_dive); - calculate_deco_information(&plot_deco_state, &displayed_dive, dc, &pInfo, false); + calculate_deco_information(&plot_deco_state, &(DivePlannerPointsModel::instance()->final_deco_state), &displayed_dive, dc, &pInfo, false); dataChanged(index(0, CEILING), index(pInfo.nr - 1, TISSUE_16)); } #endif -- cgit v1.2.3-70-g09d2