From 61d65c0db1e9196d9fbd88c6733a50a03d4dd6ca Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Fri, 25 Sep 2026 11:16:04 +0200 Subject: [PATCH] WIP FIXUP: Show DENMS for a minimum time --- src/main.rs | 1 + src/screen.rs | 31 ++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 42afd3f..ef0313a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -586,6 +586,7 @@ async fn main(spawner: Spawner) -> ! { .update(screen::ScreenState::DenmWarning(cc)) .inspect_err(log_screen_error); } + // TODO: cancel screen, if None? _ => {} } diff --git a/src/screen.rs b/src/screen.rs index 42b8690..f4195e4 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -8,6 +8,9 @@ use embedded_graphics::{geometry, mono_font, pixelcolor, primitives, text}; #[cfg(feature = "spat")] use crate::applogic; +#[cfg(feature = "denm")] +const DENM_MIN_DISPLAY_TIME: esp_hal::time::Duration = esp_hal::time::Duration::from_secs(5); + pub struct DisplaySize { width: u16, height: u16, @@ -26,6 +29,8 @@ where prev_state: ScreenState, hb_state: bool, gnss_hb_state: bool, + #[cfg(feature = "denm")] + denm_display_start_time: esp_hal::time::Instant, // assets #[cfg(feature = "spat")] @@ -137,6 +142,8 @@ where prev_state: ScreenState::Uninitialized, hb_state: false, gnss_hb_state: false, + #[cfg(feature = "denm")] + denm_display_start_time: esp_hal::time::Instant::EPOCH, #[cfg(feature = "spat")] bike_image, // #[cfg(feature = "denm")] @@ -151,6 +158,27 @@ where } pub fn update(&mut self, state: ScreenState) -> Result<(), D::Error> { + #[cfg(feature = "denm")] + let now = esp_hal::time::Instant::now(); + + #[cfg(feature = "denm")] + // when a DENM was shown before, make sure it's shown for a minimum time + if let ScreenState::DenmWarning(_) = self.prev_state { + use core::ops::Sub; + + // update DENM display, if there are updates + if self.prev_state != state + && let ScreenState::DenmWarning(cause_code_choice) = &state + { + return self.draw_denm_warning(cause_code_choice); + } + + // otherwise early return when timer isn't expired yet + if now.sub(self.denm_display_start_time) < DENM_MIN_DISPLAY_TIME { + return Ok(()); + } + } + if self.prev_state != state { match &state { ScreenState::Uninitialized | ScreenState::Initial => self.draw_slash_screen()?, @@ -172,7 +200,8 @@ where ScreenState::Error(msg) => self.draw_message(msg)?, #[cfg(feature = "denm")] ScreenState::DenmWarning(cause_code_choice) => { - self.draw_denm_warning(cause_code_choice)? + self.denm_display_start_time = now; + self.draw_denm_warning(cause_code_choice)?; } } }