from dataclasses import dataclass, field from enum import StrEnum from cereal import car from openpilot.selfdrive.car import dbc_dict from openpilot.selfdrive.car.docs_definitions import CarHarness, CarInfo, CarParts from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries Ecu = car.CarParams.Ecu # Steer torque limits class CarControllerParams: STEER_MAX = 800 # theoretical max_steer 2047 STEER_DELTA_UP = 10 # torque increase per refresh STEER_DELTA_DOWN = 25 # torque decrease per refresh STEER_DRIVER_ALLOWANCE = 15 # allowed driver torque before start limiting STEER_DRIVER_MULTIPLIER = 1 # weight driver torque STEER_DRIVER_FACTOR = 1 # from dbc STEER_ERROR_MAX = 350 # max delta between torque cmd and torque motor STEER_STEP = 1 # 100 Hz def __init__(self, CP): pass class CAR(StrEnum): CX5 = "MAZDA CX-5" CX9 = "MAZDA CX-9" MAZDA3 = "MAZDA 3" MAZDA6 = "MAZDA 6" CX9_2021 = "MAZDA CX-9 2021" CX5_2022 = "MAZDA CX-5 2022" @dataclass class MazdaCarInfo(CarInfo): package: str = "All" car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.mazda])) CAR_INFO: dict[str, MazdaCarInfo | list[MazdaCarInfo]] = { CAR.CX5: MazdaCarInfo("Mazda CX-5 2017-21"), CAR.CX9: MazdaCarInfo("Mazda CX-9 2016-20"), CAR.MAZDA3: MazdaCarInfo("Mazda 3 2017-18"), CAR.MAZDA6: MazdaCarInfo("Mazda 6 2017-20"), CAR.CX9_2021: MazdaCarInfo("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4"), CAR.CX5_2022: MazdaCarInfo("Mazda CX-5 2022-24"), } class LKAS_LIMITS: STEER_THRESHOLD = 15 DISABLE_SPEED = 45 # kph ENABLE_SPEED = 52 # kph class Buttons: NONE = 0 SET_PLUS = 1 SET_MINUS = 2 RESUME = 3 CANCEL = 4 FW_QUERY_CONFIG = FwQueryConfig( requests=[ # TODO: check data to ensure ABS does not skip ISO-TP frames on bus 0 Request( [StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], [StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], bus=0, ), ], ) DBC = { CAR.CX5: dbc_dict('mazda_2017', None), CAR.CX9: dbc_dict('mazda_2017', None), CAR.MAZDA3: dbc_dict('mazda_2017', None), CAR.MAZDA6: dbc_dict('mazda_2017', None), CAR.CX9_2021: dbc_dict('mazda_2017', None), CAR.CX5_2022: dbc_dict('mazda_2017', None), } # Gen 1 hardware: same CAN messages and same camera GEN1 = {CAR.CX5, CAR.CX9, CAR.CX9_2021, CAR.MAZDA3, CAR.MAZDA6, CAR.CX5_2022}