From 1ea44f9312082599fb56771705e2b1a384329e48 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 18 Jun 2026 23:19:31 -0600 Subject: [PATCH] dashboard: make battery detail a non-destructive overlay page --- .../esp32-s3-dashboard/dashboard_config.h | 2 +- .../esp32-s3-dashboard/esp32-s3-dashboard.ino | 69 +++++++++++++++---- 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/firmware/esp32-s3-dashboard/dashboard_config.h b/firmware/esp32-s3-dashboard/dashboard_config.h index 43357d0..3806e56 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.92-loop-page-switch"; +static const char *DASHBOARD_VERSION = "0.1.93-battery-detail-overlay"; // 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 a07f8d3..3be97bd 100644 --- a/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino +++ b/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino @@ -36,6 +36,7 @@ enum DashboardScreen { }; static DashboardScreen current_dashboard_screen = SCREEN_OVERVIEW; +static lv_obj_t *battery_detail_page = nullptr; static lv_obj_t *battery_detail_soc_label = nullptr; static lv_obj_t *battery_detail_status_label = nullptr; static lv_obj_t *battery_detail_voltage_label = nullptr; @@ -651,15 +652,54 @@ static void update_battery_detail_widgets() set_label_text_if_changed(battery_detail_delta_label, last_battery_detail_delta_text, delta); } +static void clear_battery_detail_refs() +{ + battery_detail_soc_label = nullptr; + battery_detail_status_label = nullptr; + battery_detail_voltage_label = nullptr; + battery_detail_current_label = nullptr; + battery_detail_power_label = nullptr; + battery_detail_remaining_label = nullptr; + battery_detail_capacity_label = nullptr; + battery_detail_temp_label = nullptr; + battery_detail_delta_label = nullptr; + battery_detail_estimate_label = nullptr; +} + +static void close_battery_detail_screen() +{ + if (battery_detail_page != nullptr) { + lv_obj_del(battery_detail_page); + battery_detail_page = nullptr; + } + + clear_battery_detail_refs(); + current_dashboard_screen = SCREEN_OVERVIEW; +} + static void create_battery_detail_screen() { + if (battery_detail_page != nullptr) { + lv_obj_move_foreground(battery_detail_page); + current_dashboard_screen = SCREEN_BATTERY_DETAIL; + return; + } + lv_obj_t *screen = lv_scr_act(); - lv_obj_clean(screen); + + battery_detail_page = lv_obj_create(screen); + lv_obj_set_size(battery_detail_page, lv_pct(100), lv_pct(100)); + lv_obj_align(battery_detail_page, LV_ALIGN_TOP_LEFT, 0, 0); + lv_obj_set_style_bg_color(battery_detail_page, lv_color_hex(0x101418), 0); + lv_obj_set_style_border_width(battery_detail_page, 0, 0); + lv_obj_set_style_pad_all(battery_detail_page, 0, 0); + lv_obj_clear_flag(battery_detail_page, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_event_cb(battery_detail_page, dashboard_root_event_cb, LV_EVENT_GESTURE, nullptr); + current_dashboard_screen = SCREEN_BATTERY_DETAIL; - lv_obj_set_style_bg_color(screen, lv_color_hex(0x101418), 0); - lv_obj_add_event_cb(screen, dashboard_root_event_cb, LV_EVENT_GESTURE, nullptr); + + lv_obj_t *system_card = create_card(battery_detail_page, "", 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 *title = lv_label_create(system_card); lv_label_set_text(title, "BATTERY DETAIL"); lv_obj_set_style_text_color(title, lv_color_hex(0xFFFFFF), 0); @@ -672,7 +712,7 @@ static void create_battery_detail_screen() lv_obj_set_style_text_font(hint, &lv_font_montserrat_26, 0); lv_obj_align(hint, LV_ALIGN_RIGHT_MID, -18, 0); - lv_obj_t *soc_card = create_card(screen, "", 300, 500, LV_ALIGN_TOP_LEFT, 32, 78); + lv_obj_t *soc_card = create_card(battery_detail_page, "", 300, 500, LV_ALIGN_TOP_LEFT, 32, 78); battery_detail_soc_label = lv_label_create(soc_card); lv_label_set_text(battery_detail_soc_label, "--%"); lv_obj_set_style_text_color(battery_detail_soc_label, lv_color_hex(0xFFFFFF), 0); @@ -681,15 +721,17 @@ static void create_battery_detail_screen() lv_obj_set_style_text_align(battery_detail_soc_label, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(battery_detail_soc_label, LV_ALIGN_CENTER, 0, -20); - battery_detail_value_label(screen, "Voltage", &battery_detail_voltage_label, 356, 78); - battery_detail_value_label(screen, "Current", &battery_detail_current_label, 670, 78); - battery_detail_value_label(screen, "Power", &battery_detail_power_label, 356, 220); - battery_detail_value_label(screen, "Remaining", &battery_detail_remaining_label, 670, 220); - battery_detail_value_label(screen, "Capacity", &battery_detail_capacity_label, 356, 362); - battery_detail_value_label(screen, "Battery Temp", &battery_detail_temp_label, 670, 362); - battery_detail_value_label(screen, "Cell Delta", &battery_detail_delta_label, 356, 504); + battery_detail_value_label(battery_detail_page, "Voltage", &battery_detail_voltage_label, 356, 78); + battery_detail_value_label(battery_detail_page, "Current", &battery_detail_current_label, 670, 78); + battery_detail_value_label(battery_detail_page, "Power", &battery_detail_power_label, 356, 220); + battery_detail_value_label(battery_detail_page, "Remaining", &battery_detail_remaining_label, 670, 220); + battery_detail_value_label(battery_detail_page, "Capacity", &battery_detail_capacity_label, 356, 362); + battery_detail_value_label(battery_detail_page, "Battery Temp", &battery_detail_temp_label, 670, 362); + battery_detail_value_label(battery_detail_page, "Cell Delta", &battery_detail_delta_label, 356, 504); update_battery_detail_widgets(); + + lv_obj_move_foreground(battery_detail_page); } static void show_dashboard_screen(DashboardScreen screen) @@ -1538,6 +1580,9 @@ static void show_boot_screen() static void create_overland_overview_screen() { + battery_detail_page = nullptr; + clear_battery_detail_refs(); + lv_obj_t *screen = lv_scr_act(); lv_obj_clean(screen); current_dashboard_screen = SCREEN_OVERVIEW;