Skip to content

Commit 111ce25

Browse files
Fix transfocator timeout error on repeated sets (#1885)
* Replace transfocator observe with short sleep
1 parent 07c1416 commit 111ce25

File tree

2 files changed

+7
-19
lines changed

2 files changed

+7
-19
lines changed

src/dodal/devices/beamlines/i04/transfocator.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from ophyd_async.core import (
44
AsyncStatus,
55
StandardReadable,
6-
observe_value,
76
wait_for_value,
87
)
98
from ophyd_async.epics.core import epics_signal_r, epics_signal_rw
@@ -57,16 +56,12 @@ async def set(self, value: float):
5756
"""
5857
LOGGER.info(f"Transfocator setting {value} beamsize")
5958

60-
# Logic in the IOC calculates _num_lenses_calc_rbv when _vert_size_calc_sp changes
61-
62-
# Register an observer before setting _vert_size_calc_sp to ensure we don't miss changes
63-
num_lenses_calc_iterator = observe_value(
64-
self._num_lenses_calc_rbv, timeout=self.TIMEOUT
65-
)
66-
67-
await anext(num_lenses_calc_iterator)
6859
await self._vert_size_calc_sp.set(value)
69-
calc_lenses = await anext(num_lenses_calc_iterator)
60+
# Logic in the IOC calculates _num_lenses_calc_rbv when _vert_size_calc_sp changes,
61+
# but this isn't instant so we need a short sleep until
62+
# https://jira.diamond.ac.uk/browse/I04-1100
63+
await asyncio.sleep(0.1)
64+
calc_lenses = await self._num_lenses_calc_rbv.get_value()
7065

7166
async with periodic_reminder(
7267
f"Waiting for transfocator to insert {calc_lenses} into beam"

tests/devices/beamlines/i04/test_transfocator.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,9 @@ def lens_number_is_half_beamsize(
1818
transfocator._vert_size_calc_sp.subscribe_reading(lens_number_is_half_beamsize)
1919

2020

21-
async def set_beamsize_to_same_value_as_mock_signal(
22-
transfocator: Transfocator, value: float
23-
):
24-
set_mock_value(transfocator._num_lenses_calc_rbv, value)
25-
await transfocator.set(value)
26-
27-
28-
@patch("dodal.devices.beamlines.i04.transfocator.wait_for_value")
21+
@patch("dodal.devices.beamlines.i04.transfocator.asyncio.sleep", new=AsyncMock())
22+
@patch("dodal.devices.beamlines.i04.transfocator.wait_for_value", new=AsyncMock())
2923
async def test_when_beamsize_set_then_set_correctly_on_device_and_waited_on(
30-
mock_wait_for_value,
3124
fake_transfocator: Transfocator,
3225
):
3326
given_predicted_lenses_is_half_of_beamsize(fake_transfocator)

0 commit comments

Comments
 (0)