diff --git a/app/Kconfig b/app/Kconfig index 30d8e8cd082..e1a8ea86607 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -415,6 +415,14 @@ config ZMK_IDLE_SLEEP_TIMEOUT int "Milliseconds of inactivity before entering deep sleep" default 900000 +config ZMK_SLEEP_PREVENT_WHILE_BLE_CONNECTED + bool "Prevent sleeping while the active BT profile is connected" + depends on ZMK_BLE + +config ZMK_SLEEP_PREVENT_WHILE_USB_POWERED + bool "Prevent sleeping while USB power is connected" + default y + endif # ZMK_SLEEP config ZMK_EXT_POWER diff --git a/app/src/activity.c b/app/src/activity.c index f4dc3562437..395c73e84f8 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -26,6 +26,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #endif +#if IS_ENABLED(CONFIG_ZMK_SLEEP_PREVENT_WHILE_BLE_CONNECTED) +#include +#endif + #if IS_ENABLED(CONFIG_ZMK_POINTING) #include #endif @@ -75,7 +79,16 @@ void activity_work_handler(struct k_work *work) { int32_t current = k_uptime_get(); int32_t inactive_time = current - activity_last_uptime; #if IS_ENABLED(CONFIG_ZMK_SLEEP) - if (inactive_time > MAX_SLEEP_MS && !is_usb_power_present()) { + bool prevent_sleep = + IS_ENABLED(CONFIG_ZMK_SLEEP_PREVENT_WHILE_USB_POWERED) && is_usb_power_present(); +#if IS_ENABLED(CONFIG_ZMK_SLEEP_PREVENT_WHILE_BLE_CONNECTED) +#if !IS_ENABLED(CONFIG_ZMK_SPLIT) || IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) + prevent_sleep |= zmk_ble_active_profile_is_connected(); +#else + prevent_sleep |= zmk_split_bt_peripheral_is_connected(); +#endif +#endif + if (inactive_time > MAX_SLEEP_MS && !prevent_sleep) { // Put devices in suspend power mode before sleeping set_state(ZMK_ACTIVITY_SLEEP); @@ -124,4 +137,4 @@ INPUT_CALLBACK_DEFINE(NULL, activity_input_listener, NULL); #endif -SYS_INIT(activity_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); +SYS_INIT(activity_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); \ No newline at end of file diff --git a/docs/docs/config/power.md b/docs/docs/config/power.md index df889ed33f1..60a4c7703eb 100644 --- a/docs/docs/config/power.md +++ b/docs/docs/config/power.md @@ -14,12 +14,14 @@ Configuration for entering [low power states](../features/low-power-states.md) w Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) -| Config | Type | Description | Default | -| ------------------------------- | ---- | ------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_IDLE_TIMEOUT` | int | Milliseconds of inactivity before entering idle state | 30000 | -| `CONFIG_ZMK_SLEEP` | bool | Enable deep sleep support | n | -| `CONFIG_ZMK_IDLE_SLEEP_TIMEOUT` | int | Milliseconds of inactivity before entering deep sleep | 900000 | -| `CONFIG_ZMK_PM_SOFT_OFF` | bool | Enable soft off functionality from the keymap or dedicated hardware | n | +| Config | Type | Description | Default | +| ---------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------- | +| `CONFIG_ZMK_IDLE_TIMEOUT` | int | Milliseconds of inactivity before entering idle state | 30000 | +| `CONFIG_ZMK_SLEEP` | bool | Enable deep sleep support | n | +| `CONFIG_ZMK_IDLE_SLEEP_TIMEOUT` | int | Milliseconds of inactivity before entering deep sleep | 900000 | +| `CONFIG_ZMK_PM_SOFT_OFF` | bool | Enable soft off functionality from the keymap or dedicated hardware | n | +| `CONFIG_ZMK_SLEEP_PREVENT_WHILE_BLE_CONNECTED` | bool | Prevent sleeping while the active BT profile is connected. If the device loses connection after the sleep timer, it will sleep immediately | n | +| `CONFIG_ZMK_SLEEP_PREVENT_WHILE_USB_POWERED` | bool | Prevent sleeping while USB power is connected | y | ## External Power Control