summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorGravatar Robert C. Helling <helling@atdotde.de>2017-02-02 10:56:22 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2017-02-02 12:35:58 -0800
commit99595542ec61a28153ce9d39ef47e913961c1dfc (patch)
tree1a0ef1647e1346db589841a81bbff0525fbe4342 /core
parentbc8c9f4c6f258b74de72b12ab88e54460b0d0516 (diff)
downloadsubsurface-99595542ec61a28153ce9d39ef47e913961c1dfc.tar.gz
Handle more tanks than gasmixes
When Suunto Vytecs are used in gauge mode they don't record gasmixes. If a tank pressure sensor is present they nevertheless record the pressures. This patch handles this situation by assuming the tanks contain air (and warning the user about this). Reported-by: antonnorth@gmail.com Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'core')
-rw-r--r--core/libdivecomputer.c62
1 files changed, 35 insertions, 27 deletions
diff --git a/core/libdivecomputer.c b/core/libdivecomputer.c
index 7ccc7a491..1ad4a635b 100644
--- a/core/libdivecomputer.c
+++ b/core/libdivecomputer.c
@@ -94,45 +94,53 @@ static int parse_gasmixes(device_data_t *devdata, struct dive *dive, dc_parser_t
unsigned int ntanks = 0;
rc = dc_parser_get_field(parser, DC_FIELD_TANK_COUNT, 0, &ntanks);
if (rc == DC_STATUS_SUCCESS) {
- if (ntanks && ntanks != ngases) {
+ if (ntanks && ntanks < ngases) {
shown_warning = true;
- report_error("different number of gases (%d) and tanks (%d)", ngases, ntanks);
+ report_error("Warning: different number of gases (%d) and tanks (%d)", ngases, ntanks);
+ } else if (ntanks > ngases) {
+ shown_warning = true;
+ report_error("Warning: smaller number of gases (%d) than tanks (%d). Assuming air.", ngases, ntanks);
}
}
#endif
+ bool no_volume = true;
- for (i = 0; i < ngases; i++) {
- dc_gasmix_t gasmix = { 0 };
- int o2, he;
- bool no_volume = true;
+ for (i = 0; i < ngases || i < ntanks; i++) {
+ if (i < ngases) {
+ dc_gasmix_t gasmix = { 0 };
+ int o2, he;
- rc = dc_parser_get_field(parser, DC_FIELD_GASMIX, i, &gasmix);
- if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED)
- return rc;
+ rc = dc_parser_get_field(parser, DC_FIELD_GASMIX, i, &gasmix);
+ if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED)
+ return rc;
- if (i >= MAX_CYLINDERS)
- continue;
+ if (i >= MAX_CYLINDERS)
+ continue;
- o2 = rint(gasmix.oxygen * 1000);
- he = rint(gasmix.helium * 1000);
+ o2 = rint(gasmix.oxygen * 1000);
+ he = rint(gasmix.helium * 1000);
- /* Ignore bogus data - libdivecomputer does some crazy stuff */
- if (o2 + he <= O2_IN_AIR || o2 > 1000) {
- if (!shown_warning) {
- shown_warning = true;
- report_error("unlikely dive gas data from libdivecomputer: o2 = %d he = %d", o2, he);
+ /* Ignore bogus data - libdivecomputer does some crazy stuff */
+ if (o2 + he <= O2_IN_AIR || o2 > 1000) {
+ if (!shown_warning) {
+ shown_warning = true;
+ report_error("unlikely dive gas data from libdivecomputer: o2 = %d he = %d", o2, he);
+ }
+ o2 = 0;
}
- o2 = 0;
- }
- if (he < 0 || o2 + he > 1000) {
- if (!shown_warning) {
- shown_warning = true;
- report_error("unlikely dive gas data from libdivecomputer: o2 = %d he = %d", o2, he);
+ if (he < 0 || o2 + he > 1000) {
+ if (!shown_warning) {
+ shown_warning = true;
+ report_error("unlikely dive gas data from libdivecomputer: o2 = %d he = %d", o2, he);
+ }
+ he = 0;
}
- he = 0;
+ dive->cylinder[i].gasmix.o2.permille = o2;
+ dive->cylinder[i].gasmix.he.permille = he;
+ } else {
+ dive->cylinder[i].gasmix.o2.permille = 0;
+ dive->cylinder[i].gasmix.he.permille = 0;
}
- dive->cylinder[i].gasmix.o2.permille = o2;
- dive->cylinder[i].gasmix.he.permille = he;
#if DC_VERSION_CHECK(0, 5, 0) && defined(DC_GASMIX_UNKNOWN)
if (i < ntanks) {