Power improvements (#114)

This commit is contained in:
Ken Van Hoeylandt
2024-12-09 21:58:30 +01:00
committed by GitHub
parent e4206e8637
commit da81256622
16 changed files with 370 additions and 96 deletions
+67 -19
View File
@@ -13,12 +13,13 @@ namespace tt::app::power {
#define TAG "power"
extern const AppManifest manifest;
static void on_timer(TT_UNUSED std::shared_ptr<void> context);
static void onTimer(TT_UNUSED std::shared_ptr<void> context);
struct Data {
Timer update_timer = Timer(Timer::TypePeriodic, &on_timer, nullptr);
const hal::Power* power = getConfiguration()->hardware->power;
Timer update_timer = Timer(Timer::TypePeriodic, &onTimer, nullptr);
std::shared_ptr<tt::hal::Power> power = getConfiguration()->hardware->power();
lv_obj_t* enable_switch = nullptr;
lv_obj_t* battery_voltage = nullptr;
lv_obj_t* charge_state = nullptr;
lv_obj_t* charge_level = nullptr;
lv_obj_t* current = nullptr;
@@ -35,25 +36,71 @@ std::shared_ptr<Data> _Nullable optData() {
}
static void updateUi(std::shared_ptr<Data> data) {
bool charging_enabled = data->power->isChargingEnabled();
const char* charge_state = data->power->isCharging() ? "yes" : "no";
uint8_t charge_level = data->power->getChargeLevel();
uint16_t charge_level_scaled = (int16_t)charge_level * 100 / 255;
int32_t current = data->power->getCurrent();
const char* charge_state;
hal::Power::MetricData metric_data;
if (data->power->getMetric(hal::Power::MetricType::IS_CHARGING, metric_data)) {
charge_state = metric_data.valueAsBool ? "yes" : "no";
} else {
charge_state = "N/A";
}
uint8_t charge_level;
bool charge_level_scaled_set = false;
if (data->power->getMetric(hal::Power::MetricType::CHARGE_LEVEL, metric_data)) {
charge_level = metric_data.valueAsUint8;
charge_level_scaled_set = true;
}
bool charging_enabled_set = data->power->supportsChargeControl();
bool charging_enabled = data->power->supportsChargeControl() && data->power->isAllowedToCharge();
int32_t current;
bool current_set = false;
if (data->power->getMetric(hal::Power::MetricType::CURRENT, metric_data)) {
current = metric_data.valueAsInt32;
current_set = true;
}
uint32_t battery_voltage;
bool battery_voltage_set = false;
if (data->power->getMetric(hal::Power::MetricType::BATTERY_VOLTAGE, metric_data)) {
battery_voltage = metric_data.valueAsUint32;
battery_voltage_set = true;
}
lvgl::lock(kernel::millisToTicks(1000));
lv_obj_set_state(data->enable_switch, LV_STATE_CHECKED, charging_enabled);
if (charging_enabled_set) {
lv_obj_set_state(data->enable_switch, LV_STATE_CHECKED, charging_enabled);
lv_obj_remove_flag(data->enable_switch, LV_OBJ_FLAG_HIDDEN);
} else {
lv_obj_add_flag(data->enable_switch, LV_OBJ_FLAG_HIDDEN);
}
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
lv_label_set_text_fmt(data->current, "Current: %ld mAh", current);
#else
lv_label_set_text_fmt(data->current, "Current: %d mAh", current);
#endif
if (battery_voltage_set) {
lv_label_set_text_fmt(data->battery_voltage, "Battery voltage: %lu mV", battery_voltage);
} else {
lv_label_set_text_fmt(data->battery_voltage, "Battery voltage: N/A");
}
if (charge_level_scaled_set) {
lv_label_set_text_fmt(data->charge_level, "Charge level: %d%%", charge_level);
} else {
lv_label_set_text_fmt(data->charge_level, "Charge level: N/A");
}
if (current_set) {
lv_label_set_text_fmt(data->current, "Current: %ld mAh", current);
} else {
lv_label_set_text_fmt(data->current, "Current: N/A");
}
lvgl::unlock();
}
static void on_timer(TT_UNUSED std::shared_ptr<void> context) {
static void onTimer(TT_UNUSED std::shared_ptr<void> context) {
auto data = optData();
if (data != nullptr) {
updateUi(data);
@@ -68,8 +115,8 @@ static void onPowerEnabledChanged(lv_event_t* event) {
auto data = optData();
if (data != nullptr) {
if (data->power->isChargingEnabled() != is_on) {
data->power->setChargingEnabled(is_on);
if (data->power->isAllowedToCharge() != is_on) {
data->power->setAllowedToCharge(is_on);
updateUi(data);
}
}
@@ -107,6 +154,7 @@ static void onShow(AppContext& app, lv_obj_t* parent) {
data->enable_switch = enable_switch;
data->charge_state = lv_label_create(wrapper);
data->charge_level = lv_label_create(wrapper);
data->battery_voltage = lv_label_create(wrapper);
data->current = lv_label_create(wrapper);
updateUi(data);
@@ -119,7 +167,7 @@ static void onHide(TT_UNUSED AppContext& app) {
}
static void onStart(AppContext& app) {
auto data = std::shared_ptr<Data>();
auto data = std::make_shared<Data>();
app.setData(data);
assert(data->power != nullptr); // The Power app only shows up on supported devices
}