From 74c03096b259c22f9cd993f340d906b0bed54075 Mon Sep 17 00:00:00 2001 From: Siyun Chen <134215502+ChenSiyun1234@users.noreply.github.com> Date: Sun, 21 Jun 2026 20:25:39 -0700 Subject: [PATCH] selfdrived: surface processNotRunning alert when not engaged --- openpilot/selfdrive/selfdrived/events.py | 1 + .../selfdrive/selfdrived/tests/test_alerts.py | 31 +++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/openpilot/selfdrive/selfdrived/events.py b/openpilot/selfdrive/selfdrived/events.py index cc841accaf6fc0..7b2058e98a4478 100755 --- a/openpilot/selfdrive/selfdrived/events.py +++ b/openpilot/selfdrive/selfdrived/events.py @@ -868,6 +868,7 @@ def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messagin # Thrown when manager detects a service exited unexpectedly while driving EventName.processNotRunning: { ET.NO_ENTRY: process_not_running_alert, + ET.PERMANENT: NormalPermanentAlert("Process Not Running", priority=Priority.LOW), ET.SOFT_DISABLE: soft_disable_alert("Process Not Running"), }, diff --git a/openpilot/selfdrive/selfdrived/tests/test_alerts.py b/openpilot/selfdrive/selfdrived/tests/test_alerts.py index 276de2a6a9e585..83fad7884458b5 100644 --- a/openpilot/selfdrive/selfdrived/tests/test_alerts.py +++ b/openpilot/selfdrive/selfdrived/tests/test_alerts.py @@ -9,11 +9,12 @@ from openpilot.cereal.messaging import SubMaster from openpilot.common.basedir import BASEDIR from openpilot.common.params import Params -from openpilot.selfdrive.selfdrived.events import Alert, EVENTS, ET -from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert +from openpilot.selfdrive.selfdrived.events import Alert, EVENTS, ET, Events +from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert, AlertManager from openpilot.selfdrive.test.process_replay.process_replay import CONFIGS AlertSize = log.SelfdriveState.AlertSize +EventName = log.OnroadEvent.EventName OFFROAD_ALERTS_PATH = os.path.join(BASEDIR, "openpilot/selfdrive/selfdrived/alerts_offroad.json") @@ -129,3 +130,29 @@ def test_offroad_alerts_extra_text(self): written_alert = params.get(a) assert "a"*i == written_alert['extra'] assert alert["text"] == written_alert['text'] + + # processNotRunning is a controls crash; when not engaged it should be shown over a + # downstream fault like steerUnavailable. https://github.com/commaai/openpilot/issues/34751 + def test_process_not_running_permanent_not_shadowed(self): + events = Events() + events.add(EventName.steerUnavailable) + events.add(EventName.processNotRunning) + callback_args = [self.CP, self.CS, self.sm, False, 100, log.LongitudinalPersonality.standard] + alerts = events.create_alerts([ET.PERMANENT], callback_args) + + am = AlertManager() + am.add_many(0, alerts) + am.process_alerts(0, set()) + assert am.current_alert.alert_text_1 == "Process Not Running" + + # ...but when engaged, the permanent alert must NOT mask the soft disable "take control" warning + def test_process_not_running_permanent_does_not_mask_soft_disable(self): + events = Events() + events.add(EventName.processNotRunning) + callback_args = [self.CP, self.CS, self.sm, False, 100, log.LongitudinalPersonality.standard] + alerts = events.create_alerts([ET.PERMANENT, ET.SOFT_DISABLE], callback_args) + + am = AlertManager() + am.add_many(0, alerts) + am.process_alerts(0, set()) + assert am.current_alert.alert_text_1 == "TAKE CONTROL IMMEDIATELY"