diff options
-rw-r--r-- | core/deco.c | 25 | ||||
-rw-r--r-- | core/dive.h | 2 | ||||
-rw-r--r-- | core/planner.c | 5 | ||||
-rw-r--r-- | core/subsurface-qt/SettingsObjectWrapper.cpp | 39 | ||||
-rw-r--r-- | core/subsurface-qt/SettingsObjectWrapper.h | 8 | ||||
-rw-r--r-- | desktop-widgets/diveplanner.cpp | 10 | ||||
-rw-r--r-- | desktop-widgets/plannerSettings.ui | 2 | ||||
-rw-r--r-- | desktop-widgets/preferences/preferences_graph.cpp | 2 | ||||
-rw-r--r-- | desktop-widgets/preferences/preferences_graph.ui | 36 | ||||
-rw-r--r-- | profile-widget/profilewidget2.cpp | 2 | ||||
-rw-r--r-- | qt-models/diveplannermodel.cpp | 10 |
11 files changed, 92 insertions, 49 deletions
diff --git a/core/deco.c b/core/deco.c index 628550d6c..5d4a18c13 100644 --- a/core/deco.c +++ b/core/deco.c @@ -10,6 +10,7 @@ * add_segment() - add <seconds> at the given pressure, breathing gasmix * deco_allowed_depth() - ceiling based on lead tissue, surface pressure, 3m increments or smooth * set_gf() - set Buehlmann gradient factors + * set_vpmb_conservatism() - set VPM-B conservatism value * clear_deco() * cache_deco_state() * restore_deco_state() @@ -63,6 +64,7 @@ struct vpmb_config { double skin_compression_gammaC; //! Skin compression gammaC (N / bar = m2). double regeneration_time; //! Time needed for the bubble to regenerate to the start radius (min). double other_gases_pressure; //! Always present pressure of other gasses in tissues (bar). + short conservatism; //! VPM-B conservatism level (0-4) }; struct vpmb_config vpmb_config = { @@ -73,7 +75,8 @@ struct vpmb_config vpmb_config = { .surface_tension_gamma = 0.18137175, // = 0.0179 N/msw .skin_compression_gammaC = 2.6040525, // = 0.257 N/msw .regeneration_time = 20160.0, - .other_gases_pressure = 0.1359888 + .other_gases_pressure = 0.1359888, + .conservatism = 3 }; const double buehlmann_N2_a[] = { 1.1696, 1.0, 0.8618, 0.7562, @@ -121,7 +124,7 @@ const double buehlmann_He_factor_expositon_one_second[] = { 1.00198406028040E-004, 7.83611475491108E-005, 6.13689891868496E-005, 4.81280465299827E-005 }; -const double conservatism_lvls[] = { 1.0, 1.05, 1.12, 1.22, 1.35 }; +const double vpmb_conservatism_lvls[] = { 1.0, 1.05, 1.12, 1.22, 1.35 }; /* Inspired gas loading equations depend on the partial pressure of inert gas in the alveolar. * P_alv = (P_amb - P_H2O + (1 - Rq) / Rq * P_CO2) * f @@ -174,15 +177,15 @@ double initial_he_gradient[16]; double get_crit_radius_He() { - if (prefs.vpmb_conservatism <= 4) - return vpmb_config.crit_radius_He * conservatism_lvls[prefs.vpmb_conservatism] * subsurface_conservatism_factor; + if (vpmb_config.conservatism <= 4) + return vpmb_config.crit_radius_He * vpmb_conservatism_lvls[vpmb_config.conservatism] * subsurface_conservatism_factor; return vpmb_config.crit_radius_He; } double get_crit_radius_N2() { - if (prefs.vpmb_conservatism <= 4) - return vpmb_config.crit_radius_N2 * conservatism_lvls[prefs.vpmb_conservatism] * subsurface_conservatism_factor; + if (vpmb_config.conservatism <= 4) + return vpmb_config.crit_radius_N2 * vpmb_conservatism_lvls[vpmb_config.conservatism] * subsurface_conservatism_factor; return vpmb_config.crit_radius_N2; } @@ -603,3 +606,13 @@ void set_gf(short gflow, short gfhigh, bool gf_low_at_maxdepth) buehlmann_config.gf_high = (double)gfhigh / 100.0; buehlmann_config.gf_low_at_maxdepth = gf_low_at_maxdepth; } + +void set_vpmb_conservatism(short conservatism) +{ + if (conservatism < 0) + vpmb_config.conservatism = 0; + else if (conservatism > 4) + vpmb_config.conservatism = 4; + else + vpmb_config.conservatism = conservatism; +} diff --git a/core/dive.h b/core/dive.h index 13ad6b509..f1c144481 100644 --- a/core/dive.h +++ b/core/dive.h @@ -831,6 +831,7 @@ extern void add_segment(double pressure, const struct gasmix *gasmix, int period extern void clear_deco(double surface_pressure); extern void dump_tissues(void); extern void set_gf(short gflow, short gfhigh, bool gf_low_at_maxdepth); +extern void set_vpmb_conservatism(short conservatism); extern void cache_deco_state(char **datap); extern void restore_deco_state(char *data); extern void nuclear_regeneration(double time); @@ -856,6 +857,7 @@ struct diveplan { int salinity; short gflow; short gfhigh; + short vpmb_conservatism; struct divedatapoint *dp; }; diff --git a/core/planner.c b/core/planner.c index e127cf11e..93aa94dbd 100644 --- a/core/planner.c +++ b/core/planner.c @@ -565,10 +565,10 @@ static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool snprintf(temp, sz_temp, translate("gettextFromC", "based on Bühlmann ZHL-16C with GFlow = %d and GFhigh = %d"), diveplan->gflow, diveplan->gfhigh); } else if (prefs.deco_mode == VPMB){ - if (prefs.vpmb_conservatism == 0) + if (diveplan->vpmb_conservatism == 0) snprintf(temp, sz_temp, "%s", translate("gettextFromC", "based on VPM-B at nominal conservatism")); else - snprintf(temp, sz_temp, translate("gettextFromC", "based on VPM-B at +%d conservatism"), prefs.vpmb_conservatism); + snprintf(temp, sz_temp, translate("gettextFromC", "based on VPM-B at +%d conservatism"), diveplan->vpmb_conservatism); } else if (prefs.deco_mode == RECREATIONAL){ snprintf(temp, sz_temp, translate("gettextFromC", "recreational mode based on Bühlmann ZHL-16B with GFlow = %d and GFhigh = %d"), diveplan->gflow, diveplan->gfhigh); @@ -984,6 +984,7 @@ bool plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool bool decodive = false; set_gf(diveplan->gflow, diveplan->gfhigh, prefs.gf_low_at_maxdepth); + set_vpmb_conservatism(diveplan->vpmb_conservatism); if (!diveplan->surface_pressure) diveplan->surface_pressure = SURFACE_PRESSURE; displayed_dive.surface_pressure.mbar = diveplan->surface_pressure; diff --git a/core/subsurface-qt/SettingsObjectWrapper.cpp b/core/subsurface-qt/SettingsObjectWrapper.cpp index 62e746a0f..0e993d39a 100644 --- a/core/subsurface-qt/SettingsObjectWrapper.cpp +++ b/core/subsurface-qt/SettingsObjectWrapper.cpp @@ -311,6 +311,11 @@ int TechnicalDetailsSettings::gfhigh() const return prefs.gfhigh; } +short TechnicalDetailsSettings::vpmbConservatism() const +{ + return prefs.vpmb_conservatism; +} + bool TechnicalDetailsSettings::hrgraph() const { return prefs.hrgraph; @@ -522,6 +527,19 @@ void TechnicalDetailsSettings::setGfhigh(int value) emit gfhighChanged(value); } +void TechnicalDetailsSettings::setVpmbConservatism(short value) +{ + if (value == prefs.vpmb_conservatism) + return; + + QSettings s; + s.beginGroup(tecDetails); + s.setValue("vpmb_conservatism", value); + prefs.vpmb_conservatism = value; + set_vpmb_conservatism(value); + emit vpmbConservatismChanged(value); +} + void TechnicalDetailsSettings::setHRgraph(bool value) { if (value == prefs.hrgraph) @@ -1229,11 +1247,6 @@ int DivePlannerSettings::decoSac() const return prefs.decosac; } -short DivePlannerSettings::vpmbConservatism() const -{ - return prefs.vpmb_conservatism; -} - deco_mode DivePlannerSettings::decoMode() const { return prefs.deco_mode; @@ -1484,18 +1497,6 @@ void DivePlannerSettings::setSecoSac(int value) emit decoSacChanged(value); } -void DivePlannerSettings::setVpmbConservatism(int value) -{ - if (value == prefs.vpmb_conservatism) - return; - - QSettings s; - s.beginGroup(group); - s.setValue("conservatism", value); - prefs.vpmb_conservatism = value; - emit vpmbConservatismChanged(value); -} - void DivePlannerSettings::setDecoMode(deco_mode value) { if (value == prefs.deco_mode) @@ -2119,11 +2120,13 @@ void SettingsObjectWrapper::load() GET_BOOL("percentagegraph", percentagegraph); GET_INT("gflow", gflow); GET_INT("gfhigh", gfhigh); + GET_INT("vpmb_conservatism", vpmb_conservatism); GET_BOOL("gf_low_at_maxdepth", gf_low_at_maxdepth); GET_BOOL("show_ccr_setpoint",show_ccr_setpoint); GET_BOOL("show_ccr_sensors",show_ccr_sensors); GET_BOOL("zoomed_plot", zoomed_plot); set_gf(prefs.gflow, prefs.gfhigh, prefs.gf_low_at_maxdepth); + set_vpmb_conservatism(prefs.vpmb_conservatism); GET_BOOL("show_sac", show_sac); GET_BOOL("display_unused_tanks", display_unused_tanks); GET_BOOL("show_average_depth", show_average_depth); @@ -2259,7 +2262,6 @@ void SettingsObjectWrapper::load() prefs.drop_stone_mode = s.value("drop_stone_mode", prefs.drop_stone_mode).toBool(); prefs.bottomsac = s.value("bottomsac", prefs.bottomsac).toInt(); prefs.decosac = s.value("decosac", prefs.decosac).toInt(); - prefs.vpmb_conservatism = s.value("conservatism", prefs.vpmb_conservatism).toInt(); s.endGroup(); s.beginGroup("UpdateManager"); @@ -2296,7 +2298,6 @@ void SettingsObjectWrapper::sync() s.setValue("bottomsac", prefs.bottomsac); s.setValue("decosac", prefs.decosac); s.setValue("deco_mode", int(prefs.deco_mode)); - s.setValue("conservatism", prefs.vpmb_conservatism); s.endGroup(); } diff --git a/core/subsurface-qt/SettingsObjectWrapper.h b/core/subsurface-qt/SettingsObjectWrapper.h index 9e823fdba..d3e51546f 100644 --- a/core/subsurface-qt/SettingsObjectWrapper.h +++ b/core/subsurface-qt/SettingsObjectWrapper.h @@ -116,6 +116,7 @@ class TechnicalDetailsSettings : public QObject { Q_PROPERTY(bool calcndltts READ calcndltts WRITE setCalcndltts NOTIFY calcndlttsChanged) Q_PROPERTY(int gflow READ gflow WRITE setGflow NOTIFY gflowChanged) Q_PROPERTY(int gfhigh READ gfhigh WRITE setGfhigh NOTIFY gfhighChanged) + Q_PROPERTY(short vpmb_conservatism READ vpmbConservatism WRITE setVpmbConservatism NOTIFY vpmbConservatismChanged) Q_PROPERTY(bool hrgraph READ hrgraph WRITE setHRgraph NOTIFY hrgraphChanged) Q_PROPERTY(bool tankbar READ tankBar WRITE setTankBar NOTIFY tankBarChanged) Q_PROPERTY(bool percentagegraph READ percentageGraph WRITE setPercentageGraph NOTIFY percentageGraphChanged) @@ -142,6 +143,7 @@ public: bool calcndltts() const; int gflow() const; int gfhigh() const; + short vpmbConservatism() const; bool hrgraph() const; bool tankBar() const; bool percentageGraph() const; @@ -167,6 +169,7 @@ public slots: void setCalcndltts(bool value); void setGflow(int value); void setGfhigh(int value); + void setVpmbConservatism(short); void setHRgraph(bool value); void setTankBar(bool value); void setPercentageGraph(bool value); @@ -192,6 +195,7 @@ signals: void calcndlttsChanged(bool value); void gflowChanged(int value); void gfhighChanged(int value); + void vpmbConservatismChanged(short value); void hrgraphChanged(bool value); void tankBarChanged(bool value); void percentageGraphChanged(bool value); @@ -391,7 +395,6 @@ class DivePlannerSettings : public QObject { Q_PROPERTY(int min_switch_duration READ minSwitchDuration WRITE setMinSwitchDuration NOTIFY minSwitchDurationChanged) Q_PROPERTY(int bottomsac READ bottomSac WRITE setBottomSac NOTIFY bottomSacChanged) Q_PROPERTY(int decosac READ decoSac WRITE setSecoSac NOTIFY decoSacChanged) - Q_PROPERTY(short vpmb_conservatism READ vpmbConservatism WRITE setVpmbConservatism NOTIFY vpmbConservatismChanged) Q_PROPERTY(deco_mode decoMode READ decoMode WRITE setDecoMode NOTIFY decoModeChanged) public: @@ -417,7 +420,6 @@ public: int minSwitchDuration() const; int bottomSac() const; int decoSac() const; - short vpmbConservatism() const; deco_mode decoMode() const; public slots: @@ -442,7 +444,6 @@ public slots: void setMinSwitchDuration(int value); void setBottomSac(int value); void setSecoSac(int value); - void setVpmbConservatism(int value); void setDecoMode(deco_mode value); signals: @@ -467,7 +468,6 @@ signals: void minSwitchDurationChanged(int value); void bottomSacChanged(int value); void decoSacChanged(int value); - void vpmbConservatismChanged(int value); void decoModeChanged(deco_mode value); private: diff --git a/desktop-widgets/diveplanner.cpp b/desktop-widgets/diveplanner.cpp index ed6515e19..cb357482f 100644 --- a/desktop-widgets/diveplanner.cpp +++ b/desktop-widgets/diveplanner.cpp @@ -237,7 +237,7 @@ void PlannerSettingsWidget::disableDecoElements(int mode) ui.bottompo2->setDisabled(true); ui.decopo2->setDisabled(true); ui.reserve_gas->setDisabled(false); - ui.conservatism_lvl->setDisabled(true); + ui.vpmb_conservatism->setDisabled(true); ui.switch_at_req_stop->setDisabled(true); ui.min_switch_duration->setDisabled(true); } @@ -249,7 +249,7 @@ void PlannerSettingsWidget::disableDecoElements(int mode) ui.bottompo2->setDisabled(false); ui.decopo2->setDisabled(false); ui.reserve_gas->setDisabled(true); - ui.conservatism_lvl->setDisabled(false); + ui.vpmb_conservatism->setDisabled(false); ui.switch_at_req_stop->setDisabled(false); ui.min_switch_duration->setDisabled(false); } @@ -261,7 +261,7 @@ void PlannerSettingsWidget::disableDecoElements(int mode) ui.bottompo2->setDisabled(false); ui.decopo2->setDisabled(false); ui.reserve_gas->setDisabled(true); - ui.conservatism_lvl->setDisabled(true); + ui.vpmb_conservatism->setDisabled(true); ui.switch_at_req_stop->setDisabled(false); ui.min_switch_duration->setDisabled(false); } @@ -296,7 +296,6 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f) ui.recreational_deco->setChecked(prefs.deco_mode == RECREATIONAL); ui.buehlmann_deco->setChecked(prefs.deco_mode == BUEHLMANN); ui.vpmb_deco->setChecked(prefs.deco_mode == VPMB); - ui.conservatism_lvl->setValue(prefs.vpmb_conservatism); disableDecoElements((int) prefs.deco_mode); // should be the same order as in dive_comp_type! @@ -330,7 +329,7 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f) connect(ui.gflow, SIGNAL(valueChanged(int)), plannerModel, SLOT(setGFLow(int))); connect(ui.gfhigh, SIGNAL(editingFinished()), plannerModel, SLOT(triggerGFHigh())); connect(ui.gflow, SIGNAL(editingFinished()), plannerModel, SLOT(triggerGFLow())); - connect(ui.conservatism_lvl, SIGNAL(valueChanged(int)), plannerModel, SLOT(setVpmbConservatism(int))); + connect(ui.vpmb_conservatism, SIGNAL(valueChanged(int)), plannerModel, SLOT(setVpmbConservatism(int))); connect(ui.backgasBreaks, SIGNAL(toggled(bool)), this, SLOT(setBackgasBreaks(bool))); connect(ui.switch_at_req_stop, SIGNAL(toggled(bool)), plannerModel, SLOT(setSwitchAtReqStop(bool))); connect(ui.min_switch_duration, SIGNAL(valueChanged(int)), plannerModel, SLOT(setMinSwitchDuration(int))); @@ -354,6 +353,7 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f) settingsChanged(); ui.gflow->setValue(prefs.gflow); ui.gfhigh->setValue(prefs.gfhigh); + ui.vpmb_conservatism->setValue(prefs.vpmb_conservatism); setMinimumWidth(0); setMinimumHeight(0); diff --git a/desktop-widgets/plannerSettings.ui b/desktop-widgets/plannerSettings.ui index 81783cf80..c6e16e54a 100644 --- a/desktop-widgets/plannerSettings.ui +++ b/desktop-widgets/plannerSettings.ui @@ -500,7 +500,7 @@ </widget> </item> <item row="12" column="2"> - <widget class="QSpinBox" name="conservatism_lvl"> + <widget class="QSpinBox" name="vpmb_conservatism"> <property name="maximum"> <number>4</number> </property> diff --git a/desktop-widgets/preferences/preferences_graph.cpp b/desktop-widgets/preferences/preferences_graph.cpp index 36951ef22..c13915e37 100644 --- a/desktop-widgets/preferences/preferences_graph.cpp +++ b/desktop-widgets/preferences/preferences_graph.cpp @@ -27,6 +27,7 @@ void PreferencesGraph::refreshSettings() ui->gflow->setValue(prefs.gflow); ui->gfhigh->setValue(prefs.gfhigh); + ui->vpmb_conservatism->setValue(prefs.vpmb_conservatism); ui->gf_low_at_maxdepth->setChecked(prefs.gf_low_at_maxdepth); ui->show_ccr_setpoint->setChecked(prefs.show_ccr_setpoint); ui->show_ccr_sensors->setChecked(prefs.show_ccr_sensors); @@ -55,6 +56,7 @@ void PreferencesGraph::syncSettings() tech->setRedceiling(ui->red_ceiling->isChecked()); tech->setGflow(ui->gflow->value()); tech->setGfhigh(ui->gfhigh->value()); + tech->setVpmbConservatism(ui->vpmb_conservatism->value()); tech->setGfLowAtMaxDepth(ui->gf_low_at_maxdepth->isChecked()); tech->setShowCCRSetpoint(ui->show_ccr_setpoint->isChecked()); tech->setShowCCRSensors(ui->show_ccr_sensors->isChecked()); diff --git a/desktop-widgets/preferences/preferences_graph.ui b/desktop-widgets/preferences/preferences_graph.ui index e0d0cda54..b8d6a4656 100644 --- a/desktop-widgets/preferences/preferences_graph.ui +++ b/desktop-widgets/preferences/preferences_graph.ui @@ -168,13 +168,33 @@ </widget> </item> <item row="2" column="0"> + <widget class="QLabel" name="label_21"> + <property name="text"> + <string>VPM-B Conservatism</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QSpinBox" name="vpmb_conservatism"> + <property name="prefix"> + <string>+</string> + </property> + <property name="minimum"> + <number>0</number> + </property> + <property name="maximum"> + <number>4</number> + </property> + </widget> + </item> + <item row="3" column="0"> <widget class="QLabel" name="label_26"> <property name="text"> <string>Default CCR set-point for dive planning</string> </property> </widget> </item> - <item row="2" column="1"> + <item row="3" column="1"> <widget class="QDoubleSpinBox" name="defaultSetpoint"> <property name="suffix"> <string>bar</string> @@ -190,14 +210,14 @@ </property> </widget> </item> - <item row="3" column="0"> + <item row="4" column="0"> <widget class="QLabel" name="pSCR"> <property name="text"> <string>pSCR O₂ metabolism rate</string> </property> </widget> </item> - <item row="3" column="1"> + <item row="4" column="1"> <widget class="QDoubleSpinBox" name="psro2rate"> <property name="suffix"> <string>ℓ/min</string> @@ -207,14 +227,14 @@ </property> </widget> </item> - <item row="4" column="0"> + <item row="5" column="0"> <widget class="QLabel" name="label_28"> <property name="text"> <string>pSCR ratio</string> </property> </widget> </item> - <item row="4" column="1"> + <item row="5" column="1"> <widget class="QSpinBox" name="pscrfactor"> <property name="suffix"> <string/> @@ -224,21 +244,21 @@ </property> </widget> </item> - <item row="5" column="0" colspan="2"> + <item row="6" column="0" colspan="2"> <widget class="QCheckBox" name="gf_low_at_maxdepth"> <property name="text"> <string>GFLow at max depth</string> </property> </widget> </item> - <item row="6" column="0" colspan="2"> + <item row="7" column="0" colspan="2"> <widget class="QCheckBox" name="show_ccr_setpoint"> <property name="text"> <string>CCR: show setpoints when viewing pO₂</string> </property> </widget> </item> - <item row="7" column="0" colspan="2"> + <item row="8" column="0" colspan="2"> <widget class="QCheckBox" name="show_ccr_sensors"> <property name="text"> <string>CCR: show individual O₂ sensor values when viewing pO₂</string> diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp index 8894855d7..e077bb727 100644 --- a/profile-widget/profilewidget2.cpp +++ b/profile-widget/profilewidget2.cpp @@ -571,7 +571,7 @@ void ProfileWidget2::plotDive(struct dive *d, bool force) return; } if (prefs.deco_mode == VPMB) - decoModelParameters->setText(QString("VPM-B +%1").arg(prefs.vpmb_conservatism)); + decoModelParameters->setText(QString("VPM-B +%1").arg(diveplan.vpmb_conservatism)); else decoModelParameters->setText(QString("GF %1/%2").arg(diveplan.gflow).arg(diveplan.gfhigh)); #endif diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp index 10713f36f..10f2d5f52 100644 --- a/qt-models/diveplannermodel.cpp +++ b/qt-models/diveplannermodel.cpp @@ -185,8 +185,10 @@ void DivePlannerPointsModel::setPlanMode(Mode m) mode = m; // the planner may reset our GF settings that are used to show deco // reset them to what's in the preferences - if (m != PLAN) + if (m != PLAN) { set_gf(prefs.gflow, prefs.gfhigh, prefs.gf_low_at_maxdepth); + set_vpmb_conservatism(prefs.vpmb_conservatism); + } } bool DivePlannerPointsModel::isPlanner() @@ -423,8 +425,10 @@ void DivePlannerPointsModel::triggerGFLow() void DivePlannerPointsModel::setVpmbConservatism(int level) { - prefs.vpmb_conservatism = level; - emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, COLUMNS - 1)); + if (diveplan.vpmb_conservatism != level) { + diveplan.vpmb_conservatism = level; + emitDataChanged(); + } } void DivePlannerPointsModel::setSurfacePressure(int pressure) |