|
|
|
|
@ -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():
|
|
|
|
|
|
|
|
|
|
# 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}")
|
|
|
|
|
|
|
|
|
|
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,25 +1628,30 @@ if __name__ == '__main__':
|
|
|
|
|
|
|
|
|
|
serial_id = 1
|
|
|
|
|
processor = sm.get_espv1_processor(serial_id)
|
|
|
|
|
if processor is not None:
|
|
|
|
|
# for x in range(10):
|
|
|
|
|
# processor.request_discovery()
|
|
|
|
|
# time.sleep(1)
|
|
|
|
|
# print(f"mark N{x}")
|
|
|
|
|
# processor.request_poll(target_system_id=1)
|
|
|
|
|
# processor.request_poll(target_system_id=1, grant_bytes=200)
|
|
|
|
|
print(processor.get_status_snapshot())
|
|
|
|
|
print(processor.get_gcs_queue_byte_count())
|
|
|
|
|
if processor is None:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# for x in range(10):
|
|
|
|
|
# processor.request_discovery()
|
|
|
|
|
# time.sleep(1)
|
|
|
|
|
# print(f"mark N{x}")
|
|
|
|
|
# processor.request_poll(target_system_id=1)
|
|
|
|
|
# processor.request_poll(target_system_id=1, grant_bytes=200)
|
|
|
|
|
print(processor.get_status_snapshot())
|
|
|
|
|
print(processor.get_gcs_queue_byte_count())
|
|
|
|
|
|
|
|
|
|
# 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)
|
|
|
|
|
# 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)
|
|
|
|
|
|