alarm_plan_dispatcher.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import queue
  2. import threading
  3. from common.sys_comm import LOGDBG, LOGINFO, LOGWARN, LOGERR
  4. from core.alarm_plan import AlarmPlan
  5. from core.event_type import EventType
  6. from core.alarm_plan_manager import AlarmPlanManager
  7. import core.g_LAS as g_las
  8. # 分发器
  9. class AlarmPlanDispatcher:
  10. def __init__(self):
  11. self.queues = {} # event_type -> Queue
  12. self.threads = {}
  13. self.running = False
  14. def start(self, handlers: dict):
  15. """handlers: {event_type: handler_func}"""
  16. self.running = True
  17. for event_type, handler in handlers.items():
  18. q = queue.Queue()
  19. self.queues[event_type] = q
  20. t = threading.Thread(target=self.worker, args=(event_type, q, handler), daemon=True)
  21. self.threads[event_type] = t
  22. t.start()
  23. def stop(self):
  24. self.running = False
  25. def dispatch(self, event_type: int, plan):
  26. if event_type in self.queues:
  27. self.queues[event_type].put(plan)
  28. else:
  29. LOGINFO(f"[Dispatcher] No queue for event_type={event_type}")
  30. def worker(self, event_type, q: queue.Queue, handler):
  31. while self.running:
  32. try:
  33. plan = q.get(timeout=1)
  34. handler(plan)
  35. except queue.Empty:
  36. continue
  37. except Exception as e:
  38. LOGERR(f"[Dispatcher] Error in event_type={event_type}: {e}")
  39. def init_alarm_plan_disp():
  40. g_las.g_alarm_plan_disp = AlarmPlanDispatcher()
  41. def start_alarm_plan_dispatcher():
  42. # 注册事件处理函数
  43. handles = {
  44. EventType.STAY_DETECTION.value : AlarmPlan.handle_stay_detection,
  45. EventType.RETENTION_DETECTION.value : AlarmPlan.handle_retention_detection,
  46. EventType.TOILETING_DETECTION.value : AlarmPlan.handle_toileting_detection,
  47. EventType.TOILETING_FREQUENCY.value : AlarmPlan.handle_toileting_frequency,
  48. EventType.NIGHT_TOILETING_FREQUENCY.value : AlarmPlan.handle_night_toileting_frequency,
  49. EventType.TOILETING_FREQUENCY_ABNORMAL.value : AlarmPlan.handle_toileting_frequency_abnormal,
  50. EventType.NIGHT_TOILETING_FREQUENCY_ABNORMAL.value : AlarmPlan.handle_night_toileting_frequency_abnormal,
  51. EventType.BATHROOM_STAY_FREQUENCY.value : AlarmPlan.handle_bathroom_stay_frequency,
  52. EventType.TARGET_ABSENCE.value : AlarmPlan.handle_target_absence,
  53. }
  54. g_las.g_alarm_plan_disp.start(handles)