w
CI for csaxs_bec / test (pull_request) Failing after 1m25s
CI for csaxs_bec / test (push) Failing after 1m30s

This commit is contained in:
2026-01-26 09:49:19 +01:00
parent 3122b2d93d
commit 30ec9f15aa
+18 -45
View File
@@ -68,46 +68,40 @@ class GalilRIOController(Controller):
class GalilRIOSignalRO(GalilSignalRO):
"""
Read-only Signal for reading a single analog input channel from the Galil RIO controller.
If the last reading of the controller is less than 0.5 seconds old, the cached value is returned.
It always read all 8 analog channels at once, and updates the reabacks of all channels.
Further reads within 0.5 seconds return the last readback value without querying the controller again.
"""
_NUM_ANALOG_CHANNELS = 8
_READ_TIMEOUT = 0.5 # seconds
def __init__(self, signal_name: str, channel: int, parent: GalilRIO, **kwargs):
super().__init__(signal_name, parent=parent, **kwargs)
self._channel = channel
self._metadata["connected"] = False
self._last_readback = self.parent._last_readback
self.last_readback = self.parent.last_readback
def _socket_get(self) -> float:
"""Get command for the readback signal"""
cmd = "MG@" + ",@".join([f"AN[{ii}]" for ii in range(self._NUM_ANALOG_CHANNELS)])
# old_val = self._readback
# cmd = f"MG@AN[{self._channel}]"
ret = self.controller.socket_put_and_receive(cmd)
# timestamp = time.time()
# self._metadata["timestamp"] = timestamp
values = [float(val) for val in ret.strip().split(" ")]
# This updates all channels' readbacks, including self._readback
self._update_all_channels(values)
return self._readback
# new_val = float(ret.strip().split(" ")[0])
# self._run_subs(
# sub_type=self.SUB_VALUE, old_value=old_val, value=new_val, timestamp=timestamp
# )
# return float(ret.strip().split(" ")[0])
def get(self):
"""Get current analog channel values from the Galil RIO controller."""
if time.monotonic() - self.parent._last_readback < 0.5:
return self._readback
self._readback = self._socket_get()
# If the last readback has happend more than 0.5 seconds ago, read all channels again
if time.monotonic() - self.last_readback > self._READ_TIMEOUT:
self._readback = self._socket_get()
return self._readback
# pylint: disable=protected-access
def _update_all_channels(self, values: list[float]) -> None:
"""
Update all analog channels an_ch0 to an_ch7 from receiving the readback update on a signal.
Update all analog channel readbacks based on the provided list of values.
List of values must be in order from an_ch0 to an_ch7.
Args:
values (list[float]): List of 8 float values corresponding to the analog channels.
@@ -121,10 +115,9 @@ class GalilRIOSignalRO(GalilSignalRO):
old_val = walk.item._readback
new_val = values[idx]
walk.item._metadata["timestamp"] = timestamp
walk.item.timestamp = timestamp
walk.item._readback = new_val
# NOTE: Update parent's last readback before running subscriptions!!
self.parent._last_readback = time.monotonic()
self.parent.last_readback = time.monotonic()
walk.item._run_subs(
sub_type=walk.item.SUB_VALUE,
old_value=old_val,
@@ -134,7 +127,10 @@ class GalilRIOSignalRO(GalilSignalRO):
class GalilRIO(PSIDeviceBase):
"""Base integration for the Galil RIO card in BEC."""
"""
Galil RIO controller integration with 8 analog input channels. To implement the device,
please provide the appropriate host and port (default port is 23).
"""
SUB_CONNECTION_CHANGE = "connection_change"
@@ -149,6 +145,7 @@ class GalilRIO(PSIDeviceBase):
def __init__(
self,
*,
name: str,
host: str,
device_manager: DeviceManagerDS,
@@ -162,7 +159,7 @@ class GalilRIO(PSIDeviceBase):
self.controller = GalilRIOController(
socket_cls=socket_cls, socket_host=host, socket_port=port, device_manager=device_manager
)
self._last_readback: float = time.monotonic()
self.last_readback: float = time.monotonic()
super().__init__(name=name, device_manager=device_manager, scan_info=scan_info, **kwargs)
self.controller.subscribe(
self._update_connection_state, event_type=self.SUB_CONNECTION_CHANGE
@@ -174,37 +171,13 @@ class GalilRIO(PSIDeviceBase):
def destroy(self) -> None:
"""Make sure to turn off the controller socket on destroy."""
self.controller.off()
self.controller.off(update_config=False)
return super().destroy()
def _update_connection_state(self, **kwargs):
for walk in self.walk_signals():
walk.item._metadata["connected"] = self.controller.connected
# def read(self):
# """Read all 8 analog input channels from the Galil RIO controller."""
# if time.monotonic() - self._last_readback < 0.5:
# # Get number of channels
# channels: list[tuple[int, str]] = []
# res = {}
# # This yields tuples of cpt, signal
# for walk in self.walk_signals():
# if isinstance(walk.item, GalilRIOSignalRO):
# # pylint: disable=protected-access
# channels.append((walk.item._channel, walk.item.name))
# # Read all channels in one command
# cmd = "MG@" + ",@".join([f"AN[{ii}]" for ii, _ in channels])
# logger.info(f"Reading Galil RIO channels with command: {cmd}")
# ret = self.controller.socket_put_and_receive(cmd)
# timestamp = time.time()
# values = [float(val) for val in ret.strip().split(" ")]
# for val, (_, signal_name) in zip(values, channels):
# res[signal_name] = {"value": val, "timestamp": timestamp}
# return res
if __name__ == "__main__":
host = "129.129.98.64"