Skip to content

Commit

Permalink
refactor(sensors): ec11 rotation sensor value in degrees.
Browse files Browse the repository at this point in the history
* Add new `steps` property to the `aips,ec11` binding, to make
  the driver properly report degrees in the rotation delta channel.
* Handle old sensor values in sensor rotate behavior.
  • Loading branch information
petejohanson committed Jun 29, 2022
1 parent 3898db2 commit 36a4ae0
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 8 deletions.
30 changes: 24 additions & 6 deletions app/drivers/sensor/ec11/ec11.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

#include "ec11.h"

#define FULL_ROTATION 360

LOG_MODULE_REGISTER(EC11, CONFIG_SENSOR_LOG_LEVEL);

static int ec11_get_ab_state(const struct device *dev) {
Expand Down Expand Up @@ -61,23 +63,38 @@ static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan)
drv_data->pulses += delta;
drv_data->ab_state = val;

drv_data->ticks = drv_data->pulses / drv_cfg->resolution;
drv_data->delta = delta;
drv_data->pulses %= drv_cfg->resolution;
if (drv_cfg->steps == 0) {
drv_data->ticks = drv_data->pulses / drv_cfg->resolution;
drv_data->delta = delta;
drv_data->pulses %= drv_cfg->resolution;
}

return 0;
}

static int ec11_channel_get(const struct device *dev, enum sensor_channel chan,
struct sensor_value *val) {
struct ec11_data *drv_data = dev->data;
const struct ec11_config *drv_cfg = dev->config;
int32_t pulses = drv_data->pulses;

if (chan != SENSOR_CHAN_ROTATION) {
return -ENOTSUP;
}

val->val1 = drv_data->ticks;
val->val2 = drv_data->delta;
drv_data->pulses = 0;

if (drv_cfg->steps > 0) {
val->val1 = (pulses * FULL_ROTATION) / drv_cfg->steps;
val->val2 = (pulses * FULL_ROTATION) - (val->val1 * drv_cfg->steps);
if (val->val2 != 0) {
val->val2 *= 1000000;
val->val2 /= drv_cfg->steps;
}
} else {
val->val1 = drv_data->ticks;
val->val2 = drv_data->delta;
}

return 0;
}
Expand Down Expand Up @@ -140,7 +157,8 @@ int ec11_init(const struct device *dev) {
.b_label = DT_INST_GPIO_LABEL(n, b_gpios), \
.b_pin = DT_INST_GPIO_PIN(n, b_gpios), \
.b_flags = DT_INST_GPIO_FLAGS(n, b_gpios), \
COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \
.resolution = DT_INST_PROP_OR(n, resolution, 1), \
.steps = DT_INST_PROP_OR(n, steps, 0), \
}; \
DEVICE_DT_INST_DEFINE(n, ec11_init, NULL, &ec11_data_##n, &ec11_cfg_##n, POST_KERNEL, \
CONFIG_SENSOR_INIT_PRIORITY, &ec11_driver_api);
Expand Down
1 change: 1 addition & 0 deletions app/drivers/sensor/ec11/ec11.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ struct ec11_config {
const uint8_t b_flags;

const uint8_t resolution;
const uint8_t steps;
};

struct ec11_data {
Expand Down
4 changes: 4 additions & 0 deletions app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,7 @@ properties:
type: int
description: Number of pulses per tick
required: false
steps:
type: int
description: Number of pulses in one full rotation
required: false
6 changes: 4 additions & 2 deletions app/src/behaviors/behavior_sensor_rotate_key_press.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,10 @@ static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding,
struct behavior_sensor_rotate_key_press_sensor_data *data = behavior_dev->data;

uint32_t keycode;

data->remainder[event.position] += value->val1;

// Some funky special casing for "old encoder behavior" where ticks where reported in val2 only,
// instead of rotational degrees in val1.
data->remainder[event.position] += (value->val1 == 0 ? (value->val2 * cfg->activation_resolution) : value->val1);

int8_t triggers = data->remainder[event.position] / cfg->activation_resolution;
data->remainder[event.position] %= cfg->activation_resolution;
Expand Down

0 comments on commit 36a4ae0

Please sign in to comment.