Mainmenu #28

Merged
rhetenor merged 19 commits from mainmenu into main 2026-08-18 23:44:28 +02:00
4 changed files with 81 additions and 2 deletions
Showing only changes of commit d3ac95a9bd - Show all commits
+1
View File
@@ -1,4 +1,5 @@
pub mod inputs; pub mod inputs;
pub mod main_menu; pub mod main_menu;
pub mod navigation; pub mod navigation;
pub mod scan_menu;
pub mod state; pub mod state;
+4 -2
View File
@@ -16,8 +16,8 @@ pub struct MainMenu {
pub selected: i8, pub selected: i8,
} }
impl MainMenu { impl super::navigation::Displayable for MainMenu {
pub async fn display(&self, display: &mut PrimaryLcdDisplay<'static>) { fn display(&self, display: &mut PrimaryLcdDisplay<'static>) -> impl core::future::Future<Output = ()> + Send {
let style = MonoTextStyle::new(&FONT_6X10, Rgb565::WHITE); let style = MonoTextStyle::new(&FONT_6X10, Rgb565::WHITE);
let selected_style = MonoTextStyle::new(&FONT_6X10, Rgb565::BLUE); let selected_style = MonoTextStyle::new(&FONT_6X10, Rgb565::BLUE);
@@ -56,5 +56,7 @@ impl MainMenu {
) )
.draw(display) .draw(display)
.unwrap(); .unwrap();
core::future::ready(())
} }
} }
+4
View File
@@ -7,6 +7,10 @@ use embassy_time::{Duration, Timer};
const DEBOUNCE_DURATION_MILLIS: u64 = 100; const DEBOUNCE_DURATION_MILLIS: u64 = 100;
pub trait Displayable {
fn display(&self, display: &mut PrimaryLcdDisplay<'static>) -> impl core::future::Future<Output = ()> + Send;
}
#[embassy_executor::task] #[embassy_executor::task]
pub async fn run(mut inputs: Inputs, display: &'static mut PrimaryLcdDisplay<'static>) { pub async fn run(mut inputs: Inputs, display: &'static mut PrimaryLcdDisplay<'static>) {
let mut state = MainMenu { selected: 0 }; let mut state = MainMenu { selected: 0 };
+72
View File
@@ -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<Output = ()> + 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(())
}
}