version: sunnypilot v2026.002.000 (staging) date: 2026-07-21T07:44:02 master commit: 2c334ede443d7391d27575af8c854a095ba702a8
53 lines
2.2 KiB
Python
53 lines
2.2 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.
|
|
"""
|
|
import pyray as rl
|
|
|
|
from openpilot.selfdrive.ui.ui_state import ui_state
|
|
from openpilot.system.ui.lib.application import gui_app
|
|
from openpilot.common.filter_simple import FirstOrderFilter
|
|
|
|
|
|
class BlindSpotIndicators:
|
|
def __init__(self):
|
|
self._txt_blind_spot_left: rl.Texture = gui_app.texture('icons_mici/onroad/blind_spot_left.png', 108, 128)
|
|
self._txt_blind_spot_right: rl.Texture = gui_app.texture('icons_mici/onroad/blind_spot_left.png', 108, 128, flip_x=True)
|
|
|
|
self._blind_spot_left_alpha_filter = FirstOrderFilter(0, 0.15, 1 / gui_app.target_fps)
|
|
self._blind_spot_right_alpha_filter = FirstOrderFilter(0, 0.15, 1 / gui_app.target_fps)
|
|
|
|
def update(self) -> None:
|
|
sm = ui_state.sm
|
|
CS = sm['carState']
|
|
|
|
self._blind_spot_left_alpha_filter.update(1.0 if CS.leftBlindspot else 0.0)
|
|
self._blind_spot_right_alpha_filter.update(1.0 if CS.rightBlindspot else 0.0)
|
|
|
|
@property
|
|
def detected(self) -> bool:
|
|
return ui_state.blindspot and (self._blind_spot_left_alpha_filter.x > 0.01 or self._blind_spot_right_alpha_filter.x > 0.01)
|
|
|
|
def render(self, rect: rl.Rectangle) -> None:
|
|
if not ui_state.blindspot:
|
|
return
|
|
|
|
BLIND_SPOT_MARGIN_X = 20 # Distance from edge of screen
|
|
BLIND_SPOT_Y_OFFSET = 100 # Distance from top of screen
|
|
|
|
if self._blind_spot_left_alpha_filter.x > 0.01:
|
|
pos_x = int(rect.x + BLIND_SPOT_MARGIN_X)
|
|
pos_y = int(rect.y + BLIND_SPOT_Y_OFFSET)
|
|
alpha = int(255 * self._blind_spot_left_alpha_filter.x)
|
|
color = rl.Color(255, 255, 255, alpha)
|
|
rl.draw_texture_ex(self._txt_blind_spot_left, rl.Vector2(pos_x, pos_y), 0.0, 1.0, color)
|
|
|
|
if self._blind_spot_right_alpha_filter.x > 0.01:
|
|
pos_x = int(rect.x + rect.width - BLIND_SPOT_MARGIN_X - self._txt_blind_spot_right.width)
|
|
pos_y = int(rect.y + BLIND_SPOT_Y_OFFSET)
|
|
alpha = int(255 * self._blind_spot_right_alpha_filter.x)
|
|
color = rl.Color(255, 255, 255, alpha)
|
|
rl.draw_texture_ex(self._txt_blind_spot_right, rl.Vector2(pos_x, pos_y), 0.0, 1.0, color)
|