From ff40ffa908b56735db34e9b38e609821638249d3 Mon Sep 17 00:00:00 2001 From: Hexa Dust Date: Fri, 18 Jul 2025 20:31:23 +0100 Subject: [PATCH] key mapping --- src/main.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index e9c6f71..4ff7ed9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,7 @@ use arduino_hal::{ prelude::*, Adc, }; +use ufmt::derive::uDebug; // NOTE: 115200 @ 16MHz is 3.5% off, try 9600 or 1M if it causes issues (https://wormfood.net/avrbaudcalc.php) const SERIAL_BAUD: u32 = 115200; @@ -131,6 +132,10 @@ struct IOSelect<'p> { } impl IOSelect<'_> { + fn display_no(&self) -> usize { + self.display_no + } + fn set_on(&mut self) { self.pin.set_high() } @@ -285,6 +290,45 @@ impl Default for DispalyState { } } +#[derive(uDebug, Clone, Copy)] +enum InputKey { + Up, + C, + Num(u8), + Mul, + Div, + Plus, + Minus, + Down, + E, +} + +impl InputKey { + fn map(display_no: usize, kn: bool, ko: bool) -> Option { + match (display_no, kn, ko) { + (0, true, false) => Some(InputKey::Num(1)), + (0, false, true) => Some(InputKey::C), + (1, true, false) => Some(InputKey::Num(5)), + (1, false, true) => Some(InputKey::Div), + (2, true, false) => Some(InputKey::Num(6)), + (2, false, true) => Some(InputKey::Mul), + (3, true, false) => Some(InputKey::Num(7)), + (3, false, true) => Some(InputKey::Up), + (4, true, false) => Some(InputKey::Num(8)), + (4, false, true) => Some(InputKey::E), + (5, true, false) => Some(InputKey::Num(9)), + (5, false, true) => Some(InputKey::Num(0)), + (6, true, false) => Some(InputKey::Num(2)), + (6, false, true) => Some(InputKey::Down), + (7, true, false) => Some(InputKey::Num(3)), + (7, false, true) => Some(InputKey::Plus), + (8, true, false) => Some(InputKey::Num(4)), + (8, false, true) => Some(InputKey::Minus), + _ => None, + } + } +} + struct Input { kn: KN, ko: KO, @@ -295,11 +339,11 @@ impl, KO: AdcChannel> Input { Input { kn, ko } } - fn read(&self, adc: &mut Adc) -> Option<(u16, u16)> { + fn read(&self, adc: &mut Adc) -> Option<(bool, bool)> { let kn = adc.read_blocking(&self.kn); let ko = adc.read_blocking(&self.ko); if kn > 500 || ko > 500 { - Some((kn, ko)) + Some((kn > 500, ko > 500)) } else { None } @@ -357,7 +401,7 @@ fn main() -> ! { display.0[8] = SegmentState::Num(8, false); loop { - let mut key: Option<(usize, u16, u16)> = None; + let mut key: Option<(usize, bool, bool)> = None; for (mut io_select, ss) in io.iter_mut().zip(display.0.iter()) { ss.apply(&mut seg); io_select.set_on(); @@ -365,16 +409,26 @@ fn main() -> ! { io_select.set_off(); seg.set_off(); io_select.set_on(); - arduino_hal::delay_ms(1); + // arduino_hal::delay_us(100); if let Some((kn, ko)) = input.read(&mut adc) { - key = Some((io_select.display_no, kn, ko)) + key = Some((io_select.display_no(), kn, ko)) } io_select.set_off(); } if let Some((no, kn, ko)) = key { - ufmt::uwriteln!(&mut serial, "no: {} kn: {} ko: {}", no, kn, ko).unwrap_infallible(); + let key = InputKey::map(no, kn, ko); + ufmt::uwriteln!( + &mut serial, + "no: {} kn: {} ko: {} key: {:?}", + no, + kn, + ko, + key + ) + .unwrap_infallible(); } + arduino_hal::delay_ms(1); } // loop {