Skip to content

Commit

Permalink
feat(behaviors): Add soft off behavior.
Browse files Browse the repository at this point in the history
* New soft-off behavior that can be used to force the device
  into  soft-off state with only certain configured wakeup
  devices.
  • Loading branch information
petejohanson committed Nov 7, 2023
1 parent 2b4e65f commit 0a6798a
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 0 deletions.
1 change: 1 addition & 0 deletions app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
target_sources(app PRIVATE src/behaviors/behavior_to_layer.c)
target_sources(app PRIVATE src/behaviors/behavior_transparent.c)
target_sources(app PRIVATE src/behaviors/behavior_none.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SOFT_OFF app PRIVATE src/behaviors/behavior_soft_off.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE app PRIVATE src/behaviors/behavior_sensor_rotate.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR app PRIVATE src/behaviors/behavior_sensor_rotate_var.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON app PRIVATE src/behaviors/behavior_sensor_rotate_common.c)
Expand Down
5 changes: 5 additions & 0 deletions app/Kconfig.behaviors
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ config ZMK_BEHAVIOR_KEY_TOGGLE
default y
depends on DT_HAS_ZMK_BEHAVIOR_KEY_TOGGLE_ENABLED

config ZMK_BEHAVIOR_SOFT_OFF
bool
default y
select ZMK_PM_SOFT_OFF
depends on DT_HAS_ZMK_BEHAVIOR_SOFT_OFF_ENABLED

config ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON
bool
Expand Down
14 changes: 14 additions & 0 deletions app/dts/bindings/behaviors/zmk,behavior-soft-off.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Copyright (c) 2023 The ZMK Contributors
# SPDX-License-Identifier: MIT

description: Soft-Off Behavior

compatible: "zmk,behavior-soft-off"

include: zero_param.yaml

properties:
hold-time-ms:
type: int
required: false
description: Number of milliseconds the behavior must be held before releasing will actually trigger a soft-off.
65 changes: 65 additions & 0 deletions app/src/behaviors/behavior_soft_off.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/

#define DT_DRV_COMPAT zmk_behavior_soft_off

#include <zephyr/device.h>
#include <drivers/behavior.h>
#include <zephyr/logging/log.h>

#include <zmk/pm.h>
#include <zmk/behavior.h>

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

struct behavior_soft_off_config {
uint32_t hold_time_ms;
};

struct behavior_soft_off_data {
uint32_t press_start;
};

static int behavior_soft_off_init(const struct device *dev) { return 0; };

static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event) {
const struct device *dev = device_get_binding(binding->behavior_dev);
struct behavior_soft_off_data *data = dev->data;

data->press_start = k_uptime_get();

return ZMK_BEHAVIOR_OPAQUE;
}

static int on_keymap_binding_released(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event) {
const struct device *dev = device_get_binding(binding->behavior_dev);
struct behavior_soft_off_data *data = dev->data;
const struct behavior_soft_off_config *config = dev->config;

if (config->hold_time_ms == 0 || (k_uptime_get() - data->press_start) >= config->hold_time_ms) {
zmk_pm_soft_off();
}

return ZMK_BEHAVIOR_OPAQUE;
}

static const struct behavior_driver_api behavior_soft_off_driver_api = {
.binding_pressed = on_keymap_binding_pressed,
.binding_released = on_keymap_binding_released,
};

#define BSO_INST(n) \
static const struct behavior_soft_off_config bso_config_##n = { \
.hold_time_ms = DT_INST_PROP_OR(n, hold_time_ms, 0), \
}; \
static struct behavior_soft_off_data bso_data_##n = {}; \
DEVICE_DT_INST_DEFINE(0, behavior_soft_off_init, NULL, &bso_data_##n, &bso_config_##n, \
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
&behavior_soft_off_driver_api);

DT_INST_FOREACH_STATUS_OKAY(BSO_INST)

0 comments on commit 0a6798a

Please sign in to comment.