diff --git a/README.md b/README.md
index 5ef834ef4e6ae9..1fdc25c78213f9 100644
--- a/README.md
+++ b/README.md
@@ -81,6 +81,7 @@ Supported Cars
| Hyundai | Santa Fe 2019 | All | Yes | Stock | 0mph | 0mph | Custom6|
| Hyundai | Elantra 2017 | SCC + LKAS | Yes | Stock | 19mph | 34mph | Custom6|
| Hyundai | Genesis 2018 | All | Yes | Stock | 19mph | 34mph | Custom6|
+| Hyundai | Kona 2019 | LKAS | Yes | No9 | **WIP** | **WIP** | Custom6|
| Kia | Sorento 2018 | All | Yes | Stock | 0mph | 0mph | Custom6|
| Kia | Stinger 2018 | SCC + LKAS | Yes | Stock | 0mph | 0mph | Custom6|
| Lexus | RX Hybrid 2016-18 | All | Yes | Yes2| 0mph | 0mph | Toyota |
@@ -104,6 +105,7 @@ Supported Cars
6Open sourced [Hyundai Giraffe](https://github.com/commaai/neo/tree/master/giraffe/hyundai) is designed for the 2019 Sante Fe; pinout may differ for other Hyundais.
7Community built Giraffe, find more information [here](https://zoneos.com/shop/).
8Community built Giraffe, find more information [here](https://github.com/adhintz/openpilot/wiki). Comma official Giraffe coming soon.
+9Car does not come with Smart/Adaptive Cruise Control. Open Pilot will only engage when Cruise is set, but will not adjust vehicle speed for traffic.
Community Maintained Cars
------
diff --git a/opendbc/hyundai_kia_generic.dbc b/opendbc/hyundai_kia_generic.dbc
index b9e654fa662bcb..e3e6a1eb6118cb 100644
--- a/opendbc/hyundai_kia_generic.dbc
+++ b/opendbc/hyundai_kia_generic.dbc
@@ -692,6 +692,7 @@ BO_ 1365 FPCM11: 8 FPCM
SG_ CF_Fpcm_LPCtrCirFlt : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS
BO_ 871 LVR12: 8 LVR
+ SG_ CF_Lvr_CruiseSet : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,TCU
SG_ CF_Lvr_Gear : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,TCU
BO_ 872 LVR11: 8 LVR
@@ -896,11 +897,11 @@ BO_ 67 DATC13: 8 DATC
BO_ 66 DATC12: 8 DATC
SG_ CR_Datc_DrTempDispC : 0|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX
- SG_ CR_Datc_DrTempDispF : 8|8@1+ (1.0,56.0) [58.0|90.0] "¢µ" CLU,IBOX
+ SG_ CR_Datc_DrTempDispF : 8|8@1+ (1.0,56.0) [58.0|90.0] "deg" CLU,IBOX
SG_ CR_Datc_PsTempDispC : 16|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX
- SG_ CR_Datc_PsTempDispF : 24|8@1+ (1.0,56.0) [58.0|90.0] "¢µ" CLU,IBOX
+ SG_ CR_Datc_PsTempDispF : 24|8@1+ (1.0,56.0) [58.0|90.0] "deg" CLU,IBOX
SG_ CR_Datc_RearDrTempDispC : 40|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU
- SG_ CR_Datc_RearDrTempDispF : 48|8@1+ (1.0,58.0) [58.0|90.0] "¢µ" CLU
+ SG_ CR_Datc_RearDrTempDispF : 48|8@1+ (1.0,58.0) [58.0|90.0] "deg" CLU
SG_ CF_Datc_CO2_Warning : 56|8@1+ (1.0,0.0) [0.0|3.0] "" CLU
BO_ 1345 CGW1: 8 BCM
@@ -980,6 +981,8 @@ BO_ 832 LKAS11: 8 LDWS_LKAS
SG_ CF_Lkas_Chksum : 48|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS
SG_ CF_Lkas_FcwOpt_USM : 56|3@1+ (1.0,0.0) [0.0|7.0] "" CLU
SG_ CF_Lkas_LdwsOpt_USM : 59|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,MDPS
+ SG_ CF_Lkas_Unknown1 : 47|1@1+ (1,0) [0|3] "" XXX
+ SG_ CF_Lkas_Unknown2 : 63|2@0+ (1,0) [0|3] "" XXX
BO_ 1342 LKAS12: 6 LDWS_LKAS
SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py
index 01fd28a5876d79..182f47625f8e6e 100644
--- a/selfdrive/car/hyundai/carstate.py
+++ b/selfdrive/car/hyundai/carstate.py
@@ -1,4 +1,4 @@
-from selfdrive.car.hyundai.values import DBC, STEER_THRESHOLD
+from selfdrive.car.hyundai.values import DBC, STEER_THRESHOLD, FEATURES
from selfdrive.can.parser import CANParser
from selfdrive.config import Conversions as CV
from common.kalman.simple_kalman import KF1D
@@ -50,6 +50,7 @@ def get_can_parser(CP):
("CF_Clu_InhibitR", "CLU15", 0),
("CF_Lvr_Gear","LVR12",0),
+ ("CF_Lvr_CruiseSet", "LVR12", 0),
("ACCEnable", "TCS13", 0),
("ACC_REQ", "TCS13", 0),
@@ -158,7 +159,7 @@ def update(self, cp, cp_cam):
self.park_brake = cp.vl["CGW1"]['CF_Gway_ParkBrakeSw']
self.main_on = True
- self.acc_active = cp.vl["SCC12"]['ACCMode'] != 0
+ self.acc_active = (cp.vl["LVR12"]["CF_Lvr_CruiseSet"] > 1) if self.car_fingerprint in FEATURES["no_scc"] else cp.vl["SCC12"]['ACCMode'] != 0
self.pcm_acc_status = int(self.acc_active)
# calc best v_ego estimate, by averaging two opposite corners
@@ -180,7 +181,7 @@ def update(self, cp, cp_cam):
self.a_ego = float(v_ego_x[1])
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
- self.cruise_set_speed = cp.vl["SCC11"]['VSetDis'] * speed_conv
+ self.cruise_set_speed = cp.vl["LVR12"]["CF_Lvr_CruiseSet"] * speed_conv if self.car_fingerprint in FEATURES["no_scc"] else cp.vl["SCC11"]['VSetDis'] * speed_conv
self.standstill = not self.v_wheel > 0.1
self.angle_steers = cp.vl["SAS11"]['SAS_Angle']
@@ -197,13 +198,13 @@ def update(self, cp, cp_cam):
self.brake_error = 0
self.steer_torque_driver = cp.vl["MDPS11"]['CR_Mdps_DrvTq']
self.steer_torque_motor = cp.vl["MDPS12"]['CR_Mdps_OutTq']
- self.stopped = cp.vl["SCC11"]['SCCInfoDisplay'] == 4.
+ self.stopped = False if self.car_fingerprint in FEATURES["no_scc"] else cp.vl["SCC11"]['SCCInfoDisplay'] == 4.
self.user_brake = 0
self.brake_pressed = cp.vl["TCS13"]['DriverBraking']
self.brake_lights = bool(self.brake_pressed)
- if (cp.vl["TCS13"]["DriverOverride"] == 0 and cp.vl["TCS13"]['ACC_REQ'] == 1):
+ if (cp.vl["TCS13"]["DriverOverride"] == 0 and (cp.vl["TCS13"]['ACC_REQ'] == 1 or self.car_fingerprint in FEATURES["no_scc"])):
self.pedal_gas = 0
else:
self.pedal_gas = cp.vl["EMS12"]['TPS']
diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py
index 5399d827610896..303453829534e1 100644
--- a/selfdrive/car/hyundai/interface.py
+++ b/selfdrive/car/hyundai/interface.py
@@ -122,6 +122,14 @@ def get_params(candidate, fingerprint):
ret.steerKiBP, ret.steerKpBP = [[0.], [0.]]
ret.steerKpV, ret.steerKiV = [[0.25], [0.05]]
ret.minSteerSpeed = 0.
+ elif candidate == CAR.KONA:
+ ret.steerKf = 0.00005
+ ret.mass = 1360
+ ret.wheelbase = 2.601
+ ret.steerRatio = 12.916
+ tire_stiffness_factor = 0.5
+ ret.steerKiBP, ret.steerKpBP = [[0.], [0.]]
+ ret.steerKpV, ret.steerKiV = [[0.25], [0.05]]
ret.minEnableSpeed = -1. # enable is done by stock ACC, so ignore this
ret.longitudinalKpBP = [0.]
diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py
index 56b6e605361b5e..a20194a7180971 100644
--- a/selfdrive/car/hyundai/values.py
+++ b/selfdrive/car/hyundai/values.py
@@ -16,6 +16,7 @@ class CAR:
KIA_SORENTO = "KIA SORENTO GT LINE 2018"
KIA_STINGER = "KIA STINGER GT2 2018"
SANTA_FE = "HYUNDAI SANTA FE LIMITED 2019"
+ KONA = "HYUNDAI KONA 2019"
class Buttons:
NONE = 0
@@ -46,6 +47,9 @@ class Buttons:
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
}
],
+ 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
+ }],
}
CAMERA_MSGS = [832, 1156, 1191, 1342]
@@ -53,7 +57,12 @@ class Buttons:
CHECKSUM = {
"crc8": [CAR.SANTA_FE],
"6B": [CAR.KIA_SORENTO, CAR.GENESIS],
- "7B": [CAR.KIA_STINGER, CAR.ELANTRA],
+ "7B": [CAR.KIA_STINGER, CAR.ELANTRA, CAR.KONA],
+}
+
+# Lane Keep Assist related Features and Limitations
+FEATURES = {
+ "no_scc": [CAR.KONA],
}
DBC = {
@@ -62,6 +71,7 @@ class Buttons:
CAR.KIA_SORENTO: dbc_dict('hyundai_kia_generic', None),
CAR.KIA_STINGER: dbc_dict('hyundai_kia_generic', None),
CAR.SANTA_FE: dbc_dict('hyundai_kia_generic', None),
+ CAR.KONA: dbc_dict('hyundai_kia_generic', None),
}
STEER_THRESHOLD = 100