dashboard: highlight battery card on alarms

This commit is contained in:
2026-06-11 01:00:54 -06:00
parent ff4a103436
commit 5776639dd9
2 changed files with 47 additions and 1 deletions
@@ -1,6 +1,6 @@
#pragma once #pragma once
static const char *DASHBOARD_VERSION = "0.1.41-temp-alerts"; static const char *DASHBOARD_VERSION = "0.1.42-battery-alarm-card";
// Update these if your Cargo ESP AP credentials are different. // Update these if your Cargo ESP AP credentials are different.
static const char *CARGO_WIFI_SSID = "OverlandController"; static const char *CARGO_WIFI_SSID = "OverlandController";
@@ -14,6 +14,7 @@ using namespace esp_panel::board;
static DashboardStatus status_model; static DashboardStatus status_model;
static lv_obj_t *battery_card_obj = nullptr;
static lv_obj_t *battery_soc_arc = nullptr; static lv_obj_t *battery_soc_arc = nullptr;
static lv_obj_t *battery_charge_pulse_arc = nullptr; static lv_obj_t *battery_charge_pulse_arc = nullptr;
static lv_obj_t *battery_current_label = nullptr; static lv_obj_t *battery_current_label = nullptr;
@@ -61,6 +62,7 @@ static bool pending_relay_previous_state = false;
static String last_battery_current_text; static String last_battery_current_text;
static String last_battery_estimate_text; static String last_battery_estimate_text;
static String last_battery_soc_text; static String last_battery_soc_text;
static bool last_battery_card_alert = false;
static String last_temp_tile_value_text[2]; static String last_temp_tile_value_text[2];
static String last_temp_tile_name_text[2]; static String last_temp_tile_name_text[2];
static String last_system_status_text; static String last_system_status_text;
@@ -627,6 +629,34 @@ static void update_temp_tile_alert_style(int index, bool alert)
lvgl_port_unlock(); lvgl_port_unlock();
} }
static void update_battery_card_alert_style(bool alert)
{
if (battery_card_obj == nullptr) {
return;
}
if (last_battery_card_alert == alert) {
return;
}
last_battery_card_alert = alert;
lvgl_port_lock(-1);
if (alert) {
lv_obj_set_style_bg_color(battery_card_obj, lv_color_hex(0x7A271A), 0);
lv_obj_set_style_border_color(battery_card_obj, lv_color_hex(0xF97066), 0);
lv_obj_set_style_border_width(battery_card_obj, 3, 0);
} else {
lv_obj_set_style_bg_color(battery_card_obj, lv_color_hex(0x1F2933), 0);
lv_obj_set_style_border_color(battery_card_obj, lv_color_hex(0x3A4652), 0);
lv_obj_set_style_border_width(battery_card_obj, 2, 0);
}
lvgl_port_unlock();
}
static void update_overview_widgets() static void update_overview_widgets()
{ {
String current_text = "Idle"; String current_text = "Idle";
@@ -680,6 +710,21 @@ static void parse_status_json(const String &body)
status_model.api_ok = true; status_model.api_ok = true;
bool battery_alarm_active = false;
if (doc["alarms"].is<JsonObject>()) {
JsonObject alarms = doc["alarms"];
battery_alarm_active =
(alarms["low_soc"] | false) ||
(alarms["critical_soc"] | false) ||
(alarms["low_voltage"] | false) ||
(alarms["high_battery_temp"] | false) ||
(alarms["cell_imbalance"] | false) ||
(alarms["bms_disconnected"] | false);
}
update_battery_card_alert_style(battery_alarm_active);
if (doc["battery"].is<JsonObject>()) { if (doc["battery"].is<JsonObject>()) {
JsonObject battery = doc["battery"]; JsonObject battery = doc["battery"];
status_model.bms_connected = battery["connected"] | status_model.bms_connected; status_model.bms_connected = battery["connected"] | status_model.bms_connected;
@@ -986,6 +1031,7 @@ static void create_overland_overview_screen()
lv_obj_t *system_card = create_card(screen, "", 960, 48, LV_ALIGN_TOP_MID, 0, 12); lv_obj_t *system_card = create_card(screen, "", 960, 48, LV_ALIGN_TOP_MID, 0, 12);
lv_obj_t *battery_card = create_card(screen, "", 380, 310, LV_ALIGN_TOP_LEFT, 32, 76); lv_obj_t *battery_card = create_card(screen, "", 380, 310, LV_ALIGN_TOP_LEFT, 32, 76);
battery_card_obj = battery_card;
lv_obj_t *temp_card = create_card(screen, "", 260, 310, LV_ALIGN_TOP_LEFT, 426, 76); lv_obj_t *temp_card = create_card(screen, "", 260, 310, LV_ALIGN_TOP_LEFT, 426, 76);
lv_obj_t *vehicle_card = create_card(screen, "", 274, 310, LV_ALIGN_TOP_RIGHT, -32, 76); lv_obj_t *vehicle_card = create_card(screen, "", 274, 310, LV_ALIGN_TOP_RIGHT, -32, 76);
lv_obj_t *relay_card = create_card(screen, "", 960, 205, LV_ALIGN_BOTTOM_MID, 0, -8); lv_obj_t *relay_card = create_card(screen, "", 960, 205, LV_ALIGN_BOTTOM_MID, 0, -8);