Files
StarPilot/selfdrive/ui/lib/mode_banner.py
2026-07-24 02:01:57 -05:00

54 lines
1.9 KiB
Python

from enum import StrEnum
import pyray as rl
from openpilot.starpilot.common.experimental_state import requested_experimental_mode
class ModeBannerVariant(StrEnum):
CHILL = "chill"
EXPERIMENTAL = "experimental"
def get_mode_banner_variant(params, params_memory=None) -> ModeBannerVariant:
if params.get_bool("SafeMode"):
return ModeBannerVariant.CHILL
if requested_experimental_mode(params, params_memory):
return ModeBannerVariant.EXPERIMENTAL
return ModeBannerVariant.CHILL
def _color(red: int, green: int, blue: int, alpha: int) -> rl.Color:
return rl.Color(red, green, blue, alpha)
def _lerp_color(start: rl.Color, end: rl.Color, progress: float, alpha: int) -> rl.Color:
progress = max(0.0, min(1.0, progress))
return rl.Color(
round(start.r + (end.r - start.r) * progress),
round(start.g + (end.g - start.g) * progress),
round(start.b + (end.b - start.b) * progress),
alpha,
)
def mode_banner_color(variant: ModeBannerVariant, progress: float, alpha: int = 255) -> rl.Color:
progress = max(0.0, min(1.0, progress))
if variant == ModeBannerVariant.CHILL:
return _lerp_color(_color(20, 255, 171, alpha), _color(35, 149, 255, alpha), progress, alpha)
return _lerp_color(_color(255, 155, 63, alpha), _color(219, 56, 34, alpha), progress, alpha)
def mode_atom_color(variant: ModeBannerVariant, progress: float, alpha: int = 255) -> rl.Color:
# The compact atom reads left-to-right as blue to mint in fixed Chill mode.
if variant == ModeBannerVariant.CHILL:
progress = 1.0 - progress
return mode_banner_color(variant, progress, alpha)
def draw_mode_banner_gradient(rect: rl.Rectangle, variant: ModeBannerVariant, alpha: int = 255) -> None:
rl.draw_rectangle_gradient_h(
int(rect.x), int(rect.y), int(rect.width), int(rect.height),
mode_banner_color(variant, 0.0, alpha), mode_banner_color(variant, 1.0, alpha),
)