use super::{Event, Home, Screens}; use crate::{eeprom, lcd::Lcd, Input, BACKLIGHT, CONTRAST}; use nb::block; enum Selection { Backlight, BacklightEdit, Contrast, ContrastEdit, Back, } pub struct Setup { active: Selection, backlight: u8, contrast: u8, } impl Setup { pub fn new() -> Self { Self { active: Selection::Backlight, backlight: block!(eeprom::read_byte(&BACKLIGHT)).unwrap(), contrast: block!(eeprom::read_byte(&CONTRAST)).unwrap(), } } pub fn input(&mut self, input: &Input) -> Event { self.active = match self.active { Selection::Backlight => match input { Input::Next => Selection::Contrast, Input::Previous => Selection::Back, Input::Select => Selection::BacklightEdit, Input::Back => return Event::Screen(Screens::Home(Home::new())), }, Selection::BacklightEdit => match input { Input::Next => { self.backlight = if self.backlight == u8::MAX { u8::MAX } else { self.backlight + 1 }; return Event::Backlight(self.backlight); } Input::Previous => { self.backlight = if self.backlight == u8::MIN { u8::MIN } else { self.backlight - 1 }; return Event::Backlight(self.backlight); } Input::Select => { block!(eeprom::write_byte(&BACKLIGHT, self.backlight)).unwrap(); Selection::Backlight } Input::Back => { self.active = Selection::Backlight; self.backlight = block!(eeprom::read_byte(&BACKLIGHT)).unwrap(); return Event::Backlight(self.backlight); } }, Selection::Contrast => match input { Input::Next => Selection::Back, Input::Previous => Selection::Backlight, Input::Select => Selection::ContrastEdit, Input::Back => return Event::Screen(Screens::Home(Home::new())), }, Selection::ContrastEdit => match input { Input::Next => { self.contrast = if self.contrast >= 63 { 63 } else { self.contrast + 1 }; return Event::Contrast(self.contrast); } Input::Previous => { self.contrast = if self.contrast == u8::MIN { u8::MIN } else { self.contrast - 1 }; return Event::Contrast(self.contrast); } Input::Select => { block!(eeprom::write_byte(&CONTRAST, self.contrast)).unwrap(); Selection::Contrast } Input::Back => { self.active = Selection::Contrast; self.contrast = block!(eeprom::read_byte(&CONTRAST)).unwrap(); return Event::Contrast(self.contrast); } }, Selection::Back => match input { Input::Next => Selection::Backlight, Input::Previous => Selection::Contrast, _ => return Event::Screen(Screens::Home(Home::new())), }, }; Event::None } pub fn draw(&self, lcd: &mut Lcd) { lcd.fill_area(0, 0, 33, 2, 0xFF); lcd.print(33, 0, true, "SETUP"); lcd.fill_area(69, 0, 33, 2, 0xFF); match &self.active { Selection::Contrast => { lcd.print(0, 2, false, "BACKLIGHT:"); lcd.print_u8(81, 2, 3, false, self.backlight); lcd.print(0, 4, true, "CONTRAST:"); lcd.print_u8(87, 4, 2, false, self.contrast); lcd.print(36, 6, false, "BACK"); } Selection::ContrastEdit => { lcd.print(0, 2, false, "BACKLIGHT:"); lcd.print_u8(81, 2, 3, false, self.backlight); lcd.print(0, 4, false, "CONTRAST:"); lcd.print_u8(87, 4, 2, true, self.contrast); lcd.print(36, 6, false, "BACK"); } Selection::Backlight => { lcd.print(0, 2, true, "BACKLIGHT:"); lcd.print_u8(81, 2, 3, false, self.backlight); lcd.print(0, 4, false, "CONTRAST:"); lcd.print_u8(87, 4, 2, false, self.contrast); lcd.print(36, 6, false, "BACK"); } Selection::BacklightEdit => { lcd.print(0, 2, false, "BACKLIGHT:"); lcd.print_u8(81, 2, 3, true, self.backlight); lcd.print(0, 4, false, "CONTRAST:"); lcd.print_u8(87, 4, 2, false, self.contrast); lcd.print(36, 6, false, "BACK"); } Selection::Back => { lcd.print(0, 2, false, "BACKLIGHT:"); lcd.print_u8(81, 2, 3, false, self.backlight); lcd.print(0, 4, false, "CONTRAST:"); lcd.print_u8(87, 4, 2, false, self.contrast); lcd.print(36, 6, true, "BACK"); } } } }