feat: add settle time and timeout signals to EpicsMotor and SimPositioner

This commit is contained in:
2026-05-06 15:03:38 +02:00
parent 5ce61f5619
commit 0fc1983ae7
2 changed files with 67 additions and 1 deletions
+40 -1
View File
@@ -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
+27
View File
@@ -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."""