diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index 92fc9f4685..01dffe47e1 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -5,9 +5,11 @@ from dodal.devices.beamlines.i10_1 import ( ElectromagnetMagnetField, ElectromagnetStage, + HighFieldMagnet, I10JScalerCard, ) from dodal.devices.current_amplifiers import SR570, CurrentAmpDet +from dodal.devices.motors import XYPitchStage from dodal.devices.temperture_controller.lakeshore.lakeshore import Lakeshore336 from dodal.log import set_beamline as set_log_beamline from dodal.utils import BeamlinePrefix, get_beamline_name @@ -122,3 +124,23 @@ def em_temperature_controller() -> Lakeshore336: return Lakeshore336( prefix=f"{PREFIX.beamline_prefix}-EA-TCTRL-41:", ) + + +"""I10J Hight Field Magnet Devices""" + + +@devices.factory() +def high_field_magnet_stage() -> XYPitchStage: + return XYPitchStage( + prefix=f"{PREFIX.beamline_prefix}-EA-MAG-01:", + x_infix="X", + y_infix="INSERT:Y", + pitch_infix="INSERT:ROTY", + ) + + +@devices.factory() +def high_field_magnet() -> HighFieldMagnet: + return HighFieldMagnet( + prefix=f"{PREFIX.beamline_prefix}-EA-SMC-01:", + ) diff --git a/src/dodal/devices/beamlines/i10_1/__init__.py b/src/dodal/devices/beamlines/i10_1/__init__.py index b562d0a9a5..1f6b94f0cd 100644 --- a/src/dodal/devices/beamlines/i10_1/__init__.py +++ b/src/dodal/devices/beamlines/i10_1/__init__.py @@ -1,9 +1,11 @@ from .electromagnet.magnet import ElectromagnetMagnetField from .electromagnet.stages import ElectromagnetStage +from .high_field_magnet.high_field_magnet import HighFieldMagnet from .scaler_cards import I10JScalerCard __all__ = [ "ElectromagnetMagnetField", "I10JScalerCard", "ElectromagnetStage", + "HighFieldMagnet", ] diff --git a/src/dodal/devices/beamlines/i10_1/high_field_magnet/__init__.py b/src/dodal/devices/beamlines/i10_1/high_field_magnet/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/dodal/devices/beamlines/i10_1/high_field_magnet/high_field_magnet.py b/src/dodal/devices/beamlines/i10_1/high_field_magnet/high_field_magnet.py new file mode 100644 index 0000000000..d9edce6649 --- /dev/null +++ b/src/dodal/devices/beamlines/i10_1/high_field_magnet/high_field_magnet.py @@ -0,0 +1,79 @@ +from ophyd_async.core import ( + FlyMotorInfo, + StandardReadable, + StandardReadableFormat, + StrictEnum, + SubsetEnum, + WatchableAsyncStatus, +) +from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal_w + + +class HighFieldMangetSweepTypes(StrictEnum): + FAST = "Fast" + SLOW = "Slow" + + +class HighFieldMagnetStatus(SubsetEnum): + HOLD = "Hold" + TO_SETPOINT = "To Setpoint" + TO_ZERO = "To Zero" + CLAMP = "Clamp" + + +class HighFieldMagnetStatusRBV(SubsetEnum): + HOLD = "Hold" + TO_SETPOINT = "To Setpoint" + TO_ZERO = "To Zero" + CLAMPED = "Clamped" + + +class HighFieldMagnet( + StandardReadable, + # Locatable[float], + # Stoppable, + # Flyable, + # Preparable, + # Subscribable[float], +): + def __init__(self, prefix: str, name: str = "") -> None: + with self.add_children_as_readables(StandardReadableFormat.CONFIG_SIGNAL): + self.sweeprate = epics_signal_rw( + float, + read_pv=prefix + "RBV:FIELDSWEEPRATE", + write_pv=prefix + "SET:FIELDSWEEPRATE", + ) + self.sweep_type = epics_signal_rw( + HighFieldMangetSweepTypes, + read_pv=prefix + "STS:SWEEPMODE:TYPE", + write_pv=prefix + "SET:SWEEPMODE:TYPE", + ) + self.set_move_readback = epics_signal_r( + HighFieldMagnetStatusRBV, + read_pv=prefix + "STS:ACTIVITY", + ) + with self.add_children_as_readables(StandardReadableFormat.HINTED_SIGNAL): + self.user_readback = epics_signal_r(float, prefix + "RBV:DEMANDFIELD") + + self.set_move = epics_signal_w( + HighFieldMagnetStatus, + write_pv=prefix + "SET:ACTIVITY", + ) + self.user_setpoint = epics_signal_rw( + float, + read_pv=prefix + "RBV:SETPOINTFIELD", + write_pv=prefix + "SET:SETPOINTFIELD", + ) + + self._set_success = True + + self._fly_info: FlyMotorInfo | None = None + + self._fly_status: WatchableAsyncStatus | None = None + + super().__init__(name=name) + + def set_name(self, name: str, *, child_name_separator: str | None = None) -> None: + super().set_name(name, child_name_separator=child_name_separator) + # Readback should be named the same as its parent in read() + self.user_readback.set_name(name)