Do not count gas used in planned dives for statistics

This is important if in one dive we have the real dive and
a planned version of the dive as different computers using
different sets of cylinders.

[Dirk Hohndel: an early version of this was mistakenly pushed out
               by me; I reverted that and added this commit since
               fixing things up as I had done for the other two
               patches made things nearly unreadable]

Signed-off-by: Robert C. Helling <helling@atdotde.de>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Robert Helling 2017-02-03 11:14:51 +01:00 committed by Dirk Hohndel
parent 67de8f3a49
commit 5aa9c6fa1b

View file

@ -326,41 +326,56 @@ void get_selected_dives_text(char *buffer, size_t size)
#define SOME_GAS 5000 // 5bar drop in cylinder pressure makes cylinder used
bool has_gaschange_event(struct dive *dive, struct divecomputer *dc, int idx) {
bool first_gas_explicit = false;
struct event *event = get_next_event(dc->events, "gaschange");
while (event) {
if (dc->sample && (event->time.seconds == 0 ||
(dc->samples && dc->sample[0].time.seconds == event->time.seconds)))
first_gas_explicit = true;
if (get_cylinder_index(dive, event) == idx)
return true;
event = get_next_event(event->next, "gaschange");
}
if (dc->divemode == CCR && (idx == dive->diluent_cylinder_index || idx == dive->oxygen_cylinder_index))
return true;
return !first_gas_explicit && idx == 0;
}
bool is_cylinder_used(struct dive *dive, int idx)
{
struct divecomputer *dc;
bool firstGasExplicit = false;
if (cylinder_none(&dive->cylinder[idx]))
return false;
if ((dive->cylinder[idx].start.mbar - dive->cylinder[idx].end.mbar) > SOME_GAS)
return true;
for_each_dc(dive, dc) {
struct event *event = get_next_event(dc->events, "gaschange");
while (event) {
if (dc->sample && (event->time.seconds == 0 ||
(dc->samples && dc->sample[0].time.seconds == event->time.seconds)))
firstGasExplicit = true;
if (get_cylinder_index(dive, event) == idx)
return true;
event = get_next_event(event->next, "gaschange");
}
if (dc->divemode == CCR && (idx == dive->diluent_cylinder_index || idx == dive->oxygen_cylinder_index))
if (has_gaschange_event(dive, dc, idx))
return true;
}
if (idx == 0 && !firstGasExplicit)
return true;
return false;
}
void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS])
{
int idx;
struct divecomputer *dc;
bool used;
for (idx = 0; idx < MAX_CYLINDERS; idx++) {
used = false;
cylinder_t *cyl = &dive->cylinder[idx];
pressure_t start, end;
if (!is_cylinder_used(dive, idx))
for_each_dc(dive, dc) {
if (!strcmp(dc->model, "planned dive"))
continue;
if (has_gaschange_event(dive, dc, idx))
used = true;
}
if (!used)
continue;
start = cyl->start.mbar ? cyl->start : cyl->sample_start;