#[cfg(feature = "_ble")]
mod ble_config;
pub mod macro_config;
#[cfg(feature = "_ble")]
pub use ble_config::BleBatteryConfig;
use embassy_time::Duration;
use heapless::Vec;
use macro_config::KeyboardMacrosConfig;
use rmk_types::action::{MorseMode, MorseProfile};
use crate::combo::Combo;
use crate::fork::Fork;
use crate::morse::Morse;
use crate::{COMBO_MAX_NUM, FORK_MAX_NUM, MORSE_MAX_NUM};
#[derive(Default)]
pub struct RmkConfig<'a> {
pub device_config: DeviceConfig<'a>,
#[cfg(feature = "vial")]
pub vial_config: VialConfig<'a>,
#[cfg(feature = "storage")]
pub storage_config: StorageConfig,
#[cfg(feature = "_ble")]
pub ble_battery_config: BleBatteryConfig<'a>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(u8)]
pub enum Hand {
Unknown,
Left,
Right,
}
impl Default for Hand {
fn default() -> Self {
Self::Unknown
}
}
#[derive(Debug, Default)]
pub struct BehaviorConfig {
pub tri_layer: Option<[u8; 3]>,
pub tap: TapConfig,
pub one_shot: OneShotConfig,
pub combo: CombosConfig,
pub fork: ForksConfig,
pub morse: MorsesConfig,
pub keyboard_macros: KeyboardMacrosConfig,
pub mouse_key: MouseKeyConfig,
}
#[derive(Clone, Copy, Debug)]
pub struct TapConfig {
pub tap_interval: u16,
pub tap_capslock_interval: u16,
}
impl Default for TapConfig {
fn default() -> Self {
Self {
tap_interval: 20,
tap_capslock_interval: 20,
}
}
}
#[derive(Clone, Debug)]
pub struct MorsesConfig {
pub enable_flow_tap: bool,
pub prior_idle_time: Duration, pub default_profile: MorseProfile,
pub morses: Vec<Morse, MORSE_MAX_NUM>,
}
impl Default for MorsesConfig {
fn default() -> Self {
Self {
enable_flow_tap: false,
prior_idle_time: Duration::from_millis(120),
default_profile: MorseProfile::new(Some(false), Some(MorseMode::Normal), Some(250u16), Some(250u16)),
morses: Vec::new(),
}
}
}
#[derive(Debug)]
pub struct PositionalConfig<const ROW: usize, const COL: usize> {
pub hand: [[Hand; COL]; ROW],
}
impl<const ROW: usize, const COL: usize> Default for PositionalConfig<ROW, COL> {
fn default() -> Self {
Self {
hand: [[Hand::default(); COL]; ROW],
}
}
}
impl<const ROW: usize, const COL: usize> PositionalConfig<ROW, COL> {
pub fn new(hand: [[Hand; COL]; ROW]) -> Self {
Self { hand }
}
}
#[derive(Clone, Copy, Debug)]
pub struct OneShotConfig {
pub timeout: Duration,
}
impl Default for OneShotConfig {
fn default() -> Self {
Self {
timeout: Duration::from_secs(1),
}
}
}
#[derive(Clone, Debug)]
pub struct CombosConfig {
pub combos: [Option<Combo>; COMBO_MAX_NUM],
pub timeout: Duration,
}
impl Default for CombosConfig {
fn default() -> Self {
Self {
timeout: Duration::from_millis(50),
combos: [None; COMBO_MAX_NUM],
}
}
}
#[derive(Clone, Debug)]
pub struct ForksConfig {
pub forks: Vec<Fork, FORK_MAX_NUM>,
}
impl Default for ForksConfig {
fn default() -> Self {
Self { forks: Vec::new() }
}
}
#[derive(Clone, Copy, Debug)]
pub struct StorageConfig {
pub start_addr: usize,
pub num_sectors: u8,
pub clear_storage: bool,
pub clear_layout: bool,
}
impl Default for StorageConfig {
fn default() -> Self {
Self {
start_addr: 0,
num_sectors: 2,
clear_storage: false,
clear_layout: false,
}
}
}
#[derive(Clone, Copy, Debug, Default)]
pub struct VialConfig<'a> {
pub vial_keyboard_id: &'a [u8],
pub vial_keyboard_def: &'a [u8],
pub unlock_keys: &'a [(u8, u8)],
}
impl<'a> VialConfig<'a> {
pub fn new(vial_keyboard_id: &'a [u8], vial_keyboard_def: &'a [u8], unlock_keys: &'a [(u8, u8)]) -> Self {
Self {
vial_keyboard_id,
vial_keyboard_def,
unlock_keys,
}
}
}
#[derive(Clone, Copy, Debug)]
pub struct DeviceConfig<'a> {
pub vid: u16,
pub pid: u16,
pub manufacturer: &'a str,
pub product_name: &'a str,
pub serial_number: &'a str,
}
impl Default for DeviceConfig<'_> {
fn default() -> Self {
Self {
vid: 0x4c4b,
pid: 0x4643,
manufacturer: "RMK",
product_name: "RMK Keyboard",
serial_number: "vial:f64c2b3c:000001",
}
}
}
#[derive(Clone, Copy, Debug)]
pub struct MouseKeyConfig {
pub initial_delay_ms: u16,
pub repeat_interval_ms: u16,
pub move_delta: u8,
pub max_speed: u8,
pub time_to_max: u8,
pub wheel_initial_delay_ms: u16,
pub wheel_repeat_interval_ms: u16,
pub wheel_delta: u8,
pub wheel_max_speed_multiplier: u8,
pub wheel_time_to_max: u8,
pub move_max: u8,
pub wheel_max: u8,
}
impl Default for MouseKeyConfig {
fn default() -> Self {
Self {
initial_delay_ms: 100, repeat_interval_ms: 20, move_delta: 6, max_speed: 3, time_to_max: 50, wheel_initial_delay_ms: 100, wheel_repeat_interval_ms: 80, wheel_delta: 1, wheel_max_speed_multiplier: 3, wheel_time_to_max: 40, move_max: 20, wheel_max: 4, }
}
}
impl MouseKeyConfig {
pub fn get_movement_delay(&self, repeat_count: u8) -> u16 {
if repeat_count == 0 {
self.initial_delay_ms
} else {
self.repeat_interval_ms
}
}
pub fn get_wheel_delay(&self, repeat_count: u8) -> u16 {
if repeat_count == 0 {
self.wheel_initial_delay_ms
} else {
self.wheel_repeat_interval_ms
}
}
}