forked from kofal.net/zmk
refactor(keys): Unify usage page.
* Remove need for separate `&cp` behavior, but keep it for now for backward compat. * Refactor sensor inc/dec as well.
This commit is contained in:
@@ -3,17 +3,10 @@
|
||||
|
||||
/ {
|
||||
behaviors {
|
||||
kp: behavior_key_press {
|
||||
/* DEPRECATED: `cp` will be removed in the future */
|
||||
cp: kp: behavior_key_press {
|
||||
compatible = "zmk,behavior-key-press";
|
||||
label = "KEY_PRESS";
|
||||
usage_page = <HID_USAGE_KEY>;
|
||||
#binding-cells = <1>;
|
||||
};
|
||||
|
||||
cp: behavior_consumer_press {
|
||||
compatible = "zmk,behavior-key-press";
|
||||
label = "CONSUMER_PRESS";
|
||||
usage_page = <HID_USAGE_CONSUMER>;
|
||||
#binding-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -3,17 +3,10 @@
|
||||
|
||||
/ {
|
||||
behaviors {
|
||||
inc_dec_kp: behavior_sensor_rotate_key_press {
|
||||
/* DEPRECATED: `inc_dec_cp` will be removed in the future */
|
||||
inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press {
|
||||
compatible = "zmk,behavior-sensor-rotate-key-press";
|
||||
label = "ENC_KEY_PRESS";
|
||||
usage_page = <HID_USAGE_KEY>;
|
||||
#sensor-binding-cells = <2>;
|
||||
};
|
||||
|
||||
inc_dec_cp: behavior_sensor_rotate_consumer_press {
|
||||
compatible = "zmk,behavior-sensor-rotate-key-press";
|
||||
label = "ENC_CONSUMER_PRESS";
|
||||
usage_page = <HID_USAGE_CONSUMER>;
|
||||
#sensor-binding-cells = <2>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -6,8 +6,3 @@ description: Key press/release behavior
|
||||
compatible: "zmk,behavior-key-press"
|
||||
|
||||
include: one_param.yaml
|
||||
|
||||
properties:
|
||||
usage_page:
|
||||
type: int
|
||||
default: 0
|
||||
|
||||
@@ -13,9 +13,6 @@ properties:
|
||||
type: int
|
||||
required: true
|
||||
const: 2
|
||||
usage_page:
|
||||
type: int
|
||||
default: 0
|
||||
|
||||
sensor-binding-cells:
|
||||
- param1
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#define HID_EXT_USAGE(page, id) ((page << 16) | id)
|
||||
#define HID_EXT_USAGE_ID(ext) (ext & 0xFFFF)
|
||||
#define HID_EXT_USAGE_PAGE(ext) (ext >> 16)
|
||||
|
||||
/* WARNING: DEPRECATED from dt-bindings/zmk/keys.h */
|
||||
#define USAGE_KEYPAD (0x07) // WARNING: DEPRECATED (DO NOT USE)
|
||||
#define USAGE_CONSUMER (0x0C) // WARNING: DEPRECATED (DO NOT USE)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,9 @@
|
||||
|
||||
#include <zephyr.h>
|
||||
#include <dt-bindings/zmk/modifiers.h>
|
||||
#include <dt-bindings/zmk/hid_usage_pages.h>
|
||||
#include <zmk/event-manager.h>
|
||||
#include <zmk/keys.h>
|
||||
|
||||
struct keycode_state_changed {
|
||||
struct zmk_event_header header;
|
||||
@@ -20,12 +22,20 @@ struct keycode_state_changed {
|
||||
|
||||
ZMK_EVENT_DECLARE(keycode_state_changed);
|
||||
|
||||
static inline struct keycode_state_changed *
|
||||
create_keycode_state_changed(u8_t usage_page, u32_t keycode, bool state) {
|
||||
static inline struct keycode_state_changed *keycode_state_changed_from_encoded(u32_t encoded,
|
||||
bool pressed) {
|
||||
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);
|
||||
|
||||
if (!page) {
|
||||
page = HID_USAGE_KEY;
|
||||
}
|
||||
|
||||
struct keycode_state_changed *ev = new_keycode_state_changed();
|
||||
ev->usage_page = usage_page;
|
||||
ev->keycode = STRIP_MODS(keycode);
|
||||
ev->implicit_modifiers = SELECT_MODS(keycode);
|
||||
ev->state = state;
|
||||
ev->usage_page = page;
|
||||
ev->keycode = id;
|
||||
ev->implicit_modifiers = implicit_mods;
|
||||
ev->state = pressed;
|
||||
return ev;
|
||||
}
|
||||
|
||||
@@ -429,8 +429,8 @@ static int position_state_changed_listener(const struct zmk_event_header *eh) {
|
||||
}
|
||||
|
||||
static inline bool only_mods(struct keycode_state_changed *ev) {
|
||||
return ev->usage_page == HID_USAGE_KEY && ev->keycode >= LEFT_CONTROL &&
|
||||
ev->keycode <= RIGHT_GUI;
|
||||
return ev->usage_page == HID_USAGE_KEY && ev->keycode >= HID_USAGE_KEY_KEYBOARD_LEFTCONTROL &&
|
||||
ev->keycode <= HID_USAGE_KEY_KEYBOARD_RIGHT_GUI;
|
||||
}
|
||||
|
||||
static int keycode_state_changed_listener(const struct zmk_event_header *eh) {
|
||||
|
||||
@@ -16,42 +16,28 @@
|
||||
|
||||
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||
|
||||
struct behavior_key_press_config {
|
||||
u8_t usage_page;
|
||||
};
|
||||
struct behavior_key_press_data {};
|
||||
|
||||
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) {
|
||||
struct device *dev = device_get_binding(binding->behavior_dev);
|
||||
const struct behavior_key_press_config *cfg = dev->config_info;
|
||||
LOG_DBG("position %d usage_page 0x%02X keycode 0x%02X", event.position, cfg->usage_page,
|
||||
binding->param1);
|
||||
LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1);
|
||||
|
||||
return ZMK_EVENT_RAISE(create_keycode_state_changed(cfg->usage_page, binding->param1, true));
|
||||
return ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(binding->param1, true));
|
||||
}
|
||||
|
||||
static int on_keymap_binding_released(struct zmk_behavior_binding *binding,
|
||||
struct zmk_behavior_binding_event event) {
|
||||
struct device *dev = device_get_binding(binding->behavior_dev);
|
||||
const struct behavior_key_press_config *cfg = dev->config_info;
|
||||
LOG_DBG("position %d usage_page 0x%02X keycode 0x%02X", event.position, cfg->usage_page,
|
||||
binding->param1);
|
||||
LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1);
|
||||
|
||||
return ZMK_EVENT_RAISE(create_keycode_state_changed(cfg->usage_page, binding->param1, false));
|
||||
return ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(binding->param1, false));
|
||||
}
|
||||
|
||||
static const struct behavior_driver_api behavior_key_press_driver_api = {
|
||||
.binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released};
|
||||
|
||||
#define KP_INST(n) \
|
||||
static const struct behavior_key_press_config behavior_key_press_config_##n = { \
|
||||
.usage_page = DT_INST_PROP(n, usage_page)}; \
|
||||
static struct behavior_key_press_data behavior_key_press_data_##n; \
|
||||
DEVICE_AND_API_INIT(behavior_key_press_##n, DT_INST_LABEL(n), behavior_key_press_init, \
|
||||
&behavior_key_press_data_##n, &behavior_key_press_config_##n, APPLICATION, \
|
||||
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_press_driver_api);
|
||||
DEVICE_AND_API_INIT(behavior_key_press_##n, DT_INST_LABEL(n), behavior_key_press_init, NULL, \
|
||||
NULL, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
|
||||
&behavior_key_press_driver_api);
|
||||
|
||||
DT_INST_FOREACH_STATUS_OKAY(KP_INST)
|
||||
|
||||
@@ -16,23 +16,14 @@
|
||||
|
||||
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||
|
||||
struct behavior_sensor_rotate_key_press_config {
|
||||
u8_t usage_page;
|
||||
};
|
||||
struct behavior_sensor_rotate_key_press_data {};
|
||||
|
||||
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) {
|
||||
struct device *dev = device_get_binding(binding->behavior_dev);
|
||||
const struct behavior_sensor_rotate_key_press_config *cfg = dev->config_info;
|
||||
struct sensor_value value;
|
||||
int err;
|
||||
u32_t keycode;
|
||||
struct keycode_state_changed *ev;
|
||||
LOG_DBG("usage_page 0x%02X inc keycode 0x%02X dec keycode 0x%02X", cfg->usage_page,
|
||||
binding->param1, binding->param2);
|
||||
LOG_DBG("inc keycode 0x%02X dec keycode 0x%02X", binding->param1, binding->param2);
|
||||
|
||||
err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value);
|
||||
|
||||
@@ -54,33 +45,21 @@ static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding,
|
||||
|
||||
LOG_DBG("SEND %d", keycode);
|
||||
|
||||
ev = new_keycode_state_changed();
|
||||
ev->usage_page = cfg->usage_page;
|
||||
ev->keycode = keycode;
|
||||
ev->state = true;
|
||||
ZMK_EVENT_RAISE(ev);
|
||||
ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(keycode, true));
|
||||
|
||||
// TODO: Better way to do this?
|
||||
k_msleep(5);
|
||||
|
||||
ev = new_keycode_state_changed();
|
||||
ev->usage_page = cfg->usage_page;
|
||||
ev->keycode = keycode;
|
||||
ev->state = false;
|
||||
return ZMK_EVENT_RAISE(ev);
|
||||
return ZMK_EVENT_RAISE(keycode_state_changed_from_encoded(keycode, false));
|
||||
}
|
||||
|
||||
static const struct behavior_driver_api behavior_sensor_rotate_key_press_driver_api = {
|
||||
.sensor_binding_triggered = on_sensor_binding_triggered};
|
||||
|
||||
#define KP_INST(n) \
|
||||
static const struct behavior_sensor_rotate_key_press_config \
|
||||
behavior_sensor_rotate_key_press_config_##n = {.usage_page = DT_INST_PROP(n, usage_page)}; \
|
||||
static struct behavior_sensor_rotate_key_press_data behavior_sensor_rotate_key_press_data_##n; \
|
||||
DEVICE_AND_API_INIT( \
|
||||
behavior_sensor_rotate_key_press_##n, DT_INST_LABEL(n), \
|
||||
behavior_sensor_rotate_key_press_init, &behavior_sensor_rotate_key_press_data_##n, \
|
||||
&behavior_sensor_rotate_key_press_config_##n, APPLICATION, \
|
||||
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_key_press_driver_api);
|
||||
DEVICE_AND_API_INIT(behavior_sensor_rotate_key_press_##n, DT_INST_LABEL(n), \
|
||||
behavior_sensor_rotate_key_press_init, NULL, NULL, APPLICATION, \
|
||||
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
|
||||
&behavior_sensor_rotate_key_press_driver_api);
|
||||
|
||||
DT_INST_FOREACH_STATUS_OKAY(KP_INST)
|
||||
@@ -9,6 +9,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||
|
||||
#include <zmk/hid.h>
|
||||
#include <dt-bindings/zmk/modifiers.h>
|
||||
#include <dt-bindings/zmk/hid_usage_pages.h>
|
||||
|
||||
static struct zmk_hid_keypad_report kp_report = {
|
||||
.report_id = 1, .body = {.modifiers = 0, ._reserved = 0, .keys = {0}}};
|
||||
@@ -78,16 +79,16 @@ int zmk_hid_implicit_modifiers_release() {
|
||||
}
|
||||
|
||||
int zmk_hid_keypad_press(zmk_key code) {
|
||||
if (code >= LEFT_CONTROL && code <= RIGHT_GUI) {
|
||||
return zmk_hid_register_mod(code - LEFT_CONTROL);
|
||||
if (code >= HID_USAGE_KEY_KEYBOARD_LEFTCONTROL && code <= HID_USAGE_KEY_KEYBOARD_RIGHT_GUI) {
|
||||
return zmk_hid_register_mod(code - HID_USAGE_KEY_KEYBOARD_LEFTCONTROL);
|
||||
}
|
||||
TOGGLE_KEYPAD(0U, code);
|
||||
return 0;
|
||||
};
|
||||
|
||||
int zmk_hid_keypad_release(zmk_key code) {
|
||||
if (code >= LEFT_CONTROL && code <= RIGHT_GUI) {
|
||||
return zmk_hid_unregister_mod(code - LEFT_CONTROL);
|
||||
if (code >= HID_USAGE_KEY_KEYBOARD_LEFTCONTROL && code <= HID_USAGE_KEY_KEYBOARD_RIGHT_GUI) {
|
||||
return zmk_hid_unregister_mod(code - HID_USAGE_KEY_KEYBOARD_LEFTCONTROL);
|
||||
}
|
||||
TOGGLE_KEYPAD(code, 0U);
|
||||
return 0;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
default_layer {
|
||||
bindings = <
|
||||
&kp B &none
|
||||
&cp C_NEXT &none>;
|
||||
&kp C_NEXT &none>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
lower_layer {
|
||||
bindings = <
|
||||
&cp C_NEXT &trans
|
||||
&kp C_NEXT &trans
|
||||
&kp L &kp J>;
|
||||
};
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
lower_layer {
|
||||
bindings = <
|
||||
&cp C_NEXT &trans
|
||||
&kp C_NEXT &trans
|
||||
&kp L &kp J>;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user