summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.c17
-rw-r--r--qt-ui/maintab.cpp32
-rw-r--r--statistics.c27
-rw-r--r--statistics.h1
4 files changed, 33 insertions, 44 deletions
diff --git a/dive.c b/dive.c
index 2bea1e43c..4f42e48d6 100644
--- a/dive.c
+++ b/dive.c
@@ -7,6 +7,7 @@
#include "gettext.h"
#include "dive.h"
#include "libdivecomputer.h"
+#include "device.h"
/* one could argue about the best place to have this variable -
* it's used in the UI, but it seems to make the most sense to have it
@@ -586,14 +587,28 @@ void per_cylinder_mean_depth(struct dive *dive, struct divecomputer *dc, int *me
duration[0] = dc->duration.seconds;
return;
}
+ if (!dc->samples)
+ dc = fake_dc(dc);
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) {
+
+ /* Make sure to move the event past 'lasttime' */
+ while (ev && lasttime >= ev->time.seconds) {
idx = get_cylinder_index(dive, ev);
ev = get_next_event(ev->next, "gaschange");
}
+
+ /* Do we need to fake a midway sample at an event? */
+ if (ev && time > ev->time.seconds) {
+ int newtime = ev->time.seconds;
+ int newdepth = interpolate(lastdepth, depth, newtime - lasttime, time - lasttime);
+
+ time = newtime;
+ depth = newdepth;
+ i--;
+ }
/* We ignore segments at the surface */
if (depth > SURFACE_THRESHOLD || lastdepth > SURFACE_THRESHOLD) {
duration[idx] += time - lasttime;
diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp
index 075bfb734..ed65a1943 100644
--- a/qt-ui/maintab.cpp
+++ b/qt-ui/maintab.cpp
@@ -472,28 +472,30 @@ void MainTab::updateDiveInfo(bool clear)
ui.airTemperatureText->setText(get_temperature_string(displayed_dive.airtemp, true));
volume_t gases[MAX_CYLINDERS] = {};
get_gas_used(&displayed_dive, gases);
- QString volumes = get_volume_string(gases[0], true);
+ QString volumes;
int mean[MAX_CYLINDERS], duration[MAX_CYLINDERS];
per_cylinder_mean_depth(&displayed_dive, select_dc(&displayed_dive), mean, duration);
volume_t sac;
- QString SACs;
- if (mean[0] && duration[0] && gases[0].mliter) {
- sac.mliter = gases[0].mliter / (depth_to_atm(mean[0], &displayed_dive) * 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] && gases[i].mliter) {
+ QString gaslist, SACs, separator;
+
+ gaslist = ""; SACs = ""; volumes = ""; separator = "";
+ for (int i = 0; i < MAX_CYLINDERS; i++) {
+ if (!is_cylinder_used(&displayed_dive, i))
+ continue;
+ gaslist.append(separator); volumes.append(separator); SACs.append(separator);
+ separator = "\n";
+
+ gaslist.append(gasname(&displayed_dive.cylinder[i].gasmix));
+ if (!gases[i].mliter)
+ continue;
+ volumes.append(get_volume_string(gases[i], true));
+ if (duration[i]) {
sac.mliter = gases[i].mliter / (depth_to_atm(mean[i], &displayed_dive) * duration[i] / 60);
- SACs.append("\n" + get_volume_string(sac, true).append(tr("/min")));
- } else {
- SACs.append("\n");
+ SACs.append(get_volume_string(sac, true).append(tr("/min")));
}
}
ui.gasUsedText->setText(volumes);
- ui.oxygenHeliumText->setText(get_gaslist(&displayed_dive));
+ ui.oxygenHeliumText->setText(gaslist);
ui.dateText->setText(get_short_dive_date_string(displayed_dive.when));
ui.diveTimeText->setText(QString::number((int)((displayed_dive.duration.seconds + 30) / 60)));
if (prevd)
diff --git a/statistics.c b/statistics.c
index 21b386b21..01adf4f14 100644
--- a/statistics.c
+++ b/statistics.c
@@ -331,33 +331,6 @@ void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS])
}
}
-#define MAXBUF 80
-/* for the O2/He readings just create a list of them */
-char *get_gaslist(struct dive *dive)
-{
- int idx, offset = 0;
- static char buf[MAXBUF];
-
- buf[0] = '\0';
- for (idx = 0; idx < MAX_CYLINDERS; idx++) {
- cylinder_t *cyl;
- if (!is_cylinder_used(dive, idx))
- continue;
- cyl = &dive->cylinder[idx];
- if (offset > 0) {
- strncpy(buf + offset, "\n", MAXBUF - offset);
- offset = strlen(buf);
- }
- strncpy(buf + offset, gasname(&cyl->gasmix), MAXBUF - offset);
- offset = strlen(buf);
- }
- if (*buf == '\0')
- strncpy(buf, translate("gettextFromC", "air"), MAXBUF);
-
- buf[MAXBUF - 1] = '\0';
- return buf;
-}
-
/* Quite crude reverse-blender-function, but it produces a approx result */
static void get_gas_parts(struct gasmix mix, volume_t vol, int o2_in_topup, volume_t *o2, volume_t *he)
{
diff --git a/statistics.h b/statistics.h
index e28fb8f55..4d14139e6 100644
--- a/statistics.h
+++ b/statistics.h
@@ -45,7 +45,6 @@ extern char *get_minutes(int seconds);
extern void process_all_dives(struct dive *dive, struct dive **prev_dive);
extern void get_selected_dives_text(char *buffer, int size);
extern void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS]);
-extern char *get_gaslist(struct dive *dive);
extern void process_selected_dives(void);
void selected_dives_gas_parts(volume_t *o2_tot, volume_t *he_tot);