From 1df21e7fc5e1628dc4f02f23818a0dafd1a1ae43 Mon Sep 17 00:00:00 2001 From: Hexa Dust Date: Fri, 18 Jul 2025 20:31:23 +0100 Subject: [PATCH] key debounce --- src/main.rs | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4ff7ed9..8f11f0e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -290,7 +290,7 @@ impl Default for DispalyState { } } -#[derive(uDebug, Clone, Copy)] +#[derive(uDebug, Clone, Copy, PartialEq, Eq)] enum InputKey { Up, C, @@ -350,6 +350,32 @@ impl, KO: AdcChannel> Input { } } +#[derive(Default)] +struct Debounce { + history: [Option; 4], + pos: usize, + last: Option, +} + +impl Debounce { + fn input(&mut self, key: Option) -> Option { + self.history[self.pos] = key; + self.pos += 1; + if self.pos >= self.history.len() { + self.pos = 0; + } + if self.history.iter().all(|hist| hist == &key) && self.last != key { + self.last = key; + key + } else if self.history.iter().all(|hist| hist == &None) { + self.last = None; + None + } else { + None + } + } +} + #[arduino_hal::entry] fn main() -> ! { let dp = arduino_hal::Peripherals::take().unwrap(); @@ -388,6 +414,7 @@ fn main() -> ! { let mut adc = Adc::new(dp.ADC, Default::default()); let input = Input::new(ADC7, ADC6); + let mut debounce = Debounce::default(); let mut display = DispalyState::default(); display.0[0] = SegmentState::Num(0, true); @@ -416,17 +443,10 @@ fn main() -> ! { io_select.set_off(); } - if let Some((no, kn, ko)) = key { - let key = InputKey::map(no, kn, ko); - ufmt::uwriteln!( - &mut serial, - "no: {} kn: {} ko: {} key: {:?}", - no, - kn, - ko, - key - ) - .unwrap_infallible(); + let key = key.and_then(|(no, kn, ko)| InputKey::map(no, kn, ko)); + + if let Some(key) = debounce.input(key) { + ufmt::uwriteln!(&mut serial, "key: {:?}", key).unwrap_infallible(); } arduino_hal::delay_ms(1); }