summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Robert Helling <helling@atdotde.de>2013-05-30 20:56:00 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-05-31 05:18:25 +0900
commit344a429e4811c60b9b12ef225c2b5b8d31d8534b (patch)
treea5fd22433415c35ab3495bbc2e3c823099fd546c
parent77880b7a0797cef0fac0650ce0321e3aa8b702f4 (diff)
downloadsubsurface-344a429e4811c60b9b12ef225c2b5b8d31d8534b.tar.gz
Show ceilings for individual tissues
I think that displaying tissue loadings either as pressure or as percentages is not very intuitive but that it makes much more sense when translated to ceiling depths. This change enables just that for the 16 tissues in our calculated ceiling and visualizes this in the profile graph. There is a checkbox in the preferences to turn this on. If enabled, all tissues having non-trivial ceilings are also shown in the info box. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--deco.c5
-rw-r--r--deco.h12
-rw-r--r--pref.h1
-rw-r--r--profile.c15
-rw-r--r--profile.h1
-rw-r--r--qt-ui/mainwindow.cpp2
-rw-r--r--qt-ui/preferences.cpp3
-rw-r--r--qt-ui/preferences.ui38
-rw-r--r--qt-ui/profilegraphics.cpp26
9 files changed, 88 insertions, 15 deletions
diff --git a/deco.c b/deco.c
index c5d2bffc7..c7ad61660 100644
--- a/deco.c
+++ b/deco.c
@@ -83,6 +83,9 @@ int ci_pointing_to_guiding_tissue;
double gf_low_pressure_this_dive;
#define TISSUE_ARRAY_SZ sizeof(tissue_n2_sat)
+double tolerated_by_tissue[16];
+
+
static double tissue_tolerance_calc(const struct dive *dive)
{
int ci = -1;
@@ -117,6 +120,8 @@ static double tissue_tolerance_calc(const struct dive *dive)
(1.0 - buehlmann_inertgas_b)*(gf_low * gf_low_pressure_this_dive - gf_high * surface) +
buehlmann_inertgas_b * (gf_low_pressure_this_dive - surface));
+ tolerated_by_tissue[ci] = tolerated;
+
if (tolerated > ret_tolerance_limit_ambient_pressure)
{
ci_pointing_to_guiding_tissue = ci;
diff --git a/deco.h b/deco.h
new file mode 100644
index 000000000..f9ed7d4d7
--- /dev/null
+++ b/deco.h
@@ -0,0 +1,12 @@
+#ifndef DECO_H
+#define DECO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ extern double tolerated_by_tissue[];
+
+ extern double buehlmann_N2_t_halflife[];
+
+#endif
diff --git a/pref.h b/pref.h
index 7bf71b44c..376cc4a71 100644
--- a/pref.h
+++ b/pref.h
@@ -39,6 +39,7 @@ struct preferences {
short profile_red_ceiling;
short profile_calc_ceiling;
short calc_ceiling_3m_incr;
+ short calc_all_tissues;
short gflow;
short gfhigh;
int map_provider;
diff --git a/profile.c b/profile.c
index e6ba6ad8d..c502cf669 100644
--- a/profile.c
+++ b/profile.c
@@ -12,6 +12,7 @@
#include "divelist.h"
#include "profile.h"
+#include "deco.h"
#include "libdivecomputer/parser.h"
#include "libdivecomputer/version.h"
@@ -971,7 +972,7 @@ static void calculate_deco_information(struct dive *dive, struct divecomputer *d
double surface_pressure = (dc->surface_pressure.mbar ? dc->surface_pressure.mbar : get_surface_pressure_in_mbar(dive, TRUE)) / 1000.0;
for (i = 1; i < pi->nr; i++) {
- int fo2, fhe, j, t0, t1;
+ int fo2, fhe, j, k, t0, t1;
double tissue_tolerance;
struct plot_data *entry = pi->entry + i;
int cylinderindex = entry->cylinderindex;
@@ -1038,6 +1039,8 @@ static void calculate_deco_information(struct dive *dive, struct divecomputer *d
entry->ceiling = (entry - 1)->ceiling;
else
entry->ceiling = deco_allowed_depth(tissue_tolerance, surface_pressure, dive, !prefs.calc_ceiling_3m_incr);
+ for (k=0; k<16; k++)
+ entry->ceilings[k] = deco_allowed_depth(tolerated_by_tissue[k], surface_pressure, dive, 1);
}
#if DECO_CALC_DEBUG & 1
@@ -1137,6 +1140,16 @@ static void plot_string(struct plot_data *entry, char *buf, int bufsize,
depthvalue = get_depth_units(entry->ceiling, NULL, &depth_unit);
memcpy(buf2, buf, bufsize);
snprintf(buf, bufsize, _("%s\nCalculated ceiling %.0f %s"), buf2, depthvalue, depth_unit);
+ if (prefs.calc_all_tissues){
+ int k;
+ for (k=0; k<16; k++){
+ if (entry->ceilings[k]){
+ depthvalue = get_depth_units(entry->ceilings[k], NULL, &depth_unit);
+ memcpy(buf2, buf, bufsize);
+ snprintf(buf, bufsize, _("%s\nTissue %.0fmin: %.0f %s"), buf2, buehlmann_N2_t_halflife[k], depthvalue, depth_unit);
+ }
+ }
+ }
}
if (entry->stopdepth) {
depthvalue = get_depth_units(entry->stopdepth, NULL, &depth_unit);
diff --git a/profile.h b/profile.h
index 5190c54f8..7af95d565 100644
--- a/profile.h
+++ b/profile.h
@@ -23,6 +23,7 @@ struct plot_data {
/* Depth info */
int depth;
int ceiling;
+ int ceilings[16];
int ndl;
int stoptime;
int stopdepth;
diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp
index 14958b50f..79e3f2c7d 100644
--- a/qt-ui/mainwindow.cpp
+++ b/qt-ui/mainwindow.cpp
@@ -403,6 +403,7 @@ void MainWindow::readSettings()
GET_BOOL(v, "dcceiling", prefs.profile_dc_ceiling);
GET_BOOL(v, "calcceiling", prefs.profile_calc_ceiling);
GET_BOOL(v, "calcceiling3m", prefs.calc_ceiling_3m_incr);
+ GET_BOOL(v, "calcalltissues", prefs.calc_all_tissues);
v = settings.value(QString("gflow"));
if (v.isValid())
prefs.gflow = v.toInt();
@@ -479,6 +480,7 @@ void MainWindow::writeSettings()
SAVE_VALUE("redceiling", profile_red_ceiling);
SAVE_VALUE("calcceiling", profile_calc_ceiling);
SAVE_VALUE("calcceiling3m", calc_ceiling_3m_incr);
+ SAVE_VALUE("calcalltissues", calc_all_tissues);
SAVE_VALUE("dcceiling", profile_dc_ceiling);
SAVE_VALUE("gflow", gflow);
SAVE_VALUE("gfhigh", gfhigh);
diff --git a/qt-ui/preferences.cpp b/qt-ui/preferences.cpp
index 453f20c34..68dcbf2a0 100644
--- a/qt-ui/preferences.cpp
+++ b/qt-ui/preferences.cpp
@@ -41,6 +41,8 @@ PreferencesDialog::PreferencesDialog(QWidget* parent, Qt::WindowFlags f) : QDial
ui->calculated_ceiling->setChecked(B(calcceiling, profile_calc_ceiling));
ui->increment_3m->setEnabled(ui->calculated_ceiling->isChecked());
ui->increment_3m->setChecked(B(calcceiling3m, calc_ceiling_3m_incr));
+ ui->all_tissues->setEnabled(ui->all_tissues->isChecked());
+ ui->all_tissues->setChecked(B(calcalltissues, calc_all_tissues));
ui->gflow->setValue((int)(I(gflow, gflow)));
ui->gfhigh->setValue((int)(I(gfhigh, gfhigh)));
@@ -112,6 +114,7 @@ void PreferencesDialog::syncSettings()
SB("redceiling", ui->red_ceiling);
SB("calcceiling", ui->calculated_ceiling);
SB("calcceiling3m", ui->increment_3m);
+ SB("calcalltissues", ui->all_tissues);
s.setValue("gflow", ui->gflow->value());
s.setValue("gfhigh", ui->gfhigh->value());
s.endGroup();
diff --git a/qt-ui/preferences.ui b/qt-ui/preferences.ui
index 348e62ecd..1617c453b 100644
--- a/qt-ui/preferences.ui
+++ b/qt-ui/preferences.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>444</width>
- <height>386</height>
+ <width>604</width>
+ <height>490</height>
</rect>
</property>
<property name="windowTitle">
@@ -116,7 +116,7 @@
</sizepolicy>
</property>
<property name="currentIndex">
- <number>1</number>
+ <number>2</number>
</property>
<widget class="QWidget" name="page_2">
<layout class="QVBoxLayout" name="verticalLayout_3">
@@ -624,8 +624,8 @@
</property>
</widget>
</item>
- </layout>
- </item>
+ </layout>
+ </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
@@ -649,6 +649,16 @@
</spacer>
</item>
<item>
+ <widget class="QCheckBox" name="all_tissues">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>show all tissues</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QCheckBox" name="increment_3m">
<property name="enabled">
<bool>false</bool>
@@ -891,18 +901,18 @@
</hints>
</connection>
<connection>
- <sender>dc_ceiling</sender>
+ <sender>calculated_ceiling</sender>
<signal>clicked(bool)</signal>
- <receiver>red_ceiling</receiver>
+ <receiver>all_tissues</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>288</x>
- <y>364</y>
+ <y>344</y>
</hint>
<hint type="destinationlabel">
<x>555</x>
- <y>371</y>
+ <y>351</y>
</hint>
</hints>
</connection>
@@ -913,21 +923,21 @@
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
- <x>288</x>
- <y>344</y>
+ <x>198</x>
+ <y>286</y>
</hint>
<hint type="destinationlabel">
- <x>555</x>
- <y>351</y>
+ <x>503</x>
+ <y>286</y>
</hint>
</hints>
</connection>
</connections>
<buttongroups>
- <buttongroup name="buttonGroup"/>
<buttongroup name="buttonGroup_2"/>
<buttongroup name="buttonGroup_3"/>
<buttongroup name="buttonGroup_4"/>
<buttongroup name="buttonGroup_5"/>
+ <buttongroup name="buttonGroup"/>
</buttongroups>
</ui>
diff --git a/qt-ui/profilegraphics.cpp b/qt-ui/profilegraphics.cpp
index 663aefe25..d635e1956 100644
--- a/qt-ui/profilegraphics.cpp
+++ b/qt-ui/profilegraphics.cpp
@@ -1072,6 +1072,32 @@ void ProfileGraphicsView::plot_depth_profile()
neatFill->setBrush(pat);
scene()->addItem(neatFill);
}
+
+ /* plot the calculated ceiling for all tissues */
+ if (prefs.calc_all_tissues){
+ int k;
+ for (k=0; k<16; k++){
+ if (prefs.profile_calc_ceiling) {
+ pat.setColorAt(0, profile_color[CALC_CEILING_SHALLOW].first());
+ pat.setColorAt(1, QColor(100, 100, 100, 50));
+
+ entry = gc.pi.entry;
+ p.clear();
+ p.append(QPointF(SCALEGC(0, 0)));
+ for (i = 0; i < gc.pi.nr; i++, entry++) {
+ if ((entry->ceilings)[k])
+ p.append(QPointF(SCALEGC(entry->sec, (entry->ceilings)[k])));
+ else
+ p.append(QPointF(SCALEGC(entry->sec, 0)));
+ }
+ p.append(QPointF(SCALEGC((entry-1)->sec, 0)));
+ neatFill = new QGraphicsPolygonItem();
+ neatFill->setPolygon(p);
+ neatFill->setBrush(pat);
+ scene()->addItem(neatFill);
+ }
+ }
+ }
/* next show where we have been bad and crossed the dc's ceiling */
if (prefs.profile_dc_ceiling) {
pat.setColorAt(0, profile_color[CEILING_SHALLOW].first());