key mapping
This commit is contained in:
66
src/main.rs
66
src/main.rs
@@ -17,6 +17,7 @@ use arduino_hal::{
|
||||
prelude::*,
|
||||
Adc,
|
||||
};
|
||||
use ufmt::derive::uDebug;
|
||||
|
||||
// NOTE: 115200 @ 16MHz is 3.5% off, try 9600 or 1M if it causes issues (https://wormfood.net/avrbaudcalc.php)
|
||||
const SERIAL_BAUD: u32 = 115200;
|
||||
@@ -131,6 +132,10 @@ struct IOSelect<'p> {
|
||||
}
|
||||
|
||||
impl IOSelect<'_> {
|
||||
fn display_no(&self) -> usize {
|
||||
self.display_no
|
||||
}
|
||||
|
||||
fn set_on(&mut self) {
|
||||
self.pin.set_high()
|
||||
}
|
||||
@@ -285,6 +290,45 @@ impl Default for DispalyState {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(uDebug, Clone, Copy)]
|
||||
enum InputKey {
|
||||
Up,
|
||||
C,
|
||||
Num(u8),
|
||||
Mul,
|
||||
Div,
|
||||
Plus,
|
||||
Minus,
|
||||
Down,
|
||||
E,
|
||||
}
|
||||
|
||||
impl InputKey {
|
||||
fn map(display_no: usize, kn: bool, ko: bool) -> Option<InputKey> {
|
||||
match (display_no, kn, ko) {
|
||||
(0, true, false) => Some(InputKey::Num(1)),
|
||||
(0, false, true) => Some(InputKey::C),
|
||||
(1, true, false) => Some(InputKey::Num(5)),
|
||||
(1, false, true) => Some(InputKey::Div),
|
||||
(2, true, false) => Some(InputKey::Num(6)),
|
||||
(2, false, true) => Some(InputKey::Mul),
|
||||
(3, true, false) => Some(InputKey::Num(7)),
|
||||
(3, false, true) => Some(InputKey::Up),
|
||||
(4, true, false) => Some(InputKey::Num(8)),
|
||||
(4, false, true) => Some(InputKey::E),
|
||||
(5, true, false) => Some(InputKey::Num(9)),
|
||||
(5, false, true) => Some(InputKey::Num(0)),
|
||||
(6, true, false) => Some(InputKey::Num(2)),
|
||||
(6, false, true) => Some(InputKey::Down),
|
||||
(7, true, false) => Some(InputKey::Num(3)),
|
||||
(7, false, true) => Some(InputKey::Plus),
|
||||
(8, true, false) => Some(InputKey::Num(4)),
|
||||
(8, false, true) => Some(InputKey::Minus),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Input<KN, KO> {
|
||||
kn: KN,
|
||||
ko: KO,
|
||||
@@ -295,11 +339,11 @@ impl<KN: AdcChannel<Atmega, ADC>, KO: AdcChannel<Atmega, ADC>> Input<KN, KO> {
|
||||
Input { kn, ko }
|
||||
}
|
||||
|
||||
fn read(&self, adc: &mut Adc) -> Option<(u16, u16)> {
|
||||
fn read(&self, adc: &mut Adc) -> Option<(bool, bool)> {
|
||||
let kn = adc.read_blocking(&self.kn);
|
||||
let ko = adc.read_blocking(&self.ko);
|
||||
if kn > 500 || ko > 500 {
|
||||
Some((kn, ko))
|
||||
Some((kn > 500, ko > 500))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
@@ -357,7 +401,7 @@ fn main() -> ! {
|
||||
display.0[8] = SegmentState::Num(8, false);
|
||||
|
||||
loop {
|
||||
let mut key: Option<(usize, u16, u16)> = None;
|
||||
let mut key: Option<(usize, bool, bool)> = None;
|
||||
for (mut io_select, ss) in io.iter_mut().zip(display.0.iter()) {
|
||||
ss.apply(&mut seg);
|
||||
io_select.set_on();
|
||||
@@ -365,16 +409,26 @@ fn main() -> ! {
|
||||
io_select.set_off();
|
||||
seg.set_off();
|
||||
io_select.set_on();
|
||||
arduino_hal::delay_ms(1);
|
||||
// arduino_hal::delay_us(100);
|
||||
if let Some((kn, ko)) = input.read(&mut adc) {
|
||||
key = Some((io_select.display_no, kn, ko))
|
||||
key = Some((io_select.display_no(), kn, ko))
|
||||
}
|
||||
io_select.set_off();
|
||||
}
|
||||
|
||||
if let Some((no, kn, ko)) = key {
|
||||
ufmt::uwriteln!(&mut serial, "no: {} kn: {} ko: {}", no, kn, ko).unwrap_infallible();
|
||||
let key = InputKey::map(no, kn, ko);
|
||||
ufmt::uwriteln!(
|
||||
&mut serial,
|
||||
"no: {} kn: {} ko: {} key: {:?}",
|
||||
no,
|
||||
kn,
|
||||
ko,
|
||||
key
|
||||
)
|
||||
.unwrap_infallible();
|
||||
}
|
||||
arduino_hal::delay_ms(1);
|
||||
}
|
||||
|
||||
// loop {
|
||||
|
||||
Reference in New Issue
Block a user