# 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()