2011-09-20 19:40:34 +00:00
|
|
|
|
/* equipment.c */
|
2011-09-09 15:38:48 +00:00
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
#include <time.h>
|
2013-10-06 15:55:58 +00:00
|
|
|
|
#include "gettext.h"
|
2011-09-09 15:38:48 +00:00
|
|
|
|
#include "dive.h"
|
|
|
|
|
#include "display.h"
|
|
|
|
|
#include "divelist.h"
|
|
|
|
|
|
2013-05-03 18:04:51 +00:00
|
|
|
|
/* placeholders for a few functions that we need to redesign for the Qt UI */
|
|
|
|
|
void add_cylinder_description(cylinder_type_t *type)
|
|
|
|
|
{
|
|
|
|
|
const char *desc;
|
2013-12-28 22:56:01 +00:00
|
|
|
|
int i;
|
2013-05-03 18:04:51 +00:00
|
|
|
|
|
|
|
|
|
desc = type->description;
|
|
|
|
|
if (!desc)
|
|
|
|
|
return;
|
2013-12-28 22:56:01 +00:00
|
|
|
|
for (i = 0; i < 100 && tank_info[i].name != NULL; i++) {
|
|
|
|
|
if (strcmp(tank_info[i].name, desc) == 0)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (i < 100) {
|
|
|
|
|
tank_info[i].name = desc;
|
|
|
|
|
tank_info[i].ml = type->size.mliter;
|
|
|
|
|
tank_info[i].bar = type->workingpressure.mbar / 1000;
|
|
|
|
|
}
|
2013-05-03 18:04:51 +00:00
|
|
|
|
}
|
|
|
|
|
void add_weightsystem_description(weightsystem_t *weightsystem)
|
|
|
|
|
{
|
|
|
|
|
const char *desc;
|
2013-09-10 18:42:26 +00:00
|
|
|
|
int i;
|
2013-05-03 18:04:51 +00:00
|
|
|
|
|
|
|
|
|
desc = weightsystem->description;
|
|
|
|
|
if (!desc)
|
|
|
|
|
return;
|
2013-09-10 18:42:26 +00:00
|
|
|
|
for (i = 0; i < 100 && ws_info[i].name != NULL; i++) {
|
|
|
|
|
if (strcmp(ws_info[i].name, desc) == 0) {
|
|
|
|
|
ws_info[i].grams = weightsystem->weight.grams;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (i < 100) {
|
|
|
|
|
ws_info[i].name = desc;
|
|
|
|
|
ws_info[i].grams = weightsystem->weight.grams;
|
|
|
|
|
}
|
2013-05-03 18:04:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
2013-10-05 07:29:09 +00:00
|
|
|
|
bool cylinder_nodata(cylinder_t *cyl)
|
2011-12-24 03:41:16 +00:00
|
|
|
|
{
|
2014-02-28 04:09:57 +00:00
|
|
|
|
return !cyl->type.size.mliter &&
|
|
|
|
|
!cyl->type.workingpressure.mbar &&
|
|
|
|
|
!cyl->type.description &&
|
|
|
|
|
!cyl->gasmix.o2.permille &&
|
|
|
|
|
!cyl->gasmix.he.permille &&
|
|
|
|
|
!cyl->start.mbar &&
|
2014-06-01 16:59:38 +00:00
|
|
|
|
!cyl->end.mbar &&
|
2014-07-01 07:37:49 +00:00
|
|
|
|
!cyl->gas_used.mliter &&
|
|
|
|
|
!cyl->deco_gas_used.mliter;
|
2011-10-02 20:13:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
2013-10-05 07:29:09 +00:00
|
|
|
|
static bool cylinder_nosamples(cylinder_t *cyl)
|
Fix missing save of (almost empty) cylinder information
If we have no explicit cylinder info at all (it's normal air, no size or
working pressure information, and no beginning/end pressure information),
we don't save the cylinders in question because that would be redundant.
Such non-saved cylinders may still show up in the equipment list because
there may be implicit mention of them elsewhere, notably due to sample
data, so not saving them is the right thing to do - there is nothing to
save.
However, we missed one case: if there were other cylinders that *did* have
explicit information in it following such an uninteresting cylinder, we do
need to save the cylinder information for the useless case - if only in
order to be able to save the non-useless information for subsequent
cylinders.
This patch does that. Now, if you had an air-filled cylinder with no
information as your first cylinder, and a 51% nitrox as your second one,
it will save that information as
<cylinder />
<cylinder o2='51.0%' />
rather than dropping the cylinder information entirely.
This bug has been there for a long time, and was hidden by the fact that
normally you'd fill in cylinder descriptions etc after importing new
dives. It also used to be that we saved the cylinder beginning/end
pressure even if that was generated from the sample data, so if you
imported from a air-integrated computer and had samples for that cylinder,
we used to save it even though it was technically redundant.
We stopped saving redundant air sample information in commit 0089dd8819b7
("Don't save cylinder start/end pressures unless set by hand").
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Removed start and end in save_cylinder_info(). These two variables are no
longer used.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-09-21 21:06:57 +00:00
|
|
|
|
{
|
2014-02-28 04:09:57 +00:00
|
|
|
|
return !cyl->sample_start.mbar &&
|
|
|
|
|
!cyl->sample_end.mbar;
|
Fix missing save of (almost empty) cylinder information
If we have no explicit cylinder info at all (it's normal air, no size or
working pressure information, and no beginning/end pressure information),
we don't save the cylinders in question because that would be redundant.
Such non-saved cylinders may still show up in the equipment list because
there may be implicit mention of them elsewhere, notably due to sample
data, so not saving them is the right thing to do - there is nothing to
save.
However, we missed one case: if there were other cylinders that *did* have
explicit information in it following such an uninteresting cylinder, we do
need to save the cylinder information for the useless case - if only in
order to be able to save the non-useless information for subsequent
cylinders.
This patch does that. Now, if you had an air-filled cylinder with no
information as your first cylinder, and a 51% nitrox as your second one,
it will save that information as
<cylinder />
<cylinder o2='51.0%' />
rather than dropping the cylinder information entirely.
This bug has been there for a long time, and was hidden by the fact that
normally you'd fill in cylinder descriptions etc after importing new
dives. It also used to be that we saved the cylinder beginning/end
pressure even if that was generated from the sample data, so if you
imported from a air-integrated computer and had samples for that cylinder,
we used to save it even though it was technically redundant.
We stopped saving redundant air sample information in commit 0089dd8819b7
("Don't save cylinder start/end pressures unless set by hand").
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Removed start and end in save_cylinder_info(). These two variables are no
longer used.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-09-21 21:06:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2013-10-05 07:29:09 +00:00
|
|
|
|
bool cylinder_none(void *_data)
|
Fix missing save of (almost empty) cylinder information
If we have no explicit cylinder info at all (it's normal air, no size or
working pressure information, and no beginning/end pressure information),
we don't save the cylinders in question because that would be redundant.
Such non-saved cylinders may still show up in the equipment list because
there may be implicit mention of them elsewhere, notably due to sample
data, so not saving them is the right thing to do - there is nothing to
save.
However, we missed one case: if there were other cylinders that *did* have
explicit information in it following such an uninteresting cylinder, we do
need to save the cylinder information for the useless case - if only in
order to be able to save the non-useless information for subsequent
cylinders.
This patch does that. Now, if you had an air-filled cylinder with no
information as your first cylinder, and a 51% nitrox as your second one,
it will save that information as
<cylinder />
<cylinder o2='51.0%' />
rather than dropping the cylinder information entirely.
This bug has been there for a long time, and was hidden by the fact that
normally you'd fill in cylinder descriptions etc after importing new
dives. It also used to be that we saved the cylinder beginning/end
pressure even if that was generated from the sample data, so if you
imported from a air-integrated computer and had samples for that cylinder,
we used to save it even though it was technically redundant.
We stopped saving redundant air sample information in commit 0089dd8819b7
("Don't save cylinder start/end pressures unless set by hand").
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Removed start and end in save_cylinder_info(). These two variables are no
longer used.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-09-21 21:06:57 +00:00
|
|
|
|
{
|
|
|
|
|
cylinder_t *cyl = _data;
|
|
|
|
|
return cylinder_nodata(cyl) && cylinder_nosamples(cyl);
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-01 19:38:32 +00:00
|
|
|
|
/* look at all dive computers and figure out if this cylinder is used anywhere
|
|
|
|
|
* d has to be a valid dive (test before calling)
|
|
|
|
|
* cyl does not have to be a cylinder that is part of this dive structure */
|
|
|
|
|
bool cylinder_is_used(struct dive *d, cylinder_t *cyl)
|
|
|
|
|
{
|
|
|
|
|
struct divecomputer *dc = &d->dc;
|
|
|
|
|
bool same_as_first = gasmix_distance(&cyl->gasmix, &d->cylinder[0].gasmix) < 200;
|
|
|
|
|
while (dc) {
|
|
|
|
|
struct event *ev = get_next_event(dc->events, "gaschange");
|
|
|
|
|
if (same_as_first && (!ev || ev->time.seconds > 30)) {
|
|
|
|
|
// unless there is a gas change in the first 30 seconds we can
|
|
|
|
|
// always mark the first cylinder as used
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
while (ev) {
|
|
|
|
|
if (gasmix_distance(&cyl->gasmix, get_gasmix_from_event(ev)) < 200)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
ev = get_next_event(ev->next, "gaschange");
|
|
|
|
|
}
|
|
|
|
|
dc = dc->next;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-02 03:56:29 +00:00
|
|
|
|
void get_gas_string(const struct gasmix *gasmix, char *text, int len)
|
|
|
|
|
{
|
|
|
|
|
if (gasmix_is_air(gasmix))
|
|
|
|
|
snprintf(text, len, "%s", translate("gettextFromC", "air"));
|
|
|
|
|
else if (get_he(gasmix) == 0)
|
|
|
|
|
snprintf(text, len, translate("gettextFromC", "EAN%d"), (get_o2(gasmix) + 5) / 10);
|
|
|
|
|
else
|
|
|
|
|
snprintf(text, len, "(%d/%d)", (get_o2(gasmix) + 5) / 10, (get_he(gasmix) + 5) / 10);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Returns a static char buffer - only good for immediate use by printf etc */
|
|
|
|
|
const char *gasname(const struct gasmix *gasmix)
|
|
|
|
|
{
|
|
|
|
|
static char gas[64];
|
|
|
|
|
get_gas_string(gasmix, gas, sizeof(gas));
|
|
|
|
|
return gas;
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-05 07:29:09 +00:00
|
|
|
|
bool weightsystem_none(void *_data)
|
2011-12-24 03:41:16 +00:00
|
|
|
|
{
|
|
|
|
|
weightsystem_t *ws = _data;
|
|
|
|
|
return !ws->weight.grams && !ws->description;
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-05 07:29:09 +00:00
|
|
|
|
bool no_weightsystems(weightsystem_t *ws)
|
2012-08-18 15:28:52 +00:00
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_WEIGHTSYSTEMS; i++)
|
|
|
|
|
if (!weightsystem_none(ws + i))
|
2014-01-15 18:54:41 +00:00
|
|
|
|
return false;
|
|
|
|
|
return true;
|
2012-08-18 15:28:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2013-10-05 07:29:09 +00:00
|
|
|
|
static bool one_weightsystem_equal(weightsystem_t *ws1, weightsystem_t *ws2)
|
2012-08-18 15:28:52 +00:00
|
|
|
|
{
|
|
|
|
|
return ws1->weight.grams == ws2->weight.grams &&
|
2014-05-06 21:08:17 +00:00
|
|
|
|
same_string(ws1->description, ws2->description);
|
2012-08-18 15:28:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2013-10-05 07:29:09 +00:00
|
|
|
|
bool weightsystems_equal(weightsystem_t *ws1, weightsystem_t *ws2)
|
2012-08-18 15:28:52 +00:00
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_WEIGHTSYSTEMS; i++)
|
|
|
|
|
if (!one_weightsystem_equal(ws1 + i, ws2 + i))
|
2014-01-15 18:54:41 +00:00
|
|
|
|
return false;
|
|
|
|
|
return true;
|
2012-08-18 15:28:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-09-11 00:14:07 +00:00
|
|
|
|
/*
|
|
|
|
|
* We hardcode the most common standard cylinders,
|
|
|
|
|
* we should pick up any other names from the dive
|
|
|
|
|
* logs directly.
|
|
|
|
|
*/
|
2013-09-10 18:44:49 +00:00
|
|
|
|
struct tank_info_t tank_info[100] = {
|
2011-09-11 00:14:07 +00:00
|
|
|
|
/* Need an empty entry for the no-cylinder case */
|
Clean up reference tank information table
This makes the reference tanks ("struct tank_info") use a saner format
which specifies explicitly whether the size is in ml or cubic feet, and
whether the pressure is in psi or bar.
So instead of having magic rules ("size is in cuft if < 1000, otherwise
mliter"), just set the size explicitly:
{ "11.1 l", .ml = 11100 },
{ "AL80", .cuft = 80, .psi = 3000 },
and then the code can just convert to standard measurements without any
odd rules, and the initialization table becomes self-explanatory too.
This is in preparation for doing the metric tanks with pressure: Henrik
Aronsen sent a really ugly patch using the previous setup, I just
couldn't stand the additional hackery.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-12-11 19:54:17 +00:00
|
|
|
|
{ "", },
|
2011-09-11 00:14:07 +00:00
|
|
|
|
|
|
|
|
|
/* Size-only metric cylinders */
|
2014-06-22 13:47:25 +00:00
|
|
|
|
{ "10.0ℓ", .ml = 10000 },
|
|
|
|
|
{ "11.1ℓ", .ml = 11100 },
|
2011-09-11 00:14:07 +00:00
|
|
|
|
|
|
|
|
|
/* Most common AL cylinders */
|
2014-02-28 04:09:57 +00:00
|
|
|
|
{ "AL40", .cuft = 40, .psi = 3000 },
|
|
|
|
|
{ "AL50", .cuft = 50, .psi = 3000 },
|
|
|
|
|
{ "AL63", .cuft = 63, .psi = 3000 },
|
|
|
|
|
{ "AL72", .cuft = 72, .psi = 3000 },
|
|
|
|
|
{ "AL80", .cuft = 80, .psi = 3000 },
|
Clean up reference tank information table
This makes the reference tanks ("struct tank_info") use a saner format
which specifies explicitly whether the size is in ml or cubic feet, and
whether the pressure is in psi or bar.
So instead of having magic rules ("size is in cuft if < 1000, otherwise
mliter"), just set the size explicitly:
{ "11.1 l", .ml = 11100 },
{ "AL80", .cuft = 80, .psi = 3000 },
and then the code can just convert to standard measurements without any
odd rules, and the initialization table becomes self-explanatory too.
This is in preparation for doing the metric tanks with pressure: Henrik
Aronsen sent a really ugly patch using the previous setup, I just
couldn't stand the additional hackery.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-12-11 19:54:17 +00:00
|
|
|
|
{ "AL100", .cuft = 100, .psi = 3300 },
|
2011-09-11 00:14:07 +00:00
|
|
|
|
|
2014-06-25 08:43:03 +00:00
|
|
|
|
/* Metric AL cylinders */
|
|
|
|
|
{ "ALU7", .ml = 7000, .bar = 200 },
|
|
|
|
|
|
2011-09-11 00:14:07 +00:00
|
|
|
|
/* Somewhat common LP steel cylinders */
|
2014-02-28 04:09:57 +00:00
|
|
|
|
{ "LP85", .cuft = 85, .psi = 2640 },
|
|
|
|
|
{ "LP95", .cuft = 95, .psi = 2640 },
|
2012-04-01 22:38:52 +00:00
|
|
|
|
{ "LP108", .cuft = 108, .psi = 2640 },
|
|
|
|
|
{ "LP121", .cuft = 121, .psi = 2640 },
|
2011-09-11 00:14:07 +00:00
|
|
|
|
|
|
|
|
|
/* Somewhat common HP steel cylinders */
|
2014-02-28 04:09:57 +00:00
|
|
|
|
{ "HP65", .cuft = 65, .psi = 3442 },
|
|
|
|
|
{ "HP80", .cuft = 80, .psi = 3442 },
|
Clean up reference tank information table
This makes the reference tanks ("struct tank_info") use a saner format
which specifies explicitly whether the size is in ml or cubic feet, and
whether the pressure is in psi or bar.
So instead of having magic rules ("size is in cuft if < 1000, otherwise
mliter"), just set the size explicitly:
{ "11.1 l", .ml = 11100 },
{ "AL80", .cuft = 80, .psi = 3000 },
and then the code can just convert to standard measurements without any
odd rules, and the initialization table becomes self-explanatory too.
This is in preparation for doing the metric tanks with pressure: Henrik
Aronsen sent a really ugly patch using the previous setup, I just
couldn't stand the additional hackery.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-12-11 19:54:17 +00:00
|
|
|
|
{ "HP100", .cuft = 100, .psi = 3442 },
|
|
|
|
|
{ "HP119", .cuft = 119, .psi = 3442 },
|
|
|
|
|
{ "HP130", .cuft = 130, .psi = 3442 },
|
2011-09-11 00:14:07 +00:00
|
|
|
|
|
2011-12-11 20:03:55 +00:00
|
|
|
|
/* Common European steel cylinders */
|
2014-06-22 13:47:25 +00:00
|
|
|
|
{ "3ℓ 232 bar", .ml = 3000, .bar = 232 },
|
|
|
|
|
{ "3ℓ 300 bar", .ml = 3000, .bar = 300 },
|
|
|
|
|
{ "10ℓ 300 bar", .ml = 10000, .bar = 300 },
|
|
|
|
|
{ "12ℓ 200 bar", .ml = 12000, .bar = 200 },
|
|
|
|
|
{ "12ℓ 232 bar", .ml = 12000, .bar = 232 },
|
|
|
|
|
{ "12ℓ 300 bar", .ml = 12000, .bar = 300 },
|
|
|
|
|
{ "15ℓ 200 bar", .ml = 15000, .bar = 200 },
|
|
|
|
|
{ "15ℓ 232 bar", .ml = 15000, .bar = 232 },
|
2014-02-28 04:09:57 +00:00
|
|
|
|
{ "D7 300 bar", .ml = 14000, .bar = 300 },
|
2011-12-11 20:03:55 +00:00
|
|
|
|
{ "D8.5 232 bar", .ml = 17000, .bar = 232 },
|
2014-02-28 04:09:57 +00:00
|
|
|
|
{ "D12 232 bar", .ml = 24000, .bar = 232 },
|
2011-12-11 20:03:55 +00:00
|
|
|
|
|
2011-09-11 00:14:07 +00:00
|
|
|
|
/* We'll fill in more from the dive log dynamically */
|
2011-09-09 15:38:48 +00:00
|
|
|
|
{ NULL, }
|
|
|
|
|
};
|
|
|
|
|
|
2011-12-24 03:41:16 +00:00
|
|
|
|
/*
|
|
|
|
|
* We hardcode the most common weight system types
|
|
|
|
|
* This is a bit odd as the weight system types don't usually encode weight
|
|
|
|
|
*/
|
2013-09-10 18:44:49 +00:00
|
|
|
|
struct ws_info_t ws_info[100] = {
|
2014-02-28 04:09:57 +00:00
|
|
|
|
{ QT_TRANSLATE_NOOP("gettextFromC", "integrated"), 0 },
|
|
|
|
|
{ QT_TRANSLATE_NOOP("gettextFromC", "belt"), 0 },
|
|
|
|
|
{ QT_TRANSLATE_NOOP("gettextFromC", "ankle"), 0 },
|
|
|
|
|
{ QT_TRANSLATE_NOOP("gettextFromC", "backplate weight"), 0 },
|
|
|
|
|
{ QT_TRANSLATE_NOOP("gettextFromC", "clip-on"), 0 },
|
2011-12-24 03:41:16 +00:00
|
|
|
|
};
|
|
|
|
|
|
2013-05-22 17:02:28 +00:00
|
|
|
|
void remove_cylinder(struct dive *dive, int idx)
|
|
|
|
|
{
|
|
|
|
|
cylinder_t *cyl = dive->cylinder + idx;
|
|
|
|
|
int nr = MAX_CYLINDERS - idx - 1;
|
|
|
|
|
memmove(cyl, cyl + 1, nr * sizeof(*cyl));
|
|
|
|
|
memset(cyl + nr, 0, sizeof(*cyl));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void remove_weightsystem(struct dive *dive, int idx)
|
|
|
|
|
{
|
|
|
|
|
weightsystem_t *ws = dive->weightsystem + idx;
|
|
|
|
|
int nr = MAX_WEIGHTSYSTEMS - idx - 1;
|
|
|
|
|
memmove(ws, ws + 1, nr * sizeof(*ws));
|
|
|
|
|
memset(ws + nr, 0, sizeof(*ws));
|
|
|
|
|
}
|
2014-05-29 21:36:14 +00:00
|
|
|
|
|
2014-05-30 16:10:35 +00:00
|
|
|
|
/* when planning a dive we need to make sure that all cylinders have a sane depth assigned
|
2014-07-04 18:40:02 +00:00
|
|
|
|
* and if we are tracking gas consumption the pressures need to be reset to start = end = workingpressure */
|
|
|
|
|
void reset_cylinders(struct dive *dive, bool track_gas)
|
2014-05-29 21:36:14 +00:00
|
|
|
|
{
|
|
|
|
|
int i;
|
2014-05-30 16:10:35 +00:00
|
|
|
|
pressure_t pO2 = {.mbar = 1400};
|
|
|
|
|
|
2014-05-29 21:36:14 +00:00
|
|
|
|
for (i = 0; i < MAX_CYLINDERS; i++) {
|
2014-05-30 16:10:35 +00:00
|
|
|
|
cylinder_t *cyl = &dive->cylinder[i];
|
|
|
|
|
if (cylinder_none(cyl))
|
|
|
|
|
continue;
|
|
|
|
|
if (cyl->depth.mm == 0) /* if the gas doesn't give a mod, assume conservative pO2 */
|
2014-06-25 13:36:30 +00:00
|
|
|
|
cyl->depth = gas_mod(&cyl->gasmix, pO2, M_OR_FT(3,10));
|
2014-07-04 18:40:02 +00:00
|
|
|
|
if (track_gas && cyl->type.workingpressure.mbar)
|
2014-05-30 16:10:35 +00:00
|
|
|
|
cyl->start.mbar = cyl->end.mbar = cyl->type.workingpressure.mbar;
|
2014-06-01 16:59:38 +00:00
|
|
|
|
cyl->gas_used.mliter = 0;
|
2014-07-05 14:49:06 +00:00
|
|
|
|
cyl->deco_gas_used.mliter = 0;
|
2014-05-29 21:36:14 +00:00
|
|
|
|
}
|
|
|
|
|
}
|