diff --git a/opendbc b/opendbc index 11b61cd09d..1e9219759b 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 11b61cd09dd7497d5613ce243397f1685cf1ed10 +Subproject commit 1e9219759b9e6f76d8c614fcc368827dbc2cba01 diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index 9c6b1275ed..2cb176aa18 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -3,12 +3,23 @@ from cereal import car from selfdrive.car.hyundai.values import DBC, STEER_THRESHOLD, FEATURES, EV_CAR, HYBRID_CAR from selfdrive.car.interfaces import CarStateBase from opendbc.can.parser import CANParser +from opendbc.can.can_define import CANDefine from selfdrive.config import Conversions as CV -GearShifter = car.CarState.GearShifter - class CarState(CarStateBase): + def __init__(self, CP): + super().__init__(CP) + can_define = CANDefine(DBC[CP.carFingerprint]["pt"]) + + if self.CP.carFingerprint in FEATURES["use_cluster_gears"]: + self.shifter_values = can_define.dv["CLU15"]["CF_Clu_Gear"] + elif self.CP.carFingerprint in FEATURES["use_tcu_gears"]: + self.shifter_values = can_define.dv["TCU12"]["CUR_GR"] + else: # preferred and elect gear methods use same definition + self.shifter_values = can_define.dv["LVR12"]["CF_Lvr_Gear"] + + def update(self, cp, cp_cam): ret = car.CarState.new_message() @@ -66,57 +77,18 @@ class CarState(CarStateBase): ret.gas = cp.vl["EMS12"]["PV_AV_CAN"] / 100. ret.gasPressed = bool(cp.vl["EMS16"]["CF_Ems_AclAct"]) - # 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 self.CP.carFingerprint in FEATURES["use_cluster_gears"]: - 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 + gear = cp.vl["CLU15"]["CF_Clu_Gear"] elif self.CP.carFingerprint in FEATURES["use_tcu_gears"]: 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: 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 + + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear)) if self.CP.carFingerprint in FEATURES["use_fca"]: ret.stockAeb = cp.vl["FCA11"]["FCA_CmdAct"] != 0 @@ -255,10 +227,7 @@ class CarState(CarStateBase): 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), + ("CF_Clu_Gear", "CLU15", 0), ] checks += [ ("CLU15", 5)