feat(mouse): Add input configs for data mods.
* Add ability to swap X/Y, invert X and Y values, and apply a scalar multiplier/divisor.
This commit is contained in:
parent
2b6cdfa593
commit
e9513c51d3
17 changed files with 335 additions and 31 deletions
|
@ -28,6 +28,7 @@ target_sources_ifdef(CONFIG_ZMK_KSCAN_SIDEBAND_BEHAVIORS app PRIVATE src/kscan_s
|
||||||
target_sources(app PRIVATE src/matrix_transform.c)
|
target_sources(app PRIVATE src/matrix_transform.c)
|
||||||
target_sources(app PRIVATE src/physical_layouts.c)
|
target_sources(app PRIVATE src/physical_layouts.c)
|
||||||
target_sources_ifdef(CONFIG_ZMK_MOUSE app PRIVATE src/mouse/main.c)
|
target_sources_ifdef(CONFIG_ZMK_MOUSE app PRIVATE src/mouse/main.c)
|
||||||
|
target_sources_ifdef(CONFIG_ZMK_MOUSE app PRIVATE src/mouse/input_config.c)
|
||||||
target_sources(app PRIVATE src/sensors.c)
|
target_sources(app PRIVATE src/sensors.c)
|
||||||
target_sources_ifdef(CONFIG_ZMK_WPM app PRIVATE src/wpm.c)
|
target_sources_ifdef(CONFIG_ZMK_WPM app PRIVATE src/wpm.c)
|
||||||
target_sources(app PRIVATE src/event_manager.c)
|
target_sources(app PRIVATE src/event_manager.c)
|
||||||
|
|
24
app/dts/bindings/zmk,input-configs.yaml
Normal file
24
app/dts/bindings/zmk,input-configs.yaml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
description: |
|
||||||
|
Allows post-processing of input events based on the configuration
|
||||||
|
|
||||||
|
compatible: "zmk,input-configs"
|
||||||
|
|
||||||
|
child-binding:
|
||||||
|
description: "A configuration for a given input device"
|
||||||
|
|
||||||
|
properties:
|
||||||
|
device:
|
||||||
|
type: phandle
|
||||||
|
required: true
|
||||||
|
xy-swap:
|
||||||
|
type: boolean
|
||||||
|
x-invert:
|
||||||
|
type: boolean
|
||||||
|
y-invert:
|
||||||
|
type: boolean
|
||||||
|
scale-multiplier:
|
||||||
|
type: int
|
||||||
|
default: 1
|
||||||
|
scale-divisor:
|
||||||
|
type: int
|
||||||
|
default: 1
|
21
app/include/zmk/mouse/input_config.h
Normal file
21
app/include/zmk/mouse/input_config.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 The ZMK Contributors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <zephyr/kernel.h>
|
||||||
|
#include <zephyr/device.h>
|
||||||
|
|
||||||
|
struct zmk_input_config {
|
||||||
|
const struct device *dev;
|
||||||
|
bool xy_swap;
|
||||||
|
bool x_invert;
|
||||||
|
bool y_invert;
|
||||||
|
uint16_t scale_multiplier;
|
||||||
|
uint16_t scale_divisor;
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct zmk_input_config *zmk_input_config_get_for_device(const struct device *dev);
|
|
@ -169,14 +169,16 @@ static void tick_work_cb(struct k_work *work) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_start_times_for_activity_1d(struct movement_state_1d *state) {
|
||||||
|
if (state->speed != 0 && state->start_time == 0) {
|
||||||
|
state->start_time = k_uptime_get();
|
||||||
|
} else if (state->speed == 0) {
|
||||||
|
state->start_time = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
static void set_start_times_for_activity(struct movement_state_2d *state) {
|
static void set_start_times_for_activity(struct movement_state_2d *state) {
|
||||||
if (state->x.speed != 0 && state->x.start_time == 0) {
|
set_start_times_for_activity_1d(&state->x);
|
||||||
state->x.start_time = k_uptime_get();
|
set_start_times_for_activity_1d(&state->y);
|
||||||
}
|
|
||||||
|
|
||||||
if (state->y.speed != 0 && state->y.start_time == 0) {
|
|
||||||
state->y.start_time = k_uptime_get();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_work_scheduling(const struct device *dev) {
|
static void update_work_scheduling(const struct device *dev) {
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <zephyr/dt-bindings/input/input-event-codes.h>
|
#include <zephyr/dt-bindings/input/input-event-codes.h>
|
||||||
|
|
||||||
#include <zmk/mouse.h>
|
#include <zmk/mouse.h>
|
||||||
|
#include <zmk/mouse/input_config.h>
|
||||||
#include <zmk/endpoints.h>
|
#include <zmk/endpoints.h>
|
||||||
#include <zmk/hid.h>
|
#include <zmk/hid.h>
|
||||||
|
|
||||||
|
@ -52,7 +53,44 @@ void handle_key_code(struct input_event *evt) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void swap_xy(struct input_event *evt) {
|
||||||
|
switch (evt->code) {
|
||||||
|
case INPUT_REL_X:
|
||||||
|
evt->code = INPUT_REL_Y;
|
||||||
|
break;
|
||||||
|
case INPUT_REL_Y:
|
||||||
|
evt->code = INPUT_REL_X;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void filter_with_input_config(struct input_event *evt) {
|
||||||
|
if (!evt->dev) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct zmk_input_config *cfg = zmk_input_config_get_for_device(evt->dev);
|
||||||
|
|
||||||
|
if (!cfg) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->xy_swap) {
|
||||||
|
swap_xy(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((cfg->x_invert && evt->code == INPUT_REL_X) ||
|
||||||
|
(cfg->y_invert && evt->code == INPUT_REL_Y)) {
|
||||||
|
evt->value = -(evt->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
evt->value = (int16_t)((evt->value * cfg->scale_multiplier) / cfg->scale_divisor);
|
||||||
|
}
|
||||||
|
|
||||||
void input_handler(struct input_event *evt) {
|
void input_handler(struct input_event *evt) {
|
||||||
|
// First, filter to update the event data as needed.
|
||||||
|
filter_with_input_config(evt);
|
||||||
|
|
||||||
switch (evt->type) {
|
switch (evt->type) {
|
||||||
case INPUT_EV_REL:
|
case INPUT_EV_REL:
|
||||||
handle_rel_code(evt);
|
handle_rel_code(evt);
|
||||||
|
|
42
app/src/mouse/input_config.c
Normal file
42
app/src/mouse/input_config.c
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 The ZMK Contributors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zmk/mouse/input_config.h>
|
||||||
|
#include <zephyr/device.h>
|
||||||
|
|
||||||
|
#define DT_DRV_COMPAT zmk_input_configs
|
||||||
|
|
||||||
|
#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)
|
||||||
|
|
||||||
|
#define CHILD_CONFIG(inst) \
|
||||||
|
{ \
|
||||||
|
.dev = DEVICE_DT_GET(DT_PHANDLE(inst, device)), \
|
||||||
|
.xy_swap = DT_PROP(inst, xy_swap), \
|
||||||
|
.x_invert = DT_PROP(inst, x_invert), \
|
||||||
|
.y_invert = DT_PROP(inst, y_invert), \
|
||||||
|
.scale_multiplier = DT_PROP(inst, scale_multiplier), \
|
||||||
|
.scale_divisor = DT_PROP(inst, scale_divisor), \
|
||||||
|
},
|
||||||
|
|
||||||
|
const struct zmk_input_config configs[] = {DT_INST_FOREACH_CHILD(0, CHILD_CONFIG)};
|
||||||
|
|
||||||
|
const struct zmk_input_config *zmk_input_config_get_for_device(const struct device *dev) {
|
||||||
|
for (int i = 0; i < ARRAY_SIZE(configs); i++) {
|
||||||
|
if (configs[i].dev == dev) {
|
||||||
|
return &configs[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
const struct zmk_input_config *zmk_input_config_get_for_device(const struct device *dev) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1 @@
|
||||||
|
s/.*hid_mouse_//p
|
|
@ -0,0 +1,22 @@
|
||||||
|
movement_update: Mouse movement updated to -1/0
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to -3/0
|
||||||
|
movement_update: Mouse movement updated to -3/-3
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to -3/0
|
||||||
|
movement_update: Mouse movement updated to -3/-3
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to -5/0
|
||||||
|
movement_update: Mouse movement updated to -5/-3
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to -5/0
|
||||||
|
movement_update: Mouse movement updated to -5/-5
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 0/-5
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
|
@ -0,0 +1,38 @@
|
||||||
|
#include <behaviors.dtsi>
|
||||||
|
#include <dt-bindings/zmk/keys.h>
|
||||||
|
#include <dt-bindings/zmk/kscan_mock.h>
|
||||||
|
#include <dt-bindings/zmk/mouse.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
keymap {
|
||||||
|
compatible = "zmk,keymap";
|
||||||
|
label ="Default keymap";
|
||||||
|
|
||||||
|
default_layer {
|
||||||
|
bindings = <
|
||||||
|
&mmv MOVE_LEFT &mmv MOVE_UP
|
||||||
|
&none &none
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
input_configs {
|
||||||
|
compatible = "zmk,input-configs";
|
||||||
|
|
||||||
|
mmv {
|
||||||
|
device = <&mmv>;
|
||||||
|
scale-multiplier = <5>;
|
||||||
|
scale-divisor = <3>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
&kscan {
|
||||||
|
events = <
|
||||||
|
ZMK_MOCK_PRESS(0,0,10)
|
||||||
|
ZMK_MOCK_PRESS(0,1,100)
|
||||||
|
ZMK_MOCK_RELEASE(0,0,10)
|
||||||
|
ZMK_MOCK_RELEASE(0,1,10)
|
||||||
|
>;
|
||||||
|
};
|
|
@ -0,0 +1 @@
|
||||||
|
s/.*hid_mouse_//p
|
|
@ -0,0 +1,22 @@
|
||||||
|
movement_update: Mouse movement updated to 1/0
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 2/0
|
||||||
|
movement_update: Mouse movement updated to 2/2
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 2/0
|
||||||
|
movement_update: Mouse movement updated to 2/2
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 3/0
|
||||||
|
movement_update: Mouse movement updated to 3/2
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 3/0
|
||||||
|
movement_update: Mouse movement updated to 3/3
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 0/3
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
|
@ -0,0 +1,38 @@
|
||||||
|
#include <behaviors.dtsi>
|
||||||
|
#include <dt-bindings/zmk/keys.h>
|
||||||
|
#include <dt-bindings/zmk/kscan_mock.h>
|
||||||
|
#include <dt-bindings/zmk/mouse.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
keymap {
|
||||||
|
compatible = "zmk,keymap";
|
||||||
|
label ="Default keymap";
|
||||||
|
|
||||||
|
default_layer {
|
||||||
|
bindings = <
|
||||||
|
&mmv MOVE_LEFT &mmv MOVE_UP
|
||||||
|
&none &none
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
input_configs {
|
||||||
|
compatible = "zmk,input-configs";
|
||||||
|
|
||||||
|
mmv {
|
||||||
|
device = <&mmv>;
|
||||||
|
x-invert;
|
||||||
|
y-invert;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
&kscan {
|
||||||
|
events = <
|
||||||
|
ZMK_MOCK_PRESS(0,0,10)
|
||||||
|
ZMK_MOCK_PRESS(0,1,100)
|
||||||
|
ZMK_MOCK_RELEASE(0,0,10)
|
||||||
|
ZMK_MOCK_RELEASE(0,1,10)
|
||||||
|
>;
|
||||||
|
};
|
|
@ -0,0 +1 @@
|
||||||
|
s/.*hid_mouse_//p
|
|
@ -0,0 +1,22 @@
|
||||||
|
movement_update: Mouse movement updated to 0/-1
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 0/-2
|
||||||
|
movement_update: Mouse movement updated to -2/-2
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 0/-2
|
||||||
|
movement_update: Mouse movement updated to -2/-2
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 0/-3
|
||||||
|
movement_update: Mouse movement updated to -2/-3
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 0/-3
|
||||||
|
movement_update: Mouse movement updated to -3/-3
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to -3/0
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
|
@ -0,0 +1,37 @@
|
||||||
|
#include <behaviors.dtsi>
|
||||||
|
#include <dt-bindings/zmk/keys.h>
|
||||||
|
#include <dt-bindings/zmk/kscan_mock.h>
|
||||||
|
#include <dt-bindings/zmk/mouse.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
keymap {
|
||||||
|
compatible = "zmk,keymap";
|
||||||
|
label ="Default keymap";
|
||||||
|
|
||||||
|
default_layer {
|
||||||
|
bindings = <
|
||||||
|
&mmv MOVE_LEFT &mmv MOVE_UP
|
||||||
|
&none &none
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
input_configs {
|
||||||
|
compatible = "zmk,input-configs";
|
||||||
|
|
||||||
|
mmv {
|
||||||
|
device = <&mmv>;
|
||||||
|
xy-swap;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
&kscan {
|
||||||
|
events = <
|
||||||
|
ZMK_MOCK_PRESS(0,0,10)
|
||||||
|
ZMK_MOCK_PRESS(0,1,100)
|
||||||
|
ZMK_MOCK_RELEASE(0,0,10)
|
||||||
|
ZMK_MOCK_RELEASE(0,1,10)
|
||||||
|
>;
|
||||||
|
};
|
|
@ -10,18 +10,15 @@ movement_set: Mouse movement set to 0/0
|
||||||
movement_update: Mouse movement updated to -3/0
|
movement_update: Mouse movement updated to -3/0
|
||||||
scroll_set: Mouse scroll set to 0/0
|
scroll_set: Mouse scroll set to 0/0
|
||||||
movement_set: Mouse movement set to 0/0
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 1/0
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 2/0
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 2/0
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
movement_update: Mouse movement updated to 3/0
|
movement_update: Mouse movement updated to 3/0
|
||||||
scroll_set: Mouse scroll set to 0/0
|
scroll_set: Mouse scroll set to 0/0
|
||||||
movement_set: Mouse movement set to 0/0
|
movement_set: Mouse movement set to 0/0
|
||||||
movement_update: Mouse movement updated to 5/0
|
|
||||||
scroll_set: Mouse scroll set to 0/0
|
|
||||||
movement_set: Mouse movement set to 0/0
|
|
||||||
movement_update: Mouse movement updated to 5/0
|
|
||||||
scroll_set: Mouse scroll set to 0/0
|
|
||||||
movement_set: Mouse movement set to 0/0
|
|
||||||
movement_update: Mouse movement updated to 6/0
|
|
||||||
scroll_set: Mouse scroll set to 0/0
|
|
||||||
movement_set: Mouse movement set to 0/0
|
|
||||||
movement_update: Mouse movement updated to 6/0
|
|
||||||
scroll_set: Mouse scroll set to 0/0
|
|
||||||
movement_set: Mouse movement set to 0/0
|
|
|
@ -10,18 +10,15 @@ movement_set: Mouse movement set to 0/0
|
||||||
movement_update: Mouse movement updated to 0/-3
|
movement_update: Mouse movement updated to 0/-3
|
||||||
scroll_set: Mouse scroll set to 0/0
|
scroll_set: Mouse scroll set to 0/0
|
||||||
movement_set: Mouse movement set to 0/0
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 0/1
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 0/2
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
|
movement_update: Mouse movement updated to 0/2
|
||||||
|
scroll_set: Mouse scroll set to 0/0
|
||||||
|
movement_set: Mouse movement set to 0/0
|
||||||
movement_update: Mouse movement updated to 0/3
|
movement_update: Mouse movement updated to 0/3
|
||||||
scroll_set: Mouse scroll set to 0/0
|
scroll_set: Mouse scroll set to 0/0
|
||||||
movement_set: Mouse movement set to 0/0
|
movement_set: Mouse movement set to 0/0
|
||||||
movement_update: Mouse movement updated to 0/5
|
|
||||||
scroll_set: Mouse scroll set to 0/0
|
|
||||||
movement_set: Mouse movement set to 0/0
|
|
||||||
movement_update: Mouse movement updated to 0/5
|
|
||||||
scroll_set: Mouse scroll set to 0/0
|
|
||||||
movement_set: Mouse movement set to 0/0
|
|
||||||
movement_update: Mouse movement updated to 0/6
|
|
||||||
scroll_set: Mouse scroll set to 0/0
|
|
||||||
movement_set: Mouse movement set to 0/0
|
|
||||||
movement_update: Mouse movement updated to 0/6
|
|
||||||
scroll_set: Mouse scroll set to 0/0
|
|
||||||
movement_set: Mouse movement set to 0/0
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue