Skip to content

Commit

Permalink
feat: Sticky keys behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
okke-formsma committed Nov 6, 2020
1 parent a4dc92a commit 252ff14
Show file tree
Hide file tree
Showing 32 changed files with 483 additions and 17 deletions.
1 change: 1 addition & 0 deletions app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ if (NOT CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL)
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_hold_tap.c)
target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c)
target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c)
target_sources(app PRIVATE src/behaviors/behavior_outputs.c)
target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c)
Expand Down
1 change: 1 addition & 0 deletions app/dts/behaviors.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <behaviors/none.dtsi>
#include <behaviors/mod_tap.dtsi>
#include <behaviors/layer_tap.dtsi>
#include <behaviors/sticky_key.dtsi>
#include <behaviors/momentary_layer.dtsi>
#include <behaviors/toggle_layer.dtsi>
#include <behaviors/reset.dtsi>
Expand Down
20 changes: 20 additions & 0 deletions app/dts/behaviors/sticky_key.dtsi
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/ {
behaviors {
sk: behavior_sticky_key {
compatible = "zmk,behavior-sticky-key";
label = "STICKY_KEY";
#binding-cells = <1>;
release-after-ms = <1000>;
bindings = <&kp>;
};
sl: behavior_sticky_layer {
compatible = "zmk,behavior-sticky-key";
label = "STICKY_LAYER";
#binding-cells = <1>;
release-after-ms = <1000>;
bindings = <&mo>;
};
};

};

15 changes: 15 additions & 0 deletions app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT

description: One Shot behavior

compatible: "zmk,behavior-sticky-key"

include: one_param.yaml

properties:
bindings:
type: phandles
required: true
release-after-ms:
type: int
8 changes: 4 additions & 4 deletions app/include/drivers/behavior.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event);
typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding,
struct device *sensor);
struct device *sensor, s64_t timestamp);

__subsystem struct behavior_driver_api {
behavior_keymap_binding_callback_t binding_pressed;
Expand Down Expand Up @@ -92,19 +92,19 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi
* @retval Negative errno code if failure.
*/
__syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding,
struct device *sensor);
struct device *sensor, s64_t timestamp);

static inline int
z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding,
struct device *sensor) {
struct device *sensor, s64_t timestamp) {
struct device *dev = device_get_binding(binding->behavior_dev);
const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->driver_api;

if (api->sensor_binding_triggered == NULL) {
return -ENOTSUP;
}

return api->sensor_binding_triggered(binding, sensor);
return api->sensor_binding_triggered(binding, sensor, timestamp);
}

/**
Expand Down
6 changes: 4 additions & 2 deletions app/include/zmk/events/keycode-state-changed.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@ struct keycode_state_changed {
u32_t keycode;
u8_t implicit_modifiers;
bool state;
s64_t timestamp;
};

ZMK_EVENT_DECLARE(keycode_state_changed);

static inline struct keycode_state_changed *keycode_state_changed_from_encoded(u32_t encoded,
bool pressed) {
static inline struct keycode_state_changed *
keycode_state_changed_from_encoded(u32_t encoded, bool pressed, s64_t timestamp) {
u16_t page = HID_EXT_USAGE_PAGE(encoded) & 0xFF;
u16_t id = HID_EXT_USAGE_ID(encoded);
zmk_mod_flags implicit_mods = SELECT_MODS(encoded);
Expand All @@ -37,5 +38,6 @@ static inline struct keycode_state_changed *keycode_state_changed_from_encoded(u
ev->keycode = id;
ev->implicit_modifiers = implicit_mods;
ev->state = pressed;
ev->timestamp = timestamp;
return ev;
}
8 changes: 4 additions & 4 deletions app/src/behaviors/behavior_key_press.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ static int behavior_key_press_init(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);

return ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(binding->param1, true));
return ZMK_EVENT_RAISE(
keycode_state_changed_from_encoded(binding->param1, true, 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 ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(binding->param1, false));
return ZMK_EVENT_RAISE(
keycode_state_changed_from_encoded(binding->param1, false, event.timestamp));
}

static const struct behavior_driver_api behavior_key_press_driver_api = {
Expand Down
8 changes: 4 additions & 4 deletions app/src/behaviors/behavior_sensor_rotate_key_press.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

static int behavior_sensor_rotate_key_press_init(struct device *dev) { return 0; };

static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding,
struct device *sensor) {
static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding, struct device *sensor,
s64_t timestamp) {
struct sensor_value value;
int err;
u32_t keycode;
Expand All @@ -45,12 +45,12 @@ static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding,

LOG_DBG("SEND %d", keycode);

ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(keycode, true));
ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(keycode, true, timestamp));

// TODO: Better way to do this?
k_msleep(5);

return ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(keycode, false));
return ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(keycode, false, timestamp));
}

static const struct behavior_driver_api behavior_sensor_rotate_key_press_driver_api = {
Expand Down

0 comments on commit 252ff14

Please sign in to comment.