From 3f4f2a1813705ccd35539a304e32cd690405b8c6 Mon Sep 17 00:00:00 2001 From: firestarsdog <229254897+firestarsdog@users.noreply.github.com> Date: Thu, 21 May 2026 13:47:56 -0400 Subject: [PATCH] BigUI WIP: Onroad Cleaner-er --- .../ui/layouts/settings/starpilot/panel.py | 27 ++++++++++++++----- selfdrive/ui/onroad/augmented_road_view.py | 5 ++-- selfdrive/ui/onroad/model_renderer.py | 5 ++-- selfdrive/ui/onroad/starpilot/cem_status.py | 3 ++- selfdrive/ui/onroad/starpilot/compass.py | 3 ++- .../ui/onroad/starpilot/csc_force_stop.py | 5 ++-- selfdrive/ui/onroad/starpilot/path.py | 6 +++-- .../onroad/starpilot/starpilot_onroad_view.py | 11 ++++---- .../ui/onroad/starpilot/stopping_point.py | 5 ++-- 9 files changed, 47 insertions(+), 23 deletions(-) diff --git a/selfdrive/ui/layouts/settings/starpilot/panel.py b/selfdrive/ui/layouts/settings/starpilot/panel.py index 0bde586af..24ab88d03 100644 --- a/selfdrive/ui/layouts/settings/starpilot/panel.py +++ b/selfdrive/ui/layouts/settings/starpilot/panel.py @@ -5,7 +5,7 @@ from enum import IntEnum import pyray as rl -from openpilot.common.params import Params +from openpilot.common.params import Params, UnknownKeyName from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.widgets import DialogResult, Widget @@ -45,27 +45,42 @@ class StarPilotParamsProxy: self._params_memory.put_bool("StarPilotTogglesUpdated", True) def put(self, key, value): - result = self._params.put(key, value) + try: + result = self._params.put(key, value) + except UnknownKeyName: + return None self._mark_updated() return result def put_bool(self, key, value): - result = self._params.put_bool(key, value) + try: + result = self._params.put_bool(key, value) + except UnknownKeyName: + return None self._mark_updated() return result def put_int(self, key, value): - result = self._params.put_int(key, value) + try: + result = self._params.put_int(key, value) + except UnknownKeyName: + return None self._mark_updated() return result def put_float(self, key, value): - result = self._params.put_float(key, value) + try: + result = self._params.put_float(key, value) + except UnknownKeyName: + return None self._mark_updated() return result def remove(self, key): - result = self._params.remove(key) + try: + result = self._params.remove(key) + except UnknownKeyName: + return None self._mark_updated() return result diff --git a/selfdrive/ui/onroad/augmented_road_view.py b/selfdrive/ui/onroad/augmented_road_view.py index 013304fe3..6c17f1c9c 100644 --- a/selfdrive/ui/onroad/augmented_road_view.py +++ b/selfdrive/ui/onroad/augmented_road_view.py @@ -15,6 +15,7 @@ from openpilot.selfdrive.ui.onroad.cameraview import CameraView from openpilot.selfdrive.ui.lib.starpilot_mode_banner import ModeTransitionBanner from openpilot.selfdrive.ui.lib.starpilot_status import get_screen_edge_color from openpilot.system.ui.lib.application import gui_app, FontWeight +from openpilot.system.ui.lib.text_measure import measure_text_cached from openpilot.common.transformations.camera import DEVICE_CAMERAS, DeviceCameraConfig, view_frame_from_device_frame from openpilot.common.transformations.orientation import rot_from_euler @@ -121,10 +122,10 @@ class MinSteerSpeedBanner: text = self._get_message(min_steer_speed) font_size = 52 max_text_width = rect.width - 100 - text_size = rl.measure_text_ex(self._font, text, font_size, 0) + text_size = measure_text_cached(self._font, text, font_size) while font_size > 36 and text_size.x > max_text_width: font_size -= 2 - text_size = rl.measure_text_ex(self._font, text, font_size, 0) + text_size = measure_text_cached(self._font, text, font_size) text_pos = rl.Vector2( rect.x + (rect.width - text_size.x) / 2, diff --git a/selfdrive/ui/onroad/model_renderer.py b/selfdrive/ui/onroad/model_renderer.py index 77db62a25..301af89ae 100644 --- a/selfdrive/ui/onroad/model_renderer.py +++ b/selfdrive/ui/onroad/model_renderer.py @@ -12,6 +12,7 @@ from openpilot.selfdrive.ui.lib.starpilot_visuals import lead_indicator_enabled from openpilot.selfdrive.ui.ui_state import ui_state, UIStatus from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.lib.shader_polygon import draw_polygon, Gradient +from openpilot.system.ui.lib.text_measure import measure_text_cached from openpilot.system.ui.widgets import Widget CLIP_MARGIN = 500 @@ -562,7 +563,7 @@ class ModelRenderer(Widget): max_text_width = 0.0 for line in text_lines: - sz = rl.measure_text_ex(font, line, font_size, 0) + sz = measure_text_cached(font, line, font_size) if sz.x > max_text_width: max_text_width = sz.x @@ -593,7 +594,7 @@ class ModelRenderer(Widget): self._lead_text_rects.append(text_rect) for i, line in enumerate(text_lines): - sz = rl.measure_text_ex(font, line, font_size, 0) + sz = measure_text_cached(font, line, font_size) line_x = centerX - sz.x / 2 line_y = startY + (i * line_height) _draw_text_with_outline(line, line_x, line_y, font, font_size) diff --git a/selfdrive/ui/onroad/starpilot/cem_status.py b/selfdrive/ui/onroad/starpilot/cem_status.py index 72d2b12c2..08734215a 100644 --- a/selfdrive/ui/onroad/starpilot/cem_status.py +++ b/selfdrive/ui/onroad/starpilot/cem_status.py @@ -1,6 +1,7 @@ import pyray as rl from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.selfdrive.ui.lib.starpilot_status import CEM_OVERRIDE_COLOR, EXPERIMENTAL_COLOR +from openpilot.system.ui.lib.text_measure import measure_text_cached def render_cem_status(rect: rl.Rectangle, font): if not ui_state.params.get_bool("ShowCEMStatus"): @@ -41,7 +42,7 @@ def render_cem_status(rect: rl.Rectangle, font): # Draw text label centered inside the badge font_size = 20 - text_sz = rl.measure_text_ex(font, label, font_size, 0) + text_sz = measure_text_cached(font, label, font_size) pos_x = rect.x + (rect.width - text_sz.x) / 2 pos_y = rect.y + (rect.height - text_sz.y) / 2 rl.draw_text_ex(font, label, rl.Vector2(int(pos_x), int(pos_y)), font_size, 0, rl.WHITE) diff --git a/selfdrive/ui/onroad/starpilot/compass.py b/selfdrive/ui/onroad/starpilot/compass.py index 73c42c129..646917663 100644 --- a/selfdrive/ui/onroad/starpilot/compass.py +++ b/selfdrive/ui/onroad/starpilot/compass.py @@ -1,5 +1,6 @@ import pyray as rl from openpilot.selfdrive.ui.ui_state import ui_state +from openpilot.system.ui.lib.text_measure import measure_text_cached def render_compass(rect: rl.Rectangle, font): if not ui_state.params.get_bool("Compass"): @@ -47,7 +48,7 @@ def render_compass(rect: rl.Rectangle, font): notch_width = 3 lbl = labels.get(norm_deg, "") if lbl: - lbl_sz = rl.measure_text_ex(font, lbl, 22, 0) + lbl_sz = measure_text_cached(font, lbl, 22) rl.draw_text_ex(font, lbl, rl.Vector2(int(x - lbl_sz.x / 2), int(rect.y + 12)), 22, 0, rl.WHITE) elif norm_deg % 15 == 0: notch_height = 15 diff --git a/selfdrive/ui/onroad/starpilot/csc_force_stop.py b/selfdrive/ui/onroad/starpilot/csc_force_stop.py index 3cfb1c2f2..c5845200a 100644 --- a/selfdrive/ui/onroad/starpilot/csc_force_stop.py +++ b/selfdrive/ui/onroad/starpilot/csc_force_stop.py @@ -2,6 +2,7 @@ import pyray as rl import math from openpilot.common.constants import CV from openpilot.selfdrive.ui.ui_state import ui_state +from openpilot.system.ui.lib.text_measure import measure_text_cached def render_csc_force_stop(content_rect: rl.Rectangle, font_bold): plan = ui_state.sm["starpilotPlan"] if ui_state.sm.valid.get("starpilotPlan", False) else None @@ -65,7 +66,7 @@ def render_csc_force_stop(content_rect: rl.Rectangle, font_bold): dist_val = int(round(forcing_stop_length * distance_conversion)) text = f"{dist_val} {dist_unit}" - text_sz = rl.measure_text_ex(font_bold, text, 40, 0) + text_sz = measure_text_cached(font_bold, text, 40) rl.draw_text_ex(font_bold, text, rl.Vector2(int(csc_x + 20), int(badge_rect.y + (100 - text_sz.y) / 2)), 40, 0, rl.WHITE) else: @@ -121,5 +122,5 @@ def render_csc_force_stop(content_rect: rl.Rectangle, font_bold): csc_speed_val = int(round(min(v_ego, csc_speed) * speed_conversion)) text = f"{csc_speed_val} {speed_unit}" - text_sz = rl.measure_text_ex(font_bold, text, 40, 0) + text_sz = measure_text_cached(font_bold, text, 40) rl.draw_text_ex(font_bold, text, rl.Vector2(int(csc_x + 20), int(badge_rect.y + (100 - text_sz.y) / 2)), 40, 0, rl.WHITE) diff --git a/selfdrive/ui/onroad/starpilot/path.py b/selfdrive/ui/onroad/starpilot/path.py index 561418afe..6c488c512 100644 --- a/selfdrive/ui/onroad/starpilot/path.py +++ b/selfdrive/ui/onroad/starpilot/path.py @@ -10,6 +10,7 @@ from openpilot.selfdrive.ui.lib.starpilot_theme import get_param_color, get_them from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.system.ui.lib.application import gui_app, FontWeight from openpilot.system.ui.lib.shader_polygon import draw_polygon, Gradient +from openpilot.system.ui.lib.text_measure import measure_text_cached _METRICS_FONT_SIZE = 45 _STOCK_LINE_GREEN = rl.Color(0, 255, 0, 241) @@ -88,8 +89,9 @@ def render_adjacent_paths(renderer) -> None: right = verts[mid_index + (len(verts) - mid_index) // 2] text = f"{lane_width * distance_conversion:.2f}{unit}" - text_width = rl.measure_text_ex(font, text, _METRICS_FONT_SIZE, 0).x - text_height = rl.measure_text_ex(font, text, _METRICS_FONT_SIZE, 0).y + text_sz = measure_text_cached(font, text, _METRICS_FONT_SIZE) + text_width = text_sz.x + text_height = text_sz.y text_x = (left[0] + right[0]) / 2.0 - text_width / 2.0 text_y = (left[1] + right[1]) / 2.0 - text_height / 2.0 + text_height * 0.75 diff --git a/selfdrive/ui/onroad/starpilot/starpilot_onroad_view.py b/selfdrive/ui/onroad/starpilot/starpilot_onroad_view.py index 3a65cef1a..152ef9120 100644 --- a/selfdrive/ui/onroad/starpilot/starpilot_onroad_view.py +++ b/selfdrive/ui/onroad/starpilot/starpilot_onroad_view.py @@ -13,6 +13,7 @@ from openpilot.selfdrive.ui.onroad.starpilot.slc_speed_limit import ( from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.selfdrive.ui.lib.starpilot_status import get_screen_edge_color from openpilot.system.ui.lib.application import MousePos, gui_app, FontWeight +from openpilot.system.ui.lib.text_measure import measure_text_cached class StarPilotOnroadView(AugmentedRoadView): @@ -117,7 +118,7 @@ class StarPilotOnroadView(AugmentedRoadView): if not road_name: return - text_size = rl.measure_text_ex(self._font_bold, road_name, 52, 0) + text_size = measure_text_cached(self._font_bold, road_name, 52) pad_x, pad_y = 28, 18 box_w = int(text_size.x + pad_x * 2) box_h = int(text_size.y + pad_y * 2) @@ -162,8 +163,8 @@ class StarPilotOnroadView(AugmentedRoadView): seconds = duration % 60 minute_text = f"{minutes} minute{'s' if minutes != 1 else ''}" second_text = f"{seconds} second{'s' if seconds != 1 else ''}" - minute_size = rl.measure_text_ex(self._font_bold, minute_text, 176, 0) - second_size = rl.measure_text_ex(self._font_medium, second_text, 66, 0) + minute_size = measure_text_cached(self._font_bold, minute_text, 176) + second_size = measure_text_cached(self._font_medium, second_text, 66) from openpilot.selfdrive.ui.lib.starpilot_status import ENGAGED_COLOR, EXPERIMENTAL_COLOR, TRAFFIC_COLOR import numpy as np @@ -298,12 +299,12 @@ class StarPilotOnroadView(AugmentedRoadView): x = self._content_rect.x + self._content_rect.width - 30 y = self._content_rect.y + 40 for i, line in enumerate(text_lines): - sz = rl.measure_text_ex(font, line, font_size, 0) + sz = measure_text_cached(font, line, font_size) draw_text_with_outline(line, x - sz.x, y + i * line_height, rl.WHITE) # 2. Render bottom-center detailed FPS tracker string (min/max/avg) fps_str = f"FPS: {round(fps)} | Min: {round(self._min_fps)} | Max: {round(self._max_fps)} | Avg: {round(self._avg_fps)}" - sz = rl.measure_text_ex(font, fps_str, font_size, 0) + sz = measure_text_cached(font, fps_str, font_size) bx = self._content_rect.x + (self._content_rect.width - sz.x) / 2 by = self._content_rect.y + self._content_rect.height - sz.y - 10 draw_text_with_outline(fps_str, bx, by, rl.WHITE) diff --git a/selfdrive/ui/onroad/starpilot/stopping_point.py b/selfdrive/ui/onroad/starpilot/stopping_point.py index 94f7245c0..89cacbf34 100644 --- a/selfdrive/ui/onroad/starpilot/stopping_point.py +++ b/selfdrive/ui/onroad/starpilot/stopping_point.py @@ -1,5 +1,6 @@ import pyray as rl from openpilot.selfdrive.ui.ui_state import ui_state +from openpilot.system.ui.lib.text_measure import measure_text_cached def render_stopping_point(renderer, font): params = ui_state.params @@ -36,7 +37,7 @@ def render_stopping_point(renderer, font): # Draw "STOP" text centered in octagon font_size = 18 - lbl_sz = rl.measure_text_ex(font, "STOP", font_size, 0) + lbl_sz = measure_text_cached(font, "STOP", font_size) rl.draw_text_ex( font, "STOP", rl.Vector2(int(cx - lbl_sz.x / 2), int(cy - radius - lbl_sz.y / 2)), @@ -51,7 +52,7 @@ def render_stopping_point(renderer, font): else: dist_text = f"{int(round(stopping_distance * 3.28084))} ft" - text_sz = rl.measure_text_ex(font, dist_text, 24, 0) + text_sz = measure_text_cached(font, dist_text, 24) tx = cx - text_sz.x / 2 ty = cy - radius * 2 - text_sz.y - 5