Ford: use flags for CANFD (#31664)

pull/31661/head
Cameron Clough 1 year ago committed by GitHub
parent 52ee070fe0
commit 341b81c0a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 6
      selfdrive/car/ford/carcontroller.py
  2. 16
      selfdrive/car/ford/carstate.py
  3. 6
      selfdrive/car/ford/interface.py
  4. 30
      selfdrive/car/ford/values.py

@ -1,9 +1,9 @@
from cereal import car from cereal import car
from openpilot.common.numpy_fast import clip
from opendbc.can.packer import CANPacker from opendbc.can.packer import CANPacker
from openpilot.common.numpy_fast import clip
from openpilot.selfdrive.car import apply_std_steer_angle_limits from openpilot.selfdrive.car import apply_std_steer_angle_limits
from openpilot.selfdrive.car.ford import fordcan from openpilot.selfdrive.car.ford import fordcan
from openpilot.selfdrive.car.ford.values import CANFD_CAR, CarControllerParams from openpilot.selfdrive.car.ford.values import CarControllerParams, FordFlags
from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.car.interfaces import CarControllerBase
from openpilot.selfdrive.controls.lib.drive_helpers import V_CRUISE_MAX from openpilot.selfdrive.controls.lib.drive_helpers import V_CRUISE_MAX
@ -70,7 +70,7 @@ class CarController(CarControllerBase):
self.apply_curvature_last = apply_curvature self.apply_curvature_last = apply_curvature
if self.CP.carFingerprint in CANFD_CAR: if self.CP.flags & FordFlags.CANFD:
# TODO: extended mode # TODO: extended mode
mode = 1 if CC.latActive else 0 mode = 1 if CC.latActive else 0
counter = (self.frame // CarControllerParams.STEER_STEP) % 0xF counter = (self.frame // CarControllerParams.STEER_STEP) % 0xF

@ -1,10 +1,10 @@
from cereal import car from cereal import car
from openpilot.common.conversions import Conversions as CV
from opendbc.can.can_define import CANDefine from opendbc.can.can_define import CANDefine
from opendbc.can.parser import CANParser from opendbc.can.parser import CANParser
from openpilot.selfdrive.car.interfaces import CarStateBase from openpilot.common.conversions import Conversions as CV
from openpilot.selfdrive.car.ford.fordcan import CanBus from openpilot.selfdrive.car.ford.fordcan import CanBus
from openpilot.selfdrive.car.ford.values import CANFD_CAR, CarControllerParams, DBC from openpilot.selfdrive.car.ford.values import DBC, CarControllerParams, FordFlags
from openpilot.selfdrive.car.interfaces import CarStateBase
GearShifter = car.CarState.GearShifter GearShifter = car.CarState.GearShifter
TransmissionType = car.CarParams.TransmissionType TransmissionType = car.CarParams.TransmissionType
@ -49,7 +49,7 @@ class CarState(CarStateBase):
ret.steerFaultPermanent = cp.vl["EPAS_INFO"]["EPAS_Failure"] in (2, 3) ret.steerFaultPermanent = cp.vl["EPAS_INFO"]["EPAS_Failure"] in (2, 3)
ret.espDisabled = cp.vl["Cluster_Info1_FD1"]["DrvSlipCtlMde_D_Rq"] != 0 # 0 is default mode ret.espDisabled = cp.vl["Cluster_Info1_FD1"]["DrvSlipCtlMde_D_Rq"] != 0 # 0 is default mode
if self.CP.carFingerprint in CANFD_CAR: if self.CP.flags & FordFlags.CANFD:
# this signal is always 0 on non-CAN FD cars # this signal is always 0 on non-CAN FD cars
ret.steerFaultTemporary |= cp.vl["Lane_Assist_Data3_FD1"]["LatCtlSte_D_Stat"] not in (1, 2, 3) ret.steerFaultTemporary |= cp.vl["Lane_Assist_Data3_FD1"]["LatCtlSte_D_Stat"] not in (1, 2, 3)
@ -91,7 +91,7 @@ class CarState(CarStateBase):
# blindspot sensors # blindspot sensors
if self.CP.enableBsm: if self.CP.enableBsm:
cp_bsm = cp_cam if self.CP.carFingerprint in CANFD_CAR else cp cp_bsm = cp_cam if self.CP.flags & FordFlags.CANFD else cp
ret.leftBlindspot = cp_bsm.vl["Side_Detect_L_Stat"]["SodDetctLeft_D_Stat"] != 0 ret.leftBlindspot = cp_bsm.vl["Side_Detect_L_Stat"]["SodDetctLeft_D_Stat"] != 0
ret.rightBlindspot = cp_bsm.vl["Side_Detect_R_Stat"]["SodDetctRight_D_Stat"] != 0 ret.rightBlindspot = cp_bsm.vl["Side_Detect_R_Stat"]["SodDetctRight_D_Stat"] != 0
@ -122,7 +122,7 @@ class CarState(CarStateBase):
("RCMStatusMessage2_FD1", 10), ("RCMStatusMessage2_FD1", 10),
] ]
if CP.carFingerprint in CANFD_CAR: if CP.flags & FordFlags.CANFD:
messages += [ messages += [
("Lane_Assist_Data3_FD1", 33), ("Lane_Assist_Data3_FD1", 33),
] ]
@ -137,7 +137,7 @@ class CarState(CarStateBase):
("BCM_Lamp_Stat_FD1", 1), ("BCM_Lamp_Stat_FD1", 1),
] ]
if CP.enableBsm and CP.carFingerprint not in CANFD_CAR: if CP.enableBsm and not (CP.flags & FordFlags.CANFD):
messages += [ messages += [
("Side_Detect_L_Stat", 5), ("Side_Detect_L_Stat", 5),
("Side_Detect_R_Stat", 5), ("Side_Detect_R_Stat", 5),
@ -155,7 +155,7 @@ class CarState(CarStateBase):
("IPMA_Data", 1), ("IPMA_Data", 1),
] ]
if CP.enableBsm and CP.carFingerprint in CANFD_CAR: if CP.enableBsm and CP.flags & FordFlags.CANFD:
messages += [ messages += [
("Side_Detect_L_Stat", 5), ("Side_Detect_L_Stat", 5),
("Side_Detect_R_Stat", 5), ("Side_Detect_R_Stat", 5),

@ -3,7 +3,7 @@ from panda import Panda
from openpilot.common.conversions import Conversions as CV from openpilot.common.conversions import Conversions as CV
from openpilot.selfdrive.car import get_safety_config from openpilot.selfdrive.car import get_safety_config
from openpilot.selfdrive.car.ford.fordcan import CanBus from openpilot.selfdrive.car.ford.fordcan import CanBus
from openpilot.selfdrive.car.ford.values import CANFD_CAR, Ecu from openpilot.selfdrive.car.ford.values import Ecu, FordFlags
from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.interfaces import CarInterfaceBase
TransmissionType = car.CarParams.TransmissionType TransmissionType = car.CarParams.TransmissionType
@ -14,7 +14,7 @@ class CarInterface(CarInterfaceBase):
@staticmethod @staticmethod
def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs):
ret.carName = "ford" ret.carName = "ford"
ret.dashcamOnly = candidate in CANFD_CAR ret.dashcamOnly = bool(ret.flags & FordFlags.CANFD)
ret.radarUnavailable = True ret.radarUnavailable = True
ret.steerControlType = car.CarParams.SteerControlType.angle ret.steerControlType = car.CarParams.SteerControlType.angle
@ -36,7 +36,7 @@ class CarInterface(CarInterfaceBase):
ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_FORD_LONG_CONTROL ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_FORD_LONG_CONTROL
ret.openpilotLongitudinalControl = True ret.openpilotLongitudinalControl = True
if candidate in CANFD_CAR: if ret.flags & FordFlags.CANFD:
ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_FORD_CANFD ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_FORD_CANFD
# Auto Transmission: 0x732 ECU or Gear_Shift_by_Wire_FD1 # Auto Transmission: 0x732 ECU or Gear_Shift_by_Wire_FD1

@ -1,5 +1,5 @@
from dataclasses import dataclass, field from dataclasses import dataclass, field
from enum import Enum from enum import Enum, IntFlag
import panda.python.uds as uds import panda.python.uds as uds
from cereal import car from cereal import car
@ -39,6 +39,11 @@ class CarControllerParams:
pass pass
class FordFlags(IntFlag):
# Static flags
CANFD = 1
class RADAR: class RADAR:
DELPHI_ESR = 'ford_fusion_2018_adas' DELPHI_ESR = 'ford_fusion_2018_adas'
DELPHI_MRR = 'FORD_CADS' DELPHI_MRR = 'FORD_CADS'
@ -57,7 +62,7 @@ class FordCarInfo(CarInfo):
package: str = "Co-Pilot360 Assist+" package: str = "Co-Pilot360 Assist+"
def init_make(self, CP: car.CarParams): def init_make(self, CP: car.CarParams):
harness = CarHarness.ford_q4 if CP.carFingerprint in CANFD_CAR else CarHarness.ford_q3 harness = CarHarness.ford_q4 if CP.flags & FordFlags.CANFD else CarHarness.ford_q3
if CP.carFingerprint in (CAR.BRONCO_SPORT_MK1, CAR.MAVERICK_MK1, CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1): if CP.carFingerprint in (CAR.BRONCO_SPORT_MK1, CAR.MAVERICK_MK1, CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1):
self.car_parts = CarParts([Device.threex_angled_mount, harness]) self.car_parts = CarParts([Device.threex_angled_mount, harness])
else: else:
@ -69,6 +74,15 @@ class FordPlatformConfig(PlatformConfig):
dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', RADAR.DELPHI_MRR)) dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', RADAR.DELPHI_MRR))
@dataclass
class FordCANFDPlatformConfig(FordPlatformConfig):
dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', None))
def init(self):
super().init()
self.flags |= FordFlags.CANFD
class CAR(Platforms): class CAR(Platforms):
BRONCO_SPORT_MK1 = FordPlatformConfig( BRONCO_SPORT_MK1 = FordPlatformConfig(
"FORD BRONCO SPORT 1ST GEN", "FORD BRONCO SPORT 1ST GEN",
@ -97,19 +111,17 @@ class CAR(Platforms):
], ],
specs=CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), specs=CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8),
) )
F_150_MK14 = FordPlatformConfig( F_150_MK14 = FordCANFDPlatformConfig(
"FORD F-150 14TH GEN", "FORD F-150 14TH GEN",
[ [
FordCarInfo("Ford F-150 2023", "Co-Pilot360 Active 2.0"), FordCarInfo("Ford F-150 2023", "Co-Pilot360 Active 2.0"),
FordCarInfo("Ford F-150 Hybrid 2023", "Co-Pilot360 Active 2.0"), FordCarInfo("Ford F-150 Hybrid 2023", "Co-Pilot360 Active 2.0"),
], ],
dbc_dict=dbc_dict('ford_lincoln_base_pt', None),
specs=CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), specs=CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0),
) )
F_150_LIGHTNING_MK1 = FordPlatformConfig( F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig(
"FORD F-150 LIGHTNING 1ST GEN", "FORD F-150 LIGHTNING 1ST GEN",
FordCarInfo("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0"), FordCarInfo("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0"),
dbc_dict=dbc_dict('ford_lincoln_base_pt', None),
specs=CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), specs=CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9),
) )
FOCUS_MK4 = FordPlatformConfig( FOCUS_MK4 = FordPlatformConfig(
@ -130,17 +142,13 @@ class CAR(Platforms):
], ],
specs=CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), specs=CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0),
) )
MUSTANG_MACH_E_MK1 = FordPlatformConfig( MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig(
"FORD MUSTANG MACH-E 1ST GEN", "FORD MUSTANG MACH-E 1ST GEN",
FordCarInfo("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0"), FordCarInfo("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0"),
dbc_dict=dbc_dict('ford_lincoln_base_pt', None),
specs=CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio specs=CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio
) )
CANFD_CAR = {CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1, CAR.MUSTANG_MACH_E_MK1}
DATA_IDENTIFIER_FORD_ASBUILT = 0xDE00 DATA_IDENTIFIER_FORD_ASBUILT = 0xDE00
ASBUILT_BLOCKS: list[tuple[int, list]] = [ ASBUILT_BLOCKS: list[tuple[int, list]] = [

Loading…
Cancel
Save