fix: arbitrate display requests atomically

This commit is contained in:
way
2026-09-26 23:01:15 +08:00
parent 6fc428ef18
commit a84f4895ef
3 changed files with 18 additions and 6 deletions
+15 -3
View File
@@ -488,6 +488,7 @@ class DisplayController:
self.current_priority=0
self.current_rgb_mode="OFF"
self.owner_since=now
self.batch_depth=0
self.stop_event=threading.Event()
self.rgb_thread=threading.Thread(target=self._rgb_worker,name="rgb",daemon=True)
@@ -518,14 +519,23 @@ class DisplayController:
("priority","severity","rgb_mode","title","l2","l3","l4","metadata"))
if not changed: request["last_changed"]=current["last_changed"]
self.requests[request_id]=request
self._arbitrate_locked()
if self.batch_depth==0: self._arbitrate_locked()
def clear(self,request_id):
if request_id=="NORMAL_HOME": return
with self.lock:
if self.requests.pop(request_id,None) is not None:
log("INFO","ALERT_RECOVERED",alert=request_id)
self._arbitrate_locked()
if self.batch_depth==0: self._arbitrate_locked()
def begin_update(self):
with self.lock: self.batch_depth+=1
def end_update(self):
with self.lock:
if self.batch_depth<=0: raise RuntimeError("display update batch imbalance")
self.batch_depth-=1
if self.batch_depth==0: self._arbitrate_locked()
def _arbitrate_locked(self):
current=self.requests.get(self.current_owner_id)
@@ -654,7 +664,9 @@ try:
c,t,m,d=latest
display.update_home(c,t,m,d)
update_active_alerts(c,t,m,d,sample_elapsed)
display.begin_update()
try: update_active_alerts(c,t,m,d,sample_elapsed)
finally: display.end_update()
if now-last_render >= OLED_REFRESH:
display.refresh()
last_render=now