From d3ac95a9bd8a08f4cea01af1f977827c5221c939 Mon Sep 17 00:00:00 2001 From: ede1998 Date: Fri, 14 Aug 2026 23:06:49 +0200 Subject: [PATCH] add scan menu --- src/navigation.rs | 1 + src/navigation/main_menu.rs | 6 ++- src/navigation/navigation.rs | 4 ++ src/navigation/scan_menu.rs | 72 ++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/navigation/scan_menu.rs diff --git a/src/navigation.rs b/src/navigation.rs index daeb191..6d97813 100644 --- a/src/navigation.rs +++ b/src/navigation.rs @@ -1,4 +1,5 @@ pub mod inputs; pub mod main_menu; pub mod navigation; +pub mod scan_menu; pub mod state; diff --git a/src/navigation/main_menu.rs b/src/navigation/main_menu.rs index 4c43ab2..32d4f0f 100644 --- a/src/navigation/main_menu.rs +++ b/src/navigation/main_menu.rs @@ -16,8 +16,8 @@ pub struct MainMenu { pub selected: i8, } -impl MainMenu { - pub async fn display(&self, display: &mut PrimaryLcdDisplay<'static>) { +impl super::navigation::Displayable for MainMenu { + fn display(&self, display: &mut PrimaryLcdDisplay<'static>) -> impl core::future::Future + Send { let style = MonoTextStyle::new(&FONT_6X10, Rgb565::WHITE); let selected_style = MonoTextStyle::new(&FONT_6X10, Rgb565::BLUE); @@ -56,5 +56,7 @@ impl MainMenu { ) .draw(display) .unwrap(); + + core::future::ready(()) } } diff --git a/src/navigation/navigation.rs b/src/navigation/navigation.rs index e0f37a9..0e0f560 100644 --- a/src/navigation/navigation.rs +++ b/src/navigation/navigation.rs @@ -7,6 +7,10 @@ use embassy_time::{Duration, Timer}; const DEBOUNCE_DURATION_MILLIS: u64 = 100; +pub trait Displayable { + fn display(&self, display: &mut PrimaryLcdDisplay<'static>) -> impl core::future::Future + Send; +} + #[embassy_executor::task] pub async fn run(mut inputs: Inputs, display: &'static mut PrimaryLcdDisplay<'static>) { let mut state = MainMenu { selected: 0 }; diff --git a/src/navigation/scan_menu.rs b/src/navigation/scan_menu.rs new file mode 100644 index 0000000..7166ac3 --- /dev/null +++ b/src/navigation/scan_menu.rs @@ -0,0 +1,72 @@ +use crate::display::primary_lcd::PrimaryLcdDisplay; + +use alloc::format; +use embedded_graphics::Drawable; +use embedded_graphics::geometry::AngleUnit as _; +use embedded_graphics::geometry::Dimensions as _; +use embedded_graphics::mono_font::MonoTextStyle; +use embedded_graphics::mono_font::ascii::FONT_6X10; +use embedded_graphics::pixelcolor::Rgb565; +use embedded_graphics::prelude::Point; +use embedded_graphics::prelude::RgbColor; +use embedded_graphics::primitives::Arc; +use embedded_graphics::primitives::Primitive as _; +use embedded_graphics::primitives::PrimitiveStyleBuilder; +use embedded_graphics::primitives::StrokeAlignment; +use embedded_graphics::text::Alignment; +use embedded_graphics::text::Baseline; +use embedded_graphics::text::Text; +use embedded_graphics::text::TextStyleBuilder; +use embedded_graphics_core::draw_target::DrawTarget; + +pub struct ScanMenu { + progress: u8, // 0..255 +} + +impl super::navigation::Displayable for ScanMenu { + fn display( + &self, + display: &mut PrimaryLcdDisplay<'static>, + ) -> impl core::future::Future + Send { + let style = MonoTextStyle::new(&FONT_6X10, Rgb565::WHITE); + + Text::new("Scanning...", Point::new(20, 240), style) + .draw(display) + .unwrap(); + + // Create styles used by the drawing operations. + let arc_stroke = PrimitiveStyleBuilder::new() + .stroke_color(Rgb565::WHITE) + .stroke_width(5) + .stroke_alignment(StrokeAlignment::Inside) + .build(); + let character_style = MonoTextStyle::new(&FONT_6X10, Rgb565::WHITE); + let text_style = TextStyleBuilder::new() + .baseline(Baseline::Middle) + .alignment(Alignment::Center) + .build(); + + display.clear(Rgb565::BLACK).unwrap(); + + let sweep = self.progress as f32 * 360.0 / 100.0; + + // Draw an arc with a 5px wide stroke. + Arc::new(Point::new(2, 2), 64 - 4, 90.0.deg(), sweep.deg()) + .into_styled(arc_stroke) + .draw(display) + .unwrap(); + + // Draw centered text. + let text = format!("{}%", self.progress); + Text::with_text_style( + &text, + display.bounding_box().center(), + character_style, + text_style, + ) + .draw(display) + .unwrap(); + + core::future::ready(()) + } +}