Skip to content

Commit

Permalink
fix(pm): Fixes for dedicated on/off on peripherals.
Browse files Browse the repository at this point in the history
* Add new flag to differentiate soft off on peripherals that
  is invoked by split GATT svc and dedicated additional ones
  tied to GPIO pin.
  • Loading branch information
petejohanson committed Mar 25, 2024
1 parent 127b8b3 commit cb7a025
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 9 deletions.
5 changes: 2 additions & 3 deletions app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,9 @@ encoder: &qdec0 {

/ {
behaviors {
soft_off: soft_off {
hw_soft_off: hw_soft_off {
compatible = "zmk,behavior-soft-off";
#binding-cells = <0>;
status = "okay";
};
};

Expand All @@ -54,7 +53,7 @@ encoder: &qdec0 {
soft_off {
row = <0>;
column = <0>;
bindings = <&soft_off>;
bindings = <&hw_soft_off>;
};
};

Expand Down
3 changes: 2 additions & 1 deletion app/dts/behaviors/soft_off.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@

/ {
behaviors {
/omit-if-no-ref/ soft_off: soft_off {
/omit-if-no-ref/ soft_off: keymap_soft_off {
compatible = "zmk,behavior-soft-off";
#binding-cells = <0>;
split-peripheral-off-on-press;
};
};
};
3 changes: 3 additions & 0 deletions app/dts/bindings/behaviors/zmk,behavior-soft-off.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ properties:
type: int
required: false
description: Number of milliseconds the behavior must be held before releasing will actually trigger a soft-off.
split-peripheral-off-on-press:
type: boolean
description: When built for a split peripheral, turn off on press, not release
17 changes: 12 additions & 5 deletions app/src/behaviors/behavior_soft_off.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,30 @@
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

struct behavior_soft_off_config {
bool split_peripheral_turn_off_on_press;
uint32_t hold_time_ms;
};

struct behavior_soft_off_data {
uint32_t press_start;
};

#define IS_SPLIT_PERIPHERAL \
(IS_ENABLED(CONFIG_ZMK_SPLIT) && !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL))

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 = zmk_behavior_get_binding(binding->behavior_dev);
struct behavior_soft_off_data *data = dev->data;
const struct behavior_soft_off_config *config = dev->config;

#if IS_ENABLED(CONFIG_ZMK_SPLIT) && !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
zmk_pm_soft_off();
#else
data->press_start = k_uptime_get();
#endif
if (IS_SPLIT_PERIPHERAL && config->split_peripheral_turn_off_on_press) {
zmk_pm_soft_off();
} else {
data->press_start = k_uptime_get();
}

return ZMK_BEHAVIOR_OPAQUE;
}
Expand Down Expand Up @@ -71,6 +76,8 @@ static const struct behavior_driver_api behavior_soft_off_driver_api = {
#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), \
.split_peripheral_turn_off_on_press = \
DT_INST_PROP_OR(n, split_peripheral_off_on_press, false), \
}; \
static struct behavior_soft_off_data bso_data_##n = {}; \
BEHAVIOR_DT_INST_DEFINE(0, behavior_soft_off_init, NULL, &bso_data_##n, &bso_config_##n, \
Expand Down

0 comments on commit cb7a025

Please sign in to comment.