diff --git a/README.md b/README.md
index 673996df12..360ad90804 100644
--- a/README.md
+++ b/README.md
@@ -132,15 +132,23 @@ Community Maintained Cars and Features
| Chrysler | Pacifica 2020 | Adaptive Cruise | Stock | 0mph | 39mph |
| Chrysler | Pacifica Hybrid 2017-18 | Adaptive Cruise | Stock | 0mph | 9mph |
| Chrysler | Pacifica Hybrid 2019-20 | Adaptive Cruise | Stock | 0mph | 39mph |
+| Genesis | G80 20182 | All | Stock | 0mph | 0mph |
+| Genesis | G90 20182 | All | Stock | 0mph | 0mph |
| GMC | Acadia Denali 20183| Adaptive Cruise | openpilot | 0mph | 7mph |
| Holden | Astra 20171 | Adaptive Cruise | openpilot | 0mph | 7mph |
| Hyundai | Elantra 2017-192 | SCC + LKAS | Stock | 19mph | 34mph |
-| Hyundai | Genesis 20182 | All | Stock | 19mph | 34mph |
+| Hyundai | Genesis 2015-162 | SCC + LKAS | Stock | 19mph | 37mph |
+| Hyundai | Ioniq 20172 | SCC + LKAS | Stock | 0mph | 32mph |
+| Hyundai | Ioniq 2019 EV2 | SCC + LKAS | Stock | 0mph | 32mph |
+| Hyundai | Kona 2017-192 | SCC + LKAS | Stock | 22mph | 0mph |
+| Hyundai | Kona 2019 EV2 | SCC + LKAS | Stock | 0mph | 0mph |
| Hyundai | Santa Fe 20192 | All | Stock | 0mph | 0mph |
| Jeep | Grand Cherokee 2016-18 | Adaptive Cruise | Stock | 0mph | 9mph |
| Jeep | Grand Cherokee 2019 | Adaptive Cruise | Stock | 0mph | 39mph |
+| Kia | Forte 20182 | SCC + LKAS | Stock | 0mph | 0mph |
+| Kia | Optima 20172 | SCC + LKAS/LDWS | Stock | 0mph | 32mph |
| Kia | Optima 20192 | SCC + LKAS | Stock | 0mph | 0mph |
-| Kia | Sorento 20182 | All | Stock | 0mph | 0mph |
+| Kia | Sorento 20182 | SCC + LKAS | Stock | 0mph | 0mph |
| Kia | Stinger 20182 | SCC + LKAS | Stock | 0mph | 0mph |
| Nissan | Leaf 2019 | Propilot | Stock | 0mph | 0mph |
| Nissan | X-Trail 2018 | Propilot | Stock | 0mph | 0mph |
diff --git a/RELEASES.md b/RELEASES.md
index 7c1b817ef6..853eddfddd 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -1,9 +1,9 @@
Version 0.7.5 (2020-xx-xx)
========================
* Right-Hand Drive support for both driving and driver monitoring!
-* New driving model:
* New driver monitoring model: overall improvement on comma two
* Driver camera preview in settings to improve mounting position
+* Added support for many Hyundai, Kia, Genesis models thanks to xx979xx!
* 2019 Nissan X-Trail and 2018 Nissan Leaf support thanks to avolmensky!
Version 0.7.4 (2020-03-20)
diff --git a/opendbc b/opendbc
index a57e7ddbd7..b69398525a 160000
--- a/opendbc
+++ b/opendbc
@@ -1 +1 @@
-Subproject commit a57e7ddbd72c92241d5d6442da9d47c55e95a8cf
+Subproject commit b69398525a4f3d590305df171572415568e365aa
diff --git a/panda b/panda
index bc90b60f97..435cabe7f7 160000
--- a/panda
+++ b/panda
@@ -1 +1 @@
-Subproject commit bc90b60f973ddf422ea78ce8fb83fbf88448694f
+Subproject commit 435cabe7f7a02a0c732725b97cbb7192a68a406d
diff --git a/selfdrive/car/hyundai/carcontroller.py b/selfdrive/car/hyundai/carcontroller.py
index efd8796e08..79d509a1da 100644
--- a/selfdrive/car/hyundai/carcontroller.py
+++ b/selfdrive/car/hyundai/carcontroller.py
@@ -1,47 +1,103 @@
+from cereal import car
from selfdrive.car import apply_std_steer_torque_limits
-from selfdrive.car.hyundai.hyundaican import create_lkas11, create_clu11
-from selfdrive.car.hyundai.values import Buttons, SteerLimitParams
+from selfdrive.car.hyundai.hyundaican import create_lkas11, create_clu11, create_lfa_mfa
+from selfdrive.car.hyundai.values import Buttons, SteerLimitParams, CAR
from opendbc.can.packer import CANPacker
+VisualAlert = car.CarControl.HUDControl.VisualAlert
+
+
+def process_hud_alert(enabled, fingerprint, visual_alert, left_lane,
+ right_lane, left_lane_depart, right_lane_depart):
+ sys_warning = (visual_alert == VisualAlert.steerRequired)
+
+ # initialize to no line visible
+ sys_state = 1
+ if left_lane and right_lane or sys_warning: #HUD alert only display when LKAS status is active
+ if enabled or sys_warning:
+ sys_state = 3
+ else:
+ sys_state = 4
+ elif left_lane:
+ sys_state = 5
+ elif right_lane:
+ sys_state = 6
+
+ # initialize to no warnings
+ left_lane_warning = 0
+ right_lane_warning = 0
+ if left_lane_depart:
+ left_lane_warning = 1 if fingerprint in [CAR.GENESIS_G90, CAR.GENESIS_G80] else 2
+ if right_lane_depart:
+ right_lane_warning = 1 if fingerprint in [CAR.GENESIS_G90, CAR.GENESIS_G80] else 2
+
+ return sys_warning, sys_state, left_lane_warning, right_lane_warning
+
class CarController():
def __init__(self, dbc_name, CP, VM):
self.apply_steer_last = 0
self.car_fingerprint = CP.carFingerprint
- self.lkas11_cnt = 0
- self.cnt = 0
- self.last_resume_cnt = 0
self.packer = CANPacker(dbc_name)
self.steer_rate_limited = False
+ self.resume_cnt = 0
+ self.last_resume_frame = 0
+ self.last_lead_distance = 0
- def update(self, enabled, CS, actuators, pcm_cancel_cmd, hud_alert):
-
- ### Steering Torque
+ def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, visual_alert,
+ left_lane, right_lane, left_lane_depart, right_lane_depart):
+ # Steering Torque
new_steer = actuators.steer * SteerLimitParams.STEER_MAX
apply_steer = apply_std_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorque, SteerLimitParams)
self.steer_rate_limited = new_steer != apply_steer
- if not enabled:
- apply_steer = 0
+ # disable if steer angle reach 90 deg, otherwise mdps fault in some models
+ lkas_active = enabled and abs(CS.out.steeringAngle) < 90.
- steer_req = 1 if enabled else 0
+ # fix for Genesis hard fault at low speed
+ if CS.out.vEgo < 16.7 and self.car_fingerprint == CAR.HYUNDAI_GENESIS:
+ lkas_active = 0
+
+ if not lkas_active:
+ apply_steer = 0
self.apply_steer_last = apply_steer
+ sys_warning, sys_state, left_lane_warning, right_lane_warning =\
+ process_hud_alert(enabled, self.car_fingerprint, visual_alert,
+ left_lane, right_lane, left_lane_depart, right_lane_depart)
+
can_sends = []
-
- self.lkas11_cnt = self.cnt % 0x10
- self.clu11_cnt = self.cnt % 0x10
-
- can_sends.append(create_lkas11(self.packer, self.car_fingerprint, apply_steer, steer_req, self.lkas11_cnt,
- enabled, CS.lkas11, hud_alert, keep_stock=True))
+ can_sends.append(create_lkas11(self.packer, frame, self.car_fingerprint, apply_steer, lkas_active,
+ CS.lkas11, sys_warning, sys_state, enabled,
+ left_lane, right_lane,
+ left_lane_warning, right_lane_warning))
if pcm_cancel_cmd:
- can_sends.append(create_clu11(self.packer, CS.clu11, Buttons.CANCEL))
- elif CS.out.cruiseState.standstill and (self.cnt - self.last_resume_cnt) > 5:
- self.last_resume_cnt = self.cnt
- can_sends.append(create_clu11(self.packer, CS.clu11, Buttons.RES_ACCEL))
+ can_sends.append(create_clu11(self.packer, frame, CS.clu11, Buttons.CANCEL))
+
+ elif CS.out.cruiseState.standstill:
+ # run only first time when the car stopped
+ if self.last_lead_distance == 0:
+ # get the lead distance from the Radar
+ self.last_lead_distance = CS.lead_distance
+ self.resume_cnt = 0
+ # when lead car starts moving, create 6 RES msgs
+ elif CS.lead_distance != self.last_lead_distance and (frame - self.last_resume_frame) > 5:
+ can_sends.append(create_clu11(self.packer, frame, CS.clu11, Buttons.RES_ACCEL))
+ self.resume_cnt += 1
+ # interval after 6 msgs
+ if self.resume_cnt > 5:
+ self.last_resume_frame = frame
+ self.clu11_cnt = 0
+ # reset lead distnce after the car starts moving
+ elif self.last_lead_distance != 0:
+ self.last_lead_distance = 0
+
+
+ # 20 Hz LFA MFA message
+ if frame % 5 == 0 and self.car_fingerprint == CAR.SONATA:
+ can_sends.append(create_lfa_mfa(self.packer, frame, enabled))
- self.cnt += 1
return can_sends
diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py
index 59c825f44d..dcb5844c2c 100644
--- a/selfdrive/car/hyundai/carstate.py
+++ b/selfdrive/car/hyundai/carstate.py
@@ -6,12 +6,14 @@ from selfdrive.config import Conversions as CV
GearShifter = car.CarState.GearShifter
-class CarState(CarStateBase):
+class CarState(CarStateBase):
def update(self, cp, cp_cam):
ret = car.CarState.new_message()
- ret.doorOpen = False # FIXME
+ ret.doorOpen = any([cp.vl["CGW1"]['CF_Gway_DrvDrSw'],cp.vl["CGW1"]['CF_Gway_AstDrSw'],
+ cp.vl["CGW2"]['CF_Gway_RLDrSw'], cp.vl["CGW2"]['CF_Gway_RRDrSw']])
+
ret.seatbeltUnlatched = cp.vl["CGW1"]['CF_Gway_DrvSeatBeltSw'] == 0
ret.wheelSpeeds.fl = cp.vl["WHL_SPD11"]['WHL_SPD_FL'] * CV.KPH_TO_MS
@@ -28,14 +30,15 @@ class CarState(CarStateBase):
ret.yawRate = cp.vl["ESP12"]['YAW_RATE']
ret.leftBlinker = cp.vl["CGW1"]['CF_Gway_TSigLHSw'] != 0
ret.rightBlinker = cp.vl["CGW1"]['CF_Gway_TSigRHSw'] != 0
- ret.steeringTorque = cp.vl["MDPS11"]['CR_Mdps_DrvTq']
+ ret.steeringTorque = cp.vl["MDPS12"]['CR_Mdps_StrColTq']
ret.steeringTorqueEps = cp.vl["MDPS12"]['CR_Mdps_OutTq']
ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD
# cruise state
- ret.cruiseState.enabled = cp.vl["SCC12"]['ACCMode'] != 0
ret.cruiseState.available = True
+ ret.cruiseState.enabled = cp.vl["SCC12"]['ACCMode'] != 0
ret.cruiseState.standstill = cp.vl["SCC11"]['SCCInfoDisplay'] == 4.
+
if ret.cruiseState.enabled:
is_set_speed_in_mph = int(cp.vl["CLU11"]["CF_Clu_SPEED_UNIT"])
speed_conv = CV.MPH_TO_MS if is_set_speed_in_mph else CV.KPH_TO_MS
@@ -43,56 +46,72 @@ class CarState(CarStateBase):
else:
ret.cruiseState.speed = 0
- ret.brake = 0 # FIXME
+ # TODO: Find brake pressure
+ ret.brake = 0
ret.brakePressed = cp.vl["TCS13"]['DriverBraking'] != 0
- ret.brakeLights = ret.brakePressed
- ret.gas = cp.vl["EMS12"]['PV_AV_CAN'] / 100
- ret.gasPressed = cp.vl["EMS16"]["CF_Ems_AclAct"] != 0
- ret.espDisabled = cp.vl["TCS15"]['ESC_Off_Step'] != 0
- # Gear Selecton - This is not compatible with all Kia/Hyundai's, But is the best way for those it is compatible with
- gear = cp.vl["LVR12"]["CF_Lvr_Gear"]
- if gear == 5:
- gear_shifter = GearShifter.drive
- elif gear == 6:
- gear_shifter = GearShifter.neutral
- elif gear == 0:
- gear_shifter = GearShifter.park
- elif gear == 7:
- gear_shifter = GearShifter.reverse
+ # TODO: Check this
+ ret.brakeLights = bool(cp.vl["TCS13"]['BrakeLight'] or ret.brakePressed)
+
+ #TODO: find pedal signal for EV/HYBRID Cars
+ if (cp.vl["TCS13"]["DriverOverride"] == 0 and cp.vl["TCS13"]['ACC_REQ'] == 1):
+ pedal_gas = 0
else:
- gear_shifter = GearShifter.unknown
+ pedal_gas = cp.vl["EMS12"]['TPS']
+ ret.gasPressed = pedal_gas > 1e-3
+ ret.gas = pedal_gas
+
+ # TODO: refactor gear parsing in function
# Gear Selection via Cluster - For those Kia/Hyundai which are not fully discovered, we can use the Cluster Indicator for Gear Selection, as this seems to be standard over all cars, but is not the preferred method.
- if cp.vl["CLU15"]["CF_Clu_InhibitD"] == 1:
- gear_shifter_cluster = GearShifter.drive
- elif cp.vl["CLU15"]["CF_Clu_InhibitN"] == 1:
- gear_shifter_cluster = GearShifter.neutral
- elif cp.vl["CLU15"]["CF_Clu_InhibitP"] == 1:
- gear_shifter_cluster = GearShifter.park
- elif cp.vl["CLU15"]["CF_Clu_InhibitR"] == 1:
- gear_shifter_cluster = GearShifter.reverse
- else:
- gear_shifter_cluster = GearShifter.unknown
-
- # Gear Selecton via TCU12
- gear2 = cp.vl["TCU12"]["CUR_GR"]
- if gear2 == 0:
- gear_tcu = GearShifter.park
- elif gear2 == 14:
- gear_tcu = GearShifter.reverse
- elif gear2 > 0 and gear2 < 9: # unaware of anything over 8 currently
- gear_tcu = GearShifter.drive
- else:
- gear_tcu = GearShifter.unknown
-
- # gear shifter
if self.CP.carFingerprint in FEATURES["use_cluster_gears"]:
- ret.gearShifter = gear_shifter_cluster
+ if cp.vl["CLU15"]["CF_Clu_InhibitD"] == 1:
+ ret.gearShifter = GearShifter.drive
+ elif cp.vl["CLU15"]["CF_Clu_InhibitN"] == 1:
+ ret.gearShifter = GearShifter.neutral
+ elif cp.vl["CLU15"]["CF_Clu_InhibitP"] == 1:
+ ret.gearShifter = GearShifter.park
+ elif cp.vl["CLU15"]["CF_Clu_InhibitR"] == 1:
+ ret.gearShifter = GearShifter.reverse
+ else:
+ ret.gearShifter = GearShifter.unknown
+ # Gear Selecton via TCU12
elif self.CP.carFingerprint in FEATURES["use_tcu_gears"]:
- ret.gearShifter = gear_tcu
+ gear = cp.vl["TCU12"]["CUR_GR"]
+ if gear == 0:
+ ret.gearShifter = GearShifter.park
+ elif gear == 14:
+ ret.gearShifter = GearShifter.reverse
+ elif gear > 0 and gear < 9: # unaware of anything over 8 currently
+ ret.gearShifter = GearShifter.drive
+ else:
+ ret.gearShifter = GearShifter.unknown
+ # Gear Selecton - This is only compatible with optima hybrid 2017
+ elif self.CP.carFingerprint in FEATURES["use_elect_gears"]:
+ gear = cp.vl["ELECT_GEAR"]["Elect_Gear_Shifter"]
+ if gear in (5, 8): # 5: D, 8: sport mode
+ ret.gearShifter = GearShifter.drive
+ elif gear == 6:
+ ret.gearShifter = GearShifter.neutral
+ elif gear == 0:
+ ret.gearShifter = GearShifter.park
+ elif gear == 7:
+ ret.gearShifter = GearShifter.reverse
+ else:
+ ret.gearShifter = GearShifter.unknown
+ # Gear Selecton - This is not compatible with all Kia/Hyundai's, But is the best way for those it is compatible with
else:
- ret.gearShifter = gear_shifter
+ gear = cp.vl["LVR12"]["CF_Lvr_Gear"]
+ if gear in (5, 8): # 5: D, 8: sport mode
+ ret.gearShifter = GearShifter.drive
+ elif gear == 6:
+ ret.gearShifter = GearShifter.neutral
+ elif gear == 0:
+ ret.gearShifter = GearShifter.park
+ elif gear == 7:
+ ret.gearShifter = GearShifter.reverse
+ else:
+ ret.gearShifter = GearShifter.unknown
# save the entire LKAS11 and CLU11
self.lkas11 = cp_cam.vl["LKAS11"]
@@ -100,13 +119,12 @@ class CarState(CarStateBase):
self.park_brake = cp.vl["CGW1"]['CF_Gway_ParkBrakeSw']
self.steer_state = cp.vl["MDPS12"]['CF_Mdps_ToiActive'] #0 NOT ACTIVE, 1 ACTIVE
self.steer_warning = cp.vl["MDPS12"]['CF_Mdps_ToiUnavail']
- self.brake_error = 0
+ self.lead_distance = cp.vl["SCC11"]['ACC_ObjDist']
return ret
@staticmethod
def get_can_parser(CP):
-
signals = [
# sig_name, sig_address, default
("WHL_SPD_FL", "WHL_SPD11", 0),
@@ -119,16 +137,16 @@ class CarState(CarStateBase):
("CF_Gway_DrvSeatBeltInd", "CGW4", 1),
("CF_Gway_DrvSeatBeltSw", "CGW1", 0),
+ ("CF_Gway_DrvDrSw", "CGW1", 0), # Driver Door
+ ("CF_Gway_AstDrSw", "CGW1", 0), # Passenger door
+ ("CF_Gway_RLDrSw", "CGW2", 0), # Rear reft door
+ ("CF_Gway_RRDrSw", "CGW2", 0), # Rear right door
("CF_Gway_TSigLHSw", "CGW1", 0),
("CF_Gway_TurnSigLh", "CGW1", 0),
("CF_Gway_TSigRHSw", "CGW1", 0),
("CF_Gway_TurnSigRh", "CGW1", 0),
("CF_Gway_ParkBrakeSw", "CGW1", 0),
- ("BRAKE_ACT", "EMS12", 0),
- ("PV_AV_CAN", "EMS12", 0),
- ("CF_Ems_AclAct", "EMS16", 0),
-
("CYL_PRES", "ESP12", 0),
("CF_Clu_CruiseSwState", "CLU11", 0),
@@ -144,54 +162,76 @@ class CarState(CarStateBase):
("CF_Clu_AmpInfo", "CLU11", 0),
("CF_Clu_AliveCnt1", "CLU11", 0),
- ("CF_Clu_InhibitD", "CLU15", 0),
- ("CF_Clu_InhibitP", "CLU15", 0),
- ("CF_Clu_InhibitN", "CLU15", 0),
- ("CF_Clu_InhibitR", "CLU15", 0),
-
- ("CF_Lvr_Gear", "LVR12",0),
- ("CUR_GR", "TCU12",0),
-
("ACCEnable", "TCS13", 0),
+ ("ACC_REQ", "TCS13", 0),
+ ("BrakeLight", "TCS13", 0),
("DriverBraking", "TCS13", 0),
+ ("DriverOverride", "TCS13", 0),
("ESC_Off_Step", "TCS15", 0),
("CF_Lvr_GearInf", "LVR11", 0), #Transmission Gear (0 = N or P, 1-8 = Fwd, 14 = Rev)
- ("CR_Mdps_DrvTq", "MDPS11", 0),
-
("CR_Mdps_StrColTq", "MDPS12", 0),
("CF_Mdps_ToiActive", "MDPS12", 0),
("CF_Mdps_ToiUnavail", "MDPS12", 0),
("CF_Mdps_FailStat", "MDPS12", 0),
("CR_Mdps_OutTq", "MDPS12", 0),
- ("VSetDis", "SCC11", 0),
- ("SCCInfoDisplay", "SCC11", 0),
- ("ACCMode", "SCC12", 1),
-
("SAS_Angle", "SAS11", 0),
("SAS_Speed", "SAS11", 0),
+
+ ("MainMode_ACC", "SCC11", 0),
+ ("VSetDis", "SCC11", 0),
+ ("SCCInfoDisplay", "SCC11", 0),
+ ("ACC_ObjDist", "SCC11", 0),
+ ("ACCMode", "SCC12", 1),
+
+ ("TPS", "EMS12", 0),
]
checks = [
# address, frequency
("MDPS12", 50),
- ("MDPS11", 100),
- ("TCS15", 10),
("TCS13", 50),
+ ("TCS15", 10),
("CLU11", 50),
("ESP12", 100),
- ("EMS12", 100),
- ("EMS16", 100),
("CGW1", 10),
("CGW4", 5),
("WHL_SPD11", 50),
+ ("SAS11", 100),
("SCC11", 50),
("SCC12", 50),
- ("SAS11", 100)
+ ("EMS12", 100),
]
+ if CP.carFingerprint in FEATURES["use_cluster_gears"]:
+ signals += [
+ ("CF_Clu_InhibitD", "CLU15", 0),
+ ("CF_Clu_InhibitP", "CLU15", 0),
+ ("CF_Clu_InhibitN", "CLU15", 0),
+ ("CF_Clu_InhibitR", "CLU15", 0),
+ ]
+ checks += [
+ ("CLU15", 5)
+ ]
+ elif CP.carFingerprint in FEATURES["use_tcu_gears"]:
+ signals += [
+ ("CUR_GR", "TCU12",0)
+ ]
+ checks += [
+ ("TCU12", 100)
+ ]
+ elif CP.carFingerprint in FEATURES["use_elect_gears"]:
+ signals += [("Elect_Gear_Shifter", "ELECT_GEAR", 0)]
+ checks += [("ELECT_GEAR", 20)]
+ else:
+ signals += [
+ ("CF_Lvr_Gear","LVR12",0)
+ ]
+ checks += [
+ ("LVR12", 100)
+ ]
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)
@@ -200,13 +240,13 @@ class CarState(CarStateBase):
signals = [
# sig_name, sig_address, default
+ ("CF_Lkas_Bca_R", "LKAS11", 0),
("CF_Lkas_LdwsSysState", "LKAS11", 0),
("CF_Lkas_SysWarning", "LKAS11", 0),
("CF_Lkas_LdwsLHWarning", "LKAS11", 0),
("CF_Lkas_LdwsRHWarning", "LKAS11", 0),
("CF_Lkas_HbaLamp", "LKAS11", 0),
("CF_Lkas_FcwBasReq", "LKAS11", 0),
- ("CF_Lkas_ToiFlt", "LKAS11", 0),
("CF_Lkas_HbaSysState", "LKAS11", 0),
("CF_Lkas_FcwOpt", "LKAS11", 0),
("CF_Lkas_HbaOpt", "LKAS11", 0),
diff --git a/selfdrive/car/hyundai/hyundaican.py b/selfdrive/car/hyundai/hyundaican.py
index 910e05ad7c..7a72145e03 100644
--- a/selfdrive/car/hyundai/hyundaican.py
+++ b/selfdrive/car/hyundai/hyundaican.py
@@ -1,31 +1,47 @@
import crcmod
-from selfdrive.car.hyundai.values import CHECKSUM
+from selfdrive.car.hyundai.values import CAR, CHECKSUM
hyundai_checksum = crcmod.mkCrcFun(0x11D, initCrc=0xFD, rev=False, xorOut=0xdf)
-def create_lkas11(packer, car_fingerprint, apply_steer, steer_req, cnt, enabled, lkas11, hud_alert, keep_stock=False):
- values = {
- "CF_Lkas_Bca_R": 3 if enabled else 0,
- "CF_Lkas_LdwsSysState": 3 if steer_req else 1,
- "CF_Lkas_SysWarning": hud_alert,
- "CF_Lkas_LdwsLHWarning": lkas11["CF_Lkas_LdwsLHWarning"] if keep_stock else 0,
- "CF_Lkas_LdwsRHWarning": lkas11["CF_Lkas_LdwsRHWarning"] if keep_stock else 0,
- "CF_Lkas_HbaLamp": lkas11["CF_Lkas_HbaLamp"] if keep_stock else 0,
- "CF_Lkas_FcwBasReq": lkas11["CF_Lkas_FcwBasReq"] if keep_stock else 0,
- "CR_Lkas_StrToqReq": apply_steer,
- "CF_Lkas_ActToi": steer_req,
- "CF_Lkas_ToiFlt": 0,
- "CF_Lkas_HbaSysState": lkas11["CF_Lkas_HbaSysState"] if keep_stock else 1,
- "CF_Lkas_FcwOpt": lkas11["CF_Lkas_FcwOpt"] if keep_stock else 0,
- "CF_Lkas_HbaOpt": lkas11["CF_Lkas_HbaOpt"] if keep_stock else 3,
- "CF_Lkas_MsgCount": cnt,
- "CF_Lkas_FcwSysState": lkas11["CF_Lkas_FcwSysState"] if keep_stock else 0,
- "CF_Lkas_FcwCollisionWarning": lkas11["CF_Lkas_FcwCollisionWarning"] if keep_stock else 0,
- "CF_Lkas_FusionState": lkas11["CF_Lkas_FusionState"] if keep_stock else 0,
- "CF_Lkas_Chksum": 0,
- "CF_Lkas_FcwOpt_USM": 2 if enabled else 1,
- "CF_Lkas_LdwsOpt_USM": lkas11["CF_Lkas_LdwsOpt_USM"] if keep_stock else 3,
- }
+
+def create_lkas11(packer, frame, car_fingerprint, apply_steer, steer_req,
+ lkas11, sys_warning, sys_state, enabled,
+ left_lane, right_lane,
+ left_lane_depart, right_lane_depart):
+ values = lkas11
+ values["CF_Lkas_LdwsSysState"] = sys_state
+ values["CF_Lkas_SysWarning"] = 3 if sys_warning else 0
+ values["CF_Lkas_LdwsLHWarning"] = left_lane_depart
+ values["CF_Lkas_LdwsRHWarning"] = right_lane_depart
+ values["CR_Lkas_StrToqReq"] = apply_steer
+ values["CF_Lkas_ActToi"] = steer_req
+ values["CF_Lkas_ToiFlt"] = 0
+ values["CF_Lkas_MsgCount"] = frame % 0x10
+ values["CF_Lkas_Chksum"] = 0
+
+ if car_fingerprint == CAR.SONATA:
+ values["CF_Lkas_Bca_R"] = int(left_lane) + (int(right_lane) << 1)
+ values["CF_Lkas_LdwsOpt_USM"] = 2
+
+ # FcwOpt_USM 5 = Orange blinking car + lanes
+ # FcwOpt_USM 4 = Orange car + lanes
+ # FcwOpt_USM 3 = Green blinking car + lanes
+ # FcwOpt_USM 2 = Green car + lanes
+ # FcwOpt_USM 1 = White car + lanes
+ # FcwOpt_USM 0 = No car + lanes
+ values["CF_Lkas_FcwOpt_USM"] = 2 if enabled else 1
+
+ # 4 is keep hands on wheel
+ # 5 is keep hands on wheel (red)
+ # 6 is keep hands on wheel (red) + beep
+ values["CF_Lkas_SysWarning"] = 4 if sys_warning else 0
+
+ elif car_fingerprint == CAR.HYUNDAI_GENESIS:
+ # This field is actually LdwsActivemode
+ # Genesis and Optima fault when forwarding while engaged
+ values["CF_Lkas_Bca_R"] = 2
+ elif car_fingerprint == CAR.KIA_OPTIMA:
+ values["CF_Lkas_Bca_R"] = 0
dat = packer.make_can_msg("LKAS11", 0, values)[2]
@@ -36,7 +52,7 @@ def create_lkas11(packer, car_fingerprint, apply_steer, steer_req, cnt, enabled,
elif car_fingerprint in CHECKSUM["6B"]:
# Checksum of first 6 Bytes, as seen on 2018 Kia Sorento
checksum = sum(dat[:6]) % 256
- elif car_fingerprint in CHECKSUM["7B"]:
+ else:
# Checksum of first 6 Bytes and last Byte as seen on 2018 Kia Stinger
checksum = (sum(dat[:6]) + dat[7]) % 256
@@ -44,20 +60,29 @@ def create_lkas11(packer, car_fingerprint, apply_steer, steer_req, cnt, enabled,
return packer.make_can_msg("LKAS11", 0, values)
-def create_clu11(packer, clu11, button):
+
+def create_clu11(packer, frame, clu11, button):
+ values = clu11
+ values["CF_Clu_CruiseSwState"] = button
+ values["CF_Clu_CruiseSwState"] = frame % 0x10
+ return packer.make_can_msg("CLU11", 0, values)
+
+
+def create_lfa_mfa(packer, frame, enabled):
values = {
- "CF_Clu_CruiseSwState": button,
- "CF_Clu_CruiseSwMain": clu11["CF_Clu_CruiseSwMain"],
- "CF_Clu_SldMainSW": clu11["CF_Clu_SldMainSW"],
- "CF_Clu_ParityBit1": clu11["CF_Clu_ParityBit1"],
- "CF_Clu_VanzDecimal": clu11["CF_Clu_VanzDecimal"],
- "CF_Clu_Vanz": clu11["CF_Clu_Vanz"],
- "CF_Clu_SPEED_UNIT": clu11["CF_Clu_SPEED_UNIT"],
- "CF_Clu_DetentOut": clu11["CF_Clu_DetentOut"],
- "CF_Clu_RheostatLevel": clu11["CF_Clu_RheostatLevel"],
- "CF_Clu_CluInfo": clu11["CF_Clu_CluInfo"],
- "CF_Clu_AmpInfo": clu11["CF_Clu_AmpInfo"],
- "CF_Clu_AliveCnt1": 0,
+ "ACTIVE": enabled,
}
- return packer.make_can_msg("CLU11", 0, values)
+ # ACTIVE 1 = Green steering wheel icon
+
+ # LFA_USM 2 & 3 = LFA cancelled, fast loud beeping
+ # LFA_USM 0 & 1 = No mesage
+
+ # LFA_SysWarning 1 = "Switching to HDA", short beep
+ # LFA_SysWarning 2 = "Switching to Smart Cruise control", short beep
+ # LFA_SysWarning 3 = LFA error
+
+ # ACTIVE2: nothing
+ # HDA_USM: nothing
+
+ return packer.make_can_msg("LFAHDA_MFC", 0, values)
diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py
index c8246e124f..c1ff9221aa 100644
--- a/selfdrive/car/hyundai/interface.py
+++ b/selfdrive/car/hyundai/interface.py
@@ -2,7 +2,7 @@
from cereal import car
from selfdrive.config import Conversions as CV
from selfdrive.controls.lib.drive_helpers import EventTypes as ET, create_event
-from selfdrive.car.hyundai.values import Ecu, ECU_FINGERPRINT, CAR, get_hud_alerts, FINGERPRINTS
+from selfdrive.car.hyundai.values import Ecu, ECU_FINGERPRINT, CAR, FINGERPRINTS
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, is_ecu_disconnected, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
@@ -20,9 +20,6 @@ class CarInterface(CarInterfaceBase):
ret.safetyModel = car.CarParams.SafetyModel.hyundai
ret.radarOffCan = True
- # Hyundai port is a community feature, since we don't own one to test
- ret.communityFeature = True
-
ret.steerActuatorDelay = 0.1 # Default delay
ret.steerRateCost = 0.5
ret.steerLimitTimer = 0.4
@@ -32,14 +29,20 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kf = 0.00005
ret.mass = 3982. * CV.LB_TO_KG + STD_CARGO_KG
ret.wheelbase = 2.766
-
# Values from optimizer
ret.steerRatio = 16.55 # 13.8 is spec end-to-end
tire_stiffness_factor = 0.82
-
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[9., 22.], [9., 22.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2, 0.35], [0.05, 0.09]]
ret.minSteerSpeed = 0.
+ elif candidate == CAR.SONATA:
+ ret.lateralTuning.pid.kf = 0.00005
+ ret.mass = 1513. + STD_CARGO_KG
+ ret.wheelbase = 2.84
+ ret.steerRatio = 13.27 * 1.15 # 15% higher at the center seems reasonable
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.25], [0.05]]
+ ret.minSteerSpeed = 0.
elif candidate == CAR.KIA_SORENTO:
ret.lateralTuning.pid.kf = 0.00005
ret.mass = 1985. + STD_CARGO_KG
@@ -48,7 +51,7 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.25], [0.05]]
ret.minSteerSpeed = 0.
- elif candidate == CAR.ELANTRA:
+ elif candidate in [CAR.ELANTRA, CAR.ELANTRA_GT_I30]:
ret.lateralTuning.pid.kf = 0.00006
ret.mass = 1275. + STD_CARGO_KG
ret.wheelbase = 2.7
@@ -57,15 +60,21 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.25], [0.05]]
ret.minSteerSpeed = 32 * CV.MPH_TO_MS
- elif candidate == CAR.GENESIS:
+ elif candidate == CAR.HYUNDAI_GENESIS:
ret.lateralTuning.pid.kf = 0.00005
ret.mass = 2060. + STD_CARGO_KG
ret.wheelbase = 3.01
ret.steerRatio = 16.5
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.16], [0.01]]
- ret.minSteerSpeed = 35 * CV.MPH_TO_MS
- elif candidate == CAR.KIA_OPTIMA:
+ ret.minSteerSpeed = 60 * CV.KPH_TO_MS
+ elif candidate in [CAR.GENESIS_G90, CAR.GENESIS_G80]:
+ ret.mass = 2200
+ ret.wheelbase = 3.15
+ ret.steerRatio = 12.069
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.16], [0.01]]
+ elif candidate in [CAR.KIA_OPTIMA, CAR.KIA_OPTIMA_H]:
ret.lateralTuning.pid.kf = 0.00005
ret.mass = 3558. * CV.LB_TO_KG
ret.wheelbase = 2.80
@@ -81,6 +90,48 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.25], [0.05]]
ret.minSteerSpeed = 0.
+ elif candidate == CAR.KONA:
+ ret.lateralTuning.pid.kf = 0.00006
+ ret.mass = 1275. + STD_CARGO_KG
+ ret.wheelbase = 2.7
+ ret.steerRatio = 13.73 #Spec
+ 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.IONIQ:
+ ret.lateralTuning.pid.kf = 0.00006
+ ret.mass = 1275. + STD_CARGO_KG
+ ret.wheelbase = 2.7
+ ret.steerRatio = 13.73 #Spec
+ 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]]
+ ret.minSteerSpeed = 32 * CV.MPH_TO_MS
+ elif candidate == CAR.KONA_EV:
+ ret.lateralTuning.pid.kf = 0.00006
+ ret.mass = 1685. + STD_CARGO_KG
+ ret.wheelbase = 2.7
+ ret.steerRatio = 13.73 #Spec
+ 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.IONIQ_EV_LTD:
+ ret.lateralTuning.pid.kf = 0.00006
+ ret.mass = 1490. + STD_CARGO_KG #weight per hyundai site https://www.hyundaiusa.com/ioniq-electric/specifications.aspx
+ ret.wheelbase = 2.7
+ ret.steerRatio = 13.73 #Spec
+ 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]]
+ ret.minSteerSpeed = 32 * CV.MPH_TO_MS
+ elif candidate == CAR.KIA_FORTE:
+ ret.lateralTuning.pid.kf = 0.00005
+ ret.mass = 3558. * CV.LB_TO_KG
+ ret.wheelbase = 2.80
+ ret.steerRatio = 13.75
+ tire_stiffness_factor = 0.5
+ ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.25], [0.05]]
ret.centerToFront = ret.wheelbase * 0.4
@@ -108,6 +159,7 @@ class CarInterface(CarInterfaceBase):
ret.buttonEvents = []
events = self.create_common_events(ret)
+ #TODO: addd abs(self.CS.angle_steers) > 90 to 'steerTempUnavailable' event
# low speed steer alert hysteresis logic (only for cars with steer cut off above 10 m/s)
if ret.vEgo < (self.CP.minSteerSpeed + 2.) and self.CP.minSteerSpeed > 10.:
@@ -123,10 +175,8 @@ class CarInterface(CarInterfaceBase):
return self.CS.out
def apply(self, c):
-
- hud_alert = get_hud_alerts(c.hudControl.visualAlert)
-
- can_sends = self.CC.update(c.enabled, self.CS, c.actuators,
- c.cruiseControl.cancel, hud_alert)
-
+ can_sends = self.CC.update(c.enabled, self.CS, self.frame, c.actuators,
+ c.cruiseControl.cancel, c.hudControl.visualAlert, c.hudControl.leftLaneVisible,
+ c.hudControl.rightLaneVisible, c.hudControl.leftLaneDepart, c.hudControl.rightLaneDepart)
+ self.frame += 1
return can_sends
diff --git a/selfdrive/car/hyundai/radar_interface.py b/selfdrive/car/hyundai/radar_interface.py
index b2f7651136..444fab781f 100644
--- a/selfdrive/car/hyundai/radar_interface.py
+++ b/selfdrive/car/hyundai/radar_interface.py
@@ -1,5 +1,77 @@
#!/usr/bin/env python3
+import os
+import time
+from cereal import car
+from opendbc.can.parser import CANParser
from selfdrive.car.interfaces import RadarInterfaceBase
+from selfdrive.car.hyundai.values import DBC
+
+
+def get_radar_can_parser(CP):
+ signals = [
+ # sig_name, sig_address, default
+ ("ACC_ObjStatus", "SCC11", 0),
+ ("ACC_ObjLatPos", "SCC11", 0),
+ ("ACC_ObjDist", "SCC11", 0),
+ ("ACC_ObjRelSpd", "SCC11", 0),
+ ]
+ checks = [
+ # address, frequency
+ ("SCC11", 50),
+ ]
+ return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)
+
class RadarInterface(RadarInterfaceBase):
- pass
+ def __init__(self, CP):
+ # radar
+ self.pts = {}
+ self.delay = 0 # Delay of radar
+ self.rcp = get_radar_can_parser(CP)
+ self.updated_messages = set()
+ self.trigger_msg = 0x420
+ self.track_id = 0
+ self.radar_off_can = CP.radarOffCan
+
+ def update(self, can_strings):
+ if self.radar_off_can:
+ if 'NO_RADAR_SLEEP' not in os.environ:
+ time.sleep(0.05) # radard runs on RI updates
+
+ return car.RadarData.new_message()
+
+ vls = self.rcp.update_strings(can_strings)
+ self.updated_messages.update(vls)
+
+ if self.trigger_msg not in self.updated_messages:
+ return None
+
+ rr = self._update(self.updated_messages)
+ self.updated_messages.clear()
+
+ return rr
+
+ def _update(self, updated_messages):
+ ret = car.RadarData.new_message()
+ cpt = self.rcp.vl
+ errors = []
+ if not self.rcp.can_valid:
+ errors.append("canError")
+ ret.errors = errors
+
+ valid = cpt["SCC11"]['ACC_ObjStatus']
+ if valid:
+ for ii in range(2):
+ if ii not in self.pts:
+ self.pts[ii] = car.RadarData.RadarPoint.new_message()
+ self.pts[ii].trackId = self.track_id
+ self.track_id += 1
+ self.pts[ii].dRel = cpt["SCC11"]['ACC_ObjDist'] # from front of car
+ self.pts[ii].yRel = -cpt["SCC11"]['ACC_ObjLatPos'] # in car frame's y axis, left is negative
+ self.pts[ii].vRel = cpt["SCC11"]['ACC_ObjRelSpd']
+ self.pts[ii].aRel = float('nan')
+ self.pts[ii].yvRel = float('nan')
+ self.pts[ii].measured = True
+
+ ret.points = list(self.pts.values())
+ return ret
diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py
index 7fe689c623..1358bed2a8 100644
--- a/selfdrive/car/hyundai/values.py
+++ b/selfdrive/car/hyundai/values.py
@@ -2,16 +2,7 @@ from cereal import car
from selfdrive.car import dbc_dict
Ecu = car.CarParams.Ecu
-VisualAlert = car.CarControl.HUDControl.VisualAlert
-
-def get_hud_alerts(visual_alert):
- if visual_alert == VisualAlert.steerRequired:
- return 5
- else:
- return 0
-
# Steer torque limits
-
class SteerLimitParams:
STEER_MAX = 255 # 409 is the max, 255 is stock
STEER_DELTA_UP = 3
@@ -20,13 +11,26 @@ class SteerLimitParams:
STEER_DRIVER_MULTIPLIER = 2
STEER_DRIVER_FACTOR = 1
+
class CAR:
ELANTRA = "HYUNDAI ELANTRA LIMITED ULTIMATE 2017"
- GENESIS = "HYUNDAI GENESIS 2018"
- KIA_OPTIMA = "KIA OPTIMA SX 2019"
+ ELANTRA_GT_I30 = "HYUNDAI I30 N LINE 2019 & GT 2018 DCT"
+ GENESIS_G80 = "GENESIS G80 2017"
+ GENESIS_G90 = "GENESIS G90 2017"
+ HYUNDAI_GENESIS = "HYUNDAI GENESIS 2015-2016"
+ IONIQ = "HYUNDAI IONIQ HYBRID PREMIUM 2017"
+ IONIQ_EV_LTD = "HYUNDAI IONIQ ELECTRIC LIMITED 2019"
+ KIA_FORTE = "KIA FORTE E 2018"
+ KIA_OPTIMA = "KIA OPTIMA SX 2019 & 2016"
+ KIA_OPTIMA_H = "KIA OPTIMA HYBRID 2017 & SPORTS 2019"
KIA_SORENTO = "KIA SORENTO GT LINE 2018"
KIA_STINGER = "KIA STINGER GT2 2018"
+ KONA = "HYUNDAI KONA 2019"
+ KONA_EV = "HYUNDAI KONA ELECTRIC 2019"
SANTA_FE = "HYUNDAI SANTA FE LIMITED 2019"
+ SANTA_FE_1 = "HYUNDAI SANTA FE has no scc"
+ SONATA = "HYUNDAI SONATA 2020"
+
class Buttons:
NONE = 0
@@ -38,12 +42,42 @@ FINGERPRINTS = {
CAR.ELANTRA: [{
66: 8, 67: 8, 68: 8, 127: 8, 273: 8, 274: 8, 275: 8, 339: 8, 356: 4, 399: 8, 512: 6, 544: 8, 593: 8, 608: 8, 688: 5, 790: 8, 809: 8, 897: 8, 832: 8, 899: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1170: 8, 1265: 4, 1280: 1, 1282: 4, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1314: 8, 1322: 8, 1345: 8, 1349: 8, 1351: 8, 1353: 8, 1363: 8, 1366: 8, 1367: 8, 1369: 8, 1407: 8, 1415: 8, 1419: 8, 1425: 2, 1427: 6, 1440: 8, 1456: 4, 1472: 8, 1486: 8, 1487: 8, 1491: 8, 1530: 8, 1532: 5, 2001: 8, 2003: 8, 2004: 8, 2009: 8, 2012: 8, 2016: 8, 2017: 8, 2024: 8, 2025: 8
}],
- CAR.GENESIS: [{
+ CAR.ELANTRA_GT_I30: [{
+ 66: 8, 67: 8, 68: 8, 127: 8, 128: 8, 129: 8, 273: 8, 274: 8, 275: 8, 339: 8, 354: 3, 356: 4, 399: 8, 512: 6, 544: 8, 593: 8, 608: 8, 688: 5, 790: 8, 809: 8, 884: 8, 897: 8, 899: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1151: 6, 1168: 7, 1170: 8, 1193: 8, 1265: 4, 1280: 1, 1282: 4, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1345: 8, 1348: 8, 1349: 8, 1351: 8, 1353: 8, 1356: 8, 1363: 8, 1365: 8, 1366: 8, 1367: 8, 1369: 8, 1407: 8, 1414: 3, 1415: 8, 1427: 6, 1440: 8, 1456: 4, 1470: 8, 1486: 8, 1487: 8, 1491: 8, 1530: 8, 1952: 8, 1960: 8, 1988: 8, 2000: 8, 2001: 8, 2005: 8, 2008: 8, 2009: 8, 2013: 8, 2017: 8, 2025: 8
+ },
+ {
+ 66: 8, 67: 8, 68: 8, 127: 8, 128: 8, 129: 8, 273: 8, 274: 8, 275: 8, 339: 8, 354: 3, 356: 4, 399: 8, 512: 6, 544: 8, 593: 8, 608: 8, 688: 5, 790: 8, 809: 8, 832: 8, 897: 8, 899: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1151: 6, 1168: 7, 1170: 8, 1265: 4, 1280: 1, 1282: 4, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1349: 8, 1351: 8, 1353: 8, 1356: 8, 1363: 8, 1366: 8, 1367: 8, 1369: 8, 1407: 8, 1414: 3, 1415: 8, 1419: 8, 1440: 8, 1456: 4, 1470: 8, 1486: 8, 1487: 8, 1491: 8, 1530: 8
+ },
+ {
+ 66: 8, 67: 8, 68: 8, 127: 8, 128: 8, 129: 8, 273: 8, 274: 8, 275: 8, 339: 8, 354: 3, 356: 4, 399: 8, 512: 6, 544: 8, 593: 8, 608: 8, 688: 5, 790: 8, 809: 8, 832: 8, 897: 8, 899: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1151: 6, 1168: 7, 1170: 8, 1265: 4, 1280: 1, 1282: 4, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1349: 8, 1351: 8, 1353: 8, 1356: 8, 1363: 8, 1366: 8, 1367: 8, 1369: 8, 1407: 8, 1414: 3, 1419: 8, 1427: 6, 1440: 8, 1456: 4, 1470: 8, 1486: 8, 1487: 8, 1491: 8, 1960: 8, 1990: 8, 1998: 8, 2000: 8, 2001: 8, 2004: 8, 2005: 8, 2008: 8, 2009: 8, 2012: 8, 2013: 8, 2015: 8, 2016: 8, 2017: 8, 2024: 8, 2025: 8
+ }],
+ CAR.HYUNDAI_GENESIS: [{
67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 916: 8, 1024: 2, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1342: 6, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 5, 1407: 8, 1419: 8, 1427: 6, 1434: 2, 1456: 4
},
{
67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 916: 8, 1024: 2, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1281: 3, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1378: 4, 1379: 8, 1384: 5, 1407: 8, 1419: 8, 1427: 6, 1434: 2, 1456: 4
+ },
+ {
+ 67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 912: 7, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1268: 8, 1280: 1, 1281: 3, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 5, 1407: 8, 1419: 8, 1427: 6, 1434: 2, 1437: 8, 1456: 4
+ },
+ {
+ 67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1378: 4, 1379: 8, 1384: 5, 1407: 8, 1425: 2, 1427: 6, 1437: 8, 1456: 4
+ },
+ {
+ 67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 5, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1437: 8, 1456: 4
}],
+ CAR.SANTA_FE: [{
+ 67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 593: 8, 608: 8, 688: 6, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1155: 8, 1156: 8, 1162: 8, 1164: 8, 1168: 7, 1170: 8, 1173: 8, 1183: 8, 1186: 2, 1191: 2, 1227: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1379: 8, 1384: 8, 1407: 8, 1414: 3, 1419: 8, 1427: 6, 1456: 4, 1470: 8
+ },
+ {
+ 67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 593: 8, 608: 8, 688: 6, 764: 8, 809: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1155: 8, 1162: 8, 1164: 8, 1168: 7, 1170: 8, 1173: 8, 1180: 8, 1183: 8, 1186: 2, 1227: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1371: 8, 1378: 8, 1384: 8, 1407: 8, 1414: 3, 1419: 8, 1427: 6, 1456: 4, 1470: 8, 1988: 8, 2000: 8, 2004: 8, 2008: 8, 2012: 8
+ },
+ {
+ 67: 8, 68: 8, 80: 4, 160: 8, 161: 8, 272: 8, 288: 4, 339: 8, 356: 8, 357: 8, 399: 8, 544: 8, 608: 8, 672: 8, 688: 5, 704: 1, 790: 8, 809: 8, 848: 8, 880: 8, 898: 8, 900: 8, 901: 8, 904: 8, 1056: 8, 1064: 8, 1065: 8, 1072: 8, 1075: 8, 1087: 8, 1088: 8, 1151: 8, 1200: 8, 1201: 8, 1232: 4, 1264: 8, 1265: 8, 1266: 8, 1296: 8, 1306: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1348: 8, 1349: 8, 1369: 8, 1370: 8, 1371: 8, 1407: 8, 1415: 8, 1419: 8, 1440: 8, 1442: 4, 1461: 8, 1470: 8
+ }],
+ CAR.SONATA: [
+ {67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 545: 8, 546: 8, 547: 8, 548: 8, 549: 8, 550: 8, 576: 8, 593: 8, 608: 8, 688: 6, 809: 8, 832: 8, 854: 8, 865: 8, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 905: 8, 908: 8, 909: 8, 912: 7, 913: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1089: 5, 1107: 5, 1108: 8, 1114: 8, 1136: 8, 1145: 8, 1151: 8, 1155: 8, 1156: 8, 1157: 4, 1162: 8, 1164: 8, 1168: 8, 1170: 8, 1173: 8, 1180: 8, 1183: 8, 1184: 8, 1186: 2, 1191: 2, 1193: 8, 1210: 8, 1225: 8, 1227: 8, 1265: 4, 1268: 8, 1280: 8, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1330: 8, 1339: 8, 1342: 6, 1343: 8, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1371: 8, 1378: 8, 1384: 8, 1394: 8, 1407: 8, 1419: 8, 1427: 6, 1446: 8, 1456: 4, 1460: 8, 1470: 8, 1485: 8, 1504: 3},
+ ],
CAR.KIA_OPTIMA: [
{
64: 8, 66: 8, 67: 8, 68: 8, 127: 8, 273: 8, 274: 8, 275: 8, 339: 8, 356: 4, 399: 8, 447: 8, 512: 6, 544: 8, 593: 8, 608: 8, 688: 5, 790: 8, 809: 8, 832: 8, 884: 8, 897: 8, 899: 8, 902: 8, 903: 6, 909: 8, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1151: 6, 1168: 7, 1170: 8, 1186: 2, 1191: 2, 1253: 8, 1254: 8, 1255: 8, 1265: 4, 1280: 1, 1282: 4, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1342: 6, 1345: 8, 1348: 8, 1349: 8, 1351: 8, 1353: 8, 1363: 8, 1365: 8, 1366: 8, 1367: 8, 1369: 8, 1407: 8, 1414: 3, 1415: 8, 1419: 8, 1425: 2, 1427: 6, 1440: 8, 1456: 4, 1470: 8, 1472: 8, 1486: 8, 1487: 8, 1491: 8, 1530: 8, 1532: 5, 1952: 8, 1960: 8, 1988: 8, 1996: 8, 2001: 8, 2004: 8, 2008: 8, 2009: 8, 2012: 8, 2016: 8, 2017: 8, 2024: 8, 2025: 8
@@ -58,13 +92,39 @@ FINGERPRINTS = {
CAR.KIA_STINGER: [{
67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 359: 8, 544: 8, 576: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1281: 4, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1378: 4, 1379: 8, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1456: 4, 1470: 8
}],
- CAR.SANTA_FE: [{
- 67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 593: 8, 608: 8, 688: 6, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1155: 8, 1156: 8, 1162: 8, 1164: 8, 1168: 7, 1170: 8, 1173: 8, 1183: 8, 1186: 2, 1191: 2, 1227: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1379: 8, 1384: 8, 1407: 8, 1414: 3, 1419: 8, 1427: 6, 1456: 4, 1470: 8
+ CAR.GENESIS_G80: [{
+ 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1024: 2, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1156: 8, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1191: 2, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1434: 2, 1456: 4, 1470: 8
},
{
- 67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 593: 8, 608: 8, 688: 6, 764: 8, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1155: 8, 1162: 8, 1164: 8, 1168: 7, 1170: 8, 1173: 8, 1180: 8, 1183: 8, 1186: 2, 1227: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1371: 8, 1378: 8, 1384: 8, 1407: 8, 1414: 3, 1419: 8, 1427: 6, 1456: 4, 1470: 8, 1988: 8, 2000: 8, 2004: 8, 2008: 8, 2012: 8
- }
- ],
+ 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 359: 8, 544: 8, 546: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1156: 8, 1157: 4, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1281: 3, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1434: 2, 1437: 8, 1456: 4, 1470: 8
+ },
+ {
+ 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1156: 8, 1157: 4, 1162: 8, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1193: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1371: 8, 1378: 4, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1437: 8, 1456: 4, 1470: 8
+ }],
+ CAR.GENESIS_G90: [{
+ 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 359: 8, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1162: 4, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1281: 3, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1434: 2, 1456: 4, 1470: 8, 1988: 8, 2000: 8, 2003: 8, 2004: 8, 2005: 8, 2008: 8, 2011: 8, 2012: 8, 2013: 8
+ }],
+ CAR.IONIQ: [{
+ 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 544: 8, 576: 8, 593: 8, 688: 5, 881: 8, 882: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1136: 6, 1173: 8, 1225: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1291: 8, 1292: 8, 1294: 8, 1322: 8, 1345: 8, 1348: 8, 1355: 8, 1363: 8, 1369: 8, 1407: 8, 1419: 8, 1427: 6, 1429: 8, 1430: 8, 1448: 8, 1456: 4, 1470:8, 1476: 8, 1535: 8
+ }],
+ CAR.IONIQ_EV_LTD: [{
+ 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 544: 7, 593: 8, 688: 5, 832: 8, 881: 8, 882: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1136: 8, 1151: 6, 1168: 7, 1173: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1291: 8, 1292: 8, 1294: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1355: 8, 1363: 8, 1369: 8, 1407: 8, 1419: 8, 1425: 2, 1426: 8, 1427: 6, 1429: 8, 1430: 8, 1456: 4, 1470: 8, 1507: 8, 1535: 8
+ }],
+ CAR.KONA: [{
+ 67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 354: 3, 356: 4, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 909: 8, 916: 8, 1040: 8, 1078: 4, 1107: 5, 1136: 8, 1156: 8, 1170: 8, 1173: 8, 1191: 2, 1265: 4, 1280: 1, 1287: 4, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1384: 8, 1394: 8,1407: 8, 1414: 3, 1419: 8, 1427: 6, 1456: 4, 1470: 8, 2004: 8, 2009: 8, 2012: 8
+ }],
+ CAR.KONA_EV: [{
+ 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 544: 8, 549: 8, 593: 8, 688: 5, 832: 8, 881: 8, 882: 8, 897: 8, 902: 8, 903: 8, 905: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1136: 8, 1151: 6, 1168: 7, 1173: 8, 1183: 8, 1186: 2, 1191: 2, 1225: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1291: 8, 1292: 8, 1294: 8, 1307: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1355: 8, 1363: 8, 1369: 8, 1378: 4, 1407: 8, 1419: 8, 1426: 8, 1427: 6, 1429: 8, 1430: 8, 1456: 4, 1470: 8, 1473: 8, 1507: 8, 1535: 8, 2000: 8, 2004: 8, 2008: 8, 2012: 8
+ }],
+ CAR.KIA_FORTE: [{
+ 67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1078: 4, 1107: 5, 1136: 8, 1156: 8, 1170: 8, 1173: 8, 1191: 2, 1225: 8, 1265: 4, 1280: 4, 1287: 4, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1384: 8, 1394: 8, 1407: 8, 1427: 6, 1456: 4, 1470: 8
+ }],
+ CAR.KIA_OPTIMA_H: [{
+ 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 544: 8, 593: 8, 688: 5, 832: 8, 881: 8, 882: 8, 897: 8, 902: 8, 903: 6, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1136: 6, 1151: 6, 1168: 7, 1173: 8, 1236: 2, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1291: 8, 1292: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1342: 6, 1345: 8, 1348: 8, 1355: 8, 1363: 8, 1369: 8, 1371: 8, 1407: 8, 1419: 8, 1427: 6, 1429: 8, 1430: 8, 1448: 8, 1456: 4, 1470: 8, 1476: 8, 1535: 8
+ },
+ {
+ 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 544: 8, 576: 8, 593: 8, 688: 5, 881: 8, 882: 8, 897: 8, 902: 8, 903: 8, 909: 8, 912: 7, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1136: 6, 1151: 6, 1168: 7, 1173: 8, 1180: 8, 1186: 2, 1191: 2, 1265: 4, 1268: 8, 1280: 1, 1287: 4, 1290: 8, 1291: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1355: 8, 1363: 8, 1369: 8, 1371: 8, 1407: 8, 1419: 8, 1420: 8, 1425: 2, 1427: 6, 1429: 8, 1430: 8, 1448: 8, 1456: 4, 1470: 8, 1476: 8, 1535: 8
+ }],
}
ECU_FINGERPRINT = {
@@ -72,23 +132,33 @@ ECU_FINGERPRINT = {
}
CHECKSUM = {
- "crc8": [CAR.SANTA_FE],
- "6B": [CAR.KIA_SORENTO, CAR.GENESIS],
- "7B": [CAR.KIA_STINGER, CAR.ELANTRA, CAR.KIA_OPTIMA],
+ "crc8": [CAR.SANTA_FE, CAR.SONATA],
+ "6B": [CAR.KIA_SORENTO, CAR.HYUNDAI_GENESIS],
}
FEATURES = {
- "use_cluster_gears": [CAR.ELANTRA], # Use Cluster for Gear Selection, rather than Transmission
- "use_tcu_gears": [CAR.KIA_OPTIMA], # Use TCU Message for Gear Selection
+ "use_cluster_gears": [CAR.ELANTRA, CAR.KONA, CAR.ELANTRA_GT_I30], # Use Cluster for Gear Selection, rather than Transmission
+ "use_tcu_gears": [CAR.KIA_OPTIMA], # Use TCU Message for Gear Selection
+ "use_elect_gears": [CAR.KIA_OPTIMA_H, CAR.IONIQ_EV_LTD, CAR.KONA_EV], # Use TCU Message for Gear Selection
}
DBC = {
CAR.ELANTRA: dbc_dict('hyundai_kia_generic', None),
- CAR.GENESIS: dbc_dict('hyundai_kia_generic', None),
+ CAR.ELANTRA_GT_I30: dbc_dict('hyundai_kia_generic', None),
+ CAR.GENESIS_G80: dbc_dict('hyundai_kia_generic', None),
+ CAR.GENESIS_G90: dbc_dict('hyundai_kia_generic', None),
+ CAR.HYUNDAI_GENESIS: dbc_dict('hyundai_kia_generic', None),
+ CAR.IONIQ: dbc_dict('hyundai_kia_generic', None),
+ CAR.IONIQ_EV_LTD: dbc_dict('hyundai_kia_generic', None),
+ CAR.KIA_FORTE: dbc_dict('hyundai_kia_generic', None),
CAR.KIA_OPTIMA: dbc_dict('hyundai_kia_generic', None),
+ CAR.KIA_OPTIMA_H: dbc_dict('hyundai_kia_generic', None),
CAR.KIA_SORENTO: dbc_dict('hyundai_kia_generic', None),
CAR.KIA_STINGER: dbc_dict('hyundai_kia_generic', None),
+ CAR.KONA: dbc_dict('hyundai_kia_generic', None),
+ CAR.KONA_EV: dbc_dict('hyundai_kia_generic', None),
CAR.SANTA_FE: dbc_dict('hyundai_kia_generic', None),
+ CAR.SONATA: dbc_dict('hyundai_kia_generic', None),
}
-STEER_THRESHOLD = 100
+STEER_THRESHOLD = 150
diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit
index c6b5354ad2..fb8118eea1 100644
--- a/selfdrive/test/process_replay/ref_commit
+++ b/selfdrive/test/process_replay/ref_commit
@@ -1 +1 @@
-3523742130b9e0554bab4ac5bc5ab535f1342e90
\ No newline at end of file
+9638f1d5495e92b2d633a193f00a65f8268b170c
\ No newline at end of file
diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py
index 6425d38a7f..68571ba601 100755
--- a/selfdrive/test/process_replay/test_processes.py
+++ b/selfdrive/test/process_replay/test_processes.py
@@ -19,7 +19,7 @@ segments = [
("TOYOTA", "77611a1fac303767|2020-02-29--13-29-33--3"), # TOYOTA.COROLLA_TSS2
("GM", "7cc2a8365b4dd8a9|2018-12-02--12-10-44--2"), # GM.ACADIA
("CHRYSLER", "b6849f5cf2c926b1|2020-02-28--07-29-48--13"), # CHRYSLER.PACIFICA
- ("HYUNDAI", "38bfd238edecbcd7|2018-08-29--22-02-15--4"), # HYUNDAI.SANTA_FE
+ ("HYUNDAI", "5b7c365c50084530|2020-04-15--16-13-24--3"), # HYUNDAI.SONATA
#("CHRYSLER", "b6e1317e1bfbefa6|2020-03-04--13-11-40"), # CHRYSLER.JEEP_CHEROKEE
("SUBARU", "7873afaf022d36e2|2019-07-03--18-46-44--0"), # SUBARU.IMPREZA
("VOLKSWAGEN", "76b83eb0245de90e|2020-03-05--19-16-05--3"), # VW.GOLF
diff --git a/selfdrive/test/test_car_models.py b/selfdrive/test/test_car_models.py
index 23408cf057..3f2b81002c 100755
--- a/selfdrive/test/test_car_models.py
+++ b/selfdrive/test/test_car_models.py
@@ -172,6 +172,10 @@ routes = {
'carFingerprint': HYUNDAI.KIA_OPTIMA,
'enableCamera': True,
},
+ "5b7c365c50084530|2020-04-15--16-13-24": {
+ 'carFingerprint': HYUNDAI.SONATA,
+ 'enableCamera': True,
+ },
"f7b6be73e3dfd36c|2019-05-12--18-07-16": {
'carFingerprint': TOYOTA.AVALON,
'enableCamera': False,
@@ -336,6 +340,7 @@ routes = {
'carFingerprint': NISSAN.LEAF,
'enableCamera': True,
},
+
}
passive_routes = [
@@ -352,8 +357,8 @@ non_tested_cars = [
CHRYSLER.JEEP_CHEROKEE,
CHRYSLER.JEEP_CHEROKEE_2019,
CHRYSLER.PACIFICA_2018,
- CHRYSLER.PACIFICA_2020,
CHRYSLER.PACIFICA_2018_HYBRID,
+ CHRYSLER.PACIFICA_2020,
GM.CADILLAC_ATS,
GM.HOLDEN_ASTRA,
GM.MALIBU,
@@ -361,9 +366,19 @@ non_tested_cars = [
HONDA.CRV,
HONDA.RIDGELINE,
HYUNDAI.ELANTRA,
- HYUNDAI.GENESIS,
+ HYUNDAI.ELANTRA_GT_I30,
+ HYUNDAI.GENESIS_G80,
+ HYUNDAI.GENESIS_G90,
+ HYUNDAI.HYUNDAI_GENESIS,
+ HYUNDAI.IONIQ,
+ HYUNDAI.IONIQ_EV_LTD,
+ HYUNDAI.KIA_FORTE,
+ HYUNDAI.KIA_OPTIMA,
+ HYUNDAI.KIA_OPTIMA_H,
HYUNDAI.KIA_SORENTO,
HYUNDAI.KIA_STINGER,
+ HYUNDAI.KONA,
+ HYUNDAI.KONA_EV,
TOYOTA.CAMRYH,
TOYOTA.CHR,
TOYOTA.CHRH,