f8e13417f2
date: 2026-08-15T14:20:10 master commit: d48cfa730bf21593b684efeaf3fd8940695e1dea
155 lines
6.1 KiB
Python
155 lines
6.1 KiB
Python
"""
|
|
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.
|
|
"""
|
|
from openpilot.common.params import Params
|
|
from openpilot.selfdrive.ui.ui_state import ui_state
|
|
from openpilot.system.ui.lib.multilang import tr, tr_noop
|
|
from openpilot.system.ui.sunnypilot.widgets.list_view import toggle_item_sp, multiple_button_item_sp
|
|
from openpilot.system.ui.widgets.scroller_tici import Scroller
|
|
from openpilot.system.ui.widgets import Widget
|
|
|
|
CHEVRON_INFO_DESCRIPTION = {
|
|
"enabled": tr_noop("Display useful metrics below the chevron that tracks the lead car " +
|
|
"only applicable to cars with sunnypilot longitudinal control."),
|
|
"disabled": tr_noop("This feature requires sunnypilot longitudinal control to be available.")
|
|
}
|
|
|
|
|
|
class VisualsLayout(Widget):
|
|
def __init__(self):
|
|
super().__init__()
|
|
|
|
self._params = Params()
|
|
items = self._initialize_items()
|
|
self._scroller = Scroller(items, line_separator=True, spacing=0)
|
|
|
|
def _initialize_items(self):
|
|
self._toggle_defs = {
|
|
"BlindSpot": (
|
|
lambda: tr("Show Blind Spot Warnings"),
|
|
tr("Enabling this will display warnings when a vehicle is detected in your " +
|
|
"blind spot as long as your car has BSM supported."),
|
|
None,
|
|
),
|
|
"TorqueBar": (
|
|
lambda: tr("Steering Arc"),
|
|
tr("Display steering arc on the driving screen when lateral control is enabled."),
|
|
None,
|
|
),
|
|
"RainbowMode": (
|
|
lambda: tr("Enable Tesla Rainbow Mode"),
|
|
tr("A beautiful rainbow effect on the path the model wants to take. " +
|
|
"It does not affect driving in any way."),
|
|
None,
|
|
),
|
|
"StandstillTimer": (
|
|
lambda: tr("Enable Standstill Timer"),
|
|
tr("Show a timer on the HUD when the car is at a standstill."),
|
|
None,
|
|
),
|
|
"RoadNameToggle": (
|
|
lambda: tr("Display Road Name"),
|
|
tr("Displays the name of the road the car is traveling on." +
|
|
"<br>The OpenStreetMap database of the location must be downloaded from " +
|
|
"the OSM panel to fetch the road name."),
|
|
None,
|
|
),
|
|
"GreenLightAlert": (
|
|
lambda: tr("Green Traffic Light Alert (Beta)"),
|
|
tr("A chime and on-screen alert will play when the traffic light you are waiting for " +
|
|
"turns green and you have no vehicle in front of you." +
|
|
"<br>Note: This chime is only designed as a notification. " +
|
|
"It is the driver's responsibility to observe their environment and make decisions accordingly."),
|
|
None,
|
|
),
|
|
"LeadDepartAlert": (
|
|
lambda: tr("Lead Departure Alert (Beta)"),
|
|
tr("A chime and on-screen alert will play when you are stopped, and the vehicle in front of you start moving." +
|
|
"<br>Note: This chime is only designed as a notification. " +
|
|
"It is the driver's responsibility to observe their environment and make decisions accordingly."),
|
|
None,
|
|
),
|
|
"TrueVEgoUI": (
|
|
lambda: tr("Speedometer: Always Display True Speed"),
|
|
tr("For applicable vehicles, always display the true vehicle current speed from wheel speed sensors."),
|
|
None,
|
|
),
|
|
"HideVEgoUI": (
|
|
lambda: tr("Speedometer: Hide from Onroad Screen"),
|
|
tr("When enabled, the speedometer on the onroad screen is not displayed."),
|
|
None,
|
|
),
|
|
"ShowTurnSignals": (
|
|
lambda: tr("Display Turn Signals"),
|
|
tr("When enabled, visual turn indicators are drawn on the HUD."),
|
|
None,
|
|
),
|
|
"RocketFuel": (
|
|
lambda: tr("Real-time Acceleration Bar"),
|
|
tr("Show an indicator on the left side of the screen to display real-time vehicle acceleration and deceleration. " +
|
|
"This displays what the car is currently doing, not what the planner is requesting."),
|
|
None,
|
|
),
|
|
}
|
|
self._toggles = {}
|
|
for param, (title, desc, callback) in self._toggle_defs.items():
|
|
toggle = toggle_item_sp(
|
|
title=title,
|
|
description=desc,
|
|
param=param,
|
|
initial_state=ui_state.params.get_bool(param),
|
|
callback=callback,
|
|
)
|
|
self._toggles[param] = toggle
|
|
|
|
self._chevron_info = multiple_button_item_sp(
|
|
title=lambda: tr("Display Metrics Below Chevron"),
|
|
description="",
|
|
buttons=[lambda: tr("Off"), lambda: tr("Distance"), lambda: tr("Speed"), lambda: tr("Time"), lambda: tr("All")],
|
|
param="ChevronInfo",
|
|
inline=False
|
|
)
|
|
self._dev_ui_info = multiple_button_item_sp(
|
|
title=lambda: tr("Developer UI"),
|
|
description=lambda: tr("Display real-time parameters and metrics from various sources."),
|
|
buttons=[lambda: tr("Off"), lambda: tr("Bottom"), lambda: tr("Right"), lambda: tr("Right & Bottom")],
|
|
param="DevUIInfo",
|
|
button_width=350,
|
|
inline=False
|
|
)
|
|
|
|
items = list(self._toggles.values()) + [
|
|
self._chevron_info,
|
|
self._dev_ui_info,
|
|
]
|
|
return items
|
|
|
|
def _update_state(self):
|
|
super()._update_state()
|
|
|
|
for param in self._toggle_defs:
|
|
self._toggles[param].action_item.set_state(self._params.get_bool(param))
|
|
|
|
self._dev_ui_info.action_item.set_selected_button(ui_state.params.get("DevUIInfo", return_default=True))
|
|
|
|
if ui_state.has_longitudinal_control:
|
|
self._chevron_info.set_description(tr(CHEVRON_INFO_DESCRIPTION["enabled"]))
|
|
self._chevron_info.action_item.set_selected_button(ui_state.params.get("ChevronInfo", return_default=True))
|
|
self._chevron_info.action_item.set_enabled(True)
|
|
else:
|
|
self._chevron_info.set_description(tr(CHEVRON_INFO_DESCRIPTION["disabled"]))
|
|
self._chevron_info.action_item.set_enabled(False)
|
|
ui_state.params.put("ChevronInfo", 0)
|
|
|
|
def _render(self, rect):
|
|
self._scroller.render(rect)
|
|
|
|
def show_event(self):
|
|
self._scroller.show_event()
|
|
if not ui_state.has_longitudinal_control:
|
|
self._chevron_info.set_description(tr(CHEVRON_INFO_DESCRIPTION["disabled"]))
|
|
self._chevron_info.show_description(True)
|