summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--planner.c28
-rw-r--r--pref.h1
-rw-r--r--qt-ui/diveplanner.cpp7
-rw-r--r--qt-ui/diveplanner.h1
-rw-r--r--subsurfacestartup.c3
5 files changed, 39 insertions, 1 deletions
diff --git a/planner.c b/planner.c
index a3f0c0b62..2461e5aef 100644
--- a/planner.c
+++ b/planner.c
@@ -721,6 +721,9 @@ void plan(struct diveplan *diveplan, char **cached_datap, bool add_deco, bool sh
int last_ascend_rate;
int best_first_ascend_cylinder;
struct gasmix gas;
+ int o2time = 0;
+ int breaktime = -1;
+ int breakcylinder;
set_gf(diveplan->gflow, diveplan->gfhigh, prefs.gf_low_at_maxdepth);
if (!diveplan->surface_pressure)
@@ -862,6 +865,31 @@ void plan(struct diveplan *diveplan, char **cached_datap, bool add_deco, bool sh
DECOTIMESTEP, po2, &displayed_dive);
cache_deco_state(tissue_tolerance, &trial_cache);
clock += DECOTIMESTEP;
+ if (prefs.doo2breaks) {
+ if (get_o2(&displayed_dive.cylinder[current_cylinder].gasmix) == 1000) {
+ o2time += DECOTIMESTEP;
+ if (o2time >= 12 * 60) {
+ breaktime = 0;
+ breakcylinder = current_cylinder;
+ plan_add_segment(diveplan, clock - previous_point_time, depth, gas, po2, false);
+ previous_point_time = clock;
+ current_cylinder = 0;
+ gas = displayed_dive.cylinder[current_cylinder].gasmix;
+ }
+ } else {
+ if (breaktime >= 0) {
+ breaktime += DECOTIMESTEP;
+ if (breaktime >= 6 * 60) {
+ o2time = 0;
+ plan_add_segment(diveplan, clock - previous_point_time, depth, gas, po2, false);
+ previous_point_time = clock;
+ current_cylinder = breakcylinder;
+ gas = displayed_dive.cylinder[current_cylinder].gasmix;
+ breaktime = -1;
+ }
+ }
+ }
+ }
trial_depth = depth;
}
if (stopping) {
diff --git a/pref.h b/pref.h
index 7345e4eac..19830a920 100644
--- a/pref.h
+++ b/pref.h
@@ -61,6 +61,7 @@ struct preferences {
short proxy_auth;
char *proxy_user;
char *proxy_pass;
+ bool doo2breaks;
};
enum unit_system_values {
METRIC,
diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp
index d0f208010..3661fab15 100644
--- a/qt-ui/diveplanner.cpp
+++ b/qt-ui/diveplanner.cpp
@@ -378,6 +378,7 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f)
ui.descRate->setValue(prefs.descrate / UNIT_FACTOR);
ui.bottompo2->setValue(prefs.bottompo2 / 1000.0);
ui.decopo2->setValue(prefs.decopo2 / 1000.0);
+ ui.backgasBreaks->setChecked(prefs.doo2breaks);
connect(ui.lastStop, SIGNAL(toggled(bool)), plannerModel, SLOT(setLastStop6m(bool)));
@@ -402,6 +403,7 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f)
connect(ui.decoStopSAC, SIGNAL(valueChanged(int)), this, SLOT(decoSacChanged(int)));
connect(ui.gfhigh, SIGNAL(valueChanged(int)), plannerModel, SLOT(setGFHigh(int)));
connect(ui.gflow, SIGNAL(valueChanged(int)), plannerModel, SLOT(setGFLow(int)));
+ connect(ui.backgasBreaks, SIGNAL(toggled(bool)), this, SLOT(setBackgasBreaks(bool)));
ui.bottomSAC->setValue(20);
ui.decoStopSAC->setValue(17);
@@ -475,6 +477,11 @@ void PlannerSettingsWidget::setDecoPo2(double po2)
prefs.decopo2 = (int) (po2 * 1000.0);
}
+void PlannerSettingsWidget::setBackgasBreaks(bool dobreaks)
+{
+ prefs.doo2breaks = dobreaks;
+}
+
void DivePlannerPointsModel::setPlanMode(Mode m)
{
diff --git a/qt-ui/diveplanner.h b/qt-ui/diveplanner.h
index f2ed4f582..d9173be6f 100644
--- a/qt-ui/diveplanner.h
+++ b/qt-ui/diveplanner.h
@@ -168,6 +168,7 @@ slots:
void setDescRate(int rate);
void setBottomPo2(double po2);
void setDecoPo2(double po2);
+ void setBackgasBreaks(bool dobreaks);
private:
Ui::plannerSettingsWidget ui;
diff --git a/subsurfacestartup.c b/subsurfacestartup.c
index 8d8d848f2..a451c2ba3 100644
--- a/subsurfacestartup.c
+++ b/subsurfacestartup.c
@@ -39,7 +39,8 @@ struct preferences default_prefs = {
.ascratelast6m = 1000 / 60,
.descrate = 18000 / 60,
.bottompo2 = 1400,
- .decopo2 = 1600
+ .decopo2 = 1600,
+ .doo2breaks = false
};
int run_survey;