diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 4b61fc72..0e707dc1 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -39,6 +39,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/hid.c) target_sources(app PRIVATE src/behaviors/behavior_key_press.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_KEY_TOGGLE app PRIVATE src/behaviors/behavior_key_toggle.c) + target_sources(app PRIVATE src/behaviors/behavior_key_tap.c) target_sources(app PRIVATE src/behaviors/behavior_hold_tap.c) target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c) target_sources(app PRIVATE src/behaviors/behavior_caps_word.c) diff --git a/app/dts/behaviors.dtsi b/app/dts/behaviors.dtsi index b3502cbb..4f156896 100644 --- a/app/dts/behaviors.dtsi +++ b/app/dts/behaviors.dtsi @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -18,4 +19,4 @@ #include #include #include -#include \ No newline at end of file +#include diff --git a/app/dts/behaviors/key_tap.dtsi b/app/dts/behaviors/key_tap.dtsi new file mode 100644 index 00000000..c6635d4c --- /dev/null +++ b/app/dts/behaviors/key_tap.dtsi @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/ { + behaviors { + /omit-if-no-ref/ kt: behavior_key_tap { + compatible = "zmk,behavior-key-tap"; + label = "KEY_TAP"; + #binding-cells = <1>; + }; + }; +}; diff --git a/app/dts/bindings/behaviors/zmk,behavior-key-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-key-tap.yaml new file mode 100644 index 00000000..b8bec655 --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-key-tap.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Key press/immediate release behavior + +compatible: "zmk,behavior-key-tap" + +include: one_param.yaml diff --git a/app/src/behaviors/behavior_key_tap.c b/app/src/behaviors/behavior_key_tap.c new file mode 100644 index 00000000..fd1d68f9 --- /dev/null +++ b/app/src/behaviors/behavior_key_tap.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_key_tap + +#include +#include +#include + +#include +#include +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +static int behavior_key_tap_init(const struct device *dev) { return 0; }; + +static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); + int ret = 0; + ret = ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(binding->param1, true, event.timestamp)); + if(ret != 0) { + return 0; + } + return ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(binding->param1, false, event.timestamp)); + +} + +static int on_keymap_binding_released(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); + return 0; +} + +static const struct behavior_driver_api behavior_key_tap_driver_api = { + .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released}; + +#define KT_INST(n) \ + DEVICE_DT_INST_DEFINE(n, behavior_key_tap_init, device_pm_control_nop, NULL, NULL, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_key_tap_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(KT_INST)