diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2014-06-01 09:59:38 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-06-01 10:16:59 -0700 |
commit | 2a871d7fe5257adf5631cfb46f2dfa84cd2d9201 (patch) | |
tree | 2eaef80e7ab303bfb3a22fcebb40cb1abcb82906 | |
parent | f44a7509b3455492393874fe8a35bb3b564fee86 (diff) | |
download | subsurface-2a871d7fe5257adf5631cfb46f2dfa84cd2d9201.tar.gz |
Planner: track gas used even if we don't have a real cylinder
We tracked gas used by simulating a dive with a cylinder - but for that we
need a cylinder size and working pressure. If the user just enters a gas
but no cylinder data (likely in order to figure out how much gas is used
so that she then can pick a big enough cylinder), we didn't show any gas
consumption.
It kinda sucks to add another member to the cylinder structure, but this
seemed far more reasonable then some other, global structure that
independently tracks gas usage. This just seemed to make sense.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | dive.h | 1 | ||||
-rw-r--r-- | equipment.c | 4 | ||||
-rw-r--r-- | planner.c | 19 |
3 files changed, 13 insertions, 11 deletions
@@ -60,6 +60,7 @@ typedef struct pressure_t start, end, sample_start, sample_end; depth_t depth; bool used; + volume_t gas_used; } cylinder_t; typedef struct diff --git a/equipment.c b/equipment.c index 3111ed599..b69155629 100644 --- a/equipment.c +++ b/equipment.c @@ -56,7 +56,8 @@ bool cylinder_nodata(cylinder_t *cyl) !cyl->gasmix.o2.permille && !cyl->gasmix.he.permille && !cyl->start.mbar && - !cyl->end.mbar; + !cyl->end.mbar && + !cyl->gas_used.mliter; } static bool cylinder_nosamples(cylinder_t *cyl) @@ -197,5 +198,6 @@ void reset_cylinders(struct dive *dive) cyl->depth = gas_mod(&cyl->gasmix, pO2); if (cyl->type.workingpressure.mbar) cyl->start.mbar = cyl->end.mbar = cyl->type.workingpressure.mbar; + cyl->gas_used.mliter = 0; } } @@ -225,12 +225,15 @@ static void update_cylinder_pressure(struct dive *d, int old_depth, int new_dept pressure_t delta_p; depth_t mean_depth; - if (!cyl || !cyl->type.size.mliter) + if (!cyl) return; mean_depth.mm = (old_depth + new_depth) / 2; gas_used.mliter = depth_to_atm(mean_depth.mm, d) * sac / 60 * duration; - delta_p.mbar = gas_used.mliter * 1000.0 / cyl->type.size.mliter; - cyl->end.mbar -= delta_p.mbar; + cyl->gas_used.mliter += gas_used.mliter; + if (!cyl->type.size.mliter) { + delta_p.mbar = gas_used.mliter * 1000.0 / cyl->type.size.mliter; + cyl->end.mbar -= delta_p.mbar; + } } static struct dive *create_dive_from_plan(struct diveplan *diveplan, struct dive *master_dive) @@ -605,19 +608,15 @@ static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool break; len = strlen(buffer); get_gas_string(get_o2(&cyl->gasmix), get_he(&cyl->gasmix), gas, sizeof(gas)); - if (cyl->type.workingpressure.mbar) { - int consumed = mbar_to_atm(cyl->start.mbar - cyl->end.mbar) * cyl->type.size.mliter; - volume = get_volume_units(consumed, NULL, &unit); + volume = get_volume_units(cyl->gas_used.mliter, NULL, &unit); + if (cyl->type.size.mliter) { /* Warn if the plan uses more gas than is available in a cylinder * This only works if we have working pressure for the cylinder * 10bar is a made up number - but it seemed silly to pretend you could breathe cylinder down to 0 */ if (cyl->end.mbar < 10000) warning = translate("gettextFromC", "WARNING: this is more gas than available in the specified cylinder!"); - snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC", "%.0f%s of %s%s\n"), volume, unit, gas, warning); - } else { - fprintf(stderr, "we really should calculate the consumption even without cylinder data\n"); - snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC", "did not track volume for %s"), gas); } + snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC", "%.0f%s of %s%s\n"), volume, unit, gas, warning); } dive->notes = strdup(buffer); } |