summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/deco.c25
-rw-r--r--core/dive.h2
-rw-r--r--core/planner.c5
-rw-r--r--core/subsurface-qt/SettingsObjectWrapper.cpp39
-rw-r--r--core/subsurface-qt/SettingsObjectWrapper.h8
5 files changed, 48 insertions, 31 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: