/* * Copyright (c) 2020 The ZMK Contributors * * SPDX-License-Identifier: MIT */ #include #include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include #include #include #include static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct battery_status_state { uint8_t level; #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) bool usb_present; #endif }; static void set_battery_symbol(lv_obj_t *label, struct battery_status_state state) { char text[9] = {}; uint8_t level = state.level; #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) if (state.usb_present) { strcpy(text, LV_SYMBOL_CHARGE " "); } #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE) char perc[5] = {}; snprintf(perc, sizeof(perc), "%3u%%", level); strcat(text, perc); #else if (level > 95) { strcat(text, LV_SYMBOL_BATTERY_FULL); } else if (level > 65) { strcat(text, LV_SYMBOL_BATTERY_3); } else if (level > 35) { strcat(text, LV_SYMBOL_BATTERY_2); } else if (level > 5) { strcat(text, LV_SYMBOL_BATTERY_1); } else { strcat(text, LV_SYMBOL_BATTERY_EMPTY); } #endif lv_label_set_text(label, text); lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); } void battery_status_update_cb(struct battery_status_state state) { struct zmk_widget_battery_status *widget; SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_battery_symbol(widget->obj, state); } } static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { return (struct battery_status_state) { .level = bt_bas_get_battery_level(), #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) .usb_present = zmk_usb_is_powered(), #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ }; } ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state, battery_status_update_cb, battery_status_get_state) ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed); #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { widget->obj = lv_label_create(parent, NULL); lv_obj_set_size(widget->obj, 43, 15); sys_slist_append(&widgets, &widget->node); widget_battery_status_init(); return 0; } lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget) { return widget->obj; }