[PATCH 3/3] Planner: add best mix EAD preference

Rick Walsh rickmwalsh at gmail.com
Sat May 21 02:32:09 PDT 2016


Add best mix EAD preference and UI, along with a tooltip describing what it
does

Signed-off-by: Rick Walsh <rickmwalsh at gmail.com>
---
 core/dive.c                                  |  3 +--
 core/pref.h                                  |  1 +
 core/subsurface-qt/SettingsObjectWrapper.cpp | 14 +++++++++++++
 core/subsurface-qt/SettingsObjectWrapper.h   |  4 ++++
 core/subsurfacestartup.c                     |  1 +
 desktop-widgets/diveplanner.cpp              | 11 ++++++++++
 desktop-widgets/diveplanner.h                |  1 +
 desktop-widgets/plannerSettings.ui           | 31 ++++++++++++++++++++++++++--
 8 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/core/dive.c b/core/dive.c
index 6d5ba1d..c4f5dd7 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -3653,9 +3653,8 @@ fraction_t best_o2(depth_t depth, struct dive *dive)
 fraction_t best_He(depth_t depth, struct dive *dive)
 {
 	fraction_t fhe;
-	int ead = 30000; //this should be user-configurable
 	int pnarcotic, ambient;
-	pnarcotic = depth_to_mbar(ead, dive);
+	pnarcotic = depth_to_mbar(prefs.bestmixead, dive);
 	ambient = depth_to_mbar(depth.mm, dive);
 	fhe.permille = (100 - 100 * pnarcotic / ambient) * 10;	//use integer arithmetic to round up to nearest percent
 	if (fhe.permille < 0)
diff --git a/core/pref.h b/core/pref.h
index be684fd..be34379 100644
--- a/core/pref.h
+++ b/core/pref.h
@@ -92,6 +92,7 @@ struct preferences {
 	int descrate;
 	int bottompo2;
 	int decopo2;
+	int bestmixead;
 	int proxy_type;
 	char *proxy_host;
 	int proxy_port;
diff --git a/core/subsurface-qt/SettingsObjectWrapper.cpp b/core/subsurface-qt/SettingsObjectWrapper.cpp
index ed305ef..eeb4c96 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.cpp
+++ b/core/subsurface-qt/SettingsObjectWrapper.cpp
@@ -915,6 +915,11 @@ int DivePlannerSettings::decopo2() const
 	return prefs.decopo2;
 }
 
+int DivePlannerSettings::bestmixead() const
+{
+	return prefs.bestmixead;
+}
+
 int DivePlannerSettings::reserveGas() const
 {
 	return prefs.reserve_gas;
@@ -1089,6 +1094,15 @@ void DivePlannerSettings::setDecopo2(int value)
 	emit decopo2Changed(value);
 }
 
+void DivePlannerSettings::setBestmixead(int value)
+{
+	QSettings s;
+	s.beginGroup(group);
+	s.setValue("bestmixead", value);
+	prefs.bestmixead = value;
+	emit bestmixeadChanged(value);
+}
+
 void DivePlannerSettings::setReserveGas(int value)
 {
 	QSettings s;
diff --git a/core/subsurface-qt/SettingsObjectWrapper.h b/core/subsurface-qt/SettingsObjectWrapper.h
index f115e2d..b4b898a 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.h
+++ b/core/subsurface-qt/SettingsObjectWrapper.h
@@ -327,6 +327,7 @@ class DivePlannerSettings : public QObject {
 	Q_PROPERTY(int descrate             READ descrate             WRITE setDescrate             NOTIFY descrateChanged)
 	Q_PROPERTY(int bottompo2            READ bottompo2            WRITE setBottompo2            NOTIFY bottompo2Changed)
 	Q_PROPERTY(int decopo2              READ decopo2              WRITE setDecopo2              NOTIFY decopo2Changed)
+	Q_PROPERTY(int bestmixead           READ bestmixead           WRITE setBestmixead           NOTIFY bestmixeadChanged)
 	Q_PROPERTY(int reserve_gas          READ reserveGas           WRITE setReserveGas           NOTIFY reserveGasChanged)
 	Q_PROPERTY(int min_switch_duration  READ minSwitchDuration    WRITE setMinSwitchDuration    NOTIFY minSwitchDurationChanged)
 	Q_PROPERTY(int bottomsac            READ bottomSac            WRITE setBottomSac            NOTIFY bottomSacChanged)
@@ -352,6 +353,7 @@ public:
 	int descrate() const;
 	int bottompo2() const;
 	int decopo2() const;
+	int bestmixead() const;
 	int reserveGas() const;
 	int minSwitchDuration() const;
 	int bottomSac() const;
@@ -376,6 +378,7 @@ public slots:
 	void setDescrate(int value);
 	void setBottompo2(int value);
 	void setDecopo2(int value);
+	void setBestmixead(int value);
 	void setReserveGas(int value);
 	void setMinSwitchDuration(int value);
 	void setBottomSac(int value);
@@ -400,6 +403,7 @@ signals:
 	void descrateChanged(int value);
 	void bottompo2Changed(int value);
 	void decopo2Changed(int value);
+	void bestmixeadChanged(int value);
 	void reserveGasChanged(int value);
 	void minSwitchDurationChanged(int value);
 	void bottomSacChanged(int value);
diff --git a/core/subsurfacestartup.c b/core/subsurfacestartup.c
index c2881a1..f58efb1 100644
--- a/core/subsurfacestartup.c
+++ b/core/subsurfacestartup.c
@@ -52,6 +52,7 @@ struct preferences default_prefs = {
 	.descrate = 18000 / 60,
 	.bottompo2 = 1400,
 	.decopo2 = 1600,
+	.bestmixead = 30000,
 	.doo2breaks = false,
 	.drop_stone_mode = false,
 	.switch_at_req_stop = false,
diff --git a/desktop-widgets/diveplanner.cpp b/desktop-widgets/diveplanner.cpp
index 3a2436c..ac322d2 100644
--- a/desktop-widgets/diveplanner.cpp
+++ b/desktop-widgets/diveplanner.cpp
@@ -288,6 +288,7 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f)
 	prefs.descrate = s.value("descrate", prefs.descrate).toInt();
 	prefs.bottompo2 = s.value("bottompo2", prefs.bottompo2).toInt();
 	prefs.decopo2 = s.value("decopo2", prefs.decopo2).toInt();
+	prefs.bestmixead = s.value("bestmixead", prefs.bestmixead).toInt();
 	prefs.doo2breaks = s.value("doo2breaks", prefs.doo2breaks).toBool();
 	prefs.switch_at_req_stop = s.value("switch_at_req_stop", prefs.switch_at_req_stop).toBool();
 	prefs.min_switch_duration = s.value("min_switch_duration", prefs.min_switch_duration).toInt();
@@ -351,6 +352,7 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f)
 	connect(ui.descRate, SIGNAL(valueChanged(int)), plannerModel, SLOT(emitDataChanged()));
 	connect(ui.bottompo2, SIGNAL(valueChanged(double)), this, SLOT(setBottomPo2(double)));
 	connect(ui.decopo2, SIGNAL(valueChanged(double)), this, SLOT(setDecoPo2(double)));
+	connect(ui.bestmixEAD, SIGNAL(valueChanged(int)), this, SLOT(setBestmixEAD(int)));
 	connect(ui.drop_stone_mode, SIGNAL(toggled(bool)), plannerModel, SLOT(setDropStoneMode(bool)));
 	connect(ui.bottomSAC, SIGNAL(valueChanged(double)), this, SLOT(bottomSacChanged(double)));
 	connect(ui.decoStopSAC, SIGNAL(valueChanged(double)), this, SLOT(decoSacChanged(double)));
@@ -380,6 +382,7 @@ void PlannerSettingsWidget::updateUnitsUI()
 	ui.ascRateStops->setValue(rint(prefs.ascratestops / UNIT_FACTOR));
 	ui.ascRateLast6m->setValue(rint(prefs.ascratelast6m / UNIT_FACTOR));
 	ui.descRate->setValue(rint(prefs.descrate / UNIT_FACTOR));
+	ui.bestmixEAD->setValue(rint(get_depth_units(prefs.bestmixead, NULL, NULL)));
 }
 
 PlannerSettingsWidget::~PlannerSettingsWidget()
@@ -400,6 +403,7 @@ PlannerSettingsWidget::~PlannerSettingsWidget()
 	s.setValue("descrate", prefs.descrate);
 	s.setValue("bottompo2", prefs.bottompo2);
 	s.setValue("decopo2", prefs.decopo2);
+	s.setValue("bestmixead", prefs.bestmixead);
 	s.setValue("doo2breaks", prefs.doo2breaks);
 	s.setValue("drop_stone_mode", prefs.drop_stone_mode);
 	s.setValue("switch_at_req_stop", prefs.switch_at_req_stop);
@@ -422,11 +426,13 @@ void PlannerSettingsWidget::settingsChanged()
 		ui.lastStop->setText(tr("Last stop at 20ft"));
 		ui.asc50to6->setText(tr("50% avg. depth to 20ft"));
 		ui.asc6toSurf->setText(tr("20ft to surface"));
+		ui.bestmixEAD->setSuffix(tr("ft"));
 	} else {
 		vs.append(tr("m/min"));
 		ui.lastStop->setText(tr("Last stop at 6m"));
 		ui.asc50to6->setText(tr("50% avg. depth to 6m"));
 		ui.asc6toSurf->setText(tr("6m to surface"));
+		ui.bestmixEAD->setSuffix(tr("m"));
 	}
 	if(get_units()->volume == units::CUFT) {
 		ui.bottomSAC->setSuffix(tr("cuft/min"));
@@ -508,6 +514,11 @@ void PlannerSettingsWidget::setDecoPo2(double po2)
 	prefs.decopo2 = (int) (po2 * 1000.0);
 }
 
+void PlannerSettingsWidget::setBestmixEAD(int depth)
+{
+	prefs.bestmixead = units_to_depth(depth);
+}
+
 void PlannerSettingsWidget::setBackgasBreaks(bool dobreaks)
 {
 	prefs.doo2breaks = dobreaks;
diff --git a/desktop-widgets/diveplanner.h b/desktop-widgets/diveplanner.h
index 03014cb..69f9938 100644
--- a/desktop-widgets/diveplanner.h
+++ b/desktop-widgets/diveplanner.h
@@ -78,6 +78,7 @@ slots:
 	void setDescRate(int rate);
 	void setBottomPo2(double po2);
 	void setDecoPo2(double po2);
+	void setBestmixEAD(int depth);
 	void setBackgasBreaks(bool dobreaks);
 	void disableDecoElements(int mode);
 
diff --git a/desktop-widgets/plannerSettings.ui b/desktop-widgets/plannerSettings.ui
index 4db69f8..2ec8d4a 100644
--- a/desktop-widgets/plannerSettings.ui
+++ b/desktop-widgets/plannerSettings.ui
@@ -530,7 +530,7 @@
           <property name="spacing">
            <number>2</number>
           </property>
-          <item row="4" column="0">
+          <item row="5" column="0">
            <spacer name="verticalSpacer_3">
             <property name="orientation">
              <enum>Qt::Vertical</enum>
@@ -588,6 +588,25 @@
             </property>
            </widget>
           </item>
+          <item row="4" column="1">
+           <widget class="QSpinBox" name="bestmixEAD">
+            <property name="suffix">
+             <string>m</string>
+            </property>
+            <property name="minimum">
+             <number>1</number>
+            </property>
+            <property name="maximum">
+             <number>999</number>
+            </property>
+            <property name="value">
+             <number>30</number>
+            </property>
+            <property name="toolTip">
+             <string>Used to calculate best mix. Select best mix depth in 'Available gases' table by entering gas depth, followed by "B" (best trimix mix) or "BN" (best nitrox mix)</string>
+            </property>
+           </widget>
+          </item>
           <item row="0" column="0">
            <widget class="QLabel" name="bottomsac">
             <property name="text">
@@ -602,7 +621,14 @@
             </property>
            </widget>
           </item>
-          <item row="5" column="0" colspan="2">
+          <item row="4" column="0">
+           <widget class="QLabel" name="bestEAD">
+            <property name="text">
+             <string>Best mix EAD</string>
+            </property>
+           </widget>
+          </item>
+          <item row="6" column="0" colspan="2">
            <widget class="QGroupBox" name="Notes">
             <property name="title">
              <string>Notes</string>
@@ -739,6 +765,7 @@
   <tabstop>decoStopSAC</tabstop>
   <tabstop>bottompo2</tabstop>
   <tabstop>decopo2</tabstop>
+  <tabstop>bestmixEAD</tabstop>
   <tabstop>display_runtime</tabstop>
   <tabstop>display_duration</tabstop>
   <tabstop>display_transitions</tabstop>
-- 
2.5.5



More information about the subsurface mailing list