debounce key readout
This commit is contained in:
@@ -42,17 +42,13 @@ impl KeyPress {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(uDebug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct KeyReadout {
|
||||
display_no: usize,
|
||||
kn: bool,
|
||||
ko: bool,
|
||||
}
|
||||
|
||||
impl KeyReadout {
|
||||
pub fn to_keypress(&self, display_no: usize) -> Option<KeyPress> {
|
||||
KeyPress::map(display_no, self.kn, self.ko)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Keyboard<KN, KO> {
|
||||
kn: KN,
|
||||
ko: KO,
|
||||
@@ -63,11 +59,12 @@ impl<KN: AdcChannel<Atmega, ADC>, KO: AdcChannel<Atmega, ADC>> Keyboard<KN, KO>
|
||||
Keyboard { kn, ko }
|
||||
}
|
||||
|
||||
pub fn read(&self, adc: &mut Adc) -> Option<KeyReadout> {
|
||||
pub fn read(&self, adc: &mut Adc, display_no: usize) -> Option<KeyReadout> {
|
||||
let kn = adc.read_blocking(&self.kn);
|
||||
let ko = adc.read_blocking(&self.ko);
|
||||
if kn > KEYBOARD_ADC_THRESHOLD || ko > KEYBOARD_ADC_THRESHOLD {
|
||||
Some(KeyReadout {
|
||||
display_no,
|
||||
kn: kn > KEYBOARD_ADC_THRESHOLD,
|
||||
ko: ko > KEYBOARD_ADC_THRESHOLD,
|
||||
})
|
||||
@@ -79,13 +76,13 @@ impl<KN: AdcChannel<Atmega, ADC>, KO: AdcChannel<Atmega, ADC>> Keyboard<KN, KO>
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct Debounce {
|
||||
record: [Option<KeyPress>; DEBOUNCE_DEPTH],
|
||||
record: [Option<KeyReadout>; DEBOUNCE_DEPTH],
|
||||
pos: usize,
|
||||
last: Option<KeyPress>,
|
||||
last: Option<KeyReadout>,
|
||||
}
|
||||
|
||||
impl Debounce {
|
||||
pub fn input(&mut self, key: Option<KeyPress>) -> Option<KeyPress> {
|
||||
pub fn input(&mut self, key: Option<KeyReadout>) -> Option<KeyPress> {
|
||||
self.record[self.pos] = key;
|
||||
self.pos += 1;
|
||||
if self.pos >= self.record.len() {
|
||||
@@ -93,7 +90,9 @@ impl Debounce {
|
||||
}
|
||||
if self.record.iter().all(|hist| hist == &key) && self.last != key {
|
||||
self.last = key;
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user