From 2c4fc4583ee7c99a86e46eebda39366dbadd0323 Mon Sep 17 00:00:00 2001 From: Chiyu Chen Date: Mon, 9 Jun 2025 18:34:13 +0800 Subject: [PATCH] =?UTF-8?q?Hotfix=20:=20mavlink=5Fobject=20=E5=85=A7=20pro?= =?UTF-8?q?cess=5Fdata=20=E7=9A=84=20try=20=E8=BF=B4=E5=9C=88=E5=88=AA?= =?UTF-8?q?=E6=B8=9B=20(try=20=E5=9A=B4=E9=87=8D=E5=BD=B1=E9=9F=BF?= =?UTF-8?q?=E6=95=88=E8=83=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fc_network_adapter/mavlinkObject.py | 33 +++++++++++-------- src/fc_network_adapter/tests/devRun.py | 6 ++-- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/fc_network_adapter/fc_network_adapter/mavlinkObject.py b/src/fc_network_adapter/fc_network_adapter/mavlinkObject.py index d0231ed..dadb58f 100644 --- a/src/fc_network_adapter/fc_network_adapter/mavlinkObject.py +++ b/src/fc_network_adapter/fc_network_adapter/mavlinkObject.py @@ -331,18 +331,18 @@ class mavlink_object: try: # 處理接收到的封包 mavlinkMsg = self.mavlink_socket.recv_msg() - except Exception as e: - logger.warning(f"Error in mavlink_object.process_data for id {self.socket_id}: {e}") - self.dirtyDataCount += 1 + # except Exception as e: + # logger.warning(f"Error in mavlink_object.process_data for id {self.socket_id}: {e}") + # self.dirtyDataCount += 1 - if self.dirtyDataCount >= self.dirtyDataMax: - logger.error(f"Too many dirty data received in mavlink_object {self.socket_id}, entering ERROR state") - self.state = MavlinkObjectState.ERROR - # 不直接退出,嘗試容忍髒數據 - await asyncio.sleep(0.01) # 短暫暫停 - continue + # if self.dirtyDataCount >= self.dirtyDataMax: + # logger.error(f"Too many dirty data received in mavlink_object {self.socket_id}, entering ERROR state") + # self.state = MavlinkObjectState.ERROR + # # 不直接退出,嘗試容忍髒數據 + # await asyncio.sleep(0.01) # 短暫暫停 + # continue - try: + # try: if mavlinkMsg: # 統計收到的訊息 & 透過 mavlink 封包的序列號來檢查是否有遺失的封包 & 記錄最後收到的封包時間 sysid = mavlinkMsg.get_srcSystem() @@ -374,7 +374,7 @@ class mavlink_object: logger.error(f"Error forwarding message to port {target_port}: {e}") with self.outgoing_msg_lock: - if self.outgoing_messages and (send_msg := self.outgoing_messages.pop(0)): + if self.outgoing_msgs and (send_msg := self.outgoing_msgs.pop(0)): try: self.mavlink_socket.write(send_msg) except Exception as e: @@ -387,6 +387,13 @@ class mavlink_object: logger.info(f'mavlink_object.process_data for id {self.socket_id} was cancelled') break except Exception as e: + logger.warning(f"Error in mavlink_object.process_data for id {self.socket_id}: {e}") + self.dirtyDataCount += 1 + + if self.dirtyDataCount >= self.dirtyDataMax: + logger.error(f"Too many dirty data received in mavlink_object {self.socket_id}, entering ERROR state") + self.state = MavlinkObjectState.ERROR + # 不直接退出,嘗試容忍髒數據 await asyncio.sleep(0.01) # 短暫暫停避免CPU過載 @@ -442,8 +449,8 @@ class mavlink_object: try: # 使用鎖保護共享資源訪問 - with self.outgoing_messages_lock: - self.outgoing_messages.append(message_bytes) + with self.outgoing_msgs_lock: + self.outgoing_msgs.append(message_bytes) return True except Exception as e: logger.error(f"Error queueing message for mavlink_object {self.socket_id}: {e}") diff --git a/src/fc_network_adapter/tests/devRun.py b/src/fc_network_adapter/tests/devRun.py index 0707b51..48f9e2b 100644 --- a/src/fc_network_adapter/tests/devRun.py +++ b/src/fc_network_adapter/tests/devRun.py @@ -18,8 +18,8 @@ from fc_network_adapter import mavlinkDevice as md # ====================== 分割線 ===================== -test_item = 21 -running_time = 30 +test_item = 12 +running_time = 10000 print('test_item : ', test_item) @@ -147,6 +147,8 @@ elif test_item == 12: manager.add_mavlink_object(mavlink_object_in1) manager.add_mavlink_object(mavlink_object_in2) + time.sleep(1) # 等待通道啟動 + mavlink_object_in1.add_target_socket(mavlink_object_out.socket_id) mavlink_object_out.add_target_socket(mavlink_object_in1.socket_id)