From fcbf243aba40607b609d358ee429a2c6a449d02a Mon Sep 17 00:00:00 2001 From: Jason <83615043+JJassonn69@users.noreply.github.com> Date: Sat, 2 May 2026 16:08:24 +0545 Subject: [PATCH] =?UTF-8?q?fix(gui):=20P-1=20=E2=80=94=20RadarDataWorker?= =?UTF-8?q?=20=5F=5Finit=5F=5F=20initialises=20runtime=20attrs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audit P-1 (2026-05-02): _frame_queue, _acquisition, and frame counters were stranded inside set_waveform() due to indentation drift. The dashboard constructs RadarDataWorker and calls .start() directly without ever calling set_waveform, so live FT2232H acquisition crashes with AttributeError on first frame access in run(). Move the init block back into __init__; set_waveform now only sets self._waveform. Add TestRadarDataWorkerInit covering both: - attrs present after bare __init__ (no set_waveform required) - set_waveform does not reset runtime counters Test result: test_v7 102/102 PASS in radar_venv (was 100/100 + 2 new). --- 9_Firmware/9_3_GUI/test_v7.py | 31 +++++++++++++++++++++++++++++++ 9_Firmware/9_3_GUI/v7/workers.py | 6 +++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/9_Firmware/9_3_GUI/test_v7.py b/9_Firmware/9_3_GUI/test_v7.py index 9d36f8d..96cc70e 100644 --- a/9_Firmware/9_3_GUI/test_v7.py +++ b/9_Firmware/9_3_GUI/test_v7.py @@ -322,6 +322,37 @@ class TestHardwareReExports(unittest.TestCase): self.assertIsInstance(devs, list) +# ============================================================================= +# Test: v7.workers.RadarDataWorker initialization +# (Audit P-1: __init__ must populate _frame_queue/_acquisition/counters +# without requiring an explicit set_waveform call. Dashboard constructs +# the worker and calls .start() directly; missing init causes AttributeError +# on first frame in production.) +# ============================================================================= + +@unittest.skipUnless(_pyqt6_available(), "PyQt6 not installed") +class TestRadarDataWorkerInit(unittest.TestCase): + def test_init_sets_runtime_attrs(self): + from v7.workers import RadarDataWorker + worker = RadarDataWorker(connection=None) + self.assertIsNotNone(worker._frame_queue) + self.assertEqual(worker._frame_queue.maxsize, 4) + self.assertIsNone(worker._acquisition) + self.assertEqual(worker._frame_count, 0) + self.assertEqual(worker._byte_count, 0) + self.assertEqual(worker._error_count, 0) + self.assertFalse(worker._running) + + def test_set_waveform_does_not_reset_counters(self): + from v7.workers import RadarDataWorker + from v7.models import WaveformConfig + worker = RadarDataWorker(connection=None) + worker._frame_count = 7 + worker.set_waveform(WaveformConfig()) + self.assertEqual(worker._frame_count, 7, + "set_waveform must not reset runtime counters") + + # ============================================================================= # Test: v7.__init__ — clean exports # ============================================================================= diff --git a/9_Firmware/9_3_GUI/v7/workers.py b/9_Firmware/9_3_GUI/v7/workers.py index 8b82eac..812dd83 100644 --- a/9_Firmware/9_3_GUI/v7/workers.py +++ b/9_Firmware/9_3_GUI/v7/workers.py @@ -91,9 +91,6 @@ class RadarDataWorker(QThread): self._waveform = WaveformConfig() self._running = False - def set_waveform(self, wf) -> None: - self._waveform = wf - # Frame queue for production RadarAcquisition → this thread self._frame_queue: queue.Queue = queue.Queue(maxsize=4) @@ -105,6 +102,9 @@ class RadarDataWorker(QThread): self._byte_count = 0 self._error_count = 0 + def set_waveform(self, wf) -> None: + self._waveform = wf + def stop(self): self._running = False if self._acquisition: