python-seabreeze icon indicating copy to clipboard operation
python-seabreeze copied to clipboard

Inconsistent timeout behavior between USB and Ethernet backends

Open hperrey opened this issue 1 year ago • 1 comments

spectrometer and system information

  • model: HDX and QE65000
  • operating system: Rocky Linux 8.10
  • python version: 3.9.16
  • python-seabreeze version: 2.9.2
  • installed-via: conda

current problem

In a mixed-spectrometer setup, I noticed that while the Ethernet connection on the HDX would time out after O(10)s, the USB connection to the QE65000 would not. The relevant parts of the code are:

  • USB: https://github.com/ap--/python-seabreeze/blob/8090c59332213a3a1291bcfdf4d4c6ddf491ce88/src/seabreeze/pyseabreeze/transport.py#L233-L236
  • Ethernet: https://github.com/ap--/python-seabreeze/blob/8090c59332213a3a1291bcfdf4d4c6ddf491ce88/src/seabreeze/pyseabreeze/transport.py#L503-L509

The value for self._device.pyusb_device.default_timeout seems to be quite different from my (arbitrary) choice of 10000ms for the default socket timeout.. This is likely also related to #146

I can configure the timeout by calling spec._dev._raw_device.socket.settimeout(timeout_in_s) directly but was wondering whether there is a less awkward mechanism in seabreeze of setting that -- and if not, how one would best introduce one :)

Some more details on my user story: While 10s seems a reasonable default timeout for internal triggers, in my particular case, I am setting up hardware triggers which might only be generated after much longer time than 10s. So before the setup generates the first trigger, the HDX would have already raised a TimeoutError.

(From my short investigation into the state of the HDX after the timeout, I actually believe that the hardware is still stuck waiting for triggers and I am not sure at this point whether one can recover from the software side without either sending a trigger or resetting the hardware. But this is not what I wanted to raise in this issue.)

steps to reproduce

Using a USB connection:

In [1]: import seabreeze
   ...: from seabreeze.spectrometers import Spectrometer, SeaBreezeError
   ...: seabreeze.use("pyseabreeze")

In [2]: spec_usb = Spectrometer.from_serial_number("QEPB0123")

In [3]: spec_usb.trigger_mode(3)  # hw triggers

In [4]: spec_usb.intensities(0,0)  # this does not time out even after minutes

Using an Ethernet connection and the HDX:

In [1]: import seabreeze
   ...: from seabreeze.spectrometers import Spectrometer, SeaBreezeError
   ...: seabreeze.use("pyseabreeze", network_adapter="192.168.254.200")

In [2]: spec = Spectrometer.from_serial_number("HDX01234")

In [3]: spec.trigger_mode(1) # hw rising edge

In [4]: spec.intensities(0,0)  # this would time out after 20s

hperrey avatar Jul 25 '24 06:07 hperrey