diff --git a/pyproject.toml b/pyproject.toml index 228bb636f59..2ed5ee226af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ description = "Ophyd devices and other utils that could be used across DLS beaml dependencies = [ "click", "ophyd", - "ophyd-async[ca,pva]>=v0.17a5", + "ophyd-async[ca,pva]>=0.19.1", "bluesky>=1.14.5", "pyepics", "pillow", @@ -51,7 +51,7 @@ dev = [ # Commented out due to dependency version conflict with pydantic 1.x # "copier", "myst-parser", - "ophyd_async[sim]>=v0.14.0", + "ophyd_async[sim]>=v0.19.1", "pre-commit", "psutil", "pydata-sphinx-theme>=0.12", @@ -131,6 +131,9 @@ filterwarnings = [ "ignore:dep_util is Deprecated. Use functions from setuptools instead.:DeprecationWarning", # Ignore deprecation warning from zocalo "ignore:.*pkg_resources.*:DeprecationWarning", + # Ignore deprecation warnings about TriggerableCommand until https://github.com/bluesky/ophyd-async/issues/1292 + # addressed + "ignore:epics_signal_x is deprecated, use epics_triggerable_command instead:DeprecationWarning", ] # Doctest python code in docs, python code in src docstrings, test functions in tests testpaths = "docs src tests system_tests" diff --git a/src/dodal/beamlines/adsim.py b/src/dodal/beamlines/adsim.py index c5b8667c3b2..2bb4a449111 100644 --- a/src/dodal/beamlines/adsim.py +++ b/src/dodal/beamlines/adsim.py @@ -1,3 +1,4 @@ +from ophyd_async.epics.adcore import ADWriterFactory from ophyd_async.epics.adsimdetector import SimDetector from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline @@ -82,7 +83,6 @@ def stage() -> XThetaStage: def det(path_provider) -> SimDetector: return SimDetector( f"{PREFIX.beamline_prefix}-DI-CAM-01:", - path_provider=path_provider, + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix=DET_SUFFIX, - writer_suffix=HDF5_SUFFIX, ) diff --git a/src/dodal/beamlines/b01_1.py b/src/dodal/beamlines/b01_1.py index 58d74686cfd..c01dd10dd76 100644 --- a/src/dodal/beamlines/b01_1.py +++ b/src/dodal/beamlines/b01_1.py @@ -3,7 +3,7 @@ from ophyd_async.core import PathProvider, StaticPathProvider, UUIDFilenameProvider from ophyd_async.epics.adaravis import AravisDetector -from ophyd_async.epics.adcore import NDROIStatIO +from ophyd_async.epics.adcore import ADWriterFactory, NDROIStatIO from ophyd_async.epics.pmac import PmacIO from ophyd_async.fastcs.panda import HDFPanda @@ -87,9 +87,8 @@ def spectroscopy_detector(path_provider: PathProvider) -> AravisDetector: pv_prefix = f"{PREFIX.beamline_prefix}-DI-DCAM-02:" return AravisDetector( pv_prefix, - path_provider=path_provider, + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix=CAM_SUFFIX, - writer_suffix=HDF5_SUFFIX, plugins={ "roistat": NDROIStatIO(f"{pv_prefix}ROISTAT:", num_channels=3), }, @@ -107,9 +106,8 @@ def imaging_detector(path_provider: PathProvider) -> AravisDetector: """ return AravisDetector( f"{PREFIX.beamline_prefix}-DI-DCAM-01:", - path_provider=path_provider, + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix=CAM_SUFFIX, - writer_suffix=HDF5_SUFFIX, ) diff --git a/src/dodal/beamlines/i11.py b/src/dodal/beamlines/i11.py index aa791d52af9..e430a595a83 100644 --- a/src/dodal/beamlines/i11.py +++ b/src/dodal/beamlines/i11.py @@ -2,6 +2,7 @@ from pathlib import Path from ophyd_async.core import PathProvider, StaticPathProvider, UUIDFilenameProvider +from ophyd_async.epics.adcore import ADWriterFactory from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline from dodal.common.beamlines.device_helpers import DET_SUFFIX @@ -49,9 +50,10 @@ def mythen3(path_provider: PathProvider) -> Mythen3: """Mythen3 Detector from PSI.""" return Mythen3( prefix=f"{PREFIX.beamline_prefix}-EA-DET-07:", - path_provider=path_provider, + writer_factory=ADWriterFactory.hdf( + path_provider=path_provider, writer_suffix="HDF:" + ), drv_suffix=DET_SUFFIX, - writer_suffix="HDF:", ) diff --git a/src/dodal/beamlines/i13_1.py b/src/dodal/beamlines/i13_1.py index 2662d8f2152..ba510434f16 100644 --- a/src/dodal/beamlines/i13_1.py +++ b/src/dodal/beamlines/i13_1.py @@ -3,6 +3,7 @@ from ophyd_async.core import PathProvider from ophyd_async.epics.adaravis import AravisDetector +from ophyd_async.epics.adcore import ADWriterFactory from ophyd_async.epics.admerlin import MerlinDetector from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline @@ -44,18 +45,16 @@ def sample_xyz_lab_fa_stage() -> XYZStage: @devices.factory() def side_camera(path_provider: PathProvider) -> AravisDetector: return AravisDetector( - prefix=f"{PREFIX}-OP-FLOAT-03:", + f"{PREFIX}-OP-FLOAT-03:", + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix="HDF5:"), driver_suffix="CAM:", - writer_suffix="HDF5:", - path_provider=path_provider, ) @devices.factory() def merlin(path_provider: PathProvider) -> MerlinDetector: return MerlinDetector( - prefix=f"{PREFIX}-EA-DET-04:", + f"{PREFIX}-EA-DET-04:", + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix="HDF5:"), driver_suffix="CAM:", - writer_suffix="HDF5:", - path_provider=path_provider, ) diff --git a/src/dodal/beamlines/i15_1.py b/src/dodal/beamlines/i15_1.py index ba2cebd8640..7e5ffcf78e1 100644 --- a/src/dodal/beamlines/i15_1.py +++ b/src/dodal/beamlines/i15_1.py @@ -3,7 +3,7 @@ from daq_config_server import ConfigClient from ophyd_async.core import PathProvider, StaticPathProvider, UUIDFilenameProvider -from ophyd_async.epics.adcore import ADWriterType, ContAcqDetector, NDPluginBaseIO +from ophyd_async.epics.adcore import ADWriterFactory, ContAcqDetector, NDPluginBaseIO from ophyd_async.epics.motor import Motor from ophyd_async.fastcs.eiger import EigerDetector @@ -318,11 +318,9 @@ def zebra() -> Zebra: def webcam_1(path_provider: PathProvider) -> ContAcqDetector: return ContAcqDetector( f"{PREFIX.beamline_prefix}-DI-WEB-01:", - path_provider=path_provider, + ADWriterFactory.jpeg(path_provider=path_provider, writer_suffix="JPEG:"), driver_suffix=CAM_SUFFIX, cb_suffix="CIRC:", - writer_type=ADWriterType.JPEG, - writer_suffix="JPEG:", ) @@ -330,11 +328,9 @@ def webcam_1(path_provider: PathProvider) -> ContAcqDetector: def webcam_2(path_provider: PathProvider) -> ContAcqDetector: return ContAcqDetector( f"{PREFIX.beamline_prefix}-DI-WEB-02:", - path_provider=path_provider, + ADWriterFactory.jpeg(path_provider=path_provider, writer_suffix="JPEG:"), driver_suffix=CAM_SUFFIX, cb_suffix="CIRC:", - writer_type=ADWriterType.JPEG, - writer_suffix="JPEG:", ) @@ -342,11 +338,9 @@ def webcam_2(path_provider: PathProvider) -> ContAcqDetector: def cam_1(path_provider: PathProvider) -> ContAcqDetector: return ContAcqDetector( f"{PREFIX.beamline_prefix}-DI-CAM-01:", - path_provider=path_provider, + ADWriterFactory.jpeg(path_provider=path_provider, writer_suffix="JPEG:"), driver_suffix=CAM_SUFFIX, cb_suffix="CIRC:", - writer_type=ADWriterType.JPEG, - writer_suffix="JPEG:", ) @@ -354,11 +348,9 @@ def cam_1(path_provider: PathProvider) -> ContAcqDetector: def cam_2(path_provider: PathProvider) -> ContAcqDetector: return ContAcqDetector( f"{PREFIX.beamline_prefix}-DI-CAM-02:", - path_provider=path_provider, + ADWriterFactory.jpeg(path_provider=path_provider, writer_suffix="JPEG:"), driver_suffix=CAM_SUFFIX, cb_suffix="CIRC:", - writer_type=ADWriterType.JPEG, - writer_suffix="JPEG:", ) @@ -366,9 +358,7 @@ def cam_2(path_provider: PathProvider) -> ContAcqDetector: def cam_3(path_provider: PathProvider) -> ContAcqDetector: return ContAcqDetector( f"{PREFIX.beamline_prefix}-DI-CAM-03:", - path_provider=path_provider, + ADWriterFactory.jpeg(path_provider=path_provider, writer_suffix="JPEG:"), driver_suffix=CAM_SUFFIX, cb_suffix="CIRC:", - writer_type=ADWriterType.JPEG, - writer_suffix="JPEG:", ) diff --git a/src/dodal/beamlines/i23.py b/src/dodal/beamlines/i23.py index a4bb22bc70d..6f2ac517c7e 100644 --- a/src/dodal/beamlines/i23.py +++ b/src/dodal/beamlines/i23.py @@ -3,6 +3,7 @@ from daq_config_server import ConfigClient from ophyd_async.core import InOut, PathProvider, StrictEnum +from ophyd_async.epics.adcore import ADWriterFactory from ophyd_async.epics.adpilatus import PilatusDetector from dodal.beamlines.aithre import DISPLAY_CONFIG, ZOOM_PARAMS_FILE @@ -103,10 +104,9 @@ def zebra() -> Zebra: @devices.factory() def pilatus(path_provider: PathProvider) -> PilatusDetector: return PilatusDetector( - prefix=f"{PREFIX.beamline_prefix}-EA-PILAT-01:", - path_provider=path_provider, + f"{PREFIX.beamline_prefix}-EA-PILAT-01:", + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix="cam1:", - writer_suffix=HDF5_SUFFIX, ) diff --git a/src/dodal/beamlines/p38.py b/src/dodal/beamlines/p38.py index f6e9d542006..7e7800fc312 100644 --- a/src/dodal/beamlines/p38.py +++ b/src/dodal/beamlines/p38.py @@ -4,6 +4,7 @@ from daq_config_server import ConfigClient from ophyd_async.core import PathProvider from ophyd_async.epics.adaravis import AravisDetector +from ophyd_async.epics.adcore import ADWriterFactory from ophyd_async.fastcs.panda import HDFPanda from dodal.common.beamlines.beamline_utils import ( @@ -60,9 +61,11 @@ def path_provider() -> PathProvider: def d3(path_provider: PathProvider) -> AravisDetector: return AravisDetector( f"{PREFIX.beamline_prefix}-DI-DCAM-01:", + ADWriterFactory.hdf( + path_provider=path_provider, + writer_suffix=HDF5_SUFFIX, + ), driver_suffix="DET:", - writer_suffix=HDF5_SUFFIX, - path_provider=path_provider, ) @@ -71,9 +74,8 @@ def d3(path_provider: PathProvider) -> AravisDetector: def d11(path_provider: PathProvider) -> AravisDetector: return AravisDetector( f"{PREFIX.beamline_prefix}-DI-DCAM-03:", + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix="DET:", - writer_suffix=HDF5_SUFFIX, - path_provider=path_provider, ) @@ -81,9 +83,8 @@ def d11(path_provider: PathProvider) -> AravisDetector: def d12(path_provider: PathProvider) -> AravisDetector: return AravisDetector( f"{PREFIX.beamline_prefix}-DI-DCAM-04:", + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix="DET:", - writer_suffix=HDF5_SUFFIX, - path_provider=path_provider, ) diff --git a/src/dodal/beamlines/p45.py b/src/dodal/beamlines/p45.py index ce55ad0240b..e7f6286d05e 100644 --- a/src/dodal/beamlines/p45.py +++ b/src/dodal/beamlines/p45.py @@ -3,6 +3,7 @@ from ophyd_async.core import PathProvider from ophyd_async.epics.adaravis import AravisDetector +from ophyd_async.epics.adcore import ADWriterFactory from ophyd_async.fastcs.panda import HDFPanda from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline @@ -46,9 +47,8 @@ def choppers() -> XYStage: def det(path_provider: PathProvider) -> AravisDetector: return AravisDetector( f"{PREFIX.beamline_prefix}-EA-MAP-01:", + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix=DET_SUFFIX, - writer_suffix=HDF5_SUFFIX, - path_provider=path_provider, ) @@ -57,9 +57,8 @@ def det(path_provider: PathProvider) -> AravisDetector: def diff(path_provider: PathProvider) -> AravisDetector: return AravisDetector( f"{PREFIX.beamline_prefix}-EA-DIFF-01:", + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix=DET_SUFFIX, - writer_suffix=HDF5_SUFFIX, - path_provider=path_provider, ) diff --git a/src/dodal/beamlines/p99.py b/src/dodal/beamlines/p99.py index 3510dee107f..b9a7197c714 100644 --- a/src/dodal/beamlines/p99.py +++ b/src/dodal/beamlines/p99.py @@ -3,6 +3,7 @@ from ophyd_async.core import PathProvider from ophyd_async.epics.adandor import AndorDetector +from ophyd_async.epics.adcore import ADWriterFactory from ophyd_async.fastcs.panda import HDFPanda from dodal.common.beamlines.beamline_utils import set_beamline @@ -63,10 +64,9 @@ def lab_stage() -> XYZStage: def andor2_det(path_provider: PathProvider) -> AndorDetector: """Andor model:DU897_BV.""" return AndorDetector( - prefix=f"{PREFIX.beamline_prefix}-EA-DET-03:", + f"{PREFIX.beamline_prefix}-EA-DET-03:", + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix=CAM_SUFFIX, - writer_suffix=HDF5_SUFFIX, - path_provider=path_provider, ) diff --git a/src/dodal/beamlines/training_rig.py b/src/dodal/beamlines/training_rig.py index b8b9462df58..5948f68d517 100644 --- a/src/dodal/beamlines/training_rig.py +++ b/src/dodal/beamlines/training_rig.py @@ -3,6 +3,7 @@ from ophyd_async.core import PathProvider, StaticPathProvider, UUIDFilenameProvider from ophyd_async.epics.adaravis import AravisDetector +from ophyd_async.epics.adcore import ADWriterFactory from ophyd_async.fastcs.panda import HDFPanda from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline @@ -46,9 +47,8 @@ def sample_stage() -> XThetaStage: def det(path_provider: PathProvider) -> AravisDetector: return AravisDetector( f"{PREFIX.beamline_prefix}-EA-DET-01:", - path_provider=path_provider, + ADWriterFactory.hdf(path_provider=path_provider, writer_suffix=HDF5_SUFFIX), driver_suffix=DET_SUFFIX, - writer_suffix=HDF5_SUFFIX, ) diff --git a/src/dodal/devices/beamlines/b16/detector.py b/src/dodal/devices/beamlines/b16/detector.py index 77cd135db64..f096746466d 100644 --- a/src/dodal/devices/beamlines/b16/detector.py +++ b/src/dodal/devices/beamlines/b16/detector.py @@ -4,7 +4,7 @@ from ophyd_async.epics.adcore import ( ADAcquireLogic, ADBaseIO, - ADWriterType, + ADWriterFactory, AreaDetector, prepare_exposures, ) @@ -37,11 +37,9 @@ def software_triggered_tiff_area_detector( """ driver = ADBaseIO(prefix + CAM_SUFFIX) return AreaDetector( - prefix=prefix, - driver=driver, + driver, + prefix, + ADWriterFactory.tiff(path_provider=path_provider, writer_suffix=TIFF_SUFFIX), acquire_logic=ADAcquireLogic(driver), trigger_logic=TiffTriggerLogic(driver, deadtime), - path_provider=path_provider, - writer_type=ADWriterType.TIFF, - writer_suffix=TIFF_SUFFIX, ) diff --git a/src/dodal/devices/beamlines/i11/mythen.py b/src/dodal/devices/beamlines/i11/mythen.py index 1a31439c8c8..fd0199a4aea 100644 --- a/src/dodal/devices/beamlines/i11/mythen.py +++ b/src/dodal/devices/beamlines/i11/mythen.py @@ -3,7 +3,6 @@ from ophyd_async.core import ( DetectorTriggerLogic, - PathProvider, SignalRW, StrictEnum, ) @@ -11,7 +10,7 @@ ADAcquireLogic, ADBaseIO, ADImageMode, - ADWriterType, + ADWriterFactory, AreaDetector, ) from ophyd_async.epics.core import PvSuffix @@ -132,21 +131,17 @@ class Mythen3(AreaDetector[Mythen3Driver]): def __init__( self, prefix: str, - path_provider: PathProvider, + writer_factory: ADWriterFactory, drv_suffix: str = DET_SUFFIX, - writer_type: ADWriterType = ADWriterType.HDF, - writer_suffix: str | None = "HDF:", name: str = "", ): self.driver = Mythen3Driver(prefix + drv_suffix) super().__init__( - prefix=prefix, - driver=self.driver, + self.driver, + prefix, + writer_factory, acquire_logic=ADAcquireLogic(self.driver), trigger_logic=Mythen3TriggerLogic(self.driver), - path_provider=path_provider, - writer_type=writer_type, - writer_suffix=writer_suffix, name=name, ) diff --git a/src/dodal/devices/beamlines/i21/toolpoint_motion.py b/src/dodal/devices/beamlines/i21/toolpoint_motion.py index cbc8fca636c..88953d0100a 100644 --- a/src/dodal/devices/beamlines/i21/toolpoint_motion.py +++ b/src/dodal/devices/beamlines/i21/toolpoint_motion.py @@ -3,7 +3,7 @@ from math import cos, radians, sin import numpy as np -from bluesky.protocols import Movable +from bluesky.protocols import Checkable, Movable from ophyd_async.core import ( AsyncStatus, Reference, @@ -84,7 +84,11 @@ def xyz_to_uvw( ) -class ToolPointMotion(StandardReadable, Movable): +class ToolPointMotion( + StandardReadable, + Movable[XYZTiltAzimuthMotorPositions], + Checkable[XYZTiltAzimuthMotorPositions], +): """Virtual manipulator translations of the sample stage. It is mounted on top of the diffractometer and circles tilt and azimuth angles. It defines three virtual axes u, v, and w as signals. @@ -106,17 +110,13 @@ def __init__( super().__init__(name=name) - async def check_motor_limits( - self, start: XYZTiltAzimuthMotorPositions, end: XYZTiltAzimuthMotorPositions - ) -> None: + async def check_value(self, value: XYZTiltAzimuthMotorPositions) -> None: await asyncio.gather( - self.smp_ref().x.check_motor_limit(start.x, end.x), - self.smp_ref().y.check_motor_limit(start.y, end.y), - self.smp_ref().z.check_motor_limit(start.z, end.z), - self.smp_ref().tilt.check_motor_limit(start.tilt_deg, end.tilt_deg), - self.smp_ref().azimuth.check_motor_limit( - start.azimuth_deg, end.azimuth_deg - ), + self.smp_ref().x.check_value(value.x), + self.smp_ref().y.check_value(value.y), + self.smp_ref().z.check_value(value.z), + self.smp_ref().tilt.check_value(value.tilt_deg), + self.smp_ref().azimuth.check_value(value.azimuth_deg), ) async def _get_xyz_motor_positions( @@ -142,7 +142,7 @@ async def _write_all_uvw(self, uvw_pos: UVWTiltAzimuthMotorPositions) -> None: xyz_start = await self._get_xyz_motor_positions() xyz_end = uvw_to_xyz(uvw_pos, self._zero) - await self.check_motor_limits(xyz_start, xyz_end) + await asyncio.gather(self.check_value(xyz_start), self.check_value(xyz_end)) await asyncio.gather( self.smp_ref().x.set(xyz_end.x), self.smp_ref().y.set(xyz_end.y), diff --git a/src/dodal/devices/beamlines/i22/nxsas.py b/src/dodal/devices/beamlines/i22/nxsas.py index 389d29f06a8..d6156d227ce 100644 --- a/src/dodal/devices/beamlines/i22/nxsas.py +++ b/src/dodal/devices/beamlines/i22/nxsas.py @@ -5,7 +5,7 @@ from event_model.documents.event_descriptor import DataKey from ophyd_async.core import PathProvider, merge_gathered_dicts from ophyd_async.epics.adaravis import AravisDetector -from ophyd_async.epics.adcore import NDPluginBaseIO +from ophyd_async.epics.adcore import ADWriterFactory, NDPluginBaseIO from ophyd_async.epics.adpilatus import PilatusDetector ValueAndUnits = tuple[float, str] @@ -97,9 +97,10 @@ def __init__( """ super().__init__( prefix, - path_provider, + ADWriterFactory.hdf( + path_provider=path_provider, writer_suffix=writer_suffix + ), driver_suffix=driver_suffix, - writer_suffix=writer_suffix, name=name, ) self._metadata_holder = metadata_holder @@ -141,9 +142,10 @@ def __init__( """ super().__init__( prefix, - path_provider, + ADWriterFactory.hdf( + path_provider=path_provider, writer_suffix=writer_suffix + ), driver_suffix=driver_suffix, - writer_suffix=writer_suffix, name=name, ) self._metadata_holder = metadata_holder diff --git a/src/dodal/devices/insertion_device/apple2_undulator.py b/src/dodal/devices/insertion_device/apple2_undulator.py index a190751868e..1bc30b5f8b0 100644 --- a/src/dodal/devices/insertion_device/apple2_undulator.py +++ b/src/dodal/devices/insertion_device/apple2_undulator.py @@ -1,6 +1,7 @@ import abc import asyncio from dataclasses import dataclass +from functools import cached_property from typing import Generic, TypeVar import numpy as np @@ -10,6 +11,7 @@ AsyncStatus, Device, FlyMotorInfo, + MovableLogic, Reference, SignalR, SignalW, @@ -21,7 +23,7 @@ wait_for_value, ) from ophyd_async.epics.core import epics_signal_r, epics_signal_rw -from ophyd_async.epics.motor import Motor +from ophyd_async.epics.motor import Motor, MotorMoveLogic from dodal.common.enums import EnabledDisabledUpper from dodal.devices.insertion_device.enum import UndulatorGateStatus @@ -113,6 +115,13 @@ async def set(self, value: T) -> None: await wait_for_value(self.gate, UndulatorGateStatus.CLOSE, timeout=timeout) +@dataclass +class UnstoppableMotorMoveLogic(MotorMoveLogic): + async def stop(self): + """Request to stop moving.""" + LOGGER.warning(f"Stopping {self.readback.name} is not supported.") + + class UnstoppableMotor(Motor): """A motor that does not support stop.""" @@ -120,8 +129,20 @@ def __init__(self, prefix: str, name: str = ""): super().__init__(prefix=prefix, name=name) del self.motor_stop # Remove motor_stop from the public interface - async def stop(self, success=False): - LOGGER.warning(f"Stopping {self.name} is not supported.") + @cached_property + def movable_logic(self) -> MovableLogic: + return UnstoppableMotorMoveLogic( + readback=self.user_readback, + setpoint=self.user_setpoint, + # Safe to do, stop method no longer calls stop signal in movable logic. + motor_stop=None, # type: ignore + low_limit_travel=self.low_limit_travel, + high_limit_travel=self.high_limit_travel, + dial_low_limit_travel=self.dial_low_limit_travel, + dial_high_limit_travel=self.dial_high_limit_travel, + velocity=self.velocity, + acceleration_time=self.acceleration_time, + ) class GapSafeMotorNoStop(UnstoppableMotor, UndulatorBase[float]): diff --git a/src/dodal/devices/smargon.py b/src/dodal/devices/smargon.py index ffc08d20483..6a4e98bf8bc 100644 --- a/src/dodal/devices/smargon.py +++ b/src/dodal/devices/smargon.py @@ -132,9 +132,7 @@ async def set(self, value: CombinedMove): for motor_name, new_setpoint in value.items(): if new_setpoint is not None and isinstance(new_setpoint, int | float): axis = getattr(self, motor_name) - await axis.check_motor_limit( - await axis.user_setpoint.get_value(), new_setpoint - ) + await axis.check_value(new_setpoint) put_completion = await set_and_wait_for_value( axis.user_setpoint, new_setpoint, diff --git a/src/dodal/devices/tetramm.py b/src/dodal/devices/tetramm.py index baa0f8074a9..218c2ff14a5 100644 --- a/src/dodal/devices/tetramm.py +++ b/src/dodal/devices/tetramm.py @@ -182,7 +182,7 @@ def _get_num_channels(num_channels: TetrammChannels) -> int: # when in new ophyd-async version with this change. driver=self.driver, # type: ignore path_provider=path_provider, - description=NDArrayDescription( + array_description=NDArrayDescription( shape_signals=[self.num_channels, self.driver.to_average], data_type_signal=self.driver.data_type, color_mode_signal=self.driver.color_mode, diff --git a/tests/beamlines/test_b16.py b/tests/beamlines/test_b16.py index 612687a7645..27546907ff0 100644 --- a/tests/beamlines/test_b16.py +++ b/tests/beamlines/test_b16.py @@ -2,7 +2,6 @@ import pytest from ophyd_async.core import SignalDict -from ophyd_async.epics.adcore import ADWriterType from dodal.common.beamlines.device_helpers import CAM_SUFFIX, TIFF_SUFFIX from dodal.devices.beamlines.b16.detector import ( @@ -26,6 +25,9 @@ def test_software_triggered_tiff_area_detector_calls_with_io_correctly(): patch( "dodal.devices.beamlines.b16.detector.ADAcquireLogic" ) as mock_acquire_logic, + patch( + "dodal.devices.beamlines.b16.detector.ADWriterFactory" + ) as mock_writer_factory, ): mock_acquire_logic_instance = MagicMock(name="ADAcquireLogic") mock_acquire_logic.return_value = mock_acquire_logic_instance @@ -57,16 +59,17 @@ def test_software_triggered_tiff_area_detector_calls_with_io_correctly(): default_deadtime, ) + mock_writer_factory.tiff.assert_called_once_with( + path_provider=mock_path_provider, writer_suffix=TIFF_SUFFIX + ) # Assert AreaDetector constructed with correct arguments mock_area_detector.assert_called_once_with( - prefix=prefix, - driver=mock_driver_instance, + mock_driver_instance, + prefix, # writer=mock_writer, - trigger_logic=mock_tiff_trigger_logic_instance, - path_provider=mock_path_provider, + mock_writer_factory.tiff.return_value, acquire_logic=mock_acquire_logic_instance, - writer_type=ADWriterType.TIFF, - writer_suffix=TIFF_SUFFIX, + trigger_logic=mock_tiff_trigger_logic_instance, ) # The function should return the AreaDetector instance diff --git a/tests/devices/beamlines/i21/test_toolpoint_motion.py b/tests/devices/beamlines/i21/test_toolpoint_motion.py index a1caceb7afa..5e92b0cfc12 100644 --- a/tests/devices/beamlines/i21/test_toolpoint_motion.py +++ b/tests/devices/beamlines/i21/test_toolpoint_motion.py @@ -196,35 +196,29 @@ async def test_uvw_set(uvw: ToolPointMotion) -> None: assert await uvw.smp_ref().tilt.user_readback.get_value() == pos.tilt_deg -async def test_uvw_check_motor_limits_calls_all_motors( +async def test_uvw_check_value_calls_all_motors( uvw: ToolPointMotion, ) -> None: smp = uvw.smp_ref() - smp.x.check_motor_limit = AsyncMock() - smp.y.check_motor_limit = AsyncMock() - smp.z.check_motor_limit = AsyncMock() - smp.tilt.check_motor_limit = AsyncMock() - smp.azimuth.check_motor_limit = AsyncMock() + smp.x.check_value = AsyncMock() + smp.y.check_value = AsyncMock() + smp.z.check_value = AsyncMock() + smp.tilt.check_value = AsyncMock() + smp.azimuth.check_value = AsyncMock() - start = XYZTiltAzimuthMotorPositions( + values = XYZTiltAzimuthMotorPositions( x=1.0, y=2.0, z=3.0, tilt_deg=10.0, azimuth_deg=20.0 ) - end = XYZTiltAzimuthMotorPositions( - x=4.0, y=5.0, z=6.0, tilt_deg=30.0, azimuth_deg=40.0 - ) + await uvw.check_value(values) - await uvw.check_motor_limits(start, end) - - smp.x.check_motor_limit.assert_awaited_once_with(start.x, end.x) - smp.y.check_motor_limit.assert_awaited_once_with(start.y, end.y) - smp.z.check_motor_limit.assert_awaited_once_with(start.z, end.z) - smp.tilt.check_motor_limit.assert_awaited_once_with(start.tilt_deg, end.tilt_deg) - smp.azimuth.check_motor_limit.assert_awaited_once_with( - start.azimuth_deg, end.azimuth_deg - ) + smp.x.check_value.assert_awaited_once_with(values.x) + smp.y.check_value.assert_awaited_once_with(values.y) + smp.z.check_value.assert_awaited_once_with(values.z) + smp.tilt.check_value.assert_awaited_once_with(values.tilt_deg) + smp.azimuth.check_value.assert_awaited_once_with(values.azimuth_deg) -async def test_check_motor_limits_raises_on_failure( +async def test_check_values_raises_on_failure( uvw: ToolPointMotion, ) -> None: set_mock_value(uvw.smp_ref().z.high_limit_travel, 500) @@ -238,4 +232,5 @@ async def test_check_motor_limits_raises_on_failure( ) with pytest.raises(MotorLimitsError): - await uvw.check_motor_limits(start, end) + await uvw.check_value(start) + await uvw.check_value(end) diff --git a/tests/plans/test_configure_arm_trigger_and_disarm_detector.py b/tests/plans/test_configure_arm_trigger_and_disarm_detector.py index a3d4f21ba62..17c8fdd6f0a 100644 --- a/tests/plans/test_configure_arm_trigger_and_disarm_detector.py +++ b/tests/plans/test_configure_arm_trigger_and_disarm_detector.py @@ -6,7 +6,7 @@ from ophyd_async.core import ( DetectorTrigger, TriggerInfo, - callback_on_mock_put, + callback_on_mock_execute, get_mock, set_mock_value, ) @@ -47,7 +47,7 @@ def set_detector_into_writing_state(*args, **kwargs) -> None: set_mock_value(fake_eiger.od.acquisition_id, filename) set_mock_value(fake_eiger.detector.state, "idle") - callback_on_mock_put( + callback_on_mock_execute( fake_eiger.od.fp.start_writing, set_detector_into_writing_state ) @@ -55,7 +55,7 @@ def set_detector_into_writing_state(*args, **kwargs) -> None: def set_frames_written(*args, **kwargs) -> None: set_mock_value(fake_eiger.od.fp.frames_written, 1) - callback_on_mock_put(fake_eiger.detector.trigger, set_frames_written) + callback_on_mock_execute(fake_eiger.detector.trigger, set_frames_written) run_engine( configure_arm_trigger_and_disarm_detector( diff --git a/uv.lock b/uv.lock index 9c5a1a98966..74c3589c83a 100644 --- a/uv.lock +++ b/uv.lock @@ -696,7 +696,7 @@ wheels = [ [[package]] name = "daq-config-server" -version = "1.3.3.dev4+g0b988e177" +version = "1.3.3" source = { git = "https://github.com/DiamondLightSource/daq-config-server.git?rev=main#0b988e177f949a8c6d8a0c2bf5faf1c4c3352b94" } dependencies = [ { name = "cachetools" }, @@ -820,7 +820,7 @@ requires-dist = [ { name = "numpy" }, { name = "opencv-python-headless" }, { name = "ophyd" }, - { name = "ophyd-async", extras = ["ca", "pva"], specifier = ">=0.17a5" }, + { name = "ophyd-async", extras = ["ca", "pva"], specifier = ">=0.19.1" }, { name = "pillow" }, { name = "pydantic", specifier = ">=2.0" }, { name = "pyepics" }, @@ -839,7 +839,7 @@ dev = [ { name = "ispyb" }, { name = "mypy" }, { name = "myst-parser" }, - { name = "ophyd-async", extras = ["sim"], specifier = ">=0.14.0" }, + { name = "ophyd-async", extras = ["sim"], specifier = ">=0.19.1" }, { name = "pre-commit" }, { name = "psutil" }, { name = "pydata-sphinx-theme", specifier = ">=0.12" }, @@ -2252,7 +2252,7 @@ wheels = [ [[package]] name = "ophyd-async" -version = "0.17a5" +version = "0.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bluesky" }, @@ -2266,9 +2266,9 @@ dependencies = [ { name = "stamina" }, { name = "velocity-profile" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1d/3c/127aeba71467a5dab69d21cbdcc7a7dfe294e826f6883af0b741ace01dbe/ophyd_async-0.17a5.tar.gz", hash = "sha256:f0eb30de946148479a1e33822e535542f47da0d9854da7d5ffa579990f650508", size = 557024, upload-time = "2026-05-20T08:21:08.682Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/a5/1811d2cb16ca2a0aa0830a119ae55cd8b3435acd821b68eebe430524502d/ophyd_async-0.19.1.tar.gz", hash = "sha256:a98f3514e159b3777b9eaf3b9417a2238c4fefc5c657a82cb043174c569acc37", size = 588480, upload-time = "2026-06-11T19:09:20.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/a7/a87c4f373082674d2429af6912d2b0c113269063ee089eeb400effcc6bb6/ophyd_async-0.17a5-py3-none-any.whl", hash = "sha256:8175483b6ce5823cc3aff358afdd370bc08e1b2caf9f9e0cc4af9dc5b1802d8b", size = 208907, upload-time = "2026-05-20T08:21:06.899Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a3/b4605ee05a6a3480ad57cf0ac15e381f99189b022362f0c08044c86227d7/ophyd_async-0.19.1-py3-none-any.whl", hash = "sha256:bb4cc6751aee46e53c588b493ce0a8905c94fbf4b5092af2f774019846af7c74", size = 228222, upload-time = "2026-06-11T19:09:18.712Z" }, ] [package.optional-dependencies]