aboutsummaryrefslogtreecommitdiffhomepage
path: root/app/tests
diff options
context:
space:
mode:
authorFlo Kempenich <[email protected]>2023-10-03 09:03:59 +0100
committerGitHub <[email protected]>2023-10-03 04:03:59 -0400
commitaa4cb143bf2de89f06039fd9ba0b259f6d38fc5d (patch)
treea90110c5488796514aa9d67630335ce80c185e62 /app/tests
parent6a3cc914fcc0ecc01f33f81413080b882c3022c5 (diff)
downloadzmk-aa4cb143bf2de89f06039fd9ba0b259f6d38fc5d.tar.gz
zmk-aa4cb143bf2de89f06039fd9ba0b259f6d38fc5d.zip
fix(combos)Fix bug with overlapping combos timeouts (#1945)
* Fix bug with overlapping combos timeouts * Fix trailing whitespace * Fix log format
Diffstat (limited to 'app/tests')
-rw-r--r--app/tests/combo/overlapping-combos-4-different-timeouts/events.patterns1
-rw-r--r--app/tests/combo/overlapping-combos-4-different-timeouts/keycode_events.snapshot8
-rw-r--r--app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap98
3 files changed, 107 insertions, 0 deletions
diff --git a/app/tests/combo/overlapping-combos-4-different-timeouts/events.patterns b/app/tests/combo/overlapping-combos-4-different-timeouts/events.patterns
new file mode 100644
index 0000000000..89015deee0
--- /dev/null
+++ b/app/tests/combo/overlapping-combos-4-different-timeouts/events.patterns
@@ -0,0 +1 @@
+s/.*\(hid_listener_keycode_pressed\|filter_timed_out_candidates\): //p \ No newline at end of file
diff --git a/app/tests/combo/overlapping-combos-4-different-timeouts/keycode_events.snapshot b/app/tests/combo/overlapping-combos-4-different-timeouts/keycode_events.snapshot
new file mode 100644
index 0000000000..8fe441ff46
--- /dev/null
+++ b/app/tests/combo/overlapping-combos-4-different-timeouts/keycode_events.snapshot
@@ -0,0 +1,8 @@
+after filtering out timed out combo candidates: remaining_candidates=2 timestamp=71
+after filtering out timed out combo candidates: remaining_candidates=1 timestamp=81
+after filtering out timed out combo candidates: remaining_candidates=0 timestamp=91
+usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+after filtering out timed out combo candidates: remaining_candidates=2 timestamp=143
+after filtering out timed out combo candidates: remaining_candidates=1 timestamp=153
+after filtering out timed out combo candidates: remaining_candidates=1 timestamp=159
+usage_page 0x07 keycode 0x1D implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap b/app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap
new file mode 100644
index 0000000000..8967207987
--- /dev/null
+++ b/app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap
@@ -0,0 +1,98 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan_mock.h>
+
+#define kA 0
+#define kB 1
+#define kC 2
+#define kD 3
+
+/ {
+ combos {
+ compatible = "zmk,combos";
+
+ // Intentionally out of order in the config, to make sure 'combo.c' handles it properly
+ combo_40 {
+ timeout-ms = <40>;
+ key-positions = <kA kD>;
+ bindings = <&kp Z>;
+ };
+ combo_20 {
+ timeout-ms = <20>;
+ key-positions = <kA kB>;
+ bindings = <&kp X>;
+ };
+ combo_30 {
+ timeout-ms = <30>;
+ key-positions = <kA kC>;
+ bindings = <&kp Y>;
+ };
+
+ };
+
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp A &kp B
+ &kp C &kp D
+ >;
+ };
+ };
+};
+
+#define press_A_and_wait(delay_next) \
+ ZMK_MOCK_PRESS(0,0,delay_next)
+#define press_B_and_wait(delay_next) \
+ ZMK_MOCK_PRESS(0,1,delay_next)
+#define press_C_and_wait(delay_next) \
+ ZMK_MOCK_PRESS(1,0,delay_next)
+#define press_D_and_wait(delay_next) \
+ ZMK_MOCK_PRESS(1,1,delay_next)
+
+#define release_A_and_wait(delay_next) \
+ ZMK_MOCK_RELEASE(0,0,delay_next)
+#define release_D_and_wait(delay_next) \
+ ZMK_MOCK_RELEASE(1,1,delay_next)
+
+&kscan {
+ events = <
+ /* Note: This starts at T+50 because the ZMK_MOCK_PRESS seems to launch the first event at T+(first wait duration). So in our case T+50 */
+
+
+
+ /*** First Phase: All 3 combos expire ***/
+
+ /* T+50+0= T+50: Press A and wait 50ms */
+ press_A_and_wait(50)
+
+ /* T+50+20= T+70: 'combo_20' should expire */
+ /* T+50+30= T+80: 'combo_30' should expire */
+ /* T+50+40= T+90: 'combo_40' should expire, and we should send the keycode 'A' */
+
+ /* T+50+50= T+100: We release A and wait 20ms */
+ release_A_and_wait(20)
+
+
+
+ /*** Second Phase: 2 combo expire, 1 combo triggers ***/
+
+ /* T+120+0= T+120: Press A and wait 35ms */
+ press_A_and_wait(35)
+
+ /* T+120+20= T+140: 'combo_20' should expire */
+ /* T+120+30= T+150: 'combo_30' should expire */
+
+ /* T+120+35= T+155: We press 'D', this should trigger 'combo_40' and send the keycode 'Z'. We wait 15ms */
+ press_D_and_wait(15)
+
+
+
+ /*** Cleanup ***/
+ /* T+120+50= T+170: We release both keys */
+ release_A_and_wait(20)
+ release_D_and_wait(0)
+ >;
+}; \ No newline at end of file