LISHUZUOXUN_yangjiang/UWB/multi_uwb.py

142 lines
4.3 KiB
Python

# coding=gb2312
import json
import os.path
import random
from UWB.uwb_driver import *
this_dir = os.path.dirname(os.path.realpath(__file__))
UWB_ASSIGNMENT_FILE_PATH = os.path.join(this_dir, "uwb_id_assignment.json")
class MultiUWB:
def __init__(self) -> None:
super().__init__()
# 搜索uwb设备
self.uwb_driver_table = {}
self.uwb_gather_thread = {}
# 检查基站分配表是否存在
if os.path.exists(UWB_ASSIGNMENT_FILE_PATH):
with open(UWB_ASSIGNMENT_FILE_PATH, "r") as file:
uwb_assignment = json.load(file)
else:
uwb_assignment = [i for i in range(8)]
# 查找是否存在基站
for i in range(8):
uwb = UwbController()
if uwb.is_initialed():
anchor_id = uwb.anchor_id
self.uwb_driver_table[anchor_id] = uwb
if uwb_assignment:
seq = uwb_assignment.pop(0)
else:
seq = random.randint(0, 255)
uwb.set_anchor_config(anchor_seq=seq, anchor_no=seq)
# else:
# break
# uwb记录
self.record_log = []
# 信号
self.__running = threading.Event()
self.__running.set()
self.__get_data = threading.Event()
self.__get_data.clear()
"""************************************线程控制模块************************************"""
def start(self):
for anchor, unity in self.uwb_driver_table.items():
unity.start()
def pause(self):
for anchor, unity in self.uwb_driver_table.items():
unity.pause()
def resume(self):
for anchor, unity in self.uwb_driver_table.items():
unity.resume()
def stop(self):
for anchor, unity in self.uwb_driver_table.items():
unity.stop()
# 数据记录线程
def _record_threading(self, uwb: UwbController):
while self.__running.is_set():
# time.sleep(10000)
data = uwb.get_data()
if data:
# print(data)
self.record_log.append(data)
self.__get_data.set()
# 开始记录
def start_all_record(self):
self.__running.set()
for anchor, unity in self.uwb_driver_table.items():
unity.clear_all()
for _ in range(5):
if unity.set_anchor_status(MODE_POSITION):
time.sleep(0.3)
anchor_status = unity.get_anchor_status()
if anchor_status == MODE_POSITION:
break
threading.Thread(target=self._record_threading, args=(unity, )).start()
return True
# 清除所有记录
def clear_all_record(self):
for anchor, unity in self.uwb_driver_table.items():
unity.clear_all()
# 停止记录
def stop_all_record(self):
for anchor, unity in self.uwb_driver_table.items():
self.__running.clear()
for _ in range(10):
if unity.set_anchor_status(MODE_FREE):
break
time.sleep(0.1)
if unity.get_anchor_status() != MODE_FREE:
return False
unity.clear_all()
return True
# 获得数据
def get_data(self, timeout=0.1):
self.__get_data.wait(timeout=timeout)
if self.record_log:
data = self.record_log.pop(0)
return data
else:
self.__get_data.clear()
# 获得全部数据
def get_all_data(self):
data = self.record_log.copy()
self.record_log.clear()
return data
# 关闭手环
def close_tag(self, tag_id):
for uwb in self.uwb_driver_table.values():
uwb.close_tag(tag_id)
# 控制手环参数
def set_tag(self, tag_id, freq=None, alarm_status=None, detection_config=None):
for uwb in self.uwb_driver_table.values():
uwb.set_tag(tag_id, freq=freq, alarm_status=alarm_status, detection_config=detection_config)
# 关机模式:关闭周边所有的手环
def close_all_tag(self, ):
for uwb in self.uwb_driver_table.values():
uwb.close_all_tag()
# 关闭关机模式:停止关闭周边所有的手环
def stop_close_all_tag(self):
for uwb in self.uwb_driver_table.values():
uwb.stop_close_all_tag()