fix: 8 button-state bugs + wire radar position into replay for map display

State machine fixes:
1. Raw IQ replay EOF now calls _stop_radar() to fully restore UI
2. Worker thread finished signal triggers UI recovery on crash/exit
3. _stop_radar() stops demo simulator to prevent cross-mode interference
4. _stop_demo() correctly identifies Mock mode via combo text
5. Demo start no longer clobbers status bar when acquisition is running
6. _stop_radar() resets playback button text, frame counter, file label
7. _start_raw_iq_replay() error path cleans up stale controller/worker
8. _refresh_gui() preserves Raw IQ paused status instead of overwriting

Map/location:
- RawIQReplayWorker now receives _radar_position (GPSData ref) so
  targets get real lat/lon projected from the virtual radar position
- Added heading control to Map tab sidebar (0-360 deg, wrapping)
- Manual lat/lon/heading changes in Map tab apply to replay targets

Ruff clean, 120/120 tests pass.
This commit is contained in:
Jason
2026-04-14 01:49:34 +05:45
parent 2cb56e8b13
commit a12ea90cdf
2 changed files with 69 additions and 10 deletions
+3
View File
@@ -272,6 +272,7 @@ class RawIQReplayWorker(QThread):
processor: RawIQFrameProcessor,
host_processor: RadarProcessor | None = None,
settings: RadarSettings | None = None,
gps_data_ref: GPSData | None = None,
parent=None,
):
super().__init__(parent)
@@ -279,6 +280,7 @@ class RawIQReplayWorker(QThread):
self._processor = processor
self._host_processor = host_processor
self._settings = settings or RadarSettings()
self._gps = gps_data_ref
self._running = False
self._frame_count = 0
self._error_count = 0
@@ -358,6 +360,7 @@ class RawIQReplayWorker(QThread):
frame,
self._settings.range_resolution,
self._settings.velocity_resolution,
gps=self._gps,
)
# Clustering + tracking