Skip to content

Commit

Permalink
fix(sensors): Only accept data once per behavior.
Browse files Browse the repository at this point in the history
* Don't accept data for the same behavior on multiple layers more than
  once, to avoid duplicate/extraneous triggers.
  • Loading branch information
petejohanson committed Aug 28, 2023
1 parent dcb1f8f commit a92a496
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 13 deletions.
4 changes: 4 additions & 0 deletions app/include/zmk/keymap.h
Expand Up @@ -8,6 +8,10 @@

#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;

uint8_t zmk_keymap_layer_default();
Expand Down
15 changes: 8 additions & 7 deletions app/src/behaviors/behavior_sensor_rotate_common.c
Expand Up @@ -28,7 +28,7 @@ int zmk_behavior_sensor_rotate_common_accept_data(
if (value.val1 == 0) {
triggers = value.val2;
} else {
struct sensor_value remainder = data->remainder[sensor_index];
struct sensor_value remainder = data->remainder[sensor_index][event.layer];

remainder.val1 += value.val1;
remainder.val2 += value.val2;
Expand All @@ -42,15 +42,16 @@ int zmk_behavior_sensor_rotate_common_accept_data(
triggers = remainder.val1 / trigger_degrees;
remainder.val1 %= trigger_degrees;

data->remainder[sensor_index] = remainder;
data->remainder[sensor_index][event.layer] = remainder;
}

LOG_DBG(
"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,
data->remainder[sensor_index].val2, triggers, binding->param1, binding->param2);
value.val1, value.val2, data->remainder[sensor_index][event.layer].val1,
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;
}

Expand All @@ -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);

if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) {
data->triggers[sensor_index] = 0;
data->triggers[sensor_index][event.layer] = 0;
return ZMK_BEHAVIOR_TRANSPARENT;
}

int triggers = data->triggers[sensor_index];
int triggers = data->triggers[sensor_index][event.layer];

struct zmk_behavior_binding triggered_binding;
if (triggers > 0) {
Expand Down
5 changes: 3 additions & 2 deletions app/src/behaviors/behavior_sensor_rotate_common.h
Expand Up @@ -6,6 +6,7 @@

#include <drivers/behavior.h>
#include <zmk/behavior.h>
#include <zmk/keymap.h>
#include <zmk/sensors.h>

struct behavior_sensor_rotate_config {
Expand All @@ -16,8 +17,8 @@ struct behavior_sensor_rotate_config {
};

struct behavior_sensor_rotate_data {
struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN];
int triggers[ZMK_KEYMAP_SENSORS_LEN];
struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN][ZMK_KEYMAP_LAYERS_LEN];
int triggers[ZMK_KEYMAP_SENSORS_LEN][ZMK_KEYMAP_LAYERS_LEN];
};

int zmk_behavior_sensor_rotate_common_accept_data(
Expand Down
4 changes: 0 additions & 4 deletions app/src/keymap.c
Expand Up @@ -31,10 +31,6 @@ static uint8_t _zmk_keymap_layer_default = 0;

#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 TRANSFORMED_LAYER(node) \
Expand Down

0 comments on commit a92a496

Please sign in to comment.