add multiple momentary layers
This commit is contained in:
57
src/main.rs
57
src/main.rs
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user