display views: return error instead of unwrapping
This commit was merged in pull request #49.
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
use core::error::Error;
|
||||||
|
use core::fmt::Debug;
|
||||||
|
use core::fmt::Display;
|
||||||
use display_interface_spi::SPIInterface;
|
use display_interface_spi::SPIInterface;
|
||||||
use embedded_graphics::draw_target::DrawTarget;
|
use embedded_graphics::draw_target::DrawTarget;
|
||||||
use embedded_graphics::pixelcolor::Rgb565;
|
use embedded_graphics::pixelcolor::Rgb565;
|
||||||
@@ -6,10 +9,27 @@ use embedded_hal_bus::spi::AtomicDevice;
|
|||||||
use embedded_hal_bus::util::AtomicCell;
|
use embedded_hal_bus::util::AtomicCell;
|
||||||
use esp_hal::delay::Delay;
|
use esp_hal::delay::Delay;
|
||||||
use esp_hal::gpio::Output;
|
use esp_hal::gpio::Output;
|
||||||
use ili9341::{DisplaySize240x320, Ili9341, Orientation};
|
use ili9341::{DisplayError, DisplaySize240x320, Ili9341, Orientation};
|
||||||
|
|
||||||
use crate::drivers::spi_bus::{DisplaySpiBus, SharedOutput};
|
use crate::drivers::spi_bus::{DisplaySpiBus, SharedOutput};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct PrimaryDisplayError(DisplayError);
|
||||||
|
|
||||||
|
impl Display for PrimaryDisplayError {
|
||||||
|
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||||
|
self.0.fmt(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Error for PrimaryDisplayError {}
|
||||||
|
|
||||||
|
impl From<DisplayError> for PrimaryDisplayError {
|
||||||
|
fn from(value: DisplayError) -> Self {
|
||||||
|
Self(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type GenericPrimaryDisplay<'a, BUS, DC, RES> =
|
type GenericPrimaryDisplay<'a, BUS, DC, RES> =
|
||||||
Ili9341<SPIInterface<AtomicDevice<'a, BUS, Output<'a>, Delay>, DC>, RES>;
|
Ili9341<SPIInterface<AtomicDevice<'a, BUS, Output<'a>, Delay>, DC>, RES>;
|
||||||
pub type PrimaryDisplay<'a> =
|
pub type PrimaryDisplay<'a> =
|
||||||
|
|||||||
+12
-9
@@ -1,4 +1,5 @@
|
|||||||
use crate::display::sprite::render_sprite_onto_ili9341;
|
use crate::display::sprite::render_sprite_onto_ili9341;
|
||||||
|
use crate::drivers::primary_lcd::PrimaryDisplayError;
|
||||||
use crate::navigation::navigation::NewState;
|
use crate::navigation::navigation::NewState;
|
||||||
use crate::navigation::outputs::Outputs;
|
use crate::navigation::outputs::Outputs;
|
||||||
use crate::peripherals::Peripherals;
|
use crate::peripherals::Peripherals;
|
||||||
@@ -35,7 +36,9 @@ impl Navigable for CardView {
|
|||||||
) -> impl core::future::Future<Output = Result<(), Box<dyn error::Error>>> + Send {
|
) -> impl core::future::Future<Output = Result<(), Box<dyn error::Error>>> + Send {
|
||||||
async move {
|
async move {
|
||||||
let display = &mut outputs.primary_display;
|
let display = &mut outputs.primary_display;
|
||||||
display.clear(Rgb565::BLACK).unwrap();
|
display
|
||||||
|
.clear(Rgb565::BLACK)
|
||||||
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
|
|
||||||
let background = Rectangle::new(Point::new(0, 0), Size::new(240, 320));
|
let background = Rectangle::new(Point::new(0, 0), Size::new(240, 320));
|
||||||
let bg_color = self.card.cardtype.clone().into();
|
let bg_color = self.card.cardtype.clone().into();
|
||||||
@@ -49,56 +52,56 @@ impl Navigable for CardView {
|
|||||||
style,
|
style,
|
||||||
)
|
)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Text::new(
|
Text::new(
|
||||||
&format!("Type: {}", self.card.cardtype),
|
&format!("Type: {}", self.card.cardtype),
|
||||||
Point::new(20, 250),
|
Point::new(20, 250),
|
||||||
style,
|
style,
|
||||||
)
|
)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Text::new(
|
Text::new(
|
||||||
&format!("Event: {}", self.card.event),
|
&format!("Event: {}", self.card.event),
|
||||||
Point::new(20, 260),
|
Point::new(20, 260),
|
||||||
style,
|
style,
|
||||||
)
|
)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Text::new(
|
Text::new(
|
||||||
&format!("UUID: {}", self.card.uuid),
|
&format!("UUID: {}", self.card.uuid),
|
||||||
Point::new(20, 270),
|
Point::new(20, 270),
|
||||||
style,
|
style,
|
||||||
)
|
)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Text::new(
|
Text::new(
|
||||||
&format!("Trait1: {}", self.card.trait1),
|
&format!("Trait1: {}", self.card.trait1),
|
||||||
Point::new(20, 280),
|
Point::new(20, 280),
|
||||||
style,
|
style,
|
||||||
)
|
)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Text::new(
|
Text::new(
|
||||||
&format!("Trait2: {}", self.card.trait2),
|
&format!("Trait2: {}", self.card.trait2),
|
||||||
Point::new(20, 290),
|
Point::new(20, 290),
|
||||||
style,
|
style,
|
||||||
)
|
)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Text::new(
|
Text::new(
|
||||||
&format!("Trait3: {}", self.card.trait3),
|
&format!("Trait3: {}", self.card.trait3),
|
||||||
Point::new(20, 300),
|
Point::new(20, 300),
|
||||||
style,
|
style,
|
||||||
)
|
)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Text::new(
|
Text::new(
|
||||||
&format!("Secret: {}", self.card.secret),
|
&format!("Secret: {}", self.card.secret),
|
||||||
Point::new(20, 310),
|
Point::new(20, 310),
|
||||||
style,
|
style,
|
||||||
)
|
)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
|
|
||||||
let palette: Palette = self.card.cardtype.clone().into();
|
let palette: Palette = self.card.cardtype.clone().into();
|
||||||
render_sprite_onto_ili9341(display, self.card.sprite.data.as_slice(), &palette);
|
render_sprite_onto_ili9341(display, self.card.sprite.data.as_slice(), &palette);
|
||||||
|
|||||||
@@ -1,21 +1,30 @@
|
|||||||
|
use crate::drivers::primary_lcd::PrimaryDisplayError;
|
||||||
use crate::navigation::navigation::Action;
|
use crate::navigation::navigation::Action;
|
||||||
use crate::navigation::navigation::Navigable;
|
use crate::navigation::navigation::Navigable;
|
||||||
use crate::navigation::navigation::NewState;
|
use crate::navigation::navigation::NewState;
|
||||||
use crate::navigation::outputs::Outputs;
|
use crate::navigation::outputs::Outputs;
|
||||||
use crate::peripherals::Peripherals;
|
use crate::peripherals::Peripherals;
|
||||||
use crate::peripherals::storage::MAGIC_REGION;
|
use crate::peripherals::storage::MAGIC_REGION;
|
||||||
|
use crate::peripherals::storage::cardstore::COUNT_REGION;
|
||||||
use crate::views::view::View;
|
use crate::views::view::View;
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
use core::error;
|
use core::error;
|
||||||
use embedded_graphics::mono_font::MonoTextStyle;
|
|
||||||
use embedded_graphics::mono_font::ascii::FONT_10X20;
|
|
||||||
use embedded_graphics::pixelcolor::Rgb565;
|
|
||||||
use embedded_graphics::prelude::DrawTarget;
|
|
||||||
use embedded_graphics::prelude::RgbColor;
|
|
||||||
use embedded_graphics::text::Text;
|
|
||||||
|
|
||||||
use embedded_graphics::prelude::Point;
|
use embedded_graphics::prelude::Point;
|
||||||
|
use embedded_graphics::{
|
||||||
|
Drawable,
|
||||||
|
mono_font::{MonoTextStyle, ascii::FONT_10X20},
|
||||||
|
pixelcolor::Rgb565,
|
||||||
|
prelude::*,
|
||||||
|
primitives::Rectangle,
|
||||||
|
text::Text,
|
||||||
|
};
|
||||||
|
|
||||||
|
use alloc::format;
|
||||||
|
use embedded_text::{
|
||||||
|
TextBox,
|
||||||
|
alignment::HorizontalAlignment,
|
||||||
|
style::{HeightMode, TextBoxStyleBuilder},
|
||||||
|
};
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct FlashInfoView {}
|
pub struct FlashInfoView {}
|
||||||
|
|
||||||
@@ -35,7 +44,39 @@ impl Navigable for FlashInfoView {
|
|||||||
.flash_store
|
.flash_store
|
||||||
.read(MAGIC_REGION.offset, &mut magic_bytes)
|
.read(MAGIC_REGION.offset, &mut magic_bytes)
|
||||||
.await?;
|
.await?;
|
||||||
Text::new("Flash Initialized: {:?}", Point::new(40, 40), style);
|
let mut card_count_bytes: [u8; COUNT_REGION.size] = [0; COUNT_REGION.size];
|
||||||
|
peripherals
|
||||||
|
.store
|
||||||
|
.lock()
|
||||||
|
.await
|
||||||
|
.flash_store
|
||||||
|
.read(COUNT_REGION.offset, &mut card_count_bytes)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let style = MonoTextStyle::new(&FONT_10X20, Rgb565::WHITE);
|
||||||
|
let textbox_style = TextBoxStyleBuilder::new()
|
||||||
|
.height_mode(HeightMode::FitToText)
|
||||||
|
.alignment(HorizontalAlignment::Center)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
let display_area = outputs.primary_display.bounding_box();
|
||||||
|
let bounds = Rectangle::new(Point::new(0, 30), display_area.size);
|
||||||
|
|
||||||
|
TextBox::with_textbox_style(
|
||||||
|
&format!(
|
||||||
|
"
|
||||||
|
Flash Init Magic: 0x{:x}\n
|
||||||
|
Card Count: {}\n
|
||||||
|
",
|
||||||
|
u32::from_le_bytes(magic_bytes),
|
||||||
|
u32::from_le_bytes(card_count_bytes)
|
||||||
|
),
|
||||||
|
bounds,
|
||||||
|
style,
|
||||||
|
textbox_style,
|
||||||
|
)
|
||||||
|
.draw(&mut outputs.primary_display)
|
||||||
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
use crate::drivers::primary_lcd::PrimaryDisplayError;
|
||||||
|
use crate::peripherals::Peripherals;
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
use core::error;
|
use core::error;
|
||||||
use crate::peripherals::Peripherals;
|
|
||||||
use core::future;
|
use core::future;
|
||||||
|
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
@@ -31,7 +32,10 @@ impl Navigable for JournalView {
|
|||||||
_: &Peripherals,
|
_: &Peripherals,
|
||||||
) -> impl core::future::Future<Output = Result<(), Box<dyn error::Error>>> + Send {
|
) -> impl core::future::Future<Output = Result<(), Box<dyn error::Error>>> + Send {
|
||||||
async move {
|
async move {
|
||||||
outputs.primary_display.clear(Rgb565::BLACK).unwrap();
|
outputs
|
||||||
|
.primary_display
|
||||||
|
.clear(Rgb565::BLACK)
|
||||||
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use crate::drivers::primary_lcd::PrimaryDisplayError;
|
||||||
use crate::peripherals::Peripherals;
|
use crate::peripherals::Peripherals;
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
use alloc::vec;
|
use alloc::vec;
|
||||||
@@ -17,7 +18,6 @@ use embedded_graphics::pixelcolor::Rgb565;
|
|||||||
use embedded_graphics::prelude::RgbColor;
|
use embedded_graphics::prelude::RgbColor;
|
||||||
use embedded_graphics_core::draw_target::DrawTarget;
|
use embedded_graphics_core::draw_target::DrawTarget;
|
||||||
|
|
||||||
use crate::peripherals::storage::cardstore::CardStoreError;
|
|
||||||
pub const MAX_SELECTED: i32 = 4;
|
pub const MAX_SELECTED: i32 = 4;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@@ -35,10 +35,14 @@ impl Navigable for MainMenu {
|
|||||||
let display = &mut outputs.primary_display;
|
let display = &mut outputs.primary_display;
|
||||||
display.clear(Rgb565::BLACK).unwrap();
|
display.clear(Rgb565::BLACK).unwrap();
|
||||||
|
|
||||||
menu_item::show(display, "Scan card", 0, self.selected);
|
menu_item::show(display, "Scan card", 0, self.selected)
|
||||||
menu_item::show(display, "Last card", 1, self.selected);
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
menu_item::show(display, "Journal", 2, self.selected);
|
menu_item::show(display, "Last card", 1, self.selected)
|
||||||
menu_item::show(display, "Settings", 3, self.selected);
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
|
menu_item::show(display, "Journal", 2, self.selected)
|
||||||
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
|
menu_item::show(display, "Settings", 3, self.selected)
|
||||||
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
use alloc::boxed::Box;
|
|
||||||
use core::error;
|
|
||||||
use crate::peripherals::Peripherals;
|
|
||||||
use embedded_graphics::Drawable;
|
use embedded_graphics::Drawable;
|
||||||
use embedded_graphics::draw_target::DrawTarget;
|
use embedded_graphics::draw_target::DrawTarget;
|
||||||
use embedded_graphics::mono_font::MonoTextStyle;
|
use embedded_graphics::mono_font::MonoTextStyle;
|
||||||
@@ -10,7 +7,7 @@ use embedded_graphics::prelude::Point;
|
|||||||
use embedded_graphics::prelude::RgbColor;
|
use embedded_graphics::prelude::RgbColor;
|
||||||
use embedded_graphics::text::Text;
|
use embedded_graphics::text::Text;
|
||||||
|
|
||||||
pub fn show<D>(display: &mut D, name: &str, position: i32, selected: i32)
|
pub fn show<D>(display: &mut D, name: &str, position: i32, selected: i32) -> Result<(), D::Error>
|
||||||
where
|
where
|
||||||
D: DrawTarget<Color = Rgb565>,
|
D: DrawTarget<Color = Rgb565>,
|
||||||
D::Error: core::fmt::Debug,
|
D::Error: core::fmt::Debug,
|
||||||
@@ -27,6 +24,6 @@ where
|
|||||||
style
|
style
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.draw(display)
|
.draw(display)?;
|
||||||
.unwrap();
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use crate::drivers::primary_lcd::PrimaryDisplayError;
|
||||||
use crate::navigation::inputs::ButtonAction;
|
use crate::navigation::inputs::ButtonAction;
|
||||||
use crate::navigation::navigation::CARD_DATA;
|
use crate::navigation::navigation::CARD_DATA;
|
||||||
use crate::navigation::navigation::NewState;
|
use crate::navigation::navigation::NewState;
|
||||||
@@ -44,13 +45,15 @@ impl Navigable for ScanMenu {
|
|||||||
async move {
|
async move {
|
||||||
let display = &mut outputs.primary_display;
|
let display = &mut outputs.primary_display;
|
||||||
let style = MonoTextStyle::new(&FONT_10X20, Rgb565::WHITE);
|
let style = MonoTextStyle::new(&FONT_10X20, Rgb565::WHITE);
|
||||||
display.clear(Rgb565::BLACK).unwrap();
|
display
|
||||||
|
.clear(Rgb565::BLACK)
|
||||||
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
|
|
||||||
let display_area = display.bounding_box();
|
let display_area = display.bounding_box();
|
||||||
|
|
||||||
Text::new("Scanning...", Point::new(20, 30), style)
|
Text::new("Scanning...", Point::new(20, 30), style)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
|
|
||||||
// Create styles used by the drawing operations.
|
// Create styles used by the drawing operations.
|
||||||
let arc_stroke = PrimitiveStyleBuilder::new()
|
let arc_stroke = PrimitiveStyleBuilder::new()
|
||||||
@@ -80,13 +83,13 @@ impl Navigable for ScanMenu {
|
|||||||
)
|
)
|
||||||
.into_styled(arc_stroke)
|
.into_styled(arc_stroke)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
|
|
||||||
// Draw centered text.
|
// Draw centered text.
|
||||||
let text = format!("{:.2}%", 100. * (self.progress as f32) / 255.);
|
let text = format!("{:.2}%", 100. * (self.progress as f32) / 255.);
|
||||||
Text::with_text_style(&text, display_area.center(), character_style, text_style)
|
Text::with_text_style(&text, display_area.center(), character_style, text_style)
|
||||||
.draw(display)
|
.draw(display)
|
||||||
.unwrap();
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use crate::drivers::primary_lcd::PrimaryDisplayError;
|
||||||
use crate::navigation::navigation::{Action, Navigable, NewState};
|
use crate::navigation::navigation::{Action, Navigable, NewState};
|
||||||
use crate::navigation::outputs::Outputs;
|
use crate::navigation::outputs::Outputs;
|
||||||
use crate::peripherals::Peripherals;
|
use crate::peripherals::Peripherals;
|
||||||
@@ -27,9 +28,12 @@ impl Navigable for SettingsMenu {
|
|||||||
async move {
|
async move {
|
||||||
let display = &mut outputs.primary_display;
|
let display = &mut outputs.primary_display;
|
||||||
display.clear(Rgb565::BLACK).unwrap();
|
display.clear(Rgb565::BLACK).unwrap();
|
||||||
menu_item::show(display, "System Inforation", 0, self.selected);
|
menu_item::show(display, "System Inforation", 0, self.selected)
|
||||||
menu_item::show(display, "Wifi Information", 1, self.selected);
|
.map_err(PrimaryDisplayError::from)?;
|
||||||
menu_item::show(display, "Flash Information", 2, self.selected);
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1 @@
|
|||||||
use alloc::boxed::Box;
|
|
||||||
use core::error;
|
|
||||||
// Status bar view module
|
// Status bar view module
|
||||||
|
|||||||
Reference in New Issue
Block a user