From 7278a70afe8e61ad3beaebeb179b1c9966f0e991 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sun, 3 May 2015 20:13:04 +0200 Subject: [PATCH] Implement the tank and temperature fields. --- src/suunto_eon_parser.c | 36 ++++++++++++++++++++++++++++++++---- src/suunto_vyper_parser.c | 20 ++++++++++++++++++++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/suunto_eon_parser.c b/src/suunto_eon_parser.c index 2ebe800..ad21b94 100644 --- a/src/suunto_eon_parser.c +++ b/src/suunto_eon_parser.c @@ -208,6 +208,17 @@ suunto_eon_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsign return rc; dc_gasmix_t *gasmix = (dc_gasmix_t *) value; + dc_tank_t *tank = (dc_tank_t *) value; + + unsigned int oxygen = 21; + unsigned int beginpressure = 0; + unsigned int endpressure = 0; + if (parser->nitrox) { + oxygen = data[0x05]; + } else { + beginpressure = data[5] * 2; + endpressure = data[parser->marker + 2] * 2; + } if (value) { switch (type) { @@ -222,12 +233,29 @@ suunto_eon_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsign break; case DC_FIELD_GASMIX: gasmix->helium = 0.0; - if (parser->nitrox) - gasmix->oxygen = data[0x05] / 100.0; - else - gasmix->oxygen = 0.21; + gasmix->oxygen = oxygen / 100.0; gasmix->nitrogen = 1.0 - gasmix->oxygen - gasmix->helium; break; + case DC_FIELD_TANK_COUNT: + if (beginpressure == 0 && endpressure == 0) + *((unsigned int *) value) = 0; + else + *((unsigned int *) value) = 1; + break; + case DC_FIELD_TANK: + tank->type = DC_TANKVOLUME_NONE; + tank->volume = 0.0; + tank->workpressure = 0.0; + tank->gasmix = 0; + tank->beginpressure = beginpressure; + tank->endpressure = endpressure; + break; + case DC_FIELD_TEMPERATURE_MINIMUM: + if (parser->spyder) + *((double *) value) = (signed char) data[parser->marker + 1]; + else + *((double *) value) = data[parser->marker + 1] - 40; + break; default: return DC_STATUS_UNSUPPORTED; } diff --git a/src/suunto_vyper_parser.c b/src/suunto_vyper_parser.c index 69f0b90..dafcf16 100644 --- a/src/suunto_vyper_parser.c +++ b/src/suunto_vyper_parser.c @@ -237,6 +237,7 @@ suunto_vyper_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi unsigned int size = abstract->size; dc_gasmix_t *gas = (dc_gasmix_t *) value; + dc_tank_t *tank = (dc_tank_t *) value; // Cache the data. dc_status_t rc = suunto_vyper_parser_cache (parser); @@ -244,6 +245,8 @@ suunto_vyper_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi return rc; unsigned int gauge = data[4] & 0x40; + unsigned int beginpressure = data[5] * 2; + unsigned int endpressure = data[parser->marker + 3] * 2; if (value) { switch (type) { @@ -264,6 +267,23 @@ suunto_vyper_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi gas->oxygen = parser->oxygen[flags] / 100.0; gas->nitrogen = 1.0 - gas->oxygen - gas->helium; break; + case DC_FIELD_TANK_COUNT: + if (beginpressure == 0 && endpressure == 0) + *((unsigned int *) value) = 0; + else + *((unsigned int *) value) = 1; + break; + case DC_FIELD_TANK: + tank->type = DC_TANKVOLUME_NONE; + tank->volume = 0.0; + tank->workpressure = 0.0; + if (gauge) + tank->gasmix = DC_GASMIX_UNKNOWN; + else + tank->gasmix = 0; + tank->beginpressure = beginpressure; + tank->endpressure = endpressure; + break; case DC_FIELD_TEMPERATURE_SURFACE: *((double *) value) = (signed char) data[8]; break;