some fixes

This commit is contained in:
Ayzen
2026-06-04 18:33:38 +03:00
parent eacea436a4
commit 22942d9dc9
26 changed files with 1352 additions and 153 deletions
@@ -3,6 +3,7 @@
from __future__ import annotations
from collections.abc import Iterator, Sequence
from contextlib import suppress
from dataclasses import replace
from typing import Optional
import threading
@@ -46,12 +47,15 @@ class MultiDeviceVnaController:
self._is_closed = False
try:
# Register each device the moment it opens so a partial open (e.g. a
# slave that fails after the master is up) is fully released by close().
# Otherwise the master USB handle and its RX thread leak on every retry.
self._master_device = LibreVnaUsbBulkConnection(master_serial_number)
self._slave_devices = [
LibreVnaUsbBulkConnection(slave_serial_number)
for slave_serial_number in slave_serial_numbers
]
self._all_devices = [self._master_device, *self._slave_devices]
self._all_devices.append(self._master_device)
for slave_serial_number in slave_serial_numbers:
connection = LibreVnaUsbBulkConnection(slave_serial_number)
self._slave_devices.append(connection)
self._all_devices.append(connection)
except Exception:
self.close()
raise
@@ -65,14 +69,20 @@ class MultiDeviceVnaController:
self.close()
def close(self) -> None:
"""Stop sweeping and close every opened device transport."""
"""Stop sweeping and close every opened device transport.
Resilient to a half-open or already-broken controller: failing to idle or
close one device must not prevent the others from being released.
"""
if self._is_closed:
return
self._is_closed = True
self._send_idle_to_all_devices()
with suppress(Exception):
self._send_idle_to_all_devices()
for device_connection in self._all_devices:
device_connection.close()
with suppress(Exception):
device_connection.close()
def stop_continuous_sweep(self) -> None:
"""Stop the currently running sweep without closing device transports."""