From 6cb91bbb272638de80ce66af291667b2694f5f71 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 16 Mar 2025 02:31:37 -0700 Subject: [PATCH 1/5] not sure if unintended consequences --- cereal/log.capnp | 1 + selfdrive/selfdrived/events.py | 4 ++++ selfdrive/selfdrived/selfdrived.py | 3 +++ 3 files changed, 8 insertions(+) diff --git a/cereal/log.capnp b/cereal/log.capnp index 7b6076311f..1228b4a907 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -58,6 +58,7 @@ struct OnroadEvent @0xc4fa6047f024e718 { controlsMismatch @22; pcmEnable @23; pcmDisable @24; + cancellingCruise @24; radarFault @25; radarTempUnavailable @93; brakeHold @26; diff --git a/selfdrive/selfdrived/events.py b/selfdrive/selfdrived/events.py index ee2c418b6e..c24e817dcb 100755 --- a/selfdrive/selfdrived/events.py +++ b/selfdrive/selfdrived/events.py @@ -646,6 +646,10 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), }, + EventName.cancellingCruise: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + }, + EventName.buttonCancel: { ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), ET.NO_ENTRY: NoEntryAlert("Cancel Pressed"), diff --git a/selfdrive/selfdrived/selfdrived.py b/selfdrive/selfdrived/selfdrived.py index c7320f9350..5333f5f584 100755 --- a/selfdrive/selfdrived/selfdrived.py +++ b/selfdrive/selfdrived/selfdrived.py @@ -158,6 +158,9 @@ class SelfdriveD: if self.CP.passive: return + if self.sm['carControl'].cruiseControl.cancel: + self.events.add(EventName.cancellingCruise) + # Block resume if cruise never previously enabled resume_pressed = any(be.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for be in CS.buttonEvents) if not self.CP.pcmCruise and CS.vCruise > 250 and resume_pressed: From 61876e6190542b2b99bc0a6e8f62c327d56b22ad Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 16 Mar 2025 02:31:57 -0700 Subject: [PATCH 2/5] fix --- cereal/log.capnp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal/log.capnp b/cereal/log.capnp index 1228b4a907..490b1ef5bf 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -58,7 +58,7 @@ struct OnroadEvent @0xc4fa6047f024e718 { controlsMismatch @22; pcmEnable @23; pcmDisable @24; - cancellingCruise @24; + cancellingCruise @94; radarFault @25; radarTempUnavailable @93; brakeHold @26; From 178a41256de5de2457cad89ff7a707b1c1c99c1e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 16 Mar 2025 02:35:06 -0700 Subject: [PATCH 3/5] copy controlsd --- selfdrive/selfdrived/selfdrived.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/selfdrived/selfdrived.py b/selfdrive/selfdrived/selfdrived.py index 5333f5f584..c221078ac0 100755 --- a/selfdrive/selfdrived/selfdrived.py +++ b/selfdrive/selfdrived/selfdrived.py @@ -158,7 +158,7 @@ class SelfdriveD: if self.CP.passive: return - if self.sm['carControl'].cruiseControl.cancel: + if CS.cruiseState.enabled and (not self.enabled or not self.CP.pcmCruise): self.events.add(EventName.cancellingCruise) # Block resume if cruise never previously enabled From a17bdde5235818cc7b50140c2725372557484f75 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 16 Mar 2025 02:35:24 -0700 Subject: [PATCH 4/5] probably don't care about pcmCruise --- selfdrive/selfdrived/selfdrived.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/selfdrived/selfdrived.py b/selfdrive/selfdrived/selfdrived.py index c221078ac0..8fe5815235 100755 --- a/selfdrive/selfdrived/selfdrived.py +++ b/selfdrive/selfdrived/selfdrived.py @@ -158,7 +158,7 @@ class SelfdriveD: if self.CP.passive: return - if CS.cruiseState.enabled and (not self.enabled or not self.CP.pcmCruise): + if CS.cruiseState.enabled and not self.enabled: self.events.add(EventName.cancellingCruise) # Block resume if cruise never previously enabled From 7c937ec8488083e797f34c22703d07d19ad7c167 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 16 Mar 2025 03:00:49 -0700 Subject: [PATCH 5/5] two solutions --- selfdrive/selfdrived/alertmanager.py | 16 ++++++++++++++++ selfdrive/selfdrived/events.py | 12 +++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/selfdrive/selfdrived/alertmanager.py b/selfdrive/selfdrived/alertmanager.py index ac1006ff25..312291e60c 100644 --- a/selfdrive/selfdrived/alertmanager.py +++ b/selfdrive/selfdrived/alertmanager.py @@ -39,6 +39,7 @@ class AlertManager: def __init__(self): self.alerts: dict[str, AlertEntry] = defaultdict(AlertEntry) self.current_alert = EmptyAlert + self.current_audible_alert = EmptyAlert def add_many(self, frame: int, alerts: list[Alert]) -> None: for alert in alerts: @@ -52,6 +53,7 @@ class AlertManager: def process_alerts(self, frame: int, clear_event_types: set): ae = AlertEntry() + ae_audible = AlertEntry() for v in self.alerts.values(): if not v.alert: continue @@ -63,5 +65,19 @@ class AlertManager: greater = ae.alert is None or (v.alert.priority, v.start_frame) > (ae.alert.priority, ae.start_frame) if v.active(frame) and greater: ae = v + ae_audible = v + + for v in self.alerts.values(): + if not v.alert: + continue + + if v.alert.event_type in clear_event_types: + v.end_frame = -1 + + # sort by priority first and then by start_frame + greater = ae_audible.alert is None or (v.alert.priority, v.start_frame) > (ae_audible.alert.priority, ae_audible.start_frame) + if v.active(frame) and v.alert.alert_size == AlertSize.none and greater: + ae_audible = v self.current_alert = ae.alert if ae.alert is not None else EmptyAlert + self.current_alert = ae_audible.alert if ae_audible.alert is not None else EmptyAlert diff --git a/selfdrive/selfdrived/events.py b/selfdrive/selfdrived/events.py index c24e817dcb..ee55263578 100755 --- a/selfdrive/selfdrived/events.py +++ b/selfdrive/selfdrived/events.py @@ -192,10 +192,11 @@ class NormalPermanentAlert(Alert): class StartupAlert(Alert): - def __init__(self, alert_text_1: str, alert_text_2: str = "Always keep hands on wheel and eyes on road", alert_status=AlertStatus.normal): + def __init__(self, alert_text_1: str, alert_text_2: str = "Always keep hands on wheel and eyes on road", alert_status=AlertStatus.normal, + audible_alert: car.CarControl.HUDControl.AudibleAlert = AudibleAlert.none): super().__init__(alert_text_1, alert_text_2, alert_status, AlertSize.mid, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, 5.), + Priority.LOWER, VisualAlert.none, audible_alert, 5.), # ********** helper functions ********** @@ -229,7 +230,12 @@ def startup_master_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM if "REPLAY" in os.environ: branch = "replay" - return StartupAlert("WARNING: This branch is not tested", branch, alert_status=AlertStatus.userPrompt) + # TODO: also need cb for other startup alerts + audible_alert = AudibleAlert.none + if CS.cruiseState.enabled: + audible_alert = AudibleAlert.disengage + + return StartupAlert("WARNING: This branch is not tested", branch, alert_status=AlertStatus.userPrompt, audible_alert=audible_alert) def below_engage_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: return NoEntryAlert(f"Drive above {get_display_speed(CP.minEnableSpeed, metric)} to engage")