diff --git a/firmware/esp32-s3-dashboard/dashboard_config.h b/firmware/esp32-s3-dashboard/dashboard_config.h index 38cb594..12335cd 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.107-battery-back-gesture"; +static const char *DASHBOARD_VERSION = "0.1.108-battery-detail-layout"; // 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 727d6cf..9e84f7a 100644 --- a/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino +++ b/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino @@ -626,21 +626,21 @@ static String battery_detail_signed(float value, int decimals, const char *suffi static void battery_detail_value_label(lv_obj_t *parent, const char *title, lv_obj_t **value, int x, int y) { - lv_obj_t *card = create_card(parent, "", 285, 118, LV_ALIGN_TOP_LEFT, x, y); + lv_obj_t *card = create_card(parent, "", 292, 112, LV_ALIGN_TOP_LEFT, x, y); lv_obj_t *title_label = lv_label_create(card); lv_label_set_text(title_label, title); lv_obj_set_style_text_color(title_label, lv_color_hex(0xB8C0C8), 0); lv_obj_set_style_text_font(title_label, &lv_font_montserrat_26, 0); - lv_obj_align(title_label, LV_ALIGN_TOP_LEFT, 16, 12); + lv_obj_align(title_label, LV_ALIGN_TOP_LEFT, 16, 10); *value = lv_label_create(card); lv_label_set_text(*value, "--"); lv_obj_set_style_text_color(*value, lv_color_hex(0xFFFFFF), 0); lv_obj_set_style_text_font(*value, &lv_font_montserrat_30, 0); - lv_obj_set_width(*value, 250); + lv_obj_set_width(*value, 260); lv_obj_set_style_text_align(*value, LV_TEXT_ALIGN_LEFT, 0); - lv_obj_align(*value, LV_ALIGN_TOP_LEFT, 16, 58); + lv_obj_align(*value, LV_ALIGN_TOP_LEFT, 16, 54); } static void update_battery_detail_widgets() @@ -715,36 +715,77 @@ static void create_battery_detail_screen() current_dashboard_screen = SCREEN_BATTERY_DETAIL; + // Match the main dashboard status bar layout. lv_obj_t *system_card = create_card(battery_detail_page, "", 960, 48, LV_ALIGN_TOP_MID, 0, 12); + lv_obj_add_flag(system_card, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_event_cb(system_card, system_card_event_cb, LV_EVENT_CLICKED, nullptr); - 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); - lv_obj_set_style_text_font(title, &lv_font_montserrat_26, 0); - lv_obj_align(title, LV_ALIGN_LEFT_MID, 22, 0); + lv_obj_t *detail_status_dot = lv_obj_create(system_card); + lv_obj_set_size(detail_status_dot, 18, 18); + lv_obj_set_style_radius(detail_status_dot, LV_RADIUS_CIRCLE, 0); + lv_obj_set_style_bg_color(detail_status_dot, last_cargo_api_ok ? lv_color_hex(0x32D583) : lv_color_hex(0xF97066), 0); + lv_obj_set_style_border_width(detail_status_dot, 0, 0); + lv_obj_align(detail_status_dot, LV_ALIGN_LEFT_MID, 24, 0); - lv_obj_t *hint = lv_label_create(system_card); - lv_label_set_text(hint, "Swipe right to go back"); - lv_obj_set_style_text_color(hint, lv_color_hex(0xB8C0C8), 0); - 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 *outside_label = lv_label_create(system_card); + lv_label_set_text(outside_label, last_outside_status_temp_text.length() ? last_outside_status_temp_text.c_str() : "OUT --"); + lv_obj_set_style_text_color(outside_label, lv_color_hex(0xDDE3EA), 0); + lv_obj_set_style_text_font(outside_label, &lv_font_montserrat_30, 0); + lv_obj_set_width(outside_label, 220); + lv_obj_set_style_text_align(outside_label, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_align(outside_label, LV_ALIGN_CENTER, 0, 0); + + lv_obj_t *page_label = lv_label_create(system_card); + lv_label_set_text(page_label, "BATTERY"); + lv_obj_set_style_text_color(page_label, lv_color_hex(0xB8C0C8), 0); + lv_obj_set_style_text_font(page_label, &lv_font_montserrat_26, 0); + lv_obj_set_width(page_label, 160); + lv_obj_set_style_text_align(page_label, LV_TEXT_ALIGN_RIGHT, 0); + lv_obj_align(page_label, LV_ALIGN_RIGHT_MID, -10, 0); + + // Left summary card. + lv_obj_t *soc_card = create_card(battery_detail_page, "", 300, 500, LV_ALIGN_TOP_LEFT, 32, 68); + + battery_detail_status_label = lv_label_create(soc_card); + lv_label_set_text(battery_detail_status_label, "BMS --"); + lv_obj_set_style_text_color(battery_detail_status_label, lv_color_hex(0xB8C0C8), 0); + lv_obj_set_style_text_font(battery_detail_status_label, &lv_font_montserrat_26, 0); + lv_obj_set_width(battery_detail_status_label, 260); + lv_obj_set_style_text_align(battery_detail_status_label, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_align(battery_detail_status_label, LV_ALIGN_TOP_MID, 0, 34); - 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); lv_obj_set_style_text_font(battery_detail_soc_label, &lv_font_montserrat_48, 0); lv_obj_set_width(battery_detail_soc_label, 260); 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); + lv_obj_align(battery_detail_soc_label, LV_ALIGN_TOP_MID, 0, 150); - 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); + battery_detail_estimate_label = lv_label_create(soc_card); + lv_label_set_text(battery_detail_estimate_label, "--"); + lv_obj_set_style_text_color(battery_detail_estimate_label, lv_color_hex(0xDDE3EA), 0); + lv_obj_set_style_text_font(battery_detail_estimate_label, &lv_font_montserrat_30, 0); + lv_obj_set_width(battery_detail_estimate_label, 260); + lv_obj_set_style_text_align(battery_detail_estimate_label, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_align(battery_detail_estimate_label, LV_ALIGN_TOP_MID, 0, 258); + + lv_obj_t *back_hint = lv_label_create(soc_card); + lv_label_set_text(back_hint, "Swipe right to go back"); + lv_obj_set_style_text_color(back_hint, lv_color_hex(0x7D8996), 0); + lv_obj_set_style_text_font(back_hint, &lv_font_montserrat_26, 0); + lv_obj_set_width(back_hint, 260); + lv_obj_set_style_text_align(back_hint, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_align(back_hint, LV_ALIGN_BOTTOM_MID, 0, -28); + + // Right-side compact metrics. Fits fully within 1024x600. + battery_detail_value_label(battery_detail_page, "Voltage", &battery_detail_voltage_label, 356, 68); + battery_detail_value_label(battery_detail_page, "Current", &battery_detail_current_label, 670, 68); + battery_detail_value_label(battery_detail_page, "Power", &battery_detail_power_label, 356, 192); + battery_detail_value_label(battery_detail_page, "Remaining", &battery_detail_remaining_label, 670, 192); + battery_detail_value_label(battery_detail_page, "Capacity", &battery_detail_capacity_label, 356, 316); + battery_detail_value_label(battery_detail_page, "Battery Temp", &battery_detail_temp_label, 670, 316); + battery_detail_value_label(battery_detail_page, "Cell Delta", &battery_detail_delta_label, 356, 440); reset_battery_detail_widget_cache(); update_battery_detail_widgets();