X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=dive.c;h=9bac25eeef3aa8412972e2ccfe890851828b3445;hb=9961c7f89ce6353609383b16b9fbf3a30e4d8604;hp=70d6d4269e50f47690ceec905fbd1c1615d9b11c;hpb=2804dc42d81a728c62b173f55bbfc075cf643a00;p=ext%2Fsubsurface.git diff --git a/dive.c b/dive.c index 70d6d42..9bac25e 100644 --- a/dive.c +++ b/dive.c @@ -13,7 +13,7 @@ * 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 @@ -37,12 +37,14 @@ struct dive *fixup_dive(struct dive *dive) 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) @@ -60,6 +62,21 @@ struct dive *fixup_dive(struct dive *dive) startpress = press; } if (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; + } + endtemp = temp; if (!starttemp) starttemp = temp; @@ -168,10 +185,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 +216,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 +268,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); }