Merge branch 'master' into rl-sla

# Conflicts:
#	selfdrive/ui/sunnypilot/onroad/hud_renderer.py
This commit is contained in:
Jason Wen
2026-01-24 02:05:19 -05:00
2 changed files with 60 additions and 0 deletions
@@ -9,6 +9,7 @@ import pyray as rl
from openpilot.selfdrive.ui.ui_state import ui_state
from openpilot.selfdrive.ui.onroad.hud_renderer import HudRenderer
from openpilot.selfdrive.ui.sunnypilot.onroad.developer_ui import DeveloperUiRenderer
from openpilot.selfdrive.ui.sunnypilot.onroad.road_name import RoadNameRenderer
from openpilot.selfdrive.ui.sunnypilot.onroad.rocket_fuel import RocketFuel
from openpilot.selfdrive.ui.sunnypilot.onroad.speed_limit_ui import SpeedLimitRenderer
from openpilot.selfdrive.ui.sunnypilot.onroad.turn_signal import TurnSignalController
@@ -18,18 +19,21 @@ class HudRendererSP(HudRenderer):
def __init__(self):
super().__init__()
self.developer_ui = DeveloperUiRenderer()
self.road_name_renderer = RoadNameRenderer()
self.rocket_fuel = RocketFuel()
self.speed_limit_renderer = SpeedLimitRenderer()
self.turn_signal_controller = TurnSignalController()
def _update_state(self) -> None:
super()._update_state()
self.road_name_renderer.update()
self.speed_limit_renderer.update()
self.turn_signal_controller.update()
def _render(self, rect: rl.Rectangle) -> None:
super()._render(rect)
self.developer_ui.render(rect)
self.road_name_renderer.render(rect)
self.speed_limit_renderer.render(rect)
self.turn_signal_controller.render()
@@ -0,0 +1,56 @@
"""
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
This file is part of sunnypilot and is licensed under the MIT License.
See the LICENSE.md file in the root directory for more details.
"""
import pyray as rl
from openpilot.selfdrive.ui.ui_state import ui_state
from openpilot.system.ui.lib.application import gui_app, FontWeight
from openpilot.system.ui.lib.text_measure import measure_text_cached
from openpilot.system.ui.widgets import Widget
class RoadNameRenderer(Widget):
def __init__(self):
super().__init__()
self.road_name = ""
self.is_metric = False
self.font_demi = gui_app.font(FontWeight.SEMI_BOLD)
def update(self):
sm = ui_state.sm
if sm.recv_frame["carState"] < ui_state.started_frame:
return
self.is_metric = ui_state.is_metric
if sm.updated["liveMapDataSP"]:
lmd = sm["liveMapDataSP"]
self.road_name = lmd.roadName
def _render(self, rect: rl.Rectangle):
if not self.road_name:
return
text = self.road_name
text_size = measure_text_cached(self.font_demi, text, 46)
padding = 40
rect_width = max(200, min(text_size.x + padding, rect.width - 40))
road_rect = rl.Rectangle(rect.x + rect.width / 2 - rect_width / 2, rect.y - 4, rect_width, 60)
rl.draw_rectangle_rounded(road_rect, 0.2, 10, rl.Color(0, 0, 0, 120))
max_text_width = road_rect.width - 20
if text_size.x > max_text_width:
while text_size.x > max_text_width and len(text) > 3:
text = text[:-1]
text_size = measure_text_cached(self.font_demi, text + "...", 46)
text = text + "..."
sz = measure_text_cached(self.font_demi, text, 46)
origin = rl.Vector2(road_rect.x + road_rect.width / 2 - sz.x / 2, road_rect.y + road_rect.height / 2 - sz.y / 2)
rl.draw_text_ex(self.font_demi, text, origin, 46, 0, rl.Color(255, 255, 255, 200))