Skip to content

Commit 8b53f91

Browse files
Rename DM alerts to numbered stages (#37783)
* Rename DM alerts to numbered stages * Handle renamed DM events in replay migration * Remove replay migration test * Skip unknown replay event names
1 parent 21538e5 commit 8b53f91

6 files changed

Lines changed: 64 additions & 52 deletions

File tree

cereal/log.capnp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ struct OnroadEvent @0xc4fa6047f024e718 {
6868
longitudinalManeuver @30;
6969
steerTempUnavailableSilent @31;
7070
resumeRequired @32;
71-
preDriverDistracted @33;
72-
promptDriverDistracted @34;
73-
driverDistracted @35;
74-
preDriverUnresponsive @36;
75-
promptDriverUnresponsive @37;
76-
driverUnresponsive @38;
71+
driverDistracted1 @33;
72+
driverDistracted2 @34;
73+
driverDistracted3 @35;
74+
driverUnresponsive1 @36;
75+
driverUnresponsive2 @37;
76+
driverUnresponsive3 @38;
7777
belowSteerSpeed @39;
7878
lowBattery @40;
7979
accFaulted @41;

selfdrive/debug/cycle_alerts.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ def cycle_alerts(duration=200, is_metric=False):
3030
(EventName.accFaulted, ET.IMMEDIATE_DISABLE),
3131

3232
# DM sequence
33-
(EventName.preDriverDistracted, ET.WARNING),
34-
(EventName.promptDriverDistracted, ET.WARNING),
35-
(EventName.driverDistracted, ET.WARNING),
33+
(EventName.driverDistracted1, ET.WARNING),
34+
(EventName.driverDistracted2, ET.WARNING),
35+
(EventName.driverDistracted3, ET.WARNING),
3636
]
3737

3838
# debug alerts

selfdrive/monitoring/helpers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -377,16 +377,16 @@ def _update_events(self, driver_engaged, op_engaged, standstill, wrong_gear, car
377377
alert = None
378378
if self.awareness <= 0.:
379379
# terminal red alert: disengagement required
380-
alert = EventName.driverDistracted if self.active_monitoring_mode else EventName.driverUnresponsive
380+
alert = EventName.driverDistracted3 if self.active_monitoring_mode else EventName.driverUnresponsive3
381381
self.terminal_time += 1
382382
if awareness_prev > 0.:
383383
self.terminal_alert_cnt += 1
384384
elif self.awareness <= self.threshold_prompt:
385385
# prompt orange alert
386-
alert = EventName.promptDriverDistracted if self.active_monitoring_mode else EventName.promptDriverUnresponsive
386+
alert = EventName.driverDistracted2 if self.active_monitoring_mode else EventName.driverUnresponsive2
387387
elif self.awareness <= self.threshold_pre:
388388
# pre green alert
389-
alert = EventName.preDriverDistracted if self.active_monitoring_mode else EventName.preDriverUnresponsive
389+
alert = EventName.driverDistracted1 if self.active_monitoring_mode else EventName.driverUnresponsive1
390390

391391
if alert is not None:
392392
self.current_events.add(alert)

selfdrive/monitoring/test_monitoring.py

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,11 @@ def test_fully_distracted_driver(self):
7575
assert len(events[int((d_status.settings._DISTRACTED_TIME-d_status.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL)/2/DT_DMON)]) == 0
7676
assert events[int((d_status.settings._DISTRACTED_TIME-d_status.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL + \
7777
((d_status.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL-d_status.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == \
78-
EventName.preDriverDistracted
78+
EventName.driverDistracted1
7979
assert events[int((d_status.settings._DISTRACTED_TIME-d_status.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL + \
80-
((d_status.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == EventName.promptDriverDistracted
80+
((d_status.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == EventName.driverDistracted2
8181
assert events[int((d_status.settings._DISTRACTED_TIME + \
82-
((TEST_TIMESPAN-10-d_status.settings._DISTRACTED_TIME)/2))/DT_DMON)].names[0] == EventName.driverDistracted
82+
((TEST_TIMESPAN-10-d_status.settings._DISTRACTED_TIME)/2))/DT_DMON)].names[0] == EventName.driverDistracted3
8383
assert isinstance(d_status.awareness, float)
8484

8585
# engaged, no face detected the whole time, no action
@@ -88,11 +88,11 @@ def test_fully_invisible_driver(self):
8888
assert len(events[int((d_status.settings._AWARENESS_TIME-d_status.settings._AWARENESS_PRE_TIME_TILL_TERMINAL)/2/DT_DMON)]) == 0
8989
assert events[int((d_status.settings._AWARENESS_TIME-d_status.settings._AWARENESS_PRE_TIME_TILL_TERMINAL + \
9090
((d_status.settings._AWARENESS_PRE_TIME_TILL_TERMINAL-d_status.settings._AWARENESS_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == \
91-
EventName.preDriverUnresponsive
91+
EventName.driverUnresponsive1
9292
assert events[int((d_status.settings._AWARENESS_TIME-d_status.settings._AWARENESS_PROMPT_TIME_TILL_TERMINAL + \
93-
((d_status.settings._AWARENESS_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == EventName.promptDriverUnresponsive
93+
((d_status.settings._AWARENESS_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == EventName.driverUnresponsive2
9494
assert events[int((d_status.settings._AWARENESS_TIME + \
95-
((TEST_TIMESPAN-10-d_status.settings._AWARENESS_TIME)/2))/DT_DMON)].names[0] == EventName.driverUnresponsive
95+
((TEST_TIMESPAN-10-d_status.settings._AWARENESS_TIME)/2))/DT_DMON)].names[0] == EventName.driverUnresponsive3
9696

9797
# engaged, down to orange, driver pays attention, back to normal; then down to orange, driver touches wheel
9898
# - should have short orange recovery time and no green afterwards; wheel touch only recovers when paying attention
@@ -105,10 +105,10 @@ def test_normal_driver(self):
105105
[car_interaction_DETECTED] * (int(TEST_TIMESPAN/DT_DMON)-int(DISTRACTED_SECONDS_TO_ORANGE*3/DT_DMON))
106106
events, _ = self._run_seq(ds_vector, interaction_vector, always_true, always_false)
107107
assert len(events[int(DISTRACTED_SECONDS_TO_ORANGE*0.5/DT_DMON)]) == 0
108-
assert events[int((DISTRACTED_SECONDS_TO_ORANGE-0.1)/DT_DMON)].names[0] == EventName.promptDriverDistracted
108+
assert events[int((DISTRACTED_SECONDS_TO_ORANGE-0.1)/DT_DMON)].names[0] == EventName.driverDistracted2
109109
assert len(events[int(DISTRACTED_SECONDS_TO_ORANGE*1.5/DT_DMON)]) == 0
110-
assert events[int((DISTRACTED_SECONDS_TO_ORANGE*3-0.1)/DT_DMON)].names[0] == EventName.promptDriverDistracted
111-
assert events[int((DISTRACTED_SECONDS_TO_ORANGE*3+0.1)/DT_DMON)].names[0] == EventName.promptDriverDistracted
110+
assert events[int((DISTRACTED_SECONDS_TO_ORANGE*3-0.1)/DT_DMON)].names[0] == EventName.driverDistracted2
111+
assert events[int((DISTRACTED_SECONDS_TO_ORANGE*3+0.1)/DT_DMON)].names[0] == EventName.driverDistracted2
112112
assert len(events[int((DISTRACTED_SECONDS_TO_ORANGE*3+2.5)/DT_DMON)]) == 0
113113

114114
# engaged, down to orange, driver dodges camera, then comes back still distracted, down to red, \
@@ -128,9 +128,9 @@ def test_biggest_comma_fan(self):
128128
op_vector[int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+2.5)/DT_DMON):int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+3)/DT_DMON)] \
129129
= [False] * int(0.5/DT_DMON)
130130
events, _ = self._run_seq(ds_vector, interaction_vector, op_vector, always_false)
131-
assert events[int((DISTRACTED_SECONDS_TO_ORANGE+0.5*_invisible_time)/DT_DMON)].names[0] == EventName.promptDriverDistracted
132-
assert events[int((DISTRACTED_SECONDS_TO_RED+1.5*_invisible_time)/DT_DMON)].names[0] == EventName.driverDistracted
133-
assert events[int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+1.5)/DT_DMON)].names[0] == EventName.driverDistracted
131+
assert events[int((DISTRACTED_SECONDS_TO_ORANGE+0.5*_invisible_time)/DT_DMON)].names[0] == EventName.driverDistracted2
132+
assert events[int((DISTRACTED_SECONDS_TO_RED+1.5*_invisible_time)/DT_DMON)].names[0] == EventName.driverDistracted3
133+
assert events[int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+1.5)/DT_DMON)].names[0] == EventName.driverDistracted3
134134
assert len(events[int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+3.5)/DT_DMON)]) == 0
135135

136136
# engaged, invisible driver, down to orange, driver touches wheel; then down to orange again, driver appears
@@ -144,13 +144,13 @@ def test_sometimes_transparent_commuter(self):
144144
interaction_vector[int((INVISIBLE_SECONDS_TO_ORANGE)/DT_DMON):int((INVISIBLE_SECONDS_TO_ORANGE+1)/DT_DMON)] = [True] * int(1/DT_DMON)
145145
events, _ = self._run_seq(ds_vector, interaction_vector, 2*always_true, 2*always_false)
146146
assert len(events[int(INVISIBLE_SECONDS_TO_ORANGE*0.5/DT_DMON)]) == 0
147-
assert events[int((INVISIBLE_SECONDS_TO_ORANGE-0.1)/DT_DMON)].names[0] == EventName.promptDriverUnresponsive
147+
assert events[int((INVISIBLE_SECONDS_TO_ORANGE-0.1)/DT_DMON)].names[0] == EventName.driverUnresponsive2
148148
assert len(events[int((INVISIBLE_SECONDS_TO_ORANGE+0.1)/DT_DMON)]) == 0
149149
if _visible_time == 0.5:
150-
assert events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1-0.1)/DT_DMON)].names[0] == EventName.promptDriverUnresponsive
151-
assert events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1+0.1+_visible_time)/DT_DMON)].names[0] == EventName.preDriverUnresponsive
150+
assert events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1-0.1)/DT_DMON)].names[0] == EventName.driverUnresponsive2
151+
assert events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1+0.1+_visible_time)/DT_DMON)].names[0] == EventName.driverUnresponsive1
152152
elif _visible_time == 10:
153-
assert events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1-0.1)/DT_DMON)].names[0] == EventName.promptDriverUnresponsive
153+
assert events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1-0.1)/DT_DMON)].names[0] == EventName.driverUnresponsive2
154154
assert len(events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1+0.1+_visible_time)/DT_DMON)]) == 0
155155

156156
# engaged, invisible driver, down to red, driver appears and then touches wheel, then disengages/reengages
@@ -165,10 +165,10 @@ def test_last_second_responder(self):
165165
op_vector[int((INVISIBLE_SECONDS_TO_RED+_visible_time+1)/DT_DMON):int((INVISIBLE_SECONDS_TO_RED+_visible_time+0.5)/DT_DMON)] = [False] * int(0.5/DT_DMON)
166166
events, _ = self._run_seq(ds_vector, interaction_vector, op_vector, always_false)
167167
assert len(events[int(INVISIBLE_SECONDS_TO_ORANGE*0.5/DT_DMON)]) == 0
168-
assert events[int((INVISIBLE_SECONDS_TO_ORANGE-0.1)/DT_DMON)].names[0] == EventName.promptDriverUnresponsive
169-
assert events[int((INVISIBLE_SECONDS_TO_RED-0.1)/DT_DMON)].names[0] == EventName.driverUnresponsive
170-
assert events[int((INVISIBLE_SECONDS_TO_RED+0.5*_visible_time)/DT_DMON)].names[0] == EventName.driverUnresponsive
171-
assert events[int((INVISIBLE_SECONDS_TO_RED+_visible_time+0.5)/DT_DMON)].names[0] == EventName.driverUnresponsive
168+
assert events[int((INVISIBLE_SECONDS_TO_ORANGE-0.1)/DT_DMON)].names[0] == EventName.driverUnresponsive2
169+
assert events[int((INVISIBLE_SECONDS_TO_RED-0.1)/DT_DMON)].names[0] == EventName.driverUnresponsive3
170+
assert events[int((INVISIBLE_SECONDS_TO_RED+0.5*_visible_time)/DT_DMON)].names[0] == EventName.driverUnresponsive3
171+
assert events[int((INVISIBLE_SECONDS_TO_RED+_visible_time+0.5)/DT_DMON)].names[0] == EventName.driverUnresponsive3
172172
assert len(events[int((INVISIBLE_SECONDS_TO_RED+_visible_time+1+0.1)/DT_DMON)]) == 0
173173

174174
# disengaged, always distracted driver
@@ -186,8 +186,8 @@ def test_long_traffic_light_victim(self):
186186
events, d_status = self._run_seq(always_distracted, always_false, always_true, standstill_vector)
187187
assert len(events[int((_redlight_time-0.1)/DT_DMON)]) == 0
188188
_pre_to_prompt = d_status.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL - d_status.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL
189-
assert events[int((_redlight_time+0.5)/DT_DMON)].names[0] == EventName.preDriverDistracted
190-
assert events[int((_redlight_time+_pre_to_prompt+0.5)/DT_DMON)].names[0] == EventName.promptDriverDistracted
189+
assert events[int((_redlight_time+0.5)/DT_DMON)].names[0] == EventName.driverDistracted1
190+
assert events[int((_redlight_time+_pre_to_prompt+0.5)/DT_DMON)].names[0] == EventName.driverDistracted2
191191

192192
# engaged, distracted while moving, then car stops after reaching orange
193193
# - should reset timer to pre green at standstill
@@ -197,7 +197,7 @@ def test_distracted_then_stops(self):
197197
standstill_vector[int(_stop_time/DT_DMON):] = [True] * int((TEST_TIMESPAN-_stop_time)/DT_DMON)
198198
events, _ = self._run_seq(always_distracted, always_false, always_true, standstill_vector)
199199
# just before and briefly after stopping: orange alert; goes away quickly after stopped
200-
assert events[int((_stop_time+0.1)/DT_DMON)].names[0] == EventName.promptDriverDistracted
200+
assert events[int((_stop_time+0.1)/DT_DMON)].names[0] == EventName.driverDistracted2
201201
assert len(events[int((_stop_time+0.5)/DT_DMON)]) == 0
202202

203203
# engaged, model is somehow uncertain and driver is distracted
@@ -206,10 +206,9 @@ def test_somehow_indecisive_model(self):
206206
ds_vector = [msg_DISTRACTED_BUT_SOMEHOW_UNCERTAIN] * int(TEST_TIMESPAN/DT_DMON)
207207
interaction_vector = always_false[:]
208208
events, d_status = self._run_seq(ds_vector, interaction_vector, always_true, always_false)
209-
assert EventName.preDriverUnresponsive in \
209+
assert EventName.driverUnresponsive1 in \
210210
events[int((INVISIBLE_SECONDS_TO_ORANGE-1+DT_DMON*d_status.settings._HI_STD_FALLBACK_TIME-0.1)/DT_DMON)].names
211-
assert EventName.promptDriverUnresponsive in \
211+
assert EventName.driverUnresponsive2 in \
212212
events[int((INVISIBLE_SECONDS_TO_ORANGE-1+DT_DMON*d_status.settings._HI_STD_FALLBACK_TIME+0.1)/DT_DMON)].names
213-
assert EventName.driverUnresponsive in \
213+
assert EventName.driverUnresponsive3 in \
214214
events[int((INVISIBLE_SECONDS_TO_RED-1+DT_DMON*d_status.settings._HI_STD_FALLBACK_TIME+0.1)/DT_DMON)].names
215-

selfdrive/selfdrived/events.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -512,47 +512,47 @@ def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messagin
512512
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.prompt, 1.8),
513513
},
514514

515-
EventName.preDriverDistracted: {
515+
EventName.driverDistracted1: {
516516
ET.PERMANENT: Alert(
517517
"Pay Attention",
518518
"",
519519
AlertStatus.normal, AlertSize.small,
520520
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
521521
},
522522

523-
EventName.promptDriverDistracted: {
523+
EventName.driverDistracted2: {
524524
ET.PERMANENT: Alert(
525525
"Pay Attention",
526526
"Driver Distracted",
527527
AlertStatus.userPrompt, AlertSize.mid,
528528
Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1),
529529
},
530530

531-
EventName.driverDistracted: {
531+
EventName.driverDistracted3: {
532532
ET.PERMANENT: Alert(
533533
"DISENGAGE IMMEDIATELY",
534534
"Driver Distracted",
535535
AlertStatus.critical, AlertSize.full,
536536
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1),
537537
},
538538

539-
EventName.preDriverUnresponsive: {
539+
EventName.driverUnresponsive1: {
540540
ET.PERMANENT: Alert(
541541
"Touch Steering Wheel: No Face Detected",
542542
"",
543543
AlertStatus.normal, AlertSize.small,
544544
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .1),
545545
},
546546

547-
EventName.promptDriverUnresponsive: {
547+
EventName.driverUnresponsive2: {
548548
ET.PERMANENT: Alert(
549549
"Touch Steering Wheel",
550550
"Driver Unresponsive",
551551
AlertStatus.userPrompt, AlertSize.mid,
552552
Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1),
553553
},
554554

555-
EventName.driverUnresponsive: {
555+
EventName.driverUnresponsive3: {
556556
ET.PERMANENT: Alert(
557557
"DISENGAGE IMMEDIATELY",
558558
"Driver Unresponsive",
@@ -1032,14 +1032,14 @@ def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messagin
10321032

10331033
if HARDWARE.get_device_type() == 'mici':
10341034
EVENTS.update({
1035-
EventName.preDriverDistracted: {
1035+
EventName.driverDistracted1: {
10361036
ET.PERMANENT: Alert(
10371037
"Pay Attention",
10381038
"",
10391039
AlertStatus.normal, AlertSize.small,
10401040
Priority.LOW, VisualAlert.none, AudibleAlert.none, 2),
10411041
},
1042-
EventName.promptDriverDistracted: {
1042+
EventName.driverDistracted2: {
10431043
ET.PERMANENT: Alert(
10441044
"Pay Attention",
10451045
"Driver Distracted",

selfdrive/test/process_replay/migration.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,17 @@ def wrapper(*args, **kwargs):
9898
return decorator
9999

100100

101+
def migrate_onroad_event(event: capnp.lib.capnp._DynamicStructReader):
102+
event_dict = event.to_dict()
103+
try:
104+
return log.OnroadEvent(**event_dict)
105+
except capnp.lib.capnp.KjException as e:
106+
# Ignore legacy events the current schema no longer defines.
107+
if "enum has no such enumerant" in str(e):
108+
return None
109+
raise
110+
111+
101112
@migration(inputs=["longitudinalPlan", "carParams"])
102113
def migrate_longitudinalPlan(msgs):
103114
ops = []
@@ -456,12 +467,13 @@ def migrate_onroadEvents(msgs):
456467
for event in msg.onroadEventsDEPRECATED:
457468
try:
458469
if not str(event.name).endswith('DEPRECATED'):
459-
# dict converts name enum into string representation
460-
onroadEvents.append(log.OnroadEvent(**event.to_dict()))
470+
migrated_event = migrate_onroad_event(event)
471+
if migrated_event is not None:
472+
onroadEvents.append(migrated_event)
461473
except RuntimeError: # Member was null
462474
traceback.print_exc()
463475

464-
new_msg = messaging.new_message('onroadEvents', len(msg.onroadEventsDEPRECATED))
476+
new_msg = messaging.new_message('onroadEvents', len(onroadEvents))
465477
new_msg.valid = msg.valid
466478
new_msg.logMonoTime = msg.logMonoTime
467479
new_msg.onroadEvents = onroadEvents
@@ -479,8 +491,9 @@ def migrate_driverMonitoringState(msgs):
479491
for event in msg.driverMonitoringState.eventsDEPRECATED:
480492
try:
481493
if not str(event.name).endswith('DEPRECATED'):
482-
# dict converts name enum into string representation
483-
events.append(log.OnroadEvent(**event.to_dict()))
494+
migrated_event = migrate_onroad_event(event)
495+
if migrated_event is not None:
496+
events.append(migrated_event)
484497
except RuntimeError: # Member was null
485498
traceback.print_exc()
486499

0 commit comments

Comments
 (0)