mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-02 12:02:09 +08:00
AlertManager: reset duration when re-adding an event (#33478)
* 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 e7c0f80cb3d0061558920cf2baf37c6ea6935c81. * better name * debug * Revert "debug" This reverts commit da8d561445f0f0d142cec99c583dda798973544c. * Reapply "clean up test" This reverts commit a7dba540f78d1c32317e5f89e83de5aac1136c38. * update refs
This commit is contained in:
@@ -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):
|
||||
@@ -41,10 +44,11 @@ class AlertManager:
|
||||
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()
|
||||
|
||||
@@ -32,8 +32,27 @@ class TestAlertManager:
|
||||
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=}"
|
||||
|
||||
@@ -1 +1 @@
|
||||
bfbdd4706abcf5757790526d99d0000644017b1e
|
||||
36bb37715542677db4a42464128ca10968f2c589
|
||||
Reference in New Issue
Block a user