44febe34b8
gui/qt_workers.py — one QueueWorker base replaces the per-device command queue + dispatch + signal boilerplate. The loop blocks on the queue instead of waking 10-20x/second forever (test_idle_worker_does_not_spin asserts an idle worker burns ~no CPU). PollingQueueWorker adds self-rescheduling polling: the next poll is queued only after the previous finishes, so a device slower than the interval can't accumulate a backlog (test_polling_never_overlaps_or_backs_up). Helios responsiveness — the concrete bug that motivated the above: a free running 1 s QTimer queued a status poll that took ~2 s, so the queue grew for as long as the panel stayed connected. - helios_laser._query reads until the CR terminator instead of sleeping a fixed 0.05 + 0.2 s per query - one _query_int() helper replaces five copies of parse-with-logging - polling is now driven by the worker; HeliosWindow's QTimer is gone - dropped __del__, which disabled the laser and wrote to the serial port from the garbage collector at an unpredictable time helios_test_app.py — the worker was moveToThread'd but every call site invoked its methods directly, so all serial I/O (including the sleeps) ran on the GUI thread; Query All froze the UI for ~2 s. Calls now go through a queued signal to a pyqtSlot. Also: connect/disconnect cycles leaked a QThread + worker + 9 connections each time; 16 copies of the not-connected guard collapse to _require_connection(); the Query Power button called a method that has never existed (AttributeError popup) and is now disabled and documented in KNOWN_ISSUES. DCBiasImageWidget preallocates its image and uses set_data/set_clim, so the live preview stops rebuilding the array and the whole artist tree per row (O(rows^2) over a scan). bbd20x: connect() now raises when no bays respond instead of reporting success on the wrong port; disconnect() joins with a timeout so a wedged reader can't hang shutdown; one _channel_for() helper replaces four copy-pasted axis mappings; hardcoded travel limits become TRAVEL_MM; the joke error strings are gone. gui/widgets.py adds the shared ConnectionBar / PortSelector / bounded LogConsole / StatusGrid for the test benches to adopt. 65 tests passing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
51 lines
2.4 KiB
Markdown
51 lines
2.4 KiB
Markdown
# Known issues requiring on-rig verification
|
|
|
|
Questions that cannot be answered from the code alone. Check these the next
|
|
time the hardware is available; each one gates a small code change.
|
|
|
|
## uC480 camera: gain/exposure during active capture
|
|
|
|
The driver used to carry an (unused) `_capture_paused` context manager whose
|
|
docstring claimed many IDS cameras return `IS_CANT_COMMUNICATE_WITH_DRIVER`
|
|
(17) or `IS_NO_SUCCESS` (-1) when gain/exposure commands are issued during
|
|
active capture. `set_exposure()` and `set_gain()` never used it, and the
|
|
helper was deleted in the Phase-1 cleanup.
|
|
|
|
**Bench check:** with live streaming running, move the exposure and gain
|
|
sliders in `camera_test_app.py` and watch the log for those error codes.
|
|
If they appear, the setters need a stop-live/apply/restart sequence
|
|
(re-create the helper around the two call sites in
|
|
[uc480_camera.py](hardware/uc480_camera.py)).
|
|
|
|
## Helios: no output-power query
|
|
|
|
`docs/hardware/HELIOS_DRIVER_README.md` documents `driver.get_power_mw()`,
|
|
but `HeliosLaser` has no such method and no output-power mnemonic appears
|
|
anywhere in this repo's protocol notes. `helios_test_app.py` called it
|
|
anyway and raised `AttributeError` into a popup; the button is now disabled
|
|
and the handler reports the gap instead.
|
|
|
|
**Bench check:** find the power-read command in the Helios manual (the
|
|
other reads are three-letter mnemonics like `LDO`, `LDS`, `LTA`). If one
|
|
exists, add `get_power_mw()` to `hardware/helios_laser.py` using
|
|
`_query_int`, then re-enable the button. If it doesn't, delete the Power
|
|
Monitoring group from the test app and fix the README.
|
|
|
|
## Genesis laser: forked protocol implementations disagree
|
|
|
|
`hardware/genesis_core.py` and the reference implementation
|
|
`tools/genesis_laser_gui.py` disagree on ADC command bytes, LDD enable
|
|
polarity, shutter semantics, filtering, and scaling. Do not modify either
|
|
until the checklist in [docs/genesis_verification.md](docs/genesis_verification.md)
|
|
has been run on the bench.
|
|
|
|
## `lib/ueye_loader.so` — still needed?
|
|
|
|
`lib/ueye_loader.c` is an `LD_PRELOAD` shim that dlopens
|
|
`/usr/lib/libueye_api.so` — yet nothing in the repo references it, and the
|
|
vendored SDK copy is `lib/libueye_api64.so.3.82` (a different file). On the
|
|
rig, check whether the camera apps run without the shim; if they do, delete
|
|
`lib/ueye_loader.{c,so}`. Either way, record in SETUP.md where
|
|
`libueye_api64.so.3.82` came from (IDS SDK version) and how the loader is
|
|
meant to be used.
|