use embassy_time::Instant;
use super::{DebounceState, DebouncerTrait};
use crate::DEBOUNCE_THRESHOLD;
use crate::matrix::KeyState;
pub struct FastDebouncer<const ROW: usize, const COL: usize> {
last_ms: Instant,
debouncing: [[bool; ROW]; COL],
}
impl<const ROW: usize, const COL: usize> Default for FastDebouncer<ROW, COL> {
fn default() -> Self {
Self::new()
}
}
impl<const ROW: usize, const COL: usize> FastDebouncer<ROW, COL> {
pub fn new() -> Self {
FastDebouncer {
debouncing: [[false; ROW]; COL],
last_ms: Instant::now(),
}
}
}
impl<const ROW: usize, const COL: usize> DebouncerTrait<ROW, COL> for FastDebouncer<ROW, COL> {
fn detect_change_with_debounce(
&mut self,
row_idx: usize,
col_idx: usize,
key_active: bool,
key_state: &KeyState,
) -> DebounceState {
let debouncing = self.debouncing[col_idx][row_idx];
if debouncing {
if self.last_ms.elapsed().as_millis() as u16 > DEBOUNCE_THRESHOLD {
self.debouncing[col_idx][row_idx] = false;
DebounceState::Ignored
} else {
DebounceState::InProgress
}
} else if key_state.pressed != key_active {
self.last_ms = Instant::now();
self.debouncing[col_idx][row_idx] = true;
DebounceState::Debounced
} else {
DebounceState::Ignored
}
}
}