key mapping
This commit is contained in:
66
src/main.rs
66
src/main.rs
@@ -17,6 +17,7 @@ use arduino_hal::{
|
|||||||
prelude::*,
|
prelude::*,
|
||||||
Adc,
|
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)
|
// 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;
|
const SERIAL_BAUD: u32 = 115200;
|
||||||
@@ -131,6 +132,10 @@ struct IOSelect<'p> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl IOSelect<'_> {
|
impl IOSelect<'_> {
|
||||||
|
fn display_no(&self) -> usize {
|
||||||
|
self.display_no
|
||||||
|
}
|
||||||
|
|
||||||
fn set_on(&mut self) {
|
fn set_on(&mut self) {
|
||||||
self.pin.set_high()
|
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> {
|
struct Input<KN, KO> {
|
||||||
kn: KN,
|
kn: KN,
|
||||||
ko: KO,
|
ko: KO,
|
||||||
@@ -295,11 +339,11 @@ impl<KN: AdcChannel<Atmega, ADC>, KO: AdcChannel<Atmega, ADC>> Input<KN, KO> {
|
|||||||
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 kn = adc.read_blocking(&self.kn);
|
||||||
let ko = adc.read_blocking(&self.ko);
|
let ko = adc.read_blocking(&self.ko);
|
||||||
if kn > 500 || ko > 500 {
|
if kn > 500 || ko > 500 {
|
||||||
Some((kn, ko))
|
Some((kn > 500, ko > 500))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
@@ -357,7 +401,7 @@ fn main() -> ! {
|
|||||||
display.0[8] = SegmentState::Num(8, false);
|
display.0[8] = SegmentState::Num(8, false);
|
||||||
|
|
||||||
loop {
|
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()) {
|
for (mut io_select, ss) in io.iter_mut().zip(display.0.iter()) {
|
||||||
ss.apply(&mut seg);
|
ss.apply(&mut seg);
|
||||||
io_select.set_on();
|
io_select.set_on();
|
||||||
@@ -365,16 +409,26 @@ fn main() -> ! {
|
|||||||
io_select.set_off();
|
io_select.set_off();
|
||||||
seg.set_off();
|
seg.set_off();
|
||||||
io_select.set_on();
|
io_select.set_on();
|
||||||
arduino_hal::delay_ms(1);
|
// arduino_hal::delay_us(100);
|
||||||
if let Some((kn, ko)) = input.read(&mut adc) {
|
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();
|
io_select.set_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some((no, kn, ko)) = key {
|
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 {
|
// loop {
|
||||||
|
|||||||
Reference in New Issue
Block a user