fix(sensors): Only accept data once per behavior.
* Don't accept data for the same behavior on multiple layers more than once, to avoid duplicate/extraneous triggers.
This commit is contained in:
parent
dcb1f8f135
commit
a92a4967aa
4 changed files with 15 additions and 13 deletions
|
@ -8,6 +8,10 @@
|
||||||
|
|
||||||
#include <zmk/events/position_state_changed.h>
|
#include <zmk/events/position_state_changed.h>
|
||||||
|
|
||||||
|
#define ZMK_LAYER_CHILD_LEN_PLUS_ONE(node) 1 +
|
||||||
|
#define ZMK_KEYMAP_LAYERS_LEN \
|
||||||
|
(DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0)
|
||||||
|
|
||||||
typedef uint32_t zmk_keymap_layers_state_t;
|
typedef uint32_t zmk_keymap_layers_state_t;
|
||||||
|
|
||||||
uint8_t zmk_keymap_layer_default();
|
uint8_t zmk_keymap_layer_default();
|
||||||
|
|
|
@ -28,7 +28,7 @@ int zmk_behavior_sensor_rotate_common_accept_data(
|
||||||
if (value.val1 == 0) {
|
if (value.val1 == 0) {
|
||||||
triggers = value.val2;
|
triggers = value.val2;
|
||||||
} else {
|
} else {
|
||||||
struct sensor_value remainder = data->remainder[sensor_index];
|
struct sensor_value remainder = data->remainder[sensor_index][event.layer];
|
||||||
|
|
||||||
remainder.val1 += value.val1;
|
remainder.val1 += value.val1;
|
||||||
remainder.val2 += value.val2;
|
remainder.val2 += value.val2;
|
||||||
|
@ -42,15 +42,16 @@ int zmk_behavior_sensor_rotate_common_accept_data(
|
||||||
triggers = remainder.val1 / trigger_degrees;
|
triggers = remainder.val1 / trigger_degrees;
|
||||||
remainder.val1 %= trigger_degrees;
|
remainder.val1 %= trigger_degrees;
|
||||||
|
|
||||||
data->remainder[sensor_index] = remainder;
|
data->remainder[sensor_index][event.layer] = remainder;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DBG(
|
LOG_DBG(
|
||||||
"val1: %d, val2: %d, remainder: %d/%d triggers: %d inc keycode 0x%02X dec keycode 0x%02X",
|
"val1: %d, val2: %d, remainder: %d/%d triggers: %d inc keycode 0x%02X dec keycode 0x%02X",
|
||||||
value.val1, value.val2, data->remainder[sensor_index].val1,
|
value.val1, value.val2, data->remainder[sensor_index][event.layer].val1,
|
||||||
data->remainder[sensor_index].val2, triggers, binding->param1, binding->param2);
|
data->remainder[sensor_index][event.layer].val2, triggers, binding->param1,
|
||||||
|
binding->param2);
|
||||||
|
|
||||||
data->triggers[sensor_index] = triggers;
|
data->triggers[sensor_index][event.layer] = triggers;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,11 +65,11 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi
|
||||||
const int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position);
|
const int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position);
|
||||||
|
|
||||||
if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) {
|
if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) {
|
||||||
data->triggers[sensor_index] = 0;
|
data->triggers[sensor_index][event.layer] = 0;
|
||||||
return ZMK_BEHAVIOR_TRANSPARENT;
|
return ZMK_BEHAVIOR_TRANSPARENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
int triggers = data->triggers[sensor_index];
|
int triggers = data->triggers[sensor_index][event.layer];
|
||||||
|
|
||||||
struct zmk_behavior_binding triggered_binding;
|
struct zmk_behavior_binding triggered_binding;
|
||||||
if (triggers > 0) {
|
if (triggers > 0) {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <drivers/behavior.h>
|
#include <drivers/behavior.h>
|
||||||
#include <zmk/behavior.h>
|
#include <zmk/behavior.h>
|
||||||
|
#include <zmk/keymap.h>
|
||||||
#include <zmk/sensors.h>
|
#include <zmk/sensors.h>
|
||||||
|
|
||||||
struct behavior_sensor_rotate_config {
|
struct behavior_sensor_rotate_config {
|
||||||
|
@ -16,8 +17,8 @@ struct behavior_sensor_rotate_config {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct behavior_sensor_rotate_data {
|
struct behavior_sensor_rotate_data {
|
||||||
struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN];
|
struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN][ZMK_KEYMAP_LAYERS_LEN];
|
||||||
int triggers[ZMK_KEYMAP_SENSORS_LEN];
|
int triggers[ZMK_KEYMAP_SENSORS_LEN][ZMK_KEYMAP_LAYERS_LEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
int zmk_behavior_sensor_rotate_common_accept_data(
|
int zmk_behavior_sensor_rotate_common_accept_data(
|
||||||
|
|
|
@ -31,10 +31,6 @@ static uint8_t _zmk_keymap_layer_default = 0;
|
||||||
|
|
||||||
#define DT_DRV_COMPAT zmk_keymap
|
#define DT_DRV_COMPAT zmk_keymap
|
||||||
|
|
||||||
#define LAYER_CHILD_LEN(node) 1 +
|
|
||||||
#define ZMK_KEYMAP_NODE DT_DRV_INST(0)
|
|
||||||
#define ZMK_KEYMAP_LAYERS_LEN (DT_INST_FOREACH_CHILD(0, LAYER_CHILD_LEN) 0)
|
|
||||||
|
|
||||||
#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst)
|
#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst)
|
||||||
|
|
||||||
#define TRANSFORMED_LAYER(node) \
|
#define TRANSFORMED_LAYER(node) \
|
||||||
|
|
Loading…
Add table
Reference in a new issue