From 79ead32e79a1702929b0dfed73d8612742cb557a Mon Sep 17 00:00:00 2001 From: gac-x01da Date: Fri, 9 May 2025 10:15:35 +0200 Subject: [PATCH] feat(nidaq): ensure nidaq is powered on during on_connected --- debye_bec/devices/nidaq/nidaq.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/debye_bec/devices/nidaq/nidaq.py b/debye_bec/devices/nidaq/nidaq.py index a09e7e4..1d3e022 100644 --- a/debye_bec/devices/nidaq/nidaq.py +++ b/debye_bec/devices/nidaq/nidaq.py @@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, Literal, cast from bec_lib.logger import bec_logger from ophyd import Component as Cpt from ophyd import Device, DeviceStatus, EpicsSignal, EpicsSignalRO, Kind, StatusBase +from ophyd.status import SubscriptionStatus, WaitTimeoutError from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase from ophyd_devices.sim.sim_signals import SetableSignal @@ -313,6 +314,8 @@ class NidaqControl(Device): readout_range = Cpt(EpicsSignal, suffix="NIDAQ-ReadoutRange", kind=Kind.config) encoder_type = Cpt(EpicsSignal, suffix="NIDAQ-EncoderType", kind=Kind.config) stop_call = Cpt(EpicsSignal, suffix="NIDAQ-Stop", kind=Kind.config) + power = Cpt(EpicsSignal, suffix="NIDAQ-Power", kind=Kind.config) + heartbeat = Cpt(EpicsSignal, suffix="NIDAQ-Heartbeat", kind=Kind.config, auto_monitor=True) ai_chans = Cpt(EpicsSignal, suffix="NIDAQ-AIChans", kind=Kind.config) ci_chans = Cpt(EpicsSignal, suffix="NIDAQ-CIChans6614", kind=Kind.config) @@ -472,6 +475,16 @@ class Nidaq(PSIDeviceBase, NidaqControl): Called after the device is connected and its signals are connected. Default values for signals should be set here. """ + def heartbeat_callback(*, old_value, value, **kwargs): + return ((old_value) == 0 and (value == 1)) or ((old_value) == 1 and (value == 0)) + status = SubscriptionStatus(self.heartbeat, callback=heartbeat_callback) + try: + status.wait(timeout=self.timeout_wait_for_signal) # Raises if timeout is reached + except WaitTimeoutError: + self.power.put(1) + + status.wait(timeout=self.timeout_wait_for_signal) + if not self.wait_for_condition( condition=lambda: self.state.get() == NidaqState.STANDBY, timeout=self.timeout_wait_for_signal,