From 0b896870bafe958794e0384b6d63ea2becc51e56 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Tue, 2 Dec 2025 12:00:26 +0800 Subject: [PATCH] signal when host node is ready --- unilabos/app/ws_client.py | 16 ++++++++++++++++ unilabos/ros/nodes/presets/host_node.py | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/unilabos/app/ws_client.py b/unilabos/app/ws_client.py index 8f39275d..471868bc 100644 --- a/unilabos/app/ws_client.py +++ b/unilabos/app/ws_client.py @@ -1314,3 +1314,19 @@ class WebSocketClient(BaseCommunicationClient): logger.info(f"[WebSocketClient] Job {job_log} cancelled successfully") else: logger.warning(f"[WebSocketClient] Failed to cancel job {job_log}") + + def publish_host_ready(self) -> None: + """发布host_node ready信号""" + if self.is_disabled or not self.is_connected(): + logger.debug("[WebSocketClient] Not connected, cannot publish host ready signal") + return + + message = { + "action": "host_node_ready", + "data": { + "status": "ready", + "timestamp": time.time(), + }, + } + self.message_processor.send_message(message) + logger.info("[WebSocketClient] Host node ready signal published") diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index 2dba3422..1746bb11 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -289,6 +289,12 @@ class HostNode(BaseROS2DeviceNode): self.lab_logger().info("[Host Node] Host node initialized.") HostNode._ready_event.set() + # 发送host_node ready信号到所有桥接器 + for bridge in self.bridges: + if hasattr(bridge, "publish_host_ready"): + bridge.publish_host_ready() + self.lab_logger().debug(f"Host ready signal sent via {bridge.__class__.__name__}") + def _send_re_register(self, sclient): sclient.wait_for_service() request = SerialCommand.Request() @@ -794,6 +800,7 @@ class HostNode(BaseROS2DeviceNode): # 存储结果供 HTTP API 查询 try: from unilabos.app.web.controller import store_job_result + if goal_status == GoalStatus.STATUS_CANCELED: store_job_result(job_id, status, return_info, {}) else: