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,