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 {
|
enum InputKey {
|
||||||
Up,
|
Up,
|
||||||
C,
|
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]
|
#[arduino_hal::entry]
|
||||||
fn main() -> ! {
|
fn main() -> ! {
|
||||||
let dp = arduino_hal::Peripherals::take().unwrap();
|
let dp = arduino_hal::Peripherals::take().unwrap();
|
||||||
@@ -388,6 +414,7 @@ fn main() -> ! {
|
|||||||
|
|
||||||
let mut adc = Adc::new(dp.ADC, Default::default());
|
let mut adc = Adc::new(dp.ADC, Default::default());
|
||||||
let input = Input::new(ADC7, ADC6);
|
let input = Input::new(ADC7, ADC6);
|
||||||
|
let mut debounce = Debounce::default();
|
||||||
|
|
||||||
let mut display = DispalyState::default();
|
let mut display = DispalyState::default();
|
||||||
display.0[0] = SegmentState::Num(0, true);
|
display.0[0] = SegmentState::Num(0, true);
|
||||||
@@ -416,17 +443,10 @@ fn main() -> ! {
|
|||||||
io_select.set_off();
|
io_select.set_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some((no, kn, ko)) = key {
|
let key = key.and_then(|(no, kn, ko)| InputKey::map(no, kn, ko));
|
||||||
let key = InputKey::map(no, kn, ko);
|
|
||||||
ufmt::uwriteln!(
|
if let Some(key) = debounce.input(key) {
|
||||||
&mut serial,
|
ufmt::uwriteln!(&mut serial, "key: {:?}", key).unwrap_infallible();
|
||||||
"no: {} kn: {} ko: {} key: {:?}",
|
|
||||||
no,
|
|
||||||
kn,
|
|
||||||
ko,
|
|
||||||
key
|
|
||||||
)
|
|
||||||
.unwrap_infallible();
|
|
||||||
}
|
}
|
||||||
arduino_hal::delay_ms(1);
|
arduino_hal::delay_ms(1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user