예제 #1
0
class CarState(CarStateBase):
  def __init__(self, CP):
    super().__init__(CP)

    #Auto detection for setup
    self.no_radar = CP.sccBus == -1
    self.mdps_bus = CP.mdpsBus
    self.sas_bus = CP.sasBus
    self.scc_bus = CP.sccBus
    self.lkas_button_on = True
    self.has_scc13 = CP.carFingerprint in FEATURES["has_scc13"]
    self.has_scc14 = CP.carFingerprint in FEATURES["has_scc14"]
    self.cruise_main_button = 0
    self.mdps_error_cnt = 0
    self.spas_enabled = CP.spasEnabled
    self.acc_active = False
    self.cruiseState_standstill = False
    
    self.cruiseState_modeSel = 0
    self.SC = SpdController()

    self.driverAcc_time = 0

    # blinker
    self.left_blinker_flash = 0
    self.right_blinker_flash = 0  
    self.TSigLHSw = 0
    self.TSigRHSw = 0

    self.apply_steer = 0.
    
    self.steer_anglecorrection = float(int(Params().get("OpkrSteerAngleCorrection", encoding='utf8')) * 0.1)
    self.gear_correction = Params().get("JustDoGearD", encoding='utf8') == "1"

  def update(self, cp, cp2, cp_cam):
    cp_mdps = cp2 if self.mdps_bus else cp
    cp_sas = cp2 if self.sas_bus else cp
    cp_scc = cp2 if self.scc_bus == 1 else cp_cam if self.scc_bus == 2 else cp

    self.prev_cruise_buttons = self.cruise_buttons
    self.prev_cruise_main_button = self.cruise_main_button
    self.prev_lkas_button_on = self.lkas_button_on

    ret = car.CarState.new_message()

    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
    ret.wheelSpeeds.fr = cp.vl["WHL_SPD11"]['WHL_SPD_FR'] * CV.KPH_TO_MS
    ret.wheelSpeeds.rl = cp.vl["WHL_SPD11"]['WHL_SPD_RL'] * CV.KPH_TO_MS
    ret.wheelSpeeds.rr = cp.vl["WHL_SPD11"]['WHL_SPD_RR'] * CV.KPH_TO_MS
    ret.vEgoRaw = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr + ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4.
    ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)

    ret.vEgo = cp.vl["CLU11"]["CF_Clu_Vanz"] * CV.KPH_TO_MS

    ret.standstill = ret.vEgoRaw < 0.1
    ret.standStill = self.CP.standStill

    ret.steeringAngleDeg = cp_sas.vl["SAS11"]['SAS_Angle'] - self.steer_anglecorrection
    ret.steeringRateDeg = cp_sas.vl["SAS11"]['SAS_Speed']
    ret.yawRate = cp.vl["ESP12"]['YAW_RATE']
    ret.steeringTorque = cp_mdps.vl["MDPS12"]['CR_Mdps_StrColTq']
    ret.steeringTorqueEps = cp_mdps.vl["MDPS12"]['CR_Mdps_OutTq']
    ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD
    self.mdps_error_cnt += 1 if cp_mdps.vl["MDPS12"]['CF_Mdps_ToiUnavail'] != 0 else -self.mdps_error_cnt
    ret.steerWarning = self.mdps_error_cnt > 100 #cp_mdps.vl["MDPS12"]['CF_Mdps_ToiUnavail'] != 0

    ret.leftBlinker, ret.rightBlinker = self.update_blinker(cp)

    self.VSetDis = cp_scc.vl["SCC11"]['VSetDis']
    ret.vSetDis = self.VSetDis
    self.clu_Vanz = cp.vl["CLU11"]["CF_Clu_Vanz"]
    lead_objspd = cp_scc.vl["SCC11"]['ACC_ObjRelSpd']
    self.lead_objspd = lead_objspd * CV.MS_TO_KPH
    self.Mdps_ToiUnavail = cp_mdps.vl["MDPS12"]['CF_Mdps_ToiUnavail']
    self.driverOverride = cp.vl["TCS13"]["DriverOverride"]
    if self.driverOverride == 1:
      self.driverAcc_time = 100
    elif self.driverAcc_time:
      self.driverAcc_time -= 1

    # cruise state
    ret.cruiseState.enabled = (cp_scc.vl["SCC12"]['ACCMode'] != 0) if not self.no_radar else \
                                      cp.vl["LVR12"]['CF_Lvr_CruiseSet'] != 0
    ret.cruiseState.available = (cp_scc.vl["SCC11"]["MainMode_ACC"] != 0) if not self.no_radar else \
                                      cp.vl['EMS16']['CRUISE_LAMP_M'] != 0
    ret.cruiseState.standstill = cp_scc.vl["SCC11"]['SCCInfoDisplay'] == 4 if not self.no_radar else False
    self.cruiseState_standstill = ret.cruiseState.standstill
    self.is_set_speed_in_mph = bool(cp.vl["CLU11"]["CF_Clu_SPEED_UNIT"])
    
    self.acc_active = ret.cruiseState.enabled
    
    self.cruiseState_modeSel, speed_kph = self.SC.update_cruiseSW(self)
    ret.cruiseState.modeSel = self.cruiseState_modeSel

    if ret.cruiseState.enabled:
      speed_conv = CV.MPH_TO_MS if self.is_set_speed_in_mph else CV.KPH_TO_MS
      ret.cruiseState.speed = speed_kph * speed_conv if not self.no_radar else \
                                         cp.vl["LVR12"]["CF_Lvr_CruiseSet"] * speed_conv
    else:
      ret.cruiseState.speed = 0
    self.cruise_main_button = cp.vl["CLU11"]["CF_Clu_CruiseSwMain"]
    self.cruise_buttons = cp.vl["CLU11"]["CF_Clu_CruiseSwState"]
    ret.cruiseButtons = self.cruise_buttons

    # TODO: Find brake pressure
    ret.brake = 0
    ret.brakePressed = cp.vl["TCS13"]['DriverBraking'] != 0

    # TODO: Check this
    ret.brakeLights = bool(cp.vl["TCS13"]['BrakeLight'] or ret.brakePressed)

    if self.CP.carFingerprint in FEATURES["use_elect_ems"]:
      ret.gas = cp.vl["E_EMS11"]['Accel_Pedal_Pos'] / 256.
      ret.gasPressed = ret.gas > 5
    else:
      ret.gas = cp.vl["EMS12"]['PV_AV_CAN'] / 100
      ret.gasPressed = bool(cp.vl["EMS16"]["CF_Ems_AclAct"])

    # TPMS code added from OPKR
    if cp.vl["TPMS11"]['UNIT'] == 0.0:
      ret.tpmsPressureFl = cp.vl["TPMS11"]['PRESSURE_FL']
      ret.tpmsPressureFr = cp.vl["TPMS11"]['PRESSURE_FR']
      ret.tpmsPressureRl = cp.vl["TPMS11"]['PRESSURE_RL']
      ret.tpmsPressureRr = cp.vl["TPMS11"]['PRESSURE_RR']
    elif cp.vl["TPMS11"]['UNIT'] == 1.0:
      ret.tpmsPressureFl = cp.vl["TPMS11"]['PRESSURE_FL'] * 5 * 0.145038
      ret.tpmsPressureFr = cp.vl["TPMS11"]['PRESSURE_FR'] * 5 * 0.145038
      ret.tpmsPressureRl = cp.vl["TPMS11"]['PRESSURE_RL'] * 5 * 0.145038
      ret.tpmsPressureRr = cp.vl["TPMS11"]['PRESSURE_RR'] * 5 * 0.145038
    elif cp.vl["TPMS11"]['UNIT'] == 2.0:
      ret.tpmsPressureFl = cp.vl["TPMS11"]['PRESSURE_FL'] / 10 * 14.5038
      ret.tpmsPressureFr = cp.vl["TPMS11"]['PRESSURE_FR'] / 10 * 14.5038
      ret.tpmsPressureRl = cp.vl["TPMS11"]['PRESSURE_RL'] / 10 * 14.5038
      ret.tpmsPressureRr = cp.vl["TPMS11"]['PRESSURE_RR'] / 10 * 14.5038

    self.cruiseGapSet = cp_scc.vl["SCC11"]['TauGapSet']

    # 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:
        if self.gear_correction:
          ret.gearShifter = GearShifter.drive
        else:
          ret.gearShifter = GearShifter.unknown
    # Gear Selecton via TCU12
    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:
        if self.gear_correction:
          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:
        if self.gear_correction:
          ret.gearShifter = GearShifter.drive
        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:
        if self.gear_correction:
          ret.gearShifter = GearShifter.drive
        else:
          ret.gearShifter = GearShifter.unknown

    if self.CP.carFingerprint in FEATURES["use_fca"]:
      ret.stockAeb = cp.vl["FCA11"]['FCA_CmdAct'] != 0
      ret.stockFcw = cp.vl["FCA11"]['CF_VSM_Warn'] == 2
    else:
      ret.stockAeb = cp.vl["SCC12"]['AEB_CmdAct'] != 0
      ret.stockFcw = cp.vl["SCC12"]['CF_VSM_Warn'] == 2

    # Blind Spot Detection and Lane Change Assist signals
    self.lca_state = cp.vl["LCA11"]["CF_Lca_Stat"]
    ret.leftBlindspot = cp.vl["LCA11"]["CF_Lca_IndLeft"] != 0
    ret.rightBlindspot = cp.vl["LCA11"]["CF_Lca_IndRight"] != 0

    # save the entire LKAS11, CLU11, SCC12 and MDPS12
    self.lkas11 = cp_cam.vl["LKAS11"]
    self.clu11 = cp.vl["CLU11"]
    self.scc11 = cp_scc.vl["SCC11"]
    self.scc12 = cp_scc.vl["SCC12"]
    self.mdps12 = cp_mdps.vl["MDPS12"]
    #self.park_brake = cp.vl["CGW1"]['CF_Gway_ParkBrakeSw']
    self.park_brake = cp.vl["TCS13"]['PBRAKE_ACT'] == 1
    self.steer_state = cp_mdps.vl["MDPS12"]['CF_Mdps_ToiActive'] #0 NOT ACTIVE, 1 ACTIVE
    self.cruise_unavail = cp.vl["TCS13"]['CF_VSM_Avail'] != 1
    self.lead_distance = cp_scc.vl["SCC11"]['ACC_ObjDist'] if not self.no_radar else 0
    self.brake_hold = cp.vl["TCS15"]['AVH_LAMP'] == 2 # 0 OFF, 1 ERROR, 2 ACTIVE, 3 READY
    self.brake_error = cp.vl["TCS13"]['ACCEnable'] != 0 # 0 ACC CONTROL ENABLED, 1-3 ACC CONTROL DISABLED
    ret.radarDistance = cp_scc.vl["SCC11"]['ACC_ObjDist'] if not self.no_radar else 0
    self.lkas_error = cp_cam.vl["LKAS11"]["CF_Lkas_LdwsSysState"] == 7
    if not self.lkas_error:
      self.lkas_button_on = cp_cam.vl["LKAS11"]["CF_Lkas_LdwsSysState"]
    if self.has_scc13:
      self.scc13 = cp_scc.vl["SCC13"]
    if self.has_scc14:
      self.scc14 = cp_scc.vl["SCC14"]
    if self.spas_enabled:
      self.ems11 = cp.vl["EMS11"]
      self.mdps11_strang = cp_mdps.vl["MDPS11"]["CR_Mdps_StrAng"]
      self.mdps11_stat = cp_mdps.vl["MDPS11"]["CF_Mdps_Stat"]
    
    ret.cruiseAccStatus = cp_scc.vl["SCC12"]['ACCMode'] == 1
    ret.driverAcc = self.driverOverride == 1

    return ret

  def update_blinker(self, cp):
    self.TSigLHSw = cp.vl["CGW1"]['CF_Gway_TSigLHSw']
    self.TSigRHSw = cp.vl["CGW1"]['CF_Gway_TSigRHSw']
    leftBlinker = cp.vl["CGW1"]['CF_Gway_TurnSigLh'] != 0
    rightBlinker = cp.vl["CGW1"]['CF_Gway_TurnSigRh'] != 0

    if leftBlinker and not rightBlinker:
      self.left_blinker_flash = 50
      self.right_blinker_flash = 0
    elif rightBlinker and not leftBlinker:
      self.right_blinker_flash = 50
      self.left_blinker_flash = 0
    elif leftBlinker and rightBlinker:
      self.left_blinker_flash = 50
      self.right_blinker_flash = 50

    if  self.left_blinker_flash:
      self.left_blinker_flash -= 1
    if  self.right_blinker_flash:
      self.right_blinker_flash -= 1

    leftBlinker = self.left_blinker_flash != 0
    rightBlinker = self.right_blinker_flash != 0
    return  leftBlinker, rightBlinker

  @staticmethod
  def get_can_parser(CP):

    signals = [
      # sig_name, sig_address, default
      ("WHL_SPD_FL", "WHL_SPD11", 0),
      ("WHL_SPD_FR", "WHL_SPD11", 0),
      ("WHL_SPD_RL", "WHL_SPD11", 0),
      ("WHL_SPD_RR", "WHL_SPD11", 0),

      ("YAW_RATE", "ESP12", 0),

      ("CF_Gway_DrvSeatBeltInd", "CGW4", 1),

      ("CF_Gway_DrvSeatBeltSw", "CGW1", 0), # Driver Seatbelt
      ("CF_Gway_DrvDrSw", "CGW1", 0),       # Driver Door is open
      ("CF_Gway_AstDrSw", "CGW1", 0),       # Passenger door is open
      ("CF_Gway_RLDrSw", "CGW2", 0),        # Rear reft door is open
      ("CF_Gway_RRDrSw", "CGW2", 0),        # Rear right door is open
      ("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),   # Parking Brake

      ("CYL_PRES", "ESP12", 0),

      ("CF_Clu_CruiseSwState", "CLU11", 0),
      ("CF_Clu_CruiseSwMain", "CLU11", 0),
      ("CF_Clu_SldMainSW", "CLU11", 0),
      ("CF_Clu_ParityBit1", "CLU11", 0),
      ("CF_Clu_VanzDecimal" , "CLU11", 0),
      ("CF_Clu_Vanz", "CLU11", 0),
      ("CF_Clu_SPEED_UNIT", "CLU11", 0),
      ("CF_Clu_DetentOut", "CLU11", 0),
      ("CF_Clu_RheostatLevel", "CLU11", 0),
      ("CF_Clu_CluInfo", "CLU11", 0),
      ("CF_Clu_AmpInfo", "CLU11", 0),
      ("CF_Clu_AliveCnt1", "CLU11", 0),

      ("ACCEnable", "TCS13", 0),
      ("ACC_REQ", "TCS13", 0),
      ("BrakeLight", "TCS13", 0),
      ("DriverBraking", "TCS13", 0),
      ("StandStill", "TCS13", 0),
      ("PBRAKE_ACT", "TCS13", 0),
      ("DriverOverride", "TCS13", 0),
      ("CF_VSM_Avail", "TCS13", 0),

      ("ESC_Off_Step", "TCS15", 0),
      ("AVH_LAMP", "TCS15", 0),

      ("CF_Lvr_GearInf", "LVR11", 0),        # Transmission Gear (0 = N or P, 1-8 = Fwd, 14 = Rev)

      ("CF_Lca_Stat", "LCA11", 0),
      ("CF_Lca_IndLeft", "LCA11", 0),
      ("CF_Lca_IndRight", "LCA11", 0),

      ("MainMode_ACC", "SCC11", 1),
      ("SCCInfoDisplay", "SCC11", 0),
      ("AliveCounterACC", "SCC11", 0),
      ("VSetDis", "SCC11", 30),
      ("ObjValid", "SCC11", 0),
      ("DriverAlertDisplay", "SCC11", 0),
      ("TauGapSet", "SCC11", 4),
      ("ACC_ObjStatus", "SCC11", 0),
      ("ACC_ObjLatPos", "SCC11", 0),
      ("ACC_ObjDist", "SCC11", 150), #TK211X value is 204.6
      ("ACC_ObjRelSpd", "SCC11", 0),
      ("Navi_SCC_Curve_Status", "SCC11", 0),
      ("Navi_SCC_Curve_Act", "SCC11", 0),
      ("Navi_SCC_Camera_Act", "SCC11", 0),
      ("Navi_SCC_Camera_Status", "SCC11", 2),

      ("UNIT", "TPMS11", 0),
      ("PRESSURE_FL", "TPMS11", 0),
      ("PRESSURE_FR", "TPMS11", 0),
      ("PRESSURE_RL", "TPMS11", 0),
      ("PRESSURE_RR", "TPMS11", 0),

      ("ACCMode", "SCC12", 0),
      ("CF_VSM_Prefill", "SCC12", 0),
      ("CF_VSM_DecCmdAct", "SCC12", 0),
      ("CF_VSM_HBACmd", "SCC12", 0),
      ("CF_VSM_Warn", "SCC12", 0),
      ("CF_VSM_Stat", "SCC12", 0),
      ("CF_VSM_BeltCmd", "SCC12", 0),
      ("ACCFailInfo", "SCC12", 0),
      ("StopReq", "SCC12", 0),
      ("CR_VSM_DecCmd", "SCC12", 0),
      ("aReqRaw", "SCC12", 0), #aReqMax
      ("TakeOverReq", "SCC12", 0),
      ("PreFill", "SCC12", 0),
      ("aReqValue", "SCC12", 0), #aReqMin
      ("CF_VSM_ConfMode", "SCC12", 1),
      ("AEB_Failinfo", "SCC12", 0),
      ("AEB_Status", "SCC12", 2),
      ("AEB_CmdAct", "SCC12", 0),
      ("AEB_StopReq", "SCC12", 0),
      ("CR_VSM_Alive", "SCC12", 0),
      ("CR_VSM_ChkSum", "SCC12", 0),

      ("SCCDrvModeRValue", "SCC13", 2),
      ("SCC_Equip", "SCC13", 1),
      ("AebDrvSetStatus", "SCC13", 0),

      ("JerkUpperLimit", "SCC14", 0),
      ("JerkLowerLimit", "SCC14", 0),
      ("SCCMode2", "SCC14", 0),
      ("ComfortBandUpper", "SCC14", 0),
      ("ComfortBandLower", "SCC14", 0),
    ]

    checks = [
      # address, frequency
      ("TCS13", 50),
      ("TCS15", 10),
      ("CLU11", 50),
      ("ESP12", 100),
      ("CGW1", 10),
      ("CGW4", 5),
      ("WHL_SPD11", 50),
    ]
    if CP.sccBus == 0 and CP.enableCruise:
      checks += [
        ("SCC11", 50),
        ("SCC12", 50),
      ]
    if CP.mdpsBus == 0:
      signals += [
        ("CR_Mdps_StrColTq", "MDPS12", 0),
        ("CF_Mdps_Def", "MDPS12", 0),
        ("CF_Mdps_ToiActive", "MDPS12", 0),
        ("CF_Mdps_ToiUnavail", "MDPS12", 0),
        ("CF_Mdps_MsgCount2", "MDPS12", 0),
        ("CF_Mdps_Chksum2", "MDPS12", 0),
        ("CF_Mdps_ToiFlt", "MDPS12", 0),
        ("CF_Mdps_SErr", "MDPS12", 0),
        ("CR_Mdps_StrTq", "MDPS12", 0),
        ("CF_Mdps_FailStat", "MDPS12", 0),
        ("CR_Mdps_OutTq", "MDPS12", 0)
      ]
      checks += [
        ("MDPS12", 50)
      ]
    if CP.sasBus == 0:
      signals += [
        ("SAS_Angle", "SAS11", 0),
        ("SAS_Speed", "SAS11", 0),
      ]
      checks += [
        ("SAS11", 100)
      ]
    if CP.sccBus == -1:
      signals += [
        ("CRUISE_LAMP_M", "EMS16", 0),
        ("CF_Lvr_CruiseSet", "LVR12", 0),
    ]
    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),
      ]
    elif CP.carFingerprint in FEATURES["use_tcu_gears"]:
      signals += [
        ("CUR_GR", "TCU12",0),
      ]
    elif CP.carFingerprint in FEATURES["use_elect_gears"]:
      signals += [
        ("Elect_Gear_Shifter", "ELECT_GEAR", 0),
    ]
    else:
      signals += [
        ("CF_Lvr_Gear","LVR12",0),
      ]
    if CP.carFingerprint not in FEATURES["use_elect_ems"]:
      signals += [
        ("PV_AV_CAN", "EMS12", 0),
        ("CF_Ems_AclAct", "EMS16", 0),
      ]
      checks += [
        ("EMS12", 100),
        ("EMS16", 100),
      ]
    else:
      signals += [
        ("Accel_Pedal_Pos","E_EMS11",0),
        ("Brake_Pedal_Pos","E_EMS11",0),
      ]
      checks += [
        ("E_EMS11", 100),
      ]

    if CP.carFingerprint in FEATURES["use_fca"]:
      signals += [
        ("FCA_CmdAct", "FCA11", 0),
        ("CF_VSM_Warn", "FCA11", 0),
      ]
      checks += [("FCA11", 50)]

    if CP.carFingerprint in [CAR.SANTA_FE]:
      checks.remove(("TCS13", 50))
    if CP.spasEnabled:
      if CP.mdpsBus == 1:
        signals += [
          ("SWI_IGK", "EMS11", 0),
          ("F_N_ENG", "EMS11", 0),
          ("ACK_TCS", "EMS11", 0),
          ("PUC_STAT", "EMS11", 0),
          ("TQ_COR_STAT", "EMS11", 0),
          ("RLY_AC", "EMS11", 0),
          ("F_SUB_TQI", "EMS11", 0),
          ("TQI_ACOR", "EMS11", 0),
          ("N", "EMS11", 0),
          ("TQI", "EMS11", 0),
          ("TQFR", "EMS11", 0),
          ("VS", "EMS11", 0),
          ("RATIO_TQI_BAS_MAX_STND", "EMS11", 0),
        ]
        checks += [("EMS11", 100)]
      elif CP.mdpsBus == 0:
        signals += [
          ("CR_Mdps_StrAng", "MDPS11", 0),
          ("CF_Mdps_Stat", "MDPS11", 0),
        ]
        checks += [("MDPS11", 100)]

    return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)

  @staticmethod
  def get_can2_parser(CP):
    signals = []
    checks = []
    if CP.mdpsBus == 1:
      signals += [
        ("CR_Mdps_StrColTq", "MDPS12", 0),
        ("CF_Mdps_Def", "MDPS12", 0),
        ("CF_Mdps_ToiActive", "MDPS12", 0),
        ("CF_Mdps_ToiUnavail", "MDPS12", 0),
        ("CF_Mdps_MsgCount2", "MDPS12", 0),
        ("CF_Mdps_Chksum2", "MDPS12", 0),
        ("CF_Mdps_ToiFlt", "MDPS12", 0),
        ("CF_Mdps_SErr", "MDPS12", 0),
        ("CR_Mdps_StrTq", "MDPS12", 0),
        ("CF_Mdps_FailStat", "MDPS12", 0),
        ("CR_Mdps_OutTq", "MDPS12", 0)
      ]
      checks += [
        ("MDPS12", 50)
      ]
      if CP.spasEnabled:
        signals += [
          ("CR_Mdps_StrAng", "MDPS11", 0),
          ("CF_Mdps_Stat", "MDPS11", 0),
        ]
        checks += [
          ("MDPS11", 100),
        ]
    if CP.sasBus == 1:
      signals += [
        ("SAS_Angle", "SAS11", 0),
        ("SAS_Speed", "SAS11", 0),
      ]
      checks += [
        ("SAS11", 100)
      ]
    if CP.sccBus == 1:
      signals += [
        ("MainMode_ACC", "SCC11", 1),
        ("SCCInfoDisplay", "SCC11", 0),
        ("AliveCounterACC", "SCC11", 0),
        ("VSetDis", "SCC11", 30),
        ("ObjValid", "SCC11", 0),
        ("DriverAlertDisplay", "SCC11", 0),
        ("TauGapSet", "SCC11", 4),
        ("ACC_ObjStatus", "SCC11", 0),
        ("ACC_ObjLatPos", "SCC11", 0),
        ("ACC_ObjDist", "SCC11", 150.),
        ("ACC_ObjRelSpd", "SCC11", 0),
        ("Navi_SCC_Curve_Status", "SCC11", 0),
        ("Navi_SCC_Curve_Act", "SCC11", 0),
        ("Navi_SCC_Camera_Act", "SCC11", 0),
        ("Navi_SCC_Camera_Status", "SCC11", 2),


        ("ACCMode", "SCC12", 0),
        ("CF_VSM_Prefill", "SCC12", 0),
        ("CF_VSM_DecCmdAct", "SCC12", 0),
        ("CF_VSM_HBACmd", "SCC12", 0),
        ("CF_VSM_Warn", "SCC12", 0),
        ("CF_VSM_Stat", "SCC12", 0),
        ("CF_VSM_BeltCmd", "SCC12", 0),
        ("ACCFailInfo", "SCC12", 0),
        ("StopReq", "SCC12", 0),
        ("CR_VSM_DecCmd", "SCC12", 0),
        ("aReqRaw", "SCC12", 0), #aReqMax
        ("TakeOverReq", "SCC12", 0),
        ("PreFill", "SCC12", 0),
        ("aReqValue", "SCC12", 0), #aReqMin
        ("CF_VSM_ConfMode", "SCC12", 1),
        ("AEB_Failinfo", "SCC12", 0),
        ("AEB_Status", "SCC12", 2),
        ("AEB_CmdAct", "SCC12", 0),
        ("AEB_StopReq", "SCC12", 0),
        ("CR_VSM_Alive", "SCC12", 0),
        ("CR_VSM_ChkSum", "SCC12", 0),

        ("SCCDrvModeRValue", "SCC13", 2),
        ("SCC_Equip", "SCC13", 1),
        ("AebDrvSetStatus", "SCC13", 0),

        ("JerkUpperLimit", "SCC14", 0),
        ("JerkLowerLimit", "SCC14", 0),
        ("SCCMode2", "SCC14", 0),
        ("ComfortBandUpper", "SCC14", 0),
        ("ComfortBandLower", "SCC14", 0),
      ]
      checks += [
        ("SCC11", 50),
        ("SCC12", 50),
      ]
    return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 1)

  @staticmethod
  def get_cam_can_parser(CP):

    signals = [
      # sig_name, sig_address, default
      ("CF_Lkas_LdwsActivemode", "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),
      ("CF_Lkas_FcwSysState", "LKAS11", 0),
      ("CF_Lkas_FcwCollisionWarning", "LKAS11", 0),
      ("CF_Lkas_MsgCount", "LKAS11", 0),
      ("CF_Lkas_FusionState", "LKAS11", 0),
      ("CF_Lkas_FcwOpt_USM", "LKAS11", 0),
      ("CF_Lkas_LdwsOpt_USM", "LKAS11", 0)
    ]

    checks = [
      ("LKAS11", 100)
    ]
    if CP.sccBus == 2:
      signals += [
        ("MainMode_ACC", "SCC11", 1),
        ("SCCInfoDisplay", "SCC11", 0),
        ("AliveCounterACC", "SCC11", 0),
        ("VSetDis", "SCC11", 30),
        ("ObjValid", "SCC11", 0),
        ("DriverAlertDisplay", "SCC11", 0),
        ("TauGapSet", "SCC11", 4),
        ("ACC_ObjStatus", "SCC11", 0),
        ("ACC_ObjLatPos", "SCC11", 0),
        ("ACC_ObjDist", "SCC11", 150.),
        ("ACC_ObjRelSpd", "SCC11", 0),
        ("Navi_SCC_Curve_Status", "SCC11", 0),
        ("Navi_SCC_Curve_Act", "SCC11", 0),
        ("Navi_SCC_Camera_Act", "SCC11", 0),
        ("Navi_SCC_Camera_Status", "SCC11", 2),

        ("ACCMode", "SCC12", 0),
        ("CF_VSM_Prefill", "SCC12", 0),
        ("CF_VSM_DecCmdAct", "SCC12", 0),
        ("CF_VSM_HBACmd", "SCC12", 0),
        ("CF_VSM_Warn", "SCC12", 0),
        ("CF_VSM_Stat", "SCC12", 0),
        ("CF_VSM_BeltCmd", "SCC12", 0),
        ("ACCFailInfo", "SCC12", 0),
        ("StopReq", "SCC12", 0),
        ("CR_VSM_DecCmd", "SCC12", 0),
        ("aReqRaw", "SCC12", 0), #aReqMax
        ("TakeOverReq", "SCC12", 0),
        ("PreFill", "SCC12", 0),
        ("aReqValue", "SCC12", 0), #aReqMin
        ("CF_VSM_ConfMode", "SCC12", 1),
        ("AEB_Failinfo", "SCC12", 0),
        ("AEB_Status", "SCC12", 2),
        ("AEB_CmdAct", "SCC12", 0),
        ("AEB_StopReq", "SCC12", 0),
        ("CR_VSM_Alive", "SCC12", 0),
        ("CR_VSM_ChkSum", "SCC12", 0),

        ("SCCDrvModeRValue", "SCC13", 2),
        ("SCC_Equip", "SCC13", 1),
        ("AebDrvSetStatus", "SCC13", 0),

        ("JerkUpperLimit", "SCC14", 0),
        ("JerkLowerLimit", "SCC14", 0),
        ("SCCMode2", "SCC14", 0),
        ("ComfortBandUpper", "SCC14", 0),
        ("ComfortBandLower", "SCC14", 0),
      ]
      checks += [
        ("SCC11", 50),
        ("SCC12", 50),
      ]

    return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)
예제 #2
0
class CarState(CarStateBase):
    def __init__(self, CP):
        super().__init__(CP)

        self.cruise_main_button = False
        self.cruise_buttons = False

        self.lkas_button_on = False
        self.lkas_error = False

        self.prev_cruise_main_button = False
        self.prev_cruise_buttons = False

        self.main_on = False
        self.acc_active = False
        self.cruiseState_modeSel = 0

        self.Mdps_ToiUnavail = 0

        self.left_blinker_flash = 0
        self.right_blinker_flash = 0
        self.steerWarning = 0

        self.TSigLHSw = 0
        self.TSigRHSw = 0
        self.driverAcc_time = 0

        self.gearShifter = 0
        self.leftBlindspot_time = 0
        self.rightBlindspot_time = 0

        self.SC = SpdController()

    def update(self, cp, cp_cam):
        self.prev_cruise_main_button = self.cruise_main_button
        self.prev_cruise_buttons = self.cruise_buttons

        ret = car.CarState.new_message()

        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
        ret.wheelSpeeds.fr = cp.vl["WHL_SPD11"]['WHL_SPD_FR'] * CV.KPH_TO_MS
        ret.wheelSpeeds.rl = cp.vl["WHL_SPD11"]['WHL_SPD_RL'] * CV.KPH_TO_MS
        ret.wheelSpeeds.rr = cp.vl["WHL_SPD11"]['WHL_SPD_RR'] * CV.KPH_TO_MS
        ret.vEgoRaw = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr +
                       ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4.
        vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)

        ret.standstill = ret.vEgoRaw < 0.1

        ret.steeringAngle = cp.vl["SAS11"][
            'SAS_Angle'] - self.CP.lateralsRatom.steerOffset
        ret.steeringRate = cp.vl["SAS11"]['SAS_Speed']
        ret.yawRate = cp.vl["ESP12"]['YAW_RATE']
        ret.steeringTorque = cp.vl["MDPS12"]['CR_Mdps_StrColTq']
        ret.steeringTorqueEps = cp.vl["MDPS12"]['CR_Mdps_OutTq']
        ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD

        ret.leftBlinker, ret.rightBlinker = self.update_blinker(cp)

        self.lead_distance = cp.vl["SCC11"]['ACC_ObjDist']
        lead_objspd = cp.vl["SCC11"]['ACC_ObjRelSpd']
        self.lead_objspd = lead_objspd * CV.MS_TO_KPH

        self.VSetDis = cp.vl["SCC11"]['VSetDis']
        self.Mdps_ToiUnavail = cp.vl["MDPS12"]['CF_Mdps_ToiUnavail']
        self.clu_Vanz = cp.vl["CLU11"]["CF_Clu_Vanz"]
        ret.vEgo = self.clu_Vanz * CV.KPH_TO_MS

        steerWarning = False
        if ret.vEgo < 5 or not self.Mdps_ToiUnavail:
            self.steerWarning = 0
        elif self.steerWarning >= 2:
            steerWarning = True
        else:
            self.steerWarning += 1

        ret.steerWarning = steerWarning

        # cruise state
        #ret.cruiseState.available = True
        #ret.cruiseState.enabled = cp.vl["SCC12"]['ACCMode'] != 0
        self.main_on = (cp.vl["SCC11"]["MainMode_ACC"] != 0)
        self.acc_active = (cp.vl["SCC12"]['ACCMode'] != 0)
        self.update_atom(cp, cp_cam)

        ret.cruiseState.available = self.main_on and self.cruiseState_modeSel != 3
        ret.cruiseState.enabled = ret.cruiseState.available  #and self.gearShifter == GearShifter.drive
        ret.cruiseState.standstill = cp.vl["SCC11"]['SCCInfoDisplay'] == 4.

        # most HKG cars has no long control, it is safer and easier to engage by main on
        self.cruiseState_modeSel, speed_kph = self.SC.update_cruiseSW(self)
        ret.cruiseState.modeSel = self.cruiseState_modeSel
        ret.cruiseState.cruiseSwState = self.cruise_buttons
        if self.acc_active:
            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
            ret.cruiseState.speed = speed_kph * speed_conv
        else:
            ret.cruiseState.speed = 0

        # TODO: Find brake pressure
        ret.brake = 0
        ret.brakePressed = cp.vl["TCS13"]['DriverBraking'] != 0

        # TODO: Check this
        ret.brakeLights = bool(cp.vl["TCS13"]['BrakeLight']
                               or ret.brakePressed)

        #TODO: find pedal signal for EV/HYBRID Cars
        if self.CP.carFingerprint in EV_HYBRID:
            ret.gas = cp.vl["E_EMS11"]['Accel_Pedal_Pos'] / 256.
            ret.gasPressed = ret.gas > 0
        else:
            ret.gas = cp.vl["EMS12"]['PV_AV_CAN'] / 100
            ret.gasPressed = bool(cp.vl["EMS16"]["CF_Ems_AclAct"])

        # TODO: refactor gear parsing in function
        self.gearShifter = self.get_gearShifter(cp)
        ret.gearShifter = self.gearShifter

        # Blind Spot Detection and Lane Change Assist signals
        ret.leftBlindspot, ret.rightBlindspot = self.get_Blindspot(cp)

        # save the entire LKAS11 and CLU11
        self.lkas11 = cp_cam.vl["LKAS11"]
        self.clu11 = cp.vl["CLU11"]
        self.mdps12 = cp.vl["MDPS12"]

        self.park_brake = cp.vl["CGW1"]['CF_Gway_ParkBrakeSw']
        self.steer_state = cp.vl["MDPS12"][
            'CF_Mdps_ToiActive']  # 0 NOT ACTIVE, 1 ACTIVE
        self.lead_distance = cp.vl["SCC11"]['ACC_ObjDist']

        return ret

    def update_blinker(self, cp):
        self.TSigLHSw = cp.vl["CGW1"]['CF_Gway_TSigLHSw']
        self.TSigRHSw = cp.vl["CGW1"]['CF_Gway_TSigRHSw']
        leftBlinker = cp.vl["CGW1"]['CF_Gway_TurnSigLh'] != 0
        rightBlinker = cp.vl["CGW1"]['CF_Gway_TurnSigRh'] != 0

        if leftBlinker:
            self.left_blinker_flash = 300
        elif self.left_blinker_flash:
            self.left_blinker_flash -= 1

        if rightBlinker:
            self.right_blinker_flash = 300
        elif self.right_blinker_flash:
            self.right_blinker_flash -= 1

        leftBlinker = self.left_blinker_flash != 0
        rightBlinker = self.right_blinker_flash != 0
        return leftBlinker, rightBlinker

    def update_atom(self, cp, cp_cam):
        # atom append
        self.driverOverride = cp.vl["TCS13"][
            "DriverOverride"]  # 1 Acc,  2 bracking, 0 Normal
        self.cruise_main_button = cp.vl["CLU11"]["CF_Clu_CruiseSwMain"]
        self.cruise_buttons = cp.vl["CLU11"][
            "CF_Clu_CruiseSwState"]  # clu_CruiseSwState
        self.Lkas_LdwsSysState = cp_cam.vl["LKAS11"]["CF_Lkas_LdwsSysState"]
        self.lkas_error = self.Lkas_LdwsSysState == 7
        if not self.lkas_error:
            self.lkas_button_on = self.Lkas_LdwsSysState

        if self.driverOverride == 1:
            self.driverAcc_time = 100
        elif self.driverAcc_time:
            self.driverAcc_time -= 1

    def get_gearShifter(self, cp):
        gearShifter = GearShifter.unknown
        # 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:
                gearShifter = GearShifter.drive
            elif cp.vl["CLU15"]["CF_Clu_InhibitN"] == 1:
                gearShifter = GearShifter.neutral
            elif cp.vl["CLU15"]["CF_Clu_InhibitP"] == 1:
                gearShifter = GearShifter.park
            elif cp.vl["CLU15"]["CF_Clu_InhibitR"] == 1:
                gearShifter = GearShifter.reverse

        # Gear Selecton via TCU12
        elif self.CP.carFingerprint in FEATURES["use_tcu_gears"]:
            gear = cp.vl["TCU12"]["CUR_GR"]
            if gear == 0:
                gearShifter = GearShifter.park
            elif gear == 14:
                gearShifter = GearShifter.reverse
            elif gear > 0 and gear < 9:  # unaware of anything over 8 currently
                gearShifter = GearShifter.drive

        # 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
                gearShifter = GearShifter.drive
            elif gear == 6:
                gearShifter = GearShifter.neutral
            elif gear == 0:
                gearShifter = GearShifter.park
            elif gear == 7:
                gearShifter = GearShifter.reverse

        # 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
                gearShifter = GearShifter.drive
            elif gear == 6:
                gearShifter = GearShifter.neutral
            elif gear == 0:
                gearShifter = GearShifter.park
            elif gear == 7:
                gearShifter = GearShifter.reverse

        return gearShifter

    def get_Blindspot(self, cp):
        if cp.vl["LCA11"]['CF_Lca_IndLeft'] != 0:
            self.leftBlindspot_time = 200
        elif self.leftBlindspot_time:
            self.leftBlindspot_time -= 1

        if cp.vl["LCA11"]['CF_Lca_IndRight'] != 0:
            self.rightBlindspot_time = 200
        elif self.rightBlindspot_time:
            self.rightBlindspot_time -= 1

        leftBlindspot = self.leftBlindspot_time != 0
        rightBlindspot = self.rightBlindspot_time != 0

        return leftBlindspot, rightBlindspot

    @staticmethod
    def get_parser_gears(CP, signals, checks):
        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 signals, checks

    @staticmethod
    def get_parser_ev_hybrid(CP, signals, checks):
        if CP.carFingerprint in EV_HYBRID:
            signals += [
                ("Accel_Pedal_Pos", "E_EMS11", 0),
            ]
            checks += [
                ("E_EMS11", 50),
            ]
        else:
            signals += [
                ("PV_AV_CAN", "EMS12", 0),
                ("CF_Ems_AclAct", "EMS16", 0),
            ]
            checks += [
                ("EMS12", 100),
                ("EMS16", 100),  # 608
            ]

        return signals, checks

    @staticmethod
    def get_can_parser(CP):
        signals = [
            # sig_name, sig_address, default
            ("WHL_SPD_FL", "WHL_SPD11", 0),
            ("WHL_SPD_FR", "WHL_SPD11", 0),
            ("WHL_SPD_RL", "WHL_SPD11", 0),
            ("WHL_SPD_RR", "WHL_SPD11", 0),
            ("YAW_RATE", "ESP12", 0),
            ("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),
            ("CYL_PRES", "ESP12", 0),
            ("CF_Clu_CruiseSwState", "CLU11", 0),
            ("CF_Clu_CruiseSwMain", "CLU11", 0),
            ("CF_Clu_SldMainSW", "CLU11", 0),
            ("CF_Clu_ParityBit1", "CLU11", 0),
            ("CF_Clu_VanzDecimal", "CLU11", 0),
            ("CF_Clu_Vanz", "CLU11", 0),
            ("CF_Clu_SPEED_UNIT", "CLU11", 0),
            ("CF_Clu_DetentOut", "CLU11", 0),
            ("CF_Clu_RheostatLevel", "CLU11", 0),
            ("CF_Clu_CluInfo", "CLU11", 0),
            ("CF_Clu_AmpInfo", "CLU11", 0),
            ("CF_Clu_AliveCnt1", "CLU11", 0),
            ("ACCEnable", "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)
            ("CF_Lca_IndLeft", "LCA11", 0),
            ("CF_Lca_IndRight", "LCA11", 0),
            ("CR_Mdps_StrColTq", "MDPS12", 0),
            ("CF_Mdps_Def", "MDPS12", 0),  #
            ("CF_Mdps_ToiActive", "MDPS12", 0),
            ("CF_Mdps_ToiUnavail", "MDPS12", 0),
            ("CF_Mdps_MsgCount2", "MDPS12", 0),  #
            ("CF_Mdps_Chksum2", "MDPS12", 0),  #
            ("CF_Mdps_ToiFlt", "MDPS12", 0),  #
            ("CF_Mdps_SErr", "MDPS12", 0),  #
            ("CR_Mdps_StrTq", "MDPS12", 0),  #
            ("CF_Mdps_FailStat", "MDPS12", 0),
            ("CR_Mdps_OutTq", "MDPS12", 0),
            ("SAS_Angle", "SAS11", 0),
            ("SAS_Speed", "SAS11", 0),
            ("MainMode_ACC", "SCC11", 0),
            ("VSetDis", "SCC11", 0),
            ("SCCInfoDisplay", "SCC11", 0),
            ("ACC_ObjDist", "SCC11", 0),
            ("ACC_ObjRelSpd", "SCC11", 0),
            ("ACCMode", "SCC12", 1),
        ]

        checks = [
            # address, frequency
            ("MDPS12", 50),  # 593
            ("TCS13", 50),  # 916
            ("TCS15", 10),
            ("CLU11", 50),
            ("ESP12", 100),
            ("CGW1", 10),
            ("CGW4", 5),
            ("WHL_SPD11", 50),  # 902
            ("SAS11", 100),
            ("SCC11", 50),
            ("SCC12", 50),  # 1057
            ("LCA11", 50),
        ]

        signals, checks = CarState.get_parser_ev_hybrid(CP, signals, checks)
        signals, checks = CarState.get_parser_gears(CP, signals, checks)

        return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)

    @staticmethod
    def get_cam_can_parser(CP):

        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),  #  append
            ("CF_Lkas_HbaSysState", "LKAS11", 0),
            ("CF_Lkas_FcwOpt", "LKAS11", 0),
            ("CF_Lkas_HbaOpt", "LKAS11", 0),
            ("CF_Lkas_FcwSysState", "LKAS11", 0),
            ("CF_Lkas_FcwCollisionWarning", "LKAS11", 0),
            ("CF_Lkas_MsgCount", "LKAS11", 0),  #  append
            ("CF_Lkas_FusionState", "LKAS11", 0),
            ("CF_Lkas_FcwOpt_USM", "LKAS11", 0),
            ("CF_Lkas_LdwsOpt_USM", "LKAS11", 0)
        ]

        checks = []

        return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)
예제 #3
0
파일: carstate.py 프로젝트: eric-abb/auto
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"]

        #Auto detection for setup
        self.no_radar = CP.sccBus == -1
        self.lkas_button_on = True
        self.cruise_main_button = 0
        self.mdps_error_cnt = 0
        self.cruise_unavail_cnt = 0

        self.acc_active = False
        self.cruiseState_standstill = False

        self.cruiseState_modeSel = 0
        self.SC = SpdController()

        self.driverAcc_time = 0

        self.apply_steer = 0.

        self.steer_anglecorrection = float(
            int(Params().get("OpkrSteerAngleCorrection", encoding="utf8")) *
            0.1)
        self.gear_correction = Params().get_bool("JustDoGearD")
        self.steer_wind_down = Params().get_bool("SteerWindDown")

        self.brake_check = False
        self.cancel_check = False
        self.safety_sign_check = 0
        self.safety_sign = 0
        self.safety_sign_last = 0
        self.safety_dist = 0
        self.safety_block_remain_dist = 0
        self.is_highway = False
        self.on_speed_control = False

    def update(self, cp, cp2, cp_cam):
        cp_mdps = cp2 if self.CP.mdpsBus == 1 else cp
        cp_sas = cp2 if self.CP.sasBus else cp
        cp_scc = cp_cam if ((self.CP.sccBus == 2)
                            or self.CP.radarOffCan) else cp
        cp_fca = cp_cam if (self.CP.fcaBus == 2) else cp

        self.prev_cruise_buttons = self.cruise_buttons
        self.prev_cruise_main_button = self.cruise_main_button
        self.prev_lkas_button_on = self.lkas_button_on

        ret = car.CarState.new_message()

        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
        ret.wheelSpeeds.fr = cp.vl["WHL_SPD11"]["WHL_SPD_FR"] * CV.KPH_TO_MS
        ret.wheelSpeeds.rl = cp.vl["WHL_SPD11"]["WHL_SPD_RL"] * CV.KPH_TO_MS
        ret.wheelSpeeds.rr = cp.vl["WHL_SPD11"]["WHL_SPD_RR"] * CV.KPH_TO_MS
        ret.vEgoRaw = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr +
                       ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4.
        ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)

        ret.vEgo = cp.vl["CLU11"]["CF_Clu_Vanz"] * CV.KPH_TO_MS

        ret.standstill = ret.vEgoRaw < 0.1
        ret.standStill = self.CP.standStill

        ret.steeringAngleDeg = cp_sas.vl["SAS11"][
            "SAS_Angle"] - self.steer_anglecorrection
        ret.steeringRateDeg = cp_sas.vl["SAS11"]["SAS_Speed"]
        ret.yawRate = cp.vl["ESP12"]["YAW_RATE"]
        ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(
            50, cp.vl["CGW1"]["CF_Gway_TurnSigLh"],
            cp.vl["CGW1"]["CF_Gway_TurnSigRh"])
        ret.steeringTorque = cp_mdps.vl["MDPS12"]["CR_Mdps_StrColTq"]
        ret.steeringTorqueEps = cp_mdps.vl["MDPS12"]["CR_Mdps_OutTq"]
        ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD

        if self.steer_wind_down:
            ret.steerWarning = cp_mdps.vl["MDPS12"][
                "CF_Mdps_ToiUnavail"] != 0 or cp_mdps.vl["MDPS12"][
                    "CF_Mdps_ToiFlt"] != 0
        else:
            self.mdps_error_cnt += 1 if cp_mdps.vl["MDPS12"][
                "CF_Mdps_ToiUnavail"] != 0 else -self.mdps_error_cnt
            ret.steerWarning = self.mdps_error_cnt > 100  #cp_mdps.vl["MDPS12"]["CF_Mdps_ToiUnavail"] != 0

        self.VSetDis = cp_scc.vl["SCC11"]["VSetDis"]
        ret.vSetDis = self.VSetDis
        self.clu_Vanz = cp.vl["CLU11"]["CF_Clu_Vanz"]
        lead_objspd = cp_scc.vl["SCC11"]["ACC_ObjRelSpd"]
        self.lead_objspd = lead_objspd * CV.MS_TO_KPH
        self.Mdps_ToiUnavail = cp_mdps.vl["MDPS12"]["CF_Mdps_ToiUnavail"]
        self.driverOverride = cp.vl["TCS13"]["DriverOverride"]
        if self.driverOverride == 1:
            self.driverAcc_time = 100
        elif self.driverAcc_time:
            self.driverAcc_time -= 1

        # cruise state
        ret.cruiseState.enabled = (cp_scc.vl["SCC12"]["ACCMode"] != 0) if not self.no_radar else \
                                          cp.vl["LVR12"]["CF_Lvr_CruiseSet"] != 0
        ret.cruiseState.available = (cp_scc.vl["SCC11"]["MainMode_ACC"] != 0) if not self.no_radar else \
                                          cp.vl["EMS16"]["CRUISE_LAMP_M"] != 0

        ret.cruiseState.standstill = cp_scc.vl["SCC11"][
            "SCCInfoDisplay"] == 4. if not self.no_radar else False
        self.cruiseState_standstill = ret.cruiseState.standstill
        self.is_set_speed_in_mph = bool(cp.vl["CLU11"]["CF_Clu_SPEED_UNIT"])

        self.acc_active = ret.cruiseState.enabled
        if self.acc_active:
            self.brake_check = False
            self.cancel_check = False

        self.cruiseState_modeSel, speed_kph = self.SC.update_cruiseSW(self)
        ret.cruiseState.modeSel = self.cruiseState_modeSel

        if ret.cruiseState.enabled and (self.brake_check == False
                                        or self.cancel_check == False):
            speed_conv = CV.MPH_TO_MS if self.is_set_speed_in_mph else CV.KPH_TO_MS
            ret.cruiseState.speed = speed_kph * speed_conv if not self.no_radar else \
                                               cp.vl["LVR12"]["CF_Lvr_CruiseSet"] * speed_conv
        else:
            ret.cruiseState.speed = 0

        self.cruise_main_button = cp.vl["CLU11"]["CF_Clu_CruiseSwMain"]
        self.cruise_buttons = cp.vl["CLU11"]["CF_Clu_CruiseSwState"]
        ret.cruiseButtons = self.cruise_buttons

        # TODO: Find brake pressure
        ret.brake = 0
        ret.brakePressed = cp.vl["TCS13"]["DriverBraking"] != 0
        self.brakeUnavailable = cp.vl["TCS13"]["ACCEnable"] == 3
        if ret.brakePressed:
            self.brake_check = True
        if self.cruise_buttons == 4:
            self.cancel_check = True

        # TODO: Check this
        ret.brakeLights = bool(cp.vl["TCS13"]["BrakeLight"]
                               or ret.brakePressed)

        if self.CP.carFingerprint in (HYBRID_CAR | EV_CAR):
            if self.CP.carFingerprint in HYBRID_CAR:
                ret.gas = cp.vl["E_EMS11"]["CR_Vcu_AccPedDep_Pos"] / 254.
            else:
                ret.gas = cp.vl["E_EMS11"]["Accel_Pedal_Pos"] / 254.
            ret.gasPressed = ret.gas > 0
        else:
            ret.gas = cp.vl["EMS12"]["PV_AV_CAN"] / 100.
            ret.gasPressed = bool(cp.vl["EMS16"]["CF_Ems_AclAct"])

        ret.espDisabled = (cp.vl["TCS15"]["ESC_Off_Step"] != 0)

        self.parkBrake = cp.vl["TCS13"]["PBRAKE_ACT"] == 1

        # TPMS code added from OPKR
        if cp.vl["TPMS11"]["UNIT"] == 0.0:
            ret.tpmsPressureFl = cp.vl["TPMS11"]["PRESSURE_FL"]
            ret.tpmsPressureFr = cp.vl["TPMS11"]["PRESSURE_FR"]
            ret.tpmsPressureRl = cp.vl["TPMS11"]["PRESSURE_RL"]
            ret.tpmsPressureRr = cp.vl["TPMS11"]["PRESSURE_RR"]
        elif cp.vl["TPMS11"]["UNIT"] == 1.0:
            ret.tpmsPressureFl = cp.vl["TPMS11"]["PRESSURE_FL"] * 5 * 0.145038
            ret.tpmsPressureFr = cp.vl["TPMS11"]["PRESSURE_FR"] * 5 * 0.145038
            ret.tpmsPressureRl = cp.vl["TPMS11"]["PRESSURE_RL"] * 5 * 0.145038
            ret.tpmsPressureRr = cp.vl["TPMS11"]["PRESSURE_RR"] * 5 * 0.145038
        elif cp.vl["TPMS11"]["UNIT"] == 2.0:
            ret.tpmsPressureFl = cp.vl["TPMS11"]["PRESSURE_FL"] / 10 * 14.5038
            ret.tpmsPressureFr = cp.vl["TPMS11"]["PRESSURE_FR"] / 10 * 14.5038
            ret.tpmsPressureRl = cp.vl["TPMS11"]["PRESSURE_RL"] / 10 * 14.5038
            ret.tpmsPressureRr = cp.vl["TPMS11"]["PRESSURE_RR"] / 10 * 14.5038

        # OPKR
        self.safety_dist = cp.vl["NAVI"]["OPKR_S_Dist"]
        self.safety_sign_check = cp.vl["NAVI"]["OPKR_S_Sign"]
        self.safety_block_remain_dist = cp.vl["NAVI"]["OPKR_SBR_Dist"]
        self.is_highway = cp_scc.vl["SCC11"]["Navi_SCC_Camera_Act"] != 0.
        if self.safety_sign_check in [25.] and not self.is_highway:
            self.safety_sign = 30.
            self.safety_sign_last = self.safety_sign
        elif self.safety_sign_check in [1.] and not self.is_highway:
            self.safety_sign = 40.
            self.safety_sign_last = self.safety_sign
        elif self.safety_sign_check in [8., 9., 10.] and not self.is_highway:
            self.safety_sign = 50.
            self.safety_sign_last = self.safety_sign
        elif self.safety_sign_check in [16., 17., 18.] and not self.is_highway:
            self.safety_sign = 60.
            self.safety_sign_last = self.safety_sign
        elif self.safety_sign_check in [24.] and not self.is_highway:
            self.safety_sign = 70.
            self.safety_sign_last = self.safety_sign
        elif self.safety_sign_check in [0., 1., 2.]:
            self.safety_sign = 80.
            self.safety_sign_last = self.safety_sign
        elif self.safety_sign_check in [8., 10.]:
            self.safety_sign = 90.
            self.safety_sign_last = self.safety_sign
        elif self.safety_sign_check in [16., 17., 18.] and self.is_highway:
            self.safety_sign = 100.
            self.safety_sign_last = self.safety_sign
        elif self.safety_sign_check in [24., 25., 26.] and self.is_highway:
            self.safety_sign = 110.
            self.safety_sign_last = self.safety_sign
        elif self.safety_block_remain_dist < 255.:
            self.safety_sign = self.safety_sign_last
        else:
            self.safety_sign = 0.
        cam_distance_calc = interp(ret.vEgo * CV.MS_TO_KPH, [30, 60, 100, 160],
                                   [3.6, 5.35, 5.8, 6.8])
        consider_speed = interp((ret.vEgo * CV.MS_TO_KPH - self.safety_sign),
                                [10, 30], [1, 1.25])
        if self.safety_sign > 29 and self.safety_dist < cam_distance_calc * consider_speed * ret.vEgo * CV.MS_TO_KPH:
            ret.safetySign = self.safety_sign
            ret.safetyDist = self.safety_dist
            self.on_speed_control = True
        elif self.safety_sign > 29 and self.safety_block_remain_dist < 255.:
            ret.safetySign = self.safety_sign
            ret.safetyDist = self.safety_dist
            self.on_speed_control = True
        elif self.safety_sign > 29 and self.safety_dist < 600.:
            ret.safetySign = self.safety_sign
            ret.safetyDist = self.safety_dist
            self.on_speed_control = False
        else:
            ret.safetySign = 0
            ret.safetyDist = 0
            self.on_speed_control = False

        self.cruiseGapSet = cp_scc.vl["SCC11"]["TauGapSet"]
        ret.cruiseGapSet = self.cruiseGapSet

        # 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"]:
            gear = cp.vl["CLU15"]["CF_Clu_Gear"]
        elif self.CP.carFingerprint in FEATURES["use_tcu_gears"]:
            gear = cp.vl["TCU12"]["CUR_GR"]
        elif self.CP.carFingerprint in FEATURES["use_elect_gears"]:
            gear = cp.vl["ELECT_GEAR"]["Elect_Gear_Shifter"]
        else:
            gear = cp.vl["LVR12"]["CF_Lvr_Gear"]

        if self.gear_correction:
            ret.gearShifter = GearShifter.drive
        else:
            ret.gearShifter = self.parse_gear_shifter(
                self.shifter_values.get(gear))

        if self.CP.fcaBus != -1 or self.CP.carFingerprint in FEATURES[
                "use_fca"]:
            ret.stockAeb = cp_fca.vl["FCA11"]["FCA_CmdAct"] != 0
            ret.stockFcw = cp_fca.vl["FCA11"]["CF_VSM_Warn"] == 2
        elif not self.CP.radarOffCan:
            ret.stockAeb = cp_scc.vl["SCC12"]["AEB_CmdAct"] != 0
            ret.stockFcw = cp_scc.vl["SCC12"]["CF_VSM_Warn"] == 2

        # Blind Spot Detection and Lane Change Assist signals
        if self.CP.bsmAvailable or self.CP.enableBsm:
            self.lca_state = cp.vl["LCA11"]["CF_Lca_Stat"]
            ret.leftBlindspot = cp.vl["LCA11"]["CF_Lca_IndLeft"] != 0
            ret.rightBlindspot = cp.vl["LCA11"]["CF_Lca_IndRight"] != 0

        # save the entire LKAS11, CLU11, SCC12 and MDPS12
        self.lkas11 = copy.copy(cp_cam.vl["LKAS11"])
        self.clu11 = copy.copy(cp.vl["CLU11"])
        self.scc11 = copy.copy(cp_scc.vl["SCC11"])
        self.scc12 = copy.copy(cp_scc.vl["SCC12"])
        self.scc13 = copy.copy(cp_scc.vl["SCC13"])
        self.scc14 = copy.copy(cp_scc.vl["SCC14"])
        self.fca11 = copy.copy(cp_fca.vl["FCA11"])
        self.mdps12 = copy.copy(cp_mdps.vl["MDPS12"])

        self.scc11init = copy.copy(cp.vl["SCC11"])
        self.scc12init = copy.copy(cp.vl["SCC12"])
        self.fca11init = copy.copy(cp.vl["FCA11"])

        ret.brakeHold = cp.vl["TCS15"][
            "AVH_LAMP"] == 2  # 0 OFF, 1 ERROR, 2 ACTIVE, 3 READY
        self.brakeHold = ret.brakeHold
        self.brake_error = cp.vl["TCS13"][
            "ACCEnable"] != 0  # 0 ACC CONTROL ENABLED, 1-3 ACC CONTROL DISABLED
        self.steer_state = cp_mdps.vl["MDPS12"][
            "CF_Mdps_ToiActive"]  #0 NOT ACTIVE, 1 ACTIVE
        self.cruise_unavail_cnt += 1 if cp.vl["TCS13"][
            "CF_VSM_Avail"] != 1 and cp.vl["TCS13"][
                "ACCEnable"] != 0 else -self.cruise_unavail_cnt
        self.cruise_unavail = self.cruise_unavail_cnt > 100
        self.lead_distance = cp_scc.vl["SCC11"][
            "ACC_ObjDist"] if not self.no_radar else 0

        ret.radarDistance = cp_scc.vl["SCC11"][
            "ACC_ObjDist"] if not self.no_radar else 0
        self.lkas_error = cp_cam.vl["LKAS11"]["CF_Lkas_LdwsSysState"] == 7
        if not self.lkas_error:
            self.lkas_button_on = cp_cam.vl["LKAS11"]["CF_Lkas_LdwsSysState"]

        ret.cruiseAccStatus = cp_scc.vl["SCC12"]["ACCMode"] == 1
        ret.driverAcc = self.driverOverride == 1

        return ret

    @staticmethod
    def get_can_parser(CP):
        signals = [
            # sig_name, sig_address, default
            ("WHL_SPD_FL", "WHL_SPD11", 0),
            ("WHL_SPD_FR", "WHL_SPD11", 0),
            ("WHL_SPD_RL", "WHL_SPD11", 0),
            ("WHL_SPD_RR", "WHL_SPD11", 0),
            ("YAW_RATE", "ESP12", 0),
            ("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_TurnSigLh", "CGW1", 0),
            ("CF_Gway_TurnSigRh", "CGW1", 0),
            ("CF_Gway_ParkBrakeSw", "CGW1", 0),
            ("CYL_PRES", "ESP12", 0),
            ("AVH_STAT", "ESP11", 0),
            ("CF_Clu_CruiseSwState", "CLU11", 0),
            ("CF_Clu_CruiseSwMain", "CLU11", 0),
            ("CF_Clu_SldMainSW", "CLU11", 0),
            ("CF_Clu_ParityBit1", "CLU11", 0),
            ("CF_Clu_VanzDecimal", "CLU11", 0),
            ("CF_Clu_Vanz", "CLU11", 0),
            ("CF_Clu_SPEED_UNIT", "CLU11", 0),
            ("CF_Clu_DetentOut", "CLU11", 0),
            ("CF_Clu_RheostatLevel", "CLU11", 0),
            ("CF_Clu_CluInfo", "CLU11", 0),
            ("CF_Clu_AmpInfo", "CLU11", 0),
            ("CF_Clu_AliveCnt1", "CLU11", 0),
            ("ACCEnable", "TCS13", 0),
            ("BrakeLight", "TCS13", 0),
            ("DriverBraking", "TCS13", 0),
            ("DriverOverride", "TCS13", 0),
            ("PBRAKE_ACT", "TCS13", 0),
            ("CF_VSM_Avail", "TCS13", 0),
            ("ESC_Off_Step", "TCS15", 0),
            ("AVH_LAMP", "TCS15", 0),
            ("CF_Lvr_CruiseSet", "LVR12", 0),
            ("CRUISE_LAMP_M", "EMS16", 0),
            ("CR_FCA_Alive", "FCA11", 0),
            ("Supplemental_Counter", "FCA11", 0),
            ("MainMode_ACC", "SCC11", 1),
            ("SCCInfoDisplay", "SCC11", 0),
            ("AliveCounterACC", "SCC11", 0),
            ("VSetDis", "SCC11", 30),
            ("ObjValid", "SCC11", 0),
            ("DriverAlertDisplay", "SCC11", 0),
            ("TauGapSet", "SCC11", 4),
            ("ACC_ObjStatus", "SCC11", 0),
            ("ACC_ObjLatPos", "SCC11", 0),
            ("ACC_ObjDist", "SCC11", 150),  #TK211X value is 204.6
            ("ACC_ObjRelSpd", "SCC11", 0),
            ("Navi_SCC_Curve_Status", "SCC11", 0),
            ("Navi_SCC_Curve_Act", "SCC11", 0),
            ("Navi_SCC_Camera_Act", "SCC11", 0),
            ("Navi_SCC_Camera_Status", "SCC11", 2),
            ("ACCMode", "SCC12", 0),
            ("CF_VSM_Prefill", "SCC12", 0),
            ("CF_VSM_DecCmdAct", "SCC12", 0),
            ("CF_VSM_HBACmd", "SCC12", 0),
            ("CF_VSM_Warn", "SCC12", 0),
            ("CF_VSM_Stat", "SCC12", 0),
            ("CF_VSM_BeltCmd", "SCC12", 0),
            ("ACCFailInfo", "SCC12", 0),
            ("StopReq", "SCC12", 0),
            ("CR_VSM_DecCmd", "SCC12", 0),
            ("aReqRaw", "SCC12", 0),  #aReqMax
            ("TakeOverReq", "SCC12", 0),
            ("PreFill", "SCC12", 0),
            ("aReqValue", "SCC12", 0),  #aReqMin
            ("CF_VSM_ConfMode", "SCC12", 1),
            ("AEB_Failinfo", "SCC12", 0),
            ("AEB_Status", "SCC12", 2),
            ("AEB_CmdAct", "SCC12", 0),
            ("AEB_StopReq", "SCC12", 0),
            ("CR_VSM_Alive", "SCC12", 0),
            ("CR_VSM_ChkSum", "SCC12", 0),
            ("SCCDrvModeRValue", "SCC13", 2),
            ("SCC_Equip", "SCC13", 1),
            ("AebDrvSetStatus", "SCC13", 0),
            ("JerkUpperLimit", "SCC14", 0),
            ("JerkLowerLimit", "SCC14", 0),
            ("SCCMode2", "SCC14", 0),
            ("ComfortBandUpper", "SCC14", 0),
            ("ComfortBandLower", "SCC14", 0),
            ("UNIT", "TPMS11", 0),
            ("PRESSURE_FL", "TPMS11", 0),
            ("PRESSURE_FR", "TPMS11", 0),
            ("PRESSURE_RL", "TPMS11", 0),
            ("PRESSURE_RR", "TPMS11", 0),
            ("OPKR_S_Dist", "NAVI", 0),
            ("OPKR_S_Sign", "NAVI", 31),
            ("OPKR_SBR_Dist", "NAVI", 0),
        ]

        checks = [
            # address, frequency
            ("TCS13", 50),
            ("TCS15", 10),
            ("CLU11", 50),
            ("ESP12", 100),
            ("CGW1", 10),
            ("CGW2", 5),
            ("CGW4", 5),
            ("WHL_SPD11", 50),
        ]
        if CP.sccBus == 0 and CP.pcmCruise:
            checks += [
                ("SCC11", 50),
                ("SCC12", 50),
            ]
        if CP.fcaBus == 0:
            signals += [
                ("FCA_CmdAct", "FCA11", 0),
                ("CF_VSM_Warn", "FCA11", 0),
            ]
            checks += [("FCA11", 50)]

        if CP.mdpsBus == 0:
            signals += [("CR_Mdps_StrColTq", "MDPS12", 0),
                        ("CF_Mdps_Def", "MDPS12", 0),
                        ("CF_Mdps_ToiActive", "MDPS12", 0),
                        ("CF_Mdps_ToiUnavail", "MDPS12", 0),
                        ("CF_Mdps_ToiFlt", "MDPS12", 0),
                        ("CF_Mdps_MsgCount2", "MDPS12", 0),
                        ("CF_Mdps_Chksum2", "MDPS12", 0),
                        ("CF_Mdps_SErr", "MDPS12", 0),
                        ("CR_Mdps_StrTq", "MDPS12", 0),
                        ("CF_Mdps_FailStat", "MDPS12", 0),
                        ("CR_Mdps_OutTq", "MDPS12", 0)]
            checks += [("MDPS12", 50)]
        if CP.sasBus == 0:
            signals += [
                ("SAS_Angle", "SAS11", 0),
                ("SAS_Speed", "SAS11", 0),
            ]
            checks += [("SAS11", 100)]

        if CP.bsmAvailable or CP.enableBsm:
            signals += [
                ("CF_Lca_Stat", "LCA11", 0),
                ("CF_Lca_IndLeft", "LCA11", 0),
                ("CF_Lca_IndRight", "LCA11", 0),
            ]
            checks += [("LCA11", 50)]

        if CP.carFingerprint in (HYBRID_CAR | EV_CAR):
            if CP.carFingerprint in HYBRID_CAR:
                signals += [("CR_Vcu_AccPedDep_Pos", "E_EMS11", 0)]
            else:
                signals += [("Accel_Pedal_Pos", "E_EMS11", 0)]
            checks += [
                ("E_EMS11", 50),
            ]
        else:
            signals += [
                ("PV_AV_CAN", "EMS12", 0),
                ("CF_Ems_AclAct", "EMS16", 0),
            ]
            checks += [
                ("EMS12", 100),
                ("EMS16", 100),
            ]

        if CP.carFingerprint in FEATURES["use_cluster_gears"]:
            signals += [
                ("CF_Clu_Gear", "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,
                         enforce_checks=False)

    @staticmethod
    def get_can2_parser(CP):
        signals = []
        checks = []
        if CP.mdpsBus == 1:
            signals += [("CR_Mdps_StrColTq", "MDPS12", 0),
                        ("CF_Mdps_Def", "MDPS12", 0),
                        ("CF_Mdps_ToiActive", "MDPS12", 0),
                        ("CF_Mdps_ToiUnavail", "MDPS12", 0),
                        ("CF_Mdps_ToiFlt", "MDPS12", 0),
                        ("CF_Mdps_MsgCount2", "MDPS12", 0),
                        ("CF_Mdps_Chksum2", "MDPS12", 0),
                        ("CF_Mdps_SErr", "MDPS12", 0),
                        ("CR_Mdps_StrTq", "MDPS12", 0),
                        ("CF_Mdps_FailStat", "MDPS12", 0),
                        ("CR_Mdps_OutTq", "MDPS12", 0)]
            checks += [("MDPS12", 50)]
        if CP.sasBus == 1:
            signals += [
                ("SAS_Angle", "SAS11", 0),
                ("SAS_Speed", "SAS11", 0),
            ]
            checks += [("SAS11", 100)]
        return CANParser(DBC[CP.carFingerprint]["pt"],
                         signals,
                         checks,
                         1,
                         enforce_checks=False)

    @staticmethod
    def get_cam_can_parser(CP):

        signals = [
            # sig_name, sig_address, default
            ("CF_Lkas_LdwsActivemode", "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),
            ("CF_Lkas_FcwSysState", "LKAS11", 0),
            ("CF_Lkas_FcwCollisionWarning", "LKAS11", 0),
            ("CF_Lkas_MsgCount", "LKAS11", 0),
            ("CF_Lkas_FusionState", "LKAS11", 0),
            ("CF_Lkas_FcwOpt_USM", "LKAS11", 0),
            ("CF_Lkas_LdwsOpt_USM", "LKAS11", 0)
        ]

        checks = [("LKAS11", 100)]
        if CP.sccBus == 2:
            signals += [
                ("MainMode_ACC", "SCC11", 1),
                ("SCCInfoDisplay", "SCC11", 0),
                ("AliveCounterACC", "SCC11", 0),
                ("VSetDis", "SCC11", 30),
                ("ObjValid", "SCC11", 0),
                ("DriverAlertDisplay", "SCC11", 0),
                ("TauGapSet", "SCC11", 4),
                ("ACC_ObjStatus", "SCC11", 0),
                ("ACC_ObjLatPos", "SCC11", 0),
                ("ACC_ObjDist", "SCC11", 150.),
                ("ACC_ObjRelSpd", "SCC11", 0),
                ("Navi_SCC_Curve_Status", "SCC11", 0),
                ("Navi_SCC_Curve_Act", "SCC11", 0),
                ("Navi_SCC_Camera_Act", "SCC11", 0),
                ("Navi_SCC_Camera_Status", "SCC11", 2),
                ("ACCMode", "SCC12", 0),
                ("CF_VSM_Prefill", "SCC12", 0),
                ("CF_VSM_DecCmdAct", "SCC12", 0),
                ("CF_VSM_HBACmd", "SCC12", 0),
                ("CF_VSM_Warn", "SCC12", 0),
                ("CF_VSM_Stat", "SCC12", 0),
                ("CF_VSM_BeltCmd", "SCC12", 0),
                ("ACCFailInfo", "SCC12", 0),
                ("StopReq", "SCC12", 0),
                ("CR_VSM_DecCmd", "SCC12", 0),
                ("aReqRaw", "SCC12", 0),
                ("TakeOverReq", "SCC12", 0),
                ("PreFill", "SCC12", 0),
                ("aReqValue", "SCC12", 0),
                ("CF_VSM_ConfMode", "SCC12", 1),
                ("AEB_Failinfo", "SCC12", 0),
                ("AEB_Status", "SCC12", 2),
                ("AEB_CmdAct", "SCC12", 0),
                ("AEB_StopReq", "SCC12", 0),
                ("CR_VSM_Alive", "SCC12", 0),
                ("CR_VSM_ChkSum", "SCC12", 0),
                ("SCCDrvModeRValue", "SCC13", 2),
                ("SCC_Equip", "SCC13", 1),
                ("AebDrvSetStatus", "SCC13", 0),
                ("JerkUpperLimit", "SCC14", 0),
                ("JerkLowerLimit", "SCC14", 0),
                ("SCCMode2", "SCC14", 0),
                ("ComfortBandUpper", "SCC14", 0),
                ("ComfortBandLower", "SCC14", 0),
                ("ACCMode", "SCC14", 0),
                ("ObjGap", "SCC14", 0),
                ("CF_VSM_Prefill", "FCA11", 0),
                ("CF_VSM_HBACmd", "FCA11", 0),
                ("CF_VSM_Warn", "FCA11", 0),
                ("CF_VSM_BeltCmd", "FCA11", 0),
                ("CR_VSM_DecCmd", "FCA11", 0),
                ("FCA_Status", "FCA11", 2),
                ("FCA_CmdAct", "FCA11", 0),
                ("FCA_StopReq", "FCA11", 0),
                ("FCA_DrvSetStatus", "FCA11", 1),
                ("CF_VSM_DecCmdAct", "FCA11", 0),
                ("FCA_Failinfo", "FCA11", 0),
                ("FCA_RelativeVelocity", "FCA11", 0),
                ("FCA_TimetoCollision", "FCA11", 2540.),
                ("CR_FCA_Alive", "FCA11", 0),
                ("CR_FCA_ChkSum", "FCA11", 0),
                ("Supplemental_Counter", "FCA11", 0),
                ("PAINT1_Status", "FCA11", 1),
            ]
            if CP.sccBus == 2:
                checks += [
                    ("SCC11", 50),
                    ("SCC12", 50),
                ]
                if CP.fcaBus == 2:
                    checks += [("FCA11", 50)]

        return CANParser(DBC[CP.carFingerprint]["pt"],
                         signals,
                         checks,
                         2,
                         enforce_checks=False)
예제 #4
0
class CarState(CarStateBase):
    def __init__(self, CP):
        super().__init__(CP)

        self.read_distance_lines = 0

        #Auto detection for setup
        self.cruise_main_button = 0
        self.cruise_buttons = 0
        self.allow_nonscc_available = False
        self.lkasstate = 0

        self.lead_distance = 150.
        self.radar_obj_valid = 0.
        self.vrelative = 0.
        self.prev_cruise_buttons = 0
        self.prev_gap_button = 0
        self.cancel_button_count = 0
        self.cancel_button_timer = 0
        self.leftblinkerflashdebounce = 0
        self.rightblinkerflashdebounce = 0

        self.SC = SpdController()

        self.driverAcc_time = 0

        self.brake_check = 0
        self.mainsw_check = 0
        self.steer_anglecorrection = int(
            Params().get('OpkrSteerAngleCorrection')) * 0.1
        self.cruise_gap = int(Params().get('OpkrCruiseGapSet'))

        self.pm = messaging.PubMaster(
            ['liveTrafficData', 'dynamicFollowButton'])
        self.sm = messaging.SubMaster(['liveMapData'])

    def update(self, cp, cp2, cp_cam):
        cp_mdps = cp2 if self.CP.mdpsHarness else cp
        cp_sas = cp2 if self.CP.sasBus else cp
        cp_scc = cp_cam if ((self.CP.sccBus == 2)
                            or self.CP.radarOffCan) else cp
        cp_fca = cp_cam if (self.CP.fcaBus == 2) else cp

        self.prev_cruise_buttons = self.cruise_buttons
        self.prev_cruise_main_button = self.cruise_main_button
        self.prev_lkasstate = self.lkasstate

        ret = car.CarState.new_message()

        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
        ret.wheelSpeeds.fr = cp.vl["WHL_SPD11"]['WHL_SPD_FR'] * CV.KPH_TO_MS
        ret.wheelSpeeds.rl = cp.vl["WHL_SPD11"]['WHL_SPD_RL'] * CV.KPH_TO_MS
        ret.wheelSpeeds.rr = cp.vl["WHL_SPD11"]['WHL_SPD_RR'] * CV.KPH_TO_MS
        ret.vEgoRaw = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr +
                       ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4.
        ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)

        ret.standstill = ret.vEgoRaw < 0.1
        ret.standStill = self.CP.standStill

        ret.steeringAngle = cp_sas.vl["SAS11"][
            'SAS_Angle'] - self.steer_anglecorrection
        ret.steeringRate = cp_sas.vl["SAS11"]['SAS_Speed']
        ret.yawRate = cp.vl["ESP12"]['YAW_RATE']

        self.leftblinkerflash = cp.vl["CGW1"][
            'CF_Gway_TurnSigLh'] != 0 and cp.vl["CGW1"]['CF_Gway_TSigLHSw'] == 0
        self.rightblinkerflash = cp.vl["CGW1"][
            'CF_Gway_TurnSigRh'] != 0 and cp.vl["CGW1"]['CF_Gway_TSigRHSw'] == 0

        if self.leftblinkerflash:
            self.leftblinkerflashdebounce = 50
        elif self.leftblinkerflashdebounce > 0:
            self.leftblinkerflashdebounce -= 1

        if self.rightblinkerflash:
            self.rightblinkerflashdebounce = 50
        elif self.rightblinkerflashdebounce > 0:
            self.rightblinkerflashdebounce -= 1

        ret.leftBlinker = cp.vl["CGW1"][
            'CF_Gway_TSigLHSw'] != 0 or self.leftblinkerflashdebounce > 0
        ret.rightBlinker = cp.vl["CGW1"][
            'CF_Gway_TSigRHSw'] != 0 or self.rightblinkerflashdebounce > 0

        ret.steeringTorque = cp_mdps.vl["MDPS12"]['CR_Mdps_StrColTq']
        ret.steeringTorqueEps = cp_mdps.vl["MDPS12"]['CR_Mdps_OutTq']

        ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD

        ret.steerWarning = cp_mdps.vl["MDPS12"]['CF_Mdps_ToiUnavail'] != 0

        self.VSetDis = cp_scc.vl["SCC11"]['VSetDis']
        ret.vSetDis = self.VSetDis
        self.clu_Vanz = ret.vEgo * CV.MS_TO_KPH
        lead_objspd = cp_scc.vl["SCC11"]['ACC_ObjRelSpd']
        self.lead_objspd = lead_objspd * CV.MS_TO_KPH
        self.driverOverride = cp.vl["TCS13"]["DriverOverride"]
        if self.driverOverride == 1:
            self.driverAcc_time = 100
        elif self.driverAcc_time:
            self.driverAcc_time -= 1

        ret.brakeHold = cp.vl["ESP11"]['AVH_STAT'] == 1
        self.brakeHold = ret.brakeHold

        self.cruise_main_button = cp.vl["CLU11"]["CF_Clu_CruiseSwMain"]
        self.cruise_buttons = cp.vl["CLU11"]["CF_Clu_CruiseSwState"]

        if not self.cruise_main_button:
            if self.cruise_buttons == 4 and self.prev_cruise_buttons != 4 and self.cancel_button_count < 3:
                self.cancel_button_count += 1
                self.cancel_button_timer = 100
            elif self.cancel_button_count == 3:
                self.cancel_button_count = 0
            if self.cancel_button_timer <= 100 and self.cancel_button_count:
                self.cancel_button_timer = max(0, self.cancel_button_timer - 1)
                if self.cancel_button_timer == 0:
                    self.cancel_button_count = 0
        else:
            self.cancel_button_count = 0

        if self.prev_gap_button != self.cruise_buttons:
            if self.cruise_buttons == 3:
                self.cruise_gap -= 1
            if self.cruise_gap < 1:
                self.cruise_gap = 4
            self.prev_gap_button = self.cruise_buttons

        # cruise state
        if not self.CP.enableCruise:
            if self.cruise_buttons == 1 or self.cruise_buttons == 2:
                self.allow_nonscc_available = True
                self.brake_check = 0
                self.mainsw_check = 0
            ret.cruiseState.available = self.allow_nonscc_available != 0
            ret.cruiseState.enabled = ret.cruiseState.available
        elif not self.CP.radarOffCan:
            ret.cruiseState.available = (cp_scc.vl["SCC11"]["MainMode_ACC"] !=
                                         0)
            ret.cruiseState.enabled = (cp_scc.vl["SCC12"]['ACCMode'] != 0)

        self.lead_distance = cp_scc.vl["SCC11"]['ACC_ObjDist']
        self.vrelative = cp_scc.vl["SCC11"]['ACC_ObjRelSpd']
        self.radar_obj_valid = cp_scc.vl["SCC11"]['ObjValid']
        ret.cruiseState.standstill = cp_scc.vl["SCC11"]['SCCInfoDisplay'] == 4.

        self.is_set_speed_in_mph = cp.vl["CLU11"]["CF_Clu_SPEED_UNIT"]

        self.acc_active = ret.cruiseState.enabled

        speed_kph = self.SC.update_cruiseSW(self)

        if ret.cruiseState.enabled and (self.brake_check == 0
                                        or self.mainsw_check == 0):
            speed_conv = CV.MPH_TO_MS if self.is_set_speed_in_mph else CV.KPH_TO_MS
            if self.CP.radarOffCan:
                ret.cruiseState.speed = (cp.vl["LVR12"]["CF_Lvr_CruiseSet"] *
                                         speed_conv) + 1
            else:
                ret.cruiseState.speed = cp_scc.vl["SCC11"][
                    'VSetDis'] * speed_conv
        else:
            ret.cruiseState.speed = 0

        self.cruise_main_button = cp.vl["CLU11"]["CF_Clu_CruiseSwMain"]
        self.cruise_buttons = cp.vl["CLU11"]["CF_Clu_CruiseSwState"]
        ret.cruiseButtons = self.cruise_buttons

        if self.cruise_main_button != 0:
            self.mainsw_check = 1

        # TODO: Find brake pressure
        ret.brake = 0
        ret.brakePressed = cp.vl["TCS13"]['DriverBraking'] != 0
        self.brakeUnavailable = cp.vl["TCS13"]['ACCEnable'] == 3
        if ret.brakePressed:
            self.brake_check = 1

        # TODO: Check this
        ret.brakeLights = bool(cp.vl["TCS13"]['BrakeLight']
                               or ret.brakePressed)

        if self.CP.carFingerprint in ELEC_VEH:
            ret.gas = cp.vl["E_EMS11"]['Accel_Pedal_Pos'] / 256.
        elif self.CP.carFingerprint in HYBRID_VEH:
            ret.gas = cp.vl["EV_PC4"]['CR_Vcu_AccPedDep_Pc']
        elif self.CP.emsAvailable:
            ret.gas = cp.vl["EMS12"]['PV_AV_CAN'] / 100

        ret.gasPressed = (cp.vl["TCS13"]["DriverOverride"] == 1)
        if self.CP.emsAvailable:
            ret.gasPressed = ret.gasPressed or bool(
                cp.vl["EMS16"]["CF_Ems_AclAct"])

        ret.espDisabled = (cp.vl["TCS15"]['ESC_Off_Step'] != 0)

        self.parkBrake = (cp.vl["CGW1"]['CF_Gway_ParkBrakeSw'] != 0)

        #TPMS
        if cp.vl["TPMS11"]['PRESSURE_FL'] > 43:
            ret.tpmsPressureFl = cp.vl["TPMS11"]['PRESSURE_FL'] * 5 * 0.145
        else:
            ret.tpmsPressureFl = cp.vl["TPMS11"]['PRESSURE_FL']
        if cp.vl["TPMS11"]['PRESSURE_FR'] > 43:
            ret.tpmsPressureFr = cp.vl["TPMS11"]['PRESSURE_FR'] * 5 * 0.145
        else:
            ret.tpmsPressureFr = cp.vl["TPMS11"]['PRESSURE_FR']
        if cp.vl["TPMS11"]['PRESSURE_RL'] > 43:
            ret.tpmsPressureRl = cp.vl["TPMS11"]['PRESSURE_RL'] * 5 * 0.145
        else:
            ret.tpmsPressureRl = cp.vl["TPMS11"]['PRESSURE_RL']
        if cp.vl["TPMS11"]['PRESSURE_RR'] > 43:
            ret.tpmsPressureRr = cp.vl["TPMS11"]['PRESSURE_RR'] * 5 * 0.145
        else:
            ret.tpmsPressureRr = cp.vl["TPMS11"]['PRESSURE_RR']

        ret.cruiseGapSet = self.cruise_gap

        if self.read_distance_lines != self.cruise_gap:
            self.read_distance_lines = self.cruise_gap
            msg_df = messaging.new_message('dynamicFollowButton')
            msg_df.dynamicFollowButton.status = max(
                self.read_distance_lines - 1, 0)
            self.pm.send('dynamicFollowButton', msg_df)

        # 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
        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.evgearAvailable:
            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
        elif self.CP.lvrAvailable:
            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

        if self.CP.fcaBus != -1:
            ret.stockAeb = cp_fca.vl["FCA11"]['FCA_CmdAct'] != 0
            ret.stockFcw = cp_fca.vl["FCA11"]['CF_VSM_Warn'] == 2
        elif not self.CP.radarOffCan:
            ret.stockAeb = cp_scc.vl["SCC12"]['AEB_CmdAct'] != 0
            ret.stockFcw = cp_scc.vl["SCC12"]['CF_VSM_Warn'] == 2

        if self.CP.bsmAvailable:
            ret.leftBlindspot = cp.vl["LCA11"]["CF_Lca_IndLeft"] != 0
            ret.rightBlindspot = cp.vl["LCA11"]["CF_Lca_IndRight"] != 0

        self.lkasstate = cp_cam.vl["LKAS11"]["CF_Lkas_LdwsSysState"]
        self.lkasbutton = self.lkasstate != self.prev_lkasstate and (
            self.lkasstate == 0 or self.prev_lkasstate == 0)

        # save the entire LKAS11, CLU11, SCC12 and MDPS12
        self.lkas11 = copy.copy(cp_cam.vl["LKAS11"])
        self.clu11 = copy.copy(cp.vl["CLU11"])
        self.scc11 = copy.copy(cp_scc.vl["SCC11"])
        self.scc12 = copy.copy(cp_scc.vl["SCC12"])
        self.scc13 = copy.copy(cp_scc.vl["SCC13"])
        self.scc14 = copy.copy(cp_scc.vl["SCC14"])
        self.fca11 = copy.copy(cp_fca.vl["FCA11"])
        self.mdps12 = copy.copy(cp_mdps.vl["MDPS12"])

        self.scc11init = copy.copy(cp.vl["SCC11"])
        self.scc12init = copy.copy(cp.vl["SCC12"])
        self.fca11init = copy.copy(cp.vl["FCA11"])

        return ret

    @staticmethod
    def get_can_parser(CP):
        checks = []
        signals = [
            # sig_name, sig_address, default
            ("WHL_SPD_FL", "WHL_SPD11", 0),
            ("WHL_SPD_FR", "WHL_SPD11", 0),
            ("WHL_SPD_RL", "WHL_SPD11", 0),
            ("WHL_SPD_RR", "WHL_SPD11", 0),
            ("YAW_RATE", "ESP12", 0),
            ("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),
            ("CYL_PRES", "ESP12", 0),
            ("AVH_STAT", "ESP11", 0),
            ("CF_Clu_CruiseSwState", "CLU11", 0),
            ("CF_Clu_CruiseSwMain", "CLU11", 0),
            ("CF_Clu_SldMainSW", "CLU11", 0),
            ("CF_Clu_ParityBit1", "CLU11", 0),
            ("CF_Clu_VanzDecimal", "CLU11", 0),
            ("CF_Clu_Vanz", "CLU11", 0),
            ("CF_Clu_SPEED_UNIT", "CLU11", 0),
            ("CF_Clu_DetentOut", "CLU11", 0),
            ("CF_Clu_RheostatLevel", "CLU11", 0),
            ("CF_Clu_CluInfo", "CLU11", 0),
            ("CF_Clu_AmpInfo", "CLU11", 0),
            ("CF_Clu_AliveCnt1", "CLU11", 0),
            ("ACCEnable", "TCS13", 0),
            ("BrakeLight", "TCS13", 0),
            ("DriverBraking", "TCS13", 0),
            ("DriverOverride", "TCS13", 0),
            ("ESC_Off_Step", "TCS15", 0),
            ("CF_Lvr_CruiseSet", "LVR12", 0),
            ("CRUISE_LAMP_M", "EMS16", 0),
            ("CR_VSM_Alive", "SCC12", 0),
            ("AliveCounterACC", "SCC11", 0),
            ("CR_FCA_Alive", "FCA11", 0),
            ("Supplemental_Counter", "FCA11", 0),
            ("PRESSURE_FL", "TPMS11", 0),
            ("PRESSURE_FR", "TPMS11", 0),
            ("PRESSURE_RL", "TPMS11", 0),
            ("PRESSURE_RR", "TPMS11", 0),
        ]

        checks = [
            # address, frequency
            ("TCS13", 50),
            ("TCS15", 10),
            ("CLU11", 50),
            ("ESP12", 100),
            ("CGW1", 10),
            ("CGW4", 5),
            ("WHL_SPD11", 50),
        ]

        if CP.sccBus == 0:
            signals += [
                ("MainMode_ACC", "SCC11", 0),
                ("VSetDis", "SCC11", 0),
                ("SCCInfoDisplay", "SCC11", 0),
                ("ACC_ObjStatus", "SCC11", 0),
                ("ACC_ObjDist", "SCC11", 0),
                ("ObjValid", "SCC11", 0),
                ("ACC_ObjRelSpd", "SCC11", 0),
                ("AliveCounterACC", "SCC11", 0),
                ("ACCMode", "SCC12", 1),
                ("AEB_CmdAct", "SCC12", 0),
                ("CF_VSM_Warn", "SCC12", 0),
                ("CR_VSM_Alive", "SCC12", 0),
            ]
            checks += [
                ("SCC11", 50),
                ("SCC12", 50),
            ]
        if CP.fcaBus == 0:
            signals += [
                ("FCA_CmdAct", "FCA11", 0),
                ("CF_VSM_Warn", "FCA11", 0),
                ("CR_FCA_Alive", "FCA11", 0),
                ("Supplemental_Counter", "FCA11", 0),
            ]
            checks += [("FCA11", 50)]

        if not CP.mdpsHarness:
            signals += [("CR_Mdps_StrColTq", "MDPS12", 0),
                        ("CF_Mdps_Def", "MDPS12", 0),
                        ("CF_Mdps_ToiActive", "MDPS12", 0),
                        ("CF_Mdps_ToiUnavail", "MDPS12", 0),
                        ("CF_Mdps_MsgCount2", "MDPS12", 0),
                        ("CF_Mdps_Chksum2", "MDPS12", 0),
                        ("CF_Mdps_ToiFlt", "MDPS12", 0),
                        ("CF_Mdps_SErr", "MDPS12", 0),
                        ("CR_Mdps_StrTq", "MDPS12", 0),
                        ("CF_Mdps_FailStat", "MDPS12", 0),
                        ("CR_Mdps_OutTq", "MDPS12", 0)]
            checks += [("MDPS12", 50)]
        if CP.sasBus == 0:
            signals += [
                ("SAS_Angle", "SAS11", 0),
                ("SAS_Speed", "SAS11", 0),
            ]
            checks += [("SAS11", 100)]

        if CP.bsmAvailable:
            signals += [
                ("CF_Lca_IndLeft", "LCA11", 0),
                ("CF_Lca_IndRight", "LCA11", 0),
            ]
            checks += [("LCA11", 50)]

        if CP.carFingerprint in ELEC_VEH:
            signals += [
                ("Accel_Pedal_Pos", "E_EMS11", 0),
            ]
            checks += [
                ("E_EMS11", 50),
            ]
        elif CP.carFingerprint in HYBRID_VEH:
            signals += [
                ("CR_Vcu_AccPedDep_Pc", "EV_PC4", 0),
            ]
            checks += [
                ("EV_PC4", 50),
            ]
        elif CP.emsAvailable:
            signals += [
                ("PV_AV_CAN", "EMS12", 0),
                ("CF_Ems_AclAct", "EMS16", 0),
            ]
            checks += [
                ("EMS12", 100),
                ("EMS16", 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.evgearAvailable:
            signals += [("Elect_Gear_Shifter", "ELECT_GEAR", 0)]
            checks += [("ELECT_GEAR", 20)]
        elif CP.lvrAvailable:
            signals += [("CF_Lvr_Gear", "LVR12", 0)]
            checks += [("LVR12", 100)]

        return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)

    @staticmethod
    def get_can2_parser(CP):
        signals = []
        checks = []
        if CP.mdpsHarness:
            signals += [("CR_Mdps_StrColTq", "MDPS12", 0),
                        ("CF_Mdps_Def", "MDPS12", 0),
                        ("CF_Mdps_ToiActive", "MDPS12", 0),
                        ("CF_Mdps_ToiUnavail", "MDPS12", 0),
                        ("CF_Mdps_MsgCount2", "MDPS12", 0),
                        ("CF_Mdps_Chksum2", "MDPS12", 0),
                        ("CF_Mdps_ToiFlt", "MDPS12", 0),
                        ("CF_Mdps_SErr", "MDPS12", 0),
                        ("CR_Mdps_StrTq", "MDPS12", 0),
                        ("CF_Mdps_FailStat", "MDPS12", 0),
                        ("CR_Mdps_OutTq", "MDPS12", 0)]
            checks += [("MDPS12", 50)]
        if CP.sasBus == 1:
            signals += [
                ("SAS_Angle", "SAS11", 0),
                ("SAS_Speed", "SAS11", 0),
            ]
            checks += [("SAS11", 100)]
        return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 1)

    @staticmethod
    def get_cam_can_parser(CP):

        signals = [
            # sig_name, sig_address, default
            ("CF_Lkas_LdwsActivemode", "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),
            ("CF_Lkas_FcwSysState", "LKAS11", 0),
            ("CF_Lkas_FcwCollisionWarning", "LKAS11", 0),
            ("CF_Lkas_MsgCount", "LKAS11", 0),
            ("CF_Lkas_FusionState", "LKAS11", 0),
            ("CF_Lkas_FcwOpt_USM", "LKAS11", 0),
            ("CF_Lkas_LdwsOpt_USM", "LKAS11", 0)
        ]

        checks = [("LKAS11", 100)]
        if CP.sccBus == 2 or CP.radarOffCan:
            signals += [
                ("MainMode_ACC", "SCC11", 0),
                ("SCCInfoDisplay", "SCC11", 0),
                ("AliveCounterACC", "SCC11", 0),
                ("VSetDis", "SCC11", 0),
                ("ObjValid", "SCC11", 0),
                ("DriverAlertDisplay", "SCC11", 0),
                ("TauGapSet", "SCC11", 4),
                ("ACC_ObjStatus", "SCC11", 0),
                ("ACC_ObjLatPos", "SCC11", 0),
                ("ACC_ObjDist", "SCC11", 150.),
                ("ACC_ObjRelSpd", "SCC11", 0),
                ("Navi_SCC_Curve_Status", "SCC11", 0),
                ("Navi_SCC_Curve_Act", "SCC11", 0),
                ("Navi_SCC_Camera_Act", "SCC11", 0),
                ("Navi_SCC_Camera_Status", "SCC11", 2),
                ("ACCMode", "SCC12", 0),
                ("CF_VSM_Prefill", "SCC12", 0),
                ("CF_VSM_DecCmdAct", "SCC12", 0),
                ("CF_VSM_HBACmd", "SCC12", 0),
                ("CF_VSM_Warn", "SCC12", 0),
                ("CF_VSM_Stat", "SCC12", 0),
                ("CF_VSM_BeltCmd", "SCC12", 0),
                ("ACCFailInfo", "SCC12", 0),
                ("ACCMode", "SCC12", 0),
                ("StopReq", "SCC12", 0),
                ("CR_VSM_DecCmd", "SCC12", 0),
                ("aReqRaw", "SCC12", 0),
                ("TakeOverReq", "SCC12", 0),
                ("PreFill", "SCC12", 0),
                ("aReqValue", "SCC12", 0),
                ("CF_VSM_ConfMode", "SCC12", 1),
                ("AEB_Failinfo", "SCC12", 0),
                ("AEB_Status", "SCC12", 2),
                ("AEB_CmdAct", "SCC12", 0),
                ("AEB_StopReq", "SCC12", 0),
                ("CR_VSM_Alive", "SCC12", 0),
                ("CR_VSM_ChkSum", "SCC12", 0),
                ("SCCDrvModeRValue", "SCC13", 1),
                ("SCC_Equip", "SCC13", 1),
                ("AebDrvSetStatus", "SCC13", 0),
                ("Lead_Veh_Dep_Alert_USM", "SCC13", 0),
                ("JerkUpperLimit", "SCC14", 0),
                ("JerkLowerLimit", "SCC14", 0),
                ("ComfortBandUpper", "SCC14", 0),
                ("ComfortBandLower", "SCC14", 0),
                ("ACCMode", "SCC14", 0),
                ("ObjGap", "SCC14", 0),
                ("CF_VSM_Prefill", "FCA11", 0),
                ("CF_VSM_HBACmd", "FCA11", 0),
                ("CF_VSM_Warn", "FCA11", 0),
                ("CF_VSM_BeltCmd", "FCA11", 0),
                ("CR_VSM_DecCmd", "FCA11", 0),
                ("FCA_Status", "FCA11", 2),
                ("FCA_CmdAct", "FCA11", 0),
                ("FCA_StopReq", "FCA11", 0),
                ("FCA_DrvSetStatus", "FCA11", 1),
                ("CF_VSM_DecCmdAct", "FCA11", 0),
                ("FCA_Failinfo", "FCA11", 0),
                ("FCA_RelativeVelocity", "FCA11", 0),
                ("FCA_TimetoCollision", "FCA11", 2540.),
                ("CR_FCA_Alive", "FCA11", 0),
                ("CR_FCA_ChkSum", "FCA11", 0),
                ("Supplemental_Counter", "FCA11", 0),
                ("PAINT1_Status", "FCA11", 1),
            ]
            if CP.sccBus == 2:
                checks += [
                    ("SCC11", 50),
                    ("SCC12", 50),
                ]
                if CP.fcaBus == 2:
                    checks += [("FCA11", 50)]

        return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)