diff --git a/planner.c b/planner.c index 3168f0ff9..13a9a489a 100644 --- a/planner.c +++ b/planner.c @@ -687,13 +687,18 @@ int ascend_velocity(int depth, int avg_depth, int bottom_time) /* As an example (and possibly reasonable default) this is the Tech 1 provedure according * to http://www.globalunderwaterexplorers.org/files/Standards_and_Procedures/SOP_Manual_Ver2.0.2.pdf */ - if (depth <= 6000) - return 1000 / 60; - - if (depth * 4 > avg_depth * 3) - return 9000 / 60; - else - return 6000 / 60; + if (depth * 4 > avg_depth * 3) { + return prefs.ascrate75; + } else { + if (depth * 2 > avg_depth) { + return prefs.ascrate50; + } else { + if (depth > 6000) + return prefs.ascratestops; + else + return prefs.ascratelast6m; + } + } } void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, struct dive *master_dive, bool add_deco, bool show_disclaimer) diff --git a/pref.h b/pref.h index 811ca3366..076441867 100644 --- a/pref.h +++ b/pref.h @@ -46,6 +46,13 @@ struct preferences { short rulergraph; short save_userid_local; char *userid; + int ascrate75; + int ascrate50; + int ascratestops; + int ascratelast6m; + int descrate; + int bottompo2; + int decopo2; }; enum unit_system_values { METRIC, diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp index 516b36b0f..249b03773 100644 --- a/qt-ui/diveplanner.cpp +++ b/qt-ui/diveplanner.cpp @@ -31,6 +31,8 @@ #define MAX_DEPTH M_OR_FT(150, 450) #define MIN_DEPTH M_OR_FT(20, 60) +#define UNIT_FACTOR ((prefs.units.length == units::METERS) ? 1000.0 / 60.0 : feet_to_mm(1.0) / 60.0) + QString gasToStr(struct gasmix gas) { uint o2 = (gas.o2.permille + 5) / 10, he = (gas.he.permille + 5) / 10; @@ -333,11 +335,34 @@ PlannerSettingsWidget::PlannerSettingsWidget(QWidget *parent, Qt::WindowFlags f) { ui.setupUi(this); + if (prefs.units.METERS == units::FEET) { + ui.ascRate75->setSuffix("ft/min"); + ui.ascRate50->setSuffix("ft/min"); + ui.ascRateStops->setSuffix("ft/min"); + ui.ascRateLast6m->setSuffix("ft/min"); + ui.descRate->setSuffix("ft/min"); + } + ui.ascRate75->setValue(prefs.ascrate75 / UNIT_FACTOR); + ui.ascRate50->setValue(prefs.ascrate50 / UNIT_FACTOR); + ui.ascRateStops->setValue(prefs.ascratestops / UNIT_FACTOR); + ui.ascRateLast6m->setValue(prefs.ascratelast6m / UNIT_FACTOR); + ui.descRate->setValue(prefs.descrate / UNIT_FACTOR); + connect(ui.lastStop, SIGNAL(toggled(bool)), plannerModel, SLOT(setLastStop6m(bool))); connect(ui.verbatim_plan, SIGNAL(toggled(bool)), plannerModel, SLOT(setVerbatim(bool))); connect(ui.display_duration, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayDuration(bool))); connect(ui.display_runtime, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayRuntime(bool))); connect(ui.display_transitions, SIGNAL(toggled(bool)), plannerModel, SLOT(setDisplayTransitions(bool))); + connect(ui.ascRate75, SIGNAL(valueChanged(int)), this, SLOT(setAscRate75(int))); + connect(ui.ascRate75, SIGNAL(valueChanged(int)), plannerModel, SLOT(emitDataChanged())); + connect(ui.ascRate50, SIGNAL(valueChanged(int)), this, SLOT(setAscRate50(int))); + connect(ui.ascRate50, SIGNAL(valueChanged(int)), plannerModel, SLOT(emitDataChanged())); + connect(ui.ascRateStops, SIGNAL(valueChanged(int)), this, SLOT(setAscRateStops(int))); + connect(ui.ascRateStops, SIGNAL(valueChanged(int)), plannerModel, SLOT(emitDataChanged())); + connect(ui.ascRateLast6m, SIGNAL(valueChanged(int)), this, SLOT(setAscRateLast6m(int))); + connect(ui.ascRateLast6m, SIGNAL(valueChanged(int)), plannerModel, SLOT(emitDataChanged())); + connect(ui.descRate, SIGNAL(valueChanged(int)), this, SLOT(setDescRate())); + connect(ui.descRate, SIGNAL(valueChanged(int)), plannerModel, SLOT(emitDataChanged())); setMinimumWidth(0); setMinimumHeight(0); @@ -363,6 +388,30 @@ void PlannerSettingsWidget::printDecoPlan() { } +void PlannerSettingsWidget::setAscRate75(int rate) +{ + prefs.ascrate75 = rate * UNIT_FACTOR; +} + +void PlannerSettingsWidget::setAscRate50(int rate) +{ + prefs.ascrate50 = rate * UNIT_FACTOR; +} + +void PlannerSettingsWidget::setAscRateStops(int rate) +{ + prefs.ascratestops = rate * UNIT_FACTOR; +} + +void PlannerSettingsWidget::setAscRateLast6m(int rate) +{ + prefs.ascratelast6m = rate * UNIT_FACTOR; +} + +void PlannerSettingsWidget::setDescRate(int rate) +{ + prefs.descrate = rate * UNIT_FACTOR; +} void DivePlannerPointsModel::setPlanMode(Mode m) { diff --git a/qt-ui/diveplanner.h b/qt-ui/diveplanner.h index 0b4e783cb..9f6052b4a 100644 --- a/qt-ui/diveplanner.h +++ b/qt-ui/diveplanner.h @@ -159,6 +159,11 @@ slots: void bottomSacChanged(const int bottomSac); void decoSacChanged(const int decosac); void printDecoPlan(); + void setAscRate75(int rate); + void setAscRate50(int rate); + void setAscRateStops(int rate); + void setAscRateLast6m(int rate); + void setDescRate(int rate); private: Ui::plannerSettingsWidget ui; diff --git a/qt-ui/plannerSettings.ui b/qt-ui/plannerSettings.ui index 82584fa0e..519f3ea7c 100644 --- a/qt-ui/plannerSettings.ui +++ b/qt-ui/plannerSettings.ui @@ -19,7 +19,7 @@ 20 20 872 - 203 + 463 @@ -62,6 +62,9 @@ QFrame::Raised + + QFormLayout::FieldsStayAtSizeHint + @@ -69,6 +72,16 @@ + + + + + 16777215 + 20 + + + + @@ -76,18 +89,8 @@ - - - - - 16777215 - 20 - - - - - + 16777215 @@ -176,67 +179,27 @@ - - - - - 16777215 - 20 - - - - - + 75%-50% avg. depth - + 50% avg. depth - 6m/20ft - + 6m/20ft to surface - - - - - 16777215 - 20 - - - - - - - - - 16777215 - 20 - - - - - - - - - 16777215 - 20 - - - - @@ -244,21 +207,21 @@ - + - Decent rate + Descent rate - + surface to the bottom - + @@ -272,6 +235,9 @@ 20 + + m/min + 1 @@ -280,6 +246,46 @@ + + + + m/min + + + 1 + + + + + + + m/min + + + 1 + + + + + + + m/min + + + 1 + + + + + + + m/min + + + 1 + + + @@ -291,14 +297,10 @@ display_runtime display_duration display_transitions - ascRate75 - ascRate50 - ascRateStops - ascRateLast6m lastStop backgasBreaks - ascRate75_2 - ascRate75_3 + bottompo2 + decopo2 descRate diff --git a/subsurfacestartup.c b/subsurfacestartup.c index da9fc2358..463aea63a 100644 --- a/subsurfacestartup.c +++ b/subsurfacestartup.c @@ -32,7 +32,12 @@ struct preferences default_prefs = { .display_invalid_dives = false, .show_sac = false, .display_unused_tanks = false, - .show_average_depth = true + .show_average_depth = true, + .ascrate75 = 9000 / 60, + .ascrate50 = 6000 / 60, + .ascratestops = 6000 / 60, + .ascratelast6m = 1000 / 60, + .descrate = 18000 / 60 }; int run_survey;