From cf39cc823ad5aea33af6d51214ffb14bc51ec6c4 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 13 Aug 2024 20:40:36 -0700 Subject: [PATCH] Move events out of car interfaces (#33280) * chrysler down * honda and ford * we can pass the class for this * do the rest * clean that up * remove EventName * fix CI * move smallest bodies to top * rm todo * eps_timer_soft_disable_alert is too ingrained in carcontroller * re-did everything w/ no diff (except just passing cereal instead of class) --- .importlinter | 2 +- selfdrive/car/__init__.py | 1 - selfdrive/car/car_specific.py | 238 ++++++++++++++++++++++++++ selfdrive/car/card.py | 5 + selfdrive/car/chrysler/interface.py | 13 -- selfdrive/car/ford/interface.py | 4 - selfdrive/car/gm/interface.py | 22 --- selfdrive/car/honda/interface.py | 23 --- selfdrive/car/hyundai/interface.py | 17 -- selfdrive/car/interfaces.py | 89 ---------- selfdrive/car/mazda/interface.py | 11 -- selfdrive/car/nissan/interface.py | 7 - selfdrive/car/subaru/interface.py | 2 - selfdrive/car/tesla/interface.py | 2 - selfdrive/car/toyota/interface.py | 20 --- selfdrive/car/volkswagen/interface.py | 26 +-- 16 files changed, 245 insertions(+), 237 deletions(-) create mode 100644 selfdrive/car/car_specific.py diff --git a/.importlinter b/.importlinter index 087035ca9e..46f70f91f6 100644 --- a/.importlinter +++ b/.importlinter @@ -25,7 +25,6 @@ forbidden_modules = openpilot.tinygrad ignore_imports = # remove these - openpilot.selfdrive.car.interfaces -> openpilot.selfdrive.controls.lib.events openpilot.selfdrive.car.body.carcontroller -> openpilot.selfdrive.controls.lib.pid openpilot.selfdrive.car.tests.test_docs -> openpilot.common.basedir openpilot.selfdrive.car.docs -> openpilot.common.basedir @@ -62,4 +61,5 @@ ignore_imports = openpilot.selfdrive.car.tests.test_car_interfaces -> openpilot.selfdrive.pandad openpilot.selfdrive.car.tests.test_models -> openpilot.selfdrive.pandad openpilot.selfdrive.car.tests.test_car_interfaces -> openpilot.selfdrive.test.fuzzy_generation + openpilot.selfdrive.car.car_specific -> openpilot.selfdrive.controls.lib.events unmatched_ignore_imports_alerting = warn diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 2c6a45d557..52fbf0512a 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -24,7 +24,6 @@ DT_CTRL = 0.01 # car state and control loop timestep (s) STD_CARGO_KG = 136. ButtonType = car.CarState.ButtonEvent.Type -EventName = car.CarEvent.EventName AngleRateLimit = namedtuple('AngleRateLimit', ['speed_bp', 'angle_v']) diff --git a/selfdrive/car/car_specific.py b/selfdrive/car/car_specific.py new file mode 100644 index 0000000000..a4500b6f13 --- /dev/null +++ b/selfdrive/car/car_specific.py @@ -0,0 +1,238 @@ +from cereal import car +from openpilot.selfdrive.car import DT_CTRL +from openpilot.selfdrive.car.interfaces import MAX_CTRL_SPEED +from openpilot.selfdrive.car.volkswagen.values import CarControllerParams as VWCarControllerParams +from openpilot.selfdrive.car.hyundai.interface import ENABLE_BUTTONS as HYUNDAI_ENABLE_BUTTONS + +from openpilot.selfdrive.controls.lib.events import Events + +ButtonType = car.CarState.ButtonEvent.Type +GearShifter = car.CarState.GearShifter +EventName = car.CarEvent.EventName +NetworkLocation = car.CarParams.NetworkLocation + + +class CarSpecificEvents: + def __init__(self, CP: car.CarParams): + self.CP = CP + + self.steering_unpressed = 0 + self.low_speed_alert = False + self.no_steer_warning = False + self.silent_steer_warning = True + + def update(self, CS, CS_prev, CC, CC_prev): + if self.CP.carName in ('body', 'mock'): + events = Events() + + elif self.CP.carName in ('tesla', 'subaru'): + events = self.create_common_events(CS.out, CS_prev) + + elif self.CP.carName == 'ford': + events = self.create_common_events(CS.out, CS_prev, extra_gears=[GearShifter.manumatic]) + + elif self.CP.carName == 'nissan': + events = self.create_common_events(CS.out, CS_prev, extra_gears=[GearShifter.brake]) + + if CS.lkas_enabled: + events.add(EventName.invalidLkasSetting) + + elif self.CP.carName == 'mazda': + events = self.create_common_events(CS.out, CS_prev) + + if CS.lkas_disabled: + events.add(EventName.lkasDisabled) + elif CS.low_speed_alert: + events.add(EventName.belowSteerSpeed) + + elif self.CP.carName == 'chrysler': + events = self.create_common_events(CS.out, CS_prev, extra_gears=[GearShifter.low]) + + # Low speed steer alert hysteresis logic + if self.CP.minSteerSpeed > 0. and CS.out.vEgo < (self.CP.minSteerSpeed + 0.5): + self.low_speed_alert = True + elif CS.out.vEgo > (self.CP.minSteerSpeed + 1.): + self.low_speed_alert = False + if self.low_speed_alert: + events.add(EventName.belowSteerSpeed) + + elif self.CP.carName == 'honda': + events = self.create_common_events(CS.out, CS_prev, pcm_enable=False) + + if self.CP.pcmCruise and CS.out.vEgo < self.CP.minEnableSpeed: + events.add(EventName.belowEngageSpeed) + + if self.CP.pcmCruise: + # we engage when pcm is active (rising edge) + if CS.out.cruiseState.enabled and not CS_prev.cruiseState.enabled: + events.add(EventName.pcmEnable) + elif not CS.out.cruiseState.enabled and (CC_prev.actuators.accel >= 0. or not self.CP.openpilotLongitudinalControl): + # it can happen that car cruise disables while comma system is enabled: need to + # keep braking if needed or if the speed is very low + if CS.out.vEgo < self.CP.minEnableSpeed + 2.: + # non loud alert if cruise disables below 25mph as expected (+ a little margin) + events.add(EventName.speedTooLow) + else: + events.add(EventName.cruiseDisabled) + if self.CP.minEnableSpeed > 0 and CS.out.vEgo < 0.001: + events.add(EventName.manualRestart) + + elif self.CP.carName == 'toyota': + events = self.create_common_events(CS.out, CS_prev) + + if self.CP.openpilotLongitudinalControl: + if CS.out.cruiseState.standstill and not CS.out.brakePressed: + events.add(EventName.resumeRequired) + if CS.low_speed_lockout: + events.add(EventName.lowSpeedLockout) + if CS.out.vEgo < self.CP.minEnableSpeed: + events.add(EventName.belowEngageSpeed) + if CC_prev.actuators.accel > 0.3: + # some margin on the actuator to not false trigger cancellation while stopping + events.add(EventName.speedTooLow) + if CS.out.vEgo < 0.001: + # while in standstill, send a user alert + events.add(EventName.manualRestart) + + elif self.CP.carName == 'gm': + # The ECM allows enabling on falling edge of set, but only rising edge of resume + events = self.create_common_events(CS.out, CS_prev, extra_gears=[GearShifter.sport, GearShifter.low, + GearShifter.eco, GearShifter.manumatic], + pcm_enable=self.CP.pcmCruise, enable_buttons=(ButtonType.decelCruise,)) + if not self.CP.pcmCruise: + if any(b.type == ButtonType.accelCruise and b.pressed for b in CS.out.buttonEvents): + events.add(EventName.buttonEnable) + + # Enabling at a standstill with brake is allowed + # TODO: verify 17 Volt can enable for the first time at a stop and allow for all GMs + below_min_enable_speed = CS.out.vEgo < self.CP.minEnableSpeed or CS.moving_backward + if below_min_enable_speed and not (CS.out.standstill and CS.out.brake >= 20 and + self.CP.networkLocation == NetworkLocation.fwdCamera): + events.add(EventName.belowEngageSpeed) + if CS.out.cruiseState.standstill: + events.add(EventName.resumeRequired) + if CS.out.vEgo < self.CP.minSteerSpeed: + events.add(EventName.belowSteerSpeed) + + elif self.CP.carName == 'volkswagen': + events = self.create_common_events(CS.out, CS_prev, extra_gears=[GearShifter.eco, GearShifter.sport, GearShifter.manumatic], + pcm_enable=not self.CP.openpilotLongitudinalControl, + enable_buttons=(ButtonType.setCruise, ButtonType.resumeCruise)) + + # Low speed steer alert hysteresis logic + if (self.CP.minSteerSpeed - 1e-3) > VWCarControllerParams.DEFAULT_MIN_STEER_SPEED and CS.out.vEgo < (self.CP.minSteerSpeed + 1.): + self.low_speed_alert = True + elif CS.out.vEgo > (self.CP.minSteerSpeed + 2.): + self.low_speed_alert = False + if self.low_speed_alert: + events.add(EventName.belowSteerSpeed) + + if self.CP.openpilotLongitudinalControl: + if CS.out.vEgo < self.CP.minEnableSpeed + 0.5: + events.add(EventName.belowEngageSpeed) + if CC_prev.enabled and CS.out.vEgo < self.CP.minEnableSpeed: + events.add(EventName.speedTooLow) + + if CC.eps_timer_soft_disable_alert: + events.add(EventName.steerTimeLimit) + + elif self.CP.carName == 'hyundai': + # On some newer model years, the CANCEL button acts as a pause/resume button based on the PCM state + # To avoid re-engaging when openpilot cancels, check user engagement intention via buttons + # Main button also can trigger an engagement on these cars + allow_enable = any(btn in HYUNDAI_ENABLE_BUTTONS for btn in CS.cruise_buttons) or any(CS.main_buttons) + events = self.create_common_events(CS.out, CS_prev, pcm_enable=self.CP.pcmCruise, allow_enable=allow_enable) + + # low speed steer alert hysteresis logic (only for cars with steer cut off above 10 m/s) + if CS.out.vEgo < (self.CP.minSteerSpeed + 2.) and self.CP.minSteerSpeed > 10.: + self.low_speed_alert = True + if CS.out.vEgo > (self.CP.minSteerSpeed + 4.): + self.low_speed_alert = False + if self.low_speed_alert: + events.add(EventName.belowSteerSpeed) + + else: + raise ValueError(f"Unsupported car: {self.CP.carName}") + + return events + + def create_common_events(self, CS, CS_prev, extra_gears=None, pcm_enable=True, allow_enable=True, + enable_buttons=(ButtonType.accelCruise, ButtonType.decelCruise)): + events = Events() + + if CS.doorOpen: + events.add(EventName.doorOpen) + if CS.seatbeltUnlatched: + events.add(EventName.seatbeltNotLatched) + if CS.gearShifter != GearShifter.drive and (extra_gears is None or + CS.gearShifter not in extra_gears): + events.add(EventName.wrongGear) + if CS.gearShifter == GearShifter.reverse: + events.add(EventName.reverseGear) + if not CS.cruiseState.available: + events.add(EventName.wrongCarMode) + if CS.espDisabled: + events.add(EventName.espDisabled) + if CS.espActive: + events.add(EventName.espActive) + if CS.stockFcw: + events.add(EventName.stockFcw) + if CS.stockAeb: + events.add(EventName.stockAeb) + if CS.vEgo > MAX_CTRL_SPEED: + events.add(EventName.speedTooHigh) + if CS.cruiseState.nonAdaptive: + events.add(EventName.wrongCruiseMode) + if CS.brakeHoldActive and self.CP.openpilotLongitudinalControl: + events.add(EventName.brakeHold) + if CS.parkingBrake: + events.add(EventName.parkBrake) + if CS.accFaulted: + events.add(EventName.accFaulted) + if CS.steeringPressed: + events.add(EventName.steerOverride) + if CS.brakePressed and CS.standstill: + events.add(EventName.preEnableStandstill) + if CS.gasPressed: + events.add(EventName.gasPressedOverride) + if CS.vehicleSensorsInvalid: + events.add(EventName.vehicleSensorsInvalid) + + # Handle button presses + for b in CS.buttonEvents: + # Enable OP long on falling edge of enable buttons (defaults to accelCruise and decelCruise, overridable per-port) + if not self.CP.pcmCruise and (b.type in enable_buttons and not b.pressed): + events.add(EventName.buttonEnable) + # Disable on rising and falling edge of cancel for both stock and OP long + if b.type == ButtonType.cancel: + events.add(EventName.buttonCancel) + + # Handle permanent and temporary steering faults + self.steering_unpressed = 0 if CS.steeringPressed else self.steering_unpressed + 1 + if CS.steerFaultTemporary: + if CS.steeringPressed and (not CS_prev.steerFaultTemporary or self.no_steer_warning): + self.no_steer_warning = True + else: + self.no_steer_warning = False + + # if the user overrode recently, show a less harsh alert + if self.silent_steer_warning or CS.standstill or self.steering_unpressed < int(1.5 / DT_CTRL): + self.silent_steer_warning = True + events.add(EventName.steerTempUnavailableSilent) + else: + events.add(EventName.steerTempUnavailable) + else: + self.no_steer_warning = False + self.silent_steer_warning = False + if CS.steerFaultPermanent: + events.add(EventName.steerUnavailable) + + # we engage when pcm is active (rising edge) + # enabling can optionally be blocked by the car interface + if pcm_enable: + if CS.cruiseState.enabled and not CS_prev.cruiseState.enabled and allow_enable: + events.add(EventName.pcmEnable) + elif not CS.cruiseState.enabled: + events.add(EventName.pcmDisable) + + return events diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 0f26681a05..0cd5591e96 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -15,6 +15,7 @@ from openpilot.common.swaglog import cloudlog, ForwardingHandler from openpilot.selfdrive.pandad import can_capnp_to_list, can_list_to_can_capnp from openpilot.selfdrive.car import DT_CTRL, carlog from openpilot.selfdrive.car.can_definitions import CanData, CanRecvCallable, CanSendCallable +from openpilot.selfdrive.car.car_specific import CarSpecificEvents from openpilot.selfdrive.car.fw_versions import ObdCallback from openpilot.selfdrive.car.car_helpers import get_car from openpilot.selfdrive.car.interfaces import CarInterfaceBase @@ -131,6 +132,8 @@ class Car: self.events = Events() + self.car_events = CarSpecificEvents(self.CP) + # card is driven by can recv, expected at 100Hz self.rk = Ratekeeper(100, print_delay_threshold=None) @@ -157,6 +160,8 @@ class Car: def update_events(self, CS: car.CarState) -> car.CarState: self.events.clear() + CS.events = self.car_events.update(self.CI.CS, self.CS_prev, self.CI.CC, self.CC_prev).to_msg() + self.events.add_from_msg(CS.events) if self.CP.notCar: diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index eb1f6703cd..803fc02a6d 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -81,17 +81,4 @@ class CarInterface(CarInterfaceBase): ret.buttonEvents = create_button_events(self.CS.distance_button, self.CS.prev_distance_button, {1: ButtonType.gapAdjustCruise}) - # events - events = self.create_common_events(ret, extra_gears=[car.CarState.GearShifter.low]) - - # Low speed steer alert hysteresis logic - if self.CP.minSteerSpeed > 0. and ret.vEgo < (self.CP.minSteerSpeed + 0.5): - self.low_speed_alert = True - elif ret.vEgo > (self.CP.minSteerSpeed + 1.): - self.low_speed_alert = False - if self.low_speed_alert: - events.add(car.CarEvent.EventName.belowSteerSpeed) - - ret.events = events.to_msg() - return ret diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index 5768d73e4b..1d0233f771 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -72,8 +72,4 @@ class CarInterface(CarInterfaceBase): ret.buttonEvents = create_button_events(self.CS.distance_button, self.CS.prev_distance_button, {1: ButtonType.gapAdjustCruise}) - events = self.create_common_events(ret, extra_gears=[GearShifter.manumatic]) - - ret.events = events.to_msg() - return ret diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 31b874502b..8dd3426d38 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -12,7 +12,6 @@ from openpilot.selfdrive.car.gm.values import CAR, CruiseButtons, CarControllerP from openpilot.selfdrive.car.interfaces import CarInterfaceBase, TorqueFromLateralAccelCallbackType, FRICTION_THRESHOLD, LatControlInputs, NanoFFModel ButtonType = car.CarState.ButtonEvent.Type -EventName = car.CarEvent.EventName GearShifter = car.CarState.GearShifter TransmissionType = car.CarParams.TransmissionType NetworkLocation = car.CarParams.NetworkLocation @@ -213,25 +212,4 @@ class CarInterface(CarInterfaceBase): {1: ButtonType.gapAdjustCruise}) ] - # The ECM allows enabling on falling edge of set, but only rising edge of resume - events = self.create_common_events(ret, extra_gears=[GearShifter.sport, GearShifter.low, - GearShifter.eco, GearShifter.manumatic], - pcm_enable=self.CP.pcmCruise, enable_buttons=(ButtonType.decelCruise,)) - if not self.CP.pcmCruise: - if any(b.type == ButtonType.accelCruise and b.pressed for b in ret.buttonEvents): - events.add(EventName.buttonEnable) - - # Enabling at a standstill with brake is allowed - # TODO: verify 17 Volt can enable for the first time at a stop and allow for all GMs - below_min_enable_speed = ret.vEgo < self.CP.minEnableSpeed or self.CS.moving_backward - if below_min_enable_speed and not (ret.standstill and ret.brake >= 20 and - self.CP.networkLocation == NetworkLocation.fwdCamera): - events.add(EventName.belowEngageSpeed) - if ret.cruiseState.standstill: - events.add(EventName.resumeRequired) - if ret.vEgo < self.CP.minSteerSpeed: - events.add(EventName.belowSteerSpeed) - - ret.events = events.to_msg() - return ret diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index ae19f6940f..f02cc07ef0 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -12,7 +12,6 @@ from openpilot.selfdrive.car.disable_ecu import disable_ecu ButtonType = car.CarState.ButtonEvent.Type -EventName = car.CarEvent.EventName TransmissionType = car.CarParams.TransmissionType BUTTONS_DICT = {CruiseButtons.RES_ACCEL: ButtonType.accelCruise, CruiseButtons.DECEL_SET: ButtonType.decelCruise, CruiseButtons.MAIN: ButtonType.altButton3, CruiseButtons.CANCEL: ButtonType.cancel} @@ -230,26 +229,4 @@ class CarInterface(CarInterfaceBase): *create_button_events(self.CS.cruise_setting, self.CS.prev_cruise_setting, SETTINGS_BUTTONS_DICT), ] - # events - events = self.create_common_events(ret, pcm_enable=False) - if self.CP.pcmCruise and ret.vEgo < self.CP.minEnableSpeed: - events.add(EventName.belowEngageSpeed) - - if self.CP.pcmCruise: - # we engage when pcm is active (rising edge) - if ret.cruiseState.enabled and not self.CS.out.cruiseState.enabled: - events.add(EventName.pcmEnable) - elif not ret.cruiseState.enabled and (c.actuators.accel >= 0. or not self.CP.openpilotLongitudinalControl): - # it can happen that car cruise disables while comma system is enabled: need to - # keep braking if needed or if the speed is very low - if ret.vEgo < self.CP.minEnableSpeed + 2.: - # non loud alert if cruise disables below 25mph as expected (+ a little margin) - events.add(EventName.speedTooLow) - else: - events.add(EventName.cruiseDisabled) - if self.CS.CP.minEnableSpeed > 0 and ret.vEgo < 0.001: - events.add(EventName.manualRestart) - - ret.events = events.to_msg() - return ret diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index 9bb8e7ecf5..365b8dac6d 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -11,7 +11,6 @@ from openpilot.selfdrive.car.disable_ecu import disable_ecu Ecu = car.CarParams.Ecu ButtonType = car.CarState.ButtonEvent.Type -EventName = car.CarEvent.EventName ENABLE_BUTTONS = (Buttons.RES_ACCEL, Buttons.SET_DECEL, Buttons.CANCEL) BUTTONS_DICT = {Buttons.RES_ACCEL: ButtonType.accelCruise, Buttons.SET_DECEL: ButtonType.decelCruise, Buttons.GAP_DIST: ButtonType.gapAdjustCruise, Buttons.CANCEL: ButtonType.cancel} @@ -156,20 +155,4 @@ class CarInterface(CarInterfaceBase): if self.CS.CP.openpilotLongitudinalControl: ret.buttonEvents = create_button_events(self.CS.cruise_buttons[-1], self.CS.prev_cruise_buttons, BUTTONS_DICT) - # On some newer model years, the CANCEL button acts as a pause/resume button based on the PCM state - # To avoid re-engaging when openpilot cancels, check user engagement intention via buttons - # Main button also can trigger an engagement on these cars - allow_enable = any(btn in ENABLE_BUTTONS for btn in self.CS.cruise_buttons) or any(self.CS.main_buttons) - events = self.create_common_events(ret, pcm_enable=self.CS.CP.pcmCruise, allow_enable=allow_enable) - - # low speed steer alert hysteresis logic (only for cars with steer cut off above 10 m/s) - if ret.vEgo < (self.CP.minSteerSpeed + 2.) and self.CP.minSteerSpeed > 10.: - self.low_speed_alert = True - if ret.vEgo > (self.CP.minSteerSpeed + 4.): - self.low_speed_alert = False - if self.low_speed_alert: - events.add(car.CarEvent.EventName.belowSteerSpeed) - - ret.events = events.to_msg() - return ret diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index ecb059b728..fca988f553 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -16,11 +16,8 @@ from openpilot.selfdrive.car.can_definitions import CanData, CanRecvCallable, Ca from openpilot.selfdrive.car.conversions import Conversions as CV from openpilot.selfdrive.car.helpers import clip from openpilot.selfdrive.car.values import PLATFORMS -from openpilot.selfdrive.controls.lib.events import Events -ButtonType = car.CarState.ButtonEvent.Type GearShifter = car.CarState.GearShifter -EventName = car.CarEvent.EventName V_CRUISE_MAX = 145 MAX_CTRL_SPEED = (V_CRUISE_MAX + 4) * CV.KPH_TO_MS @@ -91,10 +88,6 @@ class CarInterfaceBase(ABC): self.CP = CP self.frame = 0 - self.steering_unpressed = 0 - self.low_speed_alert = False - self.no_steer_warning = False - self.silent_steer_warning = True self.v_ego_cluster_seen = False self.CS: CarStateBase = CarState(CP) @@ -259,88 +252,6 @@ class CarInterfaceBase(ABC): return ret - def create_common_events(self, cs_out, extra_gears=None, pcm_enable=True, allow_enable=True, - enable_buttons=(ButtonType.accelCruise, ButtonType.decelCruise)): - events = Events() - - if cs_out.doorOpen: - events.add(EventName.doorOpen) - if cs_out.seatbeltUnlatched: - events.add(EventName.seatbeltNotLatched) - if cs_out.gearShifter != GearShifter.drive and (extra_gears is None or - cs_out.gearShifter not in extra_gears): - events.add(EventName.wrongGear) - if cs_out.gearShifter == GearShifter.reverse: - events.add(EventName.reverseGear) - if not cs_out.cruiseState.available: - events.add(EventName.wrongCarMode) - if cs_out.espDisabled: - events.add(EventName.espDisabled) - if cs_out.espActive: - events.add(EventName.espActive) - if cs_out.stockFcw: - events.add(EventName.stockFcw) - if cs_out.stockAeb: - events.add(EventName.stockAeb) - if cs_out.vEgo > MAX_CTRL_SPEED: - events.add(EventName.speedTooHigh) - if cs_out.cruiseState.nonAdaptive: - events.add(EventName.wrongCruiseMode) - if cs_out.brakeHoldActive and self.CP.openpilotLongitudinalControl: - events.add(EventName.brakeHold) - if cs_out.parkingBrake: - events.add(EventName.parkBrake) - if cs_out.accFaulted: - events.add(EventName.accFaulted) - if cs_out.steeringPressed: - events.add(EventName.steerOverride) - if cs_out.brakePressed and cs_out.standstill: - events.add(EventName.preEnableStandstill) - if cs_out.gasPressed: - events.add(EventName.gasPressedOverride) - if cs_out.vehicleSensorsInvalid: - events.add(EventName.vehicleSensorsInvalid) - - # Handle button presses - for b in cs_out.buttonEvents: - # Enable OP long on falling edge of enable buttons (defaults to accelCruise and decelCruise, overridable per-port) - if not self.CP.pcmCruise and (b.type in enable_buttons and not b.pressed): - events.add(EventName.buttonEnable) - # Disable on rising and falling edge of cancel for both stock and OP long - if b.type == ButtonType.cancel: - events.add(EventName.buttonCancel) - - # Handle permanent and temporary steering faults - self.steering_unpressed = 0 if cs_out.steeringPressed else self.steering_unpressed + 1 - if cs_out.steerFaultTemporary: - if cs_out.steeringPressed and (not self.CS.out.steerFaultTemporary or self.no_steer_warning): - self.no_steer_warning = True - else: - self.no_steer_warning = False - - # if the user overrode recently, show a less harsh alert - if self.silent_steer_warning or cs_out.standstill or self.steering_unpressed < int(1.5 / DT_CTRL): - self.silent_steer_warning = True - events.add(EventName.steerTempUnavailableSilent) - else: - events.add(EventName.steerTempUnavailable) - else: - self.no_steer_warning = False - self.silent_steer_warning = False - if cs_out.steerFaultPermanent: - events.add(EventName.steerUnavailable) - - # we engage when pcm is active (rising edge) - # enabling can optionally be blocked by the car interface - if pcm_enable: - if cs_out.cruiseState.enabled and not self.CS.out.cruiseState.enabled and allow_enable: - events.add(EventName.pcmEnable) - elif not cs_out.cruiseState.enabled: - events.add(EventName.pcmDisable) - - return events - - class RadarInterfaceBase(ABC): def __init__(self, CP: car.CarParams): self.CP = CP diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index fcec6b18b0..8153d69693 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -6,7 +6,6 @@ from openpilot.selfdrive.car.mazda.values import CAR, LKAS_LIMITS from openpilot.selfdrive.car.interfaces import CarInterfaceBase ButtonType = car.CarState.ButtonEvent.Type -EventName = car.CarEvent.EventName class CarInterface(CarInterfaceBase): @@ -37,14 +36,4 @@ class CarInterface(CarInterfaceBase): # TODO: add button types for inc and dec ret.buttonEvents = create_button_events(self.CS.distance_button, self.CS.prev_distance_button, {1: ButtonType.gapAdjustCruise}) - # events - events = self.create_common_events(ret) - - if self.CS.lkas_disabled: - events.add(EventName.lkasDisabled) - elif self.CS.low_speed_alert: - events.add(EventName.belowSteerSpeed) - - ret.events = events.to_msg() - return ret diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index 2e9a990610..551108ed0d 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -34,11 +34,4 @@ class CarInterface(CarInterfaceBase): ret.buttonEvents = create_button_events(self.CS.distance_button, self.CS.prev_distance_button, {1: ButtonType.gapAdjustCruise}) - events = self.create_common_events(ret, extra_gears=[car.CarState.GearShifter.brake]) - - if self.CS.lkas_enabled: - events.add(car.CarEvent.EventName.invalidLkasSetting) - - ret.events = events.to_msg() - return ret diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index 0ea71e812f..76bda1ee0b 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -101,8 +101,6 @@ class CarInterface(CarInterfaceBase): ret = self.CS.update(self.cp, self.cp_cam, self.cp_body) - ret.events = self.create_common_events(ret).to_msg() - return ret @staticmethod diff --git a/selfdrive/car/tesla/interface.py b/selfdrive/car/tesla/interface.py index deb0e00230..5681f4c4a5 100755 --- a/selfdrive/car/tesla/interface.py +++ b/selfdrive/car/tesla/interface.py @@ -42,6 +42,4 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) - ret.events = self.create_common_events(ret).to_msg() - return ret diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 5e356bfd49..236ce104ab 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -8,7 +8,6 @@ from openpilot.selfdrive.car.disable_ecu import disable_ecu from openpilot.selfdrive.car.interfaces import CarInterfaceBase ButtonType = car.CarState.ButtonEvent.Type -EventName = car.CarEvent.EventName SteerControlType = car.CarParams.SteerControlType @@ -151,23 +150,4 @@ class CarInterface(CarInterfaceBase): if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR): ret.buttonEvents = create_button_events(self.CS.distance_button, self.CS.prev_distance_button, {1: ButtonType.gapAdjustCruise}) - # events - events = self.create_common_events(ret) - - if self.CP.openpilotLongitudinalControl: - if ret.cruiseState.standstill and not ret.brakePressed: - events.add(EventName.resumeRequired) - if self.CS.low_speed_lockout: - events.add(EventName.lowSpeedLockout) - if ret.vEgo < self.CP.minEnableSpeed: - events.add(EventName.belowEngageSpeed) - if c.actuators.accel > 0.3: - # some margin on the actuator to not false trigger cancellation while stopping - events.add(EventName.speedTooLow) - if ret.vEgo < 0.001: - # while in standstill, send a user alert - events.add(EventName.manualRestart) - - ret.events = events.to_msg() - return ret diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 77e56875bf..db6adfe212 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -2,10 +2,9 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import get_safety_config from openpilot.selfdrive.car.interfaces import CarInterfaceBase -from openpilot.selfdrive.car.volkswagen.values import CAR, CANBUS, CarControllerParams, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags +from openpilot.selfdrive.car.volkswagen.values import CAR, CANBUS, NetworkLocation, TransmissionType, VolkswagenFlags ButtonType = car.CarState.ButtonEvent.Type -EventName = car.CarEvent.EventName class CarInterface(CarInterfaceBase): @@ -104,28 +103,5 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam, self.cp_ext, self.CP.transmissionType) - events = self.create_common_events(ret, extra_gears=[GearShifter.eco, GearShifter.sport, GearShifter.manumatic], - pcm_enable=not self.CS.CP.openpilotLongitudinalControl, - enable_buttons=(ButtonType.setCruise, ButtonType.resumeCruise)) - - # Low speed steer alert hysteresis logic - if (self.CP.minSteerSpeed - 1e-3) > CarControllerParams.DEFAULT_MIN_STEER_SPEED and ret.vEgo < (self.CP.minSteerSpeed + 1.): - self.low_speed_alert = True - elif ret.vEgo > (self.CP.minSteerSpeed + 2.): - self.low_speed_alert = False - if self.low_speed_alert: - events.add(EventName.belowSteerSpeed) - - if self.CS.CP.openpilotLongitudinalControl: - if ret.vEgo < self.CP.minEnableSpeed + 0.5: - events.add(EventName.belowEngageSpeed) - if c.enabled and ret.vEgo < self.CP.minEnableSpeed: - events.add(EventName.speedTooLow) - - if self.CC.eps_timer_soft_disable_alert: - events.add(EventName.steerTimeLimit) - - ret.events = events.to_msg() - return ret