Source code for dodal.devices.backlight
from asyncio import sleep
from bluesky.protocols import Movable
from ophyd_async.core import AsyncStatus, StandardReadable, StrictEnum
from ophyd_async.epics.core import epics_signal_rw
[docs]
class BacklightPower(StrictEnum):
ON = "On"
OFF = "Off"
[docs]
class BacklightPosition(StrictEnum):
IN = "In"
OUT = "Out"
[docs]
class Backlight(StandardReadable, Movable):
"""Simple device to trigger the pneumatic in/out."""
TIME_TO_MOVE_S = 1.0 # Tested using a stopwatch on the beamline 09/2024
def __init__(self, prefix: str, name: str = "") -> None:
with self.add_children_as_readables():
self.power = epics_signal_rw(BacklightPower, prefix + "-EA-BLIT-01:TOGGLE")
self.position = epics_signal_rw(
BacklightPosition, prefix + "-EA-BL-01:CTRL"
)
super().__init__(name)
[docs]
@AsyncStatus.wrap
async def set(self, value: BacklightPosition):
"""This setter will turn the backlight on when we move it in to the beam and off
when we move it out.
Moving the backlight in/out is a pneumatic axis and we have no readback on its
position so it appears to us to instantly move. In fact it does take some time
to move completely in/out so we sleep here to simulate this.
"""
old_position = await self.position.get_value()
await self.position.set(value)
if value == BacklightPosition.OUT:
await self.power.set(BacklightPower.OFF)
else:
await self.power.set(BacklightPower.ON)
if old_position != value:
await sleep(self.TIME_TO_MOVE_S)