key debounce
This commit is contained in:
44
src/main.rs
44
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<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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user