Source code for ophyd_async.core._protocol
from __future__ import annotations
from abc import abstractmethod
from typing import (
TYPE_CHECKING,
Any,
Dict,
Generic,
Protocol,
TypeVar,
runtime_checkable,
)
from bluesky.protocols import DataKey, HasName, Reading
if TYPE_CHECKING:
from ._status import AsyncStatus
[docs]
@runtime_checkable
class AsyncReadable(HasName, Protocol):
[docs]
@abstractmethod
async def read(self) -> Dict[str, Reading]:
"""Return an OrderedDict mapping string field name(s) to dictionaries
of values and timestamps and optional per-point metadata.
Example return value:
.. code-block:: python
OrderedDict(('channel1',
{'value': 5, 'timestamp': 1472493713.271991}),
('channel2',
{'value': 16, 'timestamp': 1472493713.539238}))
"""
...
[docs]
@abstractmethod
async def describe(self) -> Dict[str, DataKey]:
"""Return an OrderedDict with exactly the same keys as the ``read``
method, here mapped to per-scan metadata about each field.
Example return value:
.. code-block:: python
OrderedDict(('channel1',
{'source': 'XF23-ID:SOME_PV_NAME',
'dtype': 'number',
'shape': []}),
('channel2',
{'source': 'XF23-ID:SOME_PV_NAME',
'dtype': 'number',
'shape': []}))
"""
...
[docs]
@runtime_checkable
class AsyncConfigurable(Protocol):
[docs]
@abstractmethod
async def read_configuration(self) -> Dict[str, Reading]:
"""Same API as ``read`` but for slow-changing fields related to configuration.
e.g., exposure time. These will typically be read only once per run.
"""
...
[docs]
@abstractmethod
async def describe_configuration(self) -> Dict[str, DataKey]:
"""Same API as ``describe``, but corresponding to the keys in
``read_configuration``.
"""
...
@runtime_checkable
class AsyncPausable(Protocol):
@abstractmethod
async def pause(self) -> None:
"""Perform device-specific work when the RunEngine pauses."""
...
@abstractmethod
async def resume(self) -> None:
"""Perform device-specific work when the RunEngine resumes after a pause."""
...
[docs]
@runtime_checkable
class AsyncStageable(Protocol):
[docs]
@abstractmethod
def stage(self) -> AsyncStatus:
"""An optional hook for "setting up" the device for acquisition.
It should return a ``Status`` that is marked done when the device is
done staging.
"""
...
[docs]
@abstractmethod
def unstage(self) -> AsyncStatus:
"""A hook for "cleaning up" the device after acquisition.
It should return a ``Status`` that is marked done when the device is finished
unstaging.
"""
...
C = TypeVar("C", contravariant=True)
class Watcher(Protocol, Generic[C]):
@staticmethod
def __call__(
*,
current: C,
initial: C,
target: C,
name: str | None,
unit: str | None,
precision: float | None,
fraction: float | None,
time_elapsed: float | None,
time_remaining: float | None,
) -> Any: ...