diff options
author | Robert C. Helling <helling@atdotde.de> | 2017-02-02 10:56:22 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2017-02-02 12:35:58 -0800 |
commit | 99595542ec61a28153ce9d39ef47e913961c1dfc (patch) | |
tree | 1a0ef1647e1346db589841a81bbff0525fbe4342 | |
parent | bc8c9f4c6f258b74de72b12ab88e54460b0d0516 (diff) | |
download | subsurface-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>
-rw-r--r-- | core/libdivecomputer.c | 62 |
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) { |