alarm_plan_dispatcher.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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(
  21. target=self.worker,
  22. args=(event_type, q, handler),
  23. daemon=True,
  24. name=f"APDispatcherThread-{event_type}")
  25. self.threads[event_type] = t
  26. t.start()
  27. def stop(self):
  28. self.running = False
  29. def dispatch(self, event_type: int, plan):
  30. if event_type in self.queues:
  31. self.queues[event_type].put(plan)
  32. else:
  33. LOGINFO(f"[Dispatcher] No queue for event_type={event_type}")
  34. def worker(self, event_type, q: queue.Queue, handler):
  35. while self.running:
  36. try:
  37. plan = q.get(timeout=1)
  38. handler(plan)
  39. except queue.Empty:
  40. continue
  41. except Exception as e:
  42. LOGERR(f"[Dispatcher] Error in event_type={event_type}: {e}")
  43. def init_alarm_plan_disp():
  44. g_las.g_alarm_plan_disp = AlarmPlanDispatcher()
  45. def start_alarm_plan_dispatcher():
  46. # 注册事件处理函数
  47. handles = {
  48. EventType.STAY_DETECTION.value : AlarmPlan.handle_stay_detection,
  49. EventType.RETENTION_DETECTION.value : AlarmPlan.handle_retention_detection,
  50. EventType.TOILETING_DETECTION.value : AlarmPlan.handle_toileting_detection,
  51. EventType.TOILETING_FREQUENCY.value : AlarmPlan.handle_toileting_frequency,
  52. EventType.NIGHT_TOILETING_FREQUENCY.value : AlarmPlan.handle_night_toileting_frequency,
  53. EventType.TOILETING_FREQUENCY_ABNORMAL.value : AlarmPlan.handle_toileting_frequency_abnormal,
  54. EventType.NIGHT_TOILETING_FREQUENCY_ABNORMAL.value : AlarmPlan.handle_night_toileting_frequency_abnormal,
  55. EventType.BATHROOM_STAY_FREQUENCY.value : AlarmPlan.handle_bathroom_stay_frequency,
  56. EventType.TARGET_ABSENCE.value : AlarmPlan.handle_target_absence,
  57. EventType.CLEAN_EXPIRE_EVENTS.value : AlarmPlan.handle_clear_expire_events
  58. }
  59. g_las.g_alarm_plan_disp.start(handles)