From 4422dbb52bbc62029a88db6e6d5572e7c3cbe919 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Wed, 14 Feb 2024 21:29:48 +0100 Subject: [PATCH] events: make event severity explicit Currently the event type code uses libdivecomputer's flags to differentiate between events. Make this explicit and extract the event severity. The reason is that later we want to be more explicit about showing/ hiding events and thereto we must format the name of events. Moreover, this encapsulates the complexities of extracting the severity in the event code (that used to be in the profile code). Signed-off-by: Berthold Stoeger --- core/event.c | 14 ++++++++++++++ core/event.h | 9 ++++++++- core/eventtype.cpp | 10 ++++++---- profile-widget/diveeventitem.cpp | 13 ++++--------- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/core/event.c b/core/event.c index 1e296be93..dd5551761 100644 --- a/core/event.c +++ b/core/event.c @@ -102,3 +102,17 @@ bool same_event(const struct event *a, const struct event *b) return 0; return !strcmp(a->name, b->name); } + +extern enum event_severity get_event_severity(const struct event *ev) +{ + switch (ev->flags & SAMPLE_FLAGS_SEVERITY_MASK) { + case SAMPLE_FLAGS_SEVERITY_INFO: + return EVENT_SEVERITY_INFO; + case SAMPLE_FLAGS_SEVERITY_WARN: + return EVENT_SEVERITY_WARN; + case SAMPLE_FLAGS_SEVERITY_ALARM: + return EVENT_SEVERITY_ALARM; + default: + return EVENT_SEVERITY_NONE; + } +} diff --git a/core/event.h b/core/event.h index 90f36fe54..31eca87fc 100644 --- a/core/event.h +++ b/core/event.h @@ -12,6 +12,13 @@ extern "C" { #endif +enum event_severity { + EVENT_SEVERITY_NONE = 0, + EVENT_SEVERITY_INFO, + EVENT_SEVERITY_WARN, + EVENT_SEVERITY_ALARM +}; + /* * Events are currently based straight on what libdivecomputer gives us. * We need to wrap these into our own events at some point to remove some of the limitations. @@ -46,12 +53,12 @@ extern void free_events(struct event *ev); extern struct event *create_event(unsigned int time, int type, int flags, int value, const char *name); extern struct event *clone_event_rename(const struct event *ev, const char *name); extern bool same_event(const struct event *a, const struct event *b); +extern enum event_severity get_event_severity(const struct event *ev); /* Since C doesn't have parameter-based overloading, two versions of get_next_event. */ extern const struct event *get_next_event(const struct event *event, const char *name); extern struct event *get_next_event_mutable(struct event *event, const char *name); - #ifdef __cplusplus } #endif diff --git a/core/eventtype.cpp b/core/eventtype.cpp index 90c1c7b09..dbe0157bc 100644 --- a/core/eventtype.cpp +++ b/core/eventtype.cpp @@ -9,10 +9,12 @@ struct event_type { std::string name; - int flags; + event_severity severity; bool plot; - event_type(const struct event *ev) - : name(ev->name), flags(ev->flags), plot(true) + event_type(const struct event *ev) : + name(ev->name), + severity(get_event_severity(ev)), + plot(true) { } }; @@ -21,7 +23,7 @@ static std::vector event_types; static bool operator==(const event_type &en1, const event_type &en2) { - return en1.name == en2.name && en1.flags == en2.flags; + return en1.name == en2.name && en1.severity == en2.severity; } extern "C" void clear_event_types() diff --git a/profile-widget/diveeventitem.cpp b/profile-widget/diveeventitem.cpp index 9b2b8213b..0de81c454 100644 --- a/profile-widget/diveeventitem.cpp +++ b/profile-widget/diveeventitem.cpp @@ -47,6 +47,7 @@ struct event *DiveEventItem::getEventMutable() void DiveEventItem::setupPixmap(struct gasmix lastgasmix, const DivePixmaps &pixmaps) { + event_severity severity = get_event_severity(ev); if (empty_string(ev->name)) { setPixmap(pixmaps.warning); } else if (same_string_caseinsensitive(ev->name, "modechange")) { @@ -82,12 +83,8 @@ void DiveEventItem::setupPixmap(struct gasmix lastgasmix, const DivePixmaps &pix else setPixmap(pixmaps.gaschangeEAN); } -#ifdef SAMPLE_FLAGS_SEVERITY_SHIFT } else if ((((ev->flags & SAMPLE_FLAGS_SEVERITY_MASK) >> SAMPLE_FLAGS_SEVERITY_SHIFT) == 1) || // those are useless internals of the dive computer -#else - } else if ( -#endif same_string_caseinsensitive(ev->name, "heading") || (same_string_caseinsensitive(ev->name, "SP change") && ev->time.seconds == 0)) { // 2 cases: @@ -98,14 +95,12 @@ void DiveEventItem::setupPixmap(struct gasmix lastgasmix, const DivePixmaps &pix // that allows tooltips to work when we don't want to show a specific // pixmap for an event, but want to show the event value in the tooltip setPixmap(pixmaps.transparent); -#ifdef SAMPLE_FLAGS_SEVERITY_SHIFT - } else if (((ev->flags & SAMPLE_FLAGS_SEVERITY_MASK) >> SAMPLE_FLAGS_SEVERITY_SHIFT) == 2) { + } else if (severity == EVENT_SEVERITY_INFO) { setPixmap(pixmaps.info); - } else if (((ev->flags & SAMPLE_FLAGS_SEVERITY_MASK) >> SAMPLE_FLAGS_SEVERITY_SHIFT) == 3) { + } else if (severity == EVENT_SEVERITY_WARN) { setPixmap(pixmaps.warning); - } else if (((ev->flags & SAMPLE_FLAGS_SEVERITY_MASK) >> SAMPLE_FLAGS_SEVERITY_SHIFT) == 4) { + } else if (severity == EVENT_SEVERITY_ALARM) { setPixmap(pixmaps.violation); -#endif } else if (same_string_caseinsensitive(ev->name, "violation") || // generic libdivecomputer same_string_caseinsensitive(ev->name, "Safety stop violation") || // the rest are from the Uemis downloader same_string_caseinsensitive(ev->name, "pO₂ ascend alarm") ||