rename CarInfo to CarDocs (#31879)

car info to car docs
pull/31881/head
Justin Newberry 1 year ago committed by GitHub
parent 824782d637
commit 655e5f7c3e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      .github/PULL_REQUEST_TEMPLATE/car_port.md
  2. 2
      .github/pull_request_template.md
  3. 4
      selfdrive/car/__init__.py
  4. 4
      selfdrive/car/body/values.py
  5. 28
      selfdrive/car/chrysler/values.py
  6. 12
      selfdrive/car/docs.py
  7. 6
      selfdrive/car/docs_definitions.py
  8. 46
      selfdrive/car/ford/values.py
  9. 36
      selfdrive/car/gm/values.py
  10. 52
      selfdrive/car/honda/values.py
  11. 186
      selfdrive/car/hyundai/values.py
  12. 16
      selfdrive/car/mazda/values.py
  13. 12
      selfdrive/car/nissan/values.py
  14. 42
      selfdrive/car/subaru/values.py
  15. 8
      selfdrive/car/tesla/values.py
  16. 2
      selfdrive/car/tests/test_docs.py
  17. 136
      selfdrive/car/toyota/values.py
  18. 120
      selfdrive/car/volkswagen/values.py

@ -8,7 +8,7 @@ assignees: ''
**Checklist** **Checklist**
- [ ] added entry to CarInfo in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs - [ ] added entry to CAR in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs
- [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py) - [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py)
- [ ] route with openpilot: - [ ] route with openpilot:
- [ ] route with stock system: - [ ] route with stock system:

@ -44,7 +44,7 @@ Explain how you tested this bug fix.
**Checklist** **Checklist**
- [ ] added entry to CarInfo in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs - [ ] added entry to CAR in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs
- [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py) - [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py)
- [ ] route with openpilot: - [ ] route with openpilot:
- [ ] route with stock system: - [ ] route with stock system:

@ -9,7 +9,7 @@ import capnp
from cereal import car from cereal import car
from openpilot.common.numpy_fast import clip, interp from openpilot.common.numpy_fast import clip, interp
from openpilot.common.utils import Freezable from openpilot.common.utils import Freezable
from openpilot.selfdrive.car.docs_definitions import CarInfo from openpilot.selfdrive.car.docs_definitions import CarDocs
# kg of standard extra cargo to count for drive, gas, etc... # kg of standard extra cargo to count for drive, gas, etc...
@ -262,7 +262,7 @@ class CarSpecs:
@dataclass(order=True) @dataclass(order=True)
class PlatformConfig(Freezable): class PlatformConfig(Freezable):
platform_str: str platform_str: str
car_info: list[CarInfo] car_info: list[CarDocs]
specs: CarSpecs specs: CarSpecs
dbc_dict: DbcDict dbc_dict: DbcDict

@ -1,6 +1,6 @@
from cereal import car from cereal import car
from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms, dbc_dict
from openpilot.selfdrive.car.docs_definitions import CarInfo from openpilot.selfdrive.car.docs_definitions import CarDocs
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -22,7 +22,7 @@ class CarControllerParams:
class CAR(Platforms): class CAR(Platforms):
BODY = PlatformConfig( BODY = PlatformConfig(
"COMMA BODY", "COMMA BODY",
[CarInfo("comma body", package="All")], [CarDocs("comma body", package="All")],
CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44), CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44),
dbc_dict('comma_body', None), dbc_dict('comma_body', None),
) )

@ -4,7 +4,7 @@ from dataclasses import dataclass, field
from cereal import car from cereal import car
from panda.python import uds from panda.python import uds
from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict
from openpilot.selfdrive.car.docs_definitions import CarHarness, CarInfo, CarParts from openpilot.selfdrive.car.docs_definitions import CarHarness, CarDocs, CarParts
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -15,7 +15,7 @@ class ChryslerFlags(IntFlag):
HIGHER_MIN_STEERING_SPEED = 1 HIGHER_MIN_STEERING_SPEED = 1
@dataclass @dataclass
class ChryslerCarInfo(CarInfo): class ChryslerCarDocs(CarDocs):
package: str = "Adaptive Cruise Control (ACC)" package: str = "Adaptive Cruise Control (ACC)"
car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca])) car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca]))
@ -34,29 +34,29 @@ class CAR(Platforms):
# Chrysler # Chrysler
PACIFICA_2017_HYBRID = ChryslerPlatformConfig( PACIFICA_2017_HYBRID = ChryslerPlatformConfig(
"CHRYSLER PACIFICA HYBRID 2017", "CHRYSLER PACIFICA HYBRID 2017",
[ChryslerCarInfo("Chrysler Pacifica Hybrid 2017")], [ChryslerCarDocs("Chrysler Pacifica Hybrid 2017")],
ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2), ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2),
) )
PACIFICA_2018_HYBRID = ChryslerPlatformConfig( PACIFICA_2018_HYBRID = ChryslerPlatformConfig(
"CHRYSLER PACIFICA HYBRID 2018", "CHRYSLER PACIFICA HYBRID 2018",
[ChryslerCarInfo("Chrysler Pacifica Hybrid 2018")], [ChryslerCarDocs("Chrysler Pacifica Hybrid 2018")],
PACIFICA_2017_HYBRID.specs, PACIFICA_2017_HYBRID.specs,
) )
PACIFICA_2019_HYBRID = ChryslerPlatformConfig( PACIFICA_2019_HYBRID = ChryslerPlatformConfig(
"CHRYSLER PACIFICA HYBRID 2019", "CHRYSLER PACIFICA HYBRID 2019",
[ChryslerCarInfo("Chrysler Pacifica Hybrid 2019-23")], [ChryslerCarDocs("Chrysler Pacifica Hybrid 2019-23")],
PACIFICA_2017_HYBRID.specs, PACIFICA_2017_HYBRID.specs,
) )
PACIFICA_2018 = ChryslerPlatformConfig( PACIFICA_2018 = ChryslerPlatformConfig(
"CHRYSLER PACIFICA 2018", "CHRYSLER PACIFICA 2018",
[ChryslerCarInfo("Chrysler Pacifica 2017-18")], [ChryslerCarDocs("Chrysler Pacifica 2017-18")],
PACIFICA_2017_HYBRID.specs, PACIFICA_2017_HYBRID.specs,
) )
PACIFICA_2020 = ChryslerPlatformConfig( PACIFICA_2020 = ChryslerPlatformConfig(
"CHRYSLER PACIFICA 2020", "CHRYSLER PACIFICA 2020",
[ [
ChryslerCarInfo("Chrysler Pacifica 2019-20"), ChryslerCarDocs("Chrysler Pacifica 2019-20"),
ChryslerCarInfo("Chrysler Pacifica 2021-23", package="All"), ChryslerCarDocs("Chrysler Pacifica 2021-23", package="All"),
], ],
PACIFICA_2017_HYBRID.specs, PACIFICA_2017_HYBRID.specs,
) )
@ -64,35 +64,35 @@ class CAR(Platforms):
# Dodge # Dodge
DODGE_DURANGO = ChryslerPlatformConfig( DODGE_DURANGO = ChryslerPlatformConfig(
"DODGE DURANGO 2021", "DODGE DURANGO 2021",
[ChryslerCarInfo("Dodge Durango 2020-21")], [ChryslerCarDocs("Dodge Durango 2020-21")],
PACIFICA_2017_HYBRID.specs, PACIFICA_2017_HYBRID.specs,
) )
# Jeep # Jeep
JEEP_GRAND_CHEROKEE = ChryslerPlatformConfig( # includes 2017 Trailhawk JEEP_GRAND_CHEROKEE = ChryslerPlatformConfig( # includes 2017 Trailhawk
"JEEP GRAND CHEROKEE V6 2018", "JEEP GRAND CHEROKEE V6 2018",
[ChryslerCarInfo("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk")], [ChryslerCarDocs("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk")],
ChryslerCarSpecs(mass=1778., wheelbase=2.71, steerRatio=16.7), ChryslerCarSpecs(mass=1778., wheelbase=2.71, steerRatio=16.7),
) )
JEEP_GRAND_CHEROKEE_2019 = ChryslerPlatformConfig( # includes 2020 Trailhawk JEEP_GRAND_CHEROKEE_2019 = ChryslerPlatformConfig( # includes 2020 Trailhawk
"JEEP GRAND CHEROKEE 2019", "JEEP GRAND CHEROKEE 2019",
[ChryslerCarInfo("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4")], [ChryslerCarDocs("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4")],
JEEP_GRAND_CHEROKEE.specs, JEEP_GRAND_CHEROKEE.specs,
) )
# Ram # Ram
RAM_1500 = ChryslerPlatformConfig( RAM_1500 = ChryslerPlatformConfig(
"RAM 1500 5TH GEN", "RAM 1500 5TH GEN",
[ChryslerCarInfo("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram]))], [ChryslerCarDocs("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram]))],
ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5), ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5),
dbc_dict('chrysler_ram_dt_generated', None), dbc_dict('chrysler_ram_dt_generated', None),
) )
RAM_HD = ChryslerPlatformConfig( RAM_HD = ChryslerPlatformConfig(
"RAM HD 5TH GEN", "RAM HD 5TH GEN",
[ [
ChryslerCarInfo("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), ChryslerCarDocs("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])),
ChryslerCarInfo("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])), ChryslerCarDocs("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])),
], ],
ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16.), ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16.),
dbc_dict('chrysler_ram_hd_generated', None), dbc_dict('chrysler_ram_hd_generated', None),

@ -9,7 +9,7 @@ from natsort import natsorted
from cereal import car from cereal import car
from openpilot.common.basedir import BASEDIR from openpilot.common.basedir import BASEDIR
from openpilot.selfdrive.car import gen_empty_fingerprint from openpilot.selfdrive.car import gen_empty_fingerprint
from openpilot.selfdrive.car.docs_definitions import CarInfo, Column, CommonFootnote, PartType from openpilot.selfdrive.car.docs_definitions import CarDocs, Column, CommonFootnote, PartType
from openpilot.selfdrive.car.car_helpers import interfaces, get_interface_attr from openpilot.selfdrive.car.car_helpers import interfaces, get_interface_attr
from openpilot.selfdrive.car.values import PLATFORMS from openpilot.selfdrive.car.values import PLATFORMS
@ -25,8 +25,8 @@ CARS_MD_OUT = os.path.join(BASEDIR, "docs", "CARS.md")
CARS_MD_TEMPLATE = os.path.join(BASEDIR, "selfdrive", "car", "CARS_template.md") CARS_MD_TEMPLATE = os.path.join(BASEDIR, "selfdrive", "car", "CARS_template.md")
def get_all_car_info() -> list[CarInfo]: def get_all_car_info() -> list[CarDocs]:
all_car_info: list[CarInfo] = [] all_car_info: list[CarDocs] = []
footnotes = get_all_footnotes() footnotes = get_all_footnotes()
for model, platform in PLATFORMS.items(): for model, platform in PLATFORMS.items():
car_info = platform.config.car_info car_info = platform.config.car_info
@ -45,18 +45,18 @@ def get_all_car_info() -> list[CarInfo]:
all_car_info.append(_car_info) all_car_info.append(_car_info)
# Sort cars by make and model + year # Sort cars by make and model + year
sorted_cars: list[CarInfo] = natsorted(all_car_info, key=lambda car: car.name.lower()) sorted_cars: list[CarDocs] = natsorted(all_car_info, key=lambda car: car.name.lower())
return sorted_cars return sorted_cars
def group_by_make(all_car_info: list[CarInfo]) -> dict[str, list[CarInfo]]: def group_by_make(all_car_info: list[CarDocs]) -> dict[str, list[CarDocs]]:
sorted_car_info = defaultdict(list) sorted_car_info = defaultdict(list)
for car_info in all_car_info: for car_info in all_car_info:
sorted_car_info[car_info.make].append(car_info) sorted_car_info[car_info.make].append(car_info)
return dict(sorted_car_info) return dict(sorted_car_info)
def generate_cars_md(all_car_info: list[CarInfo], template_fn: str) -> str: def generate_cars_md(all_car_info: list[CarDocs], template_fn: str) -> str:
with open(template_fn) as f: with open(template_fn) as f:
template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True) template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True)

@ -220,7 +220,7 @@ def split_name(name: str) -> tuple[str, str, str]:
@dataclass @dataclass
class CarInfo: class CarDocs:
# make + model + model years # make + model + model years
name: str name: str
@ -266,7 +266,7 @@ class CarInfo:
# min steer & enable speed columns # min steer & enable speed columns
# TODO: set all the min steer speeds in carParams and remove this # TODO: set all the min steer speeds in carParams and remove this
if self.min_steer_speed is not None: if self.min_steer_speed is not None:
assert CP.minSteerSpeed == 0, f"{CP.carFingerprint}: Minimum steer speed set in both CarInfo and CarParams" assert CP.minSteerSpeed == 0, f"{CP.carFingerprint}: Minimum steer speed set in both CarDocs and CarParams"
else: else:
self.min_steer_speed = CP.minSteerSpeed self.min_steer_speed = CP.minSteerSpeed
@ -317,7 +317,7 @@ class CarInfo:
return self return self
def init_make(self, CP: car.CarParams): def init_make(self, CP: car.CarParams):
"""CarInfo subclasses can add make-specific logic for harness selection, footnotes, etc.""" """CarDocs subclasses can add make-specific logic for harness selection, footnotes, etc."""
def get_detail_sentence(self, CP): def get_detail_sentence(self, CP):
if not CP.notCar: if not CP.notCar:

@ -4,7 +4,7 @@ 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
from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, dbc_dict, DbcDict, PlatformConfig, Platforms from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, dbc_dict, DbcDict, PlatformConfig, Platforms
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, \
Device Device
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16
@ -58,7 +58,7 @@ class Footnote(Enum):
@dataclass @dataclass
class FordCarInfo(CarInfo): class FordCarDocs(CarDocs):
package: str = "Co-Pilot360 Assist+" package: str = "Co-Pilot360 Assist+"
def init_make(self, CP: car.CarParams): def init_make(self, CP: car.CarParams):
@ -86,65 +86,65 @@ class FordCANFDPlatformConfig(FordPlatformConfig):
class CAR(Platforms): class CAR(Platforms):
BRONCO_SPORT_MK1 = FordPlatformConfig( BRONCO_SPORT_MK1 = FordPlatformConfig(
"FORD BRONCO SPORT 1ST GEN", "FORD BRONCO SPORT 1ST GEN",
[FordCarInfo("Ford Bronco Sport 2021-23")], [FordCarDocs("Ford Bronco Sport 2021-23")],
CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7), CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7),
) )
ESCAPE_MK4 = FordPlatformConfig( ESCAPE_MK4 = FordPlatformConfig(
"FORD ESCAPE 4TH GEN", "FORD ESCAPE 4TH GEN",
[ [
FordCarInfo("Ford Escape 2020-22"), FordCarDocs("Ford Escape 2020-22"),
FordCarInfo("Ford Escape Hybrid 2020-22"), FordCarDocs("Ford Escape Hybrid 2020-22"),
FordCarInfo("Ford Escape Plug-in Hybrid 2020-22"), FordCarDocs("Ford Escape Plug-in Hybrid 2020-22"),
FordCarInfo("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering"), FordCarDocs("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering"),
FordCarInfo("Ford Kuga Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), FordCarDocs("Ford Kuga Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"),
FordCarInfo("Ford Kuga Plug-in Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), FordCarDocs("Ford Kuga Plug-in Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"),
], ],
CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7),
) )
EXPLORER_MK6 = FordPlatformConfig( EXPLORER_MK6 = FordPlatformConfig(
"FORD EXPLORER 6TH GEN", "FORD EXPLORER 6TH GEN",
[ [
FordCarInfo("Ford Explorer 2020-23"), FordCarDocs("Ford Explorer 2020-23"),
FordCarInfo("Ford Explorer Hybrid 2020-23"), # Limited and Platinum only FordCarDocs("Ford Explorer Hybrid 2020-23"), # Limited and Platinum only
FordCarInfo("Lincoln Aviator 2020-23", "Co-Pilot360 Plus"), FordCarDocs("Lincoln Aviator 2020-23", "Co-Pilot360 Plus"),
FordCarInfo("Lincoln Aviator Plug-in Hybrid 2020-23", "Co-Pilot360 Plus"), # Grand Touring only FordCarDocs("Lincoln Aviator Plug-in Hybrid 2020-23", "Co-Pilot360 Plus"), # Grand Touring only
], ],
CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8),
) )
F_150_MK14 = FordCANFDPlatformConfig( F_150_MK14 = FordCANFDPlatformConfig(
"FORD F-150 14TH GEN", "FORD F-150 14TH GEN",
[ [
FordCarInfo("Ford F-150 2022-23", "Co-Pilot360 Active 2.0"), FordCarDocs("Ford F-150 2022-23", "Co-Pilot360 Active 2.0"),
FordCarInfo("Ford F-150 Hybrid 2022-23", "Co-Pilot360 Active 2.0"), FordCarDocs("Ford F-150 Hybrid 2022-23", "Co-Pilot360 Active 2.0"),
], ],
CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0),
) )
F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( 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")], [FordCarDocs("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0")],
CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9),
) )
FOCUS_MK4 = FordPlatformConfig( FOCUS_MK4 = FordPlatformConfig(
"FORD FOCUS 4TH GEN", "FORD FOCUS 4TH GEN",
[ [
FordCarInfo("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]),
FordCarInfo("Ford Focus Hybrid 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), # mHEV only FordCarDocs("Ford Focus Hybrid 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), # mHEV only
], ],
CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0), CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0),
) )
MAVERICK_MK1 = FordPlatformConfig( MAVERICK_MK1 = FordPlatformConfig(
"FORD MAVERICK 1ST GEN", "FORD MAVERICK 1ST GEN",
[ [
FordCarInfo("Ford Maverick 2022", "LARIAT Luxury"), FordCarDocs("Ford Maverick 2022", "LARIAT Luxury"),
FordCarInfo("Ford Maverick Hybrid 2022", "LARIAT Luxury"), FordCarDocs("Ford Maverick Hybrid 2022", "LARIAT Luxury"),
FordCarInfo("Ford Maverick 2023-24", "Co-Pilot360 Assist"), FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist"),
FordCarInfo("Ford Maverick Hybrid 2023-24", "Co-Pilot360 Assist"), FordCarDocs("Ford Maverick Hybrid 2023-24", "Co-Pilot360 Assist"),
], ],
CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0),
) )
MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig( 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")], [FordCarDocs("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0")],
CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio
) )

@ -3,7 +3,7 @@ from enum import Enum
from cereal import car from cereal import car
from openpilot.selfdrive.car import dbc_dict, PlatformConfig, DbcDict, Platforms, CarSpecs from openpilot.selfdrive.car import dbc_dict, PlatformConfig, DbcDict, Platforms, CarSpecs
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -68,7 +68,7 @@ class Footnote(Enum):
@dataclass @dataclass
class GMCarInfo(CarInfo): class GMCarDocs(CarDocs):
package: str = "Adaptive Cruise Control (ACC)" package: str = "Adaptive Cruise Control (ACC)"
def init_make(self, CP: car.CarParams): def init_make(self, CP: car.CarParams):
@ -92,78 +92,78 @@ class GMPlatformConfig(PlatformConfig):
class CAR(Platforms): class CAR(Platforms):
HOLDEN_ASTRA = GMPlatformConfig( HOLDEN_ASTRA = GMPlatformConfig(
"HOLDEN ASTRA RS-V BK 2017", "HOLDEN ASTRA RS-V BK 2017",
[GMCarInfo("Holden Astra 2017")], [GMCarDocs("Holden Astra 2017")],
GMCarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4), GMCarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4),
) )
VOLT = GMPlatformConfig( VOLT = GMPlatformConfig(
"CHEVROLET VOLT PREMIER 2017", "CHEVROLET VOLT PREMIER 2017",
[GMCarInfo("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ")], [GMCarDocs("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ")],
GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469), GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469),
) )
CADILLAC_ATS = GMPlatformConfig( CADILLAC_ATS = GMPlatformConfig(
"CADILLAC ATS Premium Performance 2018", "CADILLAC ATS Premium Performance 2018",
[GMCarInfo("Cadillac ATS Premium Performance 2018")], [GMCarDocs("Cadillac ATS Premium Performance 2018")],
GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3),
) )
MALIBU = GMPlatformConfig( MALIBU = GMPlatformConfig(
"CHEVROLET MALIBU PREMIER 2017", "CHEVROLET MALIBU PREMIER 2017",
[GMCarInfo("Chevrolet Malibu Premier 2017")], [GMCarDocs("Chevrolet Malibu Premier 2017")],
GMCarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4), GMCarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4),
) )
ACADIA = GMPlatformConfig( ACADIA = GMPlatformConfig(
"GMC ACADIA DENALI 2018", "GMC ACADIA DENALI 2018",
[GMCarInfo("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo")], [GMCarDocs("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo")],
GMCarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4), GMCarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4),
) )
BUICK_LACROSSE = GMPlatformConfig( BUICK_LACROSSE = GMPlatformConfig(
"BUICK LACROSSE 2017", "BUICK LACROSSE 2017",
[GMCarInfo("Buick LaCrosse 2017-19", "Driver Confidence Package 2")], [GMCarDocs("Buick LaCrosse 2017-19", "Driver Confidence Package 2")],
GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4),
) )
BUICK_REGAL = GMPlatformConfig( BUICK_REGAL = GMPlatformConfig(
"BUICK REGAL ESSENCE 2018", "BUICK REGAL ESSENCE 2018",
[GMCarInfo("Buick Regal Essence 2018")], [GMCarDocs("Buick Regal Essence 2018")],
GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4),
) )
ESCALADE = GMPlatformConfig( ESCALADE = GMPlatformConfig(
"CADILLAC ESCALADE 2017", "CADILLAC ESCALADE 2017",
[GMCarInfo("Cadillac Escalade 2017", "Driver Assist Package")], [GMCarDocs("Cadillac Escalade 2017", "Driver Assist Package")],
GMCarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3), GMCarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3),
) )
ESCALADE_ESV = GMPlatformConfig( ESCALADE_ESV = GMPlatformConfig(
"CADILLAC ESCALADE ESV 2016", "CADILLAC ESCALADE ESV 2016",
[GMCarInfo("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")], [GMCarDocs("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")],
GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0), GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0),
) )
ESCALADE_ESV_2019 = GMPlatformConfig( ESCALADE_ESV_2019 = GMPlatformConfig(
"CADILLAC ESCALADE ESV 2019", "CADILLAC ESCALADE ESV 2019",
[GMCarInfo("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")], [GMCarDocs("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")],
ESCALADE_ESV.specs, ESCALADE_ESV.specs,
) )
BOLT_EUV = GMPlatformConfig( BOLT_EUV = GMPlatformConfig(
"CHEVROLET BOLT EUV 2022", "CHEVROLET BOLT EUV 2022",
[ [
GMCarInfo("Chevrolet Bolt EUV 2022-23", "Premier or Premier Redline Trim without Super Cruise Package", video_link="https://youtu.be/xvwzGMUA210"), GMCarDocs("Chevrolet Bolt EUV 2022-23", "Premier or Premier Redline Trim without Super Cruise Package", video_link="https://youtu.be/xvwzGMUA210"),
GMCarInfo("Chevrolet Bolt EV 2022-23", "2LT Trim with Adaptive Cruise Control Package"), GMCarDocs("Chevrolet Bolt EV 2022-23", "2LT Trim with Adaptive Cruise Control Package"),
], ],
GMCarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), GMCarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0),
) )
SILVERADO = GMPlatformConfig( SILVERADO = GMPlatformConfig(
"CHEVROLET SILVERADO 1500 2020", "CHEVROLET SILVERADO 1500 2020",
[ [
GMCarInfo("Chevrolet Silverado 1500 2020-21", "Safety Package II"), GMCarDocs("Chevrolet Silverado 1500 2020-21", "Safety Package II"),
GMCarInfo("GMC Sierra 1500 2020-21", "Driver Alert Package II", video_link="https://youtu.be/5HbNoBLzRwE"), GMCarDocs("GMC Sierra 1500 2020-21", "Driver Alert Package II", video_link="https://youtu.be/5HbNoBLzRwE"),
], ],
GMCarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3, tireStiffnessFactor=1.0), GMCarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3, tireStiffnessFactor=1.0),
) )
EQUINOX = GMPlatformConfig( EQUINOX = GMPlatformConfig(
"CHEVROLET EQUINOX 2019", "CHEVROLET EQUINOX 2019",
[GMCarInfo("Chevrolet Equinox 2019-22")], [GMCarDocs("Chevrolet Equinox 2019-22")],
GMCarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), GMCarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4),
) )
TRAILBLAZER = GMPlatformConfig( TRAILBLAZER = GMPlatformConfig(
"CHEVROLET TRAILBLAZER 2021", "CHEVROLET TRAILBLAZER 2021",
[GMCarInfo("Chevrolet Trailblazer 2021-22")], [GMCarDocs("Chevrolet Trailblazer 2021-22")],
GMCarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), GMCarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0),
) )

@ -5,7 +5,7 @@ from cereal import car
from openpilot.common.conversions import Conversions as CV from openpilot.common.conversions import Conversions as CV
from panda.python import uds from panda.python import uds
from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms, dbc_dict
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -87,7 +87,7 @@ VISUAL_HUD = {
@dataclass @dataclass
class HondaCarInfo(CarInfo): class HondaCarDocs(CarDocs):
package: str = "Honda Sensing" package: str = "Honda Sensing"
def init_make(self, CP: car.CarParams): def init_make(self, CP: car.CarParams):
@ -118,9 +118,9 @@ class CAR(Platforms):
ACCORD = HondaBoschPlatformConfig( ACCORD = HondaBoschPlatformConfig(
"HONDA ACCORD 2018", "HONDA ACCORD 2018",
[ [
HondaCarInfo("Honda Accord 2018-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS), HondaCarDocs("Honda Accord 2018-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS),
HondaCarInfo("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS), HondaCarDocs("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS),
HondaCarInfo("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), HondaCarDocs("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS),
], ],
# steerRatio: 11.82 is spec end-to-end # steerRatio: 11.82 is spec end-to-end
CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39, tireStiffnessFactor=0.8467), CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39, tireStiffnessFactor=0.8467),
@ -129,9 +129,9 @@ class CAR(Platforms):
CIVIC_BOSCH = HondaBoschPlatformConfig( CIVIC_BOSCH = HondaBoschPlatformConfig(
"HONDA CIVIC (BOSCH) 2019", "HONDA CIVIC (BOSCH) 2019",
[ [
HondaCarInfo("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", HondaCarDocs("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8",
footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS), footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS),
HondaCarInfo("Honda Civic Hatchback 2017-21", min_steer_speed=12. * CV.MPH_TO_MS), HondaCarDocs("Honda Civic Hatchback 2017-21", min_steer_speed=12. * CV.MPH_TO_MS),
], ],
CarSpecs(mass=1326, wheelbase=2.7, steerRatio=15.38, centerToFrontRatio=0.4), # steerRatio: 10.93 is end-to-end spec CarSpecs(mass=1326, wheelbase=2.7, steerRatio=15.38, centerToFrontRatio=0.4), # steerRatio: 10.93 is end-to-end spec
dbc_dict('honda_civic_hatchback_ex_2017_can_generated', None), dbc_dict('honda_civic_hatchback_ex_2017_can_generated', None),
@ -145,8 +145,8 @@ class CAR(Platforms):
CIVIC_2022 = HondaBoschPlatformConfig( CIVIC_2022 = HondaBoschPlatformConfig(
"HONDA CIVIC 2022", "HONDA CIVIC 2022",
[ [
HondaCarInfo("Honda Civic 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), HondaCarDocs("Honda Civic 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"),
HondaCarInfo("Honda Civic Hatchback 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), HondaCarDocs("Honda Civic Hatchback 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"),
], ],
CIVIC_BOSCH.specs, CIVIC_BOSCH.specs,
dbc_dict('honda_civic_ex_2022_can_generated', None), dbc_dict('honda_civic_ex_2022_can_generated', None),
@ -154,7 +154,7 @@ class CAR(Platforms):
) )
CRV_5G = HondaBoschPlatformConfig( CRV_5G = HondaBoschPlatformConfig(
"HONDA CR-V 2017", "HONDA CR-V 2017",
[HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS)], [HondaCarDocs("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS)],
# steerRatio: 12.3 is spec end-to-end # steerRatio: 12.3 is spec end-to-end
CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41, tireStiffnessFactor=0.677),
dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'),
@ -162,34 +162,34 @@ class CAR(Platforms):
) )
CRV_HYBRID = HondaBoschPlatformConfig( CRV_HYBRID = HondaBoschPlatformConfig(
"HONDA CR-V HYBRID 2019", "HONDA CR-V HYBRID 2019",
[HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS)], [HondaCarDocs("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS)],
# mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end
CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41, tireStiffnessFactor=0.677),
dbc_dict('honda_accord_2018_can_generated', None), dbc_dict('honda_accord_2018_can_generated', None),
) )
HRV_3G = HondaBoschPlatformConfig( HRV_3G = HondaBoschPlatformConfig(
"HONDA HR-V 2023", "HONDA HR-V 2023",
[HondaCarInfo("Honda HR-V 2023", "All")], [HondaCarDocs("Honda HR-V 2023", "All")],
CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41, tireStiffnessFactor=0.5), CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41, tireStiffnessFactor=0.5),
dbc_dict('honda_civic_ex_2022_can_generated', None), dbc_dict('honda_civic_ex_2022_can_generated', None),
flags=HondaFlags.BOSCH_RADARLESS | HondaFlags.BOSCH_ALT_BRAKE, flags=HondaFlags.BOSCH_RADARLESS | HondaFlags.BOSCH_ALT_BRAKE,
) )
ACURA_RDX_3G = HondaBoschPlatformConfig( ACURA_RDX_3G = HondaBoschPlatformConfig(
"ACURA RDX 2020", "ACURA RDX 2020",
[HondaCarInfo("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], [HondaCarDocs("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)],
CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), # as spec CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), # as spec
dbc_dict('acura_rdx_2020_can_generated', None), dbc_dict('acura_rdx_2020_can_generated', None),
flags=HondaFlags.BOSCH_ALT_BRAKE, flags=HondaFlags.BOSCH_ALT_BRAKE,
) )
INSIGHT = HondaBoschPlatformConfig( INSIGHT = HondaBoschPlatformConfig(
"HONDA INSIGHT 2019", "HONDA INSIGHT 2019",
[HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], [HondaCarDocs("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)],
CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39, tireStiffnessFactor=0.82), # as spec CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39, tireStiffnessFactor=0.82), # as spec
dbc_dict('honda_insight_ex_2019_can_generated', None), dbc_dict('honda_insight_ex_2019_can_generated', None),
) )
HONDA_E = HondaBoschPlatformConfig( HONDA_E = HondaBoschPlatformConfig(
"HONDA E 2020", "HONDA E 2020",
[HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS)], [HondaCarDocs("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS)],
CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71, tireStiffnessFactor=0.82), CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71, tireStiffnessFactor=0.82),
dbc_dict('acura_rdx_2020_can_generated', None), dbc_dict('acura_rdx_2020_can_generated', None),
) )
@ -197,14 +197,14 @@ class CAR(Platforms):
# Nidec Cars # Nidec Cars
ACURA_ILX = HondaNidecPlatformConfig( ACURA_ILX = HondaNidecPlatformConfig(
"ACURA ILX 2016", "ACURA ILX 2016",
[HondaCarInfo("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS)], [HondaCarDocs("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS)],
CarSpecs(mass=3095 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=18.61, centerToFrontRatio=0.37, tireStiffnessFactor=0.72), # 15.3 is spec end-to-end CarSpecs(mass=3095 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=18.61, centerToFrontRatio=0.37, tireStiffnessFactor=0.72), # 15.3 is spec end-to-end
dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'),
flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
) )
CRV = HondaNidecPlatformConfig( CRV = HondaNidecPlatformConfig(
"HONDA CR-V 2016", "HONDA CR-V 2016",
[HondaCarInfo("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS)], [HondaCarDocs("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS)],
CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41, tireStiffnessFactor=0.444), # as spec CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41, tireStiffnessFactor=0.444), # as spec
dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'),
flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
@ -218,28 +218,28 @@ class CAR(Platforms):
) )
FIT = HondaNidecPlatformConfig( FIT = HondaNidecPlatformConfig(
"HONDA FIT 2018", "HONDA FIT 2018",
[HondaCarInfo("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS)], [HondaCarDocs("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS)],
CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75),
dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'),
flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
) )
FREED = HondaNidecPlatformConfig( FREED = HondaNidecPlatformConfig(
"HONDA FREED 2020", "HONDA FREED 2020",
[HondaCarInfo("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS)], [HondaCarDocs("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS)],
CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), # mostly copied from FIT CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), # mostly copied from FIT
dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'),
flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
) )
HRV = HondaNidecPlatformConfig( HRV = HondaNidecPlatformConfig(
"HONDA HRV 2019", "HONDA HRV 2019",
[HondaCarInfo("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS)], [HondaCarDocs("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS)],
HRV_3G.specs, HRV_3G.specs,
dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'),
flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
) )
ODYSSEY = HondaNidecPlatformConfig( ODYSSEY = HondaNidecPlatformConfig(
"HONDA ODYSSEY 2018", "HONDA ODYSSEY 2018",
[HondaCarInfo("Honda Odyssey 2018-20")], [HondaCarDocs("Honda Odyssey 2018-20")],
CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41, tireStiffnessFactor=0.82), CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41, tireStiffnessFactor=0.82),
dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'),
flags=HondaFlags.NIDEC_ALT_PCM_ACCEL, flags=HondaFlags.NIDEC_ALT_PCM_ACCEL,
@ -253,7 +253,7 @@ class CAR(Platforms):
) )
ACURA_RDX = HondaNidecPlatformConfig( ACURA_RDX = HondaNidecPlatformConfig(
"ACURA RDX 2018", "ACURA RDX 2018",
[HondaCarInfo("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS)], [HondaCarDocs("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS)],
CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38, tireStiffnessFactor=0.444), # as spec CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38, tireStiffnessFactor=0.444), # as spec
dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'),
flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
@ -261,8 +261,8 @@ class CAR(Platforms):
PILOT = HondaNidecPlatformConfig( PILOT = HondaNidecPlatformConfig(
"HONDA PILOT 2017", "HONDA PILOT 2017",
[ [
HondaCarInfo("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS), HondaCarDocs("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS),
HondaCarInfo("Honda Passport 2019-23", "All", min_steer_speed=12. * CV.MPH_TO_MS), HondaCarDocs("Honda Passport 2019-23", "All", min_steer_speed=12. * CV.MPH_TO_MS),
], ],
CarSpecs(mass=4278 * CV.LB_TO_KG, wheelbase=2.86, centerToFrontRatio=0.428, steerRatio=16.0, tireStiffnessFactor=0.444), # as spec CarSpecs(mass=4278 * CV.LB_TO_KG, wheelbase=2.86, centerToFrontRatio=0.428, steerRatio=16.0, tireStiffnessFactor=0.444), # as spec
dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'),
@ -270,14 +270,14 @@ class CAR(Platforms):
) )
RIDGELINE = HondaNidecPlatformConfig( RIDGELINE = HondaNidecPlatformConfig(
"HONDA RIDGELINE 2017", "HONDA RIDGELINE 2017",
[HondaCarInfo("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS)], [HondaCarDocs("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS)],
CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59, tireStiffnessFactor=0.444), # as spec CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59, tireStiffnessFactor=0.444), # as spec
dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'),
flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
) )
CIVIC = HondaNidecPlatformConfig( CIVIC = HondaNidecPlatformConfig(
"HONDA CIVIC 2016", "HONDA CIVIC 2016",
[HondaCarInfo("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE")], [HondaCarDocs("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE")],
CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec
dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'), dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'),
) )

@ -6,7 +6,7 @@ from cereal import car
from panda.python import uds from panda.python import uds
from openpilot.common.conversions import Conversions as CV from openpilot.common.conversions import Conversions as CV
from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -104,7 +104,7 @@ class Footnote(Enum):
@dataclass @dataclass
class HyundaiCarInfo(CarInfo): class HyundaiCarDocs(CarDocs):
package: str = "Smart Cruise Control (SCC)" package: str = "Smart Cruise Control (SCC)"
def init_make(self, CP: car.CarParams): def init_make(self, CP: car.CarParams):
@ -136,14 +136,14 @@ class CAR(Platforms):
# Hyundai # Hyundai
AZERA_6TH_GEN = HyundaiPlatformConfig( AZERA_6TH_GEN = HyundaiPlatformConfig(
"HYUNDAI AZERA 6TH GEN", "HYUNDAI AZERA 6TH GEN",
[HyundaiCarInfo("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], [HyundaiCarDocs("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5), CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5),
) )
AZERA_HEV_6TH_GEN = HyundaiPlatformConfig( AZERA_HEV_6TH_GEN = HyundaiPlatformConfig(
"HYUNDAI AZERA HYBRID 6TH GEN", "HYUNDAI AZERA HYBRID 6TH GEN",
[ [
HyundaiCarInfo("Hyundai Azera Hybrid 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), HyundaiCarDocs("Hyundai Azera Hybrid 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c])),
HyundaiCarInfo("Hyundai Azera Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), HyundaiCarDocs("Hyundai Azera Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_k])),
], ],
CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5), CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5),
flags=HyundaiFlags.HYBRID, flags=HyundaiFlags.HYBRID,
@ -152,8 +152,8 @@ class CAR(Platforms):
"HYUNDAI ELANTRA 2017", "HYUNDAI ELANTRA 2017",
[ [
# TODO: 2017-18 could be Hyundai G # TODO: 2017-18 could be Hyundai G
HyundaiCarInfo("Hyundai Elantra 2017-18", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b])), HyundaiCarDocs("Hyundai Elantra 2017-18", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b])),
HyundaiCarInfo("Hyundai Elantra 2019", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_g])), HyundaiCarDocs("Hyundai Elantra 2019", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_g])),
], ],
# steerRatio: 14 is Stock | Settled Params Learner values are steerRatio: 15.401566348670535, stiffnessFactor settled on 1.0081302973865127 # steerRatio: 14 is Stock | Settled Params Learner values are steerRatio: 15.401566348670535, stiffnessFactor settled on 1.0081302973865127
CarSpecs(mass=1275, wheelbase=2.7, steerRatio=15.4, tireStiffnessFactor=0.385), CarSpecs(mass=1275, wheelbase=2.7, steerRatio=15.4, tireStiffnessFactor=0.385),
@ -162,21 +162,21 @@ class CAR(Platforms):
ELANTRA_GT_I30 = HyundaiPlatformConfig( ELANTRA_GT_I30 = HyundaiPlatformConfig(
"HYUNDAI I30 N LINE 2019 & GT 2018 DCT", "HYUNDAI I30 N LINE 2019 & GT 2018 DCT",
[ [
HyundaiCarInfo("Hyundai Elantra GT 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), HyundaiCarDocs("Hyundai Elantra GT 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])),
HyundaiCarInfo("Hyundai i30 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), HyundaiCarDocs("Hyundai i30 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])),
], ],
ELANTRA.specs, ELANTRA.specs,
flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH, flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH,
) )
ELANTRA_2021 = HyundaiPlatformConfig( ELANTRA_2021 = HyundaiPlatformConfig(
"HYUNDAI ELANTRA 2021", "HYUNDAI ELANTRA 2021",
[HyundaiCarInfo("Hyundai Elantra 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], [HyundaiCarDocs("Hyundai Elantra 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))],
CarSpecs(mass=2800 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), CarSpecs(mass=2800 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65),
flags=HyundaiFlags.CHECKSUM_CRC8, flags=HyundaiFlags.CHECKSUM_CRC8,
) )
ELANTRA_HEV_2021 = HyundaiPlatformConfig( ELANTRA_HEV_2021 = HyundaiPlatformConfig(
"HYUNDAI ELANTRA HYBRID 2021", "HYUNDAI ELANTRA HYBRID 2021",
[HyundaiCarInfo("Hyundai Elantra Hybrid 2021-23", video_link="https://youtu.be/_EdYQtV52-c", [HyundaiCarDocs("Hyundai Elantra Hybrid 2021-23", video_link="https://youtu.be/_EdYQtV52-c",
car_parts=CarParts.common([CarHarness.hyundai_k]))], car_parts=CarParts.common([CarHarness.hyundai_k]))],
CarSpecs(mass=3017 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), CarSpecs(mass=3017 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65),
flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
@ -185,129 +185,129 @@ class CAR(Platforms):
"HYUNDAI GENESIS 2015-2016", "HYUNDAI GENESIS 2015-2016",
[ [
# TODO: check 2015 packages # TODO: check 2015 packages
HyundaiCarInfo("Hyundai Genesis 2015-16", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])), HyundaiCarDocs("Hyundai Genesis 2015-16", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])),
HyundaiCarInfo("Genesis G80 2017", "All", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])), HyundaiCarDocs("Genesis G80 2017", "All", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])),
], ],
CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5, minSteerSpeed=60 * CV.KPH_TO_MS), CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5, minSteerSpeed=60 * CV.KPH_TO_MS),
flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.LEGACY, flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.LEGACY,
) )
IONIQ = HyundaiPlatformConfig( IONIQ = HyundaiPlatformConfig(
"HYUNDAI IONIQ HYBRID 2017-2019", "HYUNDAI IONIQ HYBRID 2017-2019",
[HyundaiCarInfo("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))], [HyundaiCarDocs("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))],
CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH,
) )
IONIQ_HEV_2022 = HyundaiPlatformConfig( IONIQ_HEV_2022 = HyundaiPlatformConfig(
"HYUNDAI IONIQ HYBRID 2020-2022", "HYUNDAI IONIQ HYBRID 2020-2022",
[HyundaiCarInfo("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], # TODO: confirm 2020-21 harness, [HyundaiCarDocs("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], # TODO: confirm 2020-21 harness,
CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY,
) )
IONIQ_EV_LTD = HyundaiPlatformConfig( IONIQ_EV_LTD = HyundaiPlatformConfig(
"HYUNDAI IONIQ ELECTRIC LIMITED 2019", "HYUNDAI IONIQ ELECTRIC LIMITED 2019",
[HyundaiCarInfo("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], [HyundaiCarDocs("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))],
CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY | HyundaiFlags.MIN_STEER_32_MPH, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY | HyundaiFlags.MIN_STEER_32_MPH,
) )
IONIQ_EV_2020 = HyundaiPlatformConfig( IONIQ_EV_2020 = HyundaiPlatformConfig(
"HYUNDAI IONIQ ELECTRIC 2020", "HYUNDAI IONIQ ELECTRIC 2020",
[HyundaiCarInfo("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], [HyundaiCarDocs("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))],
CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
flags=HyundaiFlags.EV, flags=HyundaiFlags.EV,
) )
IONIQ_PHEV_2019 = HyundaiPlatformConfig( IONIQ_PHEV_2019 = HyundaiPlatformConfig(
"HYUNDAI IONIQ PLUG-IN HYBRID 2019", "HYUNDAI IONIQ PLUG-IN HYBRID 2019",
[HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))],
CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH,
) )
IONIQ_PHEV = HyundaiPlatformConfig( IONIQ_PHEV = HyundaiPlatformConfig(
"HYUNDAI IONIQ PHEV 2020", "HYUNDAI IONIQ PHEV 2020",
[HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))],
CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385),
flags=HyundaiFlags.HYBRID, flags=HyundaiFlags.HYBRID,
) )
KONA = HyundaiPlatformConfig( KONA = HyundaiPlatformConfig(
"HYUNDAI KONA 2020", "HYUNDAI KONA 2020",
[HyundaiCarInfo("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b]))], [HyundaiCarDocs("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b]))],
CarSpecs(mass=1275, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), CarSpecs(mass=1275, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385),
flags=HyundaiFlags.CLUSTER_GEARS, flags=HyundaiFlags.CLUSTER_GEARS,
) )
KONA_EV = HyundaiPlatformConfig( KONA_EV = HyundaiPlatformConfig(
"HYUNDAI KONA ELECTRIC 2019", "HYUNDAI KONA ELECTRIC 2019",
[HyundaiCarInfo("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))], [HyundaiCarDocs("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))],
CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385),
flags=HyundaiFlags.EV, flags=HyundaiFlags.EV,
) )
KONA_EV_2022 = HyundaiPlatformConfig( KONA_EV_2022 = HyundaiPlatformConfig(
"HYUNDAI KONA ELECTRIC 2022", "HYUNDAI KONA ELECTRIC 2022",
[HyundaiCarInfo("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))], [HyundaiCarDocs("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))],
CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385),
flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV, flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV,
) )
KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig( KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig(
"HYUNDAI KONA ELECTRIC 2ND GEN", "HYUNDAI KONA ELECTRIC 2ND GEN",
[HyundaiCarInfo("Hyundai Kona Electric (with HDA II, Korea only) 2023", video_link="https://www.youtube.com/watch?v=U2fOCmcQ8hw", [HyundaiCarDocs("Hyundai Kona Electric (with HDA II, Korea only) 2023", video_link="https://www.youtube.com/watch?v=U2fOCmcQ8hw",
car_parts=CarParts.common([CarHarness.hyundai_r]))], car_parts=CarParts.common([CarHarness.hyundai_r]))],
CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385), CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385),
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE,
) )
KONA_HEV = HyundaiPlatformConfig( KONA_HEV = HyundaiPlatformConfig(
"HYUNDAI KONA HYBRID 2020", "HYUNDAI KONA HYBRID 2020",
[HyundaiCarInfo("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages, [HyundaiCarDocs("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages,
CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385),
flags=HyundaiFlags.HYBRID, flags=HyundaiFlags.HYBRID,
) )
SANTA_FE = HyundaiPlatformConfig( SANTA_FE = HyundaiPlatformConfig(
"HYUNDAI SANTA FE 2019", "HYUNDAI SANTA FE 2019",
[HyundaiCarInfo("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s", [HyundaiCarDocs("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s",
car_parts=CarParts.common([CarHarness.hyundai_d]))], car_parts=CarParts.common([CarHarness.hyundai_d]))],
CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.766, steerRatio=16.55, tireStiffnessFactor=0.82), CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.766, steerRatio=16.55, tireStiffnessFactor=0.82),
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8,
) )
SANTA_FE_2022 = HyundaiPlatformConfig( SANTA_FE_2022 = HyundaiPlatformConfig(
"HYUNDAI SANTA FE 2022", "HYUNDAI SANTA FE 2022",
[HyundaiCarInfo("Hyundai Santa Fe 2021-23", "All", video_link="https://youtu.be/VnHzSTygTS4", [HyundaiCarDocs("Hyundai Santa Fe 2021-23", "All", video_link="https://youtu.be/VnHzSTygTS4",
car_parts=CarParts.common([CarHarness.hyundai_l]))], car_parts=CarParts.common([CarHarness.hyundai_l]))],
SANTA_FE.specs, SANTA_FE.specs,
flags=HyundaiFlags.CHECKSUM_CRC8, flags=HyundaiFlags.CHECKSUM_CRC8,
) )
SANTA_FE_HEV_2022 = HyundaiPlatformConfig( SANTA_FE_HEV_2022 = HyundaiPlatformConfig(
"HYUNDAI SANTA FE HYBRID 2022", "HYUNDAI SANTA FE HYBRID 2022",
[HyundaiCarInfo("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], [HyundaiCarDocs("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))],
SANTA_FE.specs, SANTA_FE.specs,
flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
) )
SANTA_FE_PHEV_2022 = HyundaiPlatformConfig( SANTA_FE_PHEV_2022 = HyundaiPlatformConfig(
"HYUNDAI SANTA FE PlUG-IN HYBRID 2022", "HYUNDAI SANTA FE PlUG-IN HYBRID 2022",
[HyundaiCarInfo("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], [HyundaiCarDocs("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))],
SANTA_FE.specs, SANTA_FE.specs,
flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
) )
SONATA = HyundaiPlatformConfig( SONATA = HyundaiPlatformConfig(
"HYUNDAI SONATA 2020", "HYUNDAI SONATA 2020",
[HyundaiCarInfo("Hyundai Sonata 2020-23", "All", video_link="https://www.youtube.com/watch?v=ix63r9kE3Fw", [HyundaiCarDocs("Hyundai Sonata 2020-23", "All", video_link="https://www.youtube.com/watch?v=ix63r9kE3Fw",
car_parts=CarParts.common([CarHarness.hyundai_a]))], car_parts=CarParts.common([CarHarness.hyundai_a]))],
CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8,
) )
SONATA_LF = HyundaiPlatformConfig( SONATA_LF = HyundaiPlatformConfig(
"HYUNDAI SONATA 2019", "HYUNDAI SONATA 2019",
[HyundaiCarInfo("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))], [HyundaiCarDocs("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))],
CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable
flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS,
) )
STARIA_4TH_GEN = HyundaiCanFDPlatformConfig( STARIA_4TH_GEN = HyundaiCanFDPlatformConfig(
"HYUNDAI STARIA 4TH GEN", "HYUNDAI STARIA 4TH GEN",
[HyundaiCarInfo("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], [HyundaiCarDocs("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
CarSpecs(mass=2205, wheelbase=3.273, steerRatio=11.94), # https://www.hyundai.com/content/dam/hyundai/au/en/models/staria-load/premium-pip-update-2023/spec-sheet/STARIA_Load_Spec-Table_March_2023_v3.1.pdf CarSpecs(mass=2205, wheelbase=3.273, steerRatio=11.94), # https://www.hyundai.com/content/dam/hyundai/au/en/models/staria-load/premium-pip-update-2023/spec-sheet/STARIA_Load_Spec-Table_March_2023_v3.1.pdf
) )
TUCSON = HyundaiPlatformConfig( TUCSON = HyundaiPlatformConfig(
"HYUNDAI TUCSON 2019", "HYUNDAI TUCSON 2019",
[ [
HyundaiCarInfo("Hyundai Tucson 2021", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_l])), HyundaiCarDocs("Hyundai Tucson 2021", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_l])),
HyundaiCarInfo("Hyundai Tucson Diesel 2019", car_parts=CarParts.common([CarHarness.hyundai_l])), HyundaiCarDocs("Hyundai Tucson Diesel 2019", car_parts=CarParts.common([CarHarness.hyundai_l])),
], ],
CarSpecs(mass=3520 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=16.1, tireStiffnessFactor=0.385), CarSpecs(mass=3520 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=16.1, tireStiffnessFactor=0.385),
flags=HyundaiFlags.TCU_GEARS, flags=HyundaiFlags.TCU_GEARS,
@ -315,58 +315,58 @@ class CAR(Platforms):
PALISADE = HyundaiPlatformConfig( PALISADE = HyundaiPlatformConfig(
"HYUNDAI PALISADE 2020", "HYUNDAI PALISADE 2020",
[ [
HyundaiCarInfo("Hyundai Palisade 2020-22", "All", video_link="https://youtu.be/TAnDqjF4fDY?t=456", car_parts=CarParts.common([CarHarness.hyundai_h])), HyundaiCarDocs("Hyundai Palisade 2020-22", "All", video_link="https://youtu.be/TAnDqjF4fDY?t=456", car_parts=CarParts.common([CarHarness.hyundai_h])),
HyundaiCarInfo("Kia Telluride 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), HyundaiCarDocs("Kia Telluride 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])),
], ],
CarSpecs(mass=1999, wheelbase=2.9, steerRatio=15.6 * 1.15, tireStiffnessFactor=0.63), CarSpecs(mass=1999, wheelbase=2.9, steerRatio=15.6 * 1.15, tireStiffnessFactor=0.63),
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8,
) )
VELOSTER = HyundaiPlatformConfig( VELOSTER = HyundaiPlatformConfig(
"HYUNDAI VELOSTER 2019", "HYUNDAI VELOSTER 2019",
[HyundaiCarInfo("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))], [HyundaiCarDocs("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))],
CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor=0.5), CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor=0.5),
flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS, flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS,
) )
SONATA_HYBRID = HyundaiPlatformConfig( SONATA_HYBRID = HyundaiPlatformConfig(
"HYUNDAI SONATA HYBRID 2021", "HYUNDAI SONATA HYBRID 2021",
[HyundaiCarInfo("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], [HyundaiCarDocs("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))],
SONATA.specs, SONATA.specs,
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
) )
IONIQ_5 = HyundaiCanFDPlatformConfig( IONIQ_5 = HyundaiCanFDPlatformConfig(
"HYUNDAI IONIQ 5 2022", "HYUNDAI IONIQ 5 2022",
[ [
HyundaiCarInfo("Hyundai Ioniq 5 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), HyundaiCarDocs("Hyundai Ioniq 5 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_q])),
HyundaiCarInfo("Hyundai Ioniq 5 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])), HyundaiCarDocs("Hyundai Ioniq 5 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])),
HyundaiCarInfo("Hyundai Ioniq 5 (with HDA II) 2022-23", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), HyundaiCarDocs("Hyundai Ioniq 5 (with HDA II) 2022-23", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])),
], ],
CarSpecs(mass=1948, wheelbase=2.97, steerRatio=14.26, tireStiffnessFactor=0.65), CarSpecs(mass=1948, wheelbase=2.97, steerRatio=14.26, tireStiffnessFactor=0.65),
flags=HyundaiFlags.EV, flags=HyundaiFlags.EV,
) )
IONIQ_6 = HyundaiCanFDPlatformConfig( IONIQ_6 = HyundaiCanFDPlatformConfig(
"HYUNDAI IONIQ 6 2023", "HYUNDAI IONIQ 6 2023",
[HyundaiCarInfo("Hyundai Ioniq 6 (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))], [HyundaiCarDocs("Hyundai Ioniq 6 (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))],
IONIQ_5.specs, IONIQ_5.specs,
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE,
) )
TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig(
"HYUNDAI TUCSON 4TH GEN", "HYUNDAI TUCSON 4TH GEN",
[ [
HyundaiCarInfo("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])),
HyundaiCarInfo("Hyundai Tucson 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Hyundai Tucson 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_n])),
HyundaiCarInfo("Hyundai Tucson Hybrid 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Hyundai Tucson Hybrid 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])),
], ],
CarSpecs(mass=1630, wheelbase=2.756, steerRatio=16, tireStiffnessFactor=0.385), CarSpecs(mass=1630, wheelbase=2.756, steerRatio=16, tireStiffnessFactor=0.385),
) )
SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig(
"HYUNDAI SANTA CRUZ 1ST GEN", "HYUNDAI SANTA CRUZ 1ST GEN",
[HyundaiCarInfo("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))], [HyundaiCarDocs("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))],
# weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf # weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf
CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2), CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2),
) )
CUSTIN_1ST_GEN = HyundaiPlatformConfig( CUSTIN_1ST_GEN = HyundaiPlatformConfig(
"HYUNDAI CUSTIN 1ST GEN", "HYUNDAI CUSTIN 1ST GEN",
[HyundaiCarInfo("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], [HyundaiCarDocs("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner
flags=HyundaiFlags.CHECKSUM_CRC8, flags=HyundaiFlags.CHECKSUM_CRC8,
) )
@ -375,52 +375,52 @@ class CAR(Platforms):
KIA_FORTE = HyundaiPlatformConfig( KIA_FORTE = HyundaiPlatformConfig(
"KIA FORTE E 2018 & GT 2021", "KIA FORTE E 2018 & GT 2021",
[ [
HyundaiCarInfo("Kia Forte 2019-21", car_parts=CarParts.common([CarHarness.hyundai_g])), HyundaiCarDocs("Kia Forte 2019-21", car_parts=CarParts.common([CarHarness.hyundai_g])),
HyundaiCarInfo("Kia Forte 2023", car_parts=CarParts.common([CarHarness.hyundai_e])), HyundaiCarDocs("Kia Forte 2023", car_parts=CarParts.common([CarHarness.hyundai_e])),
], ],
CarSpecs(mass=2878 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5) CarSpecs(mass=2878 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5)
) )
KIA_K5_2021 = HyundaiPlatformConfig( KIA_K5_2021 = HyundaiPlatformConfig(
"KIA K5 2021", "KIA K5 2021",
[HyundaiCarInfo("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a]))], [HyundaiCarDocs("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a]))],
CarSpecs(mass=3381 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), # 2021 Kia K5 Steering Ratio (all trims) CarSpecs(mass=3381 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), # 2021 Kia K5 Steering Ratio (all trims)
flags=HyundaiFlags.CHECKSUM_CRC8, flags=HyundaiFlags.CHECKSUM_CRC8,
) )
KIA_K5_HEV_2020 = HyundaiPlatformConfig( KIA_K5_HEV_2020 = HyundaiPlatformConfig(
"KIA K5 HYBRID 2020", "KIA K5 HYBRID 2020",
[HyundaiCarInfo("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a]))], [HyundaiCarDocs("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a]))],
KIA_K5_2021.specs, KIA_K5_2021.specs,
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
) )
KIA_K8_HEV_1ST_GEN = HyundaiCanFDPlatformConfig( KIA_K8_HEV_1ST_GEN = HyundaiCanFDPlatformConfig(
"KIA K8 HYBRID 1ST GEN", "KIA K8 HYBRID 1ST GEN",
[HyundaiCarInfo("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q]))], [HyundaiCarDocs("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q]))],
# mass: https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid, steerRatio: guesstimate from K5 platform # mass: https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid, steerRatio: guesstimate from K5 platform
CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27) CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27)
) )
KIA_NIRO_EV = HyundaiPlatformConfig( KIA_NIRO_EV = HyundaiPlatformConfig(
"KIA NIRO EV 2020", "KIA NIRO EV 2020",
[ [
HyundaiCarInfo("Kia Niro EV 2019", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])), HyundaiCarDocs("Kia Niro EV 2019", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])),
HyundaiCarInfo("Kia Niro EV 2020", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_f])), HyundaiCarDocs("Kia Niro EV 2020", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_f])),
HyundaiCarInfo("Kia Niro EV 2021", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_c])), HyundaiCarDocs("Kia Niro EV 2021", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_c])),
HyundaiCarInfo("Kia Niro EV 2022", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])), HyundaiCarDocs("Kia Niro EV 2022", "All", video_link="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])),
], ],
CarSpecs(mass=3543 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=13.6, tireStiffnessFactor=0.385), # average of all the cars CarSpecs(mass=3543 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=13.6, tireStiffnessFactor=0.385), # average of all the cars
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV,
) )
KIA_NIRO_EV_2ND_GEN = HyundaiCanFDPlatformConfig( KIA_NIRO_EV_2ND_GEN = HyundaiCanFDPlatformConfig(
"KIA NIRO EV 2ND GEN", "KIA NIRO EV 2ND GEN",
[HyundaiCarInfo("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], [HyundaiCarDocs("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))],
KIA_NIRO_EV.specs, KIA_NIRO_EV.specs,
flags=HyundaiFlags.EV, flags=HyundaiFlags.EV,
) )
KIA_NIRO_PHEV = HyundaiPlatformConfig( KIA_NIRO_PHEV = HyundaiPlatformConfig(
"KIA NIRO HYBRID 2019", "KIA NIRO HYBRID 2019",
[ [
HyundaiCarInfo("Kia Niro Hybrid 2018", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), HyundaiCarDocs("Kia Niro Hybrid 2018", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])),
HyundaiCarInfo("Kia Niro Plug-in Hybrid 2018-19", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), HyundaiCarDocs("Kia Niro Plug-in Hybrid 2018-19", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])),
HyundaiCarInfo("Kia Niro Plug-in Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_d])), HyundaiCarDocs("Kia Niro Plug-in Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_d])),
], ],
KIA_NIRO_EV.specs, KIA_NIRO_EV.specs,
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.MIN_STEER_32_MPH, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.MIN_STEER_32_MPH,
@ -428,8 +428,8 @@ class CAR(Platforms):
KIA_NIRO_PHEV_2022 = HyundaiPlatformConfig( KIA_NIRO_PHEV_2022 = HyundaiPlatformConfig(
"KIA NIRO PLUG-IN HYBRID 2022", "KIA NIRO PLUG-IN HYBRID 2022",
[ [
HyundaiCarInfo("Kia Niro Plug-in Hybrid 2021", "All", car_parts=CarParts.common([CarHarness.hyundai_d])), HyundaiCarDocs("Kia Niro Plug-in Hybrid 2021", "All", car_parts=CarParts.common([CarHarness.hyundai_d])),
HyundaiCarInfo("Kia Niro Plug-in Hybrid 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), HyundaiCarDocs("Kia Niro Plug-in Hybrid 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_f])),
], ],
KIA_NIRO_EV.specs, KIA_NIRO_EV.specs,
flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR, flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR,
@ -437,54 +437,54 @@ class CAR(Platforms):
KIA_NIRO_HEV_2021 = HyundaiPlatformConfig( KIA_NIRO_HEV_2021 = HyundaiPlatformConfig(
"KIA NIRO HYBRID 2021", "KIA NIRO HYBRID 2021",
[ [
HyundaiCarInfo("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), HyundaiCarDocs("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])),
HyundaiCarInfo("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), HyundaiCarDocs("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])),
], ],
KIA_NIRO_EV.specs, KIA_NIRO_EV.specs,
flags=HyundaiFlags.HYBRID, flags=HyundaiFlags.HYBRID,
) )
KIA_NIRO_HEV_2ND_GEN = HyundaiCanFDPlatformConfig( KIA_NIRO_HEV_2ND_GEN = HyundaiCanFDPlatformConfig(
"KIA NIRO HYBRID 2ND GEN", "KIA NIRO HYBRID 2ND GEN",
[HyundaiCarInfo("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a]))], [HyundaiCarDocs("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a]))],
KIA_NIRO_EV.specs, KIA_NIRO_EV.specs,
) )
KIA_OPTIMA_G4 = HyundaiPlatformConfig( KIA_OPTIMA_G4 = HyundaiPlatformConfig(
"KIA OPTIMA 4TH GEN", "KIA OPTIMA 4TH GEN",
[HyundaiCarInfo("Kia Optima 2017", "Advanced Smart Cruise Control", [HyundaiCarDocs("Kia Optima 2017", "Advanced Smart Cruise Control",
car_parts=CarParts.common([CarHarness.hyundai_b]))], # TODO: may support 2016, 2018 car_parts=CarParts.common([CarHarness.hyundai_b]))], # TODO: may support 2016, 2018
CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5),
flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS | HyundaiFlags.MIN_STEER_32_MPH, flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS | HyundaiFlags.MIN_STEER_32_MPH,
) )
KIA_OPTIMA_G4_FL = HyundaiPlatformConfig( KIA_OPTIMA_G4_FL = HyundaiPlatformConfig(
"KIA OPTIMA 4TH GEN FACELIFT", "KIA OPTIMA 4TH GEN FACELIFT",
[HyundaiCarInfo("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g]))], [HyundaiCarDocs("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g]))],
CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5),
flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS,
) )
# TODO: may support adjacent years. may have a non-zero minimum steering speed # TODO: may support adjacent years. may have a non-zero minimum steering speed
KIA_OPTIMA_H = HyundaiPlatformConfig( KIA_OPTIMA_H = HyundaiPlatformConfig(
"KIA OPTIMA HYBRID 2017 & SPORTS 2019", "KIA OPTIMA HYBRID 2017 & SPORTS 2019",
[HyundaiCarInfo("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c]))], [HyundaiCarDocs("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c]))],
CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5),
flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY,
) )
KIA_OPTIMA_H_G4_FL = HyundaiPlatformConfig( KIA_OPTIMA_H_G4_FL = HyundaiPlatformConfig(
"KIA OPTIMA HYBRID 4TH GEN FACELIFT", "KIA OPTIMA HYBRID 4TH GEN FACELIFT",
[HyundaiCarInfo("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h]))], [HyundaiCarDocs("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h]))],
CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5),
flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL,
) )
KIA_SELTOS = HyundaiPlatformConfig( KIA_SELTOS = HyundaiPlatformConfig(
"KIA SELTOS 2021", "KIA SELTOS 2021",
[HyundaiCarInfo("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a]))], [HyundaiCarDocs("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a]))],
CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56), CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56),
flags=HyundaiFlags.CHECKSUM_CRC8, flags=HyundaiFlags.CHECKSUM_CRC8,
) )
KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig( KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig(
"KIA SPORTAGE 5TH GEN", "KIA SPORTAGE 5TH GEN",
[ [
HyundaiCarInfo("Kia Sportage 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Kia Sportage 2023", car_parts=CarParts.common([CarHarness.hyundai_n])),
HyundaiCarInfo("Kia Sportage Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarDocs("Kia Sportage Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_n])),
], ],
# weight from SX and above trims, average of FWD and AWD version, steering ratio according to Kia News https://www.kiamedia.com/us/en/models/sportage/2023/specifications # weight from SX and above trims, average of FWD and AWD version, steering ratio according to Kia News https://www.kiamedia.com/us/en/models/sportage/2023/specifications
CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6), CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6),
@ -492,51 +492,51 @@ class CAR(Platforms):
KIA_SORENTO = HyundaiPlatformConfig( KIA_SORENTO = HyundaiPlatformConfig(
"KIA SORENTO GT LINE 2018", "KIA SORENTO GT LINE 2018",
[ [
HyundaiCarInfo("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", HyundaiCarDocs("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8",
car_parts=CarParts.common([CarHarness.hyundai_e])), car_parts=CarParts.common([CarHarness.hyundai_e])),
HyundaiCarInfo("Kia Sorento 2019", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", car_parts=CarParts.common([CarHarness.hyundai_e])), HyundaiCarDocs("Kia Sorento 2019", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", car_parts=CarParts.common([CarHarness.hyundai_e])),
], ],
CarSpecs(mass=1985, wheelbase=2.78, steerRatio=14.4 * 1.1), # 10% higher at the center seems reasonable CarSpecs(mass=1985, wheelbase=2.78, steerRatio=14.4 * 1.1), # 10% higher at the center seems reasonable
flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.UNSUPPORTED_LONGITUDINAL,
) )
KIA_SORENTO_4TH_GEN = HyundaiCanFDPlatformConfig( KIA_SORENTO_4TH_GEN = HyundaiCanFDPlatformConfig(
"KIA SORENTO 4TH GEN", "KIA SORENTO 4TH GEN",
[HyundaiCarInfo("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k]))], [HyundaiCarDocs("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k]))],
CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms
flags=HyundaiFlags.RADAR_SCC, flags=HyundaiFlags.RADAR_SCC,
) )
KIA_SORENTO_HEV_4TH_GEN = HyundaiCanFDPlatformConfig( KIA_SORENTO_HEV_4TH_GEN = HyundaiCanFDPlatformConfig(
"KIA SORENTO HYBRID 4TH GEN", "KIA SORENTO HYBRID 4TH GEN",
[ [
HyundaiCarInfo("Kia Sorento Hybrid 2021-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), HyundaiCarDocs("Kia Sorento Hybrid 2021-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])),
HyundaiCarInfo("Kia Sorento Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), HyundaiCarDocs("Kia Sorento Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])),
], ],
CarSpecs(mass=4395 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms CarSpecs(mass=4395 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms
flags=HyundaiFlags.RADAR_SCC, flags=HyundaiFlags.RADAR_SCC,
) )
KIA_STINGER = HyundaiPlatformConfig( KIA_STINGER = HyundaiPlatformConfig(
"KIA STINGER GT2 2018", "KIA STINGER GT2 2018",
[HyundaiCarInfo("Kia Stinger 2018-20", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0", [HyundaiCarDocs("Kia Stinger 2018-20", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0",
car_parts=CarParts.common([CarHarness.hyundai_c]))], car_parts=CarParts.common([CarHarness.hyundai_c]))],
CarSpecs(mass=1825, wheelbase=2.78, steerRatio=14.4 * 1.15) # 15% higher at the center seems reasonable CarSpecs(mass=1825, wheelbase=2.78, steerRatio=14.4 * 1.15) # 15% higher at the center seems reasonable
) )
KIA_STINGER_2022 = HyundaiPlatformConfig( KIA_STINGER_2022 = HyundaiPlatformConfig(
"KIA STINGER 2022", "KIA STINGER 2022",
[HyundaiCarInfo("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], [HyundaiCarDocs("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
KIA_STINGER.specs, KIA_STINGER.specs,
) )
KIA_CEED = HyundaiPlatformConfig( KIA_CEED = HyundaiPlatformConfig(
"KIA CEED INTRO ED 2019", "KIA CEED INTRO ED 2019",
[HyundaiCarInfo("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e]))], [HyundaiCarDocs("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e]))],
CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5), CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5),
flags=HyundaiFlags.LEGACY, flags=HyundaiFlags.LEGACY,
) )
KIA_EV6 = HyundaiCanFDPlatformConfig( KIA_EV6 = HyundaiCanFDPlatformConfig(
"KIA EV6 2022", "KIA EV6 2022",
[ [
HyundaiCarInfo("Kia EV6 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_p])), HyundaiCarDocs("Kia EV6 (Southeast Asia only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_p])),
HyundaiCarInfo("Kia EV6 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])), HyundaiCarDocs("Kia EV6 (without HDA II) 2022-23", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])),
HyundaiCarInfo("Kia EV6 (with HDA II) 2022-23", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p])) HyundaiCarDocs("Kia EV6 (with HDA II) 2022-23", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))
], ],
CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65), CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65),
flags=HyundaiFlags.EV, flags=HyundaiFlags.EV,
@ -544,8 +544,8 @@ class CAR(Platforms):
KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig( KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig(
"KIA CARNIVAL 4TH GEN", "KIA CARNIVAL 4TH GEN",
[ [
HyundaiCarInfo("Kia Carnival 2022-24", car_parts=CarParts.common([CarHarness.hyundai_a])), HyundaiCarDocs("Kia Carnival 2022-24", car_parts=CarParts.common([CarHarness.hyundai_a])),
HyundaiCarInfo("Kia Carnival (China only) 2023", car_parts=CarParts.common([CarHarness.hyundai_k])) HyundaiCarDocs("Kia Carnival (China only) 2023", car_parts=CarParts.common([CarHarness.hyundai_k]))
], ],
CarSpecs(mass=2087, wheelbase=3.09, steerRatio=14.23), CarSpecs(mass=2087, wheelbase=3.09, steerRatio=14.23),
flags=HyundaiFlags.RADAR_SCC, flags=HyundaiFlags.RADAR_SCC,
@ -555,47 +555,47 @@ class CAR(Platforms):
GENESIS_GV60_EV_1ST_GEN = HyundaiCanFDPlatformConfig( GENESIS_GV60_EV_1ST_GEN = HyundaiCanFDPlatformConfig(
"GENESIS GV60 ELECTRIC 1ST GEN", "GENESIS GV60 ELECTRIC 1ST GEN",
[ [
HyundaiCarInfo("Genesis GV60 (Advanced Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), HyundaiCarDocs("Genesis GV60 (Advanced Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a])),
HyundaiCarInfo("Genesis GV60 (Performance Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), HyundaiCarDocs("Genesis GV60 (Performance Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])),
], ],
CarSpecs(mass=2205, wheelbase=2.9, steerRatio=12.6), # steerRatio: https://www.motor1.com/reviews/586376/2023-genesis-gv60-first-drive/#:~:text=Relative%20to%20the%20related%20Ioniq,5%2FEV6%27s%2014.3%3A1. CarSpecs(mass=2205, wheelbase=2.9, steerRatio=12.6), # steerRatio: https://www.motor1.com/reviews/586376/2023-genesis-gv60-first-drive/#:~:text=Relative%20to%20the%20related%20Ioniq,5%2FEV6%27s%2014.3%3A1.
flags=HyundaiFlags.EV, flags=HyundaiFlags.EV,
) )
GENESIS_G70 = HyundaiPlatformConfig( GENESIS_G70 = HyundaiPlatformConfig(
"GENESIS G70 2018", "GENESIS G70 2018",
[HyundaiCarInfo("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], [HyundaiCarDocs("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))],
CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56), CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56),
flags=HyundaiFlags.LEGACY, flags=HyundaiFlags.LEGACY,
) )
GENESIS_G70_2020 = HyundaiPlatformConfig( GENESIS_G70_2020 = HyundaiPlatformConfig(
"GENESIS G70 2020", "GENESIS G70 2020",
[HyundaiCarInfo("Genesis G70 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], [HyundaiCarDocs("Genesis G70 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))],
CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9), CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9),
flags=HyundaiFlags.MANDO_RADAR, flags=HyundaiFlags.MANDO_RADAR,
) )
GENESIS_GV70_1ST_GEN = HyundaiCanFDPlatformConfig( GENESIS_GV70_1ST_GEN = HyundaiCanFDPlatformConfig(
"GENESIS GV70 1ST GEN", "GENESIS GV70 1ST GEN",
[ [
HyundaiCarInfo("Genesis GV70 (2.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), HyundaiCarDocs("Genesis GV70 (2.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])),
HyundaiCarInfo("Genesis GV70 (3.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), HyundaiCarDocs("Genesis GV70 (3.5T Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_m])),
], ],
CarSpecs(mass=1950, wheelbase=2.87, steerRatio=14.6), CarSpecs(mass=1950, wheelbase=2.87, steerRatio=14.6),
flags=HyundaiFlags.RADAR_SCC, flags=HyundaiFlags.RADAR_SCC,
) )
GENESIS_G80 = HyundaiPlatformConfig( GENESIS_G80 = HyundaiPlatformConfig(
"GENESIS G80 2017", "GENESIS G80 2017",
[HyundaiCarInfo("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], [HyundaiCarDocs("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))],
CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5), CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5),
flags=HyundaiFlags.LEGACY, flags=HyundaiFlags.LEGACY,
) )
GENESIS_G90 = HyundaiPlatformConfig( GENESIS_G90 = HyundaiPlatformConfig(
"GENESIS G90 2017", "GENESIS G90 2017",
[HyundaiCarInfo("Genesis G90 2017-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], [HyundaiCarDocs("Genesis G90 2017-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))],
CarSpecs(mass=2200, wheelbase=3.15, steerRatio=12.069), CarSpecs(mass=2200, wheelbase=3.15, steerRatio=12.069),
) )
GENESIS_GV80 = HyundaiCanFDPlatformConfig( GENESIS_GV80 = HyundaiCanFDPlatformConfig(
"GENESIS GV80 2023", "GENESIS GV80 2023",
[HyundaiCarInfo("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))], [HyundaiCarDocs("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))],
CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14), CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14),
flags=HyundaiFlags.RADAR_SCC, flags=HyundaiFlags.RADAR_SCC,
) )

@ -4,7 +4,7 @@ from enum import IntFlag
from cereal import car from cereal import car
from openpilot.common.conversions import Conversions as CV from openpilot.common.conversions import Conversions as CV
from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict
from openpilot.selfdrive.car.docs_definitions import CarHarness, CarInfo, CarParts from openpilot.selfdrive.car.docs_definitions import CarHarness, CarDocs, CarParts
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -27,7 +27,7 @@ class CarControllerParams:
@dataclass @dataclass
class MazdaCarInfo(CarInfo): class MazdaCarDocs(CarDocs):
package: str = "All" package: str = "All"
car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.mazda])) car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.mazda]))
@ -52,32 +52,32 @@ class MazdaPlatformConfig(PlatformConfig):
class CAR(Platforms): class CAR(Platforms):
CX5 = MazdaPlatformConfig( CX5 = MazdaPlatformConfig(
"MAZDA CX-5", "MAZDA CX-5",
[MazdaCarInfo("Mazda CX-5 2017-21")], [MazdaCarDocs("Mazda CX-5 2017-21")],
MazdaCarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) MazdaCarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5)
) )
CX9 = MazdaPlatformConfig( CX9 = MazdaPlatformConfig(
"MAZDA CX-9", "MAZDA CX-9",
[MazdaCarInfo("Mazda CX-9 2016-20")], [MazdaCarDocs("Mazda CX-9 2016-20")],
MazdaCarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) MazdaCarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6)
) )
MAZDA3 = MazdaPlatformConfig( MAZDA3 = MazdaPlatformConfig(
"MAZDA 3", "MAZDA 3",
[MazdaCarInfo("Mazda 3 2017-18")], [MazdaCarDocs("Mazda 3 2017-18")],
MazdaCarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) MazdaCarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0)
) )
MAZDA6 = MazdaPlatformConfig( MAZDA6 = MazdaPlatformConfig(
"MAZDA 6", "MAZDA 6",
[MazdaCarInfo("Mazda 6 2017-20")], [MazdaCarDocs("Mazda 6 2017-20")],
MazdaCarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5) MazdaCarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5)
) )
CX9_2021 = MazdaPlatformConfig( CX9_2021 = MazdaPlatformConfig(
"MAZDA CX-9 2021", "MAZDA CX-9 2021",
[MazdaCarInfo("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4")], [MazdaCarDocs("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4")],
CX9.specs CX9.specs
) )
CX5_2022 = MazdaPlatformConfig( CX5_2022 = MazdaPlatformConfig(
"MAZDA CX-5 2022", "MAZDA CX-5 2022",
[MazdaCarInfo("Mazda CX-5 2022-24")], [MazdaCarDocs("Mazda CX-5 2022-24")],
CX5.specs, CX5.specs,
) )

@ -3,7 +3,7 @@ from dataclasses import dataclass, field
from cereal import car from cereal import car
from panda.python import uds from panda.python import uds
from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict
from openpilot.selfdrive.car.docs_definitions import CarInfo, CarHarness, CarParts from openpilot.selfdrive.car.docs_definitions import CarDocs, CarHarness, CarParts
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -20,7 +20,7 @@ class CarControllerParams:
@dataclass @dataclass
class NissanCarInfo(CarInfo): class NissanCarDocs(CarDocs):
package: str = "ProPILOT Assist" package: str = "ProPILOT Assist"
car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.nissan_a])) car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.nissan_a]))
@ -39,12 +39,12 @@ class NissanPlaformConfig(PlatformConfig):
class CAR(Platforms): class CAR(Platforms):
XTRAIL = NissanPlaformConfig( XTRAIL = NissanPlaformConfig(
"NISSAN X-TRAIL 2017", "NISSAN X-TRAIL 2017",
[NissanCarInfo("Nissan X-Trail 2017")], [NissanCarDocs("Nissan X-Trail 2017")],
NissanCarSpecs(mass=1610, wheelbase=2.705) NissanCarSpecs(mass=1610, wheelbase=2.705)
) )
LEAF = NissanPlaformConfig( LEAF = NissanPlaformConfig(
"NISSAN LEAF 2018", "NISSAN LEAF 2018",
[NissanCarInfo("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY")], [NissanCarDocs("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY")],
NissanCarSpecs(mass=1610, wheelbase=2.705), NissanCarSpecs(mass=1610, wheelbase=2.705),
dbc_dict('nissan_leaf_2018_generated', None), dbc_dict('nissan_leaf_2018_generated', None),
) )
@ -53,12 +53,12 @@ class CAR(Platforms):
LEAF_IC = LEAF.override(platform_str="NISSAN LEAF 2018 Instrument Cluster", car_info=[]) LEAF_IC = LEAF.override(platform_str="NISSAN LEAF 2018 Instrument Cluster", car_info=[])
ROGUE = NissanPlaformConfig( ROGUE = NissanPlaformConfig(
"NISSAN ROGUE 2019", "NISSAN ROGUE 2019",
[NissanCarInfo("Nissan Rogue 2018-20")], [NissanCarDocs("Nissan Rogue 2018-20")],
NissanCarSpecs(mass=1610, wheelbase=2.705) NissanCarSpecs(mass=1610, wheelbase=2.705)
) )
ALTIMA = NissanPlaformConfig( ALTIMA = NissanPlaformConfig(
"NISSAN ALTIMA 2020", "NISSAN ALTIMA 2020",
[NissanCarInfo("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b]))], [NissanCarDocs("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b]))],
NissanCarSpecs(mass=1492, wheelbase=2.824) NissanCarSpecs(mass=1492, wheelbase=2.824)
) )

@ -4,7 +4,7 @@ from enum import Enum, IntFlag
from cereal import car from cereal import car
from panda.python import uds from panda.python import uds
from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Tool, Column from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Tool, Column
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -88,7 +88,7 @@ class Footnote(Enum):
@dataclass @dataclass
class SubaruCarInfo(CarInfo): class SubaruCarDocs(CarDocs):
package: str = "EyeSight Driver Assistance" package: str = "EyeSight Driver Assistance"
car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.subaru_a])) car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.subaru_a]))
footnotes: list[Enum] = field(default_factory=lambda: [Footnote.GLOBAL]) footnotes: list[Enum] = field(default_factory=lambda: [Footnote.GLOBAL])
@ -122,34 +122,34 @@ class CAR(Platforms):
# Global platform # Global platform
ASCENT = SubaruPlatformConfig( ASCENT = SubaruPlatformConfig(
"SUBARU ASCENT LIMITED 2019", "SUBARU ASCENT LIMITED 2019",
[SubaruCarInfo("Subaru Ascent 2019-21", "All")], [SubaruCarDocs("Subaru Ascent 2019-21", "All")],
CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5), CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5),
) )
OUTBACK = SubaruGen2PlatformConfig( OUTBACK = SubaruGen2PlatformConfig(
"SUBARU OUTBACK 6TH GEN", "SUBARU OUTBACK 6TH GEN",
[SubaruCarInfo("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], [SubaruCarDocs("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))],
CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17),
) )
LEGACY = SubaruGen2PlatformConfig( LEGACY = SubaruGen2PlatformConfig(
"SUBARU LEGACY 7TH GEN", "SUBARU LEGACY 7TH GEN",
[SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], [SubaruCarDocs("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))],
OUTBACK.specs, OUTBACK.specs,
) )
IMPREZA = SubaruPlatformConfig( IMPREZA = SubaruPlatformConfig(
"SUBARU IMPREZA LIMITED 2019", "SUBARU IMPREZA LIMITED 2019",
[ [
SubaruCarInfo("Subaru Impreza 2017-19"), SubaruCarDocs("Subaru Impreza 2017-19"),
SubaruCarInfo("Subaru Crosstrek 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), SubaruCarDocs("Subaru Crosstrek 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"),
SubaruCarInfo("Subaru XV 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), SubaruCarDocs("Subaru XV 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"),
], ],
CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15), CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15),
) )
IMPREZA_2020 = SubaruPlatformConfig( IMPREZA_2020 = SubaruPlatformConfig(
"SUBARU IMPREZA SPORT 2020", "SUBARU IMPREZA SPORT 2020",
[ [
SubaruCarInfo("Subaru Impreza 2020-22"), SubaruCarDocs("Subaru Impreza 2020-22"),
SubaruCarInfo("Subaru Crosstrek 2020-23"), SubaruCarDocs("Subaru Crosstrek 2020-23"),
SubaruCarInfo("Subaru XV 2020-21"), SubaruCarDocs("Subaru XV 2020-21"),
], ],
CarSpecs(mass=1480, wheelbase=2.67, steerRatio=17), CarSpecs(mass=1480, wheelbase=2.67, steerRatio=17),
flags=SubaruFlags.STEER_RATE_LIMITED, flags=SubaruFlags.STEER_RATE_LIMITED,
@ -157,47 +157,47 @@ class CAR(Platforms):
# TODO: is there an XV and Impreza too? # TODO: is there an XV and Impreza too?
CROSSTREK_HYBRID = SubaruPlatformConfig( CROSSTREK_HYBRID = SubaruPlatformConfig(
"SUBARU CROSSTREK HYBRID 2020", "SUBARU CROSSTREK HYBRID 2020",
[SubaruCarInfo("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b]))], [SubaruCarDocs("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b]))],
CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17),
flags=SubaruFlags.HYBRID, flags=SubaruFlags.HYBRID,
) )
FORESTER = SubaruPlatformConfig( FORESTER = SubaruPlatformConfig(
"SUBARU FORESTER 2019", "SUBARU FORESTER 2019",
[SubaruCarInfo("Subaru Forester 2019-21", "All")], [SubaruCarDocs("Subaru Forester 2019-21", "All")],
CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17),
flags=SubaruFlags.STEER_RATE_LIMITED, flags=SubaruFlags.STEER_RATE_LIMITED,
) )
FORESTER_HYBRID = SubaruPlatformConfig( FORESTER_HYBRID = SubaruPlatformConfig(
"SUBARU FORESTER HYBRID 2020", "SUBARU FORESTER HYBRID 2020",
[SubaruCarInfo("Subaru Forester Hybrid 2020")], [SubaruCarDocs("Subaru Forester Hybrid 2020")],
FORESTER.specs, FORESTER.specs,
flags=SubaruFlags.HYBRID, flags=SubaruFlags.HYBRID,
) )
# Pre-global # Pre-global
FORESTER_PREGLOBAL = SubaruPlatformConfig( FORESTER_PREGLOBAL = SubaruPlatformConfig(
"SUBARU FORESTER 2017 - 2018", "SUBARU FORESTER 2017 - 2018",
[SubaruCarInfo("Subaru Forester 2017-18")], [SubaruCarDocs("Subaru Forester 2017-18")],
CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20),
dbc_dict('subaru_forester_2017_generated', None), dbc_dict('subaru_forester_2017_generated', None),
flags=SubaruFlags.PREGLOBAL, flags=SubaruFlags.PREGLOBAL,
) )
LEGACY_PREGLOBAL = SubaruPlatformConfig( LEGACY_PREGLOBAL = SubaruPlatformConfig(
"SUBARU LEGACY 2015 - 2018", "SUBARU LEGACY 2015 - 2018",
[SubaruCarInfo("Subaru Legacy 2015-18")], [SubaruCarDocs("Subaru Legacy 2015-18")],
CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5),
dbc_dict('subaru_outback_2015_generated', None), dbc_dict('subaru_outback_2015_generated', None),
flags=SubaruFlags.PREGLOBAL, flags=SubaruFlags.PREGLOBAL,
) )
OUTBACK_PREGLOBAL = SubaruPlatformConfig( OUTBACK_PREGLOBAL = SubaruPlatformConfig(
"SUBARU OUTBACK 2015 - 2017", "SUBARU OUTBACK 2015 - 2017",
[SubaruCarInfo("Subaru Outback 2015-17")], [SubaruCarDocs("Subaru Outback 2015-17")],
FORESTER_PREGLOBAL.specs, FORESTER_PREGLOBAL.specs,
dbc_dict('subaru_outback_2015_generated', None), dbc_dict('subaru_outback_2015_generated', None),
flags=SubaruFlags.PREGLOBAL, flags=SubaruFlags.PREGLOBAL,
) )
OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig(
"SUBARU OUTBACK 2018 - 2019", "SUBARU OUTBACK 2018 - 2019",
[SubaruCarInfo("Subaru Outback 2018-19")], [SubaruCarDocs("Subaru Outback 2018-19")],
FORESTER_PREGLOBAL.specs, FORESTER_PREGLOBAL.specs,
dbc_dict('subaru_outback_2019_generated', None), dbc_dict('subaru_outback_2019_generated', None),
flags=SubaruFlags.PREGLOBAL, flags=SubaruFlags.PREGLOBAL,
@ -205,19 +205,19 @@ class CAR(Platforms):
# Angle LKAS # Angle LKAS
FORESTER_2022 = SubaruPlatformConfig( FORESTER_2022 = SubaruPlatformConfig(
"SUBARU FORESTER 2022", "SUBARU FORESTER 2022",
[SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c]))], [SubaruCarDocs("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c]))],
FORESTER.specs, FORESTER.specs,
flags=SubaruFlags.LKAS_ANGLE, flags=SubaruFlags.LKAS_ANGLE,
) )
OUTBACK_2023 = SubaruGen2PlatformConfig( OUTBACK_2023 = SubaruGen2PlatformConfig(
"SUBARU OUTBACK 7TH GEN", "SUBARU OUTBACK 7TH GEN",
[SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], [SubaruCarDocs("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))],
OUTBACK.specs, OUTBACK.specs,
flags=SubaruFlags.LKAS_ANGLE, flags=SubaruFlags.LKAS_ANGLE,
) )
ASCENT_2023 = SubaruGen2PlatformConfig( ASCENT_2023 = SubaruGen2PlatformConfig(
"SUBARU ASCENT 2023", "SUBARU ASCENT 2023",
[SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], [SubaruCarDocs("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))],
ASCENT.specs, ASCENT.specs,
flags=SubaruFlags.LKAS_ANGLE, flags=SubaruFlags.LKAS_ANGLE,
) )

@ -2,7 +2,7 @@ from collections import namedtuple
from cereal import car from cereal import car
from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, PlatformConfig, Platforms, dbc_dict
from openpilot.selfdrive.car.docs_definitions import CarInfo from openpilot.selfdrive.car.docs_definitions import CarDocs
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -12,19 +12,19 @@ Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values'])
class CAR(Platforms): class CAR(Platforms):
AP1_MODELS = PlatformConfig( AP1_MODELS = PlatformConfig(
'TESLA AP1 MODEL S', 'TESLA AP1 MODEL S',
[CarInfo("Tesla AP1 Model S", "All")], [CarDocs("Tesla AP1 Model S", "All")],
CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0), CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0),
dbc_dict('tesla_powertrain', 'tesla_radar_bosch_generated', chassis_dbc='tesla_can') dbc_dict('tesla_powertrain', 'tesla_radar_bosch_generated', chassis_dbc='tesla_can')
) )
AP2_MODELS = PlatformConfig( AP2_MODELS = PlatformConfig(
'TESLA AP2 MODEL S', 'TESLA AP2 MODEL S',
[CarInfo("Tesla AP2 Model S", "All")], [CarDocs("Tesla AP2 Model S", "All")],
AP1_MODELS.specs, AP1_MODELS.specs,
AP1_MODELS.dbc_dict AP1_MODELS.dbc_dict
) )
MODELS_RAVEN = PlatformConfig( MODELS_RAVEN = PlatformConfig(
'TESLA MODEL S RAVEN', 'TESLA MODEL S RAVEN',
[CarInfo("Tesla Model S Raven", "All")], [CarDocs("Tesla Model S Raven", "All")],
AP1_MODELS.specs, AP1_MODELS.specs,
dbc_dict('tesla_powertrain', 'tesla_radar_continental_generated', chassis_dbc='tesla_can') dbc_dict('tesla_powertrain', 'tesla_radar_continental_generated', chassis_dbc='tesla_can')
) )

@ -46,7 +46,7 @@ class TestCarDocs(unittest.TestCase):
all_car_info_platforms = [name for name, config in PLATFORMS.items()] all_car_info_platforms = [name for name, config in PLATFORMS.items()]
for platform in sorted(interfaces.keys()): for platform in sorted(interfaces.keys()):
with self.subTest(platform=platform): with self.subTest(platform=platform):
self.assertTrue(platform in all_car_info_platforms, f"Platform: {platform} doesn't have a CarInfo entry") self.assertTrue(platform in all_car_info_platforms, f"Platform: {platform} doesn't have a CarDocs entry")
def test_naming_conventions(self): def test_naming_conventions(self):
# Asserts market-standard car naming conventions by brand # Asserts market-standard car naming conventions by brand

@ -7,7 +7,7 @@ from cereal import car
from openpilot.common.conversions import Conversions as CV from openpilot.common.conversions import Conversions as CV
from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms
from openpilot.selfdrive.car import AngleRateLimit, dbc_dict from openpilot.selfdrive.car import AngleRateLimit, dbc_dict
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarInfo, Column, CarParts, CarHarness from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarDocs, Column, CarParts, CarHarness
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
Ecu = car.CarParams.Ecu Ecu = car.CarParams.Ecu
@ -67,7 +67,7 @@ class Footnote(Enum):
@dataclass @dataclass
class ToyotaCarInfo(CarInfo): class ToyotaCarDocs(CarDocs):
package: str = "All" package: str = "All"
car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.toyota_a])) car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.toyota_a]))
@ -88,16 +88,16 @@ class CAR(Platforms):
ALPHARD_TSS2 = ToyotaTSS2PlatformConfig( ALPHARD_TSS2 = ToyotaTSS2PlatformConfig(
"TOYOTA ALPHARD 2020", "TOYOTA ALPHARD 2020",
[ [
ToyotaCarInfo("Toyota Alphard 2019-20"), ToyotaCarDocs("Toyota Alphard 2019-20"),
ToyotaCarInfo("Toyota Alphard Hybrid 2021"), ToyotaCarDocs("Toyota Alphard Hybrid 2021"),
], ],
CarSpecs(mass=4305. * CV.LB_TO_KG, wheelbase=3.0, steerRatio=14.2, tireStiffnessFactor=0.444), CarSpecs(mass=4305. * CV.LB_TO_KG, wheelbase=3.0, steerRatio=14.2, tireStiffnessFactor=0.444),
) )
AVALON = PlatformConfig( AVALON = PlatformConfig(
"TOYOTA AVALON 2016", "TOYOTA AVALON 2016",
[ [
ToyotaCarInfo("Toyota Avalon 2016", "Toyota Safety Sense P"), ToyotaCarDocs("Toyota Avalon 2016", "Toyota Safety Sense P"),
ToyotaCarInfo("Toyota Avalon 2017-18"), ToyotaCarDocs("Toyota Avalon 2017-18"),
], ],
CarSpecs(mass=3505. * CV.LB_TO_KG, wheelbase=2.82, steerRatio=14.8, tireStiffnessFactor=0.7983), CarSpecs(mass=3505. * CV.LB_TO_KG, wheelbase=2.82, steerRatio=14.8, tireStiffnessFactor=0.7983),
dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
@ -105,8 +105,8 @@ class CAR(Platforms):
AVALON_2019 = PlatformConfig( AVALON_2019 = PlatformConfig(
"TOYOTA AVALON 2019", "TOYOTA AVALON 2019",
[ [
ToyotaCarInfo("Toyota Avalon 2019-21"), ToyotaCarDocs("Toyota Avalon 2019-21"),
ToyotaCarInfo("Toyota Avalon Hybrid 2019-21"), ToyotaCarDocs("Toyota Avalon Hybrid 2019-21"),
], ],
AVALON.specs, AVALON.specs,
dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'),
@ -114,16 +114,16 @@ class CAR(Platforms):
AVALON_TSS2 = ToyotaTSS2PlatformConfig( AVALON_TSS2 = ToyotaTSS2PlatformConfig(
"TOYOTA AVALON 2022", # TSS 2.5 "TOYOTA AVALON 2022", # TSS 2.5
[ [
ToyotaCarInfo("Toyota Avalon 2022"), ToyotaCarDocs("Toyota Avalon 2022"),
ToyotaCarInfo("Toyota Avalon Hybrid 2022"), ToyotaCarDocs("Toyota Avalon Hybrid 2022"),
], ],
AVALON.specs, AVALON.specs,
) )
CAMRY = PlatformConfig( CAMRY = PlatformConfig(
"TOYOTA CAMRY 2018", "TOYOTA CAMRY 2018",
[ [
ToyotaCarInfo("Toyota Camry 2018-20", video_link="https://www.youtube.com/watch?v=fkcjviZY9CM", footnotes=[Footnote.CAMRY]), ToyotaCarDocs("Toyota Camry 2018-20", video_link="https://www.youtube.com/watch?v=fkcjviZY9CM", footnotes=[Footnote.CAMRY]),
ToyotaCarInfo("Toyota Camry Hybrid 2018-20", video_link="https://www.youtube.com/watch?v=Q2DYY0AWKgk"), ToyotaCarDocs("Toyota Camry Hybrid 2018-20", video_link="https://www.youtube.com/watch?v=Q2DYY0AWKgk"),
], ],
CarSpecs(mass=3400. * CV.LB_TO_KG, wheelbase=2.82448, steerRatio=13.7, tireStiffnessFactor=0.7933), CarSpecs(mass=3400. * CV.LB_TO_KG, wheelbase=2.82448, steerRatio=13.7, tireStiffnessFactor=0.7933),
dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'),
@ -132,16 +132,16 @@ class CAR(Platforms):
CAMRY_TSS2 = ToyotaTSS2PlatformConfig( CAMRY_TSS2 = ToyotaTSS2PlatformConfig(
"TOYOTA CAMRY 2021", # TSS 2.5 "TOYOTA CAMRY 2021", # TSS 2.5
[ [
ToyotaCarInfo("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]), ToyotaCarDocs("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]),
ToyotaCarInfo("Toyota Camry Hybrid 2021-24"), ToyotaCarDocs("Toyota Camry Hybrid 2021-24"),
], ],
CAMRY.specs, CAMRY.specs,
) )
CHR = PlatformConfig( CHR = PlatformConfig(
"TOYOTA C-HR 2018", "TOYOTA C-HR 2018",
[ [
ToyotaCarInfo("Toyota C-HR 2017-20"), ToyotaCarDocs("Toyota C-HR 2017-20"),
ToyotaCarInfo("Toyota C-HR Hybrid 2017-20"), ToyotaCarDocs("Toyota C-HR Hybrid 2017-20"),
], ],
CarSpecs(mass=3300. * CV.LB_TO_KG, wheelbase=2.63906, steerRatio=13.6, tireStiffnessFactor=0.7933), CarSpecs(mass=3300. * CV.LB_TO_KG, wheelbase=2.63906, steerRatio=13.6, tireStiffnessFactor=0.7933),
dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'),
@ -150,15 +150,15 @@ class CAR(Platforms):
CHR_TSS2 = ToyotaTSS2PlatformConfig( CHR_TSS2 = ToyotaTSS2PlatformConfig(
"TOYOTA C-HR 2021", "TOYOTA C-HR 2021",
[ [
ToyotaCarInfo("Toyota C-HR 2021"), ToyotaCarDocs("Toyota C-HR 2021"),
ToyotaCarInfo("Toyota C-HR Hybrid 2021-22"), ToyotaCarDocs("Toyota C-HR Hybrid 2021-22"),
], ],
CHR.specs, CHR.specs,
flags=ToyotaFlags.RADAR_ACC, flags=ToyotaFlags.RADAR_ACC,
) )
COROLLA = PlatformConfig( COROLLA = PlatformConfig(
"TOYOTA COROLLA 2017", "TOYOTA COROLLA 2017",
[ToyotaCarInfo("Toyota Corolla 2017-19")], [ToyotaCarDocs("Toyota Corolla 2017-19")],
CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444), CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444),
dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
) )
@ -166,22 +166,22 @@ class CAR(Platforms):
COROLLA_TSS2 = ToyotaTSS2PlatformConfig( COROLLA_TSS2 = ToyotaTSS2PlatformConfig(
"TOYOTA COROLLA TSS2 2019", "TOYOTA COROLLA TSS2 2019",
[ [
ToyotaCarInfo("Toyota Corolla 2020-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), ToyotaCarDocs("Toyota Corolla 2020-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"),
ToyotaCarInfo("Toyota Corolla Cross (Non-US only) 2020-23", min_enable_speed=7.5), ToyotaCarDocs("Toyota Corolla Cross (Non-US only) 2020-23", min_enable_speed=7.5),
ToyotaCarInfo("Toyota Corolla Hatchback 2019-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), ToyotaCarDocs("Toyota Corolla Hatchback 2019-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"),
# Hybrid platforms # Hybrid platforms
ToyotaCarInfo("Toyota Corolla Hybrid 2020-22"), ToyotaCarDocs("Toyota Corolla Hybrid 2020-22"),
ToyotaCarInfo("Toyota Corolla Hybrid (Non-US only) 2020-23", min_enable_speed=7.5), ToyotaCarDocs("Toyota Corolla Hybrid (Non-US only) 2020-23", min_enable_speed=7.5),
ToyotaCarInfo("Toyota Corolla Cross Hybrid (Non-US only) 2020-22", min_enable_speed=7.5), ToyotaCarDocs("Toyota Corolla Cross Hybrid (Non-US only) 2020-22", min_enable_speed=7.5),
ToyotaCarInfo("Lexus UX Hybrid 2019-23"), ToyotaCarDocs("Lexus UX Hybrid 2019-23"),
], ],
CarSpecs(mass=3060. * CV.LB_TO_KG, wheelbase=2.67, steerRatio=13.9, tireStiffnessFactor=0.444), CarSpecs(mass=3060. * CV.LB_TO_KG, wheelbase=2.67, steerRatio=13.9, tireStiffnessFactor=0.444),
) )
HIGHLANDER = PlatformConfig( HIGHLANDER = PlatformConfig(
"TOYOTA HIGHLANDER 2017", "TOYOTA HIGHLANDER 2017",
[ [
ToyotaCarInfo("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo"), ToyotaCarDocs("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo"),
ToyotaCarInfo("Toyota Highlander Hybrid 2017-19"), ToyotaCarDocs("Toyota Highlander Hybrid 2017-19"),
], ],
CarSpecs(mass=4516. * CV.LB_TO_KG, wheelbase=2.8194, steerRatio=16.0, tireStiffnessFactor=0.8), CarSpecs(mass=4516. * CV.LB_TO_KG, wheelbase=2.8194, steerRatio=16.0, tireStiffnessFactor=0.8),
dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
@ -190,24 +190,24 @@ class CAR(Platforms):
HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig( HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig(
"TOYOTA HIGHLANDER 2020", "TOYOTA HIGHLANDER 2020",
[ [
ToyotaCarInfo("Toyota Highlander 2020-23"), ToyotaCarDocs("Toyota Highlander 2020-23"),
ToyotaCarInfo("Toyota Highlander Hybrid 2020-23"), ToyotaCarDocs("Toyota Highlander Hybrid 2020-23"),
], ],
HIGHLANDER.specs, HIGHLANDER.specs,
) )
PRIUS = PlatformConfig( PRIUS = PlatformConfig(
"TOYOTA PRIUS 2017", "TOYOTA PRIUS 2017",
[ [
ToyotaCarInfo("Toyota Prius 2016", "Toyota Safety Sense P", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), ToyotaCarDocs("Toyota Prius 2016", "Toyota Safety Sense P", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"),
ToyotaCarInfo("Toyota Prius 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), ToyotaCarDocs("Toyota Prius 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"),
ToyotaCarInfo("Toyota Prius Prime 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"), ToyotaCarDocs("Toyota Prius Prime 2017-20", video_link="https://www.youtube.com/watch?v=8zopPJI8XQ0"),
], ],
CarSpecs(mass=3045. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.74, tireStiffnessFactor=0.6371), CarSpecs(mass=3045. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.74, tireStiffnessFactor=0.6371),
dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'),
) )
PRIUS_V = PlatformConfig( PRIUS_V = PlatformConfig(
"TOYOTA PRIUS v 2017", "TOYOTA PRIUS v 2017",
[ToyotaCarInfo("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED)], [ToyotaCarDocs("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED)],
CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533), CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533),
dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU,
@ -215,16 +215,16 @@ class CAR(Platforms):
PRIUS_TSS2 = ToyotaTSS2PlatformConfig( PRIUS_TSS2 = ToyotaTSS2PlatformConfig(
"TOYOTA PRIUS TSS2 2021", "TOYOTA PRIUS TSS2 2021",
[ [
ToyotaCarInfo("Toyota Prius 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), ToyotaCarDocs("Toyota Prius 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"),
ToyotaCarInfo("Toyota Prius Prime 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"), ToyotaCarDocs("Toyota Prius Prime 2021-22", video_link="https://www.youtube.com/watch?v=J58TvCpUd4U"),
], ],
CarSpecs(mass=3115. * CV.LB_TO_KG, wheelbase=2.70002, steerRatio=13.4, tireStiffnessFactor=0.6371), CarSpecs(mass=3115. * CV.LB_TO_KG, wheelbase=2.70002, steerRatio=13.4, tireStiffnessFactor=0.6371),
) )
RAV4 = PlatformConfig( RAV4 = PlatformConfig(
"TOYOTA RAV4 2017", "TOYOTA RAV4 2017",
[ [
ToyotaCarInfo("Toyota RAV4 2016", "Toyota Safety Sense P"), ToyotaCarDocs("Toyota RAV4 2016", "Toyota Safety Sense P"),
ToyotaCarInfo("Toyota RAV4 2017-18") ToyotaCarDocs("Toyota RAV4 2017-18")
], ],
CarSpecs(mass=3650. * CV.LB_TO_KG, wheelbase=2.65, steerRatio=16.88, tireStiffnessFactor=0.5533), CarSpecs(mass=3650. * CV.LB_TO_KG, wheelbase=2.65, steerRatio=16.88, tireStiffnessFactor=0.5533),
dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
@ -232,8 +232,8 @@ class CAR(Platforms):
RAV4H = PlatformConfig( RAV4H = PlatformConfig(
"TOYOTA RAV4 HYBRID 2017", "TOYOTA RAV4 HYBRID 2017",
[ [
ToyotaCarInfo("Toyota RAV4 Hybrid 2016", "Toyota Safety Sense P", video_link="https://youtu.be/LhT5VzJVfNI?t=26"), ToyotaCarDocs("Toyota RAV4 Hybrid 2016", "Toyota Safety Sense P", video_link="https://youtu.be/LhT5VzJVfNI?t=26"),
ToyotaCarInfo("Toyota RAV4 Hybrid 2017-18", video_link="https://youtu.be/LhT5VzJVfNI?t=26") ToyotaCarDocs("Toyota RAV4 Hybrid 2017-18", video_link="https://youtu.be/LhT5VzJVfNI?t=26")
], ],
RAV4.specs, RAV4.specs,
dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
@ -242,16 +242,16 @@ class CAR(Platforms):
RAV4_TSS2 = ToyotaTSS2PlatformConfig( RAV4_TSS2 = ToyotaTSS2PlatformConfig(
"TOYOTA RAV4 2019", "TOYOTA RAV4 2019",
[ [
ToyotaCarInfo("Toyota RAV4 2019-21", video_link="https://www.youtube.com/watch?v=wJxjDd42gGA"), ToyotaCarDocs("Toyota RAV4 2019-21", video_link="https://www.youtube.com/watch?v=wJxjDd42gGA"),
ToyotaCarInfo("Toyota RAV4 Hybrid 2019-21"), ToyotaCarDocs("Toyota RAV4 Hybrid 2019-21"),
], ],
CarSpecs(mass=3585. * CV.LB_TO_KG, wheelbase=2.68986, steerRatio=14.3, tireStiffnessFactor=0.7933), CarSpecs(mass=3585. * CV.LB_TO_KG, wheelbase=2.68986, steerRatio=14.3, tireStiffnessFactor=0.7933),
) )
RAV4_TSS2_2022 = ToyotaTSS2PlatformConfig( RAV4_TSS2_2022 = ToyotaTSS2PlatformConfig(
"TOYOTA RAV4 2022", "TOYOTA RAV4 2022",
[ [
ToyotaCarInfo("Toyota RAV4 2022"), ToyotaCarDocs("Toyota RAV4 2022"),
ToyotaCarInfo("Toyota RAV4 Hybrid 2022", video_link="https://youtu.be/U0nH9cnrFB0"), ToyotaCarDocs("Toyota RAV4 Hybrid 2022", video_link="https://youtu.be/U0nH9cnrFB0"),
], ],
RAV4_TSS2.specs, RAV4_TSS2.specs,
flags=ToyotaFlags.RADAR_ACC, flags=ToyotaFlags.RADAR_ACC,
@ -259,20 +259,20 @@ class CAR(Platforms):
RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig( RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig(
"TOYOTA RAV4 2023", "TOYOTA RAV4 2023",
[ [
ToyotaCarInfo("Toyota RAV4 2023-24"), ToyotaCarDocs("Toyota RAV4 2023-24"),
ToyotaCarInfo("Toyota RAV4 Hybrid 2023-24"), ToyotaCarDocs("Toyota RAV4 Hybrid 2023-24"),
], ],
RAV4_TSS2.specs, RAV4_TSS2.specs,
flags=ToyotaFlags.RADAR_ACC | ToyotaFlags.ANGLE_CONTROL, flags=ToyotaFlags.RADAR_ACC | ToyotaFlags.ANGLE_CONTROL,
) )
MIRAI = ToyotaTSS2PlatformConfig( MIRAI = ToyotaTSS2PlatformConfig(
"TOYOTA MIRAI 2021", # TSS 2.5 "TOYOTA MIRAI 2021", # TSS 2.5
[ToyotaCarInfo("Toyota Mirai 2021")], [ToyotaCarDocs("Toyota Mirai 2021")],
CarSpecs(mass=4300. * CV.LB_TO_KG, wheelbase=2.91, steerRatio=14.8, tireStiffnessFactor=0.8), CarSpecs(mass=4300. * CV.LB_TO_KG, wheelbase=2.91, steerRatio=14.8, tireStiffnessFactor=0.8),
) )
SIENNA = PlatformConfig( SIENNA = PlatformConfig(
"TOYOTA SIENNA 2018", "TOYOTA SIENNA 2018",
[ToyotaCarInfo("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED)], [ToyotaCarDocs("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED)],
CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444), CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444),
dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
flags=ToyotaFlags.NO_STOP_TIMER, flags=ToyotaFlags.NO_STOP_TIMER,
@ -281,15 +281,15 @@ class CAR(Platforms):
# Lexus # Lexus
LEXUS_CTH = PlatformConfig( LEXUS_CTH = PlatformConfig(
"LEXUS CT HYBRID 2018", "LEXUS CT HYBRID 2018",
[ToyotaCarInfo("Lexus CT Hybrid 2017-18", "Lexus Safety System+")], [ToyotaCarDocs("Lexus CT Hybrid 2017-18", "Lexus Safety System+")],
CarSpecs(mass=3108. * CV.LB_TO_KG, wheelbase=2.6, steerRatio=18.6, tireStiffnessFactor=0.517), CarSpecs(mass=3108. * CV.LB_TO_KG, wheelbase=2.6, steerRatio=18.6, tireStiffnessFactor=0.517),
dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
) )
LEXUS_ES = PlatformConfig( LEXUS_ES = PlatformConfig(
"LEXUS ES 2018", "LEXUS ES 2018",
[ [
ToyotaCarInfo("Lexus ES 2017-18"), ToyotaCarDocs("Lexus ES 2017-18"),
ToyotaCarInfo("Lexus ES Hybrid 2017-18"), ToyotaCarDocs("Lexus ES Hybrid 2017-18"),
], ],
CarSpecs(mass=3677. * CV.LB_TO_KG, wheelbase=2.8702, steerRatio=16.0, tireStiffnessFactor=0.444), CarSpecs(mass=3677. * CV.LB_TO_KG, wheelbase=2.8702, steerRatio=16.0, tireStiffnessFactor=0.444),
dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
@ -297,28 +297,28 @@ class CAR(Platforms):
LEXUS_ES_TSS2 = ToyotaTSS2PlatformConfig( LEXUS_ES_TSS2 = ToyotaTSS2PlatformConfig(
"LEXUS ES 2019", "LEXUS ES 2019",
[ [
ToyotaCarInfo("Lexus ES 2019-24"), ToyotaCarDocs("Lexus ES 2019-24"),
ToyotaCarInfo("Lexus ES Hybrid 2019-24", video_link="https://youtu.be/BZ29osRVJeg?t=12"), ToyotaCarDocs("Lexus ES Hybrid 2019-24", video_link="https://youtu.be/BZ29osRVJeg?t=12"),
], ],
LEXUS_ES.specs, LEXUS_ES.specs,
) )
LEXUS_IS = PlatformConfig( LEXUS_IS = PlatformConfig(
"LEXUS IS 2018", "LEXUS IS 2018",
[ToyotaCarInfo("Lexus IS 2017-19")], [ToyotaCarDocs("Lexus IS 2017-19")],
CarSpecs(mass=3736.8 * CV.LB_TO_KG, wheelbase=2.79908, steerRatio=13.3, tireStiffnessFactor=0.444), CarSpecs(mass=3736.8 * CV.LB_TO_KG, wheelbase=2.79908, steerRatio=13.3, tireStiffnessFactor=0.444),
dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
flags=ToyotaFlags.UNSUPPORTED_DSU, flags=ToyotaFlags.UNSUPPORTED_DSU,
) )
LEXUS_IS_TSS2 = ToyotaTSS2PlatformConfig( LEXUS_IS_TSS2 = ToyotaTSS2PlatformConfig(
"LEXUS IS 2023", "LEXUS IS 2023",
[ToyotaCarInfo("Lexus IS 2022-23")], [ToyotaCarDocs("Lexus IS 2022-23")],
LEXUS_IS.specs, LEXUS_IS.specs,
) )
LEXUS_NX = PlatformConfig( LEXUS_NX = PlatformConfig(
"LEXUS NX 2018", "LEXUS NX 2018",
[ [
ToyotaCarInfo("Lexus NX 2018-19"), ToyotaCarDocs("Lexus NX 2018-19"),
ToyotaCarInfo("Lexus NX Hybrid 2018-19"), ToyotaCarDocs("Lexus NX Hybrid 2018-19"),
], ],
CarSpecs(mass=4070. * CV.LB_TO_KG, wheelbase=2.66, steerRatio=14.7, tireStiffnessFactor=0.444), CarSpecs(mass=4070. * CV.LB_TO_KG, wheelbase=2.66, steerRatio=14.7, tireStiffnessFactor=0.444),
dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
@ -326,19 +326,19 @@ class CAR(Platforms):
LEXUS_NX_TSS2 = ToyotaTSS2PlatformConfig( LEXUS_NX_TSS2 = ToyotaTSS2PlatformConfig(
"LEXUS NX 2020", "LEXUS NX 2020",
[ [
ToyotaCarInfo("Lexus NX 2020-21"), ToyotaCarDocs("Lexus NX 2020-21"),
ToyotaCarInfo("Lexus NX Hybrid 2020-21"), ToyotaCarDocs("Lexus NX Hybrid 2020-21"),
], ],
LEXUS_NX.specs, LEXUS_NX.specs,
) )
LEXUS_LC_TSS2 = ToyotaTSS2PlatformConfig( LEXUS_LC_TSS2 = ToyotaTSS2PlatformConfig(
"LEXUS LC 2024", "LEXUS LC 2024",
[ToyotaCarInfo("Lexus LC 2024")], [ToyotaCarDocs("Lexus LC 2024")],
CarSpecs(mass=4500. * CV.LB_TO_KG, wheelbase=2.87, steerRatio=13.0, tireStiffnessFactor=0.444), CarSpecs(mass=4500. * CV.LB_TO_KG, wheelbase=2.87, steerRatio=13.0, tireStiffnessFactor=0.444),
) )
LEXUS_RC = PlatformConfig( LEXUS_RC = PlatformConfig(
"LEXUS RC 2020", "LEXUS RC 2020",
[ToyotaCarInfo("Lexus RC 2018-20")], [ToyotaCarDocs("Lexus RC 2018-20")],
LEXUS_IS.specs, LEXUS_IS.specs,
dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
flags=ToyotaFlags.UNSUPPORTED_DSU, flags=ToyotaFlags.UNSUPPORTED_DSU,
@ -346,11 +346,11 @@ class CAR(Platforms):
LEXUS_RX = PlatformConfig( LEXUS_RX = PlatformConfig(
"LEXUS RX 2016", "LEXUS RX 2016",
[ [
ToyotaCarInfo("Lexus RX 2016", "Lexus Safety System+"), ToyotaCarDocs("Lexus RX 2016", "Lexus Safety System+"),
ToyotaCarInfo("Lexus RX 2017-19"), ToyotaCarDocs("Lexus RX 2017-19"),
# Hybrid platforms # Hybrid platforms
ToyotaCarInfo("Lexus RX Hybrid 2016", "Lexus Safety System+"), ToyotaCarDocs("Lexus RX Hybrid 2016", "Lexus Safety System+"),
ToyotaCarInfo("Lexus RX Hybrid 2017-19"), ToyotaCarDocs("Lexus RX Hybrid 2017-19"),
], ],
CarSpecs(mass=4481. * CV.LB_TO_KG, wheelbase=2.79, steerRatio=16., tireStiffnessFactor=0.5533), CarSpecs(mass=4481. * CV.LB_TO_KG, wheelbase=2.79, steerRatio=16., tireStiffnessFactor=0.5533),
dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'),
@ -358,14 +358,14 @@ class CAR(Platforms):
LEXUS_RX_TSS2 = ToyotaTSS2PlatformConfig( LEXUS_RX_TSS2 = ToyotaTSS2PlatformConfig(
"LEXUS RX 2020", "LEXUS RX 2020",
[ [
ToyotaCarInfo("Lexus RX 2020-22"), ToyotaCarDocs("Lexus RX 2020-22"),
ToyotaCarInfo("Lexus RX Hybrid 2020-22"), ToyotaCarDocs("Lexus RX Hybrid 2020-22"),
], ],
LEXUS_RX.specs, LEXUS_RX.specs,
) )
LEXUS_GS_F = PlatformConfig( LEXUS_GS_F = PlatformConfig(
"LEXUS GS F 2016", "LEXUS GS F 2016",
[ToyotaCarInfo("Lexus GS F 2016")], [ToyotaCarDocs("Lexus GS F 2016")],
CarSpecs(mass=4034. * CV.LB_TO_KG, wheelbase=2.84988, steerRatio=13.3, tireStiffnessFactor=0.444), CarSpecs(mass=4034. * CV.LB_TO_KG, wheelbase=2.84988, steerRatio=13.3, tireStiffnessFactor=0.444),
dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'),
flags=ToyotaFlags.UNSUPPORTED_DSU, flags=ToyotaFlags.UNSUPPORTED_DSU,

@ -7,7 +7,7 @@ from panda.python import uds
from opendbc.can.can_define import CANDefine from opendbc.can.can_define import CANDefine
from openpilot.common.conversions import Conversions as CV from openpilot.common.conversions import Conversions as CV
from openpilot.selfdrive.car import dbc_dict, CarSpecs, DbcDict, PlatformConfig, Platforms from openpilot.selfdrive.car import dbc_dict, CarSpecs, DbcDict, PlatformConfig, Platforms
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, \
Device Device
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16
@ -158,7 +158,7 @@ class Footnote(Enum):
@dataclass @dataclass
class VWCarInfo(CarInfo): class VWCarDocs(CarDocs):
package: str = "Adaptive Cruise Control (ACC) & Lane Assist" package: str = "Adaptive Cruise Control (ACC) & Lane Assist"
car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.j533])) car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.j533]))
@ -180,197 +180,197 @@ class CAR(Platforms):
ARTEON_MK1 = VolkswagenMQBPlatformConfig( ARTEON_MK1 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN ARTEON 1ST GEN", # Chassis AN "VOLKSWAGEN ARTEON 1ST GEN", # Chassis AN
[ [
VWCarInfo("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"), VWCarDocs("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"),
VWCarInfo("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), VWCarDocs("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"),
VWCarInfo("Volkswagen Arteon eHybrid 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), VWCarDocs("Volkswagen Arteon eHybrid 2020-23", video_link="https://youtu.be/FAomFKPFlDA"),
VWCarInfo("Volkswagen CC 2018-22", video_link="https://youtu.be/FAomFKPFlDA"), VWCarDocs("Volkswagen CC 2018-22", video_link="https://youtu.be/FAomFKPFlDA"),
], ],
VolkswagenCarSpecs(mass=1733, wheelbase=2.84), VolkswagenCarSpecs(mass=1733, wheelbase=2.84),
) )
ATLAS_MK1 = VolkswagenMQBPlatformConfig( ATLAS_MK1 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN ATLAS 1ST GEN", # Chassis CA "VOLKSWAGEN ATLAS 1ST GEN", # Chassis CA
[ [
VWCarInfo("Volkswagen Atlas 2018-23"), VWCarDocs("Volkswagen Atlas 2018-23"),
VWCarInfo("Volkswagen Atlas Cross Sport 2020-22"), VWCarDocs("Volkswagen Atlas Cross Sport 2020-22"),
VWCarInfo("Volkswagen Teramont 2018-22"), VWCarDocs("Volkswagen Teramont 2018-22"),
VWCarInfo("Volkswagen Teramont Cross Sport 2021-22"), VWCarDocs("Volkswagen Teramont Cross Sport 2021-22"),
VWCarInfo("Volkswagen Teramont X 2021-22"), VWCarDocs("Volkswagen Teramont X 2021-22"),
], ],
VolkswagenCarSpecs(mass=2011, wheelbase=2.98), VolkswagenCarSpecs(mass=2011, wheelbase=2.98),
) )
CADDY_MK3 = VolkswagenPQPlatformConfig( CADDY_MK3 = VolkswagenPQPlatformConfig(
"VOLKSWAGEN CADDY 3RD GEN", # Chassis 2K "VOLKSWAGEN CADDY 3RD GEN", # Chassis 2K
[ [
VWCarInfo("Volkswagen Caddy 2019"), VWCarDocs("Volkswagen Caddy 2019"),
VWCarInfo("Volkswagen Caddy Maxi 2019"), VWCarDocs("Volkswagen Caddy Maxi 2019"),
], ],
VolkswagenCarSpecs(mass=1613, wheelbase=2.6, minSteerSpeed=21 * CV.KPH_TO_MS), VolkswagenCarSpecs(mass=1613, wheelbase=2.6, minSteerSpeed=21 * CV.KPH_TO_MS),
) )
CRAFTER_MK2 = VolkswagenMQBPlatformConfig( CRAFTER_MK2 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN CRAFTER 2ND GEN", # Chassis SY/SZ "VOLKSWAGEN CRAFTER 2ND GEN", # Chassis SY/SZ
[ [
VWCarInfo("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"), VWCarDocs("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"),
VWCarInfo("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"), VWCarDocs("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"),
VWCarInfo("Volkswagen Grand California 2019-23", video_link="https://youtu.be/4100gLeabmo"), VWCarDocs("Volkswagen Grand California 2019-23", video_link="https://youtu.be/4100gLeabmo"),
VWCarInfo("MAN TGE 2017-23", video_link="https://youtu.be/4100gLeabmo"), VWCarDocs("MAN TGE 2017-23", video_link="https://youtu.be/4100gLeabmo"),
VWCarInfo("MAN eTGE 2020-23", video_link="https://youtu.be/4100gLeabmo"), VWCarDocs("MAN eTGE 2020-23", video_link="https://youtu.be/4100gLeabmo"),
], ],
VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS), VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS),
) )
GOLF_MK7 = VolkswagenMQBPlatformConfig( GOLF_MK7 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN GOLF 7TH GEN", # Chassis 5G/AU/BA/BE "VOLKSWAGEN GOLF 7TH GEN", # Chassis 5G/AU/BA/BE
[ [
VWCarInfo("Volkswagen e-Golf 2014-20"), VWCarDocs("Volkswagen e-Golf 2014-20"),
VWCarInfo("Volkswagen Golf 2015-20", auto_resume=False), VWCarDocs("Volkswagen Golf 2015-20", auto_resume=False),
VWCarInfo("Volkswagen Golf Alltrack 2015-19", auto_resume=False), VWCarDocs("Volkswagen Golf Alltrack 2015-19", auto_resume=False),
VWCarInfo("Volkswagen Golf GTD 2015-20"), VWCarDocs("Volkswagen Golf GTD 2015-20"),
VWCarInfo("Volkswagen Golf GTE 2015-20"), VWCarDocs("Volkswagen Golf GTE 2015-20"),
VWCarInfo("Volkswagen Golf GTI 2015-21", auto_resume=False), VWCarDocs("Volkswagen Golf GTI 2015-21", auto_resume=False),
VWCarInfo("Volkswagen Golf R 2015-19"), VWCarDocs("Volkswagen Golf R 2015-19"),
VWCarInfo("Volkswagen Golf SportsVan 2015-20"), VWCarDocs("Volkswagen Golf SportsVan 2015-20"),
], ],
VolkswagenCarSpecs(mass=1397, wheelbase=2.62), VolkswagenCarSpecs(mass=1397, wheelbase=2.62),
) )
JETTA_MK7 = VolkswagenMQBPlatformConfig( JETTA_MK7 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN JETTA 7TH GEN", # Chassis BU "VOLKSWAGEN JETTA 7TH GEN", # Chassis BU
[ [
VWCarInfo("Volkswagen Jetta 2018-24"), VWCarDocs("Volkswagen Jetta 2018-24"),
VWCarInfo("Volkswagen Jetta GLI 2021-24"), VWCarDocs("Volkswagen Jetta GLI 2021-24"),
], ],
VolkswagenCarSpecs(mass=1328, wheelbase=2.71), VolkswagenCarSpecs(mass=1328, wheelbase=2.71),
) )
PASSAT_MK8 = VolkswagenMQBPlatformConfig( PASSAT_MK8 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN PASSAT 8TH GEN", # Chassis 3G "VOLKSWAGEN PASSAT 8TH GEN", # Chassis 3G
[ [
VWCarInfo("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), VWCarDocs("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]),
VWCarInfo("Volkswagen Passat Alltrack 2015-22"), VWCarDocs("Volkswagen Passat Alltrack 2015-22"),
VWCarInfo("Volkswagen Passat GTE 2015-22"), VWCarDocs("Volkswagen Passat GTE 2015-22"),
], ],
VolkswagenCarSpecs(mass=1551, wheelbase=2.79), VolkswagenCarSpecs(mass=1551, wheelbase=2.79),
) )
PASSAT_NMS = VolkswagenPQPlatformConfig( PASSAT_NMS = VolkswagenPQPlatformConfig(
"VOLKSWAGEN PASSAT NMS", # Chassis A3 "VOLKSWAGEN PASSAT NMS", # Chassis A3
[VWCarInfo("Volkswagen Passat NMS 2017-22")], [VWCarDocs("Volkswagen Passat NMS 2017-22")],
VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50*CV.KPH_TO_MS, minEnableSpeed=20*CV.KPH_TO_MS), VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50*CV.KPH_TO_MS, minEnableSpeed=20*CV.KPH_TO_MS),
) )
POLO_MK6 = VolkswagenMQBPlatformConfig( POLO_MK6 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN POLO 6TH GEN", # Chassis AW "VOLKSWAGEN POLO 6TH GEN", # Chassis AW
[ [
VWCarInfo("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), VWCarDocs("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]),
VWCarInfo("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), VWCarDocs("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]),
], ],
VolkswagenCarSpecs(mass=1230, wheelbase=2.55), VolkswagenCarSpecs(mass=1230, wheelbase=2.55),
) )
SHARAN_MK2 = VolkswagenPQPlatformConfig( SHARAN_MK2 = VolkswagenPQPlatformConfig(
"VOLKSWAGEN SHARAN 2ND GEN", # Chassis 7N "VOLKSWAGEN SHARAN 2ND GEN", # Chassis 7N
[ [
VWCarInfo("Volkswagen Sharan 2018-22"), VWCarDocs("Volkswagen Sharan 2018-22"),
VWCarInfo("SEAT Alhambra 2018-20"), VWCarDocs("SEAT Alhambra 2018-20"),
], ],
VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50*CV.KPH_TO_MS), VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50*CV.KPH_TO_MS),
) )
TAOS_MK1 = VolkswagenMQBPlatformConfig( TAOS_MK1 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN TAOS 1ST GEN", # Chassis B2 "VOLKSWAGEN TAOS 1ST GEN", # Chassis B2
[VWCarInfo("Volkswagen Taos 2022-23")], [VWCarDocs("Volkswagen Taos 2022-23")],
VolkswagenCarSpecs(mass=1498, wheelbase=2.69), VolkswagenCarSpecs(mass=1498, wheelbase=2.69),
) )
TCROSS_MK1 = VolkswagenMQBPlatformConfig( TCROSS_MK1 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN T-CROSS 1ST GEN", # Chassis C1 "VOLKSWAGEN T-CROSS 1ST GEN", # Chassis C1
[VWCarInfo("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], [VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])],
VolkswagenCarSpecs(mass=1150, wheelbase=2.60), VolkswagenCarSpecs(mass=1150, wheelbase=2.60),
) )
TIGUAN_MK2 = VolkswagenMQBPlatformConfig( TIGUAN_MK2 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN TIGUAN 2ND GEN", # Chassis AD/BW "VOLKSWAGEN TIGUAN 2ND GEN", # Chassis AD/BW
[ [
VWCarInfo("Volkswagen Tiguan 2018-24"), VWCarDocs("Volkswagen Tiguan 2018-24"),
VWCarInfo("Volkswagen Tiguan eHybrid 2021-23"), VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"),
], ],
VolkswagenCarSpecs(mass=1715, wheelbase=2.74), VolkswagenCarSpecs(mass=1715, wheelbase=2.74),
) )
TOURAN_MK2 = VolkswagenMQBPlatformConfig( TOURAN_MK2 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN TOURAN 2ND GEN", # Chassis 1T "VOLKSWAGEN TOURAN 2ND GEN", # Chassis 1T
[VWCarInfo("Volkswagen Touran 2016-23")], [VWCarDocs("Volkswagen Touran 2016-23")],
VolkswagenCarSpecs(mass=1516, wheelbase=2.79), VolkswagenCarSpecs(mass=1516, wheelbase=2.79),
) )
TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( TRANSPORTER_T61 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN TRANSPORTER T6.1", # Chassis 7H/7L "VOLKSWAGEN TRANSPORTER T6.1", # Chassis 7H/7L
[ [
VWCarInfo("Volkswagen Caravelle 2020"), VWCarDocs("Volkswagen Caravelle 2020"),
VWCarInfo("Volkswagen California 2021-23"), VWCarDocs("Volkswagen California 2021-23"),
], ],
VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0), VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0),
) )
TROC_MK1 = VolkswagenMQBPlatformConfig( TROC_MK1 = VolkswagenMQBPlatformConfig(
"VOLKSWAGEN T-ROC 1ST GEN", # Chassis A1 "VOLKSWAGEN T-ROC 1ST GEN", # Chassis A1
[VWCarInfo("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])], [VWCarDocs("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])],
VolkswagenCarSpecs(mass=1413, wheelbase=2.63), VolkswagenCarSpecs(mass=1413, wheelbase=2.63),
) )
AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( AUDI_A3_MK3 = VolkswagenMQBPlatformConfig(
"AUDI A3 3RD GEN", # Chassis 8V/FF "AUDI A3 3RD GEN", # Chassis 8V/FF
[ [
VWCarInfo("Audi A3 2014-19"), VWCarDocs("Audi A3 2014-19"),
VWCarInfo("Audi A3 Sportback e-tron 2017-18"), VWCarDocs("Audi A3 Sportback e-tron 2017-18"),
VWCarInfo("Audi RS3 2018"), VWCarDocs("Audi RS3 2018"),
VWCarInfo("Audi S3 2015-17"), VWCarDocs("Audi S3 2015-17"),
], ],
VolkswagenCarSpecs(mass=1335, wheelbase=2.61), VolkswagenCarSpecs(mass=1335, wheelbase=2.61),
) )
AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig(
"AUDI Q2 1ST GEN", # Chassis GA "AUDI Q2 1ST GEN", # Chassis GA
[VWCarInfo("Audi Q2 2018")], [VWCarDocs("Audi Q2 2018")],
VolkswagenCarSpecs(mass=1205, wheelbase=2.61), VolkswagenCarSpecs(mass=1205, wheelbase=2.61),
) )
AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig(
"AUDI Q3 2ND GEN", # Chassis 8U/F3/FS "AUDI Q3 2ND GEN", # Chassis 8U/F3/FS
[VWCarInfo("Audi Q3 2019-23")], [VWCarDocs("Audi Q3 2019-23")],
VolkswagenCarSpecs(mass=1623, wheelbase=2.68), VolkswagenCarSpecs(mass=1623, wheelbase=2.68),
) )
SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig(
"SEAT ATECA 1ST GEN", # Chassis 5F "SEAT ATECA 1ST GEN", # Chassis 5F
[VWCarInfo("SEAT Ateca 2018")], [VWCarDocs("SEAT Ateca 2018")],
VolkswagenCarSpecs(mass=1900, wheelbase=2.64), VolkswagenCarSpecs(mass=1900, wheelbase=2.64),
) )
SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig(
"SEAT LEON 3RD GEN", # Chassis 5F "SEAT LEON 3RD GEN", # Chassis 5F
[VWCarInfo("SEAT Leon 2014-20")], [VWCarDocs("SEAT Leon 2014-20")],
VolkswagenCarSpecs(mass=1227, wheelbase=2.64), VolkswagenCarSpecs(mass=1227, wheelbase=2.64),
) )
SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig(
"SKODA FABIA 4TH GEN", # Chassis PJ "SKODA FABIA 4TH GEN", # Chassis PJ
[VWCarInfo("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])], [VWCarDocs("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])],
VolkswagenCarSpecs(mass=1266, wheelbase=2.56), VolkswagenCarSpecs(mass=1266, wheelbase=2.56),
) )
SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig(
"SKODA KAMIQ 1ST GEN", # Chassis NW "SKODA KAMIQ 1ST GEN", # Chassis NW
[VWCarInfo("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ])], [VWCarDocs("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ])],
VolkswagenCarSpecs(mass=1265, wheelbase=2.66), VolkswagenCarSpecs(mass=1265, wheelbase=2.66),
) )
SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig(
"SKODA KAROQ 1ST GEN", # Chassis NU "SKODA KAROQ 1ST GEN", # Chassis NU
[VWCarInfo("Škoda Karoq 2019-23")], [VWCarDocs("Škoda Karoq 2019-23")],
VolkswagenCarSpecs(mass=1278, wheelbase=2.66), VolkswagenCarSpecs(mass=1278, wheelbase=2.66),
) )
SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig(
"SKODA KODIAQ 1ST GEN", # Chassis NS "SKODA KODIAQ 1ST GEN", # Chassis NS
[VWCarInfo("Škoda Kodiaq 2017-23")], [VWCarDocs("Škoda Kodiaq 2017-23")],
VolkswagenCarSpecs(mass=1569, wheelbase=2.79), VolkswagenCarSpecs(mass=1569, wheelbase=2.79),
) )
SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig(
"SKODA OCTAVIA 3RD GEN", # Chassis NE "SKODA OCTAVIA 3RD GEN", # Chassis NE
[ [
VWCarInfo("Škoda Octavia 2015-19"), VWCarDocs("Škoda Octavia 2015-19"),
VWCarInfo("Škoda Octavia RS 2016"), VWCarDocs("Škoda Octavia RS 2016"),
], ],
VolkswagenCarSpecs(mass=1388, wheelbase=2.68), VolkswagenCarSpecs(mass=1388, wheelbase=2.68),
) )
SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig( SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig(
"SKODA SCALA 1ST GEN", # Chassis NW "SKODA SCALA 1ST GEN", # Chassis NW
[VWCarInfo("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0])], [VWCarDocs("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0])],
VolkswagenCarSpecs(mass=1192, wheelbase=2.65), VolkswagenCarSpecs(mass=1192, wheelbase=2.65),
) )
SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig(
"SKODA SUPERB 3RD GEN", # Chassis 3V/NP "SKODA SUPERB 3RD GEN", # Chassis 3V/NP
[VWCarInfo("Škoda Superb 2015-22")], [VWCarDocs("Škoda Superb 2015-22")],
VolkswagenCarSpecs(mass=1505, wheelbase=2.84), VolkswagenCarSpecs(mass=1505, wheelbase=2.84),
) )

Loading…
Cancel
Save