diff --git a/CHANGELOG.md b/CHANGELOG.md
index 39edd54df..52f2e1931 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,4 @@
+- Planner: Add UI element for bailout planning for rebreather dives
- Allow to filter for logged/planned dives
- Core, Windows: fix a bug related to non-ASCII characters in user names
- Shearwater import: add suppport for importing Shearwater Cloud logs
diff --git a/core/planner.c b/core/planner.c
index 1077fb313..3f5de00de 100644
--- a/core/planner.c
+++ b/core/planner.c
@@ -742,6 +742,10 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
printf("depth %5.2lfm \n", depth / 1000.0);
printf("current_cylinder %i\n", current_cylinder);
#endif
+ if ((divemode == CCR || divemode == PSCR) && prefs.dobailout) {
+ divemode = OC;
+ po2 = 0;
+ }
best_first_ascend_cylinder = current_cylinder;
/* Find the gases available for deco */
diff --git a/core/pref.h b/core/pref.h
index 9662b1a57..3cfc90ebd 100644
--- a/core/pref.h
+++ b/core/pref.h
@@ -168,6 +168,7 @@ struct preferences {
bool display_transitions;
bool display_variations;
bool doo2breaks;
+ bool dobailout;
bool drop_stone_mode;
bool last_stop; // At 6m?
int min_switch_duration; // seconds
diff --git a/core/settings/qPrefDivePlanner.cpp b/core/settings/qPrefDivePlanner.cpp
index ce15a081e..04a2ba7e7 100644
--- a/core/settings/qPrefDivePlanner.cpp
+++ b/core/settings/qPrefDivePlanner.cpp
@@ -34,6 +34,7 @@ void qPrefDivePlanner::loadSync(bool doSync)
disk_display_transitions(doSync);
disk_display_variations(doSync);
disk_doo2breaks(doSync);
+ disk_dobailout(doSync);
disk_drop_stone_mode(doSync);
disk_last_stop(doSync);
disk_min_switch_duration(doSync);
@@ -74,6 +75,7 @@ HANDLE_PREFERENCE_BOOL(DivePlanner, "display_transitions", display_transitions);
HANDLE_PREFERENCE_BOOL(DivePlanner, "display_variations", display_variations);
HANDLE_PREFERENCE_BOOL(DivePlanner, "doo2breaks", doo2breaks);
+HANDLE_PREFERENCE_BOOL(DivePlanner, "dobailbout", dobailout);
HANDLE_PREFERENCE_BOOL(DivePlanner, "drop_stone_mode", drop_stone_mode);
diff --git a/core/settings/qPrefDivePlanner.h b/core/settings/qPrefDivePlanner.h
index 1e282eaa1..b6ec1a0f7 100644
--- a/core/settings/qPrefDivePlanner.h
+++ b/core/settings/qPrefDivePlanner.h
@@ -22,6 +22,7 @@ class qPrefDivePlanner : public QObject {
Q_PROPERTY(bool display_transitions READ display_transitions WRITE set_display_transitions NOTIFY display_transitionsChanged);
Q_PROPERTY(bool display_variations READ display_variations WRITE set_display_variations NOTIFY display_variationsChanged);
Q_PROPERTY(bool doo2breaks READ doo2breaks WRITE set_doo2breaks NOTIFY doo2breaksChanged);
+ Q_PROPERTY(bool dobailout READ dobailout WRITE set_dobailout NOTIFY dobailoutChanged);
Q_PROPERTY(bool drop_stone_mode READ drop_stone_mode WRITE set_drop_stone_mode NOTIFY drop_stone_modeChanged);
Q_PROPERTY(bool last_stop READ last_stop WRITE set_last_stop NOTIFY last_stopChanged);
Q_PROPERTY(int min_switch_duration READ min_switch_duration WRITE set_min_switch_duration NOTIFY min_switch_durationChanged);
@@ -58,6 +59,7 @@ public:
static bool display_transitions() { return prefs.display_transitions; }
static bool display_variations() { return prefs.display_variations; }
static bool doo2breaks() { return prefs.doo2breaks; }
+ static bool dobailout() { return prefs.dobailout; }
static bool drop_stone_mode() { return prefs.drop_stone_mode; }
static bool last_stop() { return prefs.last_stop; }
static int min_switch_duration() { return prefs.min_switch_duration; }
@@ -85,6 +87,7 @@ public slots:
static void set_display_transitions(bool value);
static void set_display_variations(bool value);
static void set_doo2breaks(bool value);
+ static void set_dobailout(bool value);
static void set_drop_stone_mode(bool value);
static void set_last_stop(bool value);
static void set_min_switch_duration(int value);
@@ -112,6 +115,7 @@ signals:
void display_transitionsChanged(bool value);
void display_variationsChanged(bool value);
void doo2breaksChanged(bool value);
+ void dobailoutChanged(bool value);
void drop_stone_modeChanged(bool value);
void last_stopChanged(bool value);
void min_switch_durationChanged(int value);
@@ -140,6 +144,7 @@ private:
static void disk_display_transitions(bool doSync);
static void disk_display_variations(bool doSync);
static void disk_doo2breaks(bool doSync);
+ static void disk_dobailout(bool doSync);
static void disk_drop_stone_mode(bool doSync);
static void disk_last_stop(bool doSync);
static void disk_min_switch_duration(bool doSync);
diff --git a/core/subsurfacestartup.c b/core/subsurfacestartup.c
index 607090219..07be0cb43 100644
--- a/core/subsurfacestartup.c
+++ b/core/subsurfacestartup.c
@@ -59,6 +59,7 @@ struct preferences default_prefs = {
.decopo2 = 1600,
.bestmixend.mm = 30000,
.doo2breaks = false,
+ .dobailout = false,
.drop_stone_mode = false,
.switch_at_req_stop = false,
.min_switch_duration = 60,
diff --git a/desktop-widgets/diveplanner.cpp b/desktop-widgets/diveplanner.cpp
index bda612431..c5467aa08 100644
--- a/desktop-widgets/diveplanner.cpp
+++ b/desktop-widgets/diveplanner.cpp
@@ -123,6 +123,7 @@ DivePlannerWidget::DivePlannerWidget(QWidget *parent, Qt::WindowFlags f) : QWidg
ui.waterType->setItemData(1, SEAWATER_SALINITY);
ui.waterType->setItemData(2, EN13319_SALINITY);
waterTypeUpdateTexts();
+
QTableView *view = ui.cylinderTableWidget->view();
view->setColumnHidden(CylindersModel::START, true);
view->setColumnHidden(CylindersModel::END, true);
@@ -307,6 +308,10 @@ void PlannerSettingsWidget::disableDecoElements(int mode)
ui.backgasBreaks->blockSignals(true);
ui.backgasBreaks->setChecked(false);
ui.backgasBreaks->blockSignals(false);
+ ui.bailout->setDisabled(true);
+ ui.bailout->blockSignals(true);
+ ui.bailout->setChecked(false);
+ ui.bailout->blockSignals(false);
ui.bottompo2->setDisabled(false);
ui.decopo2->setDisabled(true);
ui.safetystop->setDisabled(false);
@@ -344,6 +349,7 @@ void PlannerSettingsWidget::disableDecoElements(int mode)
ui.backgasBreaks->setChecked(false);
ui.backgasBreaks->blockSignals(false);
}
+ ui.bailout->setDisabled(!(displayed_dive.dc.divemode == CCR || displayed_dive.dc.divemode == PSCR));
ui.bottompo2->setDisabled(false);
ui.decopo2->setDisabled(false);
ui.safetystop->setDisabled(true);
@@ -377,6 +383,7 @@ void PlannerSettingsWidget::disableDecoElements(int mode)
ui.backgasBreaks->setChecked(false);
ui.backgasBreaks->blockSignals(false);
}
+ ui.bailout->setDisabled(!(displayed_dive.dc.divemode == CCR || displayed_dive.dc.divemode == PSCR));
ui.bottompo2->setDisabled(false);
ui.decopo2->setDisabled(false);
ui.safetystop->setDisabled(true);
@@ -438,6 +445,8 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f)
ui.bottompo2->setValue(prefs.bottompo2 / 1000.0);
ui.decopo2->setValue(prefs.decopo2 / 1000.0);
ui.backgasBreaks->setChecked(prefs.doo2breaks);
+ setBailout(false);
+ setBailoutVisibility(false);
ui.drop_stone_mode->setChecked(prefs.drop_stone_mode);
ui.switch_at_req_stop->setChecked(prefs.switch_at_req_stop);
ui.min_switch_duration->setValue(prefs.min_switch_duration / 60);
@@ -481,9 +490,11 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f)
connect(ui.gflow, SIGNAL(valueChanged(int)), plannerModel, SLOT(setGFLow(int)));
connect(ui.vpmb_conservatism, SIGNAL(valueChanged(int)), plannerModel, SLOT(setVpmbConservatism(int)));
connect(ui.backgasBreaks, SIGNAL(toggled(bool)), this, SLOT(setBackgasBreaks(bool)));
+ connect(ui.bailout, SIGNAL(toggled(bool)), this, SLOT(setBailout(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)));
connect(ui.rebreathermode, SIGNAL(currentIndexChanged(int)), plannerModel, SLOT(setRebreatherMode(int)));
+ connect(ui.rebreathermode, SIGNAL(currentIndexChanged(int)), this, SLOT(setBailoutVisibility(int)));
connect(ui.bottompo2, SIGNAL(valueChanged(double)), CylindersModel::instance(), SLOT(updateBestMixes()));
connect(ui.bestmixEND, SIGNAL(valueChanged(int)), CylindersModel::instance(), SLOT(updateBestMixes()));
@@ -656,6 +667,17 @@ void PlannerSettingsWidget::setBackgasBreaks(bool dobreaks)
plannerModel->emitDataChanged();
}
+void PlannerSettingsWidget::setBailout(bool dobailout)
+{
+ qPrefDivePlanner::instance()->set_dobailout(dobailout);
+ plannerModel->emitDataChanged();
+}
+
+void PlannerSettingsWidget::setBailoutVisibility(int mode)
+{
+ ui.bailout->setDisabled(!(mode == CCR || mode == PSCR));
+}
+
PlannerDetails::PlannerDetails(QWidget *parent) : QWidget(parent)
{
ui.setupUi(this);
diff --git a/desktop-widgets/diveplanner.h b/desktop-widgets/diveplanner.h
index bf35ed7ec..6d17c956b 100644
--- a/desktop-widgets/diveplanner.h
+++ b/desktop-widgets/diveplanner.h
@@ -85,9 +85,11 @@ slots:
void setDecoPo2(double po2);
void setBestmixEND(int depth);
void setBackgasBreaks(bool dobreaks);
+ void setBailout(bool dobailout);
void disableDecoElements(int mode);
void disableBackgasBreaks(bool enabled);
void setDiveMode(int mode);
+ void setBailoutVisibility(int mode);
private:
Ui::plannerSettingsWidget ui;
diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp
index 2e4342511..64cdc6cb3 100644
--- a/desktop-widgets/mainwindow.cpp
+++ b/desktop-widgets/mainwindow.cpp
@@ -1005,6 +1005,7 @@ void MainWindow::on_actionDivePlanner_triggered()
// plan the dive in the same mode as the currently selected one
if (current_dive) {
divePlannerSettingsWidget->setDiveMode(current_dive->dc.divemode);
+ divePlannerSettingsWidget->setBailoutVisibility(current_dive->dc.divemode);
if (current_dive->salinity)
divePlannerWidget->setSalinity(current_dive->salinity);
}
diff --git a/desktop-widgets/plannerSettings.ui b/desktop-widgets/plannerSettings.ui
index 81d6d4a4b..72aec7c55 100644
--- a/desktop-widgets/plannerSettings.ui
+++ b/desktop-widgets/plannerSettings.ui
@@ -255,7 +255,7 @@
2
- -
+
-
bar
@@ -274,7 +274,7 @@
- -
+
-
Qt::Vertical
@@ -287,7 +287,7 @@
- -
+
-
Postpone gas change if a stop is not required
@@ -297,74 +297,37 @@
- -
-
+
-
+
- GFHigh
-
-
- 25
+ Last stop at 6m
- -
-
-
- GFLow
+
-
+
+
+ +
-
- 26
+
+ 4
- -
-
+
-
+
%
- 10
+ 40
150
- -
-
-
- Drop to first depth
-
-
-
- -
-
-
- Min. switch duration O₂% below 100%
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
- Plan backgas breaks
-
-
-
- -
+
-
min
@@ -383,14 +346,74 @@
- -
-
+
-
+
- Last stop at 6m
+ Plan backgas breaks
- -
+
-
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ Min. switch duration O₂% below 100%
+
+
+
+ -
+
+
+ Drop to first depth
+
+
+
+ -
+
+
+ %
+
+
+ 10
+
+
+ 150
+
+
+
+ -
+
+
+ GFLow
+
+
+ 26
+
+
+
+ -
+
+
+ GFHigh
+
+
+ 25
+
+
+
+ -
Maximize bottom time allowed by gas and no decompression limits
@@ -400,47 +423,24 @@
- -
-
-
- %
+
-
+
+
+ Conservatism level
-
- 40
-
-
- 150
+
+ 25
- -
+
-
VPM-B deco
- -
-
-
- Bühlmann deco
-
-
- true
-
-
-
- -
-
-
- Reserve gas
-
-
- 26
-
-
-
- -
+
-
Qt::LeftToRight
@@ -453,7 +453,7 @@
- -
+
-
Qt::Vertical
@@ -466,7 +466,7 @@
- -
+
-
Qt::Vertical
@@ -479,26 +479,6 @@
- -
-
-
- Conservatism level
-
-
- 25
-
-
-
- -
-
-
- +
-
-
- 4
-
-
-
-
@@ -516,6 +496,33 @@
+ -
+
+
+ Bühlmann deco
+
+
+ true
+
+
+
+ -
+
+
+ Reserve gas
+
+
+ 26
+
+
+
+ -
+
+
+ Bailout: Deco on OC
+
+
+