From 87289952de3dd1181144085c3122615b6ec550d8 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 27 Nov 2024 16:33:38 +0000 Subject: [PATCH 001/122] Create bimorph_mirrors dir with __init__.py --- src/dodal/devices/bimorph_mirrors/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/dodal/devices/bimorph_mirrors/__init__.py diff --git a/src/dodal/devices/bimorph_mirrors/__init__.py b/src/dodal/devices/bimorph_mirrors/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From ec85bd853bb4501a80a5b728628123e5fb10d73f Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 27 Nov 2024 16:40:18 +0000 Subject: [PATCH 002/122] Create bimorph_mirror.py with basic class structure --- src/dodal/devices/bimorph_mirrors/bimorph_mirror.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/dodal/devices/bimorph_mirrors/bimorph_mirror.py diff --git a/src/dodal/devices/bimorph_mirrors/bimorph_mirror.py b/src/dodal/devices/bimorph_mirrors/bimorph_mirror.py new file mode 100644 index 0000000000..5b4cd5f891 --- /dev/null +++ b/src/dodal/devices/bimorph_mirrors/bimorph_mirror.py @@ -0,0 +1,7 @@ +from bluesky.protocols import Movable +from ophyd_async.core import StandardReadable + + +class BimorphMirror(StandardReadable, Movable): + def __init__(self, prefix: str, name="", number_of_channels: int): + ... From 62f5488d025b91d0bfde51698ab77344b3d626af Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 27 Nov 2024 16:52:06 +0000 Subject: [PATCH 003/122] Add VOUT_RBV channel creation to __init__ --- src/dodal/devices/bimorph_mirrors/bimorph_mirror.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirrors/bimorph_mirror.py b/src/dodal/devices/bimorph_mirrors/bimorph_mirror.py index 5b4cd5f891..93aaefb32b 100644 --- a/src/dodal/devices/bimorph_mirrors/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirrors/bimorph_mirror.py @@ -1,7 +1,15 @@ from bluesky.protocols import Movable from ophyd_async.core import StandardReadable +from ophyd_async.core import StandardReadableFormat as Format +from ophyd_async.epics.core import epics_signal_r class BimorphMirror(StandardReadable, Movable): - def __init__(self, prefix: str, name="", number_of_channels: int): - ... + def __init__(self, prefix: str, name="", number_of_channels: int = 0): + self.number_of_channels = number_of_channels + + with self.add_children_as_readables(Format.HINTED_SIGNAL): + self._vout_rbv_channels = [ + epics_signal_r(float, prefix + "C" + str(i+1) + ":VOUT_RBV") + for i in range(number_of_channels) + ] From 6bd8b073ab0b3e03e576d841ce653702e4dfad1b Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 10:47:02 +0000 Subject: [PATCH 004/122] Move bimorph_mirror.py out of bimorph_mirrors directory --- src/dodal/devices/{bimorph_mirrors => }/bimorph_mirror.py | 0 src/dodal/devices/bimorph_mirrors/__init__.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/dodal/devices/{bimorph_mirrors => }/bimorph_mirror.py (100%) delete mode 100644 src/dodal/devices/bimorph_mirrors/__init__.py diff --git a/src/dodal/devices/bimorph_mirrors/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py similarity index 100% rename from src/dodal/devices/bimorph_mirrors/bimorph_mirror.py rename to src/dodal/devices/bimorph_mirror.py diff --git a/src/dodal/devices/bimorph_mirrors/__init__.py b/src/dodal/devices/bimorph_mirrors/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 From 70a75f5b6874f862f143b9a2f08946c3bba9d00f Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 11:15:44 +0000 Subject: [PATCH 005/122] Create BimorphMirrorChannel with vout_rbv SignalR --- src/dodal/devices/bimorph_mirror.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 93aaefb32b..16f526f006 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -1,7 +1,13 @@ +from typing import Annotated as A + from bluesky.protocols import Movable -from ophyd_async.core import StandardReadable +from ophyd_async.core import SignalR, StandardReadable from ophyd_async.core import StandardReadableFormat as Format -from ophyd_async.epics.core import epics_signal_r +from ophyd_async.epics.core import PvSuffix, epics_signal_r + + +class BimorphMirrorChannel(StandardReadable): + vout_rbv: A[SignalR[float], PvSuffix("VOUT_RBV"), Format.HINTED_SIGNAL] class BimorphMirror(StandardReadable, Movable): @@ -10,6 +16,6 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): with self.add_children_as_readables(Format.HINTED_SIGNAL): self._vout_rbv_channels = [ - epics_signal_r(float, prefix + "C" + str(i+1) + ":VOUT_RBV") + epics_signal_r(float, prefix + "C" + str(i + 1) + ":VOUT_RBV") for i in range(number_of_channels) ] From 4a129a25a1233eb04635b2d46b431d9679a17b34 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 11:24:49 +0000 Subject: [PATCH 006/122] Change BimorphMirrorChannel child creation to procedural --- src/dodal/devices/bimorph_mirror.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 16f526f006..3281e60e75 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -7,7 +7,9 @@ class BimorphMirrorChannel(StandardReadable): - vout_rbv: A[SignalR[float], PvSuffix("VOUT_RBV"), Format.HINTED_SIGNAL] + def __init__(self, prefix: str, name=""): + with self.add_children_as_readables(Format.HINTED_SIGNAL): + self.vout_rbv = epics_signal_r(float, f"{prefix}:VOUT_RBV") class BimorphMirror(StandardReadable, Movable): From 82ec40607596256173590e0d06c4a6a9bfec2cf0 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 11:33:18 +0000 Subject: [PATCH 007/122] Replace BimorphMirror child decleration to use BimorphMirrorChannel --- src/dodal/devices/bimorph_mirror.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 3281e60e75..b8782a5b3a 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -1,7 +1,7 @@ from typing import Annotated as A from bluesky.protocols import Movable -from ophyd_async.core import SignalR, StandardReadable +from ophyd_async.core import DeviceVector, SignalR, StandardReadable from ophyd_async.core import StandardReadableFormat as Format from ophyd_async.epics.core import PvSuffix, epics_signal_r @@ -17,7 +17,9 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.number_of_channels = number_of_channels with self.add_children_as_readables(Format.HINTED_SIGNAL): - self._vout_rbv_channels = [ - epics_signal_r(float, prefix + "C" + str(i + 1) + ":VOUT_RBV") - for i in range(number_of_channels) - ] + self.channels = DeviceVector( + { + i: BimorphMirrorChannel(f"{prefix}:C{i}", f"channel{i}") + for i in range(1, number_of_channels + 1) + } + ) From 9bb6e50e825cc7014c6b4c32b5e196cabb425437 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 11:33:44 +0000 Subject: [PATCH 008/122] Remove unused imports --- src/dodal/devices/bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index b8782a5b3a..a5230e511f 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -1,9 +1,9 @@ from typing import Annotated as A from bluesky.protocols import Movable -from ophyd_async.core import DeviceVector, SignalR, StandardReadable +from ophyd_async.core import DeviceVector, StandardReadable from ophyd_async.core import StandardReadableFormat as Format -from ophyd_async.epics.core import PvSuffix, epics_signal_r +from ophyd_async.epics.core import epics_signal_r class BimorphMirrorChannel(StandardReadable): From c6ab0dd4b90f38fb29d0e3a08f6811d757e927ff Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 11:35:26 +0000 Subject: [PATCH 009/122] Remove unused import --- src/dodal/devices/bimorph_mirror.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index a5230e511f..3656d10cc3 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -1,5 +1,3 @@ -from typing import Annotated as A - from bluesky.protocols import Movable from ophyd_async.core import DeviceVector, StandardReadable from ophyd_async.core import StandardReadableFormat as Format @@ -12,7 +10,7 @@ def __init__(self, prefix: str, name=""): self.vout_rbv = epics_signal_r(float, f"{prefix}:VOUT_RBV") -class BimorphMirror(StandardReadable, Movable): +class BimorphMirror(StandardReadable): def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.number_of_channels = number_of_channels From b615c948c0196fb1785fca8ebcff1f7ef192f2db Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 11:41:32 +0000 Subject: [PATCH 010/122] Remove uneccesary Format in add_children_as_readables --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 3656d10cc3..aa92849bb7 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -14,7 +14,7 @@ class BimorphMirror(StandardReadable): def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.number_of_channels = number_of_channels - with self.add_children_as_readables(Format.HINTED_SIGNAL): + with self.add_children_as_readables(): self.channels = DeviceVector( { i: BimorphMirrorChannel(f"{prefix}:C{i}", f"channel{i}") From 3f265bf467171e23f82d83489b55253439041829 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 13:08:52 +0000 Subject: [PATCH 011/122] Add super().__init__ call --- src/dodal/devices/bimorph_mirror.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index aa92849bb7..756173feaf 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -9,6 +9,8 @@ def __init__(self, prefix: str, name=""): with self.add_children_as_readables(Format.HINTED_SIGNAL): self.vout_rbv = epics_signal_r(float, f"{prefix}:VOUT_RBV") + super().__init__(name=name) + class BimorphMirror(StandardReadable): def __init__(self, prefix: str, name="", number_of_channels: int = 0): @@ -21,3 +23,4 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): for i in range(1, number_of_channels + 1) } ) + super().__init__(name=name) From 24cf9d93d82871f604b333a9dec292a9af7287af Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 14:19:54 +0000 Subject: [PATCH 012/122] Add VTRGT_RBV, STATUS to BimorphMirrorChannel --- src/dodal/devices/bimorph_mirror.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 756173feaf..f7b123f4a9 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -7,7 +7,9 @@ class BimorphMirrorChannel(StandardReadable): def __init__(self, prefix: str, name=""): with self.add_children_as_readables(Format.HINTED_SIGNAL): + self.vtrgt_rbv = epics_signal_r(float, f"{prefix}:VTRGT_RBV") self.vout_rbv = epics_signal_r(float, f"{prefix}:VOUT_RBV") + self.status = epics_signal_r(float, f"{prefix}:STATUS") super().__init__(name=name) From 5b105237c6ece3119b842504eca0e4f565775f34 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 15:14:12 +0000 Subject: [PATCH 013/122] Add BimorphMirror.set method --- src/dodal/devices/bimorph_mirror.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index f7b123f4a9..2543efe1c3 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -1,20 +1,21 @@ +import asyncio + from bluesky.protocols import Movable -from ophyd_async.core import DeviceVector, StandardReadable +from ophyd_async.core import AsyncStatus, DeviceVector, StandardReadable, wait_for_value from ophyd_async.core import StandardReadableFormat as Format -from ophyd_async.epics.core import epics_signal_r +from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv, epics_signal_x class BimorphMirrorChannel(StandardReadable): def __init__(self, prefix: str, name=""): with self.add_children_as_readables(Format.HINTED_SIGNAL): - self.vtrgt_rbv = epics_signal_r(float, f"{prefix}:VTRGT_RBV") - self.vout_rbv = epics_signal_r(float, f"{prefix}:VOUT_RBV") + self.vtrgt = epics_signal_rw_rbv(float, f"{prefix}:VTRGT") + self.vout = epics_signal_rw_rbv(float, f"{prefix}:VOUT") self.status = epics_signal_r(float, f"{prefix}:STATUS") super().__init__(name=name) - -class BimorphMirror(StandardReadable): +class BimorphMirror(StandardReadable, Movable): def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.number_of_channels = number_of_channels @@ -25,4 +26,20 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): for i in range(1, number_of_channels + 1) } ) + self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") + super().__init__(name=name) + + @AsyncStatus.wrap + async def set(self, value: dict[int, float]): + await asyncio.gather( + *[self.channels.get(i).vtrgt.set(target) for i, target in value.items()] + ) + await self.alltrgt_proc.trigger() + + await asyncio.gather( + *[ + wait_for_value(self.channels.get(i).vtrgt, target, None) + for i, target in value.items() + ] + ) From fcec361c09b7b0e4b5771a04d4492f7977cf8d8a Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 15:24:37 +0000 Subject: [PATCH 014/122] Add bimorph test file --- .../devices/unit_tests/test_bimorph_mirror.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 tests/devices/unit_tests/test_bimorph_mirror.py diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py new file mode 100644 index 0000000000..ac8c93be3f --- /dev/null +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -0,0 +1,24 @@ +import asyncio + +from bluesky.run_engine import RunEngine +from ophyd_async.core import DeviceCollector + +from dodal.devices.bimorph_mirror import BimorphMirror + +RE = RunEngine() + + +async def async_main(): + with DeviceCollector(mock=True): + bm = BimorphMirror(prefix="BL02J-EA-IOC-97:G0", number_of_channels=8) + out = await bm.read() + print(out) + + await bm.set({1: 10.0}) + print("\n") + + out = await bm.read() + print(out) + + +asyncio.run(async_main()) From e7e8021533756f398e635c1141f6e32dbbfa652d Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 15:28:55 +0000 Subject: [PATCH 015/122] Fix STATUS type --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 2543efe1c3..c799af481b 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -11,7 +11,7 @@ def __init__(self, prefix: str, name=""): with self.add_children_as_readables(Format.HINTED_SIGNAL): self.vtrgt = epics_signal_rw_rbv(float, f"{prefix}:VTRGT") self.vout = epics_signal_rw_rbv(float, f"{prefix}:VOUT") - self.status = epics_signal_r(float, f"{prefix}:STATUS") + self.status = epics_signal_r(str, f"{prefix}:STATUS") super().__init__(name=name) From 3944b78215d0430e6b4e74b72df2c81b8fee1454 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 28 Nov 2024 15:38:29 +0000 Subject: [PATCH 016/122] Make BimorphMirror.set await values in VOUT_RBV --- src/dodal/devices/bimorph_mirror.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index c799af481b..03bd1efaa5 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -27,6 +27,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): } ) self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") + self.status = epics_signal_r(str, f"{prefix}:STATUS") super().__init__(name=name) @@ -35,7 +36,6 @@ async def set(self, value: dict[int, float]): await asyncio.gather( *[self.channels.get(i).vtrgt.set(target) for i, target in value.items()] ) - await self.alltrgt_proc.trigger() await asyncio.gather( *[ @@ -43,3 +43,12 @@ async def set(self, value: dict[int, float]): for i, target in value.items() ] ) + + await self.alltrgt_proc.trigger() + + await asyncio.gather( + *[ + wait_for_value(self.channels.get(i).vout, target, None) + for i, target in value.items() + ] + ) From 31397610df37ded56e811f28b429be5005e0752a Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 08:41:37 +0000 Subject: [PATCH 017/122] Add assertion that channel exists to BimorphMirror.set --- src/dodal/devices/bimorph_mirror.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 03bd1efaa5..bc9f16c652 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -33,6 +33,9 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): @AsyncStatus.wrap async def set(self, value: dict[int, float]): + for i in value.keys(): + assert self.channels.get(i) is not None + await asyncio.gather( *[self.channels.get(i).vtrgt.set(target) for i, target in value.items()] ) From 503aa0a3855d529eb20061db1b749a726531db36 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 08:52:53 +0000 Subject: [PATCH 018/122] Replace .get with square brackets in BimorphMirror.set to avoid typing errors --- src/dodal/devices/bimorph_mirror.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index bc9f16c652..286642fad4 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -12,6 +12,7 @@ def __init__(self, prefix: str, name=""): self.vtrgt = epics_signal_rw_rbv(float, f"{prefix}:VTRGT") self.vout = epics_signal_rw_rbv(float, f"{prefix}:VOUT") self.status = epics_signal_r(str, f"{prefix}:STATUS") + super().__init__(name=name) @@ -37,12 +38,12 @@ async def set(self, value: dict[int, float]): assert self.channels.get(i) is not None await asyncio.gather( - *[self.channels.get(i).vtrgt.set(target) for i, target in value.items()] + *[self.channels[i].vtrgt.set(target) for i, target in value.items()] ) await asyncio.gather( *[ - wait_for_value(self.channels.get(i).vtrgt, target, None) + wait_for_value(self.channels[i].vtrgt, target, None) for i, target in value.items() ] ) @@ -51,7 +52,7 @@ async def set(self, value: dict[int, float]): await asyncio.gather( *[ - wait_for_value(self.channels.get(i).vout, target, None) + wait_for_value(self.channels[i].vout, target, None) for i, target in value.items() ] ) From a4fd4d379113bd7fcec71fb6c34f597a53374c50 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 08:59:41 +0000 Subject: [PATCH 019/122] Add BimorphMirrorChannel.shift --- src/dodal/devices/bimorph_mirror.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 286642fad4..6837b8a99e 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -3,7 +3,7 @@ from bluesky.protocols import Movable from ophyd_async.core import AsyncStatus, DeviceVector, StandardReadable, wait_for_value from ophyd_async.core import StandardReadableFormat as Format -from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv, epics_signal_x +from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv, epics_signal_x, epics_signal_w class BimorphMirrorChannel(StandardReadable): @@ -13,6 +13,7 @@ def __init__(self, prefix: str, name=""): self.vout = epics_signal_rw_rbv(float, f"{prefix}:VOUT") self.status = epics_signal_r(str, f"{prefix}:STATUS") + self.shift = epics_signal_w(float, f"{prefix}:SHIFT") super().__init__(name=name) From bebf9748f935d7445726e05db142e7b26d57f381 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 09:02:15 +0000 Subject: [PATCH 020/122] Add BimorphMirror.all_shift, .add_volt --- src/dodal/devices/bimorph_mirror.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 6837b8a99e..153b9ea810 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -30,6 +30,8 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): ) self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") self.status = epics_signal_r(str, f"{prefix}:STATUS") + self.all_shift = epics_signal_w(float, f"{prefix}:ALLSHIFT") + self.all_volt = epics_signal_w(float, f"{prefix}:ALLVOLT") super().__init__(name=name) From 81870c622c622d9c09ed75b6eb975d970d6e9f03 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 09:05:09 +0000 Subject: [PATCH 021/122] Add BimorphMirror.channels, .status, .temps --- src/dodal/devices/bimorph_mirror.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 153b9ea810..bb536fef7b 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -32,6 +32,9 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.status = epics_signal_r(str, f"{prefix}:STATUS") self.all_shift = epics_signal_w(float, f"{prefix}:ALLSHIFT") self.all_volt = epics_signal_w(float, f"{prefix}:ALLVOLT") + self.channels = epics_signal_r(float, f"{prefix}:CHANNELS") + self.status = epics_signal_r(str, f"{prefix}:STATUS") + self.temps = epics_signal_r(str, f"{prefix}:TEMPS") super().__init__(name=name) From 5bdaf89f4c42781a1bdbda26345c799b49f768ff Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 09:11:09 +0000 Subject: [PATCH 022/122] Rename previous BimorphMirror.channels to BimorphMirror.channel_list to avoid member name clash --- src/dodal/devices/bimorph_mirror.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index bb536fef7b..67cea72bdb 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -22,7 +22,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.number_of_channels = number_of_channels with self.add_children_as_readables(): - self.channels = DeviceVector( + self.channel_list = DeviceVector( { i: BimorphMirrorChannel(f"{prefix}:C{i}", f"channel{i}") for i in range(1, number_of_channels + 1) @@ -41,15 +41,15 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): @AsyncStatus.wrap async def set(self, value: dict[int, float]): for i in value.keys(): - assert self.channels.get(i) is not None + assert self.channel_list.get(i) is not None await asyncio.gather( - *[self.channels[i].vtrgt.set(target) for i, target in value.items()] + *[self.channel_list[i].vtrgt.set(target) for i, target in value.items()] ) await asyncio.gather( *[ - wait_for_value(self.channels[i].vtrgt, target, None) + wait_for_value(self.channel_list[i].vtrgt, target, None) for i, target in value.items() ] ) @@ -58,7 +58,7 @@ async def set(self, value: dict[int, float]): await asyncio.gather( *[ - wait_for_value(self.channels[i].vout, target, None) + wait_for_value(self.channel_list[i].vout, target, None) for i, target in value.items() ] ) From 8c17c91da17cac2dad85b9453021aaf020a37e6e Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 09:16:31 +0000 Subject: [PATCH 023/122] Add BimorphMirror.reset_err_proc, .err --- src/dodal/devices/bimorph_mirror.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 67cea72bdb..18a37950f9 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -36,6 +36,9 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.status = epics_signal_r(str, f"{prefix}:STATUS") self.temps = epics_signal_r(str, f"{prefix}:TEMPS") + self.reset_err_proc = epics_signal_x(f"{prefix}:RESETERR.PROC") + self.err = epics_signal_r(str, f"{prefix}:ERR") + super().__init__(name=name) @AsyncStatus.wrap From b6df119134a30cd2df30249cd015a9d61502c9fe Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 09:24:05 +0000 Subject: [PATCH 024/122] Add BimorphOnOff Strict Enum --- src/dodal/devices/bimorph_mirror.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 18a37950f9..0e23adfa94 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -1,10 +1,13 @@ import asyncio from bluesky.protocols import Movable -from ophyd_async.core import AsyncStatus, DeviceVector, StandardReadable, wait_for_value +from ophyd_async.core import AsyncStatus, DeviceVector, StandardReadable, StrictEnum, wait_for_value from ophyd_async.core import StandardReadableFormat as Format from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv, epics_signal_x, epics_signal_w +class BimorphMirrorOnOff(StrictEnum): + ON="ON" + OFF="OFF" class BimorphMirrorChannel(StandardReadable): def __init__(self, prefix: str, name=""): @@ -35,7 +38,6 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.channels = epics_signal_r(float, f"{prefix}:CHANNELS") self.status = epics_signal_r(str, f"{prefix}:STATUS") self.temps = epics_signal_r(str, f"{prefix}:TEMPS") - self.reset_err_proc = epics_signal_x(f"{prefix}:RESETERR.PROC") self.err = epics_signal_r(str, f"{prefix}:ERR") From 182321735a5feb45ba81a1a6ac8613ce34cdd82c Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 09:25:17 +0000 Subject: [PATCH 025/122] Add BimorphMirror.on_off --- src/dodal/devices/bimorph_mirror.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 0e23adfa94..0521d7ed05 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -31,6 +31,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): for i in range(1, number_of_channels + 1) } ) + self.on_off = epics_signal_w(StrictEnum, f"{prefix}:ONOFF") self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") self.status = epics_signal_r(str, f"{prefix}:STATUS") self.all_shift = epics_signal_w(float, f"{prefix}:ALLSHIFT") From a21690685495e4ebe3bbdd6ac9e570ffb634d49e Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:05:19 +0000 Subject: [PATCH 026/122] Add BimorphMirrorMode StrictEnum --- src/dodal/devices/bimorph_mirror.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 0521d7ed05..224219be18 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -5,10 +5,18 @@ from ophyd_async.core import StandardReadableFormat as Format from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv, epics_signal_x, epics_signal_w + class BimorphMirrorOnOff(StrictEnum): ON="ON" OFF="OFF" + +class BimorphMirrorMode(StrictEnum): + HI="HI" + NORMAL="NORMAL" + FAST="FAST" + + class BimorphMirrorChannel(StandardReadable): def __init__(self, prefix: str, name=""): with self.add_children_as_readables(Format.HINTED_SIGNAL): From e9916c2de62726a9f83adf084f0f59446a5d4533 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:06:56 +0000 Subject: [PATCH 027/122] Add BimorphMirror.op_mode --- src/dodal/devices/bimorph_mirror.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 224219be18..3dad107ab6 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -41,6 +41,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): ) self.on_off = epics_signal_w(StrictEnum, f"{prefix}:ONOFF") self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") + self.op_mode = epics_signal_rw_rbv(BimorphMirrorMode, f"{prefix}:OPMODE") self.status = epics_signal_r(str, f"{prefix}:STATUS") self.all_shift = epics_signal_w(float, f"{prefix}:ALLSHIFT") self.all_volt = epics_signal_w(float, f"{prefix}:ALLVOLT") From 586714683db3e9cad70b66fa3c357cdd68d11767 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:07:45 +0000 Subject: [PATCH 028/122] Change BimorphMirror.on_off datatype to BimorphMirrorOnOff rather than StrictEnum --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 3dad107ab6..cec90dd7ac 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -39,7 +39,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): for i in range(1, number_of_channels + 1) } ) - self.on_off = epics_signal_w(StrictEnum, f"{prefix}:ONOFF") + self.on_off = epics_signal_w(BimorphMirrorOnOff, f"{prefix}:ONOFF") self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") self.op_mode = epics_signal_rw_rbv(BimorphMirrorMode, f"{prefix}:OPMODE") self.status = epics_signal_r(str, f"{prefix}:STATUS") From 916d909f77eab5905e42f2acf19af84072b64b74 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:44:25 +0000 Subject: [PATCH 029/122] Add docstrings --- src/dodal/devices/bimorph_mirror.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index cec90dd7ac..d15d04850a 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -18,6 +18,14 @@ class BimorphMirrorMode(StrictEnum): class BimorphMirrorChannel(StandardReadable): + """Collection of PVs comprising a single bimorph channel. + + Attributes: + vtrgt: Float RW_RBV for target voltage, which can be set using parent mirror's all target proc + vout: Float RW_RBV for current voltage on bimorph + status: String readable for ON/OFF status of channel + shift: Float writeable shifting channel voltage + """ def __init__(self, prefix: str, name=""): with self.add_children_as_readables(Format.HINTED_SIGNAL): self.vtrgt = epics_signal_rw_rbv(float, f"{prefix}:VTRGT") @@ -28,7 +36,22 @@ def __init__(self, prefix: str, name=""): super().__init__(name=name) + class BimorphMirror(StandardReadable, Movable): + """Class to represent CAENels Bimorph Mirrors. + + Attributes: + number_of_channels: Non-ophyd int holding number_of_channels passed into __init__ + channel_list: DeviceVector of BimorphMirrorChannel, indexed from 1, for each channel + on_off: Writeable BimorphOnOff + alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT + op_mode: RW_RBV BimorphMirrorMode mirror operation mode + status: Readable str Busy/Idle status + temps: Readable str board temperature + reset_err_proc: Procable to reset alarm status + err: Alarm status + + """ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.number_of_channels = number_of_channels @@ -55,6 +78,10 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): @AsyncStatus.wrap async def set(self, value: dict[int, float]): + """Sets bimorph voltages in parrallel via target voltage and all proc. + + Args: + value: Dict of channel numbers to target voltages""" for i in value.keys(): assert self.channel_list.get(i) is not None From ea19f02c385ed0b88497618e060c174a3fba2503 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:45:53 +0000 Subject: [PATCH 030/122] Remove uneccesary signals from BimorphMirror --- src/dodal/devices/bimorph_mirror.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index d15d04850a..7b23a17ca7 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -45,10 +45,8 @@ class BimorphMirror(StandardReadable, Movable): channel_list: DeviceVector of BimorphMirrorChannel, indexed from 1, for each channel on_off: Writeable BimorphOnOff alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT - op_mode: RW_RBV BimorphMirrorMode mirror operation mode status: Readable str Busy/Idle status temps: Readable str board temperature - reset_err_proc: Procable to reset alarm status err: Alarm status """ @@ -64,14 +62,10 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): ) self.on_off = epics_signal_w(BimorphMirrorOnOff, f"{prefix}:ONOFF") self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") - self.op_mode = epics_signal_rw_rbv(BimorphMirrorMode, f"{prefix}:OPMODE") self.status = epics_signal_r(str, f"{prefix}:STATUS") - self.all_shift = epics_signal_w(float, f"{prefix}:ALLSHIFT") - self.all_volt = epics_signal_w(float, f"{prefix}:ALLVOLT") self.channels = epics_signal_r(float, f"{prefix}:CHANNELS") self.status = epics_signal_r(str, f"{prefix}:STATUS") self.temps = epics_signal_r(str, f"{prefix}:TEMPS") - self.reset_err_proc = epics_signal_x(f"{prefix}:RESETERR.PROC") self.err = epics_signal_r(str, f"{prefix}:ERR") super().__init__(name=name) From 0794a9b89c11f21101b599d83a027751bc8a6a6a Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:46:39 +0000 Subject: [PATCH 031/122] Add missing attribute to docstring --- src/dodal/devices/bimorph_mirror.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 7b23a17ca7..f939c31e6e 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -46,6 +46,7 @@ class BimorphMirror(StandardReadable, Movable): on_off: Writeable BimorphOnOff alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT status: Readable str Busy/Idle status + channels: Number of channels temps: Readable str board temperature err: Alarm status From c2cbf88231ecdec6228f962dbef41a3f48545277 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:46:55 +0000 Subject: [PATCH 032/122] Remove duplicate signal decleration --- src/dodal/devices/bimorph_mirror.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index f939c31e6e..4eb5e1c270 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -65,7 +65,6 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") self.status = epics_signal_r(str, f"{prefix}:STATUS") self.channels = epics_signal_r(float, f"{prefix}:CHANNELS") - self.status = epics_signal_r(str, f"{prefix}:STATUS") self.temps = epics_signal_r(str, f"{prefix}:TEMPS") self.err = epics_signal_r(str, f"{prefix}:ERR") From 90a842c86ade0fa9e774381c936d0c0749a34b41 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:47:50 +0000 Subject: [PATCH 033/122] Remove uneccesary BimorphMirror signal --- src/dodal/devices/bimorph_mirror.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 4eb5e1c270..007c0e8dd2 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -47,7 +47,6 @@ class BimorphMirror(StandardReadable, Movable): alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT status: Readable str Busy/Idle status channels: Number of channels - temps: Readable str board temperature err: Alarm status """ @@ -65,7 +64,6 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") self.status = epics_signal_r(str, f"{prefix}:STATUS") self.channels = epics_signal_r(float, f"{prefix}:CHANNELS") - self.temps = epics_signal_r(str, f"{prefix}:TEMPS") self.err = epics_signal_r(str, f"{prefix}:ERR") super().__init__(name=name) From bd405eba795a389394cbf3e67750dfc5e42262e6 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:50:13 +0000 Subject: [PATCH 034/122] Change BimorphMirrorChannel.status to datatype BimorphMirrorOnOff --- src/dodal/devices/bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 007c0e8dd2..d89b1da04f 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -23,14 +23,14 @@ class BimorphMirrorChannel(StandardReadable): Attributes: vtrgt: Float RW_RBV for target voltage, which can be set using parent mirror's all target proc vout: Float RW_RBV for current voltage on bimorph - status: String readable for ON/OFF status of channel + status: BimorphMirrorOnOff readable for ON/OFF status of channel shift: Float writeable shifting channel voltage """ def __init__(self, prefix: str, name=""): with self.add_children_as_readables(Format.HINTED_SIGNAL): self.vtrgt = epics_signal_rw_rbv(float, f"{prefix}:VTRGT") self.vout = epics_signal_rw_rbv(float, f"{prefix}:VOUT") - self.status = epics_signal_r(str, f"{prefix}:STATUS") + self.status = epics_signal_r(BimorphMirrorOnOff, f"{prefix}:STATUS") self.shift = epics_signal_w(float, f"{prefix}:SHIFT") From 20e976893fb0a53c125130d53fde6b3d4ecb73c7 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:52:49 +0000 Subject: [PATCH 035/122] Add BimorphMirrorStatus, set as BimorphMirror.status datatype --- src/dodal/devices/bimorph_mirror.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index d89b1da04f..d08f148044 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -17,6 +17,12 @@ class BimorphMirrorMode(StrictEnum): FAST="FAST" +class BimorphMirrorStatus(StrictEnum): + IDLE = "Idle" + BUSY = "Busy" + ERROR = "Error" + + class BimorphMirrorChannel(StandardReadable): """Collection of PVs comprising a single bimorph channel. @@ -45,7 +51,7 @@ class BimorphMirror(StandardReadable, Movable): channel_list: DeviceVector of BimorphMirrorChannel, indexed from 1, for each channel on_off: Writeable BimorphOnOff alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT - status: Readable str Busy/Idle status + status: Readable BimorphMirrorStatus Busy/Idle status channels: Number of channels err: Alarm status @@ -62,7 +68,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): ) self.on_off = epics_signal_w(BimorphMirrorOnOff, f"{prefix}:ONOFF") self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") - self.status = epics_signal_r(str, f"{prefix}:STATUS") + self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}:STATUS") self.channels = epics_signal_r(float, f"{prefix}:CHANNELS") self.err = epics_signal_r(str, f"{prefix}:ERR") From 0f9a08120e4bd6f80cc225b5d31395c9bfed466c Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 10:54:12 +0000 Subject: [PATCH 036/122] Change BimorphMirror.channels datatype to str --- src/dodal/devices/bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index d08f148044..e817b42382 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -52,7 +52,7 @@ class BimorphMirror(StandardReadable, Movable): on_off: Writeable BimorphOnOff alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT status: Readable BimorphMirrorStatus Busy/Idle status - channels: Number of channels + channels: Readable str number of channels err: Alarm status """ @@ -69,7 +69,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.on_off = epics_signal_w(BimorphMirrorOnOff, f"{prefix}:ONOFF") self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}:STATUS") - self.channels = epics_signal_r(float, f"{prefix}:CHANNELS") + self.channels = epics_signal_r(str, f"{prefix}:CHANNELS") self.err = epics_signal_r(str, f"{prefix}:ERR") super().__init__(name=name) From 3ff0a06c9c5c4a53ec6091120bc2dedb4d3d7e5c Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 11:25:03 +0000 Subject: [PATCH 037/122] Change BimorphMirrorChannel to declare all signals declaratively --- src/dodal/devices/bimorph_mirror.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index e817b42382..964e97707c 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -1,9 +1,10 @@ +from typing import Annotated as A import asyncio from bluesky.protocols import Movable -from ophyd_async.core import AsyncStatus, DeviceVector, StandardReadable, StrictEnum, wait_for_value +from ophyd_async.core import AsyncStatus, DeviceVector, SignalR, SignalRW, SignalW, StandardReadable, StrictEnum, wait_for_value from ophyd_async.core import StandardReadableFormat as Format -from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv, epics_signal_x, epics_signal_w +from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv, epics_signal_x, epics_signal_w, PvSuffix class BimorphMirrorOnOff(StrictEnum): @@ -32,15 +33,11 @@ class BimorphMirrorChannel(StandardReadable): status: BimorphMirrorOnOff readable for ON/OFF status of channel shift: Float writeable shifting channel voltage """ - def __init__(self, prefix: str, name=""): - with self.add_children_as_readables(Format.HINTED_SIGNAL): - self.vtrgt = epics_signal_rw_rbv(float, f"{prefix}:VTRGT") - self.vout = epics_signal_rw_rbv(float, f"{prefix}:VOUT") - self.status = epics_signal_r(BimorphMirrorOnOff, f"{prefix}:STATUS") - - self.shift = epics_signal_w(float, f"{prefix}:SHIFT") - super().__init__(name=name) + vtrgt: A[SignalRW[float], PvSuffix(":VTRGT", "VTRGT"), Format.HINTED_SIGNAL] + vout: A[SignalRW[float], PvSuffix(":VOUT", "VOUT"), Format.HINTED_SIGNAL] + status: A[SignalR[BimorphMirrorOnOff], PvSuffix(":STATUS"), Format.HINTED_SIGNAL] + shift: A[SignalW[float], PvSuffix(":STATUS")] class BimorphMirror(StandardReadable, Movable): From 5b7325b0d8672fd238cd921e1e58c6d202fa6918 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 11:25:49 +0000 Subject: [PATCH 038/122] Remove uneccesary argument --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 964e97707c..3695dee704 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -59,7 +59,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): with self.add_children_as_readables(): self.channel_list = DeviceVector( { - i: BimorphMirrorChannel(f"{prefix}:C{i}", f"channel{i}") + i: BimorphMirrorChannel(f"{prefix}:C{i}") for i in range(1, number_of_channels + 1) } ) From 664d6366f2bd6623de6c4ec2b7b738e918042752 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 11:28:16 +0000 Subject: [PATCH 039/122] Move all PV delimiters from suffix into prefix --- src/dodal/devices/bimorph_mirror.py | 20 +++++++++---------- .../devices/unit_tests/test_bimorph_mirror.py | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 3695dee704..314f60fa85 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -34,10 +34,10 @@ class BimorphMirrorChannel(StandardReadable): shift: Float writeable shifting channel voltage """ - vtrgt: A[SignalRW[float], PvSuffix(":VTRGT", "VTRGT"), Format.HINTED_SIGNAL] - vout: A[SignalRW[float], PvSuffix(":VOUT", "VOUT"), Format.HINTED_SIGNAL] - status: A[SignalR[BimorphMirrorOnOff], PvSuffix(":STATUS"), Format.HINTED_SIGNAL] - shift: A[SignalW[float], PvSuffix(":STATUS")] + vtrgt: A[SignalRW[float], PvSuffix("VTRGT", "VTRGT"), Format.HINTED_SIGNAL] + vout: A[SignalRW[float], PvSuffix("VOUT", "VOUT"), Format.HINTED_SIGNAL] + status: A[SignalR[BimorphMirrorOnOff], PvSuffix("STATUS"), Format.HINTED_SIGNAL] + shift: A[SignalW[float], PvSuffix("STATUS")] class BimorphMirror(StandardReadable, Movable): @@ -59,15 +59,15 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): with self.add_children_as_readables(): self.channel_list = DeviceVector( { - i: BimorphMirrorChannel(f"{prefix}:C{i}") + i: BimorphMirrorChannel(f"{prefix}C{i}:") for i in range(1, number_of_channels + 1) } ) - self.on_off = epics_signal_w(BimorphMirrorOnOff, f"{prefix}:ONOFF") - self.alltrgt_proc = epics_signal_x(f"{prefix}:ALLTRGT.PROC") - self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}:STATUS") - self.channels = epics_signal_r(str, f"{prefix}:CHANNELS") - self.err = epics_signal_r(str, f"{prefix}:ERR") + self.on_off = epics_signal_w(BimorphMirrorOnOff, f"{prefix}ONOFF") + self.alltrgt_proc = epics_signal_x(f"{prefix}ALLTRGT.PROC") + self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}STATUS") + self.channels = epics_signal_r(str, f"{prefix}CHANNELS") + self.err = epics_signal_r(str, f"{prefix}ERR") super().__init__(name=name) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index ac8c93be3f..0a36623139 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -10,7 +10,7 @@ async def async_main(): with DeviceCollector(mock=True): - bm = BimorphMirror(prefix="BL02J-EA-IOC-97:G0", number_of_channels=8) + bm = BimorphMirror(prefix="BL02J-EA-IOC-97:G0:", number_of_channels=8) out = await bm.read() print(out) From a2327a576643d5d2a605173bb6a31be631527e80 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 11:31:28 +0000 Subject: [PATCH 040/122] Fix incorrect use of PVSuffix --- src/dodal/devices/bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 314f60fa85..6a642df14c 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -34,8 +34,8 @@ class BimorphMirrorChannel(StandardReadable): shift: Float writeable shifting channel voltage """ - vtrgt: A[SignalRW[float], PvSuffix("VTRGT", "VTRGT"), Format.HINTED_SIGNAL] - vout: A[SignalRW[float], PvSuffix("VOUT", "VOUT"), Format.HINTED_SIGNAL] + vtrgt: A[SignalRW[float], PvSuffix.rbv("VTRGT"), Format.HINTED_SIGNAL] + vout: A[SignalRW[float], PvSuffix.rbv("VOUT"), Format.HINTED_SIGNAL] status: A[SignalR[BimorphMirrorOnOff], PvSuffix("STATUS"), Format.HINTED_SIGNAL] shift: A[SignalW[float], PvSuffix("STATUS")] From 521963f93068d239d8282b4359bffa90058c50a7 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 11:50:21 +0000 Subject: [PATCH 041/122] Make BimorphMirrorChannel inherit from EpicsDevice --- src/dodal/devices/bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 6a642df14c..550dea6519 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -4,7 +4,7 @@ from bluesky.protocols import Movable from ophyd_async.core import AsyncStatus, DeviceVector, SignalR, SignalRW, SignalW, StandardReadable, StrictEnum, wait_for_value from ophyd_async.core import StandardReadableFormat as Format -from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv, epics_signal_x, epics_signal_w, PvSuffix +from ophyd_async.epics.core import EpicsDevice, epics_signal_r, epics_signal_rw_rbv, epics_signal_x, epics_signal_w, PvSuffix class BimorphMirrorOnOff(StrictEnum): @@ -24,7 +24,7 @@ class BimorphMirrorStatus(StrictEnum): ERROR = "Error" -class BimorphMirrorChannel(StandardReadable): +class BimorphMirrorChannel(StandardReadable, EpicsDevice): """Collection of PVs comprising a single bimorph channel. Attributes: From 7199a8c92f4b212e8460175a4b040d9f559176a1 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 11:50:43 +0000 Subject: [PATCH 042/122] Remove :CHANNELS signal from BimorphMirror --- src/dodal/devices/bimorph_mirror.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 550dea6519..97c4a4cbb7 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -49,7 +49,6 @@ class BimorphMirror(StandardReadable, Movable): on_off: Writeable BimorphOnOff alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT status: Readable BimorphMirrorStatus Busy/Idle status - channels: Readable str number of channels err: Alarm status """ @@ -66,7 +65,6 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.on_off = epics_signal_w(BimorphMirrorOnOff, f"{prefix}ONOFF") self.alltrgt_proc = epics_signal_x(f"{prefix}ALLTRGT.PROC") self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}STATUS") - self.channels = epics_signal_r(str, f"{prefix}CHANNELS") self.err = epics_signal_r(str, f"{prefix}ERR") super().__init__(name=name) From 051f23e05e87046c3a26d50c424b37b8e3a8094f Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 11:51:23 +0000 Subject: [PATCH 043/122] Rename BimorphMirror.channel_list to .channels --- src/dodal/devices/bimorph_mirror.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 97c4a4cbb7..924bb9a450 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -45,7 +45,7 @@ class BimorphMirror(StandardReadable, Movable): Attributes: number_of_channels: Non-ophyd int holding number_of_channels passed into __init__ - channel_list: DeviceVector of BimorphMirrorChannel, indexed from 1, for each channel + channels: DeviceVector of BimorphMirrorChannel, indexed from 1, for each channel on_off: Writeable BimorphOnOff alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT status: Readable BimorphMirrorStatus Busy/Idle status @@ -56,7 +56,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.number_of_channels = number_of_channels with self.add_children_as_readables(): - self.channel_list = DeviceVector( + self.channels = DeviceVector( { i: BimorphMirrorChannel(f"{prefix}C{i}:") for i in range(1, number_of_channels + 1) @@ -76,15 +76,15 @@ async def set(self, value: dict[int, float]): Args: value: Dict of channel numbers to target voltages""" for i in value.keys(): - assert self.channel_list.get(i) is not None + assert self.channels.get(i) is not None await asyncio.gather( - *[self.channel_list[i].vtrgt.set(target) for i, target in value.items()] + *[self.channels[i].vtrgt.set(target) for i, target in value.items()] ) await asyncio.gather( *[ - wait_for_value(self.channel_list[i].vtrgt, target, None) + wait_for_value(self.channels[i].vtrgt, target, None) for i, target in value.items() ] ) @@ -93,7 +93,7 @@ async def set(self, value: dict[int, float]): await asyncio.gather( *[ - wait_for_value(self.channel_list[i].vout, target, None) + wait_for_value(self.channels[i].vout, target, None) for i, target in value.items() ] ) From 2dc2bab956163d72d81ec4818bd15da08132e1d8 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 11:52:11 +0000 Subject: [PATCH 044/122] Remove unused import --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 924bb9a450..126b7a418b 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -4,7 +4,7 @@ from bluesky.protocols import Movable from ophyd_async.core import AsyncStatus, DeviceVector, SignalR, SignalRW, SignalW, StandardReadable, StrictEnum, wait_for_value from ophyd_async.core import StandardReadableFormat as Format -from ophyd_async.epics.core import EpicsDevice, epics_signal_r, epics_signal_rw_rbv, epics_signal_x, epics_signal_w, PvSuffix +from ophyd_async.epics.core import EpicsDevice, epics_signal_r, epics_signal_x, epics_signal_w, PvSuffix class BimorphMirrorOnOff(StrictEnum): From f827c0544f81907c36ae5c49a362ccf71b801bba Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 14:40:52 +0000 Subject: [PATCH 045/122] Replace BimorphMirror.set wait on rbv with wait=True --- src/dodal/devices/bimorph_mirror.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 126b7a418b..ae68d7ab39 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -79,14 +79,7 @@ async def set(self, value: dict[int, float]): assert self.channels.get(i) is not None await asyncio.gather( - *[self.channels[i].vtrgt.set(target) for i, target in value.items()] - ) - - await asyncio.gather( - *[ - wait_for_value(self.channels[i].vtrgt, target, None) - for i, target in value.items() - ] + *[self.channels[i].vtrgt.set(target, wait=True) for i, target in value.items()] ) await self.alltrgt_proc.trigger() From 3af9f884ea0e578b5ae1d0f0b3a5f8c0a8b799c9 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 14:41:12 +0000 Subject: [PATCH 046/122] Add bimorph test_set_channels --- .../devices/unit_tests/test_bimorph_mirror.py | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 0a36623139..1285ec43b2 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -1,24 +1,23 @@ import asyncio +import pytest from bluesky.run_engine import RunEngine from ophyd_async.core import DeviceCollector from dodal.devices.bimorph_mirror import BimorphMirror -RE = RunEngine() - - -async def async_main(): +@pytest.fixture +def mirror(RE: RunEngine) -> BimorphMirror: with DeviceCollector(mock=True): bm = BimorphMirror(prefix="BL02J-EA-IOC-97:G0:", number_of_channels=8) - out = await bm.read() - print(out) + + return bm - await bm.set({1: 10.0}) - print("\n") - out = await bm.read() - print(out) +async def test_set_channels(mirror: BimorphMirror): + value = {2:50.0, 8:24.0} + await mirror.set(value) -asyncio.run(async_main()) + assert (await mirror.channels[2].vout.get_value()) == 50.0 + assert (await mirror.channels[8].vout.get_value()) == 24.0 From bd868380ed10fa6c1176b883f99443304c125d25 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 14:43:17 +0000 Subject: [PATCH 047/122] Organise imports --- src/dodal/devices/bimorph_mirror.py | 21 ++++++++++++++++--- .../devices/unit_tests/test_bimorph_mirror.py | 3 ++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index ae68d7ab39..9fcc33cd01 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -1,10 +1,25 @@ -from typing import Annotated as A import asyncio +from typing import Annotated as A from bluesky.protocols import Movable -from ophyd_async.core import AsyncStatus, DeviceVector, SignalR, SignalRW, SignalW, StandardReadable, StrictEnum, wait_for_value +from ophyd_async.core import ( + AsyncStatus, + DeviceVector, + SignalR, + SignalRW, + SignalW, + StandardReadable, + StrictEnum, + wait_for_value, +) from ophyd_async.core import StandardReadableFormat as Format -from ophyd_async.epics.core import EpicsDevice, epics_signal_r, epics_signal_x, epics_signal_w, PvSuffix +from ophyd_async.epics.core import ( + EpicsDevice, + PvSuffix, + epics_signal_r, + epics_signal_w, + epics_signal_x, +) class BimorphMirrorOnOff(StrictEnum): diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 1285ec43b2..a9d394590b 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -1,11 +1,12 @@ import asyncio -import pytest +import pytest from bluesky.run_engine import RunEngine from ophyd_async.core import DeviceCollector from dodal.devices.bimorph_mirror import BimorphMirror + @pytest.fixture def mirror(RE: RunEngine) -> BimorphMirror: with DeviceCollector(mock=True): From 5a7cfa8cb13ad6da78a9630e39cdd9fbc63111ca Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 15:14:33 +0000 Subject: [PATCH 048/122] Make wait_for_value in BimorphMirror.set use DEFAULT_TIMEOUT instead of None --- src/dodal/devices/bimorph_mirror.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 9fcc33cd01..b2903a1cb2 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -3,6 +3,7 @@ from bluesky.protocols import Movable from ophyd_async.core import ( + DEFAULT_TIMEOUT, AsyncStatus, DeviceVector, SignalR, @@ -101,7 +102,7 @@ async def set(self, value: dict[int, float]): await asyncio.gather( *[ - wait_for_value(self.channels[i].vout, target, None) + wait_for_value(self.channels[i].vout, target, timeout=DEFAULT_TIMEOUT) for i, target in value.items() ] ) From d0156c00b34c030a0cca4842703e64014418054c Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 15:15:31 +0000 Subject: [PATCH 049/122] Rename test_set_channels, fix said test, and add test_set_channels_triggers_alltrgt_proc --- .../devices/unit_tests/test_bimorph_mirror.py | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index a9d394590b..6090b1c34c 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -2,7 +2,7 @@ import pytest from bluesky.run_engine import RunEngine -from ophyd_async.core import DeviceCollector +from ophyd_async.core import DeviceCollector, get_mock_put, set_mock_value from dodal.devices.bimorph_mirror import BimorphMirror @@ -15,10 +15,27 @@ def mirror(RE: RunEngine) -> BimorphMirror: return bm -async def test_set_channels(mirror: BimorphMirror): - value = {2:50.0, 8:24.0} +async def test_set_channels_waits_for_readback(mirror: BimorphMirror): + value = {2: 50.0, 8: 24.0} + set_mock_value(mirror.channels[2].vout, 50.0) + set_mock_value(mirror.channels[8].vout, 24.0) await mirror.set(value) - assert (await mirror.channels[2].vout.get_value()) == 50.0 - assert (await mirror.channels[8].vout.get_value()) == 24.0 + assert (await mirror.channels[2].vtrgt.get_value()) == 50.0 + assert (await mirror.channels[8].vtrgt.get_value()) == 24.0 + + +async def test_set_channels_triggers_alltrgt_proc(mirror: BimorphMirror): + value = {2: 50.0, 8: 24.0} + + mock_alltrgt_proc = get_mock_put(mirror.alltrgt_proc) + + set_mock_value(mirror.channels[2].vout, 50.0) + set_mock_value(mirror.channels[8].vout, 24.0) + + mock_alltrgt_proc.assert_not_called() + + await mirror.set(value) + + mock_alltrgt_proc.assert_called_once() From dcb0b7ea485682a309133ef1f1986e644f3a247b Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 15:17:24 +0000 Subject: [PATCH 050/122] Remove whitespace --- src/dodal/devices/bimorph_mirror.py | 11 ++++++----- tests/devices/unit_tests/test_bimorph_mirror.py | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index b2903a1cb2..db094de053 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -32,7 +32,7 @@ class BimorphMirrorMode(StrictEnum): HI="HI" NORMAL="NORMAL" FAST="FAST" - + class BimorphMirrorStatus(StrictEnum): IDLE = "Idle" @@ -42,9 +42,9 @@ class BimorphMirrorStatus(StrictEnum): class BimorphMirrorChannel(StandardReadable, EpicsDevice): """Collection of PVs comprising a single bimorph channel. - + Attributes: - vtrgt: Float RW_RBV for target voltage, which can be set using parent mirror's all target proc + vtrgt: Float RW_RBV for target voltage, which can be set using parent mirror's all target proc vout: Float RW_RBV for current voltage on bimorph status: BimorphMirrorOnOff readable for ON/OFF status of channel shift: Float writeable shifting channel voltage @@ -58,7 +58,7 @@ class BimorphMirrorChannel(StandardReadable, EpicsDevice): class BimorphMirror(StandardReadable, Movable): """Class to represent CAENels Bimorph Mirrors. - + Attributes: number_of_channels: Non-ophyd int holding number_of_channels passed into __init__ channels: DeviceVector of BimorphMirrorChannel, indexed from 1, for each channel @@ -68,6 +68,7 @@ class BimorphMirror(StandardReadable, Movable): err: Alarm status """ + def __init__(self, prefix: str, name="", number_of_channels: int = 0): self.number_of_channels = number_of_channels @@ -88,7 +89,7 @@ def __init__(self, prefix: str, name="", number_of_channels: int = 0): @AsyncStatus.wrap async def set(self, value: dict[int, float]): """Sets bimorph voltages in parrallel via target voltage and all proc. - + Args: value: Dict of channel numbers to target voltages""" for i in value.keys(): diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 6090b1c34c..a7abca19f8 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -11,7 +11,7 @@ def mirror(RE: RunEngine) -> BimorphMirror: with DeviceCollector(mock=True): bm = BimorphMirror(prefix="BL02J-EA-IOC-97:G0:", number_of_channels=8) - + return bm From 507139c82bc1ec90c677cf87f5e3471314f8eea7 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 15:17:42 +0000 Subject: [PATCH 051/122] Remove unused import --- tests/devices/unit_tests/test_bimorph_mirror.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index a7abca19f8..bdf9c562bc 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -1,5 +1,3 @@ -import asyncio - import pytest from bluesky.run_engine import RunEngine from ophyd_async.core import DeviceCollector, get_mock_put, set_mock_value From aff1a58b026593d158b740a3c8413f2cdf3db58a Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 29 Nov 2024 15:20:41 +0000 Subject: [PATCH 052/122] Add comments --- src/dodal/devices/bimorph_mirror.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index db094de053..6579359623 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -95,12 +95,15 @@ async def set(self, value: dict[int, float]): for i in value.keys(): assert self.channels.get(i) is not None + # Write target voltages: await asyncio.gather( *[self.channels[i].vtrgt.set(target, wait=True) for i, target in value.items()] ) + # Trigger set target voltages: await self.alltrgt_proc.trigger() + # Wait for values to propogate to voltage out rbv: await asyncio.gather( *[ wait_for_value(self.channels[i].vout, target, timeout=DEFAULT_TIMEOUT) From 6b83f145cb24d87cf9d932f4ffe58ceb1a37db2a Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 2 Dec 2024 09:25:34 +0000 Subject: [PATCH 053/122] Parametrize test_set_channels_wait_for_readback --- tests/devices/unit_tests/test_bimorph_mirror.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index bdf9c562bc..387dacd1d0 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -13,15 +13,17 @@ def mirror(RE: RunEngine) -> BimorphMirror: return bm -async def test_set_channels_waits_for_readback(mirror: BimorphMirror): - value = {2: 50.0, 8: 24.0} +@pytest.mark.parametrize("value", [({2: 50.0, 8: 24.0})]) +async def test_set_channels_waits_for_readback( + value: dict[int, float], mirror: BimorphMirror +): + for key, val in value.items(): + set_mock_value(mirror.channels[key].vout, val) - set_mock_value(mirror.channels[2].vout, 50.0) - set_mock_value(mirror.channels[8].vout, 24.0) await mirror.set(value) - assert (await mirror.channels[2].vtrgt.get_value()) == 50.0 - assert (await mirror.channels[8].vtrgt.get_value()) == 24.0 + for key, val in value.items(): + assert (await mirror.channels[key].vtrgt.get_value()) == val async def test_set_channels_triggers_alltrgt_proc(mirror: BimorphMirror): From 67743445f59e717a60c0f95537a22a022ede8c6d Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 2 Dec 2024 11:06:46 +0000 Subject: [PATCH 054/122] Abstract setting vout mock values into fixture --- tests/devices/unit_tests/test_bimorph_mirror.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 387dacd1d0..ad64f09c7e 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -13,12 +13,18 @@ def mirror(RE: RunEngine) -> BimorphMirror: return bm -@pytest.mark.parametrize("value", [({2: 50.0, 8: 24.0})]) +@pytest.fixture +def set_vout_mock_values(request, mirror: BimorphMirror): + for key, val in request.param.items(): + set_mock_value(mirror.channels[key].vout, val) + return request.param + + +@pytest.mark.parametrize("set_vout_mock_values", [({2: 50.0, 8: 24.0})], indirect=True) async def test_set_channels_waits_for_readback( - value: dict[int, float], mirror: BimorphMirror + set_vout_mock_values: dict[int, float], mirror: BimorphMirror ): - for key, val in value.items(): - set_mock_value(mirror.channels[key].vout, val) + value = set_vout_mock_values await mirror.set(value) From 0b13698ef8f05fbc70ef9a0331781d7082d0b54c Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 2 Dec 2024 11:10:53 +0000 Subject: [PATCH 055/122] Parametrize test_set_channels_wait_for_readback --- tests/devices/unit_tests/test_bimorph_mirror.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index ad64f09c7e..1b0de0c548 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -32,14 +32,14 @@ async def test_set_channels_waits_for_readback( assert (await mirror.channels[key].vtrgt.get_value()) == val -async def test_set_channels_triggers_alltrgt_proc(mirror: BimorphMirror): - value = {2: 50.0, 8: 24.0} +@pytest.mark.parametrize("set_vout_mock_values", [({2: 50.0, 8: 24.0})], indirect=True) +async def test_set_channels_triggers_alltrgt_proc( + set_vout_mock_values: dict[int, float], mirror: BimorphMirror +): + value = set_vout_mock_values mock_alltrgt_proc = get_mock_put(mirror.alltrgt_proc) - set_mock_value(mirror.channels[2].vout, 50.0) - set_mock_value(mirror.channels[8].vout, 24.0) - mock_alltrgt_proc.assert_not_called() await mirror.set(value) From 550f4064503654256ee0d113ca11c9d3a44da822 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 2 Dec 2024 11:11:38 +0000 Subject: [PATCH 056/122] Add whitespace --- tests/devices/unit_tests/test_bimorph_mirror.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 1b0de0c548..69f1316250 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -17,6 +17,7 @@ def mirror(RE: RunEngine) -> BimorphMirror: def set_vout_mock_values(request, mirror: BimorphMirror): for key, val in request.param.items(): set_mock_value(mirror.channels[key].vout, val) + return request.param From 27f72fbdd8582847345ecb2a291842c5f45469bd Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 2 Dec 2024 12:03:39 +0000 Subject: [PATCH 057/122] Renam set_vout_mock_values to set_vout_mock_and_return_value --- .../devices/unit_tests/test_bimorph_mirror.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 69f1316250..f84880f060 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -14,18 +14,20 @@ def mirror(RE: RunEngine) -> BimorphMirror: @pytest.fixture -def set_vout_mock_values(request, mirror: BimorphMirror): +def set_vout_mock_and_return_value(request, mirror: BimorphMirror): for key, val in request.param.items(): set_mock_value(mirror.channels[key].vout, val) return request.param -@pytest.mark.parametrize("set_vout_mock_values", [({2: 50.0, 8: 24.0})], indirect=True) +@pytest.mark.parametrize( + "set_vout_mock_and_return_value", [({2: 50.0, 8: 24.0})], indirect=True +) async def test_set_channels_waits_for_readback( - set_vout_mock_values: dict[int, float], mirror: BimorphMirror + set_vout_mock_and_return_value: dict[int, float], mirror: BimorphMirror ): - value = set_vout_mock_values + value = set_vout_mock_and_return_value await mirror.set(value) @@ -33,11 +35,13 @@ async def test_set_channels_waits_for_readback( assert (await mirror.channels[key].vtrgt.get_value()) == val -@pytest.mark.parametrize("set_vout_mock_values", [({2: 50.0, 8: 24.0})], indirect=True) +@pytest.mark.parametrize( + "set_vout_mock_and_return_value", [({2: 50.0, 8: 24.0})], indirect=True +) async def test_set_channels_triggers_alltrgt_proc( - set_vout_mock_values: dict[int, float], mirror: BimorphMirror + set_vout_mock_and_return_value: dict[int, float], mirror: BimorphMirror ): - value = set_vout_mock_values + value = set_vout_mock_and_return_value mock_alltrgt_proc = get_mock_put(mirror.alltrgt_proc) From 81e0ddb7dd685a91d630af3bbad3cd7d171284f5 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 2 Dec 2024 16:02:16 +0000 Subject: [PATCH 058/122] Add test_set_channels_waits_for_vout_readback unimplemented --- tests/devices/unit_tests/test_bimorph_mirror.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index f84880f060..f3d31d40db 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -50,3 +50,10 @@ async def test_set_channels_triggers_alltrgt_proc( await mirror.set(value) mock_alltrgt_proc.assert_called_once() + + +@pytest.mark.parametrize("value", [({2: 50.0, 8: 24.0})]) +async def test_set_channels_waits_for_vout_readback( + value: dict[int, float], mirror: BimorphMirror +): + raise NotImplementedError From 5ffad560f7642bc152bd227f74c28c61f7372d03 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 2 Dec 2024 16:27:32 +0000 Subject: [PATCH 059/122] Add test_read, and BIMORPH_NAME global variable --- .../devices/unit_tests/test_bimorph_mirror.py | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index f3d31d40db..a650c305a9 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -4,11 +4,15 @@ from dodal.devices.bimorph_mirror import BimorphMirror +BIMORPH_NAME = "bimorph" + @pytest.fixture def mirror(RE: RunEngine) -> BimorphMirror: with DeviceCollector(mock=True): - bm = BimorphMirror(prefix="BL02J-EA-IOC-97:G0:", number_of_channels=8) + bm = BimorphMirror( + name=BIMORPH_NAME, prefix="BL02J-EA-IOC-97:G0:", number_of_channels=8 + ) return bm @@ -57,3 +61,17 @@ async def test_set_channels_waits_for_vout_readback( value: dict[int, float], mirror: BimorphMirror ): raise NotImplementedError + + +@pytest.mark.parametrize( + "set_vout_mock_and_return_value", [({i: 0.0 for i in range(1, 9)})], indirect=True +) +async def test_read( + set_vout_mock_and_return_value: dict[int, float], mirror: BimorphMirror +): + value = set_vout_mock_and_return_value + + read = await mirror.read() + + for i in range(1, 9): + assert read[f"{BIMORPH_NAME}-channels-{i}-vout"]["value"] == value[i] From 31c6bec57cd0fa852bf4213d898bf455aca2680c Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 4 Dec 2024 11:25:43 +0000 Subject: [PATCH 060/122] Make mirror fixture take number_of_channels argument --- tests/devices/unit_tests/test_bimorph_mirror.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index a650c305a9..8666da5dcc 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -5,13 +5,18 @@ from dodal.devices.bimorph_mirror import BimorphMirror BIMORPH_NAME = "bimorph" +BIMORPH_NUMBER_OF_CHANNELS = 8 @pytest.fixture -def mirror(RE: RunEngine) -> BimorphMirror: +def mirror( + RE: RunEngine, number_of_channels=BIMORPH_NUMBER_OF_CHANNELS +) -> BimorphMirror: with DeviceCollector(mock=True): bm = BimorphMirror( - name=BIMORPH_NAME, prefix="BL02J-EA-IOC-97:G0:", number_of_channels=8 + name=BIMORPH_NAME, + prefix="BL02J-EA-IOC-97:G0:", + number_of_channels=number_of_channels, ) return bm @@ -64,7 +69,9 @@ async def test_set_channels_waits_for_vout_readback( @pytest.mark.parametrize( - "set_vout_mock_and_return_value", [({i: 0.0 for i in range(1, 9)})], indirect=True + "set_vout_mock_and_return_value", + [({i: 0.0 for i in range(1, BIMORPH_NUMBER_OF_CHANNELS)})], + indirect=True, ) async def test_read( set_vout_mock_and_return_value: dict[int, float], mirror: BimorphMirror @@ -73,5 +80,5 @@ async def test_read( read = await mirror.read() - for i in range(1, 9): + for i in range(1, mirror.number_of_channels): assert read[f"{BIMORPH_NAME}-channels-{i}-vout"]["value"] == value[i] From b7cf4bdcdced12ea40a5adb0f95f5a4caca9160d Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 4 Dec 2024 13:09:51 +0000 Subject: [PATCH 061/122] Correct BimorphMirrorChannel Format signal types --- src/dodal/devices/bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 6579359623..9eeb3b60ff 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -50,9 +50,9 @@ class BimorphMirrorChannel(StandardReadable, EpicsDevice): shift: Float writeable shifting channel voltage """ - vtrgt: A[SignalRW[float], PvSuffix.rbv("VTRGT"), Format.HINTED_SIGNAL] + vtrgt: A[SignalRW[float], PvSuffix.rbv("VTRGT"), Format.CONFIG_SIGNAL] vout: A[SignalRW[float], PvSuffix.rbv("VOUT"), Format.HINTED_SIGNAL] - status: A[SignalR[BimorphMirrorOnOff], PvSuffix("STATUS"), Format.HINTED_SIGNAL] + status: A[SignalR[BimorphMirrorOnOff], PvSuffix("STATUS"), Format.CONFIG_SIGNAL] shift: A[SignalW[float], PvSuffix("STATUS")] From 6f83b30f48d473b8167ea53a86219001bfd01679 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 4 Dec 2024 13:11:33 +0000 Subject: [PATCH 062/122] Add valid_bimorph_values fixture --- tests/devices/unit_tests/test_bimorph_mirror.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 8666da5dcc..ce1d81944f 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -1,3 +1,5 @@ +import random + import pytest from bluesky.run_engine import RunEngine from ophyd_async.core import DeviceCollector, get_mock_put, set_mock_value @@ -22,6 +24,11 @@ def mirror( return bm +@pytest.fixture +def valid_bimorph_values(number_of_channels: int) -> dict[int, float]: + return {i: random.random() * 200 for i in range(1, number_of_channels + 1)} + + @pytest.fixture def set_vout_mock_and_return_value(request, mirror: BimorphMirror): for key, val in request.param.items(): From 0de24132fab2cff411f8531b2f6be5a9e96a4b12 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 4 Dec 2024 15:07:02 +0000 Subject: [PATCH 063/122] Change test parametrization from bimorph input to number of channels --- .../devices/unit_tests/test_bimorph_mirror.py | 57 +++++++------------ 1 file changed, 21 insertions(+), 36 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index ce1d81944f..3c6126b6a8 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -7,13 +7,11 @@ from dodal.devices.bimorph_mirror import BimorphMirror BIMORPH_NAME = "bimorph" -BIMORPH_NUMBER_OF_CHANNELS = 8 - @pytest.fixture -def mirror( - RE: RunEngine, number_of_channels=BIMORPH_NUMBER_OF_CHANNELS -) -> BimorphMirror: +def mirror(request, RE: RunEngine) -> BimorphMirror: + number_of_channels = request.param + with DeviceCollector(mock=True): bm = BimorphMirror( name=BIMORPH_NAME, @@ -25,67 +23,54 @@ def mirror( @pytest.fixture -def valid_bimorph_values(number_of_channels: int) -> dict[int, float]: - return {i: random.random() * 200 for i in range(1, number_of_channels + 1)} +def valid_bimorph_values(mirror: BimorphMirror) -> dict[int, float]: + return {i: random.random() * 200 for i in range(1, mirror.number_of_channels + 1)} @pytest.fixture -def set_vout_mock_and_return_value(request, mirror: BimorphMirror): - for key, val in request.param.items(): +def set_vout_mock(valid_bimorph_values: dict[int, float], mirror: BimorphMirror): + for key, val in valid_bimorph_values.items(): set_mock_value(mirror.channels[key].vout, val) - return request.param - -@pytest.mark.parametrize( - "set_vout_mock_and_return_value", [({2: 50.0, 8: 24.0})], indirect=True -) +@pytest.mark.parametrize("mirror", [8], indirect=True) async def test_set_channels_waits_for_readback( - set_vout_mock_and_return_value: dict[int, float], mirror: BimorphMirror + mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock ): - value = set_vout_mock_and_return_value - - await mirror.set(value) + await mirror.set(valid_bimorph_values) - for key, val in value.items(): + for key, val in valid_bimorph_values.items(): assert (await mirror.channels[key].vtrgt.get_value()) == val -@pytest.mark.parametrize( - "set_vout_mock_and_return_value", [({2: 50.0, 8: 24.0})], indirect=True -) +@pytest.mark.parametrize("mirror", [8], indirect=True) async def test_set_channels_triggers_alltrgt_proc( - set_vout_mock_and_return_value: dict[int, float], mirror: BimorphMirror + mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock ): - value = set_vout_mock_and_return_value - mock_alltrgt_proc = get_mock_put(mirror.alltrgt_proc) mock_alltrgt_proc.assert_not_called() - await mirror.set(value) + await mirror.set(valid_bimorph_values) mock_alltrgt_proc.assert_called_once() -@pytest.mark.parametrize("value", [({2: 50.0, 8: 24.0})]) +@pytest.mark.parametrize("mirror", [8], indirect=True) async def test_set_channels_waits_for_vout_readback( value: dict[int, float], mirror: BimorphMirror ): raise NotImplementedError -@pytest.mark.parametrize( - "set_vout_mock_and_return_value", - [({i: 0.0 for i in range(1, BIMORPH_NUMBER_OF_CHANNELS)})], - indirect=True, -) +@pytest.mark.parametrize("mirror", [8], indirect=True) async def test_read( - set_vout_mock_and_return_value: dict[int, float], mirror: BimorphMirror + mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock ): - value = set_vout_mock_and_return_value - read = await mirror.read() for i in range(1, mirror.number_of_channels): - assert read[f"{BIMORPH_NAME}-channels-{i}-vout"]["value"] == value[i] + assert ( + read[f"{BIMORPH_NAME}-channels-{i}-vout"]["value"] + == valid_bimorph_values[i] + ) From 35f253bb282c114fdd643de27bca1eba1a93ef7b Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 5 Dec 2024 09:16:44 +0000 Subject: [PATCH 064/122] Add format changes generated by tox pre-commit --- src/dodal/devices/bimorph_mirror.py | 15 +++++++++------ tests/devices/unit_tests/test_bimorph_mirror.py | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 9eeb3b60ff..3f01fb9765 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -24,14 +24,14 @@ class BimorphMirrorOnOff(StrictEnum): - ON="ON" - OFF="OFF" + ON = "ON" + OFF = "OFF" class BimorphMirrorMode(StrictEnum): - HI="HI" - NORMAL="NORMAL" - FAST="FAST" + HI = "HI" + NORMAL = "NORMAL" + FAST = "FAST" class BimorphMirrorStatus(StrictEnum): @@ -97,7 +97,10 @@ async def set(self, value: dict[int, float]): # Write target voltages: await asyncio.gather( - *[self.channels[i].vtrgt.set(target, wait=True) for i, target in value.items()] + *[ + self.channels[i].vtrgt.set(target, wait=True) + for i, target in value.items() + ] ) # Trigger set target voltages: diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 3c6126b6a8..58895436e5 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -8,6 +8,7 @@ BIMORPH_NAME = "bimorph" + @pytest.fixture def mirror(request, RE: RunEngine) -> BimorphMirror: number_of_channels = request.param From 5dae56f11dea2d7831ebd9e7140bc0a7c1b18ab8 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 4 Dec 2024 15:10:02 +0000 Subject: [PATCH 065/122] Change explcit channel number parameter to reference to global list of channel numbers --- tests/devices/unit_tests/test_bimorph_mirror.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 58895436e5..695f96127b 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -7,6 +7,7 @@ from dodal.devices.bimorph_mirror import BimorphMirror BIMORPH_NAME = "bimorph" +VALID_BIMORPH_CHANNELS = [8, 12, 16, 24] @pytest.fixture @@ -34,7 +35,7 @@ def set_vout_mock(valid_bimorph_values: dict[int, float], mirror: BimorphMirror) set_mock_value(mirror.channels[key].vout, val) -@pytest.mark.parametrize("mirror", [8], indirect=True) +@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_waits_for_readback( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock ): @@ -44,7 +45,7 @@ async def test_set_channels_waits_for_readback( assert (await mirror.channels[key].vtrgt.get_value()) == val -@pytest.mark.parametrize("mirror", [8], indirect=True) +@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_triggers_alltrgt_proc( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock ): @@ -57,14 +58,14 @@ async def test_set_channels_triggers_alltrgt_proc( mock_alltrgt_proc.assert_called_once() -@pytest.mark.parametrize("mirror", [8], indirect=True) +@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_waits_for_vout_readback( value: dict[int, float], mirror: BimorphMirror ): raise NotImplementedError -@pytest.mark.parametrize("mirror", [8], indirect=True) +@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_read( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock ): From e3e5a31d4704b3ce792d7a82688f31f0565e8c95 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 4 Dec 2024 15:58:04 +0000 Subject: [PATCH 066/122] Implement test_set_channels_waits_for_vout_readback --- tests/devices/unit_tests/test_bimorph_mirror.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 695f96127b..989a1608ba 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -1,4 +1,5 @@ import random +from unittest.mock import ANY, call, patch import pytest from bluesky.run_engine import RunEngine @@ -60,9 +61,18 @@ async def test_set_channels_triggers_alltrgt_proc( @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_waits_for_vout_readback( - value: dict[int, float], mirror: BimorphMirror + mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock ): - raise NotImplementedError + with patch("dodal.devices.bimorph_mirror.wait_for_value") as mock_wait_for_value: + mock_wait_for_value.assert_not_called() + + await mirror.set(valid_bimorph_values) + + for i, val in valid_bimorph_values.items(): + assert ( + call(mirror.channels[i].vout, val, timeout=ANY) + in mock_wait_for_value.call_args_list + ) @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) From e9c578e5ac56b11e1af2db12ae684ac7381897c0 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 4 Dec 2024 16:26:53 +0000 Subject: [PATCH 067/122] Add test_set_invalid_chanel_throws_error --- tests/devices/unit_tests/test_bimorph_mirror.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 989a1608ba..38e249e72e 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -86,3 +86,9 @@ async def test_read( read[f"{BIMORPH_NAME}-channels-{i}-vout"]["value"] == valid_bimorph_values[i] ) + + +@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) +async def test_set_invalid_channel_throws_error(mirror: BimorphMirror): + with pytest.raises(AssertionError): + await mirror.set({mirror.number_of_channels + 1: 0.0}) From ffce233071983e32151c65bf6cbeba040116c4be Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 4 Dec 2024 16:28:18 +0000 Subject: [PATCH 068/122] Add Raises section to BimorphMirror.set docstring --- src/dodal/devices/bimorph_mirror.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 3f01fb9765..e3b796c50a 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -91,7 +91,10 @@ async def set(self, value: dict[int, float]): """Sets bimorph voltages in parrallel via target voltage and all proc. Args: - value: Dict of channel numbers to target voltages""" + value: Dict of channel numbers to target voltages + + Raises: + AssertionError: If specified channel number does not exist on mirror""" for i in value.keys(): assert self.channels.get(i) is not None From 61a39af7c3da2a95ccb5cba7f85413ecd02bc507 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 10:28:41 +0000 Subject: [PATCH 069/122] Make BiorphMirror.__init__ number_of_channels have no default value --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index e3b796c50a..2660790098 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -69,7 +69,7 @@ class BimorphMirror(StandardReadable, Movable): """ - def __init__(self, prefix: str, name="", number_of_channels: int = 0): + def __init__(self, prefix: str, number_of_channels: int, name=""): self.number_of_channels = number_of_channels with self.add_children_as_readables(): From 6ea4522e209ecafd5bd3182fc3bfc0e8f7c2156a Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 10:51:43 +0000 Subject: [PATCH 070/122] Replace all asserts inside for loops, to comprehension and comparison --- .../devices/unit_tests/test_bimorph_mirror.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 38e249e72e..c7400d231f 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -42,8 +42,10 @@ async def test_set_channels_waits_for_readback( ): await mirror.set(valid_bimorph_values) - for key, val in valid_bimorph_values.items(): - assert (await mirror.channels[key].vtrgt.get_value()) == val + assert { + key: await mirror.channels[key].vtrgt.get_value() + for key in valid_bimorph_values + } == valid_bimorph_values @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) @@ -68,11 +70,10 @@ async def test_set_channels_waits_for_vout_readback( await mirror.set(valid_bimorph_values) - for i, val in valid_bimorph_values.items(): - assert ( - call(mirror.channels[i].vout, val, timeout=ANY) - in mock_wait_for_value.call_args_list - ) + assert [ + call(mirror.channels[i].vout, val, timeout=ANY) + for i, val in valid_bimorph_values.items() + ] == mock_wait_for_value.call_args_list @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) @@ -81,11 +82,10 @@ async def test_read( ): read = await mirror.read() - for i in range(1, mirror.number_of_channels): - assert ( - read[f"{BIMORPH_NAME}-channels-{i}-vout"]["value"] - == valid_bimorph_values[i] - ) + assert [ + read[f"{BIMORPH_NAME}-channels-{i}-vout"]["value"] + for i in range(1, mirror.number_of_channels + 1) + ] == list(valid_bimorph_values.values()) @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) From b8d81ee0fb663903900cf12ede89f96e79dc777a Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 10:53:29 +0000 Subject: [PATCH 071/122] Remove BIMORPH_NAME global variable --- tests/devices/unit_tests/test_bimorph_mirror.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index c7400d231f..b617399b17 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -7,7 +7,6 @@ from dodal.devices.bimorph_mirror import BimorphMirror -BIMORPH_NAME = "bimorph" VALID_BIMORPH_CHANNELS = [8, 12, 16, 24] @@ -17,7 +16,6 @@ def mirror(request, RE: RunEngine) -> BimorphMirror: with DeviceCollector(mock=True): bm = BimorphMirror( - name=BIMORPH_NAME, prefix="BL02J-EA-IOC-97:G0:", number_of_channels=number_of_channels, ) @@ -83,7 +81,7 @@ async def test_read( read = await mirror.read() assert [ - read[f"{BIMORPH_NAME}-channels-{i}-vout"]["value"] + read[f"{mirror.name}-channels-{i}-vout"]["value"] for i in range(1, mirror.number_of_channels + 1) ] == list(valid_bimorph_values.values()) From e015ba57867efb88c38b7882b8272098f909b744 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 10:57:05 +0000 Subject: [PATCH 072/122] Remove prng from test input generation --- tests/devices/unit_tests/test_bimorph_mirror.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index b617399b17..81491e94b1 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -1,4 +1,3 @@ -import random from unittest.mock import ANY, call, patch import pytest @@ -25,7 +24,7 @@ def mirror(request, RE: RunEngine) -> BimorphMirror: @pytest.fixture def valid_bimorph_values(mirror: BimorphMirror) -> dict[int, float]: - return {i: random.random() * 200 for i in range(1, mirror.number_of_channels + 1)} + return {i: float(i) for i in range(1, mirror.number_of_channels + 1)} @pytest.fixture From 09185f0f3611effcd405ccb49772ac12dbf8cc8d Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 11:23:19 +0000 Subject: [PATCH 073/122] Add BimorphMirror.__init__ number_of_channels validation --- src/dodal/devices/bimorph_mirror.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 2660790098..b14442a1d5 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -70,6 +70,9 @@ class BimorphMirror(StandardReadable, Movable): """ def __init__(self, prefix: str, number_of_channels: int, name=""): + if number_of_channels < 0: + raise ValueError(f"Number of channels is below zero: {number_of_channels}") + self.number_of_channels = number_of_channels with self.add_children_as_readables(): From cfe357d927918077880a7609627969d21acd9cb2 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 11:23:37 +0000 Subject: [PATCH 074/122] Add test_init_mirror_with_invalid_channels_throws_error --- tests/devices/unit_tests/test_bimorph_mirror.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 81491e94b1..a248dfdabd 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -89,3 +89,9 @@ async def test_read( async def test_set_invalid_channel_throws_error(mirror: BimorphMirror): with pytest.raises(AssertionError): await mirror.set({mirror.number_of_channels + 1: 0.0}) + + +@pytest.mark.parametrize("number_of_channels", [-1]) +async def test_init_mirror_with_invalid_channels_throws_error(number_of_channels): + with pytest.raises(ValueError): + BimorphMirror(prefix="FAKE-PREFIX", number_of_channels=number_of_channels) From bdd93d5cb126d15a6f549290bd17e966df4f1dda Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 11:28:14 +0000 Subject: [PATCH 075/122] Add BimorphMirror.__init__ docstring --- src/dodal/devices/bimorph_mirror.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index b14442a1d5..3288700085 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -65,11 +65,18 @@ class BimorphMirror(StandardReadable, Movable): on_off: Writeable BimorphOnOff alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT status: Readable BimorphMirrorStatus Busy/Idle status - err: Alarm status - - """ + err: Alarm status""" def __init__(self, prefix: str, number_of_channels: int, name=""): + """ + Args: + prefix: str PV prefix + number_of_channels: int number of channels on bimorph mirror (can be zero) + name: str name of device + + Raises: + ValueError: number_of_channels is less than zero""" + if number_of_channels < 0: raise ValueError(f"Number of channels is below zero: {number_of_channels}") From aba2bc161d41de3c476fd1759b945c7c8a72b848 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 11:39:43 +0000 Subject: [PATCH 076/122] Replace assertion in BimorphMirror.set arg validation with raise ValueError --- src/dodal/devices/bimorph_mirror.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 3288700085..a3ce465cfd 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -104,9 +104,11 @@ async def set(self, value: dict[int, float]): value: Dict of channel numbers to target voltages Raises: - AssertionError: If specified channel number does not exist on mirror""" + ValueError: On set to non-existent channel""" + for i in value.keys(): - assert self.channels.get(i) is not None + if self.channels.get(i) is None: + raise ValueError(f"Set to non-existent channel: {i}") # Write target voltages: await asyncio.gather( From db20860457c5262a9384aa7f7654187b533713ba Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 11:41:27 +0000 Subject: [PATCH 077/122] Make test_set_invalid_channel_throws_error expect correct error type --- tests/devices/unit_tests/test_bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index a248dfdabd..2913c1e37b 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -87,7 +87,7 @@ async def test_read( @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_invalid_channel_throws_error(mirror: BimorphMirror): - with pytest.raises(AssertionError): + with pytest.raises(ValueError): await mirror.set({mirror.number_of_channels + 1: 0.0}) From b4ca49dd5069b9936a46942e286742cafea91548 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 9 Dec 2024 11:43:34 +0000 Subject: [PATCH 078/122] Replace real PV prefix with fake --- tests/devices/unit_tests/test_bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 2913c1e37b..3df4e7ad57 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -15,7 +15,7 @@ def mirror(request, RE: RunEngine) -> BimorphMirror: with DeviceCollector(mock=True): bm = BimorphMirror( - prefix="BL02J-EA-IOC-97:G0:", + prefix="FAKE-PREFIX:", number_of_channels=number_of_channels, ) @@ -94,4 +94,4 @@ async def test_set_invalid_channel_throws_error(mirror: BimorphMirror): @pytest.mark.parametrize("number_of_channels", [-1]) async def test_init_mirror_with_invalid_channels_throws_error(number_of_channels): with pytest.raises(ValueError): - BimorphMirror(prefix="FAKE-PREFIX", number_of_channels=number_of_channels) + BimorphMirror(prefix="FAKE-PREFIX:", number_of_channels=number_of_channels) From d02843874b218d2cf90da195eb3a0fa97e872488 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Tue, 10 Dec 2024 10:21:21 +0000 Subject: [PATCH 079/122] Add mock_vtrgt_vout_propogation, remove set_vout_mock fixtures --- .../devices/unit_tests/test_bimorph_mirror.py | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 3df4e7ad57..de8973dd42 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -28,14 +28,20 @@ def valid_bimorph_values(mirror: BimorphMirror) -> dict[int, float]: @pytest.fixture -def set_vout_mock(valid_bimorph_values: dict[int, float], mirror: BimorphMirror): - for key, val in valid_bimorph_values.items(): - set_mock_value(mirror.channels[key].vout, val) +def mock_vtrgt_vout_propogation(mirror: BimorphMirror): + for channel in mirror.channels.values(): + + def effect(value: float, wait=False, signal=channel.vout): + signal.set(value, wait=wait) + + get_mock_put(channel.vtrgt).side_effect = effect @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_waits_for_readback( - mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock + mirror: BimorphMirror, + valid_bimorph_values: dict[int, float], + mock_vtrgt_vout_propogation, ): await mirror.set(valid_bimorph_values) @@ -47,7 +53,9 @@ async def test_set_channels_waits_for_readback( @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_triggers_alltrgt_proc( - mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock + mirror: BimorphMirror, + valid_bimorph_values: dict[int, float], + mock_vtrgt_vout_propogation, ): mock_alltrgt_proc = get_mock_put(mirror.alltrgt_proc) @@ -60,7 +68,9 @@ async def test_set_channels_triggers_alltrgt_proc( @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_waits_for_vout_readback( - mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock + mirror: BimorphMirror, + valid_bimorph_values: dict[int, float], + mock_vtrgt_vout_propogation, ): with patch("dodal.devices.bimorph_mirror.wait_for_value") as mock_wait_for_value: mock_wait_for_value.assert_not_called() @@ -75,8 +85,12 @@ async def test_set_channels_waits_for_vout_readback( @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_read( - mirror: BimorphMirror, valid_bimorph_values: dict[int, float], set_vout_mock + mirror: BimorphMirror, + valid_bimorph_values: dict[int, float], + mock_vtrgt_vout_propogation, ): + await mirror.set(valid_bimorph_values) + read = await mirror.read() assert [ From 318fcd667f402783eec55cf5034ac1a5e81eed56 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Tue, 10 Dec 2024 10:21:52 +0000 Subject: [PATCH 080/122] Remove unused import --- tests/devices/unit_tests/test_bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index de8973dd42..a416b2ec5d 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -2,7 +2,7 @@ import pytest from bluesky.run_engine import RunEngine -from ophyd_async.core import DeviceCollector, get_mock_put, set_mock_value +from ophyd_async.core import DeviceCollector, get_mock_put from dodal.devices.bimorph_mirror import BimorphMirror From 448eb19d2d1881aeec3ba167a00e473e911306d4 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Tue, 10 Dec 2024 16:44:15 +0000 Subject: [PATCH 081/122] Fix import for ophyd async 0.9.0a1 --- tests/devices/unit_tests/test_bimorph_mirror.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index a416b2ec5d..0b7e3f5656 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -2,7 +2,8 @@ import pytest from bluesky.run_engine import RunEngine -from ophyd_async.core import DeviceCollector, get_mock_put +from ophyd_async.core import DeviceCollector +from ophyd_async.testing import get_mock_put from dodal.devices.bimorph_mirror import BimorphMirror From 7272218f74f017e35f35225df1492858de87c6dd Mon Sep 17 00:00:00 2001 From: Daniel Fernandes <65790536+dan-fernandes@users.noreply.github.com> Date: Wed, 11 Dec 2024 16:27:11 +0000 Subject: [PATCH 082/122] Update src/dodal/devices/bimorph_mirror.py Co-authored-by: Callum Forrester --- src/dodal/devices/bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index a3ce465cfd..db44a2725d 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -50,8 +50,8 @@ class BimorphMirrorChannel(StandardReadable, EpicsDevice): shift: Float writeable shifting channel voltage """ - vtrgt: A[SignalRW[float], PvSuffix.rbv("VTRGT"), Format.CONFIG_SIGNAL] - vout: A[SignalRW[float], PvSuffix.rbv("VOUT"), Format.HINTED_SIGNAL] + target_voltage: A[SignalRW[float], PvSuffix.rbv("VTRGT"), Format.CONFIG_SIGNAL] + output_voltage: A[SignalRW[float], PvSuffix.rbv("VOUT"), Format.HINTED_SIGNAL] status: A[SignalR[BimorphMirrorOnOff], PvSuffix("STATUS"), Format.CONFIG_SIGNAL] shift: A[SignalW[float], PvSuffix("STATUS")] From 32377907eddebf1e4a3bc97f3bf676d52cad6cd5 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes <65790536+dan-fernandes@users.noreply.github.com> Date: Wed, 11 Dec 2024 16:27:23 +0000 Subject: [PATCH 083/122] Update src/dodal/devices/bimorph_mirror.py Co-authored-by: Callum Forrester --- src/dodal/devices/bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index db44a2725d..4136249aa2 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -89,8 +89,8 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): for i in range(1, number_of_channels + 1) } ) - self.on_off = epics_signal_w(BimorphMirrorOnOff, f"{prefix}ONOFF") - self.alltrgt_proc = epics_signal_x(f"{prefix}ALLTRGT.PROC") + self.enabled = epics_signal_w(BimorphMirrorOnOff, f"{prefix}ONOFF") + self.commit_target_voltages = epics_signal_x(f"{prefix}ALLTRGT.PROC") self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}STATUS") self.err = epics_signal_r(str, f"{prefix}ERR") From 7953cebf8d626ce0bdab8f37da9202f63f42530e Mon Sep 17 00:00:00 2001 From: Daniel Fernandes <65790536+dan-fernandes@users.noreply.github.com> Date: Wed, 11 Dec 2024 16:31:19 +0000 Subject: [PATCH 084/122] Update src/dodal/devices/bimorph_mirror.py Co-authored-by: Callum Forrester --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 4136249aa2..e18df211ad 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -97,7 +97,7 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): super().__init__(name=name) @AsyncStatus.wrap - async def set(self, value: dict[int, float]): + async def set(self, value: Mapping[int, float]) -> None: """Sets bimorph voltages in parrallel via target voltage and all proc. Args: From d06a8abd27a450d5e0b569b20c860be6a0e97d1c Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 11 Dec 2024 16:17:27 +0000 Subject: [PATCH 085/122] Remove BimorphMirror.number_of_channels --- src/dodal/devices/bimorph_mirror.py | 3 --- tests/devices/unit_tests/test_bimorph_mirror.py | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index e18df211ad..315242c2d4 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -60,7 +60,6 @@ class BimorphMirror(StandardReadable, Movable): """Class to represent CAENels Bimorph Mirrors. Attributes: - number_of_channels: Non-ophyd int holding number_of_channels passed into __init__ channels: DeviceVector of BimorphMirrorChannel, indexed from 1, for each channel on_off: Writeable BimorphOnOff alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT @@ -80,8 +79,6 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): if number_of_channels < 0: raise ValueError(f"Number of channels is below zero: {number_of_channels}") - self.number_of_channels = number_of_channels - with self.add_children_as_readables(): self.channels = DeviceVector( { diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 0b7e3f5656..87cd2dba37 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -25,7 +25,7 @@ def mirror(request, RE: RunEngine) -> BimorphMirror: @pytest.fixture def valid_bimorph_values(mirror: BimorphMirror) -> dict[int, float]: - return {i: float(i) for i in range(1, mirror.number_of_channels + 1)} + return {i: float(i) for i in range(1, len(mirror.channels) + 1)} @pytest.fixture @@ -96,14 +96,14 @@ async def test_read( assert [ read[f"{mirror.name}-channels-{i}-vout"]["value"] - for i in range(1, mirror.number_of_channels + 1) + for i in range(1, len(mirror.channels) + 1) ] == list(valid_bimorph_values.values()) @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_invalid_channel_throws_error(mirror: BimorphMirror): with pytest.raises(ValueError): - await mirror.set({mirror.number_of_channels + 1: 0.0}) + await mirror.set({len(mirror.channels) + 1: 0.0}) @pytest.mark.parametrize("number_of_channels", [-1]) From db19e2aa57dfcfee2cf4322185585c0744315480 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 11 Dec 2024 16:20:55 +0000 Subject: [PATCH 086/122] Rename BimorphMirror.alltrgt_proc, .on_off for readability --- src/dodal/devices/bimorph_mirror.py | 6 +++--- tests/devices/unit_tests/test_bimorph_mirror.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 315242c2d4..b9a0ed5b75 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -61,8 +61,8 @@ class BimorphMirror(StandardReadable, Movable): Attributes: channels: DeviceVector of BimorphMirrorChannel, indexed from 1, for each channel - on_off: Writeable BimorphOnOff - alltrgt_proc: Procable signal that writes values in each channel's VTRGT to VOUT + enabled: Writeable BimorphOnOff + commit_target_voltages: Procable signal that writes values in each channel's VTRGT to VOUT status: Readable BimorphMirrorStatus Busy/Idle status err: Alarm status""" @@ -116,7 +116,7 @@ async def set(self, value: Mapping[int, float]) -> None: ) # Trigger set target voltages: - await self.alltrgt_proc.trigger() + await self.commit_target_voltages.trigger() # Wait for values to propogate to voltage out rbv: await asyncio.gather( diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 87cd2dba37..92117c079f 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -58,7 +58,7 @@ async def test_set_channels_triggers_alltrgt_proc( valid_bimorph_values: dict[int, float], mock_vtrgt_vout_propogation, ): - mock_alltrgt_proc = get_mock_put(mirror.alltrgt_proc) + mock_alltrgt_proc = get_mock_put(mirror.commit_target_voltages) mock_alltrgt_proc.assert_not_called() From 095861d08892bc3bdb2644e9dcbaed932f25a5b3 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 11 Dec 2024 16:26:53 +0000 Subject: [PATCH 087/122] Rename BimorphMirrorChannel.vtrgt, .vout for readbility --- src/dodal/devices/bimorph_mirror.py | 10 ++++++---- tests/devices/unit_tests/test_bimorph_mirror.py | 10 +++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index b9a0ed5b75..7e82e4e2d4 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -44,8 +44,8 @@ class BimorphMirrorChannel(StandardReadable, EpicsDevice): """Collection of PVs comprising a single bimorph channel. Attributes: - vtrgt: Float RW_RBV for target voltage, which can be set using parent mirror's all target proc - vout: Float RW_RBV for current voltage on bimorph + target_voltage: Float RW_RBV for target voltage, which can be set using parent mirror's all target proc + output_voltage: Float RW_RBV for current voltage on bimorph status: BimorphMirrorOnOff readable for ON/OFF status of channel shift: Float writeable shifting channel voltage """ @@ -110,7 +110,7 @@ async def set(self, value: Mapping[int, float]) -> None: # Write target voltages: await asyncio.gather( *[ - self.channels[i].vtrgt.set(target, wait=True) + self.channels[i].target_voltage.set(target, wait=True) for i, target in value.items() ] ) @@ -121,7 +121,9 @@ async def set(self, value: Mapping[int, float]) -> None: # Wait for values to propogate to voltage out rbv: await asyncio.gather( *[ - wait_for_value(self.channels[i].vout, target, timeout=DEFAULT_TIMEOUT) + wait_for_value( + self.channels[i].output_voltage, target, timeout=DEFAULT_TIMEOUT + ) for i, target in value.items() ] ) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 92117c079f..f0b957d101 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -32,10 +32,10 @@ def valid_bimorph_values(mirror: BimorphMirror) -> dict[int, float]: def mock_vtrgt_vout_propogation(mirror: BimorphMirror): for channel in mirror.channels.values(): - def effect(value: float, wait=False, signal=channel.vout): + def effect(value: float, wait=False, signal=channel.output_voltage): signal.set(value, wait=wait) - get_mock_put(channel.vtrgt).side_effect = effect + get_mock_put(channel.target_voltage).side_effect = effect @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) @@ -47,7 +47,7 @@ async def test_set_channels_waits_for_readback( await mirror.set(valid_bimorph_values) assert { - key: await mirror.channels[key].vtrgt.get_value() + key: await mirror.channels[key].target_voltage.get_value() for key in valid_bimorph_values } == valid_bimorph_values @@ -79,7 +79,7 @@ async def test_set_channels_waits_for_vout_readback( await mirror.set(valid_bimorph_values) assert [ - call(mirror.channels[i].vout, val, timeout=ANY) + call(mirror.channels[i].output_voltage, val, timeout=ANY) for i, val in valid_bimorph_values.items() ] == mock_wait_for_value.call_args_list @@ -95,7 +95,7 @@ async def test_read( read = await mirror.read() assert [ - read[f"{mirror.name}-channels-{i}-vout"]["value"] + read[f"{mirror.name}-channels-{i}-output_voltage"]["value"] for i in range(1, len(mirror.channels) + 1) ] == list(valid_bimorph_values.values()) From 8ceaad1234a0e50dae48c60bed4af29f5a26b99d Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Wed, 11 Dec 2024 16:31:15 +0000 Subject: [PATCH 088/122] Change BimorphMirror.set type hinting --- src/dodal/devices/bimorph_mirror.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 7e82e4e2d4..c52be82297 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -1,4 +1,5 @@ import asyncio +from collections.abc import Mapping from typing import Annotated as A from bluesky.protocols import Movable From 86d9cf2f521fdabd253892bdf2cafc385836065b Mon Sep 17 00:00:00 2001 From: Daniel Fernandes <65790536+dan-fernandes@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:18:31 +0000 Subject: [PATCH 089/122] Replace BimorphMirror.set sequential input validation with collection Co-authored-by: Callum Forrester --- src/dodal/devices/bimorph_mirror.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index c52be82297..0f0fe210c7 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -104,9 +104,9 @@ async def set(self, value: Mapping[int, float]) -> None: Raises: ValueError: On set to non-existent channel""" - for i in value.keys(): - if self.channels.get(i) is None: - raise ValueError(f"Set to non-existent channel: {i}") + diff = set(self.channels.keys()) - set(values.keys()) + if len(diff) > 0: + raise ValueError(f"Attempting to put to non-existent channels: {diff}") # Write target voltages: await asyncio.gather( From 0bfb42954c3ab93eaa4aba98a1b6b309c2f5747a Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 12 Dec 2024 15:17:19 +0000 Subject: [PATCH 090/122] Add test_init_mirror_with_zero_channels --- tests/devices/unit_tests/test_bimorph_mirror.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index f0b957d101..7ac60cc437 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -110,3 +110,9 @@ async def test_set_invalid_channel_throws_error(mirror: BimorphMirror): async def test_init_mirror_with_invalid_channels_throws_error(number_of_channels): with pytest.raises(ValueError): BimorphMirror(prefix="FAKE-PREFIX:", number_of_channels=number_of_channels) + + +@pytest.mark.parametrize("number_of_channels", [0]) +async def test_init_mirror_with_zero_channels(number_of_channels): + mirror = BimorphMirror(prefix="FAKE-PREFIX", number_of_channels=number_of_channels) + assert len(mirror.channels) == 0 From bfe683296bf0dd533f94634538325af5a1d3f4cd Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 7 Jan 2025 14:52:18 +0000 Subject: [PATCH 091/122] Ensure bimorph has finished moving after set --- src/dodal/devices/bimorph_mirror.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 0f0fe210c7..5a4badc183 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -91,6 +91,7 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): self.commit_target_voltages = epics_signal_x(f"{prefix}ALLTRGT.PROC") self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}STATUS") self.err = epics_signal_r(str, f"{prefix}ERR") + self.busy = epics_signal_r(bool, f"{prefix}BUSY") super().__init__(name=name) @@ -104,14 +105,13 @@ async def set(self, value: Mapping[int, float]) -> None: Raises: ValueError: On set to non-existent channel""" - diff = set(self.channels.keys()) - set(values.keys()) - if len(diff) > 0: - raise ValueError(f"Attempting to put to non-existent channels: {diff}") + if any(key not in self.channels for key in value): + raise ValueError(f"Attempting to put to non-existent channels: {value}") # Write target voltages: await asyncio.gather( *[ - self.channels[i].target_voltage.set(target, wait=True) + self.channels[i].output_voltage.set(target, wait=True) for i, target in value.items() ] ) @@ -126,5 +126,6 @@ async def set(self, value: Mapping[int, float]) -> None: self.channels[i].output_voltage, target, timeout=DEFAULT_TIMEOUT ) for i, target in value.items() - ] + ], + wait_for_value(self.busy, False, timeout=DEFAULT_TIMEOUT), ) From 5b1beca467e9f90bdf916fe19f33f11804d2fc81 Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 7 Jan 2025 16:13:22 +0000 Subject: [PATCH 092/122] wait for value --- src/dodal/devices/bimorph_mirror.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 27e713d918..ad4a1a8e88 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -129,7 +129,8 @@ async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> No timeout=DEFAULT_TIMEOUT, ) for i, target in value.items() - ] + ], + wait_for_value(self.busy, False, timeout=DEFAULT_TIMEOUT), ) From b79924d9045fba00f3f5ce6984c32d06b5f8c204 Mon Sep 17 00:00:00 2001 From: DiamondRC Date: Tue, 7 Jan 2025 16:17:40 +0000 Subject: [PATCH 093/122] Update test_bimorph_mirror.py --- tests/devices/unit_tests/test_bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 5ea79608a0..addb3435d7 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -79,7 +79,7 @@ async def test_set_channels_waits_for_vout_readback( await mirror.set(valid_bimorph_values) assert [ - call(mirror.channels[i].output_voltage, val, timeout=ANY) + call(mirror.channels[i].output_voltage, ANY, timeout=ANY) for i, val in valid_bimorph_values.items() ] == mock_wait_for_value.call_args_list From 18f643829864162d0b72c7263f137de4ac222b03 Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 7 Jan 2025 16:30:49 +0000 Subject: [PATCH 094/122] Crop PV name for BUSY toggle --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index ad4a1a8e88..8a8505e6d3 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -91,7 +91,7 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): self.commit_target_voltages = epics_signal_x(f"{prefix}ALLTRGT.PROC") self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}STATUS") self.err = epics_signal_r(str, f"{prefix}ERR") - self.busy = epics_signal_r(bool, f"{prefix}BUSY") + self.busy = epics_signal_r(bool, f"{prefix[:-3]}BUSY") super().__init__(name=name) @AsyncStatus.wrap From d3a80ae96df4cad43582eb7e391716ba6a33fb1f Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 7 Jan 2025 16:33:10 +0000 Subject: [PATCH 095/122] Crop PV name for BUSY toggle --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 8a8505e6d3..fa48975c00 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -91,7 +91,7 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): self.commit_target_voltages = epics_signal_x(f"{prefix}ALLTRGT.PROC") self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}STATUS") self.err = epics_signal_r(str, f"{prefix}ERR") - self.busy = epics_signal_r(bool, f"{prefix[:-3]}BUSY") + self.busy = epics_signal_r(float, f"{prefix[:-3]}BUSY") super().__init__(name=name) @AsyncStatus.wrap From 8f98f5467a47d9e99422c9738228184e1be92414 Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Tue, 7 Jan 2025 16:52:29 +0000 Subject: [PATCH 096/122] await IDLE status --- src/dodal/devices/bimorph_mirror.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index fa48975c00..0f071bed7d 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -91,7 +91,6 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): self.commit_target_voltages = epics_signal_x(f"{prefix}ALLTRGT.PROC") self.status = epics_signal_r(BimorphMirrorStatus, f"{prefix}STATUS") self.err = epics_signal_r(str, f"{prefix}ERR") - self.busy = epics_signal_r(float, f"{prefix[:-3]}BUSY") super().__init__(name=name) @AsyncStatus.wrap @@ -130,7 +129,9 @@ async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> No ) for i, target in value.items() ], - wait_for_value(self.busy, False, timeout=DEFAULT_TIMEOUT), + wait_for_value( + self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT + ), ) From 519349e46eda489868d934b81effec411f1ecd21 Mon Sep 17 00:00:00 2001 From: Richard Cunningham Date: Wed, 8 Jan 2025 09:20:05 +0000 Subject: [PATCH 097/122] Update test to account for idling --- tests/devices/unit_tests/test_bimorph_mirror.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index addb3435d7..105cba61e6 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -5,7 +5,7 @@ from ophyd_async.core import DeviceCollector from ophyd_async.testing import get_mock_put -from dodal.devices.bimorph_mirror import BimorphMirror +from dodal.devices.bimorph_mirror import BimorphMirror, BimorphMirrorStatus VALID_BIMORPH_CHANNELS = [8, 12, 16, 24] @@ -78,10 +78,14 @@ async def test_set_channels_waits_for_vout_readback( await mirror.set(valid_bimorph_values) - assert [ + expected_call_arg_list = [ call(mirror.channels[i].output_voltage, ANY, timeout=ANY) for i, val in valid_bimorph_values.items() - ] == mock_wait_for_value.call_args_list + ] + expected_call_arg_list.append( + call(mirror.status, BimorphMirrorStatus.IDLE, timeout=ANY) + ) + assert expected_call_arg_list == mock_wait_for_value.call_args_list @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) From b849a675792625ab387a9378123b237415a0d998 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 9 Jan 2025 11:27:30 +0000 Subject: [PATCH 098/122] Make BimorphMirrorChannel Movable, add set method --- src/dodal/devices/bimorph_mirror.py | 11 ++++++++++- tests/devices/unit_tests/test_bimorph_mirror.py | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 0f071bed7d..01f2f2caaf 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -41,7 +41,7 @@ class BimorphMirrorStatus(StrictEnum): ERROR = "Error" -class BimorphMirrorChannel(StandardReadable, EpicsDevice): +class BimorphMirrorChannel(StandardReadable, Movable, EpicsDevice): """Collection of PVs comprising a single bimorph channel. Attributes: @@ -56,6 +56,15 @@ class BimorphMirrorChannel(StandardReadable, EpicsDevice): status: A[SignalR[BimorphMirrorOnOff], PvSuffix("STATUS"), Format.CONFIG_SIGNAL] shift: A[SignalW[float], PvSuffix("SHIFT")] + @AsyncStatus.wrap + async def set(self, value: float): + """Sets channel's VOUT to given value. + + Args: + value: float to set VOUT to + """ + await self.output_voltage.set(value) + class BimorphMirror(StandardReadable, Movable): """Class to represent CAENels Bimorph Mirrors. diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 105cba61e6..9b185b1920 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -152,3 +152,17 @@ async def test_init_mirror_with_invalid_channels_throws_error(number_of_channels async def test_init_mirror_with_zero_channels(number_of_channels): mirror = BimorphMirror(prefix="FAKE-PREFIX", number_of_channels=number_of_channels) assert len(mirror.channels) == 0 + + +@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) +async def test_bimorph_mirror_channel_set( + mirror: BimorphMirror, + valid_bimorph_values: dict[int, float], + mock_vtrgt_vout_propogation, +): + for value, channel in zip( + valid_bimorph_values.values(), mirror.channels.values(), strict=True + ): + assert await channel.output_voltage.get_value() != value + await channel.set(value) + assert await channel.output_voltage.get_value() == value From 489c931bd7b40d78588b3734ebdf106a74f6e433 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 9 Jan 2025 13:53:24 +0000 Subject: [PATCH 099/122] Remove unnecessary fixture from test_bimorph_mirror_channel_set --- tests/devices/unit_tests/test_bimorph_mirror.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 9b185b1920..3caa42029d 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -158,7 +158,6 @@ async def test_init_mirror_with_zero_channels(number_of_channels): async def test_bimorph_mirror_channel_set( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], - mock_vtrgt_vout_propogation, ): for value, channel in zip( valid_bimorph_values.values(), mirror.channels.values(), strict=True From ea2e1c8529de9494c09bb7fcd4678dd697518eac Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 08:40:56 +0000 Subject: [PATCH 100/122] Make BimorphMirror.set set to target_voltage in serial, and wait check for mirror status. --- src/dodal/devices/bimorph_mirror.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 01f2f2caaf..dace394277 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -114,17 +114,18 @@ async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> No if any(key not in self.channels for key in value): raise ValueError( - f"Attempting to put to non-existent channels: {[key for key in value if (key not in self.channels)]}" + f"Attempting to put to non-existent channels: {[key for key in value if (key not in self.channels)]}" ) # Write target voltages: - await asyncio.gather( - *[ - self.channels[i].target_voltage.set(target, wait=True) - for i, target in value.items() - ] - ) - + for i, target in value.items(): + await wait_for_value( + self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT + ) + await self.channels[i].target_voltage.set(target, wait=True) + await wait_for_value( + self.status, BimorphMirrorStatus.BUSY, timeout=DEFAULT_TIMEOUT + ) # Trigger set target voltages: await self.commit_target_voltages.trigger() From 502040c8a6ef76213891efe4a5ff4482f5d7f92a Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 08:44:55 +0000 Subject: [PATCH 101/122] Add wait for BimorphMirrorStatus.IDLE before trigger in BimorphMirror.set --- src/dodal/devices/bimorph_mirror.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index dace394277..246756e66b 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -127,6 +127,10 @@ async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> No self.status, BimorphMirrorStatus.BUSY, timeout=DEFAULT_TIMEOUT ) # Trigger set target voltages: + + await wait_for_value( + self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT + ) await self.commit_target_voltages.trigger() # Wait for values to propogate to voltage out rbv: From 3b6c62da60bfc0e897269804fde4dd196c402454 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 10:35:14 +0000 Subject: [PATCH 102/122] Refactor mock_vtrgt_vout_propogation to use callback_on_mock_put --- tests/devices/unit_tests/test_bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 3caa42029d..04368f16d1 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -3,7 +3,7 @@ import pytest from bluesky.run_engine import RunEngine from ophyd_async.core import DeviceCollector -from ophyd_async.testing import get_mock_put +from ophyd_async.testing import callback_on_mock_put, get_mock_put from dodal.devices.bimorph_mirror import BimorphMirror, BimorphMirrorStatus @@ -35,7 +35,7 @@ def mock_vtrgt_vout_propogation(mirror: BimorphMirror): def effect(value: float, wait=False, signal=channel.output_voltage): signal.set(value, wait=wait) - get_mock_put(channel.target_voltage).side_effect = effect + callback_on_mock_put(channel.target_voltage, effect) @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) From 792d8e1a214c362705687d327158391dd0c87b53 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 11:24:41 +0000 Subject: [PATCH 103/122] Add mock_bimorph_mirror_status_functionality --- .../devices/unit_tests/test_bimorph_mirror.py | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 04368f16d1..d9d4143242 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -1,9 +1,10 @@ +import asyncio from unittest.mock import ANY, call, patch import pytest from bluesky.run_engine import RunEngine -from ophyd_async.core import DeviceCollector -from ophyd_async.testing import callback_on_mock_put, get_mock_put +from ophyd_async.core import DeviceCollector, walk_rw_signals +from ophyd_async.testing import callback_on_mock_put, get_mock_put, set_mock_value from dodal.devices.bimorph_mirror import BimorphMirror, BimorphMirrorStatus @@ -38,11 +39,36 @@ def effect(value: float, wait=False, signal=channel.output_voltage): callback_on_mock_put(channel.target_voltage, effect) +@pytest.fixture +def mock_bimorph_mirror_status_functionality(mirror: BimorphMirror): + """Cause BimorphMirror.status to display BUSY/IDLE on set + + Fixture to make all writeable signals on BimorphMirror and BimorphMirrorChannel + cause BimorphMirror.status to go BUSY then IDLE. + + Args: + mirror: BimorphMirror to apply effect to + """ + + async def busy_idle(): + await asyncio.sleep(2) + set_mock_value(mirror.status, BimorphMirrorStatus.BUSY) + await asyncio.sleep(2) + set_mock_value(mirror.status, BimorphMirrorStatus.IDLE) + + async def effect(*_, **__): + asyncio.create_task(busy_idle()) + + for signal in walk_rw_signals(mirror).values(): + callback_on_mock_put(signal, effect) + + @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_waits_for_readback( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], mock_vtrgt_vout_propogation, + mock_bimorph_mirror_status_functionality, ): await mirror.set(valid_bimorph_values) From 2049ac1e149592cbdbeff68a6846cc3fda8149e7 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 11:33:34 +0000 Subject: [PATCH 104/122] Aggregate mock_vtrgt_vout_propogation, mock_bimorph_mirror_status_functionality, into single bimorph_functionality fixture --- .../devices/unit_tests/test_bimorph_mirror.py | 50 ++++++++----------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index d9d4143242..1f767544ac 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -30,45 +30,35 @@ def valid_bimorph_values(mirror: BimorphMirror) -> dict[int, float]: @pytest.fixture -def mock_vtrgt_vout_propogation(mirror: BimorphMirror): - for channel in mirror.channels.values(): - - def effect(value: float, wait=False, signal=channel.output_voltage): - signal.set(value, wait=wait) - - callback_on_mock_put(channel.target_voltage, effect) - - -@pytest.fixture -def mock_bimorph_mirror_status_functionality(mirror: BimorphMirror): - """Cause BimorphMirror.status to display BUSY/IDLE on set - - Fixture to make all writeable signals on BimorphMirror and BimorphMirrorChannel - cause BimorphMirror.status to go BUSY then IDLE. - - Args: - mirror: BimorphMirror to apply effect to - """ - +def bimorph_functionality(mirror: BimorphMirror): async def busy_idle(): - await asyncio.sleep(2) + await asyncio.sleep(0) set_mock_value(mirror.status, BimorphMirrorStatus.BUSY) - await asyncio.sleep(2) + await asyncio.sleep(0) set_mock_value(mirror.status, BimorphMirrorStatus.IDLE) - async def effect(*_, **__): + async def status(*_, **__): asyncio.create_task(busy_idle()) for signal in walk_rw_signals(mirror).values(): - callback_on_mock_put(signal, effect) + callback_on_mock_put(signal, status) + + for channel in mirror.channels.values(): + + def vout_propogation_and_status( + value: float, wait=False, signal=channel.output_voltage + ): + signal.set(value, wait=wait) + asyncio.create_task(busy_idle()) + + callback_on_mock_put(channel.target_voltage, vout_propogation_and_status) @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_waits_for_readback( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], - mock_vtrgt_vout_propogation, - mock_bimorph_mirror_status_functionality, + bimorph_functionality, ): await mirror.set(valid_bimorph_values) @@ -82,7 +72,7 @@ async def test_set_channels_waits_for_readback( async def test_set_channels_triggers_alltrgt_proc( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], - mock_vtrgt_vout_propogation, + bimorph_functionality, ): mock_alltrgt_proc = get_mock_put(mirror.commit_target_voltages) @@ -97,7 +87,7 @@ async def test_set_channels_triggers_alltrgt_proc( async def test_set_channels_waits_for_vout_readback( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], - mock_vtrgt_vout_propogation, + bimorph_functionality, ): with patch("dodal.devices.bimorph_mirror.wait_for_value") as mock_wait_for_value: mock_wait_for_value.assert_not_called() @@ -130,7 +120,7 @@ def out_by_a_little(value: float, wait=False, signal=channel.output_voltage): @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) -async def test_set_one_channel(mirror: BimorphMirror, mock_vtrgt_vout_propogation): +async def test_set_one_channel(mirror: BimorphMirror, bimorph_functionality): values = {1: 1} await mirror.set(values) @@ -150,7 +140,7 @@ async def test_set_one_channel(mirror: BimorphMirror, mock_vtrgt_vout_propogatio async def test_read( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], - mock_vtrgt_vout_propogation, + bimorph_functionality, ): await mirror.set(valid_bimorph_values) From 62c50f2c5aa0a2e2d6f824394154230e682425db Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 11:45:53 +0000 Subject: [PATCH 105/122] Make test_set_channels_waits_for_vout_readback check subset of call_args rather than equality --- tests/devices/unit_tests/test_bimorph_mirror.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 1f767544ac..518b63800e 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -98,10 +98,10 @@ async def test_set_channels_waits_for_vout_readback( call(mirror.channels[i].output_voltage, ANY, timeout=ANY) for i, val in valid_bimorph_values.items() ] - expected_call_arg_list.append( - call(mirror.status, BimorphMirrorStatus.IDLE, timeout=ANY) + + assert all( + c in mock_wait_for_value.call_args_list for c in expected_call_arg_list ) - assert expected_call_arg_list == mock_wait_for_value.call_args_list @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) From 08091abac0707507e2febe1261039b998cf9aebb Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 12:01:26 +0000 Subject: [PATCH 106/122] Add bimorph_functionality fixture to test_set_channels_allows_tolerance --- tests/devices/unit_tests/test_bimorph_mirror.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 518b63800e..10113b515e 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -108,6 +108,7 @@ async def test_set_channels_waits_for_vout_readback( async def test_set_channels_allows_tolerance( mirror: BimorphMirror, valid_bimorph_values: dict[int, float], + bimorph_functionality, ): for channel in mirror.channels.values(): From c81c50c816b567a0cb626c6978a4fffec9766f44 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 13:16:11 +0000 Subject: [PATCH 107/122] Remove tolerance in BimorphMirror.set --- src/dodal/devices/bimorph_mirror.py | 11 ++--------- tests/devices/unit_tests/test_bimorph_mirror.py | 16 ---------------- 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 246756e66b..50c54489b1 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -126,8 +126,8 @@ async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> No await wait_for_value( self.status, BimorphMirrorStatus.BUSY, timeout=DEFAULT_TIMEOUT ) - # Trigger set target voltages: + # Trigger set target voltages: await wait_for_value( self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT ) @@ -138,7 +138,7 @@ async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> No *[ wait_for_value( self.channels[i].output_voltage, - tolerance_func_builder(tolerance, target), + target, timeout=DEFAULT_TIMEOUT, ) for i, target in value.items() @@ -147,10 +147,3 @@ async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> No self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT ), ) - - -def tolerance_func_builder(tolerance: float, target_value: float): - def is_within_value(x): - return abs(x - target_value) <= tolerance - - return is_within_value diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 10113b515e..178116185b 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -104,22 +104,6 @@ async def test_set_channels_waits_for_vout_readback( ) -@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) -async def test_set_channels_allows_tolerance( - mirror: BimorphMirror, - valid_bimorph_values: dict[int, float], - bimorph_functionality, -): - for channel in mirror.channels.values(): - - def out_by_a_little(value: float, wait=False, signal=channel.output_voltage): - signal.set(value + 0.00001, wait=wait) - - get_mock_put(channel.target_voltage).side_effect = out_by_a_little - - await mirror.set(valid_bimorph_values) - - @pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_one_channel(mirror: BimorphMirror, bimorph_functionality): values = {1: 1} From eec80b40d8c4fa70f40601e6066050eccfa394d2 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 13:25:25 +0000 Subject: [PATCH 108/122] Remove unused argument in BimorphMirror.set --- src/dodal/devices/bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 50c54489b1..0734d59390 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -103,7 +103,7 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): super().__init__(name=name) @AsyncStatus.wrap - async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> None: + async def set(self, value: Mapping[int, float]) -> None: """Sets bimorph voltages in parrallel via target voltage and all proc. Args: From cfa4185075a0a56ad5d2c270a4cd706557bdb574 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 16:01:25 +0000 Subject: [PATCH 109/122] Add comment to BimorphMirror.set explaining serial set --- src/dodal/devices/bimorph_mirror.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 0734d59390..aea2271d09 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -117,7 +117,8 @@ async def set(self, value: Mapping[int, float]) -> None: f"Attempting to put to non-existent channels: {[key for key in value if (key not in self.channels)]}" ) - # Write target voltages: + # Write target voltages in serial + # Voltages are written in serial as bimorph PSU cannot handle simultaneous sets for i, target in value.items(): await wait_for_value( self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT From 15c70779ca0537ea0607740241a771f42d809b76 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Thu, 16 Jan 2025 16:16:51 +0000 Subject: [PATCH 110/122] Refactor test_bimorph_mirror to use mirror_with_mocked_put fixture --- .../devices/unit_tests/test_bimorph_mirror.py | 75 +++++++++---------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 178116185b..38e07367a3 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -11,7 +11,7 @@ VALID_BIMORPH_CHANNELS = [8, 12, 16, 24] -@pytest.fixture +@pytest.fixture(params=VALID_BIMORPH_CHANNELS) def mirror(request, RE: RunEngine) -> BimorphMirror: number_of_channels = request.param @@ -30,7 +30,7 @@ def valid_bimorph_values(mirror: BimorphMirror) -> dict[int, float]: @pytest.fixture -def bimorph_functionality(mirror: BimorphMirror): +def mirror_with_mocked_put(mirror: BimorphMirror): async def busy_idle(): await asyncio.sleep(0) set_mock_value(mirror.status, BimorphMirrorStatus.BUSY) @@ -53,49 +53,45 @@ def vout_propogation_and_status( callback_on_mock_put(channel.target_voltage, vout_propogation_and_status) + return mirror + -@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_waits_for_readback( - mirror: BimorphMirror, + mirror_with_mocked_put: BimorphMirror, valid_bimorph_values: dict[int, float], - bimorph_functionality, ): - await mirror.set(valid_bimorph_values) + await mirror_with_mocked_put.set(valid_bimorph_values) assert { - key: await mirror.channels[key].target_voltage.get_value() + key: await mirror_with_mocked_put.channels[key].target_voltage.get_value() for key in valid_bimorph_values } == valid_bimorph_values -@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_triggers_alltrgt_proc( - mirror: BimorphMirror, + mirror_with_mocked_put: BimorphMirror, valid_bimorph_values: dict[int, float], - bimorph_functionality, ): - mock_alltrgt_proc = get_mock_put(mirror.commit_target_voltages) + mock_alltrgt_proc = get_mock_put(mirror_with_mocked_put.commit_target_voltages) mock_alltrgt_proc.assert_not_called() - await mirror.set(valid_bimorph_values) + await mirror_with_mocked_put.set(valid_bimorph_values) mock_alltrgt_proc.assert_called_once() -@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_set_channels_waits_for_vout_readback( - mirror: BimorphMirror, + mirror_with_mocked_put: BimorphMirror, valid_bimorph_values: dict[int, float], - bimorph_functionality, ): with patch("dodal.devices.bimorph_mirror.wait_for_value") as mock_wait_for_value: mock_wait_for_value.assert_not_called() - await mirror.set(valid_bimorph_values) + await mirror_with_mocked_put.set(valid_bimorph_values) expected_call_arg_list = [ - call(mirror.channels[i].output_voltage, ANY, timeout=ANY) + call(mirror_with_mocked_put.channels[i].output_voltage, ANY, timeout=ANY) for i, val in valid_bimorph_values.items() ] @@ -104,43 +100,43 @@ async def test_set_channels_waits_for_vout_readback( ) -@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) -async def test_set_one_channel(mirror: BimorphMirror, bimorph_functionality): +async def test_set_one_channel(mirror_with_mocked_put: BimorphMirror): values = {1: 1} - await mirror.set(values) + await mirror_with_mocked_put.set(values) - read = await mirror.read() + read = await mirror_with_mocked_put.read() assert [ - await mirror.channels[key].target_voltage.get_value() for key in values + await mirror_with_mocked_put.channels[key].target_voltage.get_value() + for key in values ] == list(values) assert [ - read[f"{mirror.name}-channels-{key}-output_voltage"]["value"] for key in values + read[f"{mirror_with_mocked_put.name}-channels-{key}-output_voltage"]["value"] + for key in values ] == list(values) -@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_read( - mirror: BimorphMirror, + mirror_with_mocked_put: BimorphMirror, valid_bimorph_values: dict[int, float], - bimorph_functionality, ): - await mirror.set(valid_bimorph_values) + await mirror_with_mocked_put.set(valid_bimorph_values) - read = await mirror.read() + read = await mirror_with_mocked_put.read() assert [ - read[f"{mirror.name}-channels-{i}-output_voltage"]["value"] - for i in range(1, len(mirror.channels) + 1) + read[f"{mirror_with_mocked_put.name}-channels-{i}-output_voltage"]["value"] + for i in range(1, len(mirror_with_mocked_put.channels) + 1) ] == list(valid_bimorph_values.values()) -@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) -async def test_set_invalid_channel_throws_error(mirror: BimorphMirror): +async def test_set_invalid_channel_throws_error(mirror_with_mocked_put: BimorphMirror): with pytest.raises(ValueError): - await mirror.set({len(mirror.channels) + 1: 0.0}) + await mirror_with_mocked_put.set( + {len(mirror_with_mocked_put.channels) + 1: 0.0} + ) @pytest.mark.parametrize("number_of_channels", [-1]) @@ -151,17 +147,20 @@ async def test_init_mirror_with_invalid_channels_throws_error(number_of_channels @pytest.mark.parametrize("number_of_channels", [0]) async def test_init_mirror_with_zero_channels(number_of_channels): - mirror = BimorphMirror(prefix="FAKE-PREFIX", number_of_channels=number_of_channels) - assert len(mirror.channels) == 0 + mirror_with_mocked_put = BimorphMirror( + prefix="FAKE-PREFIX", number_of_channels=number_of_channels + ) + assert len(mirror_with_mocked_put.channels) == 0 -@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True) async def test_bimorph_mirror_channel_set( - mirror: BimorphMirror, + mirror_with_mocked_put: BimorphMirror, valid_bimorph_values: dict[int, float], ): for value, channel in zip( - valid_bimorph_values.values(), mirror.channels.values(), strict=True + valid_bimorph_values.values(), + mirror_with_mocked_put.channels.values(), + strict=True, ): assert await channel.output_voltage.get_value() != value await channel.set(value) From 2f7ec8528754dd11c689dc6fdf6dc3bf28eab1d9 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 24 Jan 2025 15:20:32 +0000 Subject: [PATCH 111/122] Add typing to mirror_with_mocked_put status function --- tests/devices/unit_tests/test_bimorph_mirror.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 38e07367a3..9fea73b4eb 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -1,4 +1,5 @@ import asyncio +from typing import Any from unittest.mock import ANY, call, patch import pytest @@ -37,7 +38,7 @@ async def busy_idle(): await asyncio.sleep(0) set_mock_value(mirror.status, BimorphMirrorStatus.IDLE) - async def status(*_, **__): + async def status(*_: Any, **__: Any): asyncio.create_task(busy_idle()) for signal in walk_rw_signals(mirror).values(): From fba60a75c0d1c31614a0f4c9f5b4d9570185a5da Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 24 Jan 2025 15:24:12 +0000 Subject: [PATCH 112/122] Add type hinting to mirror_with_mocked_put vout_propogation_and_status function --- tests/devices/unit_tests/test_bimorph_mirror.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 9fea73b4eb..54003e9666 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -4,7 +4,7 @@ import pytest from bluesky.run_engine import RunEngine -from ophyd_async.core import DeviceCollector, walk_rw_signals +from ophyd_async.core import DeviceCollector, SignalRW, walk_rw_signals from ophyd_async.testing import callback_on_mock_put, get_mock_put, set_mock_value from dodal.devices.bimorph_mirror import BimorphMirror, BimorphMirrorStatus @@ -47,7 +47,9 @@ async def status(*_: Any, **__: Any): for channel in mirror.channels.values(): def vout_propogation_and_status( - value: float, wait=False, signal=channel.output_voltage + value: float, + wait: bool = False, + signal: SignalRW[float] = channel.output_voltage, ): signal.set(value, wait=wait) asyncio.create_task(busy_idle()) From 4c6403b3aeb8936fb14e1e33d75c43735d0baf58 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 24 Jan 2025 15:26:24 +0000 Subject: [PATCH 113/122] Rename all ..vout.. references to ..output_voltage.. --- tests/devices/unit_tests/test_bimorph_mirror.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 54003e9666..949fe25673 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -46,7 +46,7 @@ async def status(*_: Any, **__: Any): for channel in mirror.channels.values(): - def vout_propogation_and_status( + def output_voltage_propogation_and_status( value: float, wait: bool = False, signal: SignalRW[float] = channel.output_voltage, @@ -54,7 +54,9 @@ def vout_propogation_and_status( signal.set(value, wait=wait) asyncio.create_task(busy_idle()) - callback_on_mock_put(channel.target_voltage, vout_propogation_and_status) + callback_on_mock_put( + channel.target_voltage, output_voltage_propogation_and_status + ) return mirror @@ -84,7 +86,7 @@ async def test_set_channels_triggers_alltrgt_proc( mock_alltrgt_proc.assert_called_once() -async def test_set_channels_waits_for_vout_readback( +async def test_set_channels_waits_for_output_voltage_readback( mirror_with_mocked_put: BimorphMirror, valid_bimorph_values: dict[int, float], ): From 597198ac87497b81a06c3ef26c33e6e8d3817c32 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 24 Jan 2025 15:39:54 +0000 Subject: [PATCH 114/122] Make BimorphMirror.set use set_and_wait_for_other_value rather than two seperate calls --- src/dodal/devices/bimorph_mirror.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index aea2271d09..b2efd05aad 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -12,6 +12,7 @@ SignalW, StandardReadable, StrictEnum, + set_and_wait_for_other_value, wait_for_value, ) from ophyd_async.core import StandardReadableFormat as Format @@ -123,9 +124,11 @@ async def set(self, value: Mapping[int, float]) -> None: await wait_for_value( self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT ) - await self.channels[i].target_voltage.set(target, wait=True) - await wait_for_value( - self.status, BimorphMirrorStatus.BUSY, timeout=DEFAULT_TIMEOUT + await set_and_wait_for_other_value( + self.channels[i].target_voltage, + target, + self.status, + BimorphMirrorStatus.BUSY, ) # Trigger set target voltages: From bad136fd7f6f9a99d9a28ad03fae215686430fa5 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Fri, 24 Jan 2025 16:09:21 +0000 Subject: [PATCH 115/122] Rewrite mirror_with_mocked_put to not use default arguments in helper functions, add docstring --- .../devices/unit_tests/test_bimorph_mirror.py | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 949fe25673..7fadf01ebb 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -1,13 +1,18 @@ import asyncio +from collections.abc import Callable from typing import Any from unittest.mock import ANY, call, patch import pytest from bluesky.run_engine import RunEngine -from ophyd_async.core import DeviceCollector, SignalRW, walk_rw_signals +from ophyd_async.core import DeviceCollector, walk_rw_signals from ophyd_async.testing import callback_on_mock_put, get_mock_put, set_mock_value -from dodal.devices.bimorph_mirror import BimorphMirror, BimorphMirrorStatus +from dodal.devices.bimorph_mirror import ( + BimorphMirror, + BimorphMirrorChannel, + BimorphMirrorStatus, +) VALID_BIMORPH_CHANNELS = [8, 12, 16, 24] @@ -32,6 +37,16 @@ def valid_bimorph_values(mirror: BimorphMirror) -> dict[int, float]: @pytest.fixture def mirror_with_mocked_put(mirror: BimorphMirror): + """Returns BimorphMirror with some simulated behaviour. + + BimorphMirror that simulates BimorphMirrorStatus BUSY/IDLE behaviour on all + rw_signals, and propogation from target_voltage to output_voltage on each + channel. + + Args: + mirror: BimorphMirror fixture + """ + async def busy_idle(): await asyncio.sleep(0) set_mock_value(mirror.status, BimorphMirrorStatus.BUSY) @@ -44,19 +59,20 @@ async def status(*_: Any, **__: Any): for signal in walk_rw_signals(mirror).values(): callback_on_mock_put(signal, status) - for channel in mirror.channels.values(): - + def callback_function( + channel: BimorphMirrorChannel, + ) -> Callable[[float, bool], None]: def output_voltage_propogation_and_status( value: float, wait: bool = False, - signal: SignalRW[float] = channel.output_voltage, ): - signal.set(value, wait=wait) + channel.output_voltage.set(value, wait=wait) asyncio.create_task(busy_idle()) - callback_on_mock_put( - channel.target_voltage, output_voltage_propogation_and_status - ) + return output_voltage_propogation_and_status + + for channel in mirror.channels.values(): + callback_on_mock_put(channel.target_voltage, callback_function(channel)) return mirror From 3e05c45276fd8a5d897a0563ab0886f9bc6e92a6 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Mon, 27 Jan 2025 11:21:23 +0000 Subject: [PATCH 116/122] Renamed functions in mirror_with_mocked_put fixture for readability --- tests/devices/unit_tests/test_bimorph_mirror.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 7fadf01ebb..073b3f6380 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -53,11 +53,11 @@ async def busy_idle(): await asyncio.sleep(0) set_mock_value(mirror.status, BimorphMirrorStatus.IDLE) - async def status(*_: Any, **__: Any): + async def start_busy_idle(*_: Any, **__: Any): asyncio.create_task(busy_idle()) for signal in walk_rw_signals(mirror).values(): - callback_on_mock_put(signal, status) + callback_on_mock_put(signal, start_busy_idle) def callback_function( channel: BimorphMirrorChannel, From f0e4877d3a165f1fa92f9eb9abf79b89ef7e48d6 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Tue, 28 Jan 2025 11:29:49 +0000 Subject: [PATCH 117/122] Set DEFAULT_TIMEOUT to 60 --- src/dodal/devices/bimorph_mirror.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index b2efd05aad..dbbf054f65 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -24,6 +24,8 @@ epics_signal_x, ) +DEFAULT_TIMEOUT = 60 + class BimorphMirrorOnOff(StrictEnum): ON = "ON" From dae23a19e791f30bbc852aec06df8b40a329ea80 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Tue, 28 Jan 2025 13:25:07 +0000 Subject: [PATCH 118/122] Change BimorphMirror.set to write to output_voltage and to not trigger commit_target_voltages --- src/dodal/devices/bimorph_mirror.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index dbbf054f65..48d4543357 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -4,7 +4,6 @@ from bluesky.protocols import Movable from ophyd_async.core import ( - DEFAULT_TIMEOUT, AsyncStatus, DeviceVector, SignalR, @@ -107,7 +106,7 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): @AsyncStatus.wrap async def set(self, value: Mapping[int, float]) -> None: - """Sets bimorph voltages in parrallel via target voltage and all proc. + """Sets bimorph voltages in serial via VOUT. Args: value: Dict of channel numbers to target voltages @@ -127,18 +126,12 @@ async def set(self, value: Mapping[int, float]) -> None: self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT ) await set_and_wait_for_other_value( - self.channels[i].target_voltage, + self.channels[i].output_voltage, target, self.status, BimorphMirrorStatus.BUSY, ) - # Trigger set target voltages: - await wait_for_value( - self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT - ) - await self.commit_target_voltages.trigger() - # Wait for values to propogate to voltage out rbv: await asyncio.gather( *[ From 5aa7c20ad1bb998e680bec2d05c5acdcaaf09e5e Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Tue, 28 Jan 2025 13:26:00 +0000 Subject: [PATCH 119/122] Remove BimorphMirror.commit_target_voltages --- src/dodal/devices/bimorph_mirror.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/dodal/devices/bimorph_mirror.py b/src/dodal/devices/bimorph_mirror.py index 48d4543357..75adb7804c 100644 --- a/src/dodal/devices/bimorph_mirror.py +++ b/src/dodal/devices/bimorph_mirror.py @@ -20,7 +20,6 @@ PvSuffix, epics_signal_r, epics_signal_w, - epics_signal_x, ) DEFAULT_TIMEOUT = 60 @@ -74,7 +73,6 @@ class BimorphMirror(StandardReadable, Movable): Attributes: channels: DeviceVector of BimorphMirrorChannel, indexed from 1, for each channel enabled: Writeable BimorphOnOff - commit_target_voltages: Procable signal that writes values in each channel's VTRGT to VOUT status: Readable BimorphMirrorStatus Busy/Idle status err: Alarm status""" @@ -99,7 +97,6 @@ def __init__(self, prefix: str, number_of_channels: int, name=""): } ) self.enabled = epics_signal_w(BimorphMirrorOnOff, f"{prefix}ONOFF") - self.commit_target_voltages = epics_signal_x(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) From 316ff610bfa4779af20dfac0db19cb4c16a7ed0d Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Tue, 28 Jan 2025 13:26:41 +0000 Subject: [PATCH 120/122] Remove test_set_channels_triggers_alltrgt_proc --- tests/devices/unit_tests/test_bimorph_mirror.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 073b3f6380..dc8a36d2cd 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -6,7 +6,7 @@ import pytest from bluesky.run_engine import RunEngine from ophyd_async.core import DeviceCollector, walk_rw_signals -from ophyd_async.testing import callback_on_mock_put, get_mock_put, set_mock_value +from ophyd_async.testing import callback_on_mock_put, set_mock_value from dodal.devices.bimorph_mirror import ( BimorphMirror, @@ -89,19 +89,6 @@ async def test_set_channels_waits_for_readback( } == valid_bimorph_values -async def test_set_channels_triggers_alltrgt_proc( - mirror_with_mocked_put: BimorphMirror, - valid_bimorph_values: dict[int, float], -): - mock_alltrgt_proc = get_mock_put(mirror_with_mocked_put.commit_target_voltages) - - mock_alltrgt_proc.assert_not_called() - - await mirror_with_mocked_put.set(valid_bimorph_values) - - mock_alltrgt_proc.assert_called_once() - - async def test_set_channels_waits_for_output_voltage_readback( mirror_with_mocked_put: BimorphMirror, valid_bimorph_values: dict[int, float], From e8e36c3f9ddbea897ad5d59df6458a29864f7fee Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Tue, 28 Jan 2025 13:28:14 +0000 Subject: [PATCH 121/122] Change test_set_channels_waits_for_readback to read from output_voltage --- tests/devices/unit_tests/test_bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index dc8a36d2cd..4948b17ef9 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -84,7 +84,7 @@ async def test_set_channels_waits_for_readback( await mirror_with_mocked_put.set(valid_bimorph_values) assert { - key: await mirror_with_mocked_put.channels[key].target_voltage.get_value() + key: await mirror_with_mocked_put.channels[key].output_voltage.get_value() for key in valid_bimorph_values } == valid_bimorph_values From 4b6a65bb231e175bcc869963f863aae2d7b28cb3 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Date: Tue, 28 Jan 2025 13:30:03 +0000 Subject: [PATCH 122/122] Make test_set_one_channel read from output_voltage --- tests/devices/unit_tests/test_bimorph_mirror.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/devices/unit_tests/test_bimorph_mirror.py b/tests/devices/unit_tests/test_bimorph_mirror.py index 4948b17ef9..85460dac52 100644 --- a/tests/devices/unit_tests/test_bimorph_mirror.py +++ b/tests/devices/unit_tests/test_bimorph_mirror.py @@ -116,7 +116,7 @@ async def test_set_one_channel(mirror_with_mocked_put: BimorphMirror): read = await mirror_with_mocked_put.read() assert [ - await mirror_with_mocked_put.channels[key].target_voltage.get_value() + await mirror_with_mocked_put.channels[key].output_voltage.get_value() for key in values ] == list(values)