from collections import namedtuple
from cereal import car
from openpilot . selfdrive . car import AngleRateLimit , CarSpecs , PlatformConfig , Platforms , dbc_dict
from openpilot . selfdrive . car . docs_definitions import CarDocs
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 ( Platforms ) :
TESLA_AP1_MODELS = PlatformConfig (
[ CarDocs ( " Tesla AP1 Model S " , " All " ) ] ,
CarSpecs ( mass = 2100. , wheelbase = 2.959 , steerRatio = 15.0 ) ,
dbc_dict ( ' tesla_powertrain ' , ' tesla_radar_bosch_generated ' , chassis_dbc = ' tesla_can ' )
)
TESLA_AP2_MODELS = PlatformConfig (
[ CarDocs ( " Tesla AP2 Model S " , " All " ) ] ,
TESLA_AP1_MODELS . specs ,
TESLA_AP1_MODELS . dbc_dict
)
TESLA_MODELS_RAVEN = PlatformConfig (
[ CarDocs ( " Tesla Model S Raven " , " All " ) ] ,
TESLA_AP1_MODELS . specs ,
dbc_dict ( ' tesla_powertrain ' , ' tesla_radar_continental_generated ' , 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 . SUPPLIER_SOFTWARE_VERSION_REQUEST ] ,
[ StdQueries . TESTER_PRESENT_RESPONSE , StdQueries . SUPPLIER_SOFTWARE_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
DBC = CAR . create_dbc_map ( )