Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/dodal/devices/fast_shutter.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,15 @@ def __init__(
):
self.open_state = open_state
self.close_state = close_state
with self.add_children_as_readables():
with self.add_children_as_readables(StandardReadableFormat.HINTED_SIGNAL):
self.shutter_state = epics_signal_rw(type(self.open_state), pv)
super().__init__(name)

def set_name(self, name: str, *, child_name_separator: str | None = None) -> None:
"""Set name of the device and its children."""
super().set_name(name, child_name_separator=child_name_separator)
self.shutter_state.set_name(name)


class DualFastShutter(StandardReadable, FastShutter[EnumTypesT], Generic[EnumTypesT]):
"""A fast shutter device that handles the positions of two other fast shutters. The
Expand Down Expand Up @@ -104,7 +109,7 @@ def __init__(
self._shutter2_ref = Reference(shutter2)
self._selected_shutter_ref = Reference(selected_source)

with self.add_children_as_readables():
with self.add_children_as_readables(StandardReadableFormat.HINTED_SIGNAL):
self.shutter_state = derived_signal_rw(
self._read_shutter_state,
self._set_shutter_state,
Expand Down Expand Up @@ -153,3 +158,8 @@ async def _set_shutter_state(self, value: EnumTypesT):
)
await inactive_shutter.set(inactive_shutter.close_state)
await active_shutter.set(value)

def set_name(self, name: str, *, child_name_separator: str | None = None) -> None:
"""Set name of the device and its children."""
super().set_name(name, child_name_separator=child_name_separator)
self.shutter_state.set_name(name)
15 changes: 13 additions & 2 deletions src/dodal/devices/selectable_source.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
from typing import TypeVar

from bluesky.protocols import Movable
from ophyd_async.core import AsyncStatus, StandardReadable, StrictEnum, soft_signal_rw
from ophyd_async.core import (
AsyncStatus,
StandardReadable,
StandardReadableFormat,
StrictEnum,
soft_signal_rw,
)


class SelectedSource(StrictEnum):
Expand Down Expand Up @@ -30,12 +36,17 @@ class SourceSelector(StandardReadable, Movable[SelectedSource]):
"""

def __init__(self, name: str = ""):
with self.add_children_as_readables():
with self.add_children_as_readables(StandardReadableFormat.HINTED_SIGNAL):
self.selected_source = soft_signal_rw(
SelectedSource, SelectedSource.SOURCE1
)
super().__init__(name)

def set_name(self, name: str, *, child_name_separator: str | None = None) -> None:
"""Set name of the device and its children."""
super().set_name(name, child_name_separator=child_name_separator)
self.selected_source.set_name(name)

@AsyncStatus.wrap
async def set(self, value: SelectedSource):
await self.selected_source.set(value)
6 changes: 2 additions & 4 deletions tests/devices/test_fast_shutters.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,7 @@ async def test_shutter_set_open_close_without_knowing_enum_values(


async def test_shutter_read(shutter1: GenericFastShutter) -> None:
await assert_reading(
shutter1, {f"{shutter1.name}-shutter_state": partial_reading(InOut.IN)}
)
await assert_reading(shutter1, {shutter1.name: partial_reading(InOut.IN)})


@pytest.fixture
Expand Down Expand Up @@ -139,7 +137,7 @@ async def test_dual_fast_shutter_read(
)
await assert_reading(
dual_fast_shutter,
{f"{dual_fast_shutter.name}-shutter_state": partial_reading(InOut.IN)}
{dual_fast_shutter.name: partial_reading(InOut.IN)}
| shutter1_read
| shutter2_read
| source_selector_read,
Expand Down
6 changes: 1 addition & 5 deletions tests/devices/test_selectable_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,7 @@ async def test_source_selector_set(
async def test_source_selector_read(source_selector: SourceSelector) -> None:
await assert_reading(
source_selector,
{
f"{source_selector.name}-selected_source": partial_reading(
SelectedSource.SOURCE1
)
},
{source_selector.name: partial_reading(SelectedSource.SOURCE1)},
)


Expand Down