add scan menu
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 };
|
||||||
|
|||||||
@@ -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