diff --git a/src/dodal/devices/attenuator/attenuator.py b/src/dodal/devices/attenuator/attenuator.py index ce79556b811..f14906d342d 100644 --- a/src/dodal/devices/attenuator/attenuator.py +++ b/src/dodal/devices/attenuator/attenuator.py @@ -11,7 +11,11 @@ SubsetEnum, wait_for_value, ) -from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal_x +from ophyd_async.epics.core import ( + epics_signal_r, + epics_signal_rw, + epics_triggerable_command, +) from dodal.devices.attenuator.filter import FilterMotor from dodal.log import LOGGER @@ -65,8 +69,10 @@ def __init__(self, prefix: str, num_filters: int, name: str = ""): ) self._desired_transmission = epics_signal_rw(float, prefix + "T2A:SETVAL1") - self._use_current_energy = epics_signal_x(prefix + "E2WL:USECURRENTENERGY.PROC") - self._change = epics_signal_x(prefix + "FANOUT") + self._use_current_energy = epics_triggerable_command( + prefix + "E2WL:USECURRENTENERGY.PROC" + ) + self._change = epics_triggerable_command(prefix + "FANOUT.PROC") super().__init__(prefix, name) @@ -128,7 +134,9 @@ def __init__( YesNo, prefix + "AUTOMOVE" ) self._desired_transmission = epics_signal_rw(float, prefix + "T2A:SETVAL1") - self._use_current_energy = epics_signal_x(prefix + "E2WL:USECURRENTENERGY.PROC") + self._use_current_energy = epics_triggerable_command( + prefix + "E2WL:USECURRENTENERGY.PROC" + ) with self.add_children_as_readables(): self._filters: DeviceVector[FilterMotor] = DeviceVector( diff --git a/src/dodal/devices/beamlines/i11/nx100robot.py b/src/dodal/devices/beamlines/i11/nx100robot.py index cc92bea3afd..0880fe5719e 100644 --- a/src/dodal/devices/beamlines/i11/nx100robot.py +++ b/src/dodal/devices/beamlines/i11/nx100robot.py @@ -8,7 +8,11 @@ StrictEnum, set_and_wait_for_value, ) -from ophyd_async.epics.core import epics_signal_rw, epics_signal_rw_rbv, epics_signal_x +from ophyd_async.epics.core import ( + epics_signal_rw, + epics_signal_rw_rbv, + epics_triggerable_command, +) from dodal.log import LOGGER @@ -45,7 +49,7 @@ class NX100Robot(StandardReadable, Locatable[int], Stoppable, Pausable): MIN_NUMBER_OF_SAMPLES = 1 def __init__(self, prefix: str, name: str = ""): - self.start = epics_signal_x(prefix + "START") + self.start = epics_triggerable_command(prefix + "START.PROC") self.hold = epics_signal_rw(bool, prefix + "HOLD") self.job = epics_signal_rw(RobotJobs, prefix + "JOB") self.servo_on = epics_signal_rw(bool, prefix + "SVON") # Servo on/off diff --git a/src/dodal/devices/beamlines/i15_1/robot.py b/src/dodal/devices/beamlines/i15_1/robot.py index 1f90657eb1d..577cfbb425f 100644 --- a/src/dodal/devices/beamlines/i15_1/robot.py +++ b/src/dodal/devices/beamlines/i15_1/robot.py @@ -8,10 +8,10 @@ from ophyd_async.core import ( AsyncStatus, DeviceMock, - SignalX, StandardReadable, StrictEnum, - callback_on_mock_put, + TriggerableCommand, + callback_on_mock_execute, default_mock_class, derived_signal_rw, set_and_wait_for_value, @@ -22,7 +22,7 @@ epics_signal_r, epics_signal_rw, epics_signal_rw_rbv, - epics_signal_x, + epics_triggerable_command, ) from dodal.log import LOGGER @@ -66,14 +66,14 @@ async def connect(self, device: "Robot") -> None: def set_program(name: str, *_, **__): set_mock_value(device.program_name, name) - callback_on_mock_put( + callback_on_mock_execute( device.puck_load_program, partial(set_program, ProgramNames.PUCK.value) ) - callback_on_mock_put( + callback_on_mock_execute( device.beam_load_program, partial(set_program, ProgramNames.BEAM.value) ) - callback_on_mock_put( + callback_on_mock_execute( device._spinner_load_program, # noqa: SLF001 partial(set_program, ProgramNames.SPINNER.value), ) @@ -88,14 +88,14 @@ async def _program_running(): asyncio.create_task(_program_running()) - callback_on_mock_put(device.puck_pick, program_running) - callback_on_mock_put(device.puck_place, program_running) + callback_on_mock_execute(device.puck_pick, program_running) + callback_on_mock_execute(device.puck_place, program_running) - callback_on_mock_put(device.beam_place, program_running) - callback_on_mock_put(device.beam_pick, program_running) + callback_on_mock_execute(device.beam_place, program_running) + callback_on_mock_execute(device.beam_pick, program_running) - callback_on_mock_put(device._spinner_off, program_running) # noqa: SLF001 - callback_on_mock_put(device._spinner_on, program_running) # noqa: SLF001 + callback_on_mock_execute(device._spinner_off, program_running) # noqa: SLF001 + callback_on_mock_execute(device._spinner_on, program_running) # noqa: SLF001 @default_mock_class(MockRobot) @@ -135,32 +135,44 @@ def __init__(self, robot_prefix: str, current_sample_prefix: str, name: str = "" ) self._spinner_rbv = epics_signal_r(SpinnerState, f"{robot_prefix}SPINNER_STATE") - self._spinner_off = epics_signal_x(f"{robot_prefix}MOTOR:ACTION0.PROC") - self._spinner_on = epics_signal_x(f"{robot_prefix}MOTOR:ACTION1.PROC") - self._spinner_load_program = epics_signal_x(f"{robot_prefix}MOTOR:LOAD.PROC") + self._spinner_off = epics_triggerable_command( + f"{robot_prefix}MOTOR:ACTION0.PROC" + ) + self._spinner_on = epics_triggerable_command( + f"{robot_prefix}MOTOR:ACTION1.PROC" + ) + self._spinner_load_program = epics_triggerable_command( + f"{robot_prefix}MOTOR:LOAD.PROC" + ) self.spinner = derived_signal_rw( self._get_spinner_state, self._set_spinner_state, rbv=self._spinner_rbv ) - self.puck_pick = epics_signal_x(f"{robot_prefix}PUCK:ACTION0.PROC") - self.puck_place = epics_signal_x(f"{robot_prefix}PUCK:ACTION1.PROC") - self.puck_load_program = epics_signal_x(f"{robot_prefix}PUCK:LOAD.PROC") + self.puck_pick = epics_triggerable_command(f"{robot_prefix}PUCK:ACTION0.PROC") + self.puck_place = epics_triggerable_command(f"{robot_prefix}PUCK:ACTION1.PROC") + self.puck_load_program = epics_triggerable_command( + f"{robot_prefix}PUCK:LOAD.PROC" + ) - self.beam_pick = epics_signal_x(f"{robot_prefix}BEAM:ACTION0.PROC") - self.beam_place = epics_signal_x(f"{robot_prefix}BEAM:ACTION1.PROC") - self.beam_load_program = epics_signal_x(f"{robot_prefix}BEAM:LOAD.PROC") + self.beam_pick = epics_triggerable_command(f"{robot_prefix}BEAM:ACTION0.PROC") + self.beam_place = epics_triggerable_command(f"{robot_prefix}BEAM:ACTION1.PROC") + self.beam_load_program = epics_triggerable_command( + f"{robot_prefix}BEAM:LOAD.PROC" + ) - self.servo_off = epics_signal_x(f"{robot_prefix}SOFF.PROC") - self.servo_on = epics_signal_x(f"{robot_prefix}SON.PROC") + self.servo_off = epics_triggerable_command(f"{robot_prefix}SOFF.PROC") + self.servo_on = epics_triggerable_command(f"{robot_prefix}SON.PROC") - self.reset = epics_signal_x(f"{robot_prefix}RESET.PROC") + self.reset = epics_triggerable_command(f"{robot_prefix}RESET.PROC") - self.home = epics_signal_x(f"{robot_prefix}Home.PROC") + self.home = epics_triggerable_command(f"{robot_prefix}Home.PROC") super().__init__(name) - async def _trigger_program_and_wait_for_complete(self, trigger_signal: SignalX): + async def _trigger_program_and_wait_for_complete( + self, trigger_signal: TriggerableCommand + ): await trigger_signal.trigger() await wait_for_value( @@ -175,7 +187,7 @@ async def _trigger_program_and_wait_for_complete(self, trigger_signal: SignalX): ) async def _load_program_and_wait_for_loaded( - self, trigger_signal: SignalX, program_name: ProgramNames + self, trigger_signal: TriggerableCommand, program_name: ProgramNames ): await trigger_signal.trigger() diff --git a/src/dodal/devices/beamlines/i19/beamstop.py b/src/dodal/devices/beamlines/i19/beamstop.py index 7e0ec393e16..d84ea5d5fea 100644 --- a/src/dodal/devices/beamlines/i19/beamstop.py +++ b/src/dodal/devices/beamlines/i19/beamstop.py @@ -1,5 +1,5 @@ from ophyd_async.core import StandardReadable, StrictEnum -from ophyd_async.epics.core import epics_signal_rw, epics_signal_x +from ophyd_async.epics.core import epics_signal_rw, epics_triggerable_command from dodal.devices.motors import XYZStage @@ -15,7 +15,7 @@ class HomeGroup(StrictEnum): class HomingControl(StandardReadable): def __init__(self, prefix: str, name: str = "") -> None: self.homing_group = epics_signal_rw(HomeGroup, f"{prefix}:HMGRP") - self.home = epics_signal_x(f"{prefix}:HOME") + self.home = epics_triggerable_command(f"{prefix}:HOME") super().__init__(name) diff --git a/src/dodal/devices/beamlines/i19/mapt_configuration.py b/src/dodal/devices/beamlines/i19/mapt_configuration.py index 17e65b401ce..e6b57028489 100644 --- a/src/dodal/devices/beamlines/i19/mapt_configuration.py +++ b/src/dodal/devices/beamlines/i19/mapt_configuration.py @@ -1,5 +1,9 @@ from ophyd_async.core import DeviceVector, SignalR, StandardReadable, SubsetEnum -from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal_x +from ophyd_async.epics.core import ( + epics_signal_r, + epics_signal_rw, + epics_triggerable_command, +) class MAPTConfigurationTable(StandardReadable): @@ -35,5 +39,5 @@ def __init__( ) -> None: with self.add_children_as_readables(): self.select_config = epics_signal_rw(aperture_request, f"{prefix}") - self.apply_selection = epics_signal_x(f"{prefix}:APPLY.PROC") + self.apply_selection = epics_triggerable_command(f"{prefix}:APPLY.PROC") super().__init__(name) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 9fe52d7fcc2..bd646a69d68 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -19,7 +19,7 @@ PvSuffix, epics_signal_r, epics_signal_w, - epics_signal_x, + epics_triggerable_command, ) from dodal.common.enums import OnOffUpper @@ -87,7 +87,7 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): } ) self.enabled = epics_signal_w(OnOffUpper, f"{prefix}ONOFF") - self.commit_target_voltages = epics_signal_x(f"{prefix}ALLTRGT.PROC") + self.commit_target_voltages = epics_triggerable_command(f"{prefix}ALLTRGT.PROC") self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}STATUS") self.err = epics_signal_r(str, f"{prefix}ERR") super().__init__(name=name) diff --git a/src/dodal/devices/common_mirror.py b/src/dodal/devices/common_mirror.py index f9a7fd259b2..c3a32ea5296 100644 --- a/src/dodal/devices/common_mirror.py +++ b/src/dodal/devices/common_mirror.py @@ -2,7 +2,7 @@ from bluesky.protocols import Locatable, Location, Stoppable from ophyd_async.core import AsyncStatus, StrictEnum -from ophyd_async.epics.core import epics_signal_rw, epics_signal_x +from ophyd_async.epics.core import epics_signal_rw, epics_triggerable_command from dodal.devices.motors import XYZPitchYawRollStage @@ -53,8 +53,12 @@ def __init__( write_pv=prefix + mirror_write_suffix, ) - self.mirror_change = epics_signal_x(write_pv=prefix + mirror_change_suffix) - self.mirror_abort = epics_signal_x(write_pv=prefix + mirror_abort_suffix) + self.mirror_change = epics_triggerable_command( + write_pv=prefix + mirror_change_suffix + ) + self.mirror_abort = epics_triggerable_command( + write_pv=prefix + mirror_abort_suffix + ) super().__init__(prefix=prefix, name=name) diff --git a/src/dodal/devices/cryostream.py b/src/dodal/devices/cryostream.py index 272791c91f5..cf40cb88059 100644 --- a/src/dodal/devices/cryostream.py +++ b/src/dodal/devices/cryostream.py @@ -7,7 +7,7 @@ from ophyd_async.epics.core import ( epics_signal_r, epics_signal_rw, - epics_signal_x, + epics_triggerable_command, ) @@ -61,16 +61,16 @@ def __init__(self, prefix: str, name: str = ""): self.suct_heat = epics_signal_r(float, f"{prefix}SUCTHEAT") self.back_pressure = epics_signal_r(float, f"{prefix}BACKPRESS") - self.purge = epics_signal_x(f"{prefix}PURGE.PROC") - self.hold = epics_signal_x(f"{prefix}HOLD.PROC") - self.start = epics_signal_x(f"{prefix}RESTART.PROC") - self.pause = epics_signal_x(f"{prefix}PAUSE.PROC") - self.resume = epics_signal_x(f"{prefix}RESUME.PROC") - self.end = epics_signal_x(f"{prefix}END.PROC") - self.stop = epics_signal_x(f"{prefix}STOP.PROC") - self.plat = epics_signal_x(f"{prefix}PLAT.PROC") - self.cool = epics_signal_x(f"{prefix}COOL.PROC") - self.ramp = epics_signal_x(f"{prefix}RAMP.PROC") + self.purge = epics_triggerable_command(f"{prefix}PURGE.PROC") + self.hold = epics_triggerable_command(f"{prefix}HOLD.PROC") + self.start = epics_triggerable_command(f"{prefix}RESTART.PROC") + self.pause = epics_triggerable_command(f"{prefix}PAUSE.PROC") + self.resume = epics_triggerable_command(f"{prefix}RESUME.PROC") + self.end = epics_triggerable_command(f"{prefix}END.PROC") + self.stop = epics_triggerable_command(f"{prefix}STOP.PROC") + self.plat = epics_triggerable_command(f"{prefix}PLAT.PROC") + self.cool = epics_triggerable_command(f"{prefix}COOL.PROC") + self.ramp = epics_triggerable_command(f"{prefix}RAMP.PROC") super().__init__(name) diff --git a/src/dodal/devices/fast_grid_scan.py b/src/dodal/devices/fast_grid_scan.py index 1fad3dd7c6d..5b719fc496b 100644 --- a/src/dodal/devices/fast_grid_scan.py +++ b/src/dodal/devices/fast_grid_scan.py @@ -24,7 +24,7 @@ epics_signal_r, epics_signal_rw, epics_signal_rw_rbv, - epics_signal_x, + epics_triggerable_command, ) from pydantic import BaseModel, field_validator from pydantic.dataclasses import dataclass @@ -224,8 +224,8 @@ def __init__( # once https://github.com/DiamondLightSource/mx-bluesky/issues/1203 is done self.scan_invalid = self._create_scan_invalid_signal(prefix) - self.run_cmd = epics_signal_x(f"{prefix}RUN.PROC") - self.stop_cmd = epics_signal_x(f"{prefix}STOP.PROC") + self.run_cmd = epics_triggerable_command(f"{prefix}RUN.PROC") + self.stop_cmd = epics_triggerable_command(f"{prefix}STOP.PROC") self.status = epics_signal_r(int, f"{prefix}SCAN_STATUS") self.expected_images = self._create_expected_images_signal() diff --git a/src/dodal/devices/focusing_mirror.py b/src/dodal/devices/focusing_mirror.py index e701f1e1693..cfbf6be94d5 100644 --- a/src/dodal/devices/focusing_mirror.py +++ b/src/dodal/devices/focusing_mirror.py @@ -14,7 +14,7 @@ from ophyd_async.epics.core import ( epics_signal_r, epics_signal_rw, - epics_signal_x, + epics_triggerable_command, ) from ophyd_async.epics.motor import Motor @@ -219,7 +219,7 @@ class FocusingMirrorWithStripes(FocusingMirror): def __init__(self, prefix: str, name: str = "", *args, **kwargs): self.stripe = epics_signal_rw(MirrorStripe, prefix + "STRP:DVAL") # apply the current set stripe setting - self.apply_stripe = epics_signal_x(prefix + "CHANGE.PROC") + self.apply_stripe = epics_triggerable_command(prefix + "CHANGE.PROC") super().__init__(prefix, name, *args, **kwargs) diff --git a/src/dodal/devices/robot.py b/src/dodal/devices/robot.py index 623f9c99e83..0985d20b18c 100644 --- a/src/dodal/devices/robot.py +++ b/src/dodal/devices/robot.py @@ -17,7 +17,7 @@ epics_signal_r, epics_signal_rw, epics_signal_rw_rbv, - epics_signal_x, + epics_triggerable_command, ) from dodal.log import LOGGER @@ -131,22 +131,22 @@ def __init__(self, prefix: str, name: str = "") -> None: self.sample_id = epics_signal_r(int, prefix + "CURRENT_ID_RBV") self.next_sample_id = epics_signal_rw_rbv(int, prefix + "NEXT_ID") - self.load = epics_signal_x(prefix + "LOAD.PROC") - self.unload = epics_signal_x(prefix + "UNLD.PROC") + self.load = epics_triggerable_command(prefix + "LOAD.PROC") + self.unload = epics_triggerable_command(prefix + "UNLD.PROC") self.program_running = epics_signal_r(bool, prefix + "PROGRAM_RUNNING") self.program_name = epics_signal_r(str, prefix + "PROGRAM_NAME") self.prog_error = ErrorStatus(prefix + "PRG") self.controller_error = ErrorStatus(prefix + "CNTL") - self.reset = epics_signal_x(prefix + "RESET.PROC") - self.abort = epics_signal_x(prefix + "ABORT.PROC") - self.init = epics_signal_x(prefix + "INIT.PROC") - self.soak = epics_signal_x(prefix + "SOAK.PROC") - self.home = epics_signal_x(prefix + "GOHM.PROC") - self.dry = epics_signal_x(prefix + "DRY.PROC") - self.open = epics_signal_x(prefix + "COLO.PROC") - self.close = epics_signal_x(prefix + "COLC.PROC") + self.reset = epics_triggerable_command(prefix + "RESET.PROC") + self.abort = epics_triggerable_command(prefix + "ABORT.PROC") + self.init = epics_triggerable_command(prefix + "INIT.PROC") + self.soak = epics_triggerable_command(prefix + "SOAK.PROC") + self.home = epics_triggerable_command(prefix + "GOHM.PROC") + self.dry = epics_triggerable_command(prefix + "DRY.PROC") + self.open = epics_triggerable_command(prefix + "COLO.PROC") + self.close = epics_triggerable_command(prefix + "COLC.PROC") self.cryomode_rbv = epics_signal_r(float, prefix + "CRYO_MODE_RBV") self.cryomode = epics_signal_rw(str, prefix + "CRYO_MODE_CTRL") self.gripper_temp = epics_signal_r(float, prefix + "GRIPPER_TEMP") diff --git a/tests/devices/beamlines/i15_1/test_robot.py b/tests/devices/beamlines/i15_1/test_robot.py index faa8e2b4b64..ae62ea83086 100644 --- a/tests/devices/beamlines/i15_1/test_robot.py +++ b/tests/devices/beamlines/i15_1/test_robot.py @@ -2,8 +2,9 @@ import pytest from ophyd_async.core import ( - callback_on_mock_put, + callback_on_mock_execute, get_mock, + get_mock_execute, get_mock_put, init_devices, set_mock_value, @@ -48,7 +49,7 @@ async def test_puck_program_loaded_before_position_selected(robot: Robot) -> Non parent_mock = get_mock(robot) expected_calls = [ - call.puck_load_program.put(ANY), + call.puck_load_program.execute(), call.puck_sel.put(ANY), call.pos_sel.put(ANY), ] @@ -63,19 +64,19 @@ async def test_given_wrong_puck_program_gets_loaded_robot_times_out(robot: Robot def change_to_wrong_program(*_, **__): set_mock_value(robot.program_name, "BAD PROGRAM") - callback_on_mock_put(robot.puck_load_program, change_to_wrong_program) + callback_on_mock_execute(robot.puck_load_program, change_to_wrong_program) with pytest.raises(TimeoutError): await robot.set(SampleLocation(puck=1, position=2)) - get_mock_put(robot.puck_pick).assert_not_called() + get_mock_execute(robot.puck_pick).assert_not_called() async def test_given_puck_program_doesnt_start_then_robot_times_out(robot: Robot): def do_nothing(*_, **__): pass - callback_on_mock_put(robot.puck_pick, do_nothing) + callback_on_mock_execute(robot.puck_pick, do_nothing) with pytest.raises(TimeoutError): await robot.set(SampleLocation(puck=1, position=2)) @@ -85,7 +86,7 @@ async def test_given_puck_program_doesnt_stop_then_robot_times_out(robot: Robot) def infinite_program(*_, **__): set_mock_value(robot.program_running, ProgramRunning.PROGRAM_RUNNING) - callback_on_mock_put(robot.puck_pick, infinite_program) + callback_on_mock_execute(robot.puck_pick, infinite_program) with pytest.raises(TimeoutError): await robot.set(SampleLocation(puck=1, position=2)) @@ -99,11 +100,11 @@ async def test_when_robot_loaded_puck_picked_then_beam_placed(robot: Robot) -> N calls = parent_mock.mock_calls - puck_program_loaded = calls.index(call.puck_load_program.put(ANY)) - puck_picked = calls.index(call.puck_pick.put(ANY)) + puck_program_loaded = calls.index(call.puck_load_program.execute()) + puck_picked = calls.index(call.puck_pick.execute()) - beam_program_loaded = calls.index(call.beam_load_program.put(ANY)) - beam_placed = calls.index(call.beam_place.put(ANY)) + beam_program_loaded = calls.index(call.beam_load_program.execute()) + beam_placed = calls.index(call.beam_place.execute()) assert puck_program_loaded < puck_picked < beam_program_loaded < beam_placed @@ -112,19 +113,19 @@ async def test_given_wrong_beam_program_gets_loaded_robot_times_out(robot: Robot def change_to_wrong_program(*_, **__): set_mock_value(robot.program_name, "BAD PROGRAM") - callback_on_mock_put(robot.beam_load_program, change_to_wrong_program) + callback_on_mock_execute(robot.beam_load_program, change_to_wrong_program) with pytest.raises(TimeoutError): await robot.set(SampleLocation(puck=1, position=2)) - get_mock_put(robot.beam_place).assert_not_called() + get_mock_execute(robot.beam_place).assert_not_called() async def test_given_beam_program_doesnt_start_then_robot_times_out(robot: Robot): def do_nothing(*_, **__): pass - callback_on_mock_put(robot.beam_place, do_nothing) + callback_on_mock_execute(robot.beam_place, do_nothing) with pytest.raises(TimeoutError): await robot.set(SampleLocation(puck=1, position=2)) @@ -134,7 +135,7 @@ async def test_given_beam_program_doesnt_stop_then_robot_times_out(robot: Robot) def infinite_program(*_, **__): set_mock_value(robot.program_running, ProgramRunning.PROGRAM_RUNNING) - callback_on_mock_put(robot.beam_place, infinite_program) + callback_on_mock_execute(robot.beam_place, infinite_program) with pytest.raises(TimeoutError): await robot.set(SampleLocation(puck=1, position=2)) @@ -178,9 +179,9 @@ async def test_when_unloaded_then_spinner_stops_before_beam_program_loaded( parent_mock = get_mock(robot) expected_calls = [ - call._spinner_load_program.put(ANY), - call._spinner_off.put(ANY), - call.beam_load_program.put(ANY), + call._spinner_load_program.execute(), + call._spinner_off.execute(), + call.beam_load_program.execute(), ] parent_mock.assert_has_calls(expected_calls, any_order=False) @@ -190,12 +191,12 @@ async def test_given_wrong_spinner_program_gets_loaded_then_times_out(robot: Rob def change_to_wrong_program(*_, **__): set_mock_value(robot.program_name, "BAD PROGRAM") - callback_on_mock_put(robot._spinner_load_program, change_to_wrong_program) + callback_on_mock_execute(robot._spinner_load_program, change_to_wrong_program) with pytest.raises(TimeoutError): await robot.spinner.set(SpinnerState.OFF) - get_mock_put(robot._spinner_off).assert_not_called() + get_mock_execute(robot._spinner_off).assert_not_called() async def test_given_spinner_stop_program_doesnt_start_then_times_out( @@ -204,7 +205,7 @@ async def test_given_spinner_stop_program_doesnt_start_then_times_out( def do_nothing(*_, **__): pass - callback_on_mock_put(robot._spinner_off, do_nothing) + callback_on_mock_execute(robot._spinner_off, do_nothing) with pytest.raises(TimeoutError): await robot.spinner.set(SpinnerState.OFF) @@ -216,7 +217,7 @@ async def test_given_spinner_stop_program_doesnt_stop_then_times_out( def infinite_program(*_, **__): set_mock_value(robot.program_running, ProgramRunning.PROGRAM_RUNNING) - callback_on_mock_put(robot._spinner_off, infinite_program) + callback_on_mock_execute(robot._spinner_off, infinite_program) with pytest.raises(TimeoutError): await robot.spinner.set(SpinnerState.OFF) @@ -234,7 +235,7 @@ async def test_given_spinner_is_already_in_state_then_dont_change_it( await robot.spinner.set(initial_state) - get_mock_put(robot._spinner_load_program).assert_not_called() + get_mock_execute(robot._spinner_load_program).assert_not_called() async def test_when_robot_unloaded_beam_picked_then_puck_placed(robot: Robot) -> None: @@ -247,11 +248,11 @@ async def test_when_robot_unloaded_beam_picked_then_puck_placed(robot: Robot) -> calls = parent_mock.mock_calls - beam_program_loaded = calls.index(call.beam_load_program.put(ANY)) - beam_picked = calls.index(call.beam_pick.put(ANY)) + beam_program_loaded = calls.index(call.beam_load_program.execute()) + beam_picked = calls.index(call.beam_pick.execute()) - puck_program_loaded = calls.index(call.puck_load_program.put(ANY)) - puck_placed = calls.index(call.puck_place.put(ANY)) + puck_program_loaded = calls.index(call.puck_load_program.execute()) + puck_placed = calls.index(call.puck_place.execute()) assert beam_program_loaded < beam_picked < puck_program_loaded < puck_placed diff --git a/tests/devices/test_attenuator.py b/tests/devices/test_attenuator.py index b506c214237..7fab567c3d5 100644 --- a/tests/devices/test_attenuator.py +++ b/tests/devices/test_attenuator.py @@ -4,7 +4,11 @@ import pytest from bluesky import plan_stubs as bps from bluesky.run_engine import RunEngine -from ophyd_async.core import callback_on_mock_put, init_devices, set_mock_value +from ophyd_async.core import ( + callback_on_mock_execute, + init_devices, + set_mock_value, +) from dodal.devices.attenuator.attenuator import ( BinaryFilterAttenuator, @@ -49,7 +53,7 @@ def mock_apply_values(*args, **kwargs): ) set_mock_value(fake_attenuator._filters_in_position[i], CALCULATED_VALUE[i]) - callback_on_mock_put(fake_attenuator._change, mock_apply_values) + callback_on_mock_execute(fake_attenuator._change, mock_apply_values) await fake_attenuator.set(0.65) @@ -68,7 +72,7 @@ async def mock_apply_values(*args, **kwargs): for i in range(16): set_mock_value(fake_attenuator._filters_in_position[i], CALCULATED_VALUE[i]) - callback_on_mock_put(fake_attenuator._change, mock_apply_values) + callback_on_mock_execute(fake_attenuator._change, mock_apply_values) status = fake_attenuator.set(0.65) assert not status.done fake_set_complete.set() diff --git a/tests/devices/test_bart_robot.py b/tests/devices/test_bart_robot.py index 8c376dd0783..7636400ab61 100644 --- a/tests/devices/test_bart_robot.py +++ b/tests/devices/test_bart_robot.py @@ -7,9 +7,9 @@ import pytest from ophyd_async.core import ( - callback_on_mock_put, + callback_on_mock_execute, get_mock, - get_mock_put, + get_mock_execute, set_mock_value, ) @@ -49,8 +49,8 @@ async def fake_unload(*args, **kwargs): await trigger_complete.wait() asyncio.create_task(finish_later()) - get_mock_put(device.unload).side_effect = fake_unload - callback_on_mock_put(device.reset, partial(clear_errors, device)) + get_mock_execute(device.unload).side_effect = fake_unload + callback_on_mock_execute(device.reset, partial(clear_errors, device)) return device, trigger_complete, drying_complete @@ -108,7 +108,7 @@ async def bart_robot() -> BartRobot: device.LOAD_TIMEOUT = 0.3 # type: ignore await device.connect(mock=True) set_mock_value(device.program_running, False) - callback_on_mock_put(device.reset, partial(clear_errors, device)) + callback_on_mock_execute(device.reset, partial(clear_errors, device)) return device @@ -277,7 +277,7 @@ async def test_given_program_not_running_and_pin_unmounts_then_mounts_when_load_ assert status.success assert (await device.next_puck.get_value()) == 15 assert (await device.next_pin.get_value()) == 10 - get_mock_put(device.load).assert_called_once() + get_mock_execute(device.load).assert_called_once() async def test_waiting_for_beamline_status_raises_error_when_prog_error( @@ -347,13 +347,13 @@ async def test_moving_the_robot_will_reset_controller_error_and_throw_if_error_n assert e.value.error_code == 40 expected_load_unload_calls = ( - [call.reset.put(None), call.unload.put(None)] + [call.reset.execute(), call.unload.execute()] if sample_location is SAMPLE_LOCATION_EMPTY else [ - call.reset.put(None), + call.reset.execute(), call.next_puck.put(ANY), call.next_pin.put(ANY), - call.load.put(None), + call.load.execute(), ] ) get_mock(device).assert_has_calls(expected_load_unload_calls) @@ -372,10 +372,10 @@ async def test_robot_load_resets_controller_error_and_succeeds_if_error_cleared( get_mock(device).assert_has_calls( [ - call.reset.put(None), + call.reset.execute(), call.next_puck.put(ANY), call.next_pin.put(ANY), - call.load.put(None), + call.load.execute(), ] ) @@ -393,10 +393,10 @@ async def test_robot_load_resets_prog_error_and_succeeds_if_error_cleared( get_mock(device).assert_has_calls( [ - call.reset.put(None), + call.reset.execute(), call.next_puck.put(ANY), call.next_pin.put(ANY), - call.load.put(None), + call.load.execute(), ] ) @@ -413,7 +413,7 @@ async def test_robot_unload_resets_controller_error_and_succeeds_if_error_cleare await device.set(SAMPLE_LOCATION_EMPTY) - get_mock(device).assert_has_calls([call.reset.put(None), call.unload.put(None)]) + get_mock(device).assert_has_calls([call.reset.execute(), call.unload.execute()]) async def test_robot_unload_resets_prog_error_and_succeeds_if_error_cleared( @@ -428,7 +428,7 @@ async def test_robot_unload_resets_prog_error_and_succeeds_if_error_cleared( await device.set(SAMPLE_LOCATION_EMPTY) - get_mock(device).assert_has_calls([call.reset.put(None), call.unload.put(None)]) + get_mock(device).assert_has_calls([call.reset.execute(), call.unload.execute()]) async def test_robot_load_does_not_reset_if_prog_error_or_controller_error_not_retryable( @@ -443,7 +443,7 @@ async def test_robot_load_does_not_reset_if_prog_error_or_controller_error_not_r with pytest.raises(RobotLoadError) as e: await robot.set(SampleLocation(1, 2)) - get_mock_put(robot.reset).assert_not_called() + get_mock_execute(robot.reset).assert_not_called() assert e.value.error_code == 123 set_mock_value(robot.prog_error.code, ProgErrorCode.SAMPLE_POSITION_NOT_READY) @@ -452,7 +452,7 @@ async def test_robot_load_does_not_reset_if_prog_error_or_controller_error_not_r with pytest.raises(RobotLoadError): await robot.set(SampleLocation(1, 2)) - get_mock_put(robot.reset).assert_not_called() + get_mock_execute(robot.reset).assert_not_called() assert e.value.error_code == 123 @@ -463,7 +463,7 @@ async def test_unloading_the_robot_waits_for_drying_to_complete(robot_for_unload await asyncio.sleep(0.1) assert not unload_status.done - get_mock_put(robot.unload).assert_called_once() + get_mock_execute(robot.unload).assert_called_once() trigger_completed.set() await unload_status diff --git a/tests/devices/test_bimorph_mirror.py b/tests/devices/test_bimorph_mirror.py index bfe44dbc794..24f17d3d6ca 100644 --- a/tests/devices/test_bimorph_mirror.py +++ b/tests/devices/test_bimorph_mirror.py @@ -6,7 +6,7 @@ import pytest from ophyd_async.core import ( callback_on_mock_put, - get_mock_put, + get_mock_execute, init_devices, set_mock_value, walk_rw_signals, @@ -96,7 +96,7 @@ async def test_set_channels_triggers_alltrgt_proc( mirror_with_mocked_put: BimorphMirror, valid_bimorph_values: list[float], ): - mock_alltrgt_proc = get_mock_put(mirror_with_mocked_put.commit_target_voltages) + mock_alltrgt_proc = get_mock_execute(mirror_with_mocked_put.commit_target_voltages) mock_alltrgt_proc.assert_not_called() diff --git a/tests/devices/test_gridscan.py b/tests/devices/test_gridscan.py index 306cbd8c6b5..4794c7100f8 100644 --- a/tests/devices/test_gridscan.py +++ b/tests/devices/test_gridscan.py @@ -13,6 +13,7 @@ from ophyd.status import DeviceStatus, Status from ophyd_async.core import ( callback_on_mock_put, + get_mock_execute, get_mock_put, init_devices, set_mock_put_proceeds, @@ -114,7 +115,7 @@ async def test_given_settings_valid_when_kickoff_then_run_started( await grid_scan.kickoff() - get_mock_put(grid_scan.run_cmd).assert_called_once() + get_mock_execute(grid_scan.run_cmd).assert_called_once() async def test_waits_for_running_motion(grid_scan: FastGridScanCommon): @@ -130,7 +131,7 @@ async def test_waits_for_running_motion(grid_scan: FastGridScanCommon): set_mock_value(grid_scan.motion_program.running, 0) set_mock_value(grid_scan.status, 1) await grid_scan.kickoff() - get_mock_put(grid_scan.run_cmd).assert_called_once() + get_mock_execute(grid_scan.run_cmd).assert_called_once() @pytest.mark.parametrize(