From 28c456e2d9790c47d5fb1e45ef03f3a29ffe32e7 Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Sun, 3 Nov 2024 22:30:41 +0100 Subject: [PATCH] Add power enabled check to power API (#68) --- app-sim/src/power.c | 5 +++++ boards/m5stack_core2/source/power.cpp | 12 ++++++++++++ tactility-headless/src/power.h | 2 ++ tactility/src/apps/settings/power/power.c | 10 ++++++++-- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app-sim/src/power.c b/app-sim/src/power.c index e4d2ab14..eaa46e81 100644 --- a/app-sim/src/power.c +++ b/app-sim/src/power.c @@ -10,6 +10,10 @@ static bool power_is_charging() { return is_charging_enabled; } +static bool power_is_charging_enabled() { + return is_charging_enabled; +} + static void power_set_charging_enabled(bool enabled) { is_charging_enabled = enabled; } @@ -24,6 +28,7 @@ static int32_t power_get_current() { const Power power = { .is_charging = &power_is_charging, + .is_charging_enabled = &power_is_charging_enabled, .set_charging_enabled = &power_set_charging_enabled, .get_charge_level = &power_get_charge_level, .get_current = &power_get_current diff --git a/boards/m5stack_core2/source/power.cpp b/boards/m5stack_core2/source/power.cpp index c88512e6..13a16c36 100644 --- a/boards/m5stack_core2/source/power.cpp +++ b/boards/m5stack_core2/source/power.cpp @@ -5,11 +5,22 @@ extern "C" { #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() { 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) { + is_charging_enabled = enabled; // Local shadow copy because M5 API doesn't provide a function for it M5.Power.setBatteryCharge(enabled); } @@ -24,6 +35,7 @@ static int32_t power_get_current() { Power core2_power = { .is_charging = &power_is_charging, + .is_charging_enabled = &power_is_charging_enabled, .set_charging_enabled = &power_set_charging_enabled, .get_charge_level = &power_get_charge_level, .get_current = &power_get_current diff --git a/tactility-headless/src/power.h b/tactility-headless/src/power.h index 10d1d2ba..5fb9a383 100644 --- a/tactility-headless/src/power.h +++ b/tactility-headless/src/power.h @@ -8,12 +8,14 @@ extern "C" { #include typedef bool (*PowerIsCharging)(); +typedef bool (*PowerIsChargingEnabled)(); typedef void (*PowerSetChargingEnabled)(bool enabled); 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 struct { PowerIsCharging is_charging; + PowerIsChargingEnabled is_charging_enabled; PowerSetChargingEnabled set_charging_enabled; PowerGetBatteryCharge get_charge_level; PowerGetCurrent get_current; diff --git a/tactility/src/apps/settings/power/power.c b/tactility/src/apps/settings/power/power.c index b9bc7239..63d28aff 100644 --- a/tactility/src/apps/settings/power/power.c +++ b/tactility/src/apps/settings/power/power.c @@ -13,6 +13,7 @@ typedef struct { Timer* update_timer; const Power* power; + lv_obj_t* enable_switch; lv_obj_t* charge_state; lv_obj_t* charge_level; lv_obj_t* current; @@ -21,12 +22,14 @@ typedef struct { static void app_update_ui(App 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"; uint8_t charge_level = data->power->get_charge_level(); uint16_t charge_level_scaled = (int16_t)charge_level * 100 / 255; int32_t current = data->power->get_current(); 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_level, "Charge level: %d%%", charge_level_scaled); #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); App app = lv_event_get_user_data(event); AppData* data = tt_app_get_data(app); - data->power->set_charging_enabled(is_on); - app_update_ui(app); + if (data->power->is_charging_enabled() != is_on) { + 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_set_align(enable_switch, LV_ALIGN_RIGHT_MID); + data->enable_switch = enable_switch; data->charge_state = lv_label_create(wrapper); data->charge_level = lv_label_create(wrapper); data->current = lv_label_create(wrapper);