|
@@ -146,70 +146,15 @@ class AlarmPlanManager:
|
|
|
LOGERR(f"[CronScheduler] plan {plan.plan_uuid_} cron error: {e}")
|
|
|
time.sleep(5) # 每 30 秒检查一次
|
|
|
|
|
|
-# 分发器
|
|
|
-class EventDispatcher:
|
|
|
- def __init__(self):
|
|
|
- self.queues = {} # event_type -> Queue
|
|
|
- self.threads = {}
|
|
|
- self.running = False
|
|
|
-
|
|
|
- def start(self, handlers: dict):
|
|
|
- """handlers: {event_type: handler_func}"""
|
|
|
- self.running = True
|
|
|
- for event_type, handler in handlers.items():
|
|
|
- q = queue.Queue()
|
|
|
- self.queues[event_type] = q
|
|
|
-
|
|
|
- t = threading.Thread(target=self.worker, args=(event_type, q, handler), daemon=True)
|
|
|
- self.threads[event_type] = t
|
|
|
- t.start()
|
|
|
-
|
|
|
- def stop(self):
|
|
|
- self.running = False
|
|
|
-
|
|
|
- def dispatch(self, event_type: int, plan):
|
|
|
- if event_type in self.queues:
|
|
|
- self.queues[event_type].put(plan)
|
|
|
- else:
|
|
|
- LOGINFO(f"[Dispatcher] No queue for event_type={event_type}")
|
|
|
-
|
|
|
- def worker(self, event_type, q: queue.Queue, handler):
|
|
|
- while self.running:
|
|
|
- try:
|
|
|
- plan = q.get(timeout=1)
|
|
|
- handler(plan)
|
|
|
- except queue.Empty:
|
|
|
- continue
|
|
|
- except Exception as e:
|
|
|
- LOGERR(f"[Dispatcher] Error in event_type={event_type}: {e}")
|
|
|
-
|
|
|
|
|
|
def init_alarm_plan_mgr():
|
|
|
g_las.g_alarm_plan_mgr = AlarmPlanManager()
|
|
|
- g_las.g_event_dispatcher = EventDispatcher()
|
|
|
-
|
|
|
|
|
|
|
|
|
def start_alarm_plan_mgr():
|
|
|
g_las.g_alarm_plan_mgr.start_scheduler(interval=1)
|
|
|
|
|
|
|
|
|
-def start_event_dispatcher():
|
|
|
- # 注册事件处理函数
|
|
|
- handles = {
|
|
|
- EventType.STAY_DETECTION.value : AlarmPlan.handle_stay_detection,
|
|
|
- EventType.RETENTION_DETECTION.value : AlarmPlan.handle_retention_detection,
|
|
|
- EventType.TOILETING_DETECTION.value : AlarmPlan.handle_toileting_detection,
|
|
|
- EventType.TOILETING_FREQUENCY.value : AlarmPlan.handle_toileting_frequency,
|
|
|
- EventType.NIGHT_TOILETING_FREQUENCY.value : AlarmPlan.handle_night_toileting_frequency,
|
|
|
- EventType.TOILETING_FREQUENCY_ABNORMAL.value : AlarmPlan.handle_toileting_frequency_abnormal,
|
|
|
- EventType.NIGHT_TOILETING_FREQUENCY_ABNORMAL.value : AlarmPlan.handle_night_toileting_frequency_abnormal,
|
|
|
- EventType.BATHROOM_STAY_FREQUENCY.value : AlarmPlan.handle_bathroom_stay_frequency,
|
|
|
- EventType.TARGET_ABSENCE.value : AlarmPlan.handle_target_absence,
|
|
|
- }
|
|
|
- g_las.g_event_dispatcher.start(handles)
|
|
|
-
|
|
|
-
|
|
|
# 将region字典转换为xy平面的rect [left, top, width, height]
|
|
|
def region_to_rect(region: dict) -> list:
|
|
|
x_start, x_stop = region["x_cm_start"], region["x_cm_stop"]
|