From 49065a566d5fb6739f6eaa28329cd4c210d8b2cb Mon Sep 17 00:00:00 2001 From: JP Bonn Date: Mon, 1 Mar 2021 00:09:36 -0700 Subject: [PATCH 1/7] fix inconsistent zmk_layer_state_changed --- app/src/keymap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/keymap.c b/app/src/keymap.c index 1643f647..34760ab7 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -19,8 +19,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -static zmk_keymap_layers_state_t _zmk_keymap_layer_state = 0; -static uint8_t _zmk_keymap_layer_default = 0; +static const uint8_t _zmk_keymap_layer_default = 0; +static zmk_keymap_layers_state_t _zmk_keymap_layer_state = BIT(_zmk_keymap_layer_default); #define DT_DRV_COMPAT zmk_keymap @@ -87,7 +87,7 @@ static inline int set_layer_state(uint8_t layer, bool state) { zmk_keymap_layers_state_t old_state = _zmk_keymap_layer_state; WRITE_BIT(_zmk_keymap_layer_state, layer, state); // Don't send state changes unless there was an actual change - if (old_state != _zmk_keymap_layer_state) { + if (old_state != _zmk_keymap_layer_state || layer == _zmk_keymap_layer_default) { LOG_DBG("layer_changed: layer %d state %d", layer, state); ZMK_EVENT_RAISE(create_layer_state_changed(layer, state)); } From e1c16bafae76f062a0798c41db61ec2e6cf71c22 Mon Sep 17 00:00:00 2001 From: JP Bonn Date: Mon, 1 Mar 2021 00:58:38 -0700 Subject: [PATCH 2/7] update test for layers --- app/tests/to-layer/normal/keycode_events.snapshot | 1 + 1 file changed, 1 insertion(+) diff --git a/app/tests/to-layer/normal/keycode_events.snapshot b/app/tests/to-layer/normal/keycode_events.snapshot index 5ac5eb68..7f46613e 100644 --- a/app/tests/to-layer/normal/keycode_events.snapshot +++ b/app/tests/to-layer/normal/keycode_events.snapshot @@ -12,6 +12,7 @@ to_released: position 0 layer 0 kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 to_pressed: position 0 layer 0 +layer_changed: layer 0 state 1 to_released: position 0 layer 0 to_pressed: position 1 layer 1 layer_changed: layer 1 state 1 From 5d89d589040f87ddc7a2e66bc53e1e40c9c17059 Mon Sep 17 00:00:00 2001 From: JP Bonn Date: Mon, 1 Mar 2021 22:47:11 -0700 Subject: [PATCH 3/7] changed zmk_layer_state_changed event --- app/include/zmk/events/layer_state_changed.h | 13 ++-- app/src/keymap.c | 62 ++++++++++++++------ 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/app/include/zmk/events/layer_state_changed.h b/app/include/zmk/events/layer_state_changed.h index 33183546..e6c9d93a 100644 --- a/app/include/zmk/events/layer_state_changed.h +++ b/app/include/zmk/events/layer_state_changed.h @@ -8,17 +8,18 @@ #include #include +#include struct zmk_layer_state_changed { - uint8_t layer; - bool state; + zmk_keymap_layers_state_t prior_state; int64_t timestamp; }; ZMK_EVENT_DECLARE(zmk_layer_state_changed); -static inline struct zmk_layer_state_changed_event *create_layer_state_changed(uint8_t layer, - bool state) { - return new_zmk_layer_state_changed((struct zmk_layer_state_changed){ - .layer = layer, .state = state, .timestamp = k_uptime_get()}); +static inline struct zmk_layer_state_changed_event * +create_layer_state_changed(zmk_keymap_layers_state_t prior_state) { + + return new_zmk_layer_state_changed( + (struct zmk_layer_state_changed){.prior_state = prior_state, .timestamp = k_uptime_get()}); } diff --git a/app/src/keymap.c b/app/src/keymap.c index 34760ab7..6552b795 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -74,6 +74,12 @@ static struct zmk_behavior_binding zmk_sensor_keymap[ZMK_KEYMAP_LAYERS_LEN] #endif /* ZMK_KEYMAP_HAS_SENSORS */ +static void raise_layer_event(zmk_keymap_layers_state_t prior_state) { + LOG_DBG("layer_changed: layer %d, old state %x, state %x", zmk_keymap_highest_layer_active(), + prior_state, zmk_keymap_layer_state()); + ZMK_EVENT_RAISE(create_layer_state_changed(prior_state)); +} + static inline int set_layer_state(uint8_t layer, bool state) { if (layer >= ZMK_KEYMAP_LAYERS_LEN) { return -EINVAL; @@ -83,21 +89,14 @@ static inline int set_layer_state(uint8_t layer, bool state) { if (layer == _zmk_keymap_layer_default && !state) { return 0; } - - zmk_keymap_layers_state_t old_state = _zmk_keymap_layer_state; WRITE_BIT(_zmk_keymap_layer_state, layer, state); - // Don't send state changes unless there was an actual change - if (old_state != _zmk_keymap_layer_state || layer == _zmk_keymap_layer_default) { - LOG_DBG("layer_changed: layer %d state %d", layer, state); - ZMK_EVENT_RAISE(create_layer_state_changed(layer, state)); - } return 0; } -uint8_t zmk_keymap_layer_default() { return _zmk_keymap_layer_default; } +inline uint8_t zmk_keymap_layer_default() { return _zmk_keymap_layer_default; } -zmk_keymap_layers_state_t zmk_keymap_layer_state() { return _zmk_keymap_layer_state; } +inline zmk_keymap_layers_state_t zmk_keymap_layer_state() { return _zmk_keymap_layer_state; } bool zmk_keymap_layer_active_with_state(uint8_t layer, zmk_keymap_layers_state_t state_to_test) { // The default layer is assumed to be ALWAYS ACTIVE so we include an || here to ensure nobody @@ -105,6 +104,11 @@ bool zmk_keymap_layer_active_with_state(uint8_t layer, zmk_keymap_layers_state_t return (state_to_test & (BIT(layer))) == (BIT(layer)) || layer == _zmk_keymap_layer_default; }; +bool zmk_keymap_layer_changed_from_prior_state(uint8_t layer, + zmk_keymap_layers_state_t prior_state) { + return ((prior_state & (BIT(layer))) != (zmk_keymap_layer_state() & (BIT(layer)))); +} + bool zmk_keymap_layer_active(uint8_t layer) { return zmk_keymap_layer_active_with_state(layer, _zmk_keymap_layer_state); }; @@ -118,24 +122,46 @@ uint8_t zmk_keymap_highest_layer_active() { return zmk_keymap_layer_default(); } -int zmk_keymap_layer_activate(uint8_t layer) { return set_layer_state(layer, true); }; +int zmk_keymap_layer_activate(uint8_t layer) { + zmk_keymap_layers_state_t prior_state = _zmk_keymap_layer_state; -int zmk_keymap_layer_deactivate(uint8_t layer) { return set_layer_state(layer, false); }; + int ret = set_layer_state(layer, true); + raise_layer_event(prior_state); + + return ret; +} + +int zmk_keymap_layer_deactivate(uint8_t layer) { + zmk_keymap_layers_state_t prior_state = _zmk_keymap_layer_state; + + int ret = set_layer_state(layer, false); + raise_layer_event(prior_state); + + return ret; +} int zmk_keymap_layer_toggle(uint8_t layer) { - if (zmk_keymap_layer_active(layer)) { - return zmk_keymap_layer_deactivate(layer); - } + int ret; + zmk_keymap_layers_state_t prior_state = _zmk_keymap_layer_state; - return zmk_keymap_layer_activate(layer); -}; + if (zmk_keymap_layer_active(layer)) { + ret = set_layer_state(layer, false); + } else { + ret = set_layer_state(layer, true); + } + raise_layer_event(prior_state); + + return ret; +} int zmk_keymap_layer_to(uint8_t layer) { + zmk_keymap_layers_state_t prior_state = _zmk_keymap_layer_state; for (int i = ZMK_KEYMAP_LAYERS_LEN - 1; i >= 0; i--) { - zmk_keymap_layer_deactivate(i); + set_layer_state(i, false); } - zmk_keymap_layer_activate(layer); + set_layer_state(layer, true); + raise_layer_event(prior_state); return 0; } From bc97fc0f2aa0d415703a12ec216e9855ec4793a8 Mon Sep 17 00:00:00 2001 From: JP Bonn Date: Tue, 2 Mar 2021 08:22:02 -0700 Subject: [PATCH 4/7] updated test for new layer event code --- app/tests/to-layer/normal/keycode_events.snapshot | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/tests/to-layer/normal/keycode_events.snapshot b/app/tests/to-layer/normal/keycode_events.snapshot index 7f46613e..dd234f12 100644 --- a/app/tests/to-layer/normal/keycode_events.snapshot +++ b/app/tests/to-layer/normal/keycode_events.snapshot @@ -1,19 +1,18 @@ kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 to_pressed: position 1 layer 1 -layer_changed: layer 1 state 1 +layer_changed: layer 1, old state 1, state 3 to_released: position 1 layer 1 kp_pressed: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00 to_pressed: position 0 layer 0 -layer_changed: layer 1 state 0 -layer_changed: layer 0 state 1 +layer_changed: layer 0, old state 3, state 1 to_released: position 0 layer 0 kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 to_pressed: position 0 layer 0 -layer_changed: layer 0 state 1 +layer_changed: layer 0, old state 1, state 1 to_released: position 0 layer 0 to_pressed: position 1 layer 1 -layer_changed: layer 1 state 1 +layer_changed: layer 1, old state 1, state 3 to_released: position 1 layer 1 From b1cd37f959324961a25ddb2ae759ff2a6b7c0337 Mon Sep 17 00:00:00 2001 From: JP Bonn Date: Tue, 2 Mar 2021 08:38:45 -0700 Subject: [PATCH 5/7] corrected comment --- app/tests/to-layer/normal/native_posix.keymap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/tests/to-layer/normal/native_posix.keymap b/app/tests/to-layer/normal/native_posix.keymap index 056341f7..3980efd6 100644 --- a/app/tests/to-layer/normal/native_posix.keymap +++ b/app/tests/to-layer/normal/native_posix.keymap @@ -3,9 +3,9 @@ #include #include "../behavior_keymap.dtsi" -// Press key A +// Press key S // To layer 1 -// Press key J +// Press key K // To layer 0 // Press key S // To layer 0 -- does nothing From 1b9e466c57706c7ae77fd26a162fc84508a0d3f6 Mon Sep 17 00:00:00 2001 From: JP Bonn Date: Tue, 2 Mar 2021 14:17:15 -0700 Subject: [PATCH 6/7] removed const from variable --- app/src/keymap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/keymap.c b/app/src/keymap.c index 6552b795..b6c3787c 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -19,8 +19,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -static const uint8_t _zmk_keymap_layer_default = 0; -static zmk_keymap_layers_state_t _zmk_keymap_layer_state = BIT(_zmk_keymap_layer_default); +#define ZMK_KEYMAP_INITIAL_DEFAULT_LAYER 0 + +static uint8_t _zmk_keymap_layer_default = ZMK_KEYMAP_INITIAL_DEFAULT_LAYER; +static zmk_keymap_layers_state_t _zmk_keymap_layer_state = BIT(ZMK_KEYMAP_INITIAL_DEFAULT_LAYER); #define DT_DRV_COMPAT zmk_keymap From d03c7feee09309cb9f0e401e15aca8d378bea6ea Mon Sep 17 00:00:00 2001 From: JP Bonn Date: Tue, 2 Mar 2021 14:38:21 -0700 Subject: [PATCH 7/7] added current state to zmk_layer_state_changed --- app/include/zmk/events/layer_state_changed.h | 7 ++++--- app/src/keymap.c | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/include/zmk/events/layer_state_changed.h b/app/include/zmk/events/layer_state_changed.h index e6c9d93a..0862caa4 100644 --- a/app/include/zmk/events/layer_state_changed.h +++ b/app/include/zmk/events/layer_state_changed.h @@ -12,14 +12,15 @@ struct zmk_layer_state_changed { zmk_keymap_layers_state_t prior_state; + zmk_keymap_layers_state_t state; int64_t timestamp; }; ZMK_EVENT_DECLARE(zmk_layer_state_changed); static inline struct zmk_layer_state_changed_event * -create_layer_state_changed(zmk_keymap_layers_state_t prior_state) { +create_layer_state_changed(zmk_keymap_layers_state_t prior_state, zmk_keymap_layers_state_t state) { - return new_zmk_layer_state_changed( - (struct zmk_layer_state_changed){.prior_state = prior_state, .timestamp = k_uptime_get()}); + return new_zmk_layer_state_changed((struct zmk_layer_state_changed){ + .prior_state = prior_state, .state = state, .timestamp = k_uptime_get()}); } diff --git a/app/src/keymap.c b/app/src/keymap.c index b6c3787c..31d4bca6 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -79,7 +79,7 @@ static struct zmk_behavior_binding zmk_sensor_keymap[ZMK_KEYMAP_LAYERS_LEN] static void raise_layer_event(zmk_keymap_layers_state_t prior_state) { LOG_DBG("layer_changed: layer %d, old state %x, state %x", zmk_keymap_highest_layer_active(), prior_state, zmk_keymap_layer_state()); - ZMK_EVENT_RAISE(create_layer_state_changed(prior_state)); + ZMK_EVENT_RAISE(create_layer_state_changed(prior_state, zmk_keymap_layer_state())); } static inline int set_layer_state(uint8_t layer, bool state) {