diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2013-02-08 17:48:07 +1100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-02-08 17:48:07 +1100 |
commit | 9846ba9e945c59062463fd43ed09eb73b5a528c8 (patch) | |
tree | 499d3784002a0fbec96e9b7231b888dd9dfbbd6e /divelist.c | |
parent | 5692131a79f2adcfabc30804ccac62e077df402d (diff) | |
download | subsurface-9846ba9e945c59062463fd43ed09eb73b5a528c8.tar.gz |
Duration of a dive is the maximum duration from all divecomputers
So far we always used the duration of the first divecomputer. The same fix
needs to be done for some of the other calculations that always use the
first divecomputer.
This commit also removes some obsolete code from the webservice merging.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'divelist.c')
-rw-r--r-- | divelist.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/divelist.c b/divelist.c index 7dfe76328..825c372ed 100644 --- a/divelist.c +++ b/divelist.c @@ -638,11 +638,12 @@ static int active_o2(struct dive *dive, struct divecomputer *dc, duration_t time return o2permille; } -/* calculate OTU for a dive */ -static int calculate_otu(struct dive *dive, struct divecomputer *dc) +/* calculate OTU for a dive - this only takes the first diveomputer into account */ +static int calculate_otu(struct dive *dive) { int i; double otu = 0.0; + struct divecomputer *dc = &dive->dc; for (i = 1; i < dc->samples; i++) { int t; @@ -688,19 +689,22 @@ static double calculate_airuse(struct dive *dive) return airuse; } -static int calculate_sac(struct dive *dive, struct divecomputer *dc) +/* this only uses the first divecomputer to calculate the SAC rate */ +static int calculate_sac(struct dive *dive) { + struct divecomputer *dc = &dive->dc; double airuse, pressure, sac; int duration, i; airuse = calculate_airuse(dive); if (!airuse) return 0; - if (!dive->dc.duration.seconds) + duration = dc->duration.seconds; + if (!duration) return 0; /* find and eliminate long surface intervals */ - duration = dive->dc.duration.seconds; + for (i = 0; i < dc->samples; i++) { if (dc->sample[i].depth.mm < 100) { /* less than 10cm */ int end = i + 1; @@ -776,10 +780,10 @@ double init_decompression(struct dive *dive) * for how far back we need to go */ if (dive->divetrip && pdive->divetrip != dive->divetrip) continue; - if (!pdive || pdive->when > when || pdive->when + pdive->dc.duration.seconds + 48 * 60 * 60 < when) + if (!pdive || pdive->when > when || pdive->when + get_duration_in_sec(pdive) + 48 * 60 * 60 < when) break; when = pdive->when; - lasttime = when + pdive->dc.duration.seconds; + lasttime = when + get_duration_in_sec(pdive); } while (++i < divenr) { struct dive* pdive = get_dive(i); @@ -801,7 +805,7 @@ double init_decompression(struct dive *dive) #endif if (pdive->when > lasttime) { surface_time = pdive->when - lasttime; - lasttime = pdive->when + pdive->dc.duration.seconds; + lasttime = pdive->when + get_duration_in_sec(pdive); tissue_tolerance = add_segment(surface_pressure, &air, surface_time, 0, dive); #if DECO_CALC_DEBUG & 2 printf("after surface intervall of %d:%02u\n", FRACTION(surface_time,60)); @@ -833,8 +837,8 @@ double init_decompression(struct dive *dive) void update_cylinder_related_info(struct dive *dive) { if (dive != NULL) { - dive->sac = calculate_sac(dive, &dive->dc); - dive->otu = calculate_otu(dive, &dive->dc); + dive->sac = calculate_sac(dive); + dive->otu = calculate_otu(dive); } } @@ -1314,7 +1318,7 @@ static void fill_dive_list(void) DIVE_NR, dive->number, DIVE_DATE, dive->when, DIVE_DEPTH, dive->dc.maxdepth, - DIVE_DURATION, dive->dc.duration.seconds, + DIVE_DURATION, get_duration_in_sec(dive), DIVE_LOCATION, dive->location, DIVE_LOC_ICON, icon, DIVE_RATING, dive->rating, @@ -1327,7 +1331,7 @@ static void fill_dive_list(void) DIVE_NR, dive->number, DIVE_DATE, dive->when, DIVE_DEPTH, dive->dc.maxdepth, - DIVE_DURATION, dive->dc.duration.seconds, + DIVE_DURATION, get_duration_in_sec(dive), DIVE_LOCATION, dive->location, DIVE_LOC_ICON, icon, DIVE_RATING, dive->rating, @@ -2357,7 +2361,7 @@ static void add_dive_merge_label(int idx, GtkMenuShell *menu) return; /* .. and if the surface interval is excessive, you must be kidding us */ - if (b->when > a->when + a->dc.duration.seconds + 30*60) + if (b->when > a->when + get_duration_in_sec(a) + 30*60) return; /* If so, we can add a "merge dive" menu entry */ |