key debounce

This commit is contained in:
2025-07-18 20:31:23 +01:00
parent ff40ffa908
commit 1df21e7fc5

View File

@@ -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<KN: AdcChannel<Atmega, ADC>, KO: AdcChannel<Atmega, ADC>> Input<KN, KO> {
}
}
#[derive(Default)]
struct Debounce {
history: [Option<InputKey>; 4],
pos: usize,
last: Option<InputKey>,
}
impl Debounce {
fn input(&mut self, key: Option<InputKey>) -> Option<InputKey> {
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);
}