Source code for ophyd_async.epics.testing._example_ioc

from collections.abc import Sequence
from pathlib import Path
from typing import Annotated as A
from typing import Literal

import numpy as np

from ophyd_async.core import (
    Array1D,
    SignalRW,
    StrictEnum,
    Table,
)
from ophyd_async.epics.core import (
    EpicsDevice,
    PvSuffix,
)

from ._utils import TestingIOC

CA_PVA_RECORDS = str(Path(__file__).parent / "test_records.db")
PVA_RECORDS = str(Path(__file__).parent / "test_records_pva.db")


class ExampleEnum(StrictEnum):
    A = "Aaa"
    B = "Bbb"
    C = "Ccc"


class ExampleTable(Table):
    bool: Array1D[np.bool_]
    int: Array1D[np.int32]
    float: Array1D[np.float64]
    str: Sequence[str]
    enum: Sequence[ExampleEnum]


class ExampleCaDevice(EpicsDevice):
    my_int: A[SignalRW[int], PvSuffix("int")]
    my_float: A[SignalRW[float], PvSuffix("float")]
    my_str: A[SignalRW[str], PvSuffix("str")]
    longstr: A[SignalRW[str], PvSuffix("longstr")]
    longstr2: A[SignalRW[str], PvSuffix("longstr2")]
    my_bool: A[SignalRW[bool], PvSuffix("bool")]
    enum: A[SignalRW[ExampleEnum], PvSuffix("enum")]
    enum2: A[SignalRW[ExampleEnum], PvSuffix("enum2")]
    bool_unnamed: A[SignalRW[bool], PvSuffix("bool_unnamed")]
    partialint: A[SignalRW[int], PvSuffix("partialint")]
    lessint: A[SignalRW[int], PvSuffix("lessint")]
    uint8a: A[SignalRW[Array1D[np.uint8]], PvSuffix("uint8a")]
    int16a: A[SignalRW[Array1D[np.int16]], PvSuffix("int16a")]
    int32a: A[SignalRW[Array1D[np.int32]], PvSuffix("int32a")]
    float32a: A[SignalRW[Array1D[np.float32]], PvSuffix("float32a")]
    float64a: A[SignalRW[Array1D[np.float64]], PvSuffix("float64a")]
    stra: A[SignalRW[Sequence[str]], PvSuffix("stra")]


class ExamplePvaDevice(ExampleCaDevice):  # pva can support all signal types that ca can
    int8a: A[SignalRW[Array1D[np.int8]], PvSuffix("int8a")]
    uint16a: A[SignalRW[Array1D[np.uint16]], PvSuffix("uint16a")]
    uint32a: A[SignalRW[Array1D[np.uint32]], PvSuffix("uint32a")]
    int64a: A[SignalRW[Array1D[np.int64]], PvSuffix("int64a")]
    uint64a: A[SignalRW[Array1D[np.uint64]], PvSuffix("uint64a")]
    table: A[SignalRW[ExampleTable], PvSuffix("table")]
    ntndarray_data: A[SignalRW[Array1D[np.int64]], PvSuffix("ntndarray:data")]


[docs] async def connect_example_device( ioc: TestingIOC, protocol: Literal["ca", "pva"] ) -> ExamplePvaDevice | ExampleCaDevice: """Helper function to return a connected example device. Parameters ---------- ioc: TestingIOC TestingIOC configured to provide the records needed for the device protocol: Literal["ca", "pva"] The transport protocol of the device Returns ------- ExamplePvaDevice | ExampleCaDevice a connected EpicsDevice with signals of many EPICS record types """ device_cls = ExamplePvaDevice if protocol == "pva" else ExampleCaDevice device = device_cls(f"{protocol}://{ioc.prefix_for(device_cls)}") await device.connect() return device
[docs] def get_example_ioc() -> TestingIOC: """Get TestingIOC instance with the example databases loaded. Returns ------- TestingIOC instance with test_records.db loaded for ExampleCaDevice and test_records.db and test_records_pva.db loaded for ExamplePvaDevice. """ ioc = TestingIOC() ioc.database_for(PVA_RECORDS, ExamplePvaDevice) ioc.database_for(CA_PVA_RECORDS, ExamplePvaDevice) ioc.database_for(CA_PVA_RECORDS, ExampleCaDevice) return ioc