[PATCH 4/4] Add EON Steel bookmarks, warnings and alarm events
Linus Torvalds
torvalds at linux-foundation.org
Sat Jan 3 16:34:42 PST 2015
From: Linus Torvalds <torvalds at linux-foundation.org>
Date: Sat, 3 Jan 2015 16:25:19 -0800
Subject: [PATCH 4/4] Add EON Steel bookmarks, warnings and alarm events
I'd missed these because I'm blind. But mostly because they aren't as common.
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
---
There is no really good way to distinguish between "notification",
"warning" and "alarm" in libdivecomputer. Sometimes there are sane middle
grounds (ie a "notification" of a safety stop is would be the "voluntary"
version, while a warning would be a "mandatory" one). But how to
distinguish between a deep stop ceiling violation notification vs warning
vs alarm?
Anyway, these translations really aren't wonderful, and some things
aren'ty translated at all (ie they translate to SAMPLE_EVENT_NONE). But
they make *some* amount of sense.
As usual, I'd be happier with a string-based model, rather than the crazy
enumeration constants that don't make any sense and are too limited
anyway.
But now I think I *really* have all the core EON Steel data translated.
src/suunto_eonsteel_parser.c | 101 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 98 insertions(+), 3 deletions(-)
diff --git a/src/suunto_eonsteel_parser.c b/src/suunto_eonsteel_parser.c
index a31c1a7e9b68..d5fe9f8ca7f2 100644
--- a/src/suunto_eonsteel_parser.c
+++ b/src/suunto_eonsteel_parser.c
@@ -229,6 +229,7 @@ struct sample_data {
void *userdata;
unsigned int time;
unsigned char state_type, notify_type;
+ unsigned char warning_type, alarm_type;
};
static void sample_time(struct sample_data *info, unsigned short time_delta)
@@ -292,6 +293,17 @@ static void sample_cylinder_pressure(struct sample_data *info, unsigned char idx
if (info->callback) info->callback(DC_SAMPLE_PRESSURE, sample, info->userdata);
}
+static void sample_bookmark_event(struct sample_data *info, unsigned short idx)
+{
+ suunto_eonsteel_parser_t *eon = info->eon;
+ dc_sample_value_t sample = {0};
+
+ sample.event.type = SAMPLE_EVENT_BOOKMARK;
+ sample.event.value = idx;
+
+ if (info->callback) info->callback(DC_SAMPLE_EVENT, sample, info->userdata);
+}
+
static void sample_gas_switch_event(struct sample_data *info, unsigned short idx)
{
suunto_eonsteel_parser_t *eon = info->eon;
@@ -312,8 +324,8 @@ static void sample_gas_switch_event(struct sample_data *info, unsigned short idx
}
/*
- * The EON Steel has two different sample events: "state" and "notification".
- * Both end up having two fields: type and a boolean value.
+ * The EON Steel has four different sample events: "state", "notification",
+ * "warning" and "alarm". All end up having two fields: type and a boolean value.
*
* The type enumerations are available as part of the type descriptor, and we
* *should* probably parse them dynamically, but this hardcodes the different
@@ -363,7 +375,7 @@ static void sample_event_notify_value(struct sample_data *info, unsigned char va
SAMPLE_EVENT_TISSUELEVEL, // 3=Tissue Level
SAMPLE_EVENT_NONE, // 4=Deco
SAMPLE_EVENT_NONE, // 5=Deco Window
- SAMPLE_EVENT_SAFETYSTOP_MANDATORY, // 6=Safety Stop Ahead
+ SAMPLE_EVENT_SAFETYSTOP_VOLUNTARY, // 6=Safety Stop Ahead
SAMPLE_EVENT_SAFETYSTOP, // 7=Safety Stop
SAMPLE_EVENT_CEILING_SAFETYSTOP, // 8=Safety Stop Broken
SAMPLE_EVENT_NONE, // 9=Deep Stop Ahead
@@ -387,6 +399,74 @@ static void sample_event_notify_value(struct sample_data *info, unsigned char va
}
+static void sample_event_warning_type(struct sample_data *info, unsigned char type)
+{
+ info->warning_type = type;
+}
+
+
+static void sample_event_warning_value(struct sample_data *info, unsigned char value)
+{
+ dc_sample_value_t sample = {0};
+ static const enum parser_sample_event_t translate_warning[] = {
+ SAMPLE_EVENT_NONE, // 0=ICD Penalty ("Isobaric counterdiffusion")
+ SAMPLE_EVENT_VIOLATION, // 1=Deep Stop Penalty
+ SAMPLE_EVENT_SAFETYSTOP_MANDATORY, // 2=Mandatory Safety Stop
+ SAMPLE_EVENT_NONE, // 3=OTU250
+ SAMPLE_EVENT_NONE, // 4=OTU300
+ SAMPLE_EVENT_NONE, // 5=CNS80%
+ SAMPLE_EVENT_NONE, // 6=CNS100%
+ SAMPLE_EVENT_AIRTIME, // 7=Air Time
+ SAMPLE_EVENT_MAXDEPTH, // 8=Max.Depth
+ SAMPLE_EVENT_AIRTIME, // 9=Tank Pressure
+ SAMPLE_EVENT_CEILING_SAFETYSTOP, // 10=Safety Stop Broken
+ SAMPLE_EVENT_CEILING_SAFETYSTOP, // 11=Deep Stop Broken
+ SAMPLE_EVENT_CEILING, // 12=Ceiling Broken
+ SAMPLE_EVENT_PO2, // 13=PO2 High
+ };
+
+ if (info->warning_type > 13)
+ return;
+
+ sample.event.type = translate_warning[info->warning_type];
+ if (sample.event.type == SAMPLE_EVENT_NONE)
+ return;
+
+ sample.event.value = value ? SAMPLE_FLAGS_BEGIN : SAMPLE_FLAGS_END;
+ if (info->callback) info->callback(DC_SAMPLE_EVENT, sample, info->userdata);
+}
+
+static void sample_event_alarm_type(struct sample_data *info, unsigned char type)
+{
+ info->alarm_type = type;
+}
+
+
+static void sample_event_alarm_value(struct sample_data *info, unsigned char value)
+{
+ dc_sample_value_t sample = {0};
+ static const enum parser_sample_event_t translate_alarm[] = {
+ SAMPLE_EVENT_CEILING_SAFETYSTOP, // 0=Mandatory Safety Stop Broken
+ SAMPLE_EVENT_ASCENT, // 1=Ascent Speed
+ SAMPLE_EVENT_NONE, // 2=Diluent Hyperoxia
+ SAMPLE_EVENT_VIOLATION, // 3=Violated Deep Stop
+ SAMPLE_EVENT_CEILING, // 4=Ceiling Broken
+ SAMPLE_EVENT_PO2, // 5=PO2 High
+ SAMPLE_EVENT_PO2, // 6=PO2 Low
+ };
+
+ if (info->alarm_type > 6)
+ return;
+
+ sample.event.type = translate_alarm[info->alarm_type];
+ if (sample.event.type == SAMPLE_EVENT_NONE)
+ return;
+
+ sample.event.value = value ? SAMPLE_FLAGS_BEGIN : SAMPLE_FLAGS_END;
+ if (info->callback) info->callback(DC_SAMPLE_EVENT, sample, info->userdata);
+}
+
+
static int traverse_samples(unsigned short type, const struct type_desc *desc, const unsigned char *data, int len, void *user)
{
struct sample_data *info = (struct sample_data *) user;
@@ -419,6 +499,21 @@ static int traverse_samples(unsigned short type, const struct type_desc *desc, c
case 0x0016:
sample_event_notify_value(info, data[0]);
break;
+ case 0x0017:
+ sample_event_warning_type(info, data[0]);
+ break;
+ case 0x0018:
+ sample_event_warning_value(info, data[0]);
+ break;
+ case 0x0019:
+ sample_event_warning_type(info, data[0]);
+ break;
+ case 0x001a:
+ sample_event_warning_value(info, data[0]);
+ break;
+ case 0x001c:
+ sample_bookmark_event(info, array_uint16_le(data));
+ break;
case 0x001d:
sample_gas_switch_event(info, array_uint16_le(data));
break;
--
2.2.1.212.gc5b9256
More information about the devel
mailing list