From 3733f056efee67a1269c9414514f34da5ecf6ea2 Mon Sep 17 00:00:00 2001 From: Jannik Beyerstedt Date: Mon, 7 Sep 2026 13:41:48 +0200 Subject: [PATCH] WIP denm: Show warning symbol TODO: Show distance to DENM? --- Readme.md | 10 +- .../Stationary_Emergency_Vehicle-140x105.svg | 38 ++++++ .../Stationary_Emergency_Vehicle-70px.tga | Bin 0 -> 11148 bytes graphics/Stationary_Vehicle-140x70.svg | 15 +++ graphics/Stationary_Vehicle-80px.tga | Bin 0 -> 9618 bytes graphics/Work_Zone-140x95.svg | 17 +++ graphics/Work_Zone-80px.tga | Bin 0 -> 12978 bytes src/applogic/denm.rs | 9 +- src/main.rs | 10 +- src/screen.rs | 116 +++++++++++++++++- 10 files changed, 207 insertions(+), 8 deletions(-) create mode 100644 graphics/Stationary_Emergency_Vehicle-140x105.svg create mode 100644 graphics/Stationary_Emergency_Vehicle-70px.tga create mode 100644 graphics/Stationary_Vehicle-140x70.svg create mode 100644 graphics/Stationary_Vehicle-80px.tga create mode 100644 graphics/Work_Zone-140x95.svg create mode 100644 graphics/Work_Zone-80px.tga diff --git a/Readme.md b/Readme.md index 2b8ed56..d2b3d5d 100644 --- a/Readme.md +++ b/Readme.md @@ -130,5 +130,13 @@ You can convert them using [ImageMagick](https://imagemagick.org) like this: # resize to 25px height, adding a black background to the white symbol and vice versa magick Sinnbild_Radfahrer_StVO_1992-200px-white.png -resize x25 -background black -alpha background -flatten -alpha off -verbose Sinnbild_Radfahrer_StVO_1992-25px-white.tga magick Sinnbild_Radfahrer_StVO_1992-200px-black.png -resize x25 -background white -alpha background -flatten -alpha off -verbose Sinnbild_Radfahrer_StVO_1992-25px-black.tga -``` +magick Stationary_Emergency_Vehicle_Dreieck_Rot.png -resize 200 -background black -alpha background -flatten -alpha off -verbose Stationary_Emergency_Vehicle_Dreieck_Rot-200px.tga +magick Stationary_Vehicle_Dreieck_Rot.png -resize 200 -background black -alpha background -flatten -alpha off -verbose Stationary_Vehicle_Dreieck_Rot-200px.tga +magick Work_Zone_Dreieck_Rot.png -resize 200 -background black -alpha background -flatten -alpha off -verbose Work_Zone_Dreieck_Rot-200px.tga + +magick Dreieck_Rot-300x240.png -resize 200 -background black -alpha background -flatten -alpha off -verbose Dreieck_Rot-200px.tga +magick Stationary_Emergency_Vehicle-140x105.svg -resize 70 -background black -alpha background -flatten -alpha off -verbose Stationary_Emergency_Vehicle-70px.tga +magick Stationary_Vehicle-140x70.svg -resize 80 -background black -alpha background -flatten -alpha off -verbose Stationary_Vehicle-80px.tga +magick Work_Zone-140x95.svg -resize 80 -background black -alpha background -flatten -alpha off -verbose Work_Zone-80px.tga +``` diff --git a/graphics/Stationary_Emergency_Vehicle-140x105.svg b/graphics/Stationary_Emergency_Vehicle-140x105.svg new file mode 100644 index 0000000..f5b5aa0 --- /dev/null +++ b/graphics/Stationary_Emergency_Vehicle-140x105.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/graphics/Stationary_Emergency_Vehicle-70px.tga b/graphics/Stationary_Emergency_Vehicle-70px.tga new file mode 100644 index 0000000000000000000000000000000000000000..7c2d1d6916783071bed31de5261e448839485a1e GIT binary patch literal 11148 zcmZQzU}As)HwIG%35EZoU^E0qLtr!nMniz;5cvA_^Sd`M-@bl*tIKb#?~4rs_;)8q8)IEO2D1&TON{y<_vTDLs`&Dh#IT%(e!+ySJ~N*i~k%!T?tW zV=$YlF?rd_?%lbTke#%ZKXzz`i@BJY28)Fj8yYg#WVJKk-LZMu)ZQu+H70XSR(m7< zJ=<4L>Ml1`V?t95;hL&5#Rr?ce)*KPj>c>H#LiMfB?c2UMl48`(MpG7`=+InyDLCy zR2i)GxOQ(_H37F4V^szlJ?;a$H{i9ChLZpO{@u25No!47dtC-5YOBlWYRb8C@znlZ z>sxBl+Uhd8oAa(;IlFh~T3lKnhMYRKmxhi;HTuo#=Lhy|SiZ1-?zHCFQyS+?ZJax; zY2Ngfxzn3*p*d5Vkk!Ds^QO08MRTV&&zagZdrITnY0b;#_wC)e=H>IpsIH(6@5|?p ztCvoR2{g1bw1GF4}=)#r@z(_1jB{oUJF)bR<}l(%nQG*-l0>#~`uGni{K zS!glS4Vh~)nQ1UsXfajfhdz7q0PGw}iEm#&w^S#aYcj$8Vy3}ps?IvKKYjS}iPUBby6}(PP%^O zOiX|Q#8Xx}tjiaYA5C9Ae=JDz0+$AiJ`S>%FPtFBB~(}!`#CrLX*@%L|EN^=515v0NB z@2qg^`UQyiK#^xp9dNf214WZMLrSFe+cz&sb;03!(E@;|?S z_q60f5{!*L=jOHZAmT)lKY#wHEr|lR4HyHQ6>s0TNTf!ZD!X&*a*&&fnFgboIzwi> zBc8hH@87?_Q2USP&m4BM5`_fFUrm+5OYU_g}w!zI6WBvITtwXTfSH*JLtPV=&WTw9)5`2{5S0 z3vss=heXh{{;GlX0;cU7R?oK8=QP)3ax&p>D38mGcXYD^B_~j;OpU?YUMAF21Jc5Q zw4lII18NzXYcl!R%k15`=H8uacW+%DBRNOtezjE=U z{8UdrCwWV47W~>Fjc|7>F)v$5PnsbwTS<3oabg@}uF2$VCYTg%F{!KM;<=-L{``R# zCO?0Czj5_kc7ijw&xo^^YNpPRmEe5t)WNHlPF=lpl4j`CwJdG!pJGk*R0*;o+|@sX7dtB18XJZX8`Nr!rB)R)Cxzj79r zc3OzPc>bubtsufz$J<`o!&=@83VKUOu^g<;%n=KpF-%`kc0d64~f+K$;W8mkf~l zYw(j)@sYVElNor>+f1E-)(A8bg?HkBavzy%G6lJ*ROE$J=7(0$9#s~Eg?np5#=Ws7 z7|MNQs?Jc9;R~Lr|Ni60HyWewzkdCk)Lm+-1{!szosWt$eZPJEOnhxfp~|U!l_s?J z(bwVSqoNGoLFFS~yzRO_zkj#Zrs7Grrs@n8`61uGf2A-j5wCq(e-)loXQsgz;-U5$ zcmL@B|NnEQHbVMGSaYJOI>Xf73gX>Exynsz=YgmBun(1(sxwp q*rDwZHS{F!+`62f;$f)`>a@ZG*<6z;z*%wAnz?`fB8EyJt^xr2xY3aS literal 0 HcmV?d00001 diff --git a/graphics/Stationary_Vehicle-140x70.svg b/graphics/Stationary_Vehicle-140x70.svg new file mode 100644 index 0000000..3ff1cd7 --- /dev/null +++ b/graphics/Stationary_Vehicle-140x70.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/graphics/Stationary_Vehicle-80px.tga b/graphics/Stationary_Vehicle-80px.tga new file mode 100644 index 0000000000000000000000000000000000000000..413a36710f9ff9e46d989a5ec74b142e5d48782a GIT binary patch literal 9618 zcmZQzU}AuQ00s>P35EYu1;2m&`u^=JtIYhBK?X#3-b zcT((dat!$M=g)#!o%TljW*RIOT5R+|rfN*Sj*5r(Zz0FUl<7Hre4mH4lsVY5W*RIu zdffJg{PspPL3W0GmfGy*nxKF+RcDIwGkpB;4rR_KP51Y2U(0esOx2k!v{{3u zw|8$}QDz1ZNouE}Dl%|2&pGYL8=PyI~#M%HCW8lnWOv-pFO!x zT|1DA!M}h0bT(u|A~!F^>&xel)U}I9({A6m6y&B3srQ%8??=}4@84f!E=la4KfZ6@ zv~+4;^_peV@7})p>(|fgSI+u6Dwt`o*c$Ne-LZxw)2OKU-@kuzrZ!t@bC{_!#{?R` zeE#_7&mZ@0UtPCi=9Hewts55q`2LLy>kjVSU#TMYAQjq3Tksl6fI;t}l zXZnBp`k4$fsio!R^T+Wa=HNyqS4Dn!VY**{i;AT-hlv`av#Icr1KY^3sJFEc;#rU% zLA4$;xRhYEHQ=2!sp0a46Bo}N8z^+?{Bck&29;W@=9(;^$`Rbsv(REQRcCIi%OK0Y z1*U3DkoF8RX{pU_XUJzi(8yMw2ia9{wy8REb5#l%{ynsBv$L59RxiU1A8ZU$b!JBs zA@VvDzkdB(xp;C+poy(M52US**LSRD8Z73TtTaM+t!4vR3huMShnTNgGWF-rA7sQY zM9a(PPmb*0GO@GR!H5r>f3bA^%r#l9^|)$FV&+b3nLVY6x@hjSmd1)iYh5l2El?W+ zi^nxtolJ%M+KLYC+x+sy6Ns}ZA-{kBzi9De8)FZ1O?FJ{AW`2@p9O1c{rmr)y6FGg zH!lj)ea+M%1txlcn`y8lhFQLP`IHhrBI}(x{j;X-GZnRC#+qgpTFl_CF0{O|GvM`i zR-V>ZP3vC6qX)NIYtp>!WbF+3;K)jc6H<31g#F)Mnb%FcBWb7d@87@GMNyEN zmssM7_Bo+Pp^3|X4sMpf+ zPhu0^y#Mfb-~R9V#?NIHAGNkU`A5H@6r2G7ieIYwck1-dN@`Da4WI4V_x=C>|G$3! ztF3=8r}Wg??)jeG_wU}mbm!*f0YkSg-@JCdI5U7+`S;T0Uskp+xRnX}P5eQ)0WiHdzKul!t1 zZIhXnjD;3xOc>HDF;Qcr9Wn!r{i3%tAdMdi{rl$4-;nUvG73*3qF=v$gJrm2@4oN4 z2G12#9_wlpLu|CrVoQm%t;i26&kdyos>lmV3b(S<=73v=%%H@-|Ni}-Is3D+`cpll z=X=4$6lVGOh}sN&y`irm}nY7qWJK>&6p~wD6)IoN*g_HWN*URl=%1RwO{tm zFJ%>3AmWDb$oI4+AmCR zB8$wL{aI1oO?#=7xBv}n{Kctv?`xZ+vg=yNp{of6YpUW#h zvbS!zdg&CV0xF7}KXcg8M92a(V1-^vo2W5Xne z{OH@tRUao#y6xb67u5W)dUWv;IYXet2gtW?UuuhEF#T(;$?9P(wRgu_f<`@m`f%r# z6`R*B*s^ZH+7(NjTyDuLzf@9tp{e^)L+1q{^io~>xw85rCAFuDsxK5&URIPJ*t&kf z=5@3}Th=d{F`>@GTFOcXrB<@h826?Cr$q-}%2Mc@ss@VY9a#$b$ literal 0 HcmV?d00001 diff --git a/graphics/Work_Zone-140x95.svg b/graphics/Work_Zone-140x95.svg new file mode 100644 index 0000000..bbbe6fb --- /dev/null +++ b/graphics/Work_Zone-140x95.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/graphics/Work_Zone-80px.tga b/graphics/Work_Zone-80px.tga new file mode 100644 index 0000000000000000000000000000000000000000..ad9b732f3c0582158c223f2b1368d491443cd943 GIT binary patch literal 12978 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 Option { let mgmt = &etsi.denm.management; if mgmt.termination.is_some() { - return; + return None; } if let (Some(sit), Some(loc)) = (&etsi.denm.situation, &etsi.denm.location) { @@ -38,7 +39,11 @@ pub fn handle_denm(etsi: &denm_pdu_description::DENM) { "DENN: {station_id}/{seq_num} CC {cc}/{scc} at {lat_deg:.3}°N, {lon_deg:.3}°E until {end_time:?}" ); } + + Some(sit.event_type.cc_and_scc.clone()) } else { info!("DENM: One of situation or location container not available"); + + None } } diff --git a/src/main.rs b/src/main.rs index ae2a14e..b90e7cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -578,7 +578,15 @@ async fn main(spawner: Spawner) -> ! { transport: _, ref etsi, } => { - applogic::denm::handle_denm(etsi); + match applogic::denm::handle_denm(etsi) { + #[cfg(feature = "screen")] + Some(cc) => { + let _ = screen + .update(screen::ScreenState::DenmWarning(cc)) + .inspect_err(log_screen_error); + } + _ => {} + } // Send data to BLE thread #[cfg(feature = "ble")] diff --git a/src/screen.rs b/src/screen.rs index d5a0c45..32461d8 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -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}; @@ -26,7 +28,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)] @@ -42,6 +52,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")] @@ -99,9 +111,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, @@ -111,6 +137,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, } } @@ -131,6 +165,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)? + } } } @@ -470,6 +508,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> { let text_style = mono_font::MonoTextStyle::new(&profont::PROFONT_18_POINT, Self::COLOR_FG);