mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-31 19:23:24 +00:00
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:
parent
67de8f3a49
commit
5aa9c6fa1b
1 changed files with 29 additions and 14 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue