Add setting to only allow external power while on USB power

In order to prevent battery drain from external screens, backlights or
underglow, allow users to use a setting to block power usage when not
connected to USB power.
This commit is contained in:
Bernardo Farah 2022-02-03 12:07:06 -08:00
parent 7430750428
commit c19779b29d
2 changed files with 38 additions and 0 deletions

View file

@ -333,6 +333,10 @@ endmenu
menu "Power Management" menu "Power Management"
config ZMK_USB_EXT_POWER_ONLY
bool "Turn off external power when USB is disconnected"
default n
config ZMK_IDLE_TIMEOUT config ZMK_IDLE_TIMEOUT
int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)"
default 30000 default 30000

View file

@ -14,6 +14,11 @@
#include <drivers/gpio.h> #include <drivers/gpio.h>
#include <drivers/ext_power.h> #include <drivers/ext_power.h>
#include <zmk/activity.h>
#include <zmk/usb.h>
#include <zmk/event_manager.h>
#include <zmk/events/usb_conn_state_changed.h>
#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)
#include <logging/log.h> #include <logging/log.h>
@ -128,6 +133,33 @@ struct settings_handler ext_power_conf = {.name = "ext_power/state",
.h_set = ext_power_settings_set}; .h_set = ext_power_settings_set};
#endif #endif
#if IS_ENABLED(CONFIG_ZMK_USB_EXT_POWER_ONLY)
static int ext_power_toggle(const struct device *dev, bool enable) {
// If our new state matches the power state, do nothing
if (!enable == (ext_power_get(dev) > 0)) {
return 0;
}
if (enable) {
return ext_power_enable(dev);
} else {
return ext_power_disable(dev);
}
}
static int ext_power_event_listener(const zmk_event_t *eh) {
if (as_zmk_usb_conn_state_changed(eh)) {
const struct device *ext_power = device_get_binding("EXT_POWER");
return ext_power_toggle(ext_power, zmk_usb_is_powered());
}
return -ENOTSUP;
}
ZMK_LISTENER(ext_power, ext_power_event_listener);
ZMK_SUBSCRIPTION(ext_power, zmk_usb_conn_state_changed);
#endif
static int ext_power_generic_init(const struct device *dev) { static int ext_power_generic_init(const struct device *dev) {
struct ext_power_generic_data *data = dev->data; struct ext_power_generic_data *data = dev->data;
const struct ext_power_generic_config *config = dev->config; const struct ext_power_generic_config *config = dev->config;
@ -167,6 +199,8 @@ static int ext_power_generic_init(const struct device *dev) {
ext_power_enable(dev); ext_power_enable(dev);
} }
#elif IS_ENABLED(CONFIG_ZMK_USB_EXT_POWER_ONLY)
ext_power_toggle(dev, zmk_usb_is_powered());
#else #else
// Default to the ext_power being open when no settings // Default to the ext_power being open when no settings
ext_power_enable(dev); ext_power_enable(dev);