Keypad mapping
This commit is contained in:
parent
2fb089fd03
commit
b5da325946
175
src/main.rs
175
src/main.rs
@ -115,37 +115,17 @@ fn main() -> ! {
|
|||||||
// .unwrap();
|
// .unwrap();
|
||||||
driver.clear_frame(&mut spi, &mut delay).unwrap();
|
driver.clear_frame(&mut spi, &mut delay).unwrap();
|
||||||
|
|
||||||
let mut gpio2 = Input::new(io.pins.gpio2, Pull::Up);
|
let mut kbd = Keypad {
|
||||||
let mut gpio3 = Input::new(io.pins.gpio3, Pull::Up);
|
i1: Input::new(io.pins.gpio2, Pull::Up),
|
||||||
let mut gpio4 = Input::new(io.pins.gpio4, Pull::Up);
|
i2: Input::new(io.pins.gpio3, Pull::Up),
|
||||||
let mut gpio5 = Input::new(io.pins.gpio5, Pull::Up);
|
i3: Input::new(io.pins.gpio4, Pull::Up),
|
||||||
|
i4: Input::new(io.pins.gpio5, Pull::Up),
|
||||||
let mut gpio6 = OutputOpenDrain::new(io.pins.gpio6, Level::Low, Pull::Up);
|
//---------------------------
|
||||||
let mut gpio7 = OutputOpenDrain::new(io.pins.gpio7, Level::Low, Pull::Up);
|
o1: OutputOpenDrain::new(io.pins.gpio6, Level::Low, Pull::Up),
|
||||||
let mut gpio8 = OutputOpenDrain::new(io.pins.gpio8, Level::Low, Pull::Up);
|
o2: OutputOpenDrain::new(io.pins.gpio7, Level::Low, Pull::Up),
|
||||||
let mut gpio10 = OutputOpenDrain::new(io.pins.gpio10, Level::Low, Pull::Up);
|
o3: OutputOpenDrain::new(io.pins.gpio8, Level::Low, Pull::Up),
|
||||||
|
o4: OutputOpenDrain::new(io.pins.gpio10, Level::Low, Pull::Up),
|
||||||
let mut kbd = Keypad((
|
};
|
||||||
(&mut gpio2, &mut gpio6),
|
|
||||||
(&mut gpio3, &mut gpio6),
|
|
||||||
(&mut gpio4, &mut gpio6),
|
|
||||||
(&mut gpio5, &mut gpio6),
|
|
||||||
// --------------------------------------
|
|
||||||
(&mut gpio2, &mut gpio7),
|
|
||||||
(&mut gpio3, &mut gpio7),
|
|
||||||
(&mut gpio4, &mut gpio7),
|
|
||||||
(&mut gpio5, &mut gpio7),
|
|
||||||
// --------------------------------------
|
|
||||||
(&mut gpio2, &mut gpio8),
|
|
||||||
(&mut gpio3, &mut gpio8),
|
|
||||||
(&mut gpio4, &mut gpio8),
|
|
||||||
(&mut gpio5, &mut gpio8),
|
|
||||||
// --------------------------------------
|
|
||||||
(&mut gpio2, &mut gpio10),
|
|
||||||
(&mut gpio3, &mut gpio10),
|
|
||||||
(&mut gpio4, &mut gpio10),
|
|
||||||
(&mut gpio5, &mut gpio10),
|
|
||||||
));
|
|
||||||
|
|
||||||
let mut ctx = Context {
|
let mut ctx = Context {
|
||||||
button_pressed: None,
|
button_pressed: None,
|
||||||
@ -227,101 +207,62 @@ pub struct Context<'d> {
|
|||||||
pub spi: SPI<'d>,
|
pub spi: SPI<'d>,
|
||||||
pub delay: Delay,
|
pub delay: Delay,
|
||||||
}
|
}
|
||||||
|
struct Keypad<'d> {
|
||||||
struct Rows<'d> {
|
o1: OutputOpenDrain<'d, Gpio6>, //
|
||||||
gpio2: Input<'d, Gpio2>, //
|
o2: OutputOpenDrain<'d, Gpio7>, //
|
||||||
gpio3: Input<'d, Gpio3>, //
|
o3: OutputOpenDrain<'d, Gpio8>, //
|
||||||
gpio4: Input<'d, Gpio4>, //
|
o4: OutputOpenDrain<'d, Gpio10>, //
|
||||||
gpio5: Input<'d, Gpio5>, //
|
// --------------------------------------
|
||||||
|
i1: Input<'d, Gpio2>, //
|
||||||
|
i2: Input<'d, Gpio3>, //
|
||||||
|
i3: Input<'d, Gpio4>, //
|
||||||
|
i4: Input<'d, Gpio5>, //
|
||||||
}
|
}
|
||||||
struct Cols<'d> {
|
|
||||||
gpio6: OutputOpenDrain<'d, Gpio6>, //
|
|
||||||
gpio7: OutputOpenDrain<'d, Gpio7>, //
|
|
||||||
gpio8: OutputOpenDrain<'d, Gpio8>, //
|
|
||||||
gpio10: OutputOpenDrain<'d, Gpio10>, //
|
|
||||||
}
|
|
||||||
pub type OOD<'d, T> = OutputOpenDrain<'d, T>;
|
|
||||||
|
|
||||||
struct Keypad<'d>(
|
|
||||||
pub (
|
|
||||||
// --------------------------------------
|
|
||||||
(&'d mut Input<'d, Gpio2>, &'d mut OOD<'d, Gpio6>),
|
|
||||||
(&'d mut Input<'d, Gpio3>, &'d mut OOD<'d, Gpio6>),
|
|
||||||
(&'d mut Input<'d, Gpio4>, &'d mut OOD<'d, Gpio6>),
|
|
||||||
(&'d mut Input<'d, Gpio5>, &'d mut OOD<'d, Gpio6>),
|
|
||||||
// --------------------------------------
|
|
||||||
(&'d mut Input<'d, Gpio2>, &'d mut OOD<'d, Gpio7>),
|
|
||||||
(&'d mut Input<'d, Gpio3>, &'d mut OOD<'d, Gpio7>),
|
|
||||||
(&'d mut Input<'d, Gpio4>, &'d mut OOD<'d, Gpio7>),
|
|
||||||
(&'d mut Input<'d, Gpio5>, &'d mut OOD<'d, Gpio7>),
|
|
||||||
// --------------------------------------
|
|
||||||
(&'d mut Input<'d, Gpio2>, &'d mut OOD<'d, Gpio8>),
|
|
||||||
(&'d mut Input<'d, Gpio3>, &'d mut OOD<'d, Gpio8>),
|
|
||||||
(&'d mut Input<'d, Gpio4>, &'d mut OOD<'d, Gpio8>),
|
|
||||||
(&'d mut Input<'d, Gpio5>, &'d mut OOD<'d, Gpio8>),
|
|
||||||
// --------------------------------------
|
|
||||||
(&'d mut Input<'d, Gpio2>, &'d mut OOD<'d, Gpio10>),
|
|
||||||
(&'d mut Input<'d, Gpio3>, &'d mut OOD<'d, Gpio10>),
|
|
||||||
(&'d mut Input<'d, Gpio4>, &'d mut OOD<'d, Gpio10>),
|
|
||||||
(&'d mut Input<'d, Gpio5>, &'d mut OOD<'d, Gpio10>),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
impl<'d> Keypad<'d> {
|
impl<'d> Keypad<'d> {
|
||||||
pub fn pressed(&mut self) -> Option<Button> {
|
pub fn pressed(&mut self) -> Option<Button> {
|
||||||
let col1 = [
|
let res: [[bool; 4]; 4] = core::array::from_fn(|x| {
|
||||||
self.0 .0.is_low(),
|
core::array::from_fn(|y| {
|
||||||
self.0 .1.is_low(),
|
self.set_high(x as u8);
|
||||||
self.0 .2.is_low(),
|
let v = self.is_low(y as u8);
|
||||||
self.0 .3.is_low(),
|
self.set_low(x as u8);
|
||||||
];
|
v
|
||||||
let col2 = [
|
})
|
||||||
self.0 .4.is_low(),
|
});
|
||||||
self.0 .5.is_low(),
|
|
||||||
self.0 .6.is_low(),
|
|
||||||
self.0 .7.is_low(),
|
|
||||||
];
|
|
||||||
let col3 = [
|
|
||||||
self.0 .8.is_low(),
|
|
||||||
self.0 .9.is_low(),
|
|
||||||
self.0 .10.is_low(),
|
|
||||||
self.0 .11.is_low(),
|
|
||||||
];
|
|
||||||
let col4 = [
|
|
||||||
self.0 .12.is_low(),
|
|
||||||
self.0 .13.is_low(),
|
|
||||||
self.0 .14.is_low(),
|
|
||||||
self.0 .15.is_low(),
|
|
||||||
];
|
|
||||||
|
|
||||||
if col1.iter().any(|b| !b)
|
if res.iter().any(|a| a.iter().any(|b| !b)) {
|
||||||
|| col2.iter().any(|b| !b)
|
|
||||||
|| col3.iter().any(|b| !b)
|
|
||||||
|| col4.iter().any(|b| !b)
|
|
||||||
{
|
|
||||||
println!("***************************************");
|
println!("***************************************");
|
||||||
println!("col1 {col1:?}");
|
for a in res {
|
||||||
println!("col2 {col2:?}");
|
println!("col {a:?}");
|
||||||
println!("col3 {col3:?}");
|
}
|
||||||
println!("col4 {col4:?}");
|
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
trait KeyboardInput<'d> {
|
fn set_high(&mut self, o: u8) {
|
||||||
fn is_low(&mut self) -> bool;
|
match o {
|
||||||
fn is_high(&mut self) -> bool {
|
0 => self.o1.set_high(),
|
||||||
!self.is_low()
|
1 => self.o2.set_high(),
|
||||||
|
2 => self.o3.set_high(),
|
||||||
|
3 => self.o4.set_high(),
|
||||||
|
_ => {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
fn set_low(&mut self, o: u8) {
|
||||||
|
match o {
|
||||||
|
0 => self.o1.set_low(),
|
||||||
|
1 => self.o2.set_low(),
|
||||||
|
2 => self.o3.set_low(),
|
||||||
|
3 => self.o4.set_low(),
|
||||||
|
_ => {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
fn is_low(&mut self, o: u8) -> bool {
|
||||||
|
match o {
|
||||||
|
0 => self.i1.is_low(),
|
||||||
|
1 => self.i2.is_low(),
|
||||||
|
2 => self.i3.is_low(),
|
||||||
|
3 => self.i4.is_low(),
|
||||||
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, C: InputPin, R: OutputPin + InputPin> KeyboardInput<'d>
|
|
||||||
for (&'d mut Input<'d, C>, &'d mut OutputOpenDrain<'d, R>)
|
|
||||||
{
|
|
||||||
fn is_low(&mut self) -> bool {
|
|
||||||
self.1.set_low();
|
|
||||||
let s = self.0.is_low();
|
|
||||||
self.1.set_high();
|
|
||||||
s
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user