From 643b4271f6289a781bb980e1260077c1b68c9d5b Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 17 Aug 2021 08:14:40 -1000 Subject: [PATCH] EON Steel: support new gas change data from newer firmware It seems that Suunto extended the gas change information in FW 2.5, and added events and fields for when you create and delete gas mixes under water. The parses the relevant new information to get gas switches working again, and to also add the information about gas creation and deletion events. Signed-off-by: Linus Torvalds --- src/suunto_eonsteel_parser.c | 71 ++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/suunto_eonsteel_parser.c b/src/suunto_eonsteel_parser.c index 326ee5d..853b48f 100644 --- a/src/suunto_eonsteel_parser.c +++ b/src/suunto_eonsteel_parser.c @@ -19,6 +19,7 @@ * MA 02110-1301 USA */ +#include // snprintf #include #include #include @@ -60,6 +61,8 @@ enum eon_sample { ES_setpoint_po2, // uint32 ES_setpoint_automatic, // bool ES_bookmark, + ES_insertgas, // uint16 + ES_removegas, // uint16 }; #define EON_MAX_GROUP 16 @@ -111,6 +114,9 @@ static const struct { { "Events.SetPoint.Automatic", ES_setpoint_automatic }, { "Events.DiveTimer.Active", ES_none }, { "Events.DiveTimer.Time", ES_none }, + { "Events+GasSwitch.GasNumber", ES_gasswitch }, + { "Events+GasEdit.InsertGasNumber", ES_insertgas }, + { "Events+GasEdit.RemoveGasNumber", ES_removegas }, }; static enum eon_sample lookup_descriptor_type(suunto_eonsteel_parser_t *eon, struct type_desc *desc) @@ -581,6 +587,63 @@ static void sample_gas_switch_event(struct sample_data *info, unsigned short idx if (info->callback) info->callback(DC_SAMPLE_GASMIX, sample, info->userdata); } +static const char *mixname(suunto_eonsteel_parser_t *eon, int idx) +{ + dc_gasmix_t *mix; + static char name[32]; + int o2, he; + + if (idx < 1 || idx > MAXGASES) + return "invalid"; + + mix = &eon->cache.GASMIX[idx-1]; + o2 = lrint(mix->oxygen * 100); + he = lrint(mix->helium * 100); + if (he) { + snprintf(name, sizeof(name), "%d/%d", o2, he); + return name; + } + if (o2 && o2 != 21) { + snprintf(name, sizeof(name), "NX%d", o2); + return name; + } + return "air"; +} + +static void sample_insert_gas_event(struct sample_data *info, unsigned short idx) +{ + suunto_eonsteel_parser_t *eon = info->eon; + dc_sample_value_t sample = {0}; + char event[32]; + + if (!info->callback) + return; + + snprintf(event, sizeof(event), "Create gas %d (%s)", idx, mixname(eon, idx)); + sample.event.type = SAMPLE_EVENT_STRING; + sample.event.name = strdup(event); + sample.event.flags = SAMPLE_FLAGS_SEVERITY_INFO; + + info->callback(DC_SAMPLE_EVENT, sample, info->userdata); +} + +static void sample_remove_gas_event(struct sample_data *info, unsigned short idx) +{ + suunto_eonsteel_parser_t *eon = info->eon; + dc_sample_value_t sample = {0}; + char event[32]; + + if (!info->callback) + return; + + snprintf(event, sizeof(event), "Remove gas %d (%s)", idx, mixname(eon, idx)); + sample.event.type = SAMPLE_EVENT_STRING; + sample.event.name = strdup(event); + sample.event.flags = SAMPLE_FLAGS_SEVERITY_INFO; + + info->callback(DC_SAMPLE_EVENT, sample, info->userdata); +} + /* * Look up the string from an enumeration. * @@ -886,6 +949,14 @@ static unsigned int handle_sample_type(const struct type_desc *desc, struct samp sample_setpoint_automatic(info, data[0]); return 1; + case ES_insertgas: + sample_insert_gas_event(info, array_uint16_le(data)); + return 2; + + case ES_removegas: + sample_remove_gas_event(info, array_uint16_le(data)); + return 2; + default: return 0; }