From b597bedc0b0ea700184f99ef17add2a3d5922035 Mon Sep 17 00:00:00 2001 From: Hexa Dust Date: Fri, 18 Jul 2025 20:31:23 +0100 Subject: [PATCH] debounce key readout --- src/keyboard.rs | 21 ++++++++++----------- src/main.rs | 12 +++++------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/keyboard.rs b/src/keyboard.rs index b3fd539..2d37c91 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -42,17 +42,13 @@ impl KeyPress { } } +#[derive(uDebug, Clone, Copy, PartialEq, Eq)] pub struct KeyReadout { + display_no: usize, kn: bool, ko: bool, } -impl KeyReadout { - pub fn to_keypress(&self, display_no: usize) -> Option { - KeyPress::map(display_no, self.kn, self.ko) - } -} - pub struct Keyboard { kn: KN, ko: KO, @@ -63,11 +59,12 @@ impl, KO: AdcChannel> Keyboard Keyboard { kn, ko } } - pub fn read(&self, adc: &mut Adc) -> Option { + pub fn read(&self, adc: &mut Adc, display_no: usize) -> Option { let kn = adc.read_blocking(&self.kn); let ko = adc.read_blocking(&self.ko); if kn > KEYBOARD_ADC_THRESHOLD || ko > KEYBOARD_ADC_THRESHOLD { Some(KeyReadout { + display_no, kn: kn > KEYBOARD_ADC_THRESHOLD, ko: ko > KEYBOARD_ADC_THRESHOLD, }) @@ -79,13 +76,13 @@ impl, KO: AdcChannel> Keyboard #[derive(Default)] pub struct Debounce { - record: [Option; DEBOUNCE_DEPTH], + record: [Option; DEBOUNCE_DEPTH], pos: usize, - last: Option, + last: Option, } impl Debounce { - pub fn input(&mut self, key: Option) -> Option { + pub fn input(&mut self, key: Option) -> Option { self.record[self.pos] = key; self.pos += 1; if self.pos >= self.record.len() { @@ -93,7 +90,9 @@ impl Debounce { } if self.record.iter().all(|hist| hist == &key) && self.last != key { self.last = key; - key + key.and_then(|key_readout| { + KeyPress::map(key_readout.display_no, key_readout.kn, key_readout.ko) + }) } else if self.record.iter().all(|hist| hist == &None) { self.last = None; None diff --git a/src/main.rs b/src/main.rs index 16e28c2..f699061 100644 --- a/src/main.rs +++ b/src/main.rs @@ -480,7 +480,7 @@ fn main() -> ! { ); let mut adc = Adc::new(dp.ADC, Default::default()); - let input = Keyboard::new(ADC7, ADC6); + let keyboard = Keyboard::new(ADC7, ADC6); let mut debounce = Debounce::default(); let mut number_input = NumberInput::default(); @@ -491,7 +491,7 @@ fn main() -> ! { let mut state = State::EnterSignificant; loop { - let mut last_key_readout: Option<(usize, KeyReadout)> = None; + let mut last_key_readout: Option = None; for (mut io_select, ss) in io.iter_mut().zip(display.0.iter()) { ss.apply(&mut seg); io_select.set_on(); @@ -499,15 +499,13 @@ fn main() -> ! { io_select.set_off(); seg.set_off(); io_select.set_on(); - if let Some(key_readout) = input.read(&mut adc) { - last_key_readout = Some((io_select.display_no(), key_readout)); + if let key_readout @ Some(_) = keyboard.read(&mut adc, io_select.display_no()) { + last_key_readout = key_readout; } io_select.set_off(); } - let key_press = last_key_readout - .and_then(|(display_no, key_readout)| key_readout.to_keypress(display_no)); - if let Some(key) = debounce.input(key_press) { + if let Some(key) = debounce.input(last_key_readout) { ufmt::uwriteln!(&mut serial, "key: {:?} state: {:?}", key, state).unwrap_infallible(); let res = match state { State::EnterSignificant => match key {