|
@@ -339,17 +339,19 @@ class AlarmPlan:
|
|
|
def get_stay_time(self, device: Device, t: int=1):
|
|
|
now = get_utc_time_s()
|
|
|
rtd_unit = self.find_latest_rtd_in_region(device, self.rect_, now, t)
|
|
|
+ if not rtd_unit:
|
|
|
+ return -1
|
|
|
+
|
|
|
with self.lock_:
|
|
|
- if rtd_unit:
|
|
|
- timestamp = rtd_unit["timestamp"]
|
|
|
- pose = rtd_unit["pose"]
|
|
|
- target_point = rtd_unit["target_point"]
|
|
|
+ timestamp = rtd_unit["timestamp"]
|
|
|
+ pose = rtd_unit["pose"]
|
|
|
+ target_point = rtd_unit["target_point"]
|
|
|
|
|
|
- if self.event_attr_.enter_ts_ == -1:
|
|
|
- self.event_attr_.enter_ts_ = timestamp
|
|
|
- LOGINFO(f"detected target enter, plan_uuid: {self.plan_uuid_}")
|
|
|
- else:
|
|
|
- self.event_attr_.leave_ts_ = timestamp
|
|
|
+ if self.event_attr_.enter_ts_ == -1:
|
|
|
+ self.event_attr_.enter_ts_ = timestamp
|
|
|
+ LOGINFO(f"detected target enter, plan_uuid: {self.plan_uuid_}")
|
|
|
+ else:
|
|
|
+ self.event_attr_.leave_ts_ = timestamp
|
|
|
|
|
|
if self.event_attr_.enter_ts_ == -1 or self.event_attr_.leave_ts_ == -1:
|
|
|
return -1
|
|
@@ -374,6 +376,43 @@ class AlarmPlan:
|
|
|
return 0
|
|
|
|
|
|
|
|
|
+ # 检查关键时间点, 获取消失时间
|
|
|
+ def get_absence_time(self, device: Device, t: int=1):
|
|
|
+ now = get_utc_time_s()
|
|
|
+ # 查找最新的落在检测区域的目标
|
|
|
+ rtd_unit = self.find_latest_rtd_in_region(device, self.rect_, now, 3)
|
|
|
+ if rtd_unit:
|
|
|
+ return -1
|
|
|
+ with self.lock_:
|
|
|
+ if self.event_attr_.leave_ts_ == -1:
|
|
|
+ self.event_attr_.leave_ts_ = now
|
|
|
+ LOGINFO(f"detected target leave, plan_uuid: {self.plan_uuid_}")
|
|
|
+ else:
|
|
|
+ self.event_attr_.enter_ts_ = now
|
|
|
+
|
|
|
+ if self.event_attr_.enter_ts_ == -1 or self.event_attr_.leave_ts_ == -1:
|
|
|
+ return -1
|
|
|
+
|
|
|
+ # 归并时间内,不认为事件结束
|
|
|
+ if now - self.event_attr_.enter_ts_ < self.merge_time_:
|
|
|
+ return -1
|
|
|
+
|
|
|
+ self.event_attr_.absence_time_ = self.event_attr_.enter_ts_ - self.event_attr_.leave_ts_
|
|
|
+ return self.event_attr_.absence_time_
|
|
|
+
|
|
|
+
|
|
|
+ # 检查消失时间
|
|
|
+ def check_absence_time(self, absence_time: int):
|
|
|
+ with self.lock_:
|
|
|
+ # 时间小于触发时间阈值,忽略并重置
|
|
|
+ if absence_time < self.event_attr_.time_threshold_:
|
|
|
+ self.event_attr_.reset()
|
|
|
+ LOGINFO(f"less than threshold_time, alarm_plan: {self.plan_uuid_}, event_type: {self.event_type_}")
|
|
|
+ return -1
|
|
|
+ LOGINFO(f"detected target enter, plan_uuid: {self.plan_uuid_}")
|
|
|
+ return 0
|
|
|
+
|
|
|
+
|
|
|
# 停留事件
|
|
|
def handle_stay_detection(self):
|
|
|
try:
|
|
@@ -733,37 +772,15 @@ class AlarmPlan:
|
|
|
device:Device = g_Dev.g_dev_mgr.find_dev_map(dev_id)
|
|
|
if not device:
|
|
|
return
|
|
|
- now = get_utc_time_s()
|
|
|
-
|
|
|
- threshold: int = self.event_attr_.time_threshold_
|
|
|
-
|
|
|
- # 查找最新的落在检测区域的目标
|
|
|
- rtd_unit = self.find_latest_rtd_in_region(device, self.rect_, now, 3)
|
|
|
- if rtd_unit:
|
|
|
- return
|
|
|
-
|
|
|
- timestamp = get_utc_time_s()
|
|
|
- if self.event_attr_.leave_ts_ == -1:
|
|
|
- self.event_attr_.leave_ts_ = timestamp
|
|
|
- LOGINFO(f"detected target leave, plan_uuid: {self.plan_uuid_}")
|
|
|
- else:
|
|
|
- self.event_attr_.enter_ts_ = timestamp
|
|
|
-
|
|
|
- if self.event_attr_.enter_ts_ == -1 or self.event_attr_.leave_ts_ == -1:
|
|
|
- return
|
|
|
|
|
|
- # 归并时间内,不认为事件结束
|
|
|
- if now - self.event_attr_.enter_ts_ < self.merge_time_:
|
|
|
+ # 获取消失时间
|
|
|
+ absence_time = self.get_absence_time(device)
|
|
|
+ if absence_time == -1:
|
|
|
return
|
|
|
|
|
|
- self.event_attr_.absence_time_ = self.event_attr_.enter_ts_ - self.event_attr_.leave_ts_
|
|
|
- absence_time = self.event_attr_.absence_time_
|
|
|
- # 时间小于触发时间阈值,忽略并重置
|
|
|
- if absence_time < threshold :
|
|
|
- self.event_attr_.reset()
|
|
|
- LOGINFO(f"less than threshold_time, alarm_plan: {self.plan_uuid_}, event_type: {self.event_type_}")
|
|
|
+ # 检查消失时间
|
|
|
+ if self.check_absence_time(absence_time) == -1:
|
|
|
return
|
|
|
- LOGINFO(f"detected target enter, plan_uuid: {self.plan_uuid_}")
|
|
|
|
|
|
# 构造事件
|
|
|
# 入库
|
|
@@ -807,7 +824,6 @@ class AlarmPlan:
|
|
|
LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
|
|
|
|
|
|
|
|
|
-
|
|
|
# 清理过期事件
|
|
|
def handle_clear_expire_events(self):
|
|
|
try:
|