Hyundai: Car Port for Tucson Hybrid 2022 (#25276)
* Hyundai: Car Port for Tucson Hybrid 2022
* Update RELEASES.md
* Init gear_msg at the top
* FW versions from script
* Button send attempt
* start with some cleanup
* Send button fixed bits
* Define all bytes and only send PAUSE/RESUME
* Use CRUISE_INFO to cancel cruise and resume
* 8-bit counter
* Cleanup ish
* 8 bit counter
* Send at 20ms
* Disengage bits
* Revert bump submodules
* Allow tx on 0x1a0
* Fix byte counts
* Send LFA and HDA icons based on engageability
* Send cruise buttons only on HDA2 cars for now
* Add comments
* Add FLAG_HYUNDAI_CANFD_HDA2 flag
* Update interface.py
* Update carstate.py
* Update carstate.py
* Update carstate.py
* Bump submodules
* Bump panda
* Bump opendbc
* Allow tx with CRUISE_INACTIVE
* GEAR has 24 bytes only
* Generate car docs
* Fix CRUISE_INFO copy
* Remove unused class
* Add CAN-FD busses to unit test
* Bump opendbc
* Revert "Add CAN-FD busses to unit test"
This reverts commit 2f751640408a7f73a9100947cbd95ea13fbb8a48.
* Remove duplicate
* New tune based on data
* Panda safety cleanup
* Include bus 0 in rx checks
* Missed one
* bus 6 check
* Remove redundant check
* Add comments
* Bump opendbc
* Sync with DBC
* Hide LFA icon when disengaged
* Little endian
* fix comment
* more conditions in carcontroller
* update pedal signal
* update tuning
* cleanup carcontroller
* bump panda
* fix mismatch
* alt buttons
* little more cleanup
* update refs for EV6 new safety param
* bump panda
Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
old-commit-hash: bd5e28909f
This commit is contained in:
parent
e92b9f3490
commit
79dfc5293a
|
@ -7,6 +7,7 @@ Version 0.8.16 (2022-XX-XX)
|
|||
* Chevrolet Silverado 2020-21 support thanks to JasonJShuler!
|
||||
* Hyundai Ioniq 5 2022 support thanks to sunnyhaibin!
|
||||
* Hyundai Kona Electric 2022 support thanks to sunnyhaibin!
|
||||
* Hyundai Tucson Hybrid 2022 support thanks to sunnyhaibin!
|
||||
* Subaru Legacy 2020-22 support thanks to martinl!
|
||||
* Subaru Outback 2020-22 support
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
A supported vehicle is one that just works when you install a comma device. Every car performs differently with openpilot, but all supported cars should provide a better experience than any stock system.
|
||||
|
||||
# 203 Supported Cars
|
||||
# 204 Supported Cars
|
||||
|
||||
|Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Harness|
|
||||
|---|---|---|:---:|:---:|:---:|:---:|:---:|
|
||||
|
@ -77,6 +77,7 @@ A supported vehicle is one that just works when you install a comma device. Ever
|
|||
|Hyundai|Sonata Hybrid 2020-22|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|Hyundai A|
|
||||
|Hyundai|Tucson 2021|Smart Cruise Control (SCC)|Stock|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|Hyundai L|
|
||||
|Hyundai|Tucson Diesel 2019|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|Hyundai L|
|
||||
|Hyundai|Tucson Hybrid 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|Hyundai N|
|
||||
|Hyundai|Veloster 2019-20|Smart Cruise Control (SCC)|Stock|5 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|Hyundai E|
|
||||
|Jeep|Grand Cherokee 2016-18|Adaptive Cruise Control|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|FCA|
|
||||
|Jeep|Grand Cherokee 2019-21|Adaptive Cruise Control|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|FCA|
|
||||
|
|
2
panda
2
panda
|
@ -1 +1 @@
|
|||
Subproject commit abaa9f8968df13c8a858413cc9936269702c2d60
|
||||
Subproject commit 9d6496ece8465dfe30997b31dfb352e1e51dde6c
|
|
@ -8,6 +8,7 @@ from natsort import natsorted
|
|||
from typing import Dict, List
|
||||
|
||||
from common.basedir import BASEDIR
|
||||
from selfdrive.car import gen_empty_fingerprint
|
||||
from selfdrive.car.docs_definitions import CarInfo, Column
|
||||
from selfdrive.car.car_helpers import interfaces, get_interface_attr
|
||||
from selfdrive.car.hyundai.radar_interface import RADAR_START_ADDR as HKG_RADAR_START_ADDR
|
||||
|
@ -29,7 +30,8 @@ def get_all_car_info() -> List[CarInfo]:
|
|||
footnotes = get_all_footnotes()
|
||||
for model, car_info in get_interface_attr("CAR_INFO", combine_brands=True).items():
|
||||
# Hyundai exception: those with radar have openpilot longitudinal
|
||||
fingerprint = {0: {}, 1: {HKG_RADAR_START_ADDR: 8}, 2: {}, 3: {}}
|
||||
fingerprint = gen_empty_fingerprint()
|
||||
fingerprint[1] = {HKG_RADAR_START_ADDR: 8}
|
||||
CP = interfaces[model][0].get_params(model, fingerprint=fingerprint, disable_radar=True)
|
||||
|
||||
if CP.dashcamOnly or car_info is None:
|
||||
|
|
|
@ -5,7 +5,7 @@ from common.realtime import DT_CTRL
|
|||
from opendbc.can.packer import CANPacker
|
||||
from selfdrive.car import apply_std_steer_torque_limits
|
||||
from selfdrive.car.hyundai import hyundaicanfd, hyundaican
|
||||
from selfdrive.car.hyundai.values import Buttons, CarControllerParams, CANFD_CAR, CAR
|
||||
from selfdrive.car.hyundai.values import HyundaiFlags, Buttons, CarControllerParams, CANFD_CAR, CAR
|
||||
|
||||
VisualAlert = car.CarControl.HUDControl.VisualAlert
|
||||
LongCtrlState = car.CarControl.Actuators.LongControlState
|
||||
|
@ -71,22 +71,33 @@ class CarController:
|
|||
|
||||
if self.CP.carFingerprint in CANFD_CAR:
|
||||
# steering control
|
||||
can_sends.append(hyundaicanfd.create_lkas(self.packer, CC.enabled, CC.latActive, apply_steer))
|
||||
can_sends.append(hyundaicanfd.create_lkas(self.packer, self.CP, CC.enabled, CC.latActive, apply_steer))
|
||||
|
||||
if self.frame % 5 == 0:
|
||||
# block LFA on HDA2
|
||||
if self.frame % 5 == 0 and (self.CP.flags & HyundaiFlags.CANFD_HDA2):
|
||||
can_sends.append(hyundaicanfd.create_cam_0x2a4(self.packer, CS.cam_0x2a4))
|
||||
|
||||
# cruise cancel
|
||||
# LFA and HDA icons
|
||||
if self.frame % 2 == 0 and not (self.CP.flags & HyundaiFlags.CANFD_HDA2):
|
||||
can_sends.append(hyundaicanfd.create_lfahda_cluster(self.packer, CC.enabled))
|
||||
|
||||
# button presses
|
||||
if (self.frame - self.last_button_frame) * DT_CTRL > 0.25:
|
||||
# cruise cancel
|
||||
if CC.cruiseControl.cancel:
|
||||
for _ in range(20):
|
||||
can_sends.append(hyundaicanfd.create_buttons(self.packer, CS.buttons_counter+1, Buttons.CANCEL))
|
||||
self.last_button_frame = self.frame
|
||||
if self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS:
|
||||
can_sends.append(hyundaicanfd.create_cruise_info(self.packer, CS.cruise_info_copy, True))
|
||||
self.last_button_frame = self.frame
|
||||
else:
|
||||
for _ in range(20):
|
||||
can_sends.append(hyundaicanfd.create_buttons(self.packer, CS.buttons_counter+1, Buttons.CANCEL))
|
||||
self.last_button_frame = self.frame
|
||||
|
||||
# cruise standstill resume
|
||||
elif CC.cruiseControl.resume:
|
||||
can_sends.append(hyundaicanfd.create_buttons(self.packer, CS.buttons_counter+1, Buttons.RES_ACCEL))
|
||||
self.last_button_frame = self.frame
|
||||
if not (self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS):
|
||||
can_sends.append(hyundaicanfd.create_buttons(self.packer, CS.buttons_counter+1, Buttons.RES_ACCEL))
|
||||
self.last_button_frame = self.frame
|
||||
else:
|
||||
|
||||
# tester present - w/ no response (keeps radar disabled)
|
||||
|
|
|
@ -5,7 +5,7 @@ from cereal import car
|
|||
from common.conversions import Conversions as CV
|
||||
from opendbc.can.parser import CANParser
|
||||
from opendbc.can.can_define import CANDefine
|
||||
from selfdrive.car.hyundai.values import DBC, FEATURES, CAMERA_SCC_CAR, CANFD_CAR, EV_CAR, HYBRID_CAR, Buttons, CarControllerParams
|
||||
from selfdrive.car.hyundai.values import HyundaiFlags, DBC, FEATURES, CAMERA_SCC_CAR, CANFD_CAR, EV_CAR, HYBRID_CAR, Buttons, CarControllerParams
|
||||
from selfdrive.car.interfaces import CarStateBase
|
||||
|
||||
PREV_BUTTON_SAMPLES = 8
|
||||
|
@ -136,8 +136,11 @@ class CarState(CarStateBase):
|
|||
def update_canfd(self, cp, cp_cam):
|
||||
ret = car.CarState.new_message()
|
||||
|
||||
ret.gas = cp.vl["ACCELERATOR"]["ACCELERATOR_PEDAL"] / 255.
|
||||
ret.gasPressed = ret.gas > 1e-3
|
||||
if self.CP.flags & HyundaiFlags.CANFD_HDA2:
|
||||
ret.gas = cp.vl["ACCELERATOR"]["ACCELERATOR_PEDAL"] / 255.
|
||||
else:
|
||||
ret.gas = cp.vl["ACCELERATOR_ALT"]["ACCELERATOR_PEDAL"] / 1023.
|
||||
ret.gasPressed = ret.gas > 1e-5
|
||||
ret.brakePressed = cp.vl["BRAKE"]["BRAKE_PRESSED"] == 1
|
||||
|
||||
ret.doorOpen = cp.vl["DOORS_SEATBELTS"]["DRIVER_DOOR_OPEN"] == 1
|
||||
|
@ -168,16 +171,19 @@ class CarState(CarStateBase):
|
|||
|
||||
ret.cruiseState.available = True
|
||||
ret.cruiseState.enabled = cp.vl["SCC1"]["CRUISE_ACTIVE"] == 1
|
||||
ret.cruiseState.standstill = cp.vl["CRUISE_INFO"]["CRUISE_STANDSTILL"] == 1
|
||||
|
||||
cp_cruise_info = cp if self.CP.flags & HyundaiFlags.CANFD_HDA2 else cp_cam
|
||||
speed_factor = CV.MPH_TO_MS if cp.vl["CLUSTER_INFO"]["DISTANCE_UNIT"] == 1 else CV.KPH_TO_MS
|
||||
ret.cruiseState.speed = cp.vl["CRUISE_INFO"]["SET_SPEED"] * speed_factor
|
||||
ret.cruiseState.speed = cp_cruise_info.vl["CRUISE_INFO"]["SET_SPEED"] * speed_factor
|
||||
ret.cruiseState.standstill = cp_cruise_info.vl["CRUISE_INFO"]["CRUISE_STANDSTILL"] == 1
|
||||
|
||||
self.cruise_buttons.extend(cp.vl_all["CRUISE_BUTTONS"]["CRUISE_BUTTONS"])
|
||||
self.main_buttons.extend(cp.vl_all["CRUISE_BUTTONS"]["ADAPTIVE_CRUISE_MAIN_BTN"])
|
||||
self.buttons_counter = cp.vl["CRUISE_BUTTONS"]["COUNTER"]
|
||||
cruise_btn_msg = "CRUISE_BUTTONS_ALT" if self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS else "CRUISE_BUTTONS"
|
||||
self.cruise_buttons.extend(cp.vl_all[cruise_btn_msg]["CRUISE_BUTTONS"])
|
||||
self.main_buttons.extend(cp.vl_all[cruise_btn_msg]["ADAPTIVE_CRUISE_MAIN_BTN"])
|
||||
self.buttons_counter = cp.vl[cruise_btn_msg]["COUNTER"]
|
||||
self.cruise_info_copy = copy.copy(cp_cruise_info.vl["CRUISE_INFO"])
|
||||
|
||||
self.cam_0x2a4 = copy.copy(cp_cam.vl["CAM_0x2a4"])
|
||||
if self.CP.flags & HyundaiFlags.CANFD_HDA2:
|
||||
self.cam_0x2a4 = copy.copy(cp_cam.vl["CAM_0x2a4"])
|
||||
|
||||
return ret
|
||||
|
||||
|
@ -319,9 +325,7 @@ class CarState(CarStateBase):
|
|||
@staticmethod
|
||||
def get_cam_can_parser(CP):
|
||||
if CP.carFingerprint in CANFD_CAR:
|
||||
signals = [(f"BYTE{i}", "CAM_0x2a4") for i in range(3, 24)]
|
||||
checks = [("CAM_0x2a4", 20)]
|
||||
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 6)
|
||||
return CarState.get_cam_can_parser_canfd(CP)
|
||||
|
||||
signals = [
|
||||
# signal_name, signal_address
|
||||
|
@ -374,13 +378,14 @@ class CarState(CarStateBase):
|
|||
|
||||
@staticmethod
|
||||
def get_can_parser_canfd(CP):
|
||||
|
||||
cruise_btn_msg = "CRUISE_BUTTONS_ALT" if CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS else "CRUISE_BUTTONS"
|
||||
signals = [
|
||||
("WHEEL_SPEED_1", "WHEEL_SPEEDS"),
|
||||
("WHEEL_SPEED_2", "WHEEL_SPEEDS"),
|
||||
("WHEEL_SPEED_3", "WHEEL_SPEEDS"),
|
||||
("WHEEL_SPEED_4", "WHEEL_SPEEDS"),
|
||||
|
||||
("ACCELERATOR_PEDAL", "ACCELERATOR"),
|
||||
("GEAR", "GEAR_SHIFTER"),
|
||||
("BRAKE_PRESSED", "BRAKE"),
|
||||
|
||||
|
@ -390,11 +395,9 @@ class CarState(CarStateBase):
|
|||
("STEERING_OUT_TORQUE", "MDPS"),
|
||||
|
||||
("CRUISE_ACTIVE", "SCC1"),
|
||||
("SET_SPEED", "CRUISE_INFO"),
|
||||
("CRUISE_STANDSTILL", "CRUISE_INFO"),
|
||||
("COUNTER", "CRUISE_BUTTONS"),
|
||||
("CRUISE_BUTTONS", "CRUISE_BUTTONS"),
|
||||
("ADAPTIVE_CRUISE_MAIN_BTN", "CRUISE_BUTTONS"),
|
||||
("COUNTER", cruise_btn_msg),
|
||||
("CRUISE_BUTTONS", cruise_btn_msg),
|
||||
("ADAPTIVE_CRUISE_MAIN_BTN", cruise_btn_msg),
|
||||
|
||||
("DISTANCE_UNIT", "CLUSTER_INFO"),
|
||||
|
||||
|
@ -407,17 +410,64 @@ class CarState(CarStateBase):
|
|||
|
||||
checks = [
|
||||
("WHEEL_SPEEDS", 100),
|
||||
("ACCELERATOR", 100),
|
||||
("GEAR_SHIFTER", 100),
|
||||
("BRAKE", 100),
|
||||
("STEERING_SENSORS", 100),
|
||||
("MDPS", 100),
|
||||
("SCC1", 50),
|
||||
("CRUISE_INFO", 50),
|
||||
("CRUISE_BUTTONS", 50),
|
||||
(cruise_btn_msg, 50),
|
||||
("CLUSTER_INFO", 4),
|
||||
("BLINKERS", 4),
|
||||
("DOORS_SEATBELTS", 4),
|
||||
]
|
||||
|
||||
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 5)
|
||||
if CP.flags & HyundaiFlags.CANFD_HDA2:
|
||||
signals += [
|
||||
("ACCELERATOR_PEDAL", "ACCELERATOR"),
|
||||
("GEAR", "ACCELERATOR"),
|
||||
("SET_SPEED", "CRUISE_INFO"),
|
||||
("CRUISE_STANDSTILL", "CRUISE_INFO"),
|
||||
]
|
||||
checks += [
|
||||
("CRUISE_INFO", 50),
|
||||
("ACCELERATOR", 100),
|
||||
]
|
||||
else:
|
||||
signals += [
|
||||
("ACCELERATOR_PEDAL", "ACCELERATOR_ALT"),
|
||||
]
|
||||
checks += [
|
||||
("ACCELERATOR_ALT", 100),
|
||||
]
|
||||
|
||||
bus = 5 if CP.flags & HyundaiFlags.CANFD_HDA2 else 4
|
||||
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, bus)
|
||||
|
||||
@staticmethod
|
||||
def get_cam_can_parser_canfd(CP):
|
||||
if CP.flags & HyundaiFlags.CANFD_HDA2:
|
||||
signals = [(f"BYTE{i}", "CAM_0x2a4") for i in range(3, 24)]
|
||||
checks = [("CAM_0x2a4", 20)]
|
||||
else:
|
||||
signals = [
|
||||
("COUNTER", "CRUISE_INFO"),
|
||||
("NEW_SIGNAL_1", "CRUISE_INFO"),
|
||||
("CRUISE_MAIN", "CRUISE_INFO"),
|
||||
("CRUISE_STATUS", "CRUISE_INFO"),
|
||||
("CRUISE_INACTIVE", "CRUISE_INFO"),
|
||||
("NEW_SIGNAL_2", "CRUISE_INFO"),
|
||||
("CRUISE_STANDSTILL", "CRUISE_INFO"),
|
||||
("NEW_SIGNAL_3", "CRUISE_INFO"),
|
||||
("BYTE11", "CRUISE_INFO"),
|
||||
("SET_SPEED", "CRUISE_INFO"),
|
||||
("NEW_SIGNAL_4", "CRUISE_INFO"),
|
||||
]
|
||||
|
||||
signals += [(f"BYTE{i}", "CRUISE_INFO") for i in range(3, 7)]
|
||||
signals += [(f"BYTE{i}", "CRUISE_INFO") for i in range(13, 31)]
|
||||
|
||||
checks = [
|
||||
("CRUISE_INFO", 50),
|
||||
]
|
||||
|
||||
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 6)
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
def create_lkas(packer, enabled, lat_active, apply_steer):
|
||||
from selfdrive.car.hyundai.values import HyundaiFlags
|
||||
|
||||
|
||||
def create_lkas(packer, CP, enabled, lat_active, apply_steer):
|
||||
values = {
|
||||
"LKA_MODE": 2,
|
||||
"LKA_ICON": 2 if enabled else 1,
|
||||
|
@ -10,7 +13,9 @@ def create_lkas(packer, enabled, lat_active, apply_steer):
|
|||
"NEW_SIGNAL_1": 0,
|
||||
"NEW_SIGNAL_2": 0,
|
||||
}
|
||||
return packer.make_can_msg("LKAS", 4, values)
|
||||
|
||||
msg = "LKAS" if CP.flags & HyundaiFlags.CANFD_HDA2 else "LFA"
|
||||
return packer.make_can_msg(msg, 4, values)
|
||||
|
||||
def create_cam_0x2a4(packer, camera_values):
|
||||
camera_values.update({
|
||||
|
@ -25,3 +30,17 @@ def create_buttons(packer, cnt, btn):
|
|||
"CRUISE_BUTTONS": btn,
|
||||
}
|
||||
return packer.make_can_msg("CRUISE_BUTTONS", 5, values)
|
||||
|
||||
def create_cruise_info(packer, cruise_info_copy, cancel):
|
||||
values = cruise_info_copy
|
||||
if cancel:
|
||||
values["CRUISE_STATUS"] = 0
|
||||
values["CRUISE_INACTIVE"] = 1
|
||||
return packer.make_can_msg("CRUISE_INFO", 4, values)
|
||||
|
||||
def create_lfahda_cluster(packer, enabled):
|
||||
values = {
|
||||
"HDA_ICON": 1 if enabled else 0,
|
||||
"LFA_ICON": 2 if enabled else 0,
|
||||
}
|
||||
return packer.make_can_msg("LFAHDA_CLUSTER", 4, values)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
from cereal import car
|
||||
from panda import Panda
|
||||
from common.conversions import Conversions as CV
|
||||
from selfdrive.car.hyundai.values import CAR, DBC, CANFD_CAR, CAMERA_SCC_CAR, EV_CAR, HYBRID_CAR, LEGACY_SAFETY_MODE_CAR, Buttons, CarControllerParams
|
||||
from selfdrive.car.hyundai.values import HyundaiFlags, CAR, DBC, CANFD_CAR, CAMERA_SCC_CAR, EV_CAR, HYBRID_CAR, LEGACY_SAFETY_MODE_CAR, Buttons, CarControllerParams
|
||||
from selfdrive.car.hyundai.radar_interface import RADAR_START_ADDR
|
||||
from selfdrive.car import STD_CARGO_KG, create_button_event, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
@ -160,6 +160,12 @@ class CarInterface(CarInterfaceBase):
|
|||
tire_stiffness_factor = 0.385
|
||||
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
|
||||
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.25], [0.05]]
|
||||
elif candidate == CAR.TUCSON_HYBRID_4TH_GEN:
|
||||
ret.mass = 1680. + STD_CARGO_KG # average of all 3 trims
|
||||
ret.wheelbase = 2.756
|
||||
ret.steerRatio = 16.
|
||||
tire_stiffness_factor = 0.385
|
||||
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
|
||||
|
||||
# Kia
|
||||
elif candidate == CAR.KIA_SORENTO:
|
||||
|
@ -284,7 +290,18 @@ class CarInterface(CarInterfaceBase):
|
|||
if candidate in CANFD_CAR:
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.noOutput),
|
||||
get_safety_config(car.CarParams.SafetyModel.hyundaiCanfd)]
|
||||
|
||||
# detect HDA2 with LKAS message
|
||||
if 0x50 in fingerprint[6]:
|
||||
ret.flags |= HyundaiFlags.CANFD_HDA2.value
|
||||
ret.safetyConfigs[1].safetyParam |= Panda.FLAG_HYUNDAI_CANFD_HDA2
|
||||
else:
|
||||
# non-HDA2
|
||||
if 0x1cf not in fingerprint[4]:
|
||||
ret.flags |= HyundaiFlags.CANFD_ALT_BUTTONS.value
|
||||
else:
|
||||
ret.enableBsm = 0x58b in fingerprint[0]
|
||||
|
||||
if candidate in LEGACY_SAFETY_MODE_CAR:
|
||||
# these cars require a special panda safety mode due to missing counters and checksums in the messages
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hyundaiLegacy)]
|
||||
|
@ -314,8 +331,6 @@ class CarInterface(CarInterfaceBase):
|
|||
ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront,
|
||||
tire_stiffness_factor=tire_stiffness_factor)
|
||||
|
||||
ret.enableBsm = 0x58b in fingerprint[0]
|
||||
|
||||
return ret
|
||||
|
||||
@staticmethod
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from enum import IntFlag
|
||||
from dataclasses import dataclass
|
||||
from typing import Dict, List, Optional, Union
|
||||
|
||||
|
@ -38,6 +39,11 @@ class CarControllerParams:
|
|||
self.STEER_MAX = 384
|
||||
|
||||
|
||||
class HyundaiFlags(IntFlag):
|
||||
CANFD_HDA2 = 1
|
||||
CANFD_ALT_BUTTONS = 2
|
||||
|
||||
|
||||
class CAR:
|
||||
# Hyundai
|
||||
ELANTRA = "HYUNDAI ELANTRA 2017"
|
||||
|
@ -66,6 +72,7 @@ class CAR:
|
|||
VELOSTER = "HYUNDAI VELOSTER 2019"
|
||||
SONATA_HYBRID = "HYUNDAI SONATA HYBRID 2021"
|
||||
IONIQ_5 = "HYUNDAI IONIQ 5 2022"
|
||||
TUCSON_HYBRID_4TH_GEN = "HYUNDAI TUCSON HYBRID 4TH GEN"
|
||||
|
||||
# Kia
|
||||
KIA_FORTE = "KIA FORTE E 2018 & GT 2021"
|
||||
|
@ -128,6 +135,7 @@ CAR_INFO: Dict[str, Optional[Union[HyundaiCarInfo, List[HyundaiCarInfo]]]] = {
|
|||
CAR.VELOSTER: HyundaiCarInfo("Hyundai Veloster 2019-20", "Smart Cruise Control (SCC)", min_enable_speed=5. * CV.MPH_TO_MS, harness=Harness.hyundai_e),
|
||||
CAR.SONATA_HYBRID: HyundaiCarInfo("Hyundai Sonata Hybrid 2020-22", "All", harness=Harness.hyundai_a),
|
||||
CAR.IONIQ_5: HyundaiCarInfo("Hyundai Ioniq 5 2022", "Highway Driving Assist II", harness=Harness.hyundai_q),
|
||||
CAR.TUCSON_HYBRID_4TH_GEN: HyundaiCarInfo("Hyundai Tucson Hybrid 2022", "All", harness=Harness.hyundai_n),
|
||||
|
||||
# Kia
|
||||
CAR.KIA_FORTE: [
|
||||
|
@ -1292,6 +1300,21 @@ FW_VERSIONS = {
|
|||
b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.02 99211-GI010 211206',
|
||||
],
|
||||
},
|
||||
CAR.TUCSON_HYBRID_4TH_GEN: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9240 14Q',
|
||||
],
|
||||
(Ecu.eps, 0x7d4, None): [
|
||||
b'\xf1\x00NX4 MDPS C 1.00 1.01 56300-P0100 2228',
|
||||
],
|
||||
(Ecu.engine, 0x7e0, None): [
|
||||
b'\xf1\x87391312MND0',
|
||||
],
|
||||
(Ecu.transmission, 0x7e1, None): [
|
||||
b'\xf1\x00PSBG2441 G19_Rev\x00\x00\x00SNX4T16XXHS01NS2lS\xdfa',
|
||||
b'\xf1\x8795441-3D220\x00\xf1\x81G19_Rev\x00\x00\x00\xf1\x00PSBG2441 G19_Rev\x00\x00\x00SNX4T16XXHS01NS2lS\xdfa',
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
CHECKSUM = {
|
||||
|
@ -1309,7 +1332,7 @@ FEATURES = {
|
|||
"use_fca": {CAR.SONATA, CAR.SONATA_HYBRID, CAR.ELANTRA, CAR.ELANTRA_2021, CAR.ELANTRA_HEV_2021, CAR.ELANTRA_GT_I30, CAR.KIA_STINGER, CAR.IONIQ_EV_2020, CAR.IONIQ_PHEV, CAR.KONA_EV, CAR.KIA_FORTE, CAR.KIA_NIRO_EV, CAR.PALISADE, CAR.GENESIS_G70, CAR.GENESIS_G70_2020, CAR.KONA, CAR.SANTA_FE, CAR.KIA_SELTOS, CAR.KONA_HEV, CAR.SANTA_FE_2022, CAR.KIA_K5_2021, CAR.IONIQ_HEV_2022, CAR.SANTA_FE_HEV_2022, CAR.SANTA_FE_PHEV_2022, CAR.TUCSON, CAR.KONA_EV_2022},
|
||||
}
|
||||
|
||||
CANFD_CAR = {CAR.KIA_EV6, CAR.IONIQ_5}
|
||||
CANFD_CAR = {CAR.KIA_EV6, CAR.IONIQ_5, CAR.TUCSON_HYBRID_4TH_GEN}
|
||||
|
||||
# The camera does SCC on these cars, rather than the radar
|
||||
CAMERA_SCC_CAR = {CAR.KONA_EV_2022, }
|
||||
|
@ -1364,5 +1387,6 @@ DBC = {
|
|||
CAR.KIA_CEED: dbc_dict('hyundai_kia_generic', None),
|
||||
CAR.KIA_EV6: dbc_dict('hyundai_canfd', None),
|
||||
CAR.SONATA_HYBRID: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar'),
|
||||
CAR.TUCSON_HYBRID_4TH_GEN: dbc_dict('hyundai_canfd', None),
|
||||
CAR.IONIQ_5: dbc_dict('hyundai_canfd', None),
|
||||
}
|
||||
|
|
|
@ -90,6 +90,7 @@ routes = [
|
|||
TestRoute("5b7c365c50084530|2020-04-15--16-13-24", HYUNDAI.SONATA),
|
||||
TestRoute("b2a38c712dcf90bd|2020-05-18--18-12-48", HYUNDAI.SONATA_LF),
|
||||
TestRoute("fb3fd42f0baaa2f8|2022-03-30--15-25-05", HYUNDAI.TUCSON),
|
||||
TestRoute("36e10531feea61a4|2022-07-25--13-37-42", HYUNDAI.TUCSON_HYBRID_4TH_GEN),
|
||||
TestRoute("5875672fc1d4bf57|2020-07-23--21-33-28", HYUNDAI.KIA_SORENTO),
|
||||
TestRoute("9c917ba0d42ffe78|2020-04-17--12-43-19", HYUNDAI.PALISADE),
|
||||
TestRoute("22de8111a8c5463c|2022-07-29--13-34-49", HYUNDAI.IONIQ_5),
|
||||
|
|
|
@ -27,6 +27,7 @@ SUBARU OUTBACK 6TH GEN: [2.3, 2.3, 0.11]
|
|||
CHEVROLET BOLT EUV 2022: [2.0, 2.0, 0.05]
|
||||
CHEVROLET SILVERADO 1500 2020: [1.9, 1.9, 0.112]
|
||||
VOLKSWAGEN PASSAT NMS: [2.5, 2.5, 0.1]
|
||||
HYUNDAI TUCSON HYBRID 4TH GEN: [2.5, 2.5, 0.0]
|
||||
|
||||
# Dashcam or fallback configured as ideal car
|
||||
mock: [10.0, 10, 0.0]
|
||||
|
|
|
@ -1 +1 @@
|
|||
93a136f91739847afe1e1a4a1e98bc7c0adb5ec8
|
||||
656daeb9de3680258527500ecae4ddff323b2e59
|
|
@ -18,7 +18,7 @@ from tools.lib.logreader import LogReader
|
|||
original_segments = [
|
||||
("BODY", "937ccb7243511b65|2022-05-24--16-03-09--1"), # COMMA.BODY
|
||||
("HYUNDAI", "02c45f73a2e5c6e9|2021-01-01--19-08-22--1"), # HYUNDAI.SONATA
|
||||
("HYUNDAI", "d824e27e8c60172c|2022-07-08--21-21-15--0"), # HYUNDAI.KIA_EV6
|
||||
("HYUNDAI", "d824e27e8c60172c|2022-08-19--17-58-07--2"), # HYUNDAI.KIA_EV6
|
||||
("TOYOTA", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.PRIUS (INDI)
|
||||
("TOYOTA2", "0982d79ebb0de295|2021-01-03--20-03-36--6"), # TOYOTA.RAV4 (LQR)
|
||||
("TOYOTA3", "f7d7e3538cda1a2a|2021-08-16--08-55-34--6"), # TOYOTA.COROLLA_TSS2
|
||||
|
@ -40,7 +40,7 @@ original_segments = [
|
|||
segments = [
|
||||
("BODY", "regen660D86654BA|2022-07-06--14-27-15--0"),
|
||||
("HYUNDAI", "regen114E5FF24D8|2022-07-14--17-08-47--0"),
|
||||
("HYUNDAI", "d824e27e8c60172c|2022-07-08--21-21-15--0"),
|
||||
("HYUNDAI", "d824e27e8c60172c|2022-08-19--17-58-07--2"),
|
||||
("TOYOTA", "regenBA97410FBEC|2022-07-06--14-26-49--0"),
|
||||
("TOYOTA2", "regenDEDB1D9C991|2022-07-06--14-54-08--0"),
|
||||
("TOYOTA3", "regenDDC1FE60734|2022-07-06--14-32-06--0"),
|
||||
|
|
Loading…
Reference in New Issue