Skip to content

Commit

Permalink
AlertManager: reset duration when re-adding an event (commaai#33478)
Browse files Browse the repository at this point in the history
* fix alert duration when re-adding an alert before it's ended (personality)

* clean up

* messy test

* clean up test

* Revert "clean up test"

This reverts commit e7c0f80.

* better name

* debug

* Revert "debug"

This reverts commit da8d561.

* Reapply "clean up test"

This reverts commit a7dba54.

* update refs
  • Loading branch information
sshane authored Oct 4, 2024
1 parent 91e4978 commit cf50d4a
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 3 deletions.
6 changes: 5 additions & 1 deletion selfdrive/selfdrived/alertmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,13 @@ class AlertEntry:
alert: Alert | None = None
start_frame: int = -1
end_frame: int = -1
added_frame: int = -1

def active(self, frame: int) -> bool:
return frame <= self.end_frame

def just_added(self, frame: int) -> bool:
return self.active(frame) and frame == (self.added_frame + 1)

class AlertManager:
def __init__(self):
Expand All @@ -41,10 +44,11 @@ def add_many(self, frame: int, alerts: list[Alert]) -> None:
for alert in alerts:
entry = self.alerts[alert.alert_type]
entry.alert = alert
if not entry.active(frame):
if not entry.just_added(frame):
entry.start_frame = frame
min_end_frame = entry.start_frame + alert.duration
entry.end_frame = max(frame + 1, min_end_frame)
entry.added_frame = frame

def process_alerts(self, frame: int, clear_event_types: set):
ae = AlertEntry()
Expand Down
21 changes: 20 additions & 1 deletion selfdrive/selfdrived/tests/test_alertmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,27 @@ def test_duration(self):
for frame in range(duration+10):
if frame < add_duration:
AM.add_many(frame, [alert, ])
AM.process_alerts(frame, {})
AM.process_alerts(frame, set())

shown = AM.current_alert != EmptyAlert
should_show = frame <= show_duration
assert shown == should_show, f"{frame=} {add_duration=} {duration=}"

# check one case:
# - if alert is re-added to AM before it ends the duration is extended
if duration > 1:
AM = AlertManager()
show_duration = duration * 2
for frame in range(duration * 2 + 10):
if frame == 0:
AM.add_many(frame, [alert, ])

if frame == duration:
# add alert one frame before it ends
assert AM.current_alert == alert
AM.add_many(frame, [alert, ])
AM.process_alerts(frame, set())

shown = AM.current_alert != EmptyAlert
should_show = frame <= show_duration
assert shown == should_show, f"{frame=} {duration=}"
2 changes: 1 addition & 1 deletion selfdrive/test/process_replay/ref_commit
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bfbdd4706abcf5757790526d99d0000644017b1e
36bb37715542677db4a42464128ca10968f2c589

0 comments on commit cf50d4a

Please sign in to comment.