X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=dive.c;h=8c81a3d516702bb9ecac67f2ee40fb82088d6e0a;hb=6138d151e9156bdf15843b1b54104428c5124e38;hp=2ecd10cb0be418f524736c0ab227930d343abc6c;hpb=1e75ceac0dbbf6a6eef1e13f076c3ae6a7af4c55;p=ext%2Fsubsurface.git diff --git a/dive.c b/dive.c index 2ecd10c..8c81a3d 100644 --- a/dive.c +++ b/dive.c @@ -3,6 +3,30 @@ #include "dive.h" +/* + * So when we re-calculate maxdepth and meandepth, we will + * not override the old numbers if they are close to the + * new ones. + * + * Why? Because a dive computer may well actually track the + * max depth and mean depth at finer granularity than the + * samples it stores. So it's possible that the max and mean + * have been reported more correctly originally. + * + * 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 + * a totally random number. + */ +static void update_depth(depth_t *depth, int new) +{ + int old = depth->mm; + + if (abs(old - new) > 1000) + depth->mm = new; +} + struct dive *fixup_dive(struct dive *dive) { int i; @@ -18,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) @@ -50,15 +74,16 @@ struct dive *fixup_dive(struct dive *dive) return dive; dive->duration.seconds = end - start; if (start != end) - dive->meandepth.mm = depthtime / (end - start); + update_depth(&dive->meandepth, depthtime / (end - start)); if (startpress) dive->beginning_pressure.mbar = startpress; if (endpress) dive->end_pressure.mbar = endpress; if (mintemp) dive->watertemp.mkelvin = mintemp; + if (maxdepth) - dive->maxdepth.mm = maxdepth; + update_depth(&dive->maxdepth, maxdepth); return dive; } @@ -143,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); @@ -174,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 @@ -205,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); }