tmpConnit
This commit is contained in:
@@ -29,7 +29,7 @@ from .utils import acquireSerial, acquirePort
|
||||
from .utils.acquirePort import find_available_port
|
||||
|
||||
logger = setup_logger(os.path.basename(__file__))
|
||||
PROJECT_VER = "v1.20"
|
||||
PROJECT_VER = "v1.25"
|
||||
|
||||
class PanelState:
|
||||
def __init__(self):
|
||||
@@ -1696,4 +1696,8 @@ if __name__ == "__main__":
|
||||
2025.05.28
|
||||
1. 工程模式 新增 Node 重啟的功能
|
||||
|
||||
2026.08.05 (ver 1.25)
|
||||
1. 增加對於 esp32 連線模式的支援
|
||||
|
||||
|
||||
'''
|
||||
|
||||
@@ -277,11 +277,12 @@ class RFModule:
|
||||
self.status = RFStatus()
|
||||
self.socket_info = SocketInfo()
|
||||
|
||||
self.poll_data_times: deque[int] = deque([0] * N,maxlen=N) # ms
|
||||
self.poll_data_sizes: deque[int] = deque([0] * N, maxlen=N) # num
|
||||
self.poll_total_time = 0 # ms
|
||||
self.poll_total_size = 0 # num
|
||||
self.remain_bytes = 0 # num
|
||||
# # only for ESP32
|
||||
# self.poll_data_times: deque[int] = None
|
||||
# self.poll_data_sizes: deque[int] = None
|
||||
# self.poll_total_time = None
|
||||
# self.poll_total_size = None
|
||||
# self.remain_bytes = None
|
||||
|
||||
def update_avg_bandwidth(self, bandwidth: float, timestamp: Optional[float] = None) -> None:
|
||||
self.status.avg_bandwidth = bandwidth
|
||||
|
||||
@@ -102,12 +102,42 @@ class FrameProcessor(ABC):
|
||||
class RawFrameProcessor(FrameProcessor):
|
||||
"""原始數據直通處理器"""
|
||||
|
||||
def __init__(self):
|
||||
N = 10
|
||||
self.tx_interval_bytes: deque[int] = deque([0] * N,maxlen=N)
|
||||
self.tx_interval_rate: deque[float] = deque([0] * N,maxlen=N)
|
||||
self.tx_record_byte: int = 0
|
||||
self.tx_record_time = time.time()
|
||||
self.rx_interval_bytes: deque[int] = deque([0] * N, maxlen=N)
|
||||
self.rx_interval_rate: deque[float] = deque([0] * N,maxlen=N)
|
||||
self.rx_record_byte: int = 0
|
||||
self.rx_record_time = time.time()
|
||||
|
||||
def process_incoming(self, data: bytes) -> bytes:
|
||||
"""直接返回原始數據,不進行緩衝"""
|
||||
|
||||
interval = time.time() - self.tx_record_time
|
||||
if interval >= 1:
|
||||
self.tx_interval_bytes.append(self.tx_record_byte)
|
||||
self.tx_interval_rate.append(self.tx_record_byte/interval)
|
||||
self.tx_record_time = time.time()
|
||||
self.tx_record_byte = 0
|
||||
else:
|
||||
self.tx_record_byte += len(data)
|
||||
|
||||
return [data] if data else []
|
||||
|
||||
def process_outgoing(self, data: bytes) -> bytes:
|
||||
"""直接返回原始數據,不進行封裝"""
|
||||
interval = time.time() - self.rx_record_time
|
||||
if interval >= 1:
|
||||
self.rx_interval_bytes.append(self.rx_record_byte)
|
||||
self.tx_interval_rate.append(self.tx_record_byte/interval)
|
||||
self.rx_record_time = time.time()
|
||||
self.rx_record_byte = 0
|
||||
else:
|
||||
self.rx_record_byte += len(data)
|
||||
|
||||
return data
|
||||
|
||||
|
||||
@@ -300,7 +330,7 @@ class XBeeFrameProcessor_ESPv1(XBeeFrameProcessor_Base):
|
||||
|
||||
MAX_BYTES_PER_FLUSH = 150
|
||||
MAX_PAYLOAD_PER_FRAME = 80
|
||||
CHUNK_SEND_INTERVAL_SEC = 0.005
|
||||
CHUNK_SEND_INTERVAL_SEC = 0.020
|
||||
|
||||
|
||||
|
||||
@@ -316,6 +346,10 @@ class XBeeFrameProcessor_ESPv1(XBeeFrameProcessor_Base):
|
||||
self.received_len = 0 # 收到封包累計
|
||||
|
||||
self.poll_miss_count = 0 # poll 封包連續丟失的累計數
|
||||
self.esp_state = 1 # 紀錄每個 esp 連線狀態
|
||||
# 1 : 物件剛創建 剛接到 HELO 但是還沒有在 mavlinkVehicleView 建立物件
|
||||
# 2 : 已經擁有 mavlinkVehicleView 物件
|
||||
# 9 : 連續的 poll failure 視為斷線
|
||||
|
||||
def __init__(self, at_handler: "ATCommandHandler" = None):
|
||||
super().__init__(at_handler)
|
||||
@@ -586,17 +620,6 @@ class XBeeFrameProcessor_ESPv1(XBeeFrameProcessor_Base):
|
||||
system_id, sender_address_64, time.time()
|
||||
)
|
||||
|
||||
vehicle = vehicle_registry.get(system_id)
|
||||
if vehicle and not vehicle.rf_module:
|
||||
N = 10
|
||||
vehicle.rf_module = RFModule(RFModuleType.XBEE_ESP)
|
||||
vehicle.rf_module.poll_data_times: deque[int] = deque([0] * N,maxlen=N) # ms
|
||||
vehicle.rf_module.poll_data_sizes: deque[int] = deque([0] * N, maxlen=N) # num
|
||||
vehicle.rf_module.poll_total_time = 0 # ms
|
||||
vehicle.rf_module.poll_total_size = 0 # num
|
||||
vehicle.rf_module.remain_bytes = 0 # num
|
||||
logger.debug(f"mark A")
|
||||
|
||||
logger.debug(
|
||||
f"new HELO system_id={system_id}, address_64={sender_address_64.hex()}")
|
||||
else:
|
||||
@@ -818,17 +841,31 @@ class XBeeFrameProcessor_ESPv1(XBeeFrameProcessor_Base):
|
||||
|
||||
# 主要迴圈 Main Loop
|
||||
async def _operator_tick(self) -> None:
|
||||
# 1. 更新資訊
|
||||
# for src64, INFO in self.esp32_address_mapping.items():
|
||||
# vehicle = vehicle_registry.get(INFO.system_id)
|
||||
# if vehicle and vehicle.rf_module:
|
||||
# 1. 更新資訊 對於每個 ESP 裝置的資訊更新
|
||||
for src64, INFO in self.esp32_address_mapping.items():
|
||||
|
||||
vehicle = vehicle_registry.get(INFO.system_id)
|
||||
|
||||
# 初始化 mavlinkVehicleView
|
||||
if vehicle and INFO.esp_state == 1 :
|
||||
N = 10
|
||||
vehicle.rf_module = RFModule(RFModuleType.XBEE_ESP)
|
||||
vehicle.rf_module.poll_data_times: deque[int] = deque([0] * N,maxlen=N) # ms
|
||||
vehicle.rf_module.poll_data_sizes: deque[int] = deque([0] * N, maxlen=N) # num
|
||||
vehicle.rf_module.poll_total_time = 0 # ms
|
||||
vehicle.rf_module.poll_total_size = 0 # num
|
||||
vehicle.rf_module.remain_bytes = 0 # num
|
||||
vehicle.rf_module.rssi = 0 # db
|
||||
INFO.esp_state = 2
|
||||
|
||||
elif vehicle and INFO.esp_state == 2:
|
||||
|
||||
pass
|
||||
|
||||
# speed = vehicle.rf_module.poll_total_size / (vehicle.rf_module.poll_total_time + 1)
|
||||
|
||||
# logger.debug(f"now speed: {speed:.2f} / total_size: {vehicle.rf_module.poll_total_size}")
|
||||
|
||||
|
||||
|
||||
# 2. 移除沒反應 dongle
|
||||
self._prune_stale_devices()
|
||||
|
||||
@@ -1591,7 +1628,9 @@ if __name__ == '__main__':
|
||||
|
||||
serial_id = 1
|
||||
processor = sm.get_espv1_processor(serial_id)
|
||||
if processor is not None:
|
||||
if processor is None:
|
||||
return
|
||||
|
||||
# for x in range(10):
|
||||
# processor.request_discovery()
|
||||
# time.sleep(1)
|
||||
@@ -1603,14 +1642,17 @@ if __name__ == '__main__':
|
||||
|
||||
# rssi_request = ATRequest(command=b'DB', parameter=b'', frame_id=0xFE)
|
||||
# for i in range(3):
|
||||
# processor = sm.get_espv1_processor(serial_id)
|
||||
# if processor is not None:
|
||||
# deadline = time.time() + 5.0 # 最多等 5 秒,避免永遠卡住
|
||||
# while processor.operator_busy and time.time() < deadline:
|
||||
# time.sleep(0.01)
|
||||
# sm.send_at_command(1, rssi_request)
|
||||
# time.sleep(1)
|
||||
|
||||
for i in range(20):
|
||||
print(f"received: {processor.tx_interval_bytes}")
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
time.sleep(120)
|
||||
sm.remove_serial_link(serial_id)
|
||||
sm.shutdown()
|
||||
|
||||
Reference in New Issue
Block a user