From ef97c334b517d74aa4642e3f45369c1182ad64c0 Mon Sep 17 00:00:00 2001 From: Hexa Dust Date: Fri, 18 Jul 2025 20:31:23 +0100 Subject: [PATCH] zero latency debounce --- src/keyboard.rs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/keyboard.rs b/src/keyboard.rs index 2d37c91..f7ea0c0 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -78,26 +78,24 @@ impl, KO: AdcChannel> Keyboard pub struct Debounce { record: [Option; DEBOUNCE_DEPTH], pos: usize, - last: Option, } impl Debounce { pub fn input(&mut self, key: Option) -> Option { + // React to fresh key press immediately if it was not pressed for depth of record + let new_key = key.and_then(|key| { + self.record + .iter() + .all(|hist| hist != &Some(key)) + .then_some(key) + }); + self.record[self.pos] = key; self.pos += 1; if self.pos >= self.record.len() { self.pos = 0; } - if self.record.iter().all(|hist| hist == &key) && self.last != key { - self.last = 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 - } else { - None - } + + new_key.and_then(|key| KeyPress::map(key.display_no, key.kn, key.ko)) } }