IQ.Pilot Release Commit @ 2f37564
This commit is contained in:
@@ -8,7 +8,7 @@ import pyray as rl
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.selfdrive.ui import UI_BORDER_SIZE
|
||||
from openpilot.selfdrive.ui.onroad.driver_state import DriverStateRenderer, BTN_SIZE, ARC_LENGTH
|
||||
from openpilot.iqpilot.ui.onroad.hud_overlays import DeveloperUiRenderer
|
||||
from openpilot.iqpilot.ui.onroad.hud_overlays import IQDevMetricsOverlay
|
||||
from openpilot.system.ui.lib.application import gui_app, FontWeight
|
||||
from openpilot.system.ui.lib.text_measure import measure_text_cached
|
||||
|
||||
@@ -50,7 +50,7 @@ class DriverStateRendererIQ(DriverStateRenderer):
|
||||
self._toast_color: rl.Color = rl.WHITE
|
||||
self._font = gui_app.font(FontWeight.SEMI_BOLD)
|
||||
|
||||
self.dev_ui_offset = DeveloperUiRenderer.get_bottom_dev_ui_offset()
|
||||
self.dev_ui_offset = IQDevMetricsOverlay.get_bottom_dev_ui_offset()
|
||||
self._dm_background = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_background.png", BTN_SIZE, BTN_SIZE)
|
||||
self._dm_person = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_person.png", 118, 118)
|
||||
self._dm_cone = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_cone.png", 118, 118)
|
||||
|
||||
@@ -22,7 +22,7 @@ from openpilot.selfdrive.ui.mici.onroad.alert_renderer import IconSide, TURN_SIG
|
||||
from openpilot.system.ui.lib.application import gui_app, FontWeight
|
||||
from openpilot.system.ui.lib.multilang import tr
|
||||
from openpilot.system.ui.widgets import Widget
|
||||
from openpilot.system.ui.iqpilot.lib import canvas
|
||||
from openpilot.system.ui.iqwidgets.lib import canvas
|
||||
from iqdbc.car.volkswagen.values import VolkswagenFlags
|
||||
|
||||
|
||||
@@ -40,13 +40,29 @@ def _speed_scale() -> float:
|
||||
# Accel strip
|
||||
# ============================================================================
|
||||
_STRIP_WIDTH = 28
|
||||
_STRIP_INSET = 14
|
||||
_STRIP_CEILING = 0.85
|
||||
_STRIP_EMA = 5.0
|
||||
_STRIP_GO = canvas.shade(0, 245, 0, 200)
|
||||
_STRIP_STOP = canvas.shade(245, 0, 0, 200)
|
||||
_STRIP_ARC_SEGMENTS = 24
|
||||
_STRIP_ACCEL = (33, 112, 115)
|
||||
_STRIP_ACCEL_NEON = (94, 232, 236)
|
||||
_STRIP_DECEL = (255, 0, 247)
|
||||
_STRIP_DECEL_NEON = (255, 145, 251)
|
||||
_STRIP_TIP_ALPHA = 235
|
||||
_STRIP_ROOT_ALPHA = 55
|
||||
_STRIP_CORE_DEPTH = 7.0
|
||||
_STRIP_CORE_LAYERS = 8
|
||||
_STRIP_CORE_ALPHA = 0.15
|
||||
_STRIP_CORE_FLOOR = 0.3
|
||||
_STRIP_CORE_TAIL = 22.0
|
||||
_STRIP_HALO_SPREAD = 11.0
|
||||
_STRIP_HALO_LAYERS = 11
|
||||
_STRIP_HALO_ALPHA = 0.095
|
||||
_STRIP_HALO_TAIL = 34.0
|
||||
_STRIP_NEON_FULL = 2.0 # m/s^2 at which the edges reach full brightness
|
||||
|
||||
|
||||
class RocketFuel:
|
||||
class IQAccelBar:
|
||||
def __init__(self):
|
||||
self._eased = 0.0
|
||||
|
||||
@@ -54,6 +70,52 @@ class RocketFuel:
|
||||
mag = abs(self._eased)
|
||||
return 0.0 if mag == 0.0 else max(0.0, _STRIP_CEILING - 0.1 / mag)
|
||||
|
||||
@staticmethod
|
||||
def _tint(fill, frac: float):
|
||||
return canvas.shade(*fill, int(_STRIP_TIP_ALPHA + (_STRIP_ROOT_ALPHA - _STRIP_TIP_ALPHA) * frac))
|
||||
|
||||
@staticmethod
|
||||
def _halo(center, cap: float, up: bool, neon, heat: float, tail: float) -> None:
|
||||
step = int(255 * _STRIP_HALO_ALPHA * heat)
|
||||
if step < 1:
|
||||
return
|
||||
start, end = (180.0, 360.0) if up else (0.0, 180.0)
|
||||
tint = canvas.shade(*neon, step)
|
||||
faded = canvas.shade(*neon, 0)
|
||||
top, bottom = (tint, faded) if up else (faded, tint)
|
||||
for i in range(_STRIP_HALO_LAYERS):
|
||||
spread = _STRIP_HALO_SPREAD * (1.0 - i / _STRIP_HALO_LAYERS)
|
||||
if spread <= 0.0:
|
||||
continue
|
||||
canvas.annulus(center, cap, cap + spread, start, end, _STRIP_ARC_SEGMENTS, tint)
|
||||
if tail <= 0.0:
|
||||
continue
|
||||
run = min(tail, _STRIP_HALO_TAIL)
|
||||
y = center.y if up else center.y - run
|
||||
canvas.v_sweep(center.x - cap - spread, y, spread, run, top, bottom)
|
||||
canvas.v_sweep(center.x + cap, y, spread, run, top, bottom)
|
||||
|
||||
@staticmethod
|
||||
def _cap(center, cap: float, up: bool, fill, neon, heat: float, tail: float) -> None:
|
||||
start, end = (180.0, 360.0) if up else (0.0, 180.0)
|
||||
canvas.annulus(center, 0.0, cap, start, end, _STRIP_ARC_SEGMENTS, fill)
|
||||
IQAccelBar._halo(center, cap, up, neon, heat, tail)
|
||||
lit = _STRIP_CORE_FLOOR + (1.0 - _STRIP_CORE_FLOOR) * heat
|
||||
core = canvas.shade(*neon, max(1, int(255 * _STRIP_CORE_ALPHA * lit)))
|
||||
faded = canvas.shade(*neon, 0)
|
||||
top, bottom = (core, faded) if up else (faded, core)
|
||||
run = min(tail, _STRIP_CORE_TAIL)
|
||||
for i in range(_STRIP_CORE_LAYERS):
|
||||
depth = _STRIP_CORE_DEPTH * (1.0 - i / _STRIP_CORE_LAYERS)
|
||||
if depth <= 0.0:
|
||||
continue
|
||||
canvas.annulus(center, max(0.0, cap - depth), cap, start, end, _STRIP_ARC_SEGMENTS, core)
|
||||
if run <= 0.0:
|
||||
continue
|
||||
y = center.y if up else center.y - run
|
||||
canvas.v_sweep(center.x - cap, y, depth, run, top, bottom)
|
||||
canvas.v_sweep(center.x + cap - depth, y, depth, run, top, bottom)
|
||||
|
||||
def render(self, rect, sm) -> None:
|
||||
if not ui_state.rocket_fuel:
|
||||
return
|
||||
@@ -61,9 +123,21 @@ class RocketFuel:
|
||||
reach = self._reach() * rect.height / 2.0
|
||||
if reach <= 0.0:
|
||||
return
|
||||
accelerating = self._eased > 0.0
|
||||
mid = rect.y + rect.height / 2.0
|
||||
top, tint = (mid - reach, _STRIP_GO) if self._eased > 0.0 else (mid, _STRIP_STOP)
|
||||
canvas.slab(rect.x, top, _STRIP_WIDTH, reach, tint)
|
||||
top = mid - reach if accelerating else mid
|
||||
x = rect.x + _STRIP_INSET
|
||||
cap = min(_STRIP_WIDTH / 2.0, reach / 2.0)
|
||||
fill, neon = (_STRIP_ACCEL, _STRIP_ACCEL_NEON) if accelerating else (_STRIP_DECEL, _STRIP_DECEL_NEON)
|
||||
near = cap / reach
|
||||
frac_top, frac_bottom = (near, 1.0 - near) if accelerating else (1.0 - near, near)
|
||||
heat = min(abs(self._eased) / _STRIP_NEON_FULL, 1.0)
|
||||
|
||||
canvas.v_sweep(x, top + cap, cap * 2.0, reach - cap * 2.0,
|
||||
self._tint(fill, frac_top), self._tint(fill, frac_bottom))
|
||||
tail = max(0.0, reach / 2.0 - cap)
|
||||
self._cap(canvas.Pt(x + cap, top + cap), cap, True, self._tint(fill, frac_top), neon, heat, tail)
|
||||
self._cap(canvas.Pt(x + cap, top + reach - cap), cap, False, self._tint(fill, frac_bottom), neon, heat, tail)
|
||||
|
||||
|
||||
# ============================================================================
|
||||
@@ -92,7 +166,7 @@ class _BlindSide:
|
||||
canvas.stamp(tex, x, rect.y + _BS_DROP, canvas.shade(255, 255, 255, int(255 * self.glow.x)))
|
||||
|
||||
|
||||
class BlindSpotIndicators:
|
||||
class IQBlindSpotOverlay:
|
||||
def __init__(self):
|
||||
self._left = _BlindSide("left")
|
||||
self._right = _BlindSide("right")
|
||||
@@ -121,7 +195,7 @@ _MQB_CLUSTER_EXEMPT = (VolkswagenFlags.PQ | VolkswagenFlags.MLB | VolkswagenFlag
|
||||
VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO)
|
||||
|
||||
|
||||
class SpeedRenderer:
|
||||
class IQSpeedOverlay:
|
||||
def __init__(self):
|
||||
self.speed: float = 0.0
|
||||
self._cluster_ever_live: bool = False
|
||||
@@ -285,7 +359,7 @@ def _lamp_modes(event_name: str, cs, remembered):
|
||||
return left, right, None
|
||||
|
||||
|
||||
class TurnSignalController:
|
||||
class IQTurnSignalOverlay:
|
||||
def __init__(self, config: TurnSignalConfig | None = None):
|
||||
self._config = config or TurnSignalConfig()
|
||||
self._lamps = {IconSide.left: _IndicatorLamp(IconSide.left),
|
||||
@@ -702,7 +776,7 @@ def _desired_probe(sm):
|
||||
return desired_lat_accel
|
||||
|
||||
|
||||
class DeveloperUiRenderer(Widget):
|
||||
class IQDevMetricsOverlay(Widget):
|
||||
DEV_UI_OFF = 0
|
||||
DEV_UI_RIGHT = 1
|
||||
DEV_UI_BOTTOM = 2
|
||||
@@ -716,7 +790,7 @@ class DeveloperUiRenderer(Widget):
|
||||
|
||||
@staticmethod
|
||||
def get_bottom_dev_ui_offset():
|
||||
return DeveloperUiRenderer.BOTTOM_BAR_HEIGHT if ui_state.developer_ui != DeveloperUiRenderer.DEV_UI_OFF else 0
|
||||
return IQDevMetricsOverlay.BOTTOM_BAR_HEIGHT if ui_state.developer_ui != IQDevMetricsOverlay.DEV_UI_OFF else 0
|
||||
|
||||
def _update_state(self) -> None:
|
||||
self.dev_ui_mode = ui_state.developer_ui
|
||||
@@ -775,7 +849,7 @@ def _dim(color, alpha: float):
|
||||
return canvas.with_opacity(color, 255 * alpha)
|
||||
|
||||
|
||||
class SpeedLimitRenderer(Widget):
|
||||
class IQSpeedLimitOverlay(Widget):
|
||||
"""Regulatory sign, upcoming-limit preview and pre-active nudge arrows."""
|
||||
|
||||
def __init__(self):
|
||||
|
||||
@@ -11,12 +11,12 @@ from openpilot.selfdrive.ui.mici.onroad.torque_bar import TorqueBar
|
||||
from openpilot.selfdrive.ui.ui_state import ui_state
|
||||
from openpilot.selfdrive.ui.onroad.hud_renderer import HudRenderer
|
||||
from openpilot.iqpilot.ui.onroad.hud_overlays import (
|
||||
DeveloperUiRenderer,
|
||||
IQDevMetricsOverlay,
|
||||
RoadNameRenderer,
|
||||
RocketFuel,
|
||||
SpeedLimitRenderer,
|
||||
TurnSignalController,
|
||||
SpeedRenderer,
|
||||
IQAccelBar,
|
||||
IQSpeedLimitOverlay,
|
||||
IQTurnSignalOverlay,
|
||||
IQSpeedOverlay,
|
||||
)
|
||||
from openpilot.iqpilot.ui.onroad.nav_map_panel import NavMapPanel
|
||||
from openpilot.iqpilot.ui.onroad.soft_warning import SoftWarningRenderer
|
||||
@@ -28,13 +28,13 @@ ENABLE_SPLIT_NAV_MAP_PANEL = True
|
||||
class IQHudRenderer(HudRenderer):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.developer_ui = DeveloperUiRenderer()
|
||||
self.developer_ui = IQDevMetricsOverlay()
|
||||
self.nav_map_panel = NavMapPanel()
|
||||
self.road_name_renderer = RoadNameRenderer()
|
||||
self.rocket_fuel = RocketFuel()
|
||||
self.speed_limit_renderer = SpeedLimitRenderer()
|
||||
self.turn_signal_controller = TurnSignalController()
|
||||
self.speed_renderer = SpeedRenderer()
|
||||
self.rocket_fuel = IQAccelBar()
|
||||
self.speed_limit_renderer = IQSpeedLimitOverlay()
|
||||
self.turn_signal_controller = IQTurnSignalOverlay()
|
||||
self.speed_renderer = IQSpeedOverlay()
|
||||
self.soft_warning_renderer = SoftWarningRenderer()
|
||||
self._torque_bar = TorqueBar(scale=3.0, always=True)
|
||||
|
||||
@@ -59,8 +59,8 @@ class IQHudRenderer(HudRenderer):
|
||||
|
||||
if ui_state.torque_bar:
|
||||
torque_rect = rect
|
||||
if ui_state.developer_ui in (DeveloperUiRenderer.DEV_UI_BOTTOM, DeveloperUiRenderer.DEV_UI_BOTH):
|
||||
torque_rect = rl.Rectangle(rect.x, rect.y, rect.width, rect.height - DeveloperUiRenderer.BOTTOM_BAR_HEIGHT)
|
||||
if ui_state.developer_ui in (IQDevMetricsOverlay.DEV_UI_BOTTOM, IQDevMetricsOverlay.DEV_UI_BOTH):
|
||||
torque_rect = rl.Rectangle(rect.x, rect.y, rect.width, rect.height - IQDevMetricsOverlay.BOTTOM_BAR_HEIGHT)
|
||||
self._torque_bar.render(torque_rect)
|
||||
|
||||
if not self.split_nav_enabled():
|
||||
|
||||
Reference in New Issue
Block a user