summaryrefslogtreecommitdiffstats
path: root/dive.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-09-03 20:31:18 -0700
committerGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-09-03 20:31:18 -0700
commitb176daf6d6d169bfa9b811687bd7696b1bb6063f (patch)
tree18f1e9fc6016ee703fd8f78c075053f3bceabf0e /dive.c
parentc1bed52a777fb8d03e056afddf7879af7b94d157 (diff)
downloadsubsurface-b176daf6d6d169bfa9b811687bd7696b1bb6063f.tar.gz
Do better cylinder information management
Instead of just tracking gasmix, track the size and workng pressure of the cylinder too. And use "cylinder" instead of "tank" throughout. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'dive.c')
-rw-r--r--dive.c41
1 files changed, 29 insertions, 12 deletions
diff --git a/dive.c b/dive.c
index 70d6d4269..9cd6da0eb 100644
--- a/dive.c
+++ b/dive.c
@@ -42,7 +42,7 @@ struct dive *fixup_dive(struct dive *dive)
struct sample *sample = dive->sample + i;
int time = sample->time.seconds;
int depth = sample->depth.mm;
- int press = sample->tankpressure.mbar;
+ int press = sample->cylinderpressure.mbar;
int temp = sample->temperature.mkelvin;
if (lastdepth)
@@ -168,10 +168,10 @@ add_sample_b:
sample.depth = as->depth;
if (as->temperature.mkelvin)
sample.temperature = as->temperature;
- if (as->tankpressure.mbar)
- sample.tankpressure = as->tankpressure;
- if (as->tankindex)
- sample.tankindex = as->tankindex;
+ if (as->cylinderpressure.mbar)
+ sample.cylinderpressure = as->cylinderpressure;
+ if (as->cylinderindex)
+ sample.cylinderindex = as->cylinderindex;
res = add_sample(&sample, at, res);
@@ -199,6 +199,27 @@ static char *merge_text(const char *a, const char *b)
return res;
}
+/* Pick whichever has any info (if either). Prefer 'a' */
+static void merge_cylinder_type(cylinder_type_t *res, cylinder_type_t *a, cylinder_type_t *b)
+{
+ if (a->size.mliter)
+ b = a;
+ *res = *b;
+}
+
+static void merge_cylinder_mix(gasmix_t *res, gasmix_t *a, gasmix_t *b)
+{
+ if (a->o2.permille)
+ b = a;
+ *res = *b;
+}
+
+static void merge_cylinder_info(cylinder_t *res, cylinder_t *a, cylinder_t *b)
+{
+ merge_cylinder_type(&res->type, &a->type, &b->type);
+ merge_cylinder_mix(&res->gasmix, &a->gasmix, &b->gasmix);
+}
+
/*
* This could do a lot more merging. Right now it really only
* merges almost exact duplicates - something that happens easily
@@ -230,12 +251,8 @@ struct dive *try_to_merge(struct dive *a, struct dive *b)
MERGE_MIN(res, a, b, watertemp.mkelvin);
MERGE_MAX(res, a, b, beginning_pressure.mbar);
MERGE_MAX(res, a, b, end_pressure.mbar);
- for (i = 0; i < MAX_MIXES; i++) {
- if (a->gasmix[i].o2.permille) {
- res->gasmix[i] = a->gasmix[i];
- continue;
- }
- res->gasmix[i] = b->gasmix[i];
- }
+ for (i = 0; i < MAX_CYLINDERS; i++)
+ merge_cylinder_info(res->cylinder+i, a->cylinder + i, b->cylinder + i);
+
return merge_samples(res, a, b, 0);
}