add multiple momentary layers

This commit is contained in:
2025-12-28 20:59:08 +01:00
parent 150c52f620
commit 5012c6d494
3 changed files with 172 additions and 50 deletions

View File

@@ -17,9 +17,9 @@ use embassy_rp::{
};
use embassy_time::{Duration, Timer};
use usbd_hid::descriptor::KeyboardReport;
use {defmt_rtt as _, panic_probe as _};
use crate::keymap::{Action, LayerOperation, get_action};
use keymap::get_keycode;
use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs {
I2C0_IRQ => I2cInterruptHandler<embassy_rp::peripherals::I2C0>;
@@ -68,18 +68,45 @@ async fn main(_spawner: Spawner) -> () {
let in_fut = async {
let mut previous_keycodes: [u8; 6] = [0; 6];
let mut previous_modifier: u8 = 0;
let mut active_layer: usize = 0;
loop {
let scan_result = matrix.scan().await;
// Collect all pressed keys and their scancodes
let mut pressed_keys: heapless::Vec<(usize, usize, keymap::KeyCode), 48> = heapless::Vec::new();
// first pass to check if the layer keys are active
let mut layer_active = false;
for (row_idx, row) in scan_result.iter().enumerate() {
for (col_idx, &is_pressed) in row.iter().enumerate() {
if is_pressed {
if let Some(keycode) = get_keycode(row_idx, col_idx) {
let _ = pressed_keys.push((row_idx, col_idx, keycode));
// try to find if any of the pressed keys on the 0th layer is a layer modify key
let action = get_action(row_idx, col_idx, 0);
if let Action::Layer(LayerOperation::MO(layer)) = action {
layer_active = true;
active_layer = layer;
break;
}
}
}
// break the loop early if layer key is pressed
if layer_active {
break;
}
}
if !layer_active {
active_layer = 0;
}
// Collect all pressed keys and their scancodes
let mut pressed_keys: heapless::Vec<(usize, usize, keymap::Action), 48> = heapless::Vec::new();
for (row_idx, row) in scan_result.iter().enumerate() {
for (col_idx, &is_pressed) in row.iter().enumerate() {
if is_pressed {
let action = get_action(row_idx, col_idx, active_layer);
if !matches!(action, Action::None | Action::Layer(_)) {
let _ = pressed_keys.push((row_idx, col_idx, action));
}
}
}
@@ -90,14 +117,16 @@ async fn main(_spawner: Spawner) -> () {
let mut keycodes = [0u8; 6];
let mut keycode_index = 0;
for (_, _, keycode) in pressed_keys.iter() {
if keycode.is_modifier() {
// Add to modifier byte
modifier |= keycode.modifier_bit();
} else if keycode_index < 6 {
// Add to keycodes array (max 6 regular keys)
keycodes[keycode_index] = keycode.as_u8();
keycode_index += 1;
for (_, _, action) in pressed_keys.iter() {
if let Action::Key(hid_key) = action {
if hid_key.is_modifier() {
// Add to modifier byte
modifier |= hid_key.modifier_bit();
} else if keycode_index < 6 {
// Add to keycodes array (max 6 regular keys)
keycodes[keycode_index] = hid_key.as_u8();
keycode_index += 1;
}
}
}