add scan menu
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
pub mod inputs;
|
||||
pub mod main_menu;
|
||||
pub mod navigation;
|
||||
pub mod scan_menu;
|
||||
pub mod state;
|
||||
|
||||
@@ -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<Output = ()> + 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(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Output = ()> + Send;
|
||||
}
|
||||
|
||||
#[embassy_executor::task]
|
||||
pub async fn run(mut inputs: Inputs, display: &'static mut PrimaryLcdDisplay<'static>) {
|
||||
let mut state = MainMenu { selected: 0 };
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user