diff --git a/src/dodal/beamlines/i19_1.py b/src/dodal/beamlines/i19_1.py index b58c6dacede..33c6f917a24 100644 --- a/src/dodal/beamlines/i19_1.py +++ b/src/dodal/beamlines/i19_1.py @@ -17,6 +17,7 @@ AccessControlledPiezoActuator, FocusingMirrorName, ) +from dodal.devices.beamlines.i19.access_controlled.read_only_dcm import ReadOnlyDCM from dodal.devices.beamlines.i19.access_controlled.shutter import ( AccessControlledShutter, ) @@ -67,6 +68,11 @@ def config_client() -> ConfigClient: return client +@devices.factory() +def read_only_dcm() -> ReadOnlyDCM: + return ReadOnlyDCM(prefix=f"{PREFIX.beamline_prefix}-MO-DCM-01:") + + @devices.factory() def attenuator_motor_squad() -> AttenuatorMotorSquad: return AttenuatorMotorSquad( diff --git a/src/dodal/beamlines/i19_2.py b/src/dodal/beamlines/i19_2.py index 165f8349fa6..3644089b505 100644 --- a/src/dodal/beamlines/i19_2.py +++ b/src/dodal/beamlines/i19_2.py @@ -20,6 +20,7 @@ AccessControlledPiezoActuator, FocusingMirrorName, ) +from dodal.devices.beamlines.i19.access_controlled.read_only_dcm import ReadOnlyDCM from dodal.devices.beamlines.i19.access_controlled.shutter import ( AccessControlledShutter, ) @@ -73,6 +74,11 @@ def path_provider() -> PathProvider: ) +@devices.factory() +def read_only_dcm() -> ReadOnlyDCM: + return ReadOnlyDCM(prefix=f"{PREFIX.beamline_prefix}-MO-DCM-01:") + + @devices.factory() def attenuator_motor_squad() -> AttenuatorMotorSquad: return AttenuatorMotorSquad( diff --git a/src/dodal/beamlines/i19_optics.py b/src/dodal/beamlines/i19_optics.py index 4ff840b82bf..16f210a73fe 100644 --- a/src/dodal/beamlines/i19_optics.py +++ b/src/dodal/beamlines/i19_optics.py @@ -10,6 +10,11 @@ ACCESS_DEVICE_NAME, HutchAccessControl, ) +from dodal.devices.common_dcm import ( + DoubleCrystalMonochromatorWithDSpacing, + PitchAndRollCrystal, + StationaryCrystal, +) from dodal.devices.focusing_mirror import FocusingMirrorWithPiezo from dodal.devices.hutch_shutter import InterlockedHutchShutter from dodal.devices.interlocks import PSSInterlock @@ -24,6 +29,15 @@ devices = DeviceManager() +@devices.factory() +def dcm() -> DoubleCrystalMonochromatorWithDSpacing: + return DoubleCrystalMonochromatorWithDSpacing( + prefix=f"{PREFIX.beamline_prefix}-MO-DCM-01:", + xtal_1=StationaryCrystal, + xtal_2=PitchAndRollCrystal, + ) + + @devices.factory() def access_control() -> HutchAccessControl: """Device factory for access control device. diff --git a/src/dodal/devices/beamlines/i19/access_controlled/read_only_dcm.py b/src/dodal/devices/beamlines/i19/access_controlled/read_only_dcm.py new file mode 100644 index 00000000000..36e66f7586e --- /dev/null +++ b/src/dodal/devices/beamlines/i19/access_controlled/read_only_dcm.py @@ -0,0 +1,15 @@ +from ophyd_async.core import StandardReadable +from ophyd_async.epics.core import epics_signal_r + + +class ReadOnlyDCM(StandardReadable): + def __init__( + self, + prefix: str, + name: str = "", + ) -> None: + with self.add_children_as_readables(): + self.energy_in_eV = epics_signal_r(float, f"{prefix}ENERGY") + self.wavelength_in_a = epics_signal_r(float, f"{prefix}WAVELENGTH") + + super().__init__(prefix) diff --git a/tests/devices/beamlines/i19/access_controlled/test_read_only_dcm.py b/tests/devices/beamlines/i19/access_controlled/test_read_only_dcm.py new file mode 100644 index 00000000000..9179ac170b5 --- /dev/null +++ b/tests/devices/beamlines/i19/access_controlled/test_read_only_dcm.py @@ -0,0 +1,27 @@ +import pytest +from bluesky.run_engine import RunEngine +from ophyd_async.core import set_mock_value +from ophyd_async.testing import assert_reading, partial_reading + +from dodal.devices.beamlines.i19.access_controlled.read_only_dcm import ReadOnlyDCM + + +@pytest.fixture +async def mock_dcm() -> ReadOnlyDCM: + mock_dcm = ReadOnlyDCM(prefix="FOO-MO") + await mock_dcm.connect(mock=True) + set_mock_value(mock_dcm.energy_in_eV, 1) + set_mock_value(mock_dcm.wavelength_in_a, 100) + return mock_dcm + + +async def test_reading(mock_dcm: ReadOnlyDCM, run_engine: RunEngine): + prefix = "FOO-MO" + await assert_reading( + mock_dcm, + { + f"{prefix}-energy_in_eV": partial_reading(1.0), + f"{prefix}-wavelength_in_a": partial_reading(100.0), + }, + False, + )