import struct import time import pytest from hitl import simulator as simulator_mod GGA_SAMPLE = "$GNGGA,080112.000,3949.8105069,N,11616.6876082,E,4,44,0.42,48.502,M,-6.684,M,1.0,0409*73" def _build_control_frame(payload: bytes) -> bytes: header = b"\xAA\x55" frame_type = b"\x10" length = struct.pack(" bytes: if not self._read_buffer: return b"" size = min(size, len(self._read_buffer)) chunk = self._read_buffer[:size] del self._read_buffer[:size] return bytes(chunk) def readline(self) -> bytes: return b"" def inject(self, data: bytes): self._read_buffer.extend(data) def test_simulator_emits_sensor_frames(monkeypatch): monkeypatch.setattr(simulator_mod, "SerialEndpoint", FakeSerialEndpoint) config = simulator_mod.HitlConfig( uart2_port="SIM", uart5_port=None, origin_gga=GGA_SAMPLE, initial_enu=(0.0, 0.0, 0.0), ) sim = simulator_mod.HitlSimulator(config) received_controls: list[tuple[float, float]] = [] sim.on_control = lambda f, t: received_controls.append((f, t)) sim.start() time.sleep(0.25) frame = _build_control_frame(struct.pack("= 2 assert gpimu_count >= 10 assert received_controls, "控制帧未被解析" assert received_controls[-1][0] == pytest.approx(0.5, rel=0.1) assert received_controls[-1][1] == pytest.approx(0.2, rel=0.1)