Source code for ophyd_async.epics.pmac._pmac_io

from collections.abc import Sequence

import numpy as np

from ophyd_async.core import Array1D, Device, DeviceVector, StandardReadable
from ophyd_async.epics.core import epics_signal_r, epics_signal_rw

CS_LETTERS = "ABCUVWXYZ"


[docs] class PmacTrajectoryIO(StandardReadable): """Device that moves a PMAC Motor record.""" def __init__(self, prefix: str, name: str = "") -> None: self.time_array = epics_signal_rw( Array1D[np.float64], prefix + ":ProfileTimeArray" ) self.user_array = epics_signal_rw(Array1D[np.int32], prefix + ":UserArray") # 1 indexed CS axes so we can index into them from the compound motor input link self.positions = DeviceVector( { i + 1: epics_signal_rw( Array1D[np.float64], f"{prefix}:{letter}:Positions" ) for i, letter in enumerate(CS_LETTERS) } ) self.use_axis = DeviceVector( { i + 1: epics_signal_rw(bool, f"{prefix}:{letter}:UseAxis") for i, letter in enumerate(CS_LETTERS) } ) self.velocities = DeviceVector( { i + 1: epics_signal_rw( Array1D[np.float64], f"{prefix}:{letter}:Velocities" ) for i, letter in enumerate(CS_LETTERS) } ) self.points_to_build = epics_signal_rw(int, prefix + ":ProfilePointsToBuild") self.build_profile = epics_signal_rw(bool, prefix + ":ProfileBuild") self.execute_profile = epics_signal_rw(bool, prefix + ":ProfileExecute") self.scan_percent = epics_signal_r(float, prefix + ":TscanPercent_RBV") self.abort_profile = epics_signal_rw(bool, prefix + ":ProfileAbort") self.profile_cs_name = epics_signal_rw(str, prefix + ":ProfileCsName") self.calculate_velocities = epics_signal_rw(bool, prefix + ":ProfileCalcVel") super().__init__(name=name)
[docs] class PmacAxisIO(Device): """A Device that (direct) moves a PMAC Coordinate System Motor. Note that this does not go through a motor record. """ def __init__(self, prefix: str, name: str = "") -> None: self.cs_axis_letter = epics_signal_r(str, f"{prefix}:CsAxis_RBV") self.cs_port = epics_signal_r(str, f"{prefix}:CsPort_RBV") super().__init__(name=name)
[docs] class PmacCoordIO(Device): """A Device that represents a Pmac Coordinate System.""" def __init__(self, prefix: str, name: str = "") -> None: self.defer_moves = epics_signal_r(bool, f"{prefix}:DeferMoves") self.cs_axis_setpoint = DeviceVector( { i + 1: epics_signal_rw( Array1D[np.float64], f"{prefix}:M{i + 1}:DirectDemand" ) for i in range(len(CS_LETTERS)) } ) super().__init__(name=name)
[docs] class PmacIO(Device): """Device that represents a pmac controller.""" def __init__( self, prefix: str, axis_nums: Sequence[int], coord_nums: Sequence[int], name: str = "", ) -> None: self.axis = DeviceVector( {axis: PmacAxisIO(f"{prefix}:M{axis}") for axis in axis_nums} ) self.coord = DeviceVector( {coord: PmacCoordIO(f"{prefix}:CS{coord}") for coord in coord_nums} ) # Trajectory PVs have the same prefix as the pmac device self.trajectory = PmacTrajectoryIO(prefix) super().__init__(name=name)