from cereal import car
from panda import Panda
from openpilot . common . conversions import Conversions as CV
from openpilot . selfdrive . car import create_button_events , get_safety_config
from openpilot . selfdrive . car . ford . fordcan import CanBus
from openpilot . selfdrive . car . ford . values import Ecu , FordFlags
from openpilot . selfdrive . car . interfaces import CarInterfaceBase
ButtonType = car . CarState . ButtonEvent . Type
TransmissionType = car . CarParams . TransmissionType
GearShifter = car . CarState . GearShifter
class CarInterface ( CarInterfaceBase ) :
@staticmethod
def _get_params ( ret , candidate , fingerprint , car_fw , experimental_long , docs ) :
ret . carName = " ford "
ret . dashcamOnly = bool ( ret . flags & FordFlags . CANFD )
ret . radarUnavailable = True
ret . steerControlType = car . CarParams . SteerControlType . angle
ret . steerActuatorDelay = 0.2
ret . steerLimitTimer = 1.0
ret . longitudinalTuning . kpBP = [ 0. ]
ret . longitudinalTuning . kpV = [ 0.5 ]
ret . longitudinalTuning . kiV = [ 0. ]
CAN = CanBus ( fingerprint = fingerprint )
cfgs = [ get_safety_config ( car . CarParams . SafetyModel . ford ) ]
if CAN . main > = 4 :
cfgs . insert ( 0 , get_safety_config ( car . CarParams . SafetyModel . noOutput ) )
ret . safetyConfigs = cfgs
ret . experimentalLongitudinalAvailable = True
if experimental_long :
ret . safetyConfigs [ - 1 ] . safetyParam | = Panda . FLAG_FORD_LONG_CONTROL
ret . openpilotLongitudinalControl = True
if ret . flags & FordFlags . CANFD :
ret . safetyConfigs [ - 1 ] . safetyParam | = Panda . FLAG_FORD_CANFD
# Auto Transmission: 0x732 ECU or Gear_Shift_by_Wire_FD1
found_ecus = [ fw . ecu for fw in car_fw ]
if Ecu . shiftByWire in found_ecus or 0x5A in fingerprint [ CAN . main ] or docs :
ret . transmissionType = TransmissionType . automatic
else :
ret . transmissionType = TransmissionType . manual
ret . minEnableSpeed = 20.0 * CV . MPH_TO_MS
# BSM: Side_Detect_L_Stat, Side_Detect_R_Stat
# TODO: detect bsm in car_fw?
ret . enableBsm = 0x3A6 in fingerprint [ CAN . main ] and 0x3A7 in fingerprint [ CAN . main ]
# LCA can steer down to zero
ret . minSteerSpeed = 0.
ret . autoResumeSng = ret . minEnableSpeed == - 1.
ret . centerToFront = ret . wheelbase * 0.44
return ret
def _update ( self , c ) :
ret = self . CS . update ( self . cp , self . cp_cam )
ret . buttonEvents = create_button_events ( self . CS . distance_button , self . CS . prev_distance_button , { 1 : ButtonType . gapAdjustCruise } )
events = self . create_common_events ( ret , extra_gears = [ GearShifter . manumatic ] )
if not self . CS . vehicle_sensors_valid :
events . add ( car . CarEvent . EventName . vehicleSensorsInvalid )
ret . events = events . to_msg ( )
return ret