* samples it stores. So it's possible that the max and mean
* have been reported more correctly originally.
*
- * Only if the values calulcated from the samples are clearly
+ * Only if the values calculated from the samples are clearly
* different do we override the normal depth values.
*
* This considers 1m to be "clearly different". That's
int lasttime = 0;
int start = -1, end = -1;
int startpress = 0, endpress = 0;
- int starttemp = 0, endtemp = 0;
int maxdepth = 0, mintemp = 0;
int lastdepth = 0;
+ int lasttemp = 0;
+ temperature_t *redundant_temp = NULL;
for (i = 0; i < dive->samples; i++) {
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)
startpress = press;
}
if (temp) {
- endtemp = temp;
- if (!starttemp)
- starttemp = temp;
+ /*
+ * If we have consecutive identical
+ * temperature readings, throw away
+ * the redundant ones. We care about
+ * the "edges" only.
+ */
+ if (lasttemp == temp) {
+ if (redundant_temp)
+ redundant_temp->mkelvin = 0;
+ redundant_temp = &sample->temperature;
+ } else {
+ redundant_temp = NULL;
+ lasttemp = temp;
+ }
+
if (!mintemp || temp < mintemp)
mintemp = temp;
}
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);
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
memset(res, 0, dive_size(alloc_samples));
res->when = a->when;
- res->name = merge_text(a->name, b->name);
res->location = merge_text(a->location, b->location);
res->notes = merge_text(a->notes, b->notes);
MERGE_MAX(res, a, b, maxdepth.mm);
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);
}