2024-05-21 23:53:47 +08:00
|
|
|
|
from enum import Enum
|
|
|
|
|
|
from loguru import logger
|
2024-05-22 18:50:21 +08:00
|
|
|
|
from utils import label_filter
|
|
|
|
|
|
from utils import tlabel
|
2024-05-21 23:53:47 +08:00
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
|
|
# 任务类
|
|
|
|
|
|
class task:
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def __init__(self, func_exec, func_find, enable=True):
|
2024-05-21 23:53:47 +08:00
|
|
|
|
self.enable = enable
|
2024-05-22 12:37:15 +08:00
|
|
|
|
self.func_exec = func_exec
|
|
|
|
|
|
self.func_find = func_find
|
|
|
|
|
|
def find(self):
|
|
|
|
|
|
# 检查该任执行标志
|
2024-05-21 23:53:47 +08:00
|
|
|
|
# TODO 完善该接口,是否需要单独为每种 task 编写一个函数,还是设置一个通用的过滤器(从 detection 模块过滤结果)
|
2024-05-22 12:37:15 +08:00
|
|
|
|
while self.func_find() is False:
|
|
|
|
|
|
pass
|
|
|
|
|
|
def exec(self):
|
2024-05-21 23:53:47 +08:00
|
|
|
|
# 根据标志位确定是否执行该任务
|
|
|
|
|
|
if self.enable is True:
|
2024-05-22 12:37:15 +08:00
|
|
|
|
logger.debug(f"[Task ]# Executing task")
|
|
|
|
|
|
self.func_exec()
|
|
|
|
|
|
logger.debug(f"[Task ]# Task completed")
|
2024-05-21 23:53:47 +08:00
|
|
|
|
else:
|
2024-05-22 12:37:15 +08:00
|
|
|
|
logger.warning(f"[Task ]# Skip task")
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|
|
|
|
|
|
# 任务队列状态类
|
|
|
|
|
|
class task_queuem_status(Enum):
|
|
|
|
|
|
IDEL = 0
|
|
|
|
|
|
SEARCHING = 1
|
|
|
|
|
|
EXECUTING = 2
|
|
|
|
|
|
|
|
|
|
|
|
# 任务队列类 非EXECUTEING 时均执行 huigui,注意互斥操作
|
|
|
|
|
|
class task_queuem(task):
|
|
|
|
|
|
# task_now = task(None, False)
|
|
|
|
|
|
def __init__(self, queue):
|
|
|
|
|
|
super(task_queuem, self)
|
|
|
|
|
|
self.queue = queue
|
|
|
|
|
|
self.status = task_queuem_status.IDEL
|
|
|
|
|
|
self.busy = True
|
2024-05-22 12:37:15 +08:00
|
|
|
|
logger.info(f"[TaskM]# Task num {self.queue.qsize()}")
|
2024-05-21 23:53:47 +08:00
|
|
|
|
def exec(self):
|
|
|
|
|
|
# 如果空闲状态则将下一个队列任务取出
|
|
|
|
|
|
if self.status is task_queuem_status.IDEL:
|
|
|
|
|
|
if self.queue.qsize() == 0:
|
|
|
|
|
|
self.busy = False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
logger.info(f"[TaskM]# Task queue empty, exit")
|
2024-05-21 23:53:47 +08:00
|
|
|
|
return False
|
|
|
|
|
|
self.task_now = self.queue.get()
|
|
|
|
|
|
|
|
|
|
|
|
# 如果当前任务没有使能,则直接转入执行状态,由任务执行函数打印未执行信息
|
|
|
|
|
|
if self.task_now.enable is True:
|
|
|
|
|
|
self.status = task_queuem_status.SEARCHING
|
|
|
|
|
|
else:
|
|
|
|
|
|
self.status = task_queuem_status.EXECUTING
|
|
|
|
|
|
|
2024-05-22 12:37:15 +08:00
|
|
|
|
logger.info(f"[TaskM]# ---------------------->>>>")
|
2024-05-21 23:53:47 +08:00
|
|
|
|
# 阻塞搜索任务标志位
|
|
|
|
|
|
elif self.status is task_queuem_status.SEARCHING:
|
2024-05-22 12:37:15 +08:00
|
|
|
|
logger.info(f"[TaskM]# Start searching task target")
|
|
|
|
|
|
self.task_now.find()
|
2024-05-21 23:53:47 +08:00
|
|
|
|
self.status = task_queuem_status.EXECUTING
|
|
|
|
|
|
# 执行任务函数
|
|
|
|
|
|
elif self.status is task_queuem_status.EXECUTING:
|
2024-05-22 12:37:15 +08:00
|
|
|
|
logger.info(f"[TaskM]# Start execute task function")
|
|
|
|
|
|
self.task_now.exec() # 执行当前任务函数
|
2024-05-21 23:53:47 +08:00
|
|
|
|
self.queue.task_done() # 弹出已执行的任务
|
|
|
|
|
|
self.status = task_queuem_status.IDEL #
|
2024-05-22 12:37:15 +08:00
|
|
|
|
logger.info(f"[TaskM]# <<<<----------------------")
|
2024-05-21 23:53:47 +08:00
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 人员施救
|
2024-05-22 12:37:15 +08:00
|
|
|
|
class get_block():
|
|
|
|
|
|
def find():
|
2024-05-22 18:50:21 +08:00
|
|
|
|
# 目标检测红/蓝方块
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.RBLOCK)
|
|
|
|
|
|
ret2, list2 = filter.get(tlabel.BBLOCK)
|
|
|
|
|
|
|
|
|
|
|
|
if (ret1 > 0) or (ret2 > 0):
|
|
|
|
|
|
logger.info("[TASK1]# find label")
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|
|
|
|
|
|
# 紧急转移
|
2024-05-22 12:37:15 +08:00
|
|
|
|
class put_block():
|
|
|
|
|
|
def find():
|
2024-05-22 18:50:21 +08:00
|
|
|
|
# 目标检测医院
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.HOSPITAL)
|
|
|
|
|
|
if ret1 > 0:
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|
|
|
|
|
|
# 整装上阵
|
2024-05-22 12:37:15 +08:00
|
|
|
|
class get_bball():
|
|
|
|
|
|
def find():
|
2024-05-22 18:50:21 +08:00
|
|
|
|
# 目标检测黄球
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.YBALL)
|
|
|
|
|
|
if ret1 > 0:
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|
|
|
|
|
|
# 通信抢修
|
2024-05-22 12:37:15 +08:00
|
|
|
|
class up_tower():
|
|
|
|
|
|
def find():
|
2024-05-22 18:50:21 +08:00
|
|
|
|
# 目标检测通信塔
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.YBALL)
|
|
|
|
|
|
if ret1 > 0:
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|
|
|
|
|
|
# 高空排险
|
2024-05-22 12:37:15 +08:00
|
|
|
|
class get_rball():
|
|
|
|
|
|
def find():
|
2024-05-22 18:50:21 +08:00
|
|
|
|
# 目标检测红球
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.RBALL)
|
|
|
|
|
|
if ret1 > 0:
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|
|
|
|
|
|
# 派发物资
|
2024-05-22 12:37:15 +08:00
|
|
|
|
class put_bball():
|
|
|
|
|
|
def find():
|
2024-05-22 18:50:21 +08:00
|
|
|
|
# 目标检测通信塔
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.BASKET)
|
|
|
|
|
|
if ret1 > 0:
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|
|
|
|
|
|
# 物资盘点
|
2024-05-22 18:50:21 +08:00
|
|
|
|
class put_hanoi1():
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def find():
|
2024-05-22 18:50:21 +08:00
|
|
|
|
# 目标检测左右转向标识
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.MARKL)
|
|
|
|
|
|
ret2, list2 = filter.get(tlabel.MARKR)
|
|
|
|
|
|
|
|
|
|
|
|
if (ret1 > 0) or (ret2 > 0):
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
|
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
class put_hanoi2():
|
|
|
|
|
|
def find():
|
|
|
|
|
|
# 目标检测左右转向标识
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.LPILLAR)
|
|
|
|
|
|
|
|
|
|
|
|
if ret1 > 0:
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|
|
|
|
|
|
# 应急避险
|
2024-05-22 12:37:15 +08:00
|
|
|
|
class move_area():
|
|
|
|
|
|
def find():
|
2024-05-22 18:50:21 +08:00
|
|
|
|
# 目标检测标志牌
|
|
|
|
|
|
# TODO 如何确保在都检测标志牌的情况下,和下一个任务进行区分
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.SIGN)
|
|
|
|
|
|
|
|
|
|
|
|
if ret1 > 0:
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|
|
|
|
|
|
# 扫黑除暴
|
2024-05-22 12:37:15 +08:00
|
|
|
|
class kick_ass():
|
|
|
|
|
|
def find():
|
2024-05-22 18:50:21 +08:00
|
|
|
|
# 目标检测标志牌
|
|
|
|
|
|
# TODO 如何确保在都检测标志牌的情况下,和上一个任务进行区分
|
|
|
|
|
|
filter = label_filter(None)
|
|
|
|
|
|
ret1, list1 = filter.get(tlabel.SIGN)
|
|
|
|
|
|
|
|
|
|
|
|
if ret1 > 0:
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
return False
|
2024-05-22 12:37:15 +08:00
|
|
|
|
def exec():
|
|
|
|
|
|
pass
|
2024-05-21 23:53:47 +08:00
|
|
|
|
|