import numpy as np from cereal import car from common.conversions import Conversions as CV from selfdrive.car.interfaces import CarStateBase from opendbc.can.parser import CANParser from selfdrive.car.volkswagen.values import DBC, CANBUS, PQ_CARS, NetworkLocation, TransmissionType, GearShifter, \ CarControllerParams class CarState(CarStateBase): def __init__(self, CP): super().__init__(CP) self.CCP = CarControllerParams(CP) self.button_states = {button.event_type: False for button in self.CCP.BUTTONS} self.esp_hold_confirmation = False self.upscale_lead_car_signal = False def create_button_events(self, pt_cp, buttons): button_events = [] for button in buttons: state = pt_cp.vl[button.can_addr][button.can_msg] in button.values if self.button_states[button.event_type] != state: event = car.CarState.ButtonEvent.new_message() event.type = button.event_type event.pressed = state button_events.append(event) self.button_states[button.event_type] = state return button_events def update(self, pt_cp, cam_cp, ext_cp, trans_type): if self.CP.carFingerprint in PQ_CARS: return self.update_pq(pt_cp, cam_cp, ext_cp, trans_type) ret = car.CarState.new_message() # Update vehicle speed and acceleration from ABS wheel speeds. ret.wheelSpeeds = self.get_wheel_speeds( pt_cp.vl["ESP_19"]["ESP_VL_Radgeschw_02"], pt_cp.vl["ESP_19"]["ESP_VR_Radgeschw_02"], pt_cp.vl["ESP_19"]["ESP_HL_Radgeschw_02"], pt_cp.vl["ESP_19"]["ESP_HR_Radgeschw_02"], ) ret.vEgoRaw = float(np.mean([ret.wheelSpeeds.fl, ret.wheelSpeeds.fr, ret.wheelSpeeds.rl, ret.wheelSpeeds.rr])) ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) ret.standstill = ret.vEgoRaw == 0 # Update steering angle, rate, yaw rate, and driver input torque. VW send # the sign/direction in a separate signal so they must be recombined. ret.steeringAngleDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradwinkel"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradwinkel"])] ret.steeringRateDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradw_Geschw"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradw_Geschw"])] ret.steeringTorque = pt_cp.vl["LH_EPS_03"]["EPS_Lenkmoment"] * (1, -1)[int(pt_cp.vl["LH_EPS_03"]["EPS_VZ_Lenkmoment"])] ret.steeringPressed = abs(ret.steeringTorque) > self.CCP.STEER_DRIVER_ALLOWANCE ret.yawRate = pt_cp.vl["ESP_02"]["ESP_Gierrate"] * (1, -1)[int(pt_cp.vl["ESP_02"]["ESP_VZ_Gierrate"])] * CV.DEG_TO_RAD # Verify EPS readiness to accept steering commands hca_status = self.CCP.hca_status_values.get(pt_cp.vl["LH_EPS_03"]["EPS_HCA_Status"]) ret.steerFaultPermanent = hca_status in ("DISABLED", "FAULT") ret.steerFaultTemporary = hca_status in ("INITIALIZING", "REJECTED") # Update gas, brakes, and gearshift. ret.gas = pt_cp.vl["Motor_20"]["MO_Fahrpedalrohwert_01"] / 100.0 ret.gasPressed = ret.gas > 0 ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects brake_pedal_pressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"]) brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"]) ret.brakePressed = brake_pedal_pressed or brake_pressure_detected ret.parkingBrake = bool(pt_cp.vl["Kombi_01"]["KBI_Handbremse"]) # FIXME: need to include an EPB check as well # Update gear and/or clutch position data. if trans_type == TransmissionType.automatic: ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_11"]["GE_Fahrstufe"], None)) elif trans_type == TransmissionType.direct: ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["EV_Gearshift"]["GearPosition"], None)) elif trans_type == TransmissionType.manual: ret.clutchPressed = not pt_cp.vl["Motor_14"]["MO_Kuppl_schalter"] if bool(pt_cp.vl["Gateway_72"]["BCM1_Rueckfahrlicht_Schalter"]): ret.gearShifter = GearShifter.reverse else: ret.gearShifter = GearShifter.drive # Update door and trunk/hatch lid open status. ret.doorOpen = any([pt_cp.vl["Gateway_72"]["ZV_FT_offen"], pt_cp.vl["Gateway_72"]["ZV_BT_offen"], pt_cp.vl["Gateway_72"]["ZV_HFS_offen"], pt_cp.vl["Gateway_72"]["ZV_HBFS_offen"], pt_cp.vl["Gateway_72"]["ZV_HD_offen"]]) # Update seatbelt fastened status. ret.seatbeltUnlatched = pt_cp.vl["Airbag_02"]["AB_Gurtschloss_FA"] != 3 # Consume blind-spot monitoring info/warning LED states, if available. # Infostufe: BSM LED on, Warnung: BSM LED flashing if self.CP.enableBsm: ret.leftBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_li"]) ret.rightBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_re"]) # Consume factory LDW data relevant for factory SWA (Lane Change Assist) # and capture it for forwarding to the blind spot radar controller self.ldw_stock_values = cam_cp.vl["LDW_02"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {} # Stock FCW is considered active if the release bit for brake-jerk warning # is set. Stock AEB considered active if the partial braking or target # braking release bits are set. # Refer to VW Self Study Program 890253: Volkswagen Driver Assistance # Systems, chapter on Front Assist with Braking: Golf Family for all MQB ret.stockFcw = bool(ext_cp.vl["ACC_10"]["AWV2_Freigabe"]) ret.stockAeb = bool(ext_cp.vl["ACC_10"]["ANB_Teilbremsung_Freigabe"]) or bool(ext_cp.vl["ACC_10"]["ANB_Zielbremsung_Freigabe"]) # Update ACC radar status. self.acc_type = ext_cp.vl["ACC_06"]["ACC_Typ"] if pt_cp.vl["TSK_06"]["TSK_Status"] == 2: # ACC okay and enabled, but not currently engaged ret.cruiseState.available = True ret.cruiseState.enabled = False elif pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5): # ACC okay and enabled, currently regulating speed (3) or driver accel override (4) or brake only (5) ret.cruiseState.available = True ret.cruiseState.enabled = True else: # ACC okay but disabled (1), or a radar visibility or other fault/disruption (6 or 7) ret.cruiseState.available = False ret.cruiseState.enabled = False self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) # Update ACC setpoint. When the setpoint is zero or there's an error, the # radar sends a set-speed of ~90.69 m/s / 203mph. if self.CP.pcmCruise: ret.cruiseState.speed = ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS if ret.cruiseState.speed > 90: ret.cruiseState.speed = 0 # Update button states for turn signals and ACC controls, capture all ACC button state/config for passthrough ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Left"]) ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Right"]) ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) self.gra_stock_values = pt_cp.vl["GRA_ACC_01"] # Additional safety checks performed in CarInterface. ret.espDisabled = pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"] != 0 # Digital instrument clusters expect the ACC HUD lead car distance to be scaled differently self.upscale_lead_car_signal = bool(pt_cp.vl["Kombi_03"]["KBI_Variante"]) return ret def update_pq(self, pt_cp, cam_cp, ext_cp, trans_type): ret = car.CarState.new_message() # Update vehicle speed and acceleration from ABS wheel speeds. ret.wheelSpeeds = self.get_wheel_speeds( pt_cp.vl["Bremse_3"]["Radgeschw__VL_4_1"], pt_cp.vl["Bremse_3"]["Radgeschw__VR_4_1"], pt_cp.vl["Bremse_3"]["Radgeschw__HL_4_1"], pt_cp.vl["Bremse_3"]["Radgeschw__HR_4_1"], ) # vEgo obtained from Bremse_1 vehicle speed rather than Bremse_3 wheel speeds because Bremse_3 isn't present on NSF ret.vEgoRaw = pt_cp.vl["Bremse_1"]["Geschwindigkeit_neu__Bremse_1_"] * CV.KPH_TO_MS ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) ret.standstill = ret.vEgoRaw == 0 # Update steering angle, rate, yaw rate, and driver input torque. VW send # the sign/direction in a separate signal so they must be recombined. ret.steeringAngleDeg = pt_cp.vl["Lenkhilfe_3"]["LH3_BLW"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_BLWSign"])] ret.steeringRateDeg = pt_cp.vl["Lenkwinkel_1"]["Lenkradwinkel_Geschwindigkeit"] * (1, -1)[int(pt_cp.vl["Lenkwinkel_1"]["Lenkradwinkel_Geschwindigkeit_S"])] ret.steeringTorque = pt_cp.vl["Lenkhilfe_3"]["LH3_LM"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_LMSign"])] ret.steeringPressed = abs(ret.steeringTorque) > self.CCP.STEER_DRIVER_ALLOWANCE ret.yawRate = pt_cp.vl["Bremse_5"]["Giergeschwindigkeit"] * (1, -1)[int(pt_cp.vl["Bremse_5"]["Vorzeichen_der_Giergeschwindigk"])] * CV.DEG_TO_RAD # Verify EPS readiness to accept steering commands hca_status = self.CCP.hca_status_values.get(pt_cp.vl["Lenkhilfe_2"]["LH2_Sta_HCA"]) ret.steerFaultPermanent = hca_status in ("DISABLED", "FAULT") ret.steerFaultTemporary = hca_status in ("INITIALIZING", "REJECTED") # Update gas, brakes, and gearshift. ret.gas = pt_cp.vl["Motor_3"]["Fahrpedal_Rohsignal"] / 100.0 ret.gasPressed = ret.gas > 0 ret.brake = pt_cp.vl["Bremse_5"]["Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects ret.brakePressed = bool(pt_cp.vl["Motor_2"]["Bremslichtschalter"]) ret.parkingBrake = bool(pt_cp.vl["Kombi_1"]["Bremsinfo"]) # Update gear and/or clutch position data. if trans_type == TransmissionType.automatic: ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_1"]["Waehlhebelposition__Getriebe_1_"], None)) elif trans_type == TransmissionType.manual: ret.clutchPressed = not pt_cp.vl["Motor_1"]["Kupplungsschalter"] reverse_light = bool(pt_cp.vl["Gate_Komf_1"]["GK1_Rueckfahr"]) if reverse_light: ret.gearShifter = GearShifter.reverse else: ret.gearShifter = GearShifter.drive # Update door and trunk/hatch lid open status. ret.doorOpen = any([pt_cp.vl["Gate_Komf_1"]["GK1_Fa_Tuerkont"], pt_cp.vl["Gate_Komf_1"]["BSK_BT_geoeffnet"], pt_cp.vl["Gate_Komf_1"]["BSK_HL_geoeffnet"], pt_cp.vl["Gate_Komf_1"]["BSK_HR_geoeffnet"], pt_cp.vl["Gate_Komf_1"]["BSK_HD_Hauptraste"]]) # Update seatbelt fastened status. ret.seatbeltUnlatched = not bool(pt_cp.vl["Airbag_1"]["Gurtschalter_Fahrer"]) # Consume blind-spot monitoring info/warning LED states, if available. # Infostufe: BSM LED on, Warnung: BSM LED flashing if self.CP.enableBsm: ret.leftBlindspot = bool(ext_cp.vl["SWA_1"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_1"]["SWA_Warnung_SWA_li"]) ret.rightBlindspot = bool(ext_cp.vl["SWA_1"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_1"]["SWA_Warnung_SWA_re"]) # Consume factory LDW data relevant for factory SWA (Lane Change Assist) # and capture it for forwarding to the blind spot radar controller self.ldw_stock_values = cam_cp.vl["LDW_Status"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {} # Stock FCW is considered active if the release bit for brake-jerk warning # is set. Stock AEB considered active if the partial braking or target # braking release bits are set. # Refer to VW Self Study Program 890253: Volkswagen Driver Assistance # Systems, chapters on Front Assist with Braking and City Emergency # Braking for the 2016 Passat NMS # TODO: deferred until we can collect data on pre-MY2016 behavior, AWV message may be shorter with fewer signals ret.stockFcw = False ret.stockAeb = False # Update ACC radar status. self.acc_type = ext_cp.vl["ACC_System"]["ACS_Typ_ACC"] ret.cruiseState.available = bool(pt_cp.vl["Motor_5"]["GRA_Hauptschalter"]) ret.cruiseState.enabled = pt_cp.vl["Motor_2"]["GRA_Status"] in (1, 2) if self.CP.pcmCruise: ret.accFaulted = ext_cp.vl["ACC_GRA_Anzeige"]["ACA_StaACC"] in (6, 7) else: ret.accFaulted = pt_cp.vl["Motor_2"]["GRA_Status"] == 3 # Update ACC setpoint. When the setpoint reads as 255, the driver has not # yet established an ACC setpoint, so treat it as zero. ret.cruiseState.speed = ext_cp.vl["ACC_GRA_Anzeige"]["ACA_V_Wunsch"] * CV.KPH_TO_MS if ret.cruiseState.speed > 70: # 255 kph in m/s == no current setpoint ret.cruiseState.speed = 0 # Update button states for turn signals and ACC controls, capture all ACC button state/config for passthrough ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(300, pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_li"], pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_re"]) ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) self.gra_stock_values = pt_cp.vl["GRA_Neu"] # Additional safety checks performed in CarInterface. ret.espDisabled = bool(pt_cp.vl["Bremse_1"]["ESP_Passiv_getastet"]) return ret @staticmethod def get_can_parser(CP): if CP.carFingerprint in PQ_CARS: return CarState.get_can_parser_pq(CP) signals = [ # sig_name, sig_address ("LWI_Lenkradwinkel", "LWI_01"), # Absolute steering angle ("LWI_VZ_Lenkradwinkel", "LWI_01"), # Steering angle sign ("LWI_Lenkradw_Geschw", "LWI_01"), # Absolute steering rate ("LWI_VZ_Lenkradw_Geschw", "LWI_01"), # Steering rate sign ("ESP_VL_Radgeschw_02", "ESP_19"), # ABS wheel speed, front left ("ESP_VR_Radgeschw_02", "ESP_19"), # ABS wheel speed, front right ("ESP_HL_Radgeschw_02", "ESP_19"), # ABS wheel speed, rear left ("ESP_HR_Radgeschw_02", "ESP_19"), # ABS wheel speed, rear right ("ESP_Gierrate", "ESP_02"), # Absolute yaw rate ("ESP_VZ_Gierrate", "ESP_02"), # Yaw rate sign ("ZV_FT_offen", "Gateway_72"), # Door open, driver ("ZV_BT_offen", "Gateway_72"), # Door open, passenger ("ZV_HFS_offen", "Gateway_72"), # Door open, rear left ("ZV_HBFS_offen", "Gateway_72"), # Door open, rear right ("ZV_HD_offen", "Gateway_72"), # Trunk or hatch open ("Comfort_Signal_Left", "Blinkmodi_02"), # Left turn signal including comfort blink interval ("Comfort_Signal_Right", "Blinkmodi_02"), # Right turn signal including comfort blink interval ("AB_Gurtschloss_FA", "Airbag_02"), # Seatbelt status, driver ("AB_Gurtschloss_BF", "Airbag_02"), # Seatbelt status, passenger ("ESP_Fahrer_bremst", "ESP_05"), # Driver applied brake pressure over threshold ("MO_Fahrer_bremst", "Motor_14"), # Brake pedal switch ("ESP_Bremsdruck", "ESP_05"), # Brake pressure ("MO_Fahrpedalrohwert_01", "Motor_20"), # Accelerator pedal value ("EPS_Lenkmoment", "LH_EPS_03"), # Absolute driver torque input ("EPS_VZ_Lenkmoment", "LH_EPS_03"), # Driver torque input sign ("EPS_HCA_Status", "LH_EPS_03"), # EPS HCA control status ("ESP_Tastung_passiv", "ESP_21"), # Stability control disabled ("ESP_Haltebestaetigung", "ESP_21"), # ESP hold confirmation ("KBI_Handbremse", "Kombi_01"), # Manual handbrake applied ("KBI_Variante", "Kombi_03"), # Digital/full-screen instrument cluster installed ("TSK_Status", "TSK_06"), # ACC engagement status from drivetrain coordinator ("GRA_Hauptschalter", "GRA_ACC_01"), # ACC button, on/off ("GRA_Abbrechen", "GRA_ACC_01"), # ACC button, cancel ("GRA_Tip_Setzen", "GRA_ACC_01"), # ACC button, set ("GRA_Tip_Hoch", "GRA_ACC_01"), # ACC button, increase or accel ("GRA_Tip_Runter", "GRA_ACC_01"), # ACC button, decrease or decel ("GRA_Tip_Wiederaufnahme", "GRA_ACC_01"), # ACC button, resume ("GRA_Verstellung_Zeitluecke", "GRA_ACC_01"), # ACC button, time gap adj ("GRA_Typ_Hauptschalter", "GRA_ACC_01"), # ACC main button type ("GRA_Codierung", "GRA_ACC_01"), # ACC button configuration/coding ("GRA_Tip_Stufe_2", "GRA_ACC_01"), # unknown related to stalk type ("GRA_ButtonTypeInfo", "GRA_ACC_01"), # unknown related to stalk type ("COUNTER", "GRA_ACC_01"), # GRA_ACC_01 CAN message counter ] checks = [ # sig_address, frequency ("LWI_01", 100), # From J500 Steering Assist with integrated sensors ("LH_EPS_03", 100), # From J500 Steering Assist with integrated sensors ("ESP_19", 100), # From J104 ABS/ESP controller ("ESP_05", 50), # From J104 ABS/ESP controller ("ESP_21", 50), # From J104 ABS/ESP controller ("Motor_20", 50), # From J623 Engine control module ("TSK_06", 50), # From J623 Engine control module ("ESP_02", 50), # From J104 ABS/ESP controller ("GRA_ACC_01", 33), # From J533 CAN gateway (via LIN from steering wheel controls) ("Gateway_72", 10), # From J533 CAN gateway (aggregated data) ("Motor_14", 10), # From J623 Engine control module ("Airbag_02", 5), # From J234 Airbag control module ("Kombi_01", 2), # From J285 Instrument cluster ("Blinkmodi_02", 1), # From J519 BCM (sent at 1Hz when no lights active, 50Hz when active) ("Kombi_03", 0), # From J285 instrument cluster (not present on older cars, 1Hz when present) ] if CP.transmissionType == TransmissionType.automatic: signals.append(("GE_Fahrstufe", "Getriebe_11")) # Auto trans gear selector position checks.append(("Getriebe_11", 20)) # From J743 Auto transmission control module elif CP.transmissionType == TransmissionType.direct: signals.append(("GearPosition", "EV_Gearshift")) # EV gear selector position checks.append(("EV_Gearshift", 10)) # From J??? unknown EV control module elif CP.transmissionType == TransmissionType.manual: signals += [("MO_Kuppl_schalter", "Motor_14"), # Clutch switch ("BCM1_Rueckfahrlicht_Schalter", "Gateway_72")] # Reverse light from BCM if CP.networkLocation == NetworkLocation.fwdCamera: # Radars are here on CANBUS.pt signals += MqbExtraSignals.fwd_radar_signals checks += MqbExtraSignals.fwd_radar_checks if CP.enableBsm: signals += MqbExtraSignals.bsm_radar_signals checks += MqbExtraSignals.bsm_radar_checks return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CANBUS.pt) @staticmethod def get_cam_can_parser(CP): if CP.carFingerprint in PQ_CARS: return CarState.get_cam_can_parser_pq(CP) signals = [] checks = [] if CP.networkLocation == NetworkLocation.fwdCamera: signals += [ # sig_name, sig_address ("LDW_SW_Warnung_links", "LDW_02"), # Blind spot in warning mode on left side due to lane departure ("LDW_SW_Warnung_rechts", "LDW_02"), # Blind spot in warning mode on right side due to lane departure ("LDW_Seite_DLCTLC", "LDW_02"), # Direction of most likely lane departure (left or right) ("LDW_DLC", "LDW_02"), # Lane departure, distance to line crossing ("LDW_TLC", "LDW_02"), # Lane departure, time to line crossing ] checks += [ # sig_address, frequency ("LDW_02", 10) # From R242 Driver assistance camera ] else: # Radars are here on CANBUS.cam signals += MqbExtraSignals.fwd_radar_signals checks += MqbExtraSignals.fwd_radar_checks if CP.enableBsm: signals += MqbExtraSignals.bsm_radar_signals checks += MqbExtraSignals.bsm_radar_checks return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CANBUS.cam) @staticmethod def get_can_parser_pq(CP): signals = [ # sig_name, sig_address, default ("LH3_BLW", "Lenkhilfe_3"), # Absolute steering angle ("LH3_BLWSign", "Lenkhilfe_3"), # Steering angle sign ("LH3_LM", "Lenkhilfe_3"), # Absolute driver torque input ("LH3_LMSign", "Lenkhilfe_3"), # Driver torque input sign ("LH2_Sta_HCA", "Lenkhilfe_2"), # Steering rack HCA status ("Lenkradwinkel_Geschwindigkeit", "Lenkwinkel_1"), # Absolute steering rate ("Lenkradwinkel_Geschwindigkeit_S", "Lenkwinkel_1"), # Steering rate sign ("Geschwindigkeit_neu__Bremse_1_", "Bremse_1"), # Vehicle speed from ABS ("Radgeschw__VL_4_1", "Bremse_3"), # ABS wheel speed, front left ("Radgeschw__VR_4_1", "Bremse_3"), # ABS wheel speed, front right ("Radgeschw__HL_4_1", "Bremse_3"), # ABS wheel speed, rear left ("Radgeschw__HR_4_1", "Bremse_3"), # ABS wheel speed, rear right ("Giergeschwindigkeit", "Bremse_5"), # Absolute yaw rate ("Vorzeichen_der_Giergeschwindigk", "Bremse_5"), # Yaw rate sign ("Gurtschalter_Fahrer", "Airbag_1"), # Seatbelt status, driver ("Gurtschalter_Beifahrer", "Airbag_1"), # Seatbelt status, passenger ("Bremstestschalter", "Motor_2"), # Brake pedal pressed (brake light test switch) ("Bremslichtschalter", "Motor_2"), # Brakes applied (brake light switch) ("Bremsdruck", "Bremse_5"), # Brake pressure applied ("Vorzeichen_Bremsdruck", "Bremse_5"), # Brake pressure applied sign (???) ("Fahrpedal_Rohsignal", "Motor_3"), # Accelerator pedal value ("ESP_Passiv_getastet", "Bremse_1"), # Stability control disabled ("GRA_Hauptschalter", "Motor_5"), # ACC main switch ("GRA_Status", "Motor_2"), # ACC engagement status ("GK1_Fa_Tuerkont", "Gate_Komf_1"), # Door open, driver ("BSK_BT_geoeffnet", "Gate_Komf_1"), # Door open, passenger ("BSK_HL_geoeffnet", "Gate_Komf_1"), # Door open, rear left ("BSK_HR_geoeffnet", "Gate_Komf_1"), # Door open, rear right ("BSK_HD_Hauptraste", "Gate_Komf_1"), # Trunk or hatch open ("GK1_Blinker_li", "Gate_Komf_1"), # Left turn signal on ("GK1_Blinker_re", "Gate_Komf_1"), # Right turn signal on ("Bremsinfo", "Kombi_1"), # Manual handbrake applied ("GRA_Hauptschalt", "GRA_Neu"), # ACC button, on/off ("GRA_Typ_Hauptschalt", "GRA_Neu"), # ACC button, momentary vs latching ("GRA_Kodierinfo", "GRA_Neu"), # ACC button, configuration ("GRA_Abbrechen", "GRA_Neu"), # ACC button, cancel ("GRA_Neu_Setzen", "GRA_Neu"), # ACC button, set ("GRA_Up_lang", "GRA_Neu"), # ACC button, increase or accel, long press ("GRA_Down_lang", "GRA_Neu"), # ACC button, decrease or decel, long press ("GRA_Up_kurz", "GRA_Neu"), # ACC button, increase or accel, short press ("GRA_Down_kurz", "GRA_Neu"), # ACC button, decrease or decel, short press ("GRA_Recall", "GRA_Neu"), # ACC button, resume ("GRA_Zeitluecke", "GRA_Neu"), # ACC button, time gap adj ("COUNTER", "GRA_Neu"), # ACC button, message counter ("GRA_Sender", "GRA_Neu"), # ACC button, CAN message originator ] checks = [ # sig_address, frequency ("Bremse_1", 100), # From J104 ABS/ESP controller ("Bremse_3", 100), # From J104 ABS/ESP controller ("Lenkhilfe_3", 100), # From J500 Steering Assist with integrated sensors ("Lenkwinkel_1", 100), # From J500 Steering Assist with integrated sensors ("Motor_3", 100), # From J623 Engine control module ("Airbag_1", 50), # From J234 Airbag control module ("Bremse_5", 50), # From J104 ABS/ESP controller ("GRA_Neu", 50), # From J??? steering wheel control buttons ("Kombi_1", 50), # From J285 Instrument cluster ("Motor_2", 50), # From J623 Engine control module ("Motor_5", 50), # From J623 Engine control module ("Lenkhilfe_2", 20), # From J500 Steering Assist with integrated sensors ("Gate_Komf_1", 10), # From J533 CAN gateway ] if CP.transmissionType == TransmissionType.automatic: signals += [("Waehlhebelposition__Getriebe_1_", "Getriebe_1", 0)] # Auto trans gear selector position checks += [("Getriebe_1", 100)] # From J743 Auto transmission control module elif CP.transmissionType == TransmissionType.manual: signals += [("Kupplungsschalter", "Motor_1", 0), # Clutch switch ("GK1_Rueckfahr", "Gate_Komf_1", 0)] # Reverse light from BCM checks += [("Motor_1", 100)] # From J623 Engine control module if CP.networkLocation == NetworkLocation.fwdCamera: # Extended CAN devices other than the camera are here on CANBUS.pt signals += PqExtraSignals.fwd_radar_signals checks += PqExtraSignals.fwd_radar_checks if CP.enableBsm: signals += PqExtraSignals.bsm_radar_signals checks += PqExtraSignals.bsm_radar_checks return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CANBUS.pt) @staticmethod def get_cam_can_parser_pq(CP): signals = [] checks = [] if CP.networkLocation == NetworkLocation.fwdCamera: signals += [ # sig_name, sig_address ("LDW_SW_Warnung_links", "LDW_Status"), # Blind spot in warning mode on left side due to lane departure ("LDW_SW_Warnung_rechts", "LDW_Status"), # Blind spot in warning mode on right side due to lane departure ("LDW_Seite_DLCTLC", "LDW_Status"), # Direction of most likely lane departure (left or right) ("LDW_DLC", "LDW_Status"), # Lane departure, distance to line crossing ("LDW_TLC", "LDW_Status"), # Lane departure, time to line crossing ] checks += [ # sig_address, frequency ("LDW_Status", 10) # From R242 Driver assistance camera ] if CP.networkLocation == NetworkLocation.gateway: # Radars are here on CANBUS.cam signals += PqExtraSignals.fwd_radar_signals checks += PqExtraSignals.fwd_radar_checks if CP.enableBsm: signals += PqExtraSignals.bsm_radar_signals checks += PqExtraSignals.bsm_radar_checks return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CANBUS.cam) class MqbExtraSignals: # Additional signal and message lists for optional or bus-portable controllers fwd_radar_signals = [ ("ACC_Wunschgeschw_02", "ACC_02"), # ACC set speed ("ACC_Typ", "ACC_06"), # Basic vs FtS vs SnG ("AWV2_Freigabe", "ACC_10"), # FCW brake jerk release ("ANB_Teilbremsung_Freigabe", "ACC_10"), # AEB partial braking release ("ANB_Zielbremsung_Freigabe", "ACC_10"), # AEB target braking release ] fwd_radar_checks = [ ("ACC_06", 50), # From J428 ACC radar control module ("ACC_10", 50), # From J428 ACC radar control module ("ACC_02", 17), # From J428 ACC radar control module ] bsm_radar_signals = [ ("SWA_Infostufe_SWA_li", "SWA_01"), # Blind spot object info, left ("SWA_Warnung_SWA_li", "SWA_01"), # Blind spot object warning, left ("SWA_Infostufe_SWA_re", "SWA_01"), # Blind spot object info, right ("SWA_Warnung_SWA_re", "SWA_01"), # Blind spot object warning, right ] bsm_radar_checks = [ ("SWA_01", 20), # From J1086 Lane Change Assist ] class PqExtraSignals: # Additional signal and message lists for optional or bus-portable controllers fwd_radar_signals = [ ("ACS_Typ_ACC", "ACC_System"), # Basic vs FtS (no SnG support on PQ) ("ACA_StaACC", "ACC_GRA_Anzeige"), # ACC drivetrain coordinator status ("ACA_V_Wunsch", "ACC_GRA_Anzeige"), # ACC set speed ] fwd_radar_checks = [ ("ACC_System", 50), # From J428 ACC radar control module ("ACC_GRA_Anzeige", 25), # From J428 ACC radar control module ] bsm_radar_signals = [ ("SWA_Infostufe_SWA_li", "SWA_1"), # Blind spot object info, left ("SWA_Warnung_SWA_li", "SWA_1"), # Blind spot object warning, left ("SWA_Infostufe_SWA_re", "SWA_1"), # Blind spot object info, right ("SWA_Warnung_SWA_re", "SWA_1"), # Blind spot object warning, right ] bsm_radar_checks = [ ("SWA_1", 20), # From J1086 Lane Change Assist ]