from collections import namedtuple
from enum import StrEnum
from cereal import car
from openpilot . selfdrive . car import AngleRateLimit , dbc_dict
from openpilot . selfdrive . car . docs_definitions import CarInfo
from openpilot . selfdrive . car . fw_query_definitions import FwQueryConfig , Request , StdQueries
Ecu = car . CarParams . Ecu
Button = namedtuple ( ' Button ' , [ ' event_type ' , ' can_addr ' , ' can_msg ' , ' values ' ] )
class CAR ( StrEnum ) :
AP1_MODELS = ' TESLA AP1 MODEL S '
AP2_MODELS = ' TESLA AP2 MODEL S '
CAR_INFO : dict [ str , CarInfo | list [ CarInfo ] ] = {
CAR . AP1_MODELS : CarInfo ( " Tesla AP1 Model S " , " All " ) ,
CAR . AP2_MODELS : CarInfo ( " Tesla AP2 Model S " , " All " ) ,
}
DBC = {
CAR . AP2_MODELS : dbc_dict ( ' tesla_powertrain ' , ' tesla_radar ' , chassis_dbc = ' tesla_can ' ) ,
CAR . AP1_MODELS : dbc_dict ( ' tesla_powertrain ' , ' tesla_radar ' , chassis_dbc = ' tesla_can ' ) ,
}
FW_QUERY_CONFIG = FwQueryConfig (
requests = [
Request (
[ StdQueries . TESTER_PRESENT_REQUEST , StdQueries . UDS_VERSION_REQUEST ] ,
[ StdQueries . TESTER_PRESENT_RESPONSE , StdQueries . UDS_VERSION_RESPONSE ] ,
whitelist_ecus = [ Ecu . eps ] ,
rx_offset = 0x08 ,
bus = 0 ,
) ,
Request (
[ StdQueries . TESTER_PRESENT_REQUEST , StdQueries . UDS_VERSION_REQUEST ] ,
[ StdQueries . TESTER_PRESENT_RESPONSE , StdQueries . UDS_VERSION_RESPONSE ] ,
whitelist_ecus = [ Ecu . adas , Ecu . electricBrakeBooster , Ecu . fwdRadar ] ,
rx_offset = 0x10 ,
bus = 0 ,
) ,
]
)
class CANBUS :
# Lateral harness
chassis = 0
radar = 1
autopilot_chassis = 2
# Longitudinal harness
powertrain = 4
private = 5
autopilot_powertrain = 6
GEAR_MAP = {
" DI_GEAR_INVALID " : car . CarState . GearShifter . unknown ,
" DI_GEAR_P " : car . CarState . GearShifter . park ,
" DI_GEAR_R " : car . CarState . GearShifter . reverse ,
" DI_GEAR_N " : car . CarState . GearShifter . neutral ,
" DI_GEAR_D " : car . CarState . GearShifter . drive ,
" DI_GEAR_SNA " : car . CarState . GearShifter . unknown ,
}
DOORS = [ " DOOR_STATE_FL " , " DOOR_STATE_FR " , " DOOR_STATE_RL " , " DOOR_STATE_RR " , " DOOR_STATE_FrontTrunk " , " BOOT_STATE " ]
# Make sure the message and addr is also in the CAN parser!
BUTTONS = [
Button ( car . CarState . ButtonEvent . Type . leftBlinker , " STW_ACTN_RQ " , " TurnIndLvr_Stat " , [ 1 ] ) ,
Button ( car . CarState . ButtonEvent . Type . rightBlinker , " STW_ACTN_RQ " , " TurnIndLvr_Stat " , [ 2 ] ) ,
Button ( car . CarState . ButtonEvent . Type . accelCruise , " STW_ACTN_RQ " , " SpdCtrlLvr_Stat " , [ 4 , 16 ] ) ,
Button ( car . CarState . ButtonEvent . Type . decelCruise , " STW_ACTN_RQ " , " SpdCtrlLvr_Stat " , [ 8 , 32 ] ) ,
Button ( car . CarState . ButtonEvent . Type . cancel , " STW_ACTN_RQ " , " SpdCtrlLvr_Stat " , [ 1 ] ) ,
Button ( car . CarState . ButtonEvent . Type . resumeCruise , " STW_ACTN_RQ " , " SpdCtrlLvr_Stat " , [ 2 ] ) ,
]
class CarControllerParams :
ANGLE_RATE_LIMIT_UP = AngleRateLimit ( speed_bp = [ 0. , 5. , 15. ] , angle_v = [ 10. , 1.6 , .3 ] )
ANGLE_RATE_LIMIT_DOWN = AngleRateLimit ( speed_bp = [ 0. , 5. , 15. ] , angle_v = [ 10. , 7.0 , 0.8 ] )
JERK_LIMIT_MAX = 8
JERK_LIMIT_MIN = - 8
ACCEL_TO_SPEED_MULTIPLIER = 3
def __init__ ( self , CP ) :
pass