/src/peripherals/keyboard.rs
use doa_hallonbrod::hal::gpio::{DynPinId, FunctionSioInput, FunctionSioOutput, Pin, PullNone, PullUp};
use embedded_hal::digital::v2::{InputPin, OutputPin};
type ColPin = Pin<DynPinId, FunctionSioInput, PullUp>;
type RowPin = Pin<DynPinId, FunctionSioOutput, PullNone>;
pub struct Keyboard {
cols: [ColPin; 9],
rows: [RowPin; 9],
}
impl Keyboard
{
pub fn new(cols: [ColPin; 9], rows: [RowPin; 9]) -> Keyboard {
Keyboard { cols, rows }
}
pub fn scan(&mut self) -> [u32; 3] {
let mut keybits = [0u32; 3];
for (r, rp) in self.rows.iter_mut().enumerate() {
rp.set_low().unwrap(); // Activate column
cortex_m::asm::delay(10);
for (c, cp) in self.cols.iter().enumerate() {
if cp.is_low().unwrap() { // Read row
let i = r * 9 + c;
keybits[i / 32] |= 1 << (i % 32);
}
}
rp.set_high().unwrap(); // Deactivate column
cortex_m::asm::delay(2000);
}
keybits
}
}