Add power enabled check to power API (#68)

This commit is contained in:
Ken Van Hoeylandt 2024-11-03 22:30:41 +01:00 committed by GitHub
parent 632d7ccccf
commit 28c456e2d9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 27 additions and 2 deletions

View File

@ -10,6 +10,10 @@ static bool power_is_charging() {
return is_charging_enabled; return is_charging_enabled;
} }
static bool power_is_charging_enabled() {
return is_charging_enabled;
}
static void power_set_charging_enabled(bool enabled) { static void power_set_charging_enabled(bool enabled) {
is_charging_enabled = enabled; is_charging_enabled = enabled;
} }
@ -24,6 +28,7 @@ static int32_t power_get_current() {
const Power power = { const Power power = {
.is_charging = &power_is_charging, .is_charging = &power_is_charging,
.is_charging_enabled = &power_is_charging_enabled,
.set_charging_enabled = &power_set_charging_enabled, .set_charging_enabled = &power_set_charging_enabled,
.get_charge_level = &power_get_charge_level, .get_charge_level = &power_get_charge_level,
.get_current = &power_get_current .get_current = &power_get_current

View File

@ -5,11 +5,22 @@
extern "C" { extern "C" {
#endif #endif
/**
* M5.Power by default doesn't have a check to see if charging is enabled.
* However, it's always enabled by default after boot, so we cover that here:
*/
static bool is_charging_enabled = true;
static bool power_is_charging() { static bool power_is_charging() {
return M5.Power.isCharging() == m5::Power_Class::is_charging; return M5.Power.isCharging() == m5::Power_Class::is_charging;
} }
static bool power_is_charging_enabled() {
return is_charging_enabled;
}
static void power_set_charging_enabled(bool enabled) { static void power_set_charging_enabled(bool enabled) {
is_charging_enabled = enabled; // Local shadow copy because M5 API doesn't provide a function for it
M5.Power.setBatteryCharge(enabled); M5.Power.setBatteryCharge(enabled);
} }
@ -24,6 +35,7 @@ static int32_t power_get_current() {
Power core2_power = { Power core2_power = {
.is_charging = &power_is_charging, .is_charging = &power_is_charging,
.is_charging_enabled = &power_is_charging_enabled,
.set_charging_enabled = &power_set_charging_enabled, .set_charging_enabled = &power_set_charging_enabled,
.get_charge_level = &power_get_charge_level, .get_charge_level = &power_get_charge_level,
.get_current = &power_get_current .get_current = &power_get_current

View File

@ -8,12 +8,14 @@ extern "C" {
#include <stdint.h> #include <stdint.h>
typedef bool (*PowerIsCharging)(); typedef bool (*PowerIsCharging)();
typedef bool (*PowerIsChargingEnabled)();
typedef void (*PowerSetChargingEnabled)(bool enabled); typedef void (*PowerSetChargingEnabled)(bool enabled);
typedef uint8_t (*PowerGetBatteryCharge)(); // Power value [0, 255] which maps to 0-100% charge typedef uint8_t (*PowerGetBatteryCharge)(); // Power value [0, 255] which maps to 0-100% charge
typedef int32_t (*PowerGetCurrent)(); // Consumption or charge current in mAh typedef int32_t (*PowerGetCurrent)(); // Consumption or charge current in mAh
typedef struct { typedef struct {
PowerIsCharging is_charging; PowerIsCharging is_charging;
PowerIsChargingEnabled is_charging_enabled;
PowerSetChargingEnabled set_charging_enabled; PowerSetChargingEnabled set_charging_enabled;
PowerGetBatteryCharge get_charge_level; PowerGetBatteryCharge get_charge_level;
PowerGetCurrent get_current; PowerGetCurrent get_current;

View File

@ -13,6 +13,7 @@
typedef struct { typedef struct {
Timer* update_timer; Timer* update_timer;
const Power* power; const Power* power;
lv_obj_t* enable_switch;
lv_obj_t* charge_state; lv_obj_t* charge_state;
lv_obj_t* charge_level; lv_obj_t* charge_level;
lv_obj_t* current; lv_obj_t* current;
@ -21,12 +22,14 @@ typedef struct {
static void app_update_ui(App app) { static void app_update_ui(App app) {
AppData* data = tt_app_get_data(app); AppData* data = tt_app_get_data(app);
bool charging_enabled = data->power->is_charging_enabled();
const char* charge_state = data->power->is_charging() ? "yes" : "no"; const char* charge_state = data->power->is_charging() ? "yes" : "no";
uint8_t charge_level = data->power->get_charge_level(); uint8_t charge_level = data->power->get_charge_level();
uint16_t charge_level_scaled = (int16_t)charge_level * 100 / 255; uint16_t charge_level_scaled = (int16_t)charge_level * 100 / 255;
int32_t current = data->power->get_current(); int32_t current = data->power->get_current();
tt_lvgl_lock(tt_ms_to_ticks(1000)); tt_lvgl_lock(tt_ms_to_ticks(1000));
lv_obj_set_state(data->enable_switch, LV_STATE_CHECKED, charging_enabled);
lv_label_set_text_fmt(data->charge_state, "Charging: %s", charge_state); lv_label_set_text_fmt(data->charge_state, "Charging: %s", charge_state);
lv_label_set_text_fmt(data->charge_level, "Charge level: %d%%", charge_level_scaled); lv_label_set_text_fmt(data->charge_level, "Charge level: %d%%", charge_level_scaled);
#ifdef ESP_PLATFORM #ifdef ESP_PLATFORM
@ -44,8 +47,10 @@ static void on_power_enabled_change(lv_event_t* event) {
bool is_on = lv_obj_has_state(enable_switch, LV_STATE_CHECKED); bool is_on = lv_obj_has_state(enable_switch, LV_STATE_CHECKED);
App app = lv_event_get_user_data(event); App app = lv_event_get_user_data(event);
AppData* data = tt_app_get_data(app); AppData* data = tt_app_get_data(app);
data->power->set_charging_enabled(is_on); if (data->power->is_charging_enabled() != is_on) {
app_update_ui(app); data->power->set_charging_enabled(is_on);
app_update_ui(app);
}
} }
} }
@ -77,6 +82,7 @@ static void app_show(App app, lv_obj_t* parent) {
lv_obj_add_event_cb(enable_switch, on_power_enabled_change, LV_EVENT_ALL, app); lv_obj_add_event_cb(enable_switch, on_power_enabled_change, LV_EVENT_ALL, app);
lv_obj_set_align(enable_switch, LV_ALIGN_RIGHT_MID); lv_obj_set_align(enable_switch, LV_ALIGN_RIGHT_MID);
data->enable_switch = enable_switch;
data->charge_state = lv_label_create(wrapper); data->charge_state = lv_label_create(wrapper);
data->charge_level = lv_label_create(wrapper); data->charge_level = lv_label_create(wrapper);
data->current = lv_label_create(wrapper); data->current = lv_label_create(wrapper);