155 lines
6.9 KiB
Rust
155 lines
6.9 KiB
Rust
|
|
use core::alloc::Layout;
|
||
|
|
use core::fmt::Debug;
|
||
|
|
use core::ops::Index;
|
||
|
|
use core::slice;
|
||
|
|
|
||
|
|
use alloc::alloc::Allocator;
|
||
|
|
use alloc::boxed::Box;
|
||
|
|
use alloc::collections::btree_map::{BTreeMap, Entry};
|
||
|
|
use alloc::string::String;
|
||
|
|
use alloc::sync::Arc;
|
||
|
|
use alloc::vec::Vec;
|
||
|
|
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
||
|
|
use embassy_sync::channel::Channel;
|
||
|
|
use embassy_time::Instant;
|
||
|
|
use esp_alloc::{EspHeap, MemoryCapability};
|
||
|
|
use itertools::Itertools;
|
||
|
|
use log::{debug, error, info, warn};
|
||
|
|
use rmk::config::{BehaviorConfig, ForksConfig, PositionalConfig};
|
||
|
|
use rmk::descriptor::KeyboardReport;
|
||
|
|
use rmk::fork::{Fork, StateBits};
|
||
|
|
use rmk::futures::FutureExt;
|
||
|
|
use rmk::hid::Report;
|
||
|
|
use rmk::types::action::{Action, KeyAction};
|
||
|
|
use rmk::types::modifier::ModifierCombination;
|
||
|
|
use rmk::{a, heapless, join_all, k, layer};
|
||
|
|
use slint::platform::Key;
|
||
|
|
use static_cell::StaticCell;
|
||
|
|
use xkbcommon::xkb::{self, FeedResult, KeyDirection, Keysym, ModIndex, ModMask, Status};
|
||
|
|
|
||
|
|
use crate::util::{DurationExt, get_file_name};
|
||
|
|
use crate::vial::CustomKeycodes;
|
||
|
|
use crate::{KEYBOARD_REPORT_PROXY, PSRAM_ALLOCATOR};
|
||
|
|
|
||
|
|
pub const NUM_LAYER: usize = 8;
|
||
|
|
pub const MATRIX_ROWS: usize = 5;
|
||
|
|
pub const MATRIX_COLS: usize = 12;
|
||
|
|
pub const MATRIX_AREA: usize = MATRIX_ROWS * MATRIX_COLS;
|
||
|
|
|
||
|
|
const T: KeyAction = a!(Transparent);
|
||
|
|
|
||
|
|
#[rustfmt::skip]
|
||
|
|
pub const fn get_default_keymap() -> [[[KeyAction; MATRIX_COLS]; MATRIX_ROWS]; NUM_LAYER] {
|
||
|
|
[
|
||
|
|
layer!([
|
||
|
|
[k!(Escape), k!(Kc1), k!(Kc2), k!(Kc3), k!(Kc4), k!(Kc5), k!(Kc6), k!(Kc7), k!(Kc8), k!(Kc9), k!(Kc0), k!(Backspace)],
|
||
|
|
[k!(Tab), k!(Q), k!(W), k!(E), k!(R), k!(T), k!(Z), k!(U), k!(I), k!(O), k!(P), k!(Delete)],
|
||
|
|
[k!(LCtrl), k!(A), k!(S), k!(D), k!(F), k!(G), k!(H), k!(J), k!(K), k!(L), k!(Comma), k!(Enter)],
|
||
|
|
[k!(LShift), k!(Y), k!(X), k!(C), k!(V), k!(B), k!(N), k!(M), a!(No), a!(No), k!(Up), KeyAction::Single(Action::User(CustomKeycodes::FOCUS_LCD as u8))],
|
||
|
|
[a!(No), a!(No), k!(LGui), k!(LAlt), KeyAction::Single(Action::TriLayerLower), k!(Space), k!(Space), KeyAction::Single(Action::TriLayerLower), k!(RAlt), k!(Left), k!(Down), k!(Right)]
|
||
|
|
// [a!(No), a!(No), k!(LGui), k!(LAlt), k!(TriLayerLower), k!(Space), k!(Space), k!(TriLayerLower), k!(RAlt), k!(Left), k!(Down), k!(Right)]
|
||
|
|
]),
|
||
|
|
layer!([[T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T]]),
|
||
|
|
layer!([[T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T]]),
|
||
|
|
layer!([[T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T]]),
|
||
|
|
layer!([[T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T]]),
|
||
|
|
layer!([[T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T]]),
|
||
|
|
layer!([[T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T]]),
|
||
|
|
layer!([[T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T], [T, T, T, T, T, T, T, T, T, T, T, T]]),
|
||
|
|
]
|
||
|
|
}
|
||
|
|
|
||
|
|
fn fork_by_shift(
|
||
|
|
trigger: CustomKeycodes,
|
||
|
|
negative_output: KeyAction,
|
||
|
|
positive_output: KeyAction,
|
||
|
|
keep_shift: bool,
|
||
|
|
) -> Fork {
|
||
|
|
Fork::new(
|
||
|
|
KeyAction::Single(Action::User(trigger as u8)),
|
||
|
|
negative_output,
|
||
|
|
positive_output,
|
||
|
|
StateBits::new_from(
|
||
|
|
ModifierCombination::new()
|
||
|
|
.with_left_shift(true)
|
||
|
|
.with_right_shift(true),
|
||
|
|
Default::default(),
|
||
|
|
Default::default(),
|
||
|
|
),
|
||
|
|
StateBits::default(),
|
||
|
|
ModifierCombination::new()
|
||
|
|
.with_left_shift(keep_shift)
|
||
|
|
.with_right_shift(keep_shift),
|
||
|
|
false,
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn get_behavior_config() -> BehaviorConfig {
|
||
|
|
BehaviorConfig {
|
||
|
|
fork: ForksConfig {
|
||
|
|
forks: {
|
||
|
|
let mut forks = heapless::Vec::new();
|
||
|
|
forks
|
||
|
|
.push(fork_by_shift(
|
||
|
|
CustomKeycodes::FORK_ACUTE_ABOVERING_CS,
|
||
|
|
rmk::k!(Equal),
|
||
|
|
rmk::k!(Grave), // Shift is kept
|
||
|
|
true,
|
||
|
|
))
|
||
|
|
.unwrap();
|
||
|
|
forks
|
||
|
|
.push(fork_by_shift(
|
||
|
|
CustomKeycodes::FORK_CARON_DIAERESIS_CS,
|
||
|
|
rmk::shifted!(Equal),
|
||
|
|
rmk::wm!(Minus, ModifierCombination::new().with_right_alt(true)),
|
||
|
|
false,
|
||
|
|
))
|
||
|
|
.unwrap();
|
||
|
|
forks
|
||
|
|
.push(fork_by_shift(
|
||
|
|
CustomKeycodes::FORK_ACUTE_ABOVERING_CSP,
|
||
|
|
rmk::wm!(Equal, ModifierCombination::new().with_right_alt(true)),
|
||
|
|
rmk::wm!(Grave, ModifierCombination::new().with_right_alt(true)), // Shift is kept
|
||
|
|
true,
|
||
|
|
))
|
||
|
|
.unwrap();
|
||
|
|
forks
|
||
|
|
.push(fork_by_shift(
|
||
|
|
CustomKeycodes::FORK_CARON_DIAERESIS_CSP,
|
||
|
|
rmk::wm!(
|
||
|
|
Equal,
|
||
|
|
ModifierCombination::new()
|
||
|
|
.with_left_shift(true)
|
||
|
|
.with_right_alt(true)
|
||
|
|
),
|
||
|
|
rmk::wm!(Backslash, ModifierCombination::new().with_right_alt(true)),
|
||
|
|
false,
|
||
|
|
))
|
||
|
|
.unwrap();
|
||
|
|
forks
|
||
|
|
.push(fork_by_shift(
|
||
|
|
CustomKeycodes::FORK_9_FORWARDSLASH_EN_CSP,
|
||
|
|
rmk::k!(Kc9),
|
||
|
|
rmk::k!(Slash),
|
||
|
|
false,
|
||
|
|
))
|
||
|
|
.unwrap();
|
||
|
|
forks
|
||
|
|
.push(fork_by_shift(
|
||
|
|
CustomKeycodes::FORK_0_BACKWARDSLASH_EN_CSP,
|
||
|
|
rmk::k!(Kc0),
|
||
|
|
rmk::k!(Backslash),
|
||
|
|
false,
|
||
|
|
))
|
||
|
|
.unwrap();
|
||
|
|
forks
|
||
|
|
},
|
||
|
|
},
|
||
|
|
..Default::default()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn get_positional_config() -> PositionalConfig<MATRIX_ROWS, MATRIX_COLS> {
|
||
|
|
PositionalConfig::default()
|
||
|
|
}
|