Source code for ophyd_async.sim._stage
from bluesky.protocols import Reading
from ophyd_async.core import StandardReadable
from ophyd_async.sim._pattern_generator import PatternGenerator
from ._motor import SimMotor
[docs]
class SimStage(StandardReadable):
"""A simulated sample stage with X and Y movables."""
def __init__(self, pattern_generator: PatternGenerator, name="") -> None:
self.pattern_generator = pattern_generator
# Define some child Devices
with self.add_children_as_readables():
self.x = SimMotor(instant=False)
self.y = SimMotor(instant=False)
# Set name of device and child devices
super().__init__(name=name)
def _set_x_from_reading(self, readings: dict[str, Reading[float]]):
(x_reading,) = readings.values()
self.pattern_generator.set_x(x_reading["value"])
def _set_y_from_reading(self, readings: dict[str, Reading[float]]):
(y_reading,) = readings.values()
self.pattern_generator.set_y(y_reading["value"])
[docs]
def stage(self):
"""Stage the motors and report the position to the pattern generator."""
# Tell the pattern generator about the motor positions
self.x.user_readback.subscribe_reading(self._set_x_from_reading)
self.y.user_readback.subscribe_reading(self._set_y_from_reading)
return super().stage()
[docs]
def unstage(self):
"""Unstage the motors and remove the position subscription."""
self.x.user_readback.clear_sub(self._set_x_from_reading)
self.y.user_readback.clear_sub(self._set_y_from_reading)
return super().unstage()