From cd72516668ca1504af482c5c3f129b0692aecf4c Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Mon, 30 May 2022 12:16:37 -0700 Subject: [PATCH] Garmin: decode divemode The code used sub_sport to figure out if this was a dive in the first place, but then never reported back the specific dive mode, leading to all dives being interpreted as open circuit. Reported-By: Anton van Rosmalen Signed-off-by: Dirk Hohndel --- src/garmin_parser.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/garmin_parser.c b/src/garmin_parser.c index 7431547..2477dbb 100644 --- a/src/garmin_parser.c +++ b/src/garmin_parser.c @@ -564,7 +564,21 @@ DECLARE_FIELD(DEVICE_INFO, firmware, UINT16) } // SPORT -DECLARE_FIELD(SPORT, sub_sport, ENUM) { garmin->dive.sub_sport = (ENUM) data; } +DECLARE_FIELD(SPORT, sub_sport, ENUM) { + garmin->dive.sub_sport = (ENUM) data; + dc_divemode_t val; + switch (data) { + case 55: val = DC_DIVEMODE_GAUGE; + break; + case 56: + case 57: val = DC_DIVEMODE_FREEDIVE; + break; + case 63: val = DC_DIVEMODE_CCR; + break; + default: val = DC_DIVEMODE_OC; + } + DC_ASSIGN_FIELD(garmin->cache, DIVEMODE, val); +} // DIVE_GAS - uses msg index DECLARE_FIELD(DIVE_GAS, helium, UINT8) @@ -1502,7 +1516,7 @@ garmin_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned i case DC_FIELD_ATMOSPHERIC: return DC_STATUS_UNSUPPORTED; case DC_FIELD_DIVEMODE: - return DC_STATUS_UNSUPPORTED; + return DC_FIELD_VALUE(garmin->cache, value, DIVEMODE); case DC_FIELD_TANK: return DC_STATUS_UNSUPPORTED; case DC_FIELD_STRING: