diff --git a/firmware/esp32-s3-dashboard/dashboard_config.h b/firmware/esp32-s3-dashboard/dashboard_config.h index ce8e964..19efc38 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.85-battery-nav-overlay"; +static const char *DASHBOARD_VERSION = "0.1.86-battery-nav-screen-hitbox"; // 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 0982712..84be21b 100644 --- a/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino +++ b/firmware/esp32-s3-dashboard/esp32-s3-dashboard.ino @@ -557,19 +557,22 @@ static String signed_float_text(float value, int decimals, const char *suffix) static void battery_nav_doubletap_cb(lv_event_t *event) { - if (lv_event_get_code(event) != LV_EVENT_CLICKED) return; + if (lv_event_get_code(event) != LV_EVENT_PRESSED) return; - static uint32_t last_click_ms = 0; + static uint32_t last_press_ms = 0; + static DashboardScreen last_target = SCREEN_OVERVIEW; + + DashboardScreen target = (DashboardScreen)(intptr_t)lv_event_get_user_data(event); uint32_t now_ms = millis(); - if (now_ms - last_click_ms <= 450) { - last_click_ms = 0; - DashboardScreen target = (DashboardScreen)(intptr_t)lv_event_get_user_data(event); + if (target == last_target && now_ms - last_press_ms <= 700) { + last_press_ms = 0; show_dashboard_screen(target); return; } - last_click_ms = now_ms; + last_target = target; + last_press_ms = now_ms; } static void add_doubletap_nav_target(lv_obj_t *obj, DashboardScreen target) @@ -675,6 +678,21 @@ static lv_obj_t *create_battery_metric_tile(lv_obj_t *parent, const char *title, return tile; } + +static void add_screen_doubletap_hitbox(lv_obj_t *screen, int x, int y, int width, int height, DashboardScreen target) +{ + lv_obj_t *hitbox = lv_obj_create(screen); + lv_obj_set_size(hitbox, width, height); + lv_obj_align(hitbox, LV_ALIGN_TOP_LEFT, x, y); + lv_obj_set_style_bg_opa(hitbox, LV_OPA_TRANSP, 0); + lv_obj_set_style_border_opa(hitbox, LV_OPA_TRANSP, 0); + lv_obj_set_style_pad_all(hitbox, 0, 0); + lv_obj_clear_flag(hitbox, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(hitbox, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_event_cb(hitbox, battery_nav_doubletap_cb, LV_EVENT_PRESSED, (void *)target); + lv_obj_move_foreground(hitbox); +} + static void create_battery_detail_screen() { lv_obj_t *screen = lv_scr_act(); @@ -725,6 +743,8 @@ static void create_battery_detail_screen() make_detail_label(delta_card, &battery_detail_delta_label, "-- mV", &lv_font_montserrat_30, lv_color_hex(0xFFFFFF), 220, LV_ALIGN_RIGHT_MID, -20, 0, LV_TEXT_ALIGN_RIGHT); update_battery_detail_widgets(); + + add_screen_doubletap_hitbox(screen, 32, 78, 300, 500, SCREEN_OVERVIEW); } static void show_dashboard_screen(DashboardScreen screen)