mirror of
https://github.com/NawfalMotii79/PLFM_RADAR.git
synced 2026-05-14 03:42:00 +00:00
fix(gui): P-1 — RadarDataWorker __init__ initialises runtime attrs
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).
This commit is contained in:
@@ -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
|
||||
# =============================================================================
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user