summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.c42
-rw-r--r--dive.h1
-rw-r--r--qt-ui/maintab.cpp23
-rw-r--r--qt-ui/mainwindow.cpp2
4 files changed, 65 insertions, 3 deletions
diff --git a/dive.c b/dive.c
index 565fbabaa..52a2022ae 100644
--- a/dive.c
+++ b/dive.c
@@ -5,6 +5,7 @@
#include <limits.h>
#include "gettext.h"
#include "dive.h"
+#include "planner.h"
struct tag_entry *g_tag_list = NULL;
@@ -339,6 +340,47 @@ static void fixup_dc_duration(struct divecomputer *dc)
}
}
+void per_cylinder_mean_depth(struct dive *dive, struct divecomputer *dc, int *mean, int *duration)
+{
+ int i;
+ int depthtime[MAX_CYLINDERS] = {0,};
+ int lasttime = 0, lastdepth = 0;
+ int idx = 0;
+
+ for (i = 0; i < MAX_CYLINDERS; i++)
+ mean[i] = duration[i] = 0;
+ struct event *ev = get_next_event(dc->events, "gaschange");
+ if (!ev) {
+ // special case - no gas changes
+ mean[0] = dc->meandepth.mm;
+ duration[0] = dc->duration.seconds;
+ return;
+ }
+ for (i = 0; i < dc->samples; i++) {
+ struct sample *sample = dc->sample + i;
+ int time = sample->time.seconds;
+ int depth = sample->depth.mm;
+ if (ev && time >= ev->time.seconds) {
+ int o2 = (ev->value & 0xFFFF) * 10;
+ int he = (ev->value >> 16) * 10;
+ idx = get_gasidx(dive, o2, he);
+ ev = get_next_event(ev->next, "gaschange");
+ }
+
+ /* We ignore segments at the surface */
+ if (depth > SURFACE_THRESHOLD || lastdepth > SURFACE_THRESHOLD) {
+ duration[idx] += time - lasttime;
+ depthtime[idx] += (time - lasttime) * (depth + lastdepth) / 2;
+ }
+ lastdepth = depth;
+ lasttime = time;
+ }
+ for (i = 0; i < MAX_CYLINDERS; i++) {
+ if (duration[i])
+ mean[i] = (depthtime[i] + duration[i] / 2) / duration[i];
+ }
+}
+
static void fixup_pressure(struct dive *dive, struct sample *sample)
{
unsigned int pressure, index;
diff --git a/dive.h b/dive.h
index 03b783480..28753e2b9 100644
--- a/dive.h
+++ b/dive.h
@@ -661,6 +661,7 @@ extern void copy_samples(struct dive *s, struct dive *d);
extern void fill_default_cylinder(cylinder_t *cyl);
extern void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int time, int idx);
extern void add_event(struct divecomputer *dc, int time, int type, int flags, int value, const char *name);
+extern void per_cylinder_mean_depth(struct dive *dive, struct divecomputer *dc, int *mean, int *duration);
/* UI related protopypes */
diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp
index 3398c6290..a56b2fc5d 100644
--- a/qt-ui/maintab.cpp
+++ b/qt-ui/maintab.cpp
@@ -353,8 +353,25 @@ void MainTab::updateDiveInfo(int dive)
volume_t gases[MAX_CYLINDERS] = { 0 };
get_gas_used(d, gases);
QString volumes = get_volume_string(gases[0], TRUE);
- for(int i=1; i < MAX_CYLINDERS && gases[i].mliter != 0; i++)
+ int mean[MAX_CYLINDERS], duration[MAX_CYLINDERS];
+ per_cylinder_mean_depth(d, select_dc(&d->dc), mean, duration);
+ volume_t sac;
+ QString SACs;
+ if (mean[0] && duration[0]) {
+ sac.mliter = gases[0].mliter * 1000.0 / (depth_to_mbar(mean[0], d) * duration[0] / 60.0);
+ SACs = get_volume_string(sac, TRUE).append(tr("/min"));
+ } else {
+ SACs = QString(tr("unknown"));
+ }
+ for(int i=1; i < MAX_CYLINDERS && gases[i].mliter != 0; i++) {
volumes.append("\n" + get_volume_string(gases[i], TRUE));
+ if (duration[i]) {
+ sac.mliter = gases[i].mliter * 1000.0 / (depth_to_mbar(mean[i], d) * duration[i] / 60);
+ SACs.append("\n" + get_volume_string(sac, TRUE).append(tr("/min")));
+ } else {
+ SACs.append("\n");
+ }
+ }
ui.gasUsedText->setText(volumes);
ui.oxygenHeliumText->setText(get_gaslist(d));
ui.dateText->setText(get_short_dive_date_string(d->when));
@@ -363,8 +380,8 @@ void MainTab::updateDiveInfo(int dive)
ui.surfaceIntervalText->setText(get_time_string(d->when - (prevd->when + prevd->duration.seconds), 4));
else
ui.surfaceIntervalText->clear();
- if ((sacVal.mliter = d->sac) > 0)
- ui.sacText->setText(get_volume_string(sacVal, TRUE).append(tr("/min")));
+ if (mean[0])
+ ui.sacText->setText(SACs);
else
ui.sacText->clear();
if (d->surface_pressure.mbar)
diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp
index a1c8d290f..1edd8be67 100644
--- a/qt-ui/mainwindow.cpp
+++ b/qt-ui/mainwindow.cpp
@@ -437,12 +437,14 @@ void MainWindow::saveSplitterSizes(){
void MainWindow::on_actionPreviousDC_triggered()
{
dc_number--;
+ ui.InfoWidget->updateDiveInfo(selected_dive);
redrawProfile();
}
void MainWindow::on_actionNextDC_triggered()
{
dc_number++;
+ ui.InfoWidget->updateDiveInfo(selected_dive);
redrawProfile();
}