/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
    }
}