diff --git a/ophyd_devices/devices/psi_motor.py b/ophyd_devices/devices/psi_motor.py index c9afecf..be61a48 100644 --- a/ophyd_devices/devices/psi_motor.py +++ b/ophyd_devices/devices/psi_motor.py @@ -10,12 +10,13 @@ import functools import numpy as np from ophyd import Component as Cpt from ophyd import EpicsMotor as OphydEpicsMotor -from ophyd import EpicsSignal, EpicsSignalRO, Kind +from ophyd import EpicsSignal, EpicsSignalRO, Kind, Signal from ophyd.status import MoveStatus from ophyd.utils.epics_pvs import AlarmSeverity, fmt_time from ophyd.utils.errors import UnknownStatusFailure from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase +from ophyd_devices.sim.sim_signals import SetableSignal class SpmgStates: @@ -87,6 +88,44 @@ class EpicsMotor(OphydEpicsMotor): high_limit_travel = Cpt(EpicsSignalWithCheck, ".HLM", kind=Kind.omitted, auto_monitor=True) low_limit_travel = Cpt(EpicsSignalWithCheck, ".LLM", kind=Kind.omitted, auto_monitor=True) + settle_time = Cpt( + Signal, value=0, kind=Kind.config, doc="Settle time after move completion in seconds" + ) + timeout = Cpt(Signal, kind=Kind.config, doc="Timeout for move completion in seconds.") + + def __init__( + self, + prefix="", + *, + name, + kind=None, + read_attrs=None, + configuration_attrs=None, + parent=None, + **kwargs, + ): + super().__init__( + prefix=prefix, + name=name, + kind=kind, + read_attrs=read_attrs, + configuration_attrs=configuration_attrs, + parent=parent, + **kwargs, + ) + self.settle_time.subscribe(self._on_settle_time_change, run=False) + self.timeout.subscribe(self._on_timeout_change, run=False) + + def _on_settle_time_change(self, value, **kwargs): + if value <= 0: + value = None # interpret non-positive values as no settle time + self._settle_time = value + + def _on_timeout_change(self, value, **kwargs): + if value <= 0: + value = None # interpret non-positive values as no timeout + self._timeout = value + def _check_motion_status(self) -> tuple[bool, Exception | None]: """Check if the motion finished successfully""" success = True diff --git a/ophyd_devices/sim/sim_positioner.py b/ophyd_devices/sim/sim_positioner.py index 63e4a38..5a78122 100644 --- a/ophyd_devices/sim/sim_positioner.py +++ b/ophyd_devices/sim/sim_positioner.py @@ -61,6 +61,20 @@ class SimPositioner(Device, PositionerBase): low_limit_travel = Cpt(SetableSignal, value=0, kind=Kind.omitted) unused = Cpt(SetableSignal, value=1, kind=Kind.omitted) + settle_time = Cpt( + SetableSignal, + name="settle_time", + value=0, + kind=Kind.config, + doc="Settle time after move completion in seconds", + ) + timeout = Cpt( + SetableSignal, + name="timeout", + kind=Kind.config, + doc="Timeout for move completion in seconds.", + ) + SUB_READBACK = "readback" _default_sub = SUB_READBACK @@ -102,6 +116,19 @@ class SimPositioner(Device, PositionerBase): if self.sim_init: self.sim.set_init(self.sim_init) + self.settle_time.subscribe(self._on_settle_time_change, run=False) + self.timeout.subscribe(self._on_timeout_change, run=False) + + def _on_settle_time_change(self, value, **kwargs): + if value <= 0: + value = None # interpret non-positive values as no settle time + self._settle_time = value + + def _on_timeout_change(self, value, **kwargs): + if value <= 0: + value = None # interpret non-positive values as no timeout + self._timeout = value + @property def limits(self): """Return the limits of the simulated device."""