use crate::drivers::primary_lcd::PrimaryDisplayError; use crate::navigation::navigation::{Action, Navigable, NewState}; use crate::navigation::outputs::Outputs; use crate::peripherals::Peripherals; use crate::views::{flash_info_view::FlashInfoView, menu_item, view::View}; use alloc::boxed::Box; use core::error; use crate::navigation::inputs::ButtonAction; use embedded_graphics::pixelcolor::Rgb565; use embedded_graphics::prelude::RgbColor; use embedded_graphics_core::draw_target::DrawTarget; pub const MAX_SELECTED: i32 = 3; #[derive(Debug, Clone)] pub struct SettingsMenu { pub selected: i32, } impl Navigable for SettingsMenu { fn display( &self, outputs: &mut Outputs, _: &Peripherals, ) -> impl core::future::Future>> + Send { async move { let display = &mut outputs.primary_display; display .clear(Rgb565::BLACK) .map_err(PrimaryDisplayError::from)?; menu_item::show(display, "System Inforation", 0, self.selected) .map_err(PrimaryDisplayError::from)?; menu_item::show(display, "Wifi Information", 1, self.selected) .map_err(PrimaryDisplayError::from)?; menu_item::show(display, "Flash Information", 2, self.selected) .map_err(PrimaryDisplayError::from)?; Ok(()) } } fn handle_input(&self, input: Action) -> impl core::future::Future + Send { async move { let Action::Button(input) = input else { // Skip timer inputs return NewState { view: View::Settings(self.clone()), replace_view: true, redraw: false, }; }; let new_menu = match input { ButtonAction::Up => { let new_selected = if (self.selected - 1) < 0 { MAX_SELECTED - 1 } else { self.selected - 1 }; View::Settings(SettingsMenu { selected: new_selected, }) } ButtonAction::Down => { let new_selected = self.selected.wrapping_add(1) % MAX_SELECTED; View::Settings(SettingsMenu { selected: new_selected, }) } ButtonAction::Ok => match self.selected { 2 => View::FlashInfo(FlashInfoView {}), _ => View::Settings(self.clone()), }, _ => View::Settings(self.clone()), }; NewState { replace_view: matches!(new_menu, View::Settings(_)), view: new_menu, redraw: true, } } } }