key mapping

This commit is contained in:
2025-07-18 20:31:23 +01:00
parent 7b76a183f1
commit ff40ffa908

View File

@@ -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 {