From 5776639dd9784b5fead1c9e884d01c4d25550c2d Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 11 Jun 2026 01:00:54 -0600 Subject: [PATCH] dashboard: highlight battery card on alarms --- .../esp32-s3-dashboard/dashboard_config.h | 2 +- .../esp32-s3-dashboard/esp32-s3-dashboard.ino | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/firmware/esp32-s3-dashboard/dashboard_config.h b/firmware/esp32-s3-dashboard/dashboard_config.h index f84270e..8eb922e 100644 --- a/firmware/esp32-s3-dashboard/dashboard_config.h +++ b/firmware/esp32-s3-dashboard/dashboard_config.h @@ -1,6 +1,6 @@ #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. static const char *CARGO_WIFI_SSID = "OverlandController"; diff --git a/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino b/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino index f5ea4ab..6d1a272 100644 --- a/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino +++ b/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino @@ -14,6 +14,7 @@ using namespace esp_panel::board; 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_charge_pulse_arc = 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_estimate_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_name_text[2]; static String last_system_status_text; @@ -627,6 +629,34 @@ static void update_temp_tile_alert_style(int index, bool alert) 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() { String current_text = "Idle"; @@ -680,6 +710,21 @@ static void parse_status_json(const String &body) status_model.api_ok = true; + bool battery_alarm_active = false; + + if (doc["alarms"].is()) { + 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 battery = doc["battery"]; 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 *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 *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);