rmk 0.8.2

Keyboard firmware written in Rust
use core::cell::RefCell;

use crate::keymap::KeyMap;

pub(crate) struct VialLock<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize, const NUM_ENCODER: usize> {
    unlocked: bool,
    unlocking: bool,
    last_poll: embassy_time::Instant,
    unlock_keys: &'a [(u8, u8)],
    keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER, NUM_ENCODER>>,
}

impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize, const NUM_ENCODER: usize>
    VialLock<'a, ROW, COL, NUM_LAYER, NUM_ENCODER>
{
    pub fn new(unlock_keys: &'a [(u8, u8)], keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER, NUM_ENCODER>>) -> Self {
        Self {
            unlocked: false,
            unlocking: false,
            last_poll: embassy_time::Instant::MIN,
            unlock_keys,
            keymap,
        }
    }
    pub fn is_unlocking(&mut self) -> bool {
        self.update_unlocking_state();
        self.unlocking
    }
    pub fn is_unlocked(&self) -> bool {
        self.unlocked
    }
    pub fn unlocking(&mut self) {
        self.unlocking = true;
        self.last_poll = embassy_time::Instant::now();
    }
    pub fn unlock(&mut self) {
        if self.unlocking {
            self.unlocked = true;
            self.unlocking = false;
        }
    }
    pub fn check_unlock(&mut self) -> u8 {
        if self.unlock_keys.is_empty() {
            warn!("No unlock keys provided");
            1
        } else {
            let mut counter = self.unlock_keys.len().try_into().unwrap();
            for (row, col) in self.unlock_keys {
                if self.keymap.borrow().matrix_state.read(*row, *col) {
                    counter -= 1;
                }
            }
            if counter == 0 {
                self.unlock();
            }
            counter
        }
    }
    pub fn lock(&mut self) {
        self.unlocked = false;
    }
    fn update_unlocking_state(&mut self) {
        if self.last_poll.elapsed() > embassy_time::Duration::from_millis(100) {
            self.unlocking = false;
        }
    }
}