Skip to content

Commit

Permalink
feat(combo): add config for combo timeout
Browse files Browse the repository at this point in the history
  • Loading branch information
pcasotti committed Dec 28, 2024
1 parent e68bbfa commit 73e578c
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 14 deletions.
22 changes: 18 additions & 4 deletions rmk-macro/src/behavior.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ fn expand_one_shot(one_shot: &Option<OneShotConfig>) -> proc_macro2::TokenStream
}

fn expand_combos(combos: &Option<CombosConfig>) -> proc_macro2::TokenStream {
let default = quote! {::core::default::Default::default()};
let default = quote! { ::core::default::Default::default() };
match combos {
Some(combos) => {
let combos = combos.combos.iter().map(|combo| {
let combos_def = combos.combos.iter().map(|combo| {
let actions = combo.actions.iter().map(|a| parse_key(a.to_owned()));
let output = parse_key(combo.output.to_owned());
let layer = match combo.layer {
Expand All @@ -54,7 +54,21 @@ fn expand_combos(combos: &Option<CombosConfig>) -> proc_macro2::TokenStream {
quote! { ::rmk::combo::Combo::new([#(#actions),*], #output, #layer) }
});

quote! { ::heapless::Vec::from_iter([#(#combos),*]) }
let timeout = match &combos.timeout {
Some(t) => {
let millis = t.0;
quote! { timeout: ::embassy_time::Duration::from_millis(#millis), }
}
None => quote! {},
};

quote! {
::rmk::config::CombosConfig {
combos: ::rmk::heapless::Vec::from_iter([#(#combos_def),*]),
#timeout
..Default::default()
}
}
}
None => default,
}
Expand All @@ -69,7 +83,7 @@ pub(crate) fn expand_behavior_config(keyboard_config: &KeyboardConfig) -> proc_m
let behavior_config = ::rmk::config::BehaviorConfig {
tri_layer: #tri_layer,
one_shot: #one_shot,
combos: #combos,
combo: #combos,
};
}
}
7 changes: 5 additions & 2 deletions rmk-macro/src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ pub struct OneShotConfig {
#[derive(Clone, Debug, Deserialize)]
pub struct CombosConfig {
pub combos: Vec<ComboConfig>,
pub timeout: Option<DurationMillis>,
}

/// Configurations for combo
Expand Down Expand Up @@ -220,8 +221,10 @@ fn parse_duration_millis<'de, D: de::Deserializer<'de>>(deserializer: D) -> Resu
})?;

match unit {
"s" => Ok(num*1000),
"s" => Ok(num * 1000),
"ms" => Ok(num),
other => Err(de::Error::custom(format!("Invalid unit \"{other}\" in [one_shot.timeout]: unit part must be either \"s\" or \"ms\""))),
other => Err(de::Error::custom(format!(
"Invalid unit \"{other}\" for duration: unit part must be either \"s\" or \"ms\""
))),
}
}
4 changes: 2 additions & 2 deletions rmk-macro/src/keyboard_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ macro_rules! rmk_compile_error {
};
}

// Max number of macros
// Max number of combos
pub const COMBO_MAX_NUM: usize = 8;
// Max size of macros
// Max size of combos
pub const COMBO_MAX_LENGTH: usize = 4;

/// Keyboard's basic info
Expand Down
4 changes: 2 additions & 2 deletions rmk/src/combo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ use heapless::Vec;

use crate::{action::KeyAction, keyboard::KeyEvent};

// Max number of macros
// Max number of combos
pub(crate) const COMBO_MAX_NUM: usize = 8;
// Max size of macros
// Max size of combos
pub(crate) const COMBO_MAX_LENGTH: usize = 4;

#[derive(Clone)]
Expand Down
17 changes: 16 additions & 1 deletion rmk/src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ impl<'a, O: OutputPin> Default for RmkConfig<'a, O> {
pub struct BehaviorConfig {
pub tri_layer: Option<[u8; 3]>,
pub one_shot: OneShotConfig,
pub combos: Vec<Combo, COMBO_MAX_NUM>,
pub combo: CombosConfig,
}

/// Config for one shot behavior
Expand All @@ -64,6 +64,21 @@ impl Default for OneShotConfig {
}
}

/// Config for combo behavior
pub struct CombosConfig {
pub combos: Vec<Combo, COMBO_MAX_NUM>,
pub timeout: Duration,
}

impl Default for CombosConfig {
fn default() -> Self {
Self {
timeout: Duration::from_millis(50),
combos: Vec::new(),
}
}
}

/// Config for storage
#[derive(Clone, Copy, Debug)]
pub struct StorageConfig {
Expand Down
3 changes: 2 additions & 1 deletion rmk/src/keyboard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,8 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
if next_action.is_some() {
self.combo_actions_buffer.clear();
} else {
let timeout = embassy_time::Timer::after_millis(50);
let timeout =
embassy_time::Timer::after(self.keymap.borrow().behavior.combo.timeout);
match select(timeout, key_event_channel.receive()).await {
embassy_futures::select::Either::First(_) => self.dispatch_combos().await,
embassy_futures::select::Either::Second(event) => {
Expand Down
4 changes: 2 additions & 2 deletions rmk/src/keymap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
behavior: BehaviorConfig,
) -> Self {
let mut combos: [Combo; COMBO_MAX_NUM] = Default::default();
for (i, combo) in behavior.combos.iter().enumerate() {
for (i, combo) in behavior.combo.combos.iter().enumerate() {
combos[i] = combo.clone();
}
KeyMap {
Expand All @@ -65,7 +65,7 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
// If the storage is initialized, read keymap from storage
let mut macro_cache = [0; MACRO_SPACE_SIZE];
let mut combos: [Combo; COMBO_MAX_NUM] = Default::default();
for (i, combo) in behavior.combos.iter().enumerate() {
for (i, combo) in behavior.combo.combos.iter().enumerate() {
combos[i] = combo.clone();
}
if let Some(storage) = storage {
Expand Down
1 change: 1 addition & 0 deletions rmk/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ use embedded_hal_async::digital::Wait;
use embedded_storage::nor_flash::NorFlash;
pub use flash::EmptyFlashWrapper;
use futures::pin_mut;
pub use heapless;
use keyboard::{
communication_task, keyboard_report_channel, Keyboard, KeyboardReportMessage,
REPORT_CHANNEL_SIZE,
Expand Down

0 comments on commit 73e578c

Please sign in to comment.