Watch
0
0
Fork
You've already forked esp32-c_its-companion
0

WIP denm: Show warning symbol

TODO: Show distance to DENM?
This commit is contained in:
Jannik Beyerstedt 2026-09-07 13:41:48 +02:00
commit 91d3b0b5ee
10 changed files with 207 additions and 8 deletions

View file

@ -1,5 +1,7 @@
//! Screen Output
#[cfg(feature = "denm")]
use c_its_parser::standards::cdd_2_2_1;
use embedded_graphics::prelude::*;
use embedded_graphics::{geometry, mono_font, pixelcolor, primitives, text};
@ -27,7 +29,15 @@ where
// assets
#[cfg(feature = "spat")]
bike_image: tinytga::Tga<'static, pixelcolor::Rgb565>,
bike_image: tinytga::Tga<'static, pixelcolor::Rgb565>, // 45x25px
// #[cfg(feature = "denm")]
// warn_icon: tinytga::Tga<'static, pixelcolor::Rgb565>, // 200x153 px
#[cfg(feature = "denm")]
sv_insert: tinytga::Tga<'static, pixelcolor::Rgb565>, // 80px wide (original 140x70)
#[cfg(feature = "denm")]
ev_insert: tinytga::Tga<'static, pixelcolor::Rgb565>, // 60px wide (original 140x105)
#[cfg(feature = "denm")]
rww_insert: tinytga::Tga<'static, pixelcolor::Rgb565>, // 80px wide (original 140x95)
}
#[derive(Debug, Default, PartialEq, Eq)]
@ -43,6 +53,8 @@ pub enum ScreenState {
GlosaFound(applogic::GlosaFound),
#[cfg(feature = "spat")]
GlosaLocked(applogic::GlosaSignalInfo),
#[cfg(feature = "denm")]
DenmWarning(cdd_2_2_1::etsi_its_cdd::CauseCodeChoice),
}
#[cfg(feature = "spat")]
@ -101,9 +113,23 @@ where
pub fn new(target: D, display_size: DisplaySize) -> Self {
#[cfg(feature = "spat")]
let data = include_bytes!("../graphics/Sinnbild_Radfahrer_StVO_1992-25px-white.tga");
#[cfg(feature = "spat")]
let bike_image = tinytga::Tga::from_slice(data).expect("Failed to parse TGA image");
let bike_image = tinytga::Tga::from_slice(include_bytes!(
"../graphics/Sinnbild_Radfahrer_StVO_1992-25px-white.tga"
))
.expect("Failed to parse TGA image");
#[cfg(feature = "denm")]
let sv_insert =
tinytga::Tga::from_slice(include_bytes!("../graphics/Stationary_Vehicle-80px.tga"))
.expect("Failed to parse TGA image");
#[cfg(feature = "denm")]
let ev_insert = tinytga::Tga::from_slice(include_bytes!(
"../graphics/Stationary_Emergency_Vehicle-70px.tga"
))
.expect("Failed to parse TGA image");
#[cfg(feature = "denm")]
let rww_insert = tinytga::Tga::from_slice(include_bytes!("../graphics/Work_Zone-80px.tga"))
.expect("Failed to parse TGA image");
Self {
target,
@ -113,6 +139,14 @@ where
gnss_hb_state: false,
#[cfg(feature = "spat")]
bike_image,
// #[cfg(feature = "denm")]
// warn_icon,
#[cfg(feature = "denm")]
sv_insert,
#[cfg(feature = "denm")]
ev_insert,
#[cfg(feature = "denm")]
rww_insert,
}
}
@ -136,6 +170,10 @@ where
self.draw_glosa(glosa_data, prev_glosa_data)?;
}
ScreenState::Error(msg) => self.draw_message(msg)?,
#[cfg(feature = "denm")]
ScreenState::DenmWarning(cause_code_choice) => {
self.draw_denm_warning(cause_code_choice)?
}
}
}
@ -477,6 +515,76 @@ where
Ok(())
}
#[cfg(feature = "denm")]
pub fn draw_denm_warning(
&mut self,
cc: &cdd_2_2_1::etsi_its_cdd::CauseCodeChoice,
) -> Result<(), D::Error> {
// clear whole display and draw image
self.clear()?;
let centerline = i32::from(self.size.width) / 2;
let sign_top = self.size.offset_top + 40;
// build triangle shape
{
let point1 = geometry::Point::new(centerline, sign_top);
let point2 = geometry::Point::new(centerline - 100, sign_top + 150);
let point3 = geometry::Point::new(centerline + 100, sign_top + 150);
let mut line_style =
primitives::PrimitiveStyle::with_stroke(pixelcolor::Rgb565::CSS_RED, 10);
line_style.fill_color = Some(pixelcolor::Rgb565::WHITE);
primitives::Triangle::new(point1, point2, point3)
.into_styled(line_style)
.draw(&mut self.target)?;
}
// add icon inside the triangle
match cc {
cdd_2_2_1::etsi_its_cdd::CauseCodeChoice::slowVehicle26(_)
| cdd_2_2_1::etsi_its_cdd::CauseCodeChoice::stationaryVehicle94(_) => {
embedded_graphics::image::Image::new(
&self.sv_insert,
geometry::Point::new(centerline - (80 / 2), sign_top + 90),
)
.draw(&mut self.target)?;
}
cdd_2_2_1::etsi_its_cdd::CauseCodeChoice::rescueAndRecoveryWorkInProgress15(_)
| cdd_2_2_1::etsi_its_cdd::CauseCodeChoice::emergencyVehicleApproaching95(_) => {
embedded_graphics::image::Image::new(
&self.ev_insert,
geometry::Point::new(centerline - (70 / 2), sign_top + 85),
)
.draw(&mut self.target)?;
}
cdd_2_2_1::etsi_its_cdd::CauseCodeChoice::roadworks3(_) => {
embedded_graphics::image::Image::new(
&self.rww_insert,
geometry::Point::new(centerline - (80 / 2), sign_top + 85),
)
.draw(&mut self.target)?;
}
_ => {
text::Text::with_alignment(
"Unhandled DENM CC",
geometry::Point::new(
i32::from(self.size.width) / 2,
sign_top + 150 + (10 / 2) + 30,
),
Self::MID_TEXT_STYLE,
text::Alignment::Center,
)
.draw(&mut self.target)?;
}
}
Ok(())
}
#[allow(unused)]
fn draw_slash_screen(&mut self) -> Result<(), D::Error> {
self.clear_all()?;