|
|
|
@ -331,18 +331,18 @@ class mavlink_object:
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
# 處理接收到的封包
|
|
|
|
# 處理接收到的封包
|
|
|
|
mavlinkMsg = self.mavlink_socket.recv_msg()
|
|
|
|
mavlinkMsg = self.mavlink_socket.recv_msg()
|
|
|
|
except Exception as e:
|
|
|
|
# except Exception as e:
|
|
|
|
logger.warning(f"Error in mavlink_object.process_data for id {self.socket_id}: {e}")
|
|
|
|
# logger.warning(f"Error in mavlink_object.process_data for id {self.socket_id}: {e}")
|
|
|
|
self.dirtyDataCount += 1
|
|
|
|
# self.dirtyDataCount += 1
|
|
|
|
|
|
|
|
|
|
|
|
if self.dirtyDataCount >= self.dirtyDataMax:
|
|
|
|
# if self.dirtyDataCount >= self.dirtyDataMax:
|
|
|
|
logger.error(f"Too many dirty data received in mavlink_object {self.socket_id}, entering ERROR state")
|
|
|
|
# logger.error(f"Too many dirty data received in mavlink_object {self.socket_id}, entering ERROR state")
|
|
|
|
self.state = MavlinkObjectState.ERROR
|
|
|
|
# self.state = MavlinkObjectState.ERROR
|
|
|
|
# 不直接退出,嘗試容忍髒數據
|
|
|
|
# # 不直接退出,嘗試容忍髒數據
|
|
|
|
await asyncio.sleep(0.01) # 短暫暫停
|
|
|
|
# await asyncio.sleep(0.01) # 短暫暫停
|
|
|
|
continue
|
|
|
|
# continue
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
# try:
|
|
|
|
if mavlinkMsg:
|
|
|
|
if mavlinkMsg:
|
|
|
|
# 統計收到的訊息 & 透過 mavlink 封包的序列號來檢查是否有遺失的封包 & 記錄最後收到的封包時間
|
|
|
|
# 統計收到的訊息 & 透過 mavlink 封包的序列號來檢查是否有遺失的封包 & 記錄最後收到的封包時間
|
|
|
|
sysid = mavlinkMsg.get_srcSystem()
|
|
|
|
sysid = mavlinkMsg.get_srcSystem()
|
|
|
|
@ -374,7 +374,7 @@ class mavlink_object:
|
|
|
|
logger.error(f"Error forwarding message to port {target_port}: {e}")
|
|
|
|
logger.error(f"Error forwarding message to port {target_port}: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
with self.outgoing_msg_lock:
|
|
|
|
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:
|
|
|
|
try:
|
|
|
|
self.mavlink_socket.write(send_msg)
|
|
|
|
self.mavlink_socket.write(send_msg)
|
|
|
|
except Exception as e:
|
|
|
|
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')
|
|
|
|
logger.info(f'mavlink_object.process_data for id {self.socket_id} was cancelled')
|
|
|
|
break
|
|
|
|
break
|
|
|
|
except Exception as e:
|
|
|
|
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過載
|
|
|
|
await asyncio.sleep(0.01) # 短暫暫停避免CPU過載
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -442,8 +449,8 @@ class mavlink_object:
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
# 使用鎖保護共享資源訪問
|
|
|
|
# 使用鎖保護共享資源訪問
|
|
|
|
with self.outgoing_messages_lock:
|
|
|
|
with self.outgoing_msgs_lock:
|
|
|
|
self.outgoing_messages.append(message_bytes)
|
|
|
|
self.outgoing_msgs.append(message_bytes)
|
|
|
|
return True
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(f"Error queueing message for mavlink_object {self.socket_id}: {e}")
|
|
|
|
logger.error(f"Error queueing message for mavlink_object {self.socket_id}: {e}")
|
|
|
|
|