forked from IQ.Lvbs/IQ.Pilot
37 lines
1.3 KiB
Python
37 lines
1.3 KiB
Python
"""
|
|
Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
|
|
|
|
Always-on-Lateral input adapter for Subaru: turns the dashboard LKAS button into
|
|
a carState lkas ButtonEvent so the shared AOL state machine can toggle lateral.
|
|
"""
|
|
from enum import StrEnum
|
|
|
|
from iqdbc.car import Bus, structs
|
|
from iqdbc.car.subaru.values import SubaruFlags
|
|
from iqdbc.lvbs.aol_base import AolCarStateBase
|
|
from iqdbc.can.parser import CANParser
|
|
|
|
_LKAS = structs.CarState.ButtonEvent.Type.lkas
|
|
|
|
# ES_LKAS_State/LKAS_Dash_State: 0 = neutral, 1 = LKAS shown on, 2 = LKAS shown off
|
|
_DASH_ON = 1
|
|
_DASH_OFF = 2
|
|
|
|
|
|
class AolCarState(AolCarStateBase):
|
|
def update_aol(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None:
|
|
if self.CP.flags & SubaruFlags.PREGLOBAL:
|
|
return
|
|
|
|
self.prev_lkas_button = self.lkas_button
|
|
self.lkas_button = can_parsers[Bus.cam].vl["ES_LKAS_State"]["LKAS_Dash_State"]
|
|
|
|
if self._is_toggle_edge():
|
|
ret.buttonEvents = [*ret.buttonEvents, structs.CarState.ButtonEvent(type=_LKAS, pressed=True)]
|
|
|
|
def _is_toggle_edge(self) -> bool:
|
|
# every dash-state change is a deliberate press except the off->on rebound (2 -> 1)
|
|
if self.lkas_button == self.prev_lkas_button:
|
|
return False
|
|
return not (self.prev_lkas_button == _DASH_OFF and self.lkas_button == _DASH_ON)
|