|
@@ -30,6 +30,7 @@ class SmartShooter(metaclass=SingletonType):
|
|
|
self.callback_listen = None
|
|
self.callback_listen = None
|
|
|
self.listen_init = None
|
|
self.listen_init = None
|
|
|
self.websocket = None
|
|
self.websocket = None
|
|
|
|
|
+ # self.main_loop = None
|
|
|
|
|
|
|
|
def __send_tcp_message(self, socket, msg):
|
|
def __send_tcp_message(self, socket, msg):
|
|
|
# await asyncio.sleep(0.01)
|
|
# await asyncio.sleep(0.01)
|
|
@@ -393,13 +394,13 @@ class SmartShooter(metaclass=SingletonType):
|
|
|
await asyncio.sleep(delay)
|
|
await asyncio.sleep(delay)
|
|
|
# 对焦混用
|
|
# 对焦混用
|
|
|
if is_af:
|
|
if is_af:
|
|
|
- self.EnableCameraPreview(enable_status=True, msg_type=msg_type)
|
|
|
|
|
|
|
+ await self.EnableCameraPreview(enable_status=True, msg_type=msg_type)
|
|
|
start_time = time.time()
|
|
start_time = time.time()
|
|
|
await self.CameraAutofocus()
|
|
await self.CameraAutofocus()
|
|
|
end_time = time.time()
|
|
end_time = time.time()
|
|
|
elapsed_time = end_time - start_time
|
|
elapsed_time = end_time - start_time
|
|
|
logger.info(f"自动对焦耗时 {elapsed_time:.4f} 秒")
|
|
logger.info(f"自动对焦耗时 {elapsed_time:.4f} 秒")
|
|
|
- self.EnableCameraPreview(enable_status=False, msg_type=msg_type)
|
|
|
|
|
|
|
+ await self.EnableCameraPreview(enable_status=False, msg_type=msg_type)
|
|
|
self.msg_type = msg_type
|
|
self.msg_type = msg_type
|
|
|
print("camera_states", msg_type)
|
|
print("camera_states", msg_type)
|
|
|
"""
|
|
"""
|
|
@@ -496,68 +497,48 @@ class SmartShooter(metaclass=SingletonType):
|
|
|
pass
|
|
pass
|
|
|
|
|
|
|
|
def connect_listen(self):
|
|
def connect_listen(self):
|
|
|
- print("smart shooter connect_listen", self.connect_status, self.listen_init)
|
|
|
|
|
|
|
+ print("smart shooter connect_listen START")
|
|
|
if self.connect_status == True or self.listen_init == True:
|
|
if self.connect_status == True or self.listen_init == True:
|
|
|
return True
|
|
return True
|
|
|
- # 发起监听
|
|
|
|
|
|
|
+
|
|
|
sub_socket, context = self.__create_listen()
|
|
sub_socket, context = self.__create_listen()
|
|
|
print("构建监听", self.connect_status)
|
|
print("构建监听", self.connect_status)
|
|
|
- logger.info("构建监听,%s", self.connect_status)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ # 不再需要 self.listen_loop,我们只使用主循环
|
|
|
|
|
+
|
|
|
try:
|
|
try:
|
|
|
- # 尝试获取当前线程的事件循环
|
|
|
|
|
- try:
|
|
|
|
|
- self.listen_loop = asyncio.get_running_loop()
|
|
|
|
|
- except RuntimeError:
|
|
|
|
|
- self.listen_loop = asyncio.new_event_loop()
|
|
|
|
|
- except RuntimeError:
|
|
|
|
|
- # 如果当前线程没有事件循环,则创建一个新的
|
|
|
|
|
- self.listen_loop = asyncio.new_event_loop()
|
|
|
|
|
- asyncio.set_event_loop(self.listen_loop)
|
|
|
|
|
- while True:
|
|
|
|
|
- self.listen_init = True
|
|
|
|
|
- if self.callback_listen == None:
|
|
|
|
|
- continue
|
|
|
|
|
- try:
|
|
|
|
|
- # 创建任务并立即运行,设置超时以避免阻塞
|
|
|
|
|
- # future = asyncio.ensure_future(self.asyncMessageListen())
|
|
|
|
|
- # 运行任务,但设置超时以避免无限等待
|
|
|
|
|
- # 使用一致的事件循环运行异步任务
|
|
|
|
|
- # asyncio.run(self.asyncMessageListen())
|
|
|
|
|
- # 运行任务,但设置超时以避免无限等待
|
|
|
|
|
- self.listen_loop.run_until_complete(self.asyncMessageListen())
|
|
|
|
|
- except asyncio.TimeoutError:
|
|
|
|
|
- # 超时是正常的,表示没有消息需要处理
|
|
|
|
|
- pass
|
|
|
|
|
- except Exception as e:
|
|
|
|
|
- # 处理其他可能的异常
|
|
|
|
|
- print(f"Error handling async message-asyncMessageListen: {e}")
|
|
|
|
|
- # camera_states, camera_msg = await self.GetCameraInfo(is_send=False)
|
|
|
|
|
- # if not camera_states:
|
|
|
|
|
- # print("相机未连接回调打印", camera_states, camera_msg)
|
|
|
|
|
- # await asyncio.sleep(0.01) # 等待相机连接
|
|
|
|
|
- # continue
|
|
|
|
|
- if self.stop_listen:
|
|
|
|
|
- break
|
|
|
|
|
- try:
|
|
|
|
|
- self.connect_status = True
|
|
|
|
|
- raw = sub_socket.recv()
|
|
|
|
|
- str_msg = raw.decode("utf-8")
|
|
|
|
|
- json_msg = json.loads(str_msg)
|
|
|
|
|
- if json_msg["msg_id"] == "NetworkPing":
|
|
|
|
|
|
|
+ while True:
|
|
|
|
|
+ self.listen_init = True
|
|
|
|
|
+
|
|
|
|
|
+ if self.stop_listen:
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ # 1. 阻塞接收 ZMQ 消息 (这是唯一的阻塞点,但在子线程,所以没问题)
|
|
|
|
|
+ try:
|
|
|
|
|
+ raw = sub_socket.recv() # 这里会阻塞直到有消息或超时
|
|
|
|
|
+ str_msg = raw.decode("utf-8")
|
|
|
|
|
+ json_msg = json.loads(str_msg)
|
|
|
|
|
+
|
|
|
|
|
+ if json_msg.get("msg_id") == "NetworkPing":
|
|
|
|
|
+ continue
|
|
|
|
|
+
|
|
|
|
|
+ # 2. 将回调提交到【主事件循环】
|
|
|
|
|
+ if hasattr(self, 'main_loop') and self.main_loop:
|
|
|
|
|
+ # 非阻塞提交,立即返回
|
|
|
|
|
+ asyncio.run_coroutine_threadsafe(self.callback_listen(json_msg), self.main_loop)
|
|
|
|
|
+ else:
|
|
|
|
|
+ print("Error: main_loop not set in SmartShooter")
|
|
|
|
|
+
|
|
|
|
|
+ except zmq.Again:
|
|
|
|
|
+ # 超时,继续循环
|
|
|
continue
|
|
continue
|
|
|
- # self.callback_listen(json_msg)
|
|
|
|
|
- asyncio.run(self.callback_listen(json_msg))
|
|
|
|
|
- except zmq.Again:
|
|
|
|
|
- # print("接收超时,继续监听...")
|
|
|
|
|
- # logger.info("接收超时,继续监听...")
|
|
|
|
|
- continue
|
|
|
|
|
- except Exception as e:
|
|
|
|
|
- self.connect_status = False
|
|
|
|
|
- print(f"发生错误: {e}")
|
|
|
|
|
- break
|
|
|
|
|
- self.listen_init = False
|
|
|
|
|
- self.connect_status = False
|
|
|
|
|
- self.stop_listen = False
|
|
|
|
|
- sub_socket.close()
|
|
|
|
|
- context.term()
|
|
|
|
|
- print("smart shooter连接断开")
|
|
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ print(f"ZMQ Error: {e}")
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ finally:
|
|
|
|
|
+ self.listen_init = False
|
|
|
|
|
+ self.connect_status = False
|
|
|
|
|
+ sub_socket.close()
|
|
|
|
|
+ context.term()
|
|
|
|
|
+ print("smart shooter连接断开")
|