From ab2110974c6b41e59496058dc8084b45db313057 Mon Sep 17 00:00:00 2001 From: Danny August Ramaputra Date: Fri, 26 Jul 2024 20:49:41 +0900 Subject: [PATCH 1/3] change: add derived default for matrix bit --- src/matrix.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/matrix.rs b/src/matrix.rs index 2f55194..10a326e 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -12,7 +12,7 @@ pub struct Result { pub matrix: [[Bit; COL_COUNT]; ROW_COUNT], } -#[derive(Clone, Copy, Debug, Format)] +#[derive(Clone, Copy, Debug, Default, Format)] pub struct Bit { pub edge: Edge, pub pressed: bool, From 2e4d2d046c7c6eadff333f88e7fefc5defa9fe01 Mon Sep 17 00:00:00 2001 From: Danny August Ramaputra Date: Fri, 26 Jul 2024 20:50:32 +0900 Subject: [PATCH 2/3] add: concurrent flip input processor --- src/main.rs | 12 ++++-- src/processor/input/flip.rs | 73 +++++++++++++++++++++++++++++++++++++ src/processor/input/mod.rs | 1 + 3 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 src/processor/input/flip.rs diff --git a/src/main.rs b/src/main.rs index 884fdfb..2535077 100644 --- a/src/main.rs +++ b/src/main.rs @@ -58,7 +58,10 @@ mod kb { matrix::{BasicVerticalSwitchMatrix, Scanner}, processor::{ events::rgb::{FrameIterator, RGBMatrix, RGBProcessor}, - input::debounce::KeyMatrixRisingFallingDebounceProcessor, + input::{ + debounce::KeyMatrixRisingFallingDebounceProcessor, + flip::{ConcurrentFlipProcessor, Pos}, + }, mapper::{Input, Mapper}, Event, EventsProcessor, InputProcessor, }, @@ -308,9 +311,10 @@ mod kb { let input_processors: &mut [&mut dyn InputProcessor< { ::KEY_MATRIX_ROW_COUNT }, { ::KEY_MATRIX_COL_COUNT }, - >] = &mut [&mut KeyMatrixRisingFallingDebounceProcessor::new( - 10.millis(), - )]; + >] = &mut [ + &mut KeyMatrixRisingFallingDebounceProcessor::new(10.millis()), + &mut ConcurrentFlipProcessor::new(Pos { row: 2, col: 1 }, Pos { row: 2, col: 3 }), + ]; let mut mapper = Mapper::new(::get_input_map()); let events_processors: &mut [&mut dyn EventsProcessor< ::Layer, diff --git a/src/processor/input/flip.rs b/src/processor/input/flip.rs new file mode 100644 index 0000000..0e830f8 --- /dev/null +++ b/src/processor/input/flip.rs @@ -0,0 +1,73 @@ +use defmt::Format; + +use crate::{ + key::Edge, + matrix::Bit, + processor::{mapper::Input, InputProcessor, Result}, +}; + +pub struct ConcurrentFlipProcessor { + key1_pos: Pos, + key2_pos: Pos, + previous_pressed_state: (bool, bool), +} + +#[derive(Clone, Copy, Debug, Format)] +pub struct Pos { + pub row: usize, + pub col: usize, +} + +#[allow(dead_code)] +impl ConcurrentFlipProcessor { + pub fn new(key1_pos: Pos, key2_pos: Pos) -> Self { + ConcurrentFlipProcessor { + key1_pos, + key2_pos, + previous_pressed_state: (false, false), + } + } +} + +impl + InputProcessor for ConcurrentFlipProcessor +{ + fn process(&mut self, input: &mut Input) -> Result { + let key1_bit = input.key_matrix_result.matrix[self.key1_pos.row][self.key1_pos.col]; + let key2_bit = input.key_matrix_result.matrix[self.key2_pos.row][self.key2_pos.col]; + + let pressed_state = if key1_bit.edge == Edge::Rising { + (true, false) + } else if key1_bit.edge == Edge::Falling { + if key2_bit.pressed { + (false, true) + } else { + (false, false) + } + } else if key2_bit.edge == Edge::Rising { + (false, true) + } else if key2_bit.edge == Edge::Falling { + if key1_bit.pressed { + (true, false) + } else { + (false, false) + } + } else if !key1_bit.pressed && !key2_bit.pressed { + (false, false) // reset to idle + } else { + self.previous_pressed_state // no edge changes, maintain pressed state + }; + + input.key_matrix_result.matrix[self.key1_pos.row][self.key1_pos.col] = Bit { + edge: Edge::from((self.previous_pressed_state.0, pressed_state.0)), + pressed: pressed_state.0, + }; + input.key_matrix_result.matrix[self.key2_pos.row][self.key2_pos.col] = Bit { + edge: Edge::from((self.previous_pressed_state.1, pressed_state.1)), + pressed: pressed_state.1, + }; + + self.previous_pressed_state = pressed_state; + Ok(()) + } +} diff --git a/src/processor/input/mod.rs b/src/processor/input/mod.rs index 1fabb2e..b165f50 100644 --- a/src/processor/input/mod.rs +++ b/src/processor/input/mod.rs @@ -1,2 +1,3 @@ pub mod debounce; +pub mod flip; pub mod none; From 4fa66b4f0def7c87ce7daa183c3486199ece1566 Mon Sep 17 00:00:00 2001 From: Danny August Ramaputra Date: Fri, 26 Jul 2024 20:53:28 +0900 Subject: [PATCH 3/3] add: events debug log --- src/main.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 2535077..da2d616 100644 --- a/src/main.rs +++ b/src/main.rs @@ -53,7 +53,7 @@ mod kb { use crate::{ heartbeat::HeartbeatLED, - key::{Action, Key}, + key::{Action, Edge, Key}, keyboard::{Keyboard, KeyboardConfiguration}, matrix::{BasicVerticalSwitchMatrix, Scanner}, processor::{ @@ -84,6 +84,7 @@ mod kb { const DEBUG_LOG_INPUT_SCANNER_INTERVAL: u64 = 50; const DEBUG_LOG_PROCESSOR_ENABLE_TIMING: bool = false; const DEBUG_LOG_PROCESSOR_INTERVAL: u64 = 50; + const DEBUG_LOG_EVENTS: bool = true; const DEBUG_LOG_SENT_KEYS: bool = false; #[shared] @@ -338,6 +339,13 @@ mod kb { Vec::::Layer>>::with_capacity(10); mapper.map(&input, &mut events); + if DEBUG_LOG_EVENTS { + events + .iter() + .filter(|e| e.edge != Edge::None) + .for_each(|e| debug!("[{}] event: action: {} edge: {}", n, e.action, e.edge)); + } + if events_processors .iter_mut() .try_for_each(|p| p.process(&mut events))