use core::convert::Infallible;
use embedded_hal::digital::v2::InputPin;
use keypad::mock_hal::{self, GpioExt, Input, OpenDrain, Output, PullUp, GPIOA};
use keypad::{keypad_new, keypad_struct};
keypad_struct! {
pub struct ExampleKeypad<Error = Infallible> {
rows: (
mock_hal::gpioa::PA0<Input<PullUp>>,
mock_hal::gpioa::PA1<Input<PullUp>>,
mock_hal::gpioa::PA2<Input<PullUp>>,
mock_hal::gpioa::PA3<Input<PullUp>>,
),
columns: (
mock_hal::gpioa::PA4<Output<OpenDrain>>,
mock_hal::gpioa::PA5<Output<OpenDrain>>,
mock_hal::gpioa::PA6<Output<OpenDrain>>,
mock_hal::gpioa::PA7<Output<OpenDrain>>,
mock_hal::gpioa::PA8<Output<OpenDrain>>,
),
}
}
fn main() {
let pins = GPIOA::split();
let keypad = keypad_new!(ExampleKeypad {
rows: (
pins.pa0.into_pull_up_input(),
pins.pa1.into_pull_up_input(),
pins.pa2.into_pull_up_input(),
pins.pa3.into_pull_up_input(),
),
columns: (
pins.pa4.into_open_drain_output(),
pins.pa5.into_open_drain_output(),
pins.pa6.into_open_drain_output(),
pins.pa7.into_open_drain_output(),
pins.pa8.into_open_drain_output(),
),
});
let keys = keypad.decompose();
let first_key = &keys[0][0];
println!("Is first key pressed? {:?}\n", first_key.is_low());
for (row_index, row) in keys.iter().enumerate() {
print!("row {}: ", row_index);
for key in row.iter() {
let is_pressed = if key.is_low().unwrap() { 1 } else { 0 };
print!(" {} ", is_pressed);
}
println!();
}
let ((_r0, _r1, _r2, _r3), (_c0, _c1, _c2, _c3, _c4)) = keypad.release();
}