diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 3ad39d715f..c3ebb3edfa 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -2,11 +2,12 @@ from collections import defaultdict from dataclasses import dataclass from enum import Enum, StrEnum +import panda.python.uds as uds from cereal import car from openpilot.selfdrive.car import AngleRateLimit, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ Device -from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries +from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, p16, Request, StdQueries Ecu = car.CarParams.Ecu @@ -120,6 +121,16 @@ CAR_INFO: dict[str, CarInfo | list[CarInfo]] = { ], } + +DATA_IDENTIFIER_FORD_ASBUILT = 0xDE + +def ford_asbuilt_block_request(block_id: int): + return bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + p16(DATA_IDENTIFIER_FORD_ASBUILT + block_id - 1) + +def ford_asbuilt_block_response(block_id: int): + return bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + p16(DATA_IDENTIFIER_FORD_ASBUILT + block_id - 1) + + FW_QUERY_CONFIG = FwQueryConfig( requests=[ # CAN and CAN FD queries are combined. @@ -135,10 +146,70 @@ FW_QUERY_CONFIG = FwQueryConfig( bus=0, auxiliary=True, ), + # Ecu.abs: Wheel Base (response[0] & 0xF0), Payload (response[0] & 0xF), + # Steering Gear (response[1] & 0b11), Cruise Control Mode (response[5] & 0xF) + # Ecu.eps: Lane Keeping Aid (LKA) (response[6] & 0xFF), Traffic Jam Assist (TJA) (response[7] & 0xFF), + # Lane Centering Assist (LCA) (response[8] & 0xFF) + Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(1)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(1)], + whitelist_ecus=[Ecu.abs, Ecu.eps], + logging=True, + ), + # Ecu.abs: Stop and Go (response[0] & 0x80) + Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(2)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(2)], + whitelist_ecus=[Ecu.abs], + logging=True, + ), + # Ecu.debug: Wheel Base (response[4:6] & 0xFFFF) + Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(4)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(4)], + whitelist_ecus=[Ecu.debug], + logging=True, + ), + # Ecu.debug: Wheel Base (response[4:6] & 0xFFFF) + Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(5)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(5)], + whitelist_ecus=[Ecu.debug], + logging=True, + ), + # Ecu.debug: Vehicle Weight (response[0] & 0xFF) + Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(6)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(6)], + whitelist_ecus=[Ecu.debug], + logging=True, + ), + # Ecu.debug: Steering Gear Ratio (response[22] & 0x10) + Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(8)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(8)], + whitelist_ecus=[Ecu.debug], + logging=True, + ), + # Ecu.fwdCamera: VehicleCfg_SteeringRatio (response[1:3] & 0xFFF0) + Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(17)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(17)], + whitelist_ecus=[Ecu.fwdCamera], + logging=True, + ), + # Ecu.fwdCamera: VehicleCfg_Wheelbase (response[2:4] & 0xFFFF) + Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(20)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(20)], + whitelist_ecus=[Ecu.fwdCamera], + logging=True, + ), ], extra_ecus=[ - # We are unlikely to get a response from the PCM from behind the gateway - (Ecu.engine, 0x7e0, None), - (Ecu.shiftByWire, 0x732, None), + (Ecu.engine, 0x7e0, None), # Powertrain Control Module + # Note: We are unlikely to get a response from behind the gateway + (Ecu.shiftByWire, 0x732, None), # Gear Shift Module + (Ecu.debug, 0x7d0, None), # Accessory Protocol Interface Module ], )