Don't save cylinder start/end pressures unless set by hand

Keep the sample pressure start/end data separate from the overall
cylinder start/end data - and clean the overall cylinder start/end data
if it matches the samples exactly to avoid the redundancy.

This breaks all the SAC calculations etc, which expect the cylinder
pressures to always be in the cylinder data.  I'll fix that up
separately.

The reason for this is that we really want to keep the manually entered
data separate: the pressure plotting doesn't need the confusion, and
considers end-point data (with interpolation) very different from sample
data.  Also, we do not want to pollute the xml save-file with data that
is computed.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Linus Torvalds 2011-11-09 07:37:25 -08:00
parent 2b26b6433f
commit 0089dd8819
2 changed files with 14 additions and 36 deletions

48
dive.c
View file

@ -207,46 +207,21 @@ static void update_temperature(temperature_t *temperature, int new)
}
}
/*
* If you have more than 32 cylinders, you'd better have a 64-bit build.
* And if you have more than 64 cylinders, you need to use another tool,
* or fix this up to do something odd.
*/
static unsigned long fixup_pressure(struct dive *dive, struct sample *sample, unsigned long flags)
static void fixup_pressure(struct dive *dive, struct sample *sample)
{
unsigned long mask;
unsigned int pressure, index;
cylinder_t *cyl;
pressure = sample->cylinderpressure.mbar;
if (!pressure)
return flags;
return;
index = sample->cylinderindex;
if (index >= MAX_CYLINDERS)
return flags;
return;
cyl = dive->cylinder + index;
if (!cyl->start.mbar)
cyl->start.mbar = pressure;
/*
* If we already have an end pressure, without
* ever having seen a sample for this cylinder,
* that means that somebody set the end pressure
* by hand
*/
mask = 1ul << index;
if (cyl->end.mbar) {
if (!(flags & mask))
return flags;
}
flags |= mask;
/* we need to handle the user entering beginning and end tank pressures
* - maybe even IF we have samples. But for now if we have air pressure
* data in the samples, we use that instead of the minimum
* if (!cyl->end.mbar || pressure < cyl->end.mbar)
*/
cyl->end.mbar = pressure;
return flags;
if (!cyl->sample_start.mbar)
cyl->sample_start.mbar = pressure;
cyl->sample_end.mbar = pressure;
}
struct dive *fixup_dive(struct dive *dive)
@ -258,7 +233,6 @@ struct dive *fixup_dive(struct dive *dive)
int maxdepth = 0, mintemp = 0;
int lastdepth = 0;
int lasttemp = 0;
unsigned long flags = 0;
for (i = 0; i < dive->samples; i++) {
struct sample *sample = dive->sample + i;
@ -276,7 +250,7 @@ struct dive *fixup_dive(struct dive *dive)
maxdepth = depth;
}
flags = fixup_pressure(dive, sample, flags);
fixup_pressure(dive, sample);
if (temp) {
/*
@ -311,8 +285,12 @@ struct dive *fixup_dive(struct dive *dive)
add_people(dive->divemaster);
add_location(dive->location);
for (i = 0; i < MAX_CYLINDERS; i++) {
cylinder_type_t *type = &dive->cylinder[i].type;
add_cylinder_description(type);
cylinder_t *cyl = dive->cylinder + i;
add_cylinder_description(&cyl->type);
if (cyl->sample_start.mbar == cyl->start.mbar)
cyl->start.mbar = 0;
if (cyl->sample_end.mbar == cyl->end.mbar)
cyl->end.mbar = 0;
}
return dive;

2
dive.h
View file

@ -84,7 +84,7 @@ typedef struct {
typedef struct {
cylinder_type_t type;
struct gasmix gasmix;
pressure_t start, end;
pressure_t start, end, sample_start, sample_end;
} cylinder_t;
extern int get_pressure_units(unsigned int mb, const char **units);