From a82f990d4c518165fc745ce2b5fb5cf2dd6b2727 Mon Sep 17 00:00:00 2001 From: Cody McGinnis Date: Tue, 18 Aug 2020 14:02:24 -0400 Subject: feat(keymap): allow users to toggle layers --- app/CMakeLists.txt | 1 + app/dts/behaviors.dtsi | 1 + app/dts/behaviors/toggle_layer.dtsi | 9 ++++ .../behaviors/zmk,behavior-toggle-layer.yaml | 8 ++++ app/include/zmk/keymap.h | 1 + app/src/behaviors/behavior_toggle_layer.c | 54 ++++++++++++++++++++++ app/src/keymap.c | 5 ++ 7 files changed, 79 insertions(+) create mode 100644 app/dts/behaviors/toggle_layer.dtsi create mode 100644 app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml create mode 100644 app/src/behaviors/behavior_toggle_layer.c (limited to 'app') diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index d0d343b..e0b9aea 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -38,6 +38,7 @@ target_sources(app PRIVATE src/behaviors/behavior_key_press.c) target_sources(app PRIVATE src/behaviors/behavior_reset.c) target_sources(app PRIVATE src/behaviors/behavior_mod_tap.c) target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c) +target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c) target_sources(app PRIVATE src/behaviors/behavior_transparent.c) target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c) target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/behaviors/behavior_rgb_underglow.c) diff --git a/app/dts/behaviors.dtsi b/app/dts/behaviors.dtsi index 04e42b6..a47a8b8 100644 --- a/app/dts/behaviors.dtsi +++ b/app/dts/behaviors.dtsi @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include \ No newline at end of file diff --git a/app/dts/behaviors/toggle_layer.dtsi b/app/dts/behaviors/toggle_layer.dtsi new file mode 100644 index 0000000..df6fd23 --- /dev/null +++ b/app/dts/behaviors/toggle_layer.dtsi @@ -0,0 +1,9 @@ +/ { + behaviors { + tog: behavior_toggle_layer { + compatible = "zmk,behavior-toggle-layer"; + label = "TOGGLE_LAYER"; + #binding-cells = <1>; + }; + }; +}; diff --git a/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml b/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml new file mode 100644 index 0000000..065949f --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2020, Cody McGinnis +# SPDX-License-Identifier: MIT + +description: Toggle Layer + +compatible: "zmk,behavior-toggle-layer" + +include: one_param.yaml diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 4a6bb37..c55207f 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -1,5 +1,6 @@ #pragma once +bool zmk_keymap_layer_active(u8_t layer); int zmk_keymap_layer_activate(u8_t layer); int zmk_keymap_layer_deactivate(u8_t layer); diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c new file mode 100644 index 0000000..ff0fe6a --- /dev/null +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Cody McGinnis + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_toggle_layer + +#include +#include +#include + +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +struct behavior_tog_config { }; +struct behavior_tog_data { }; + +static int behavior_tog_init(struct device *dev) +{ + return 0; +}; + + +static int tog_keymap_binding_pressed(struct device *dev, u32_t position, u32_t layer, u32_t _) +{ + LOG_DBG("position %d layer %d current %d", position, layer, zmk_keymap_layer_active(layer)); + + if (zmk_keymap_layer_active(layer)) + return zmk_keymap_layer_deactivate(layer); + + return zmk_keymap_layer_activate(layer); +} + +static int tog_keymap_binding_released(struct device *dev, u32_t position, u32_t layer, u32_t _) +{ + return 0; +} + +static const struct behavior_driver_api behavior_tog_driver_api = { + .binding_pressed = tog_keymap_binding_pressed, + .binding_released = tog_keymap_binding_released, +}; + +static const struct behavior_tog_config behavior_tog_config = {}; + +static struct behavior_tog_data behavior_tog_data; + +DEVICE_AND_API_INIT(behavior_tog, DT_INST_LABEL(0), behavior_tog_init, + &behavior_tog_data, + &behavior_tog_config, + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, + &behavior_tog_driver_api); diff --git a/app/src/keymap.c b/app/src/keymap.c index ff494f7..ebb42ef 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -76,6 +76,11 @@ static struct zmk_behavior_binding zmk_sensor_keymap[ZMK_KEYMAP_LAYERS_LEN][ZMK_ WRITE_BIT(zmk_keymap_layer_state, layer, state); \ return 0; +bool zmk_keymap_layer_active(u8_t layer) +{ + return (zmk_keymap_layer_state & (BIT(layer))) == (BIT(layer)); +}; + int zmk_keymap_layer_activate(u8_t layer) { SET_LAYER_STATE(layer, true); -- cgit v1.2.3 From 7facb6eee8c5864c86b0a69213db4aabf6f24585 Mon Sep 17 00:00:00 2001 From: Cody McGinnis Date: Tue, 18 Aug 2020 14:02:25 -0400 Subject: fix(keymap): move the toggle layer logic to keymap.c --- app/dts/behaviors/toggle_layer.dtsi | 8 +++++++- app/include/zmk/keymap.h | 1 + app/src/behaviors/behavior_toggle_layer.c | 7 +------ app/src/keymap.c | 8 ++++++++ 4 files changed, 17 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/dts/behaviors/toggle_layer.dtsi b/app/dts/behaviors/toggle_layer.dtsi index df6fd23..86a050d 100644 --- a/app/dts/behaviors/toggle_layer.dtsi +++ b/app/dts/behaviors/toggle_layer.dtsi @@ -1,4 +1,10 @@ -/ { +/* + * Copyright (c) 2020 Cody McGinnis + * + * SPDX-License-Identifier: MIT + */ + + / { behaviors { tog: behavior_toggle_layer { compatible = "zmk,behavior-toggle-layer"; diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index c55207f..c1f6393 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -3,5 +3,6 @@ bool zmk_keymap_layer_active(u8_t layer); int zmk_keymap_layer_activate(u8_t layer); int zmk_keymap_layer_deactivate(u8_t layer); +int zmk_keymap_layer_toggle(u8_t layer); int zmk_keymap_position_state_changed(u32_t position, bool pressed); diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c index ff0fe6a..13f4a29 100644 --- a/app/src/behaviors/behavior_toggle_layer.c +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -25,12 +25,7 @@ static int behavior_tog_init(struct device *dev) static int tog_keymap_binding_pressed(struct device *dev, u32_t position, u32_t layer, u32_t _) { - LOG_DBG("position %d layer %d current %d", position, layer, zmk_keymap_layer_active(layer)); - - if (zmk_keymap_layer_active(layer)) - return zmk_keymap_layer_deactivate(layer); - - return zmk_keymap_layer_activate(layer); + return zmk_keymap_layer_toggle(layer); } static int tog_keymap_binding_released(struct device *dev, u32_t position, u32_t layer, u32_t _) diff --git a/app/src/keymap.c b/app/src/keymap.c index ebb42ef..754305d 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -91,6 +91,14 @@ int zmk_keymap_layer_deactivate(u8_t layer) SET_LAYER_STATE(layer, false); }; +int zmk_keymap_layer_toggle(u8_t layer) +{ + if (zmk_keymap_layer_active(layer)) + return zmk_keymap_layer_deactivate(layer); + + return zmk_keymap_layer_activate(layer); +}; + bool is_active_position(u32_t position, u8_t layer) { return (zmk_keymap_layer_state & BIT(layer)) == BIT(layer) -- cgit v1.2.3 From 50643b2c561ef58d4c96e7dba6c55c0ef291146a Mon Sep 17 00:00:00 2001 From: Cody McGinnis Date: Tue, 18 Aug 2020 14:21:39 -0400 Subject: fix(keymap): add brackets around if statement body --- app/src/keymap.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/src/keymap.c b/app/src/keymap.c index 754305d..ee6e370 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -94,7 +94,9 @@ int zmk_keymap_layer_deactivate(u8_t layer) int zmk_keymap_layer_toggle(u8_t layer) { if (zmk_keymap_layer_active(layer)) - return zmk_keymap_layer_deactivate(layer); + { + return zmk_keymap_layer_deactivate(layer); + } return zmk_keymap_layer_activate(layer); }; -- cgit v1.2.3