diff options
author | Pete Johanson <peter@peterjohanson.com> | 2020-07-22 16:30:05 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-22 16:30:05 -0400 |
commit | 36f36f21f7bbdaf2443947c8ed3ef0f597b7e5f9 (patch) | |
tree | c2d7e993a43e16787d6c5999469f849654c8bd72 /app/src/behaviors | |
parent | 5896c3032b4d8c7ed4962672b75360a54c5b0e1c (diff) | |
parent | 5958bfed0bd764c50d1a926a29a419b6f99018d5 (diff) |
Merge pull request #61 from petejohanson/sensors/sensor-keymap-bindings
Add sensor handling to keymaps.
Diffstat (limited to 'app/src/behaviors')
-rw-r--r-- | app/src/behaviors/behavior_sensor_rotate_key_press.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c new file mode 100644 index 0000000..fb0fb85 --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_key_press.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_sensor_rotate_key_press + +#include <device.h> +#include <drivers/behavior.h> +#include <logging/log.h> + +#include <drivers/sensor.h> +#include <zmk/event-manager.h> +#include <zmk/events/keycode-state-changed.h> + +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 device *dev, struct device *sensor, u32_t increment_keycode, u32_t decrement_keycode) +{ + 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, increment_keycode, decrement_keycode); + + err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); + + if (err) { + LOG_WRN("Failed to ge sensor rotation value: %d", err); + return err; + } + + switch (value.val1) { + case 1: + keycode = increment_keycode; + break; + case -1: + keycode = decrement_keycode; + break; + default: + return -ENOTSUP; + } + + 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); + + // 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); +} + +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); + +DT_INST_FOREACH_STATUS_OKAY(KP_INST)
\ No newline at end of file |