ophyd-async 0.4.0__py3-none-any.whl → 0.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ophyd_async/_version.py +2 -2
- ophyd_async/core/__init__.py +84 -73
- ophyd_async/core/{detector.py → _detector.py} +4 -8
- ophyd_async/core/{device.py → _device.py} +1 -1
- ophyd_async/core/{device_save_loader.py → _device_save_loader.py} +3 -3
- ophyd_async/core/{flyer.py → _flyer.py} +6 -8
- ophyd_async/{epics/areadetector/writers/general_hdffile.py → core/_hdf_dataset.py} +4 -4
- ophyd_async/{log.py → core/_log.py} +11 -3
- ophyd_async/core/{mock_signal_backend.py → _mock_signal_backend.py} +3 -3
- ophyd_async/core/{mock_signal_utils.py → _mock_signal_utils.py} +3 -4
- ophyd_async/{protocols.py → core/_protocol.py} +1 -1
- ophyd_async/core/{standard_readable.py → _readable.py} +6 -16
- ophyd_async/core/{signal.py → _signal.py} +7 -8
- ophyd_async/core/{signal_backend.py → _signal_backend.py} +4 -13
- ophyd_async/core/{soft_signal_backend.py → _soft_signal_backend.py} +3 -12
- ophyd_async/core/{async_status.py → _status.py} +3 -11
- ophyd_async/epics/adaravis/__init__.py +9 -0
- ophyd_async/epics/{areadetector/aravis.py → adaravis/_aravis.py} +9 -11
- ophyd_async/epics/{areadetector/controllers/aravis_controller.py → adaravis/_aravis_controller.py} +7 -10
- ophyd_async/epics/{areadetector/drivers/aravis_driver.py → adaravis/_aravis_io.py} +6 -3
- ophyd_async/epics/adcore/__init__.py +36 -0
- ophyd_async/epics/adcore/_core_io.py +114 -0
- ophyd_async/epics/{areadetector/drivers/ad_base.py → adcore/_core_logic.py} +16 -52
- ophyd_async/epics/{areadetector/writers/hdf_writer.py → adcore/_hdf_writer.py} +12 -11
- ophyd_async/epics/{areadetector/single_trigger_det.py → adcore/_single_trigger.py} +5 -6
- ophyd_async/epics/{areadetector/utils.py → adcore/_utils.py} +29 -0
- ophyd_async/epics/adkinetix/__init__.py +9 -0
- ophyd_async/epics/{areadetector/kinetix.py → adkinetix/_kinetix.py} +9 -11
- ophyd_async/epics/{areadetector/controllers/kinetix_controller.py → adkinetix/_kinetix_controller.py} +6 -9
- ophyd_async/epics/{areadetector/drivers/kinetix_driver.py → adkinetix/_kinetix_io.py} +5 -4
- ophyd_async/epics/adpilatus/__init__.py +11 -0
- ophyd_async/epics/{areadetector/pilatus.py → adpilatus/_pilatus.py} +10 -14
- ophyd_async/epics/{areadetector/controllers/pilatus_controller.py → adpilatus/_pilatus_controller.py} +14 -16
- ophyd_async/epics/{areadetector/drivers/pilatus_driver.py → adpilatus/_pilatus_io.py} +5 -3
- ophyd_async/epics/adsimdetector/__init__.py +7 -0
- ophyd_async/epics/{demo/demo_ad_sim_detector.py → adsimdetector/_sim.py} +10 -11
- ophyd_async/epics/{areadetector/controllers/ad_sim_controller.py → adsimdetector/_sim_controller.py} +8 -14
- ophyd_async/epics/advimba/__init__.py +9 -0
- ophyd_async/epics/{areadetector/vimba.py → advimba/_vimba.py} +9 -9
- ophyd_async/epics/{areadetector/controllers/vimba_controller.py → advimba/_vimba_controller.py} +6 -14
- ophyd_async/epics/{areadetector/drivers/vimba_driver.py → advimba/_vimba_io.py} +5 -4
- ophyd_async/epics/demo/__init__.py +9 -132
- ophyd_async/epics/demo/_mover.py +97 -0
- ophyd_async/epics/demo/_sensor.py +36 -0
- ophyd_async/epics/{motion/motor.py → motor.py} +13 -12
- ophyd_async/epics/pvi/__init__.py +2 -2
- ophyd_async/epics/pvi/{pvi.py → _pvi.py} +17 -14
- ophyd_async/epics/signal/__init__.py +7 -1
- ophyd_async/epics/{_backend → signal}/_aioca.py +3 -2
- ophyd_async/epics/{_backend/common.py → signal/_common.py} +1 -1
- ophyd_async/epics/signal/_epics_transport.py +3 -3
- ophyd_async/epics/{_backend → signal}/_p4p.py +4 -3
- ophyd_async/epics/signal/{signal.py → _signal.py} +10 -9
- ophyd_async/fastcs/odin/__init__.py +0 -0
- ophyd_async/{panda → fastcs/panda}/__init__.py +18 -13
- ophyd_async/{panda → fastcs/panda}/_common_blocks.py +3 -3
- ophyd_async/{panda → fastcs/panda}/_hdf_panda.py +2 -7
- ophyd_async/{panda/writers → fastcs/panda}/_hdf_writer.py +8 -7
- ophyd_async/{panda → fastcs/panda}/_panda_controller.py +2 -1
- ophyd_async/{panda → fastcs/panda}/_trigger.py +3 -7
- ophyd_async/plan_stubs/__init__.py +2 -2
- ophyd_async/plan_stubs/{ensure_connected.py → _ensure_connected.py} +1 -2
- ophyd_async/plan_stubs/{fly.py → _fly.py} +13 -9
- ophyd_async/sim/__init__.py +0 -11
- ophyd_async/sim/demo/__init__.py +18 -2
- ophyd_async/sim/demo/_pattern_detector/__init__.py +13 -0
- ophyd_async/sim/{sim_pattern_generator.py → demo/_pattern_detector/_pattern_detector.py} +8 -8
- ophyd_async/sim/{sim_pattern_detector_control.py → demo/_pattern_detector/_pattern_detector_controller.py} +4 -5
- ophyd_async/sim/{sim_pattern_detector_writer.py → demo/_pattern_detector/_pattern_detector_writer.py} +4 -4
- ophyd_async/sim/{pattern_generator.py → demo/_pattern_detector/_pattern_generator.py} +12 -8
- ophyd_async/sim/demo/{sim_motor.py → _sim_motor.py} +7 -5
- ophyd_async/sim/testing/__init__.py +0 -0
- ophyd_async/tango/__init__.py +0 -0
- {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/METADATA +1 -1
- ophyd_async-0.5.0.dist-info/RECORD +89 -0
- {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/WHEEL +1 -1
- ophyd_async/epics/areadetector/__init__.py +0 -23
- ophyd_async/epics/areadetector/controllers/__init__.py +0 -5
- ophyd_async/epics/areadetector/drivers/__init__.py +0 -23
- ophyd_async/epics/areadetector/writers/__init__.py +0 -5
- ophyd_async/epics/areadetector/writers/nd_file_hdf.py +0 -43
- ophyd_async/epics/areadetector/writers/nd_plugin.py +0 -68
- ophyd_async/epics/motion/__init__.py +0 -3
- ophyd_async/panda/writers/__init__.py +0 -3
- ophyd_async-0.4.0.dist-info/RECORD +0 -84
- /ophyd_async/core/{utils.py → _utils.py} +0 -0
- /ophyd_async/{epics/_backend → fastcs}/__init__.py +0 -0
- /ophyd_async/{panda → fastcs/panda}/_table.py +0 -0
- /ophyd_async/{panda → fastcs/panda}/_utils.py +0 -0
- {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/LICENSE +0 -0
- {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/entry_points.txt +0 -0
- {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/top_level.txt +0 -0
|
@@ -10,25 +10,28 @@ from typing import (
|
|
|
10
10
|
Optional,
|
|
11
11
|
Tuple,
|
|
12
12
|
Type,
|
|
13
|
-
TypeVar,
|
|
14
13
|
Union,
|
|
15
14
|
get_args,
|
|
16
15
|
get_origin,
|
|
17
16
|
get_type_hints,
|
|
18
17
|
)
|
|
19
18
|
|
|
20
|
-
from ophyd_async.core import
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
from ophyd_async.core import (
|
|
20
|
+
DEFAULT_TIMEOUT,
|
|
21
|
+
Device,
|
|
22
|
+
DeviceVector,
|
|
23
|
+
Signal,
|
|
24
|
+
SoftSignalBackend,
|
|
25
|
+
T,
|
|
26
|
+
)
|
|
27
|
+
from ophyd_async.epics.signal import (
|
|
28
|
+
PvaSignalBackend,
|
|
25
29
|
epics_signal_r,
|
|
26
30
|
epics_signal_rw,
|
|
27
31
|
epics_signal_w,
|
|
28
32
|
epics_signal_x,
|
|
29
33
|
)
|
|
30
34
|
|
|
31
|
-
T = TypeVar("T")
|
|
32
35
|
Access = FrozenSet[
|
|
33
36
|
Union[Literal["r"], Literal["w"], Literal["rw"], Literal["x"], Literal["d"]]
|
|
34
37
|
]
|
|
@@ -74,19 +77,19 @@ def _strip_device_vector(field: Union[Type[Device]]) -> Tuple[bool, Type[Device]
|
|
|
74
77
|
|
|
75
78
|
|
|
76
79
|
@dataclass
|
|
77
|
-
class
|
|
80
|
+
class _PVIEntry:
|
|
78
81
|
"""
|
|
79
82
|
A dataclass to represent a single entry in the PVI table.
|
|
80
83
|
This could either be a signal or a sub-table.
|
|
81
84
|
"""
|
|
82
85
|
|
|
83
|
-
sub_entries: Dict[str, Union[Dict[int, "
|
|
86
|
+
sub_entries: Dict[str, Union[Dict[int, "_PVIEntry"], "_PVIEntry"]]
|
|
84
87
|
pvi_pv: Optional[str] = None
|
|
85
88
|
device: Optional[Device] = None
|
|
86
89
|
common_device_type: Optional[Type[Device]] = None
|
|
87
90
|
|
|
88
91
|
|
|
89
|
-
def _verify_common_blocks(entry:
|
|
92
|
+
def _verify_common_blocks(entry: _PVIEntry, common_device: Type[Device]):
|
|
90
93
|
if not entry.sub_entries:
|
|
91
94
|
return
|
|
92
95
|
common_sub_devices = get_type_hints(common_device)
|
|
@@ -205,7 +208,7 @@ def _mock_common_blocks(device: Device, stripped_type: Optional[Type] = None):
|
|
|
205
208
|
sub_device.parent = device
|
|
206
209
|
|
|
207
210
|
|
|
208
|
-
async def _get_pvi_entries(entry:
|
|
211
|
+
async def _get_pvi_entries(entry: _PVIEntry, timeout=DEFAULT_TIMEOUT):
|
|
209
212
|
if not entry.pvi_pv or not entry.pvi_pv.endswith(":PVI"):
|
|
210
213
|
raise RuntimeError("Top level entry must be a pvi table")
|
|
211
214
|
|
|
@@ -235,7 +238,7 @@ async def _get_pvi_entries(entry: PVIEntry, timeout=DEFAULT_TIMEOUT):
|
|
|
235
238
|
else:
|
|
236
239
|
device = getattr(entry.device, sub_name, device_type())
|
|
237
240
|
|
|
238
|
-
sub_entry =
|
|
241
|
+
sub_entry = _PVIEntry(
|
|
239
242
|
device=device, common_device_type=device_type, sub_entries={}
|
|
240
243
|
)
|
|
241
244
|
|
|
@@ -257,7 +260,7 @@ async def _get_pvi_entries(entry: PVIEntry, timeout=DEFAULT_TIMEOUT):
|
|
|
257
260
|
_verify_common_blocks(entry, entry.common_device_type)
|
|
258
261
|
|
|
259
262
|
|
|
260
|
-
def _set_device_attributes(entry:
|
|
263
|
+
def _set_device_attributes(entry: _PVIEntry):
|
|
261
264
|
for sub_name, sub_entry in entry.sub_entries.items():
|
|
262
265
|
if isinstance(sub_entry, dict):
|
|
263
266
|
sub_device = DeviceVector() # type: ignore
|
|
@@ -289,7 +292,7 @@ async def fill_pvi_entries(
|
|
|
289
292
|
_mock_common_blocks(device)
|
|
290
293
|
else:
|
|
291
294
|
# check the pvi table for devices and fill the device with them
|
|
292
|
-
root_entry =
|
|
295
|
+
root_entry = _PVIEntry(
|
|
293
296
|
pvi_pv=root_pv,
|
|
294
297
|
device=device,
|
|
295
298
|
common_device_type=type(device),
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
from .
|
|
1
|
+
from ._common import LimitPair, Limits, get_supported_values
|
|
2
|
+
from ._p4p import PvaSignalBackend
|
|
3
|
+
from ._signal import (
|
|
2
4
|
epics_signal_r,
|
|
3
5
|
epics_signal_rw,
|
|
4
6
|
epics_signal_rw_rbv,
|
|
@@ -7,6 +9,10 @@ from .signal import (
|
|
|
7
9
|
)
|
|
8
10
|
|
|
9
11
|
__all__ = [
|
|
12
|
+
"get_supported_values",
|
|
13
|
+
"LimitPair",
|
|
14
|
+
"Limits",
|
|
15
|
+
"PvaSignalBackend",
|
|
10
16
|
"epics_signal_r",
|
|
11
17
|
"epics_signal_rw",
|
|
12
18
|
"epics_signal_rw_rbv",
|
|
@@ -21,6 +21,8 @@ from bluesky.protocols import DataKey, Dtype, Reading
|
|
|
21
21
|
from epicscorelibs.ca import dbr
|
|
22
22
|
|
|
23
23
|
from ophyd_async.core import (
|
|
24
|
+
DEFAULT_TIMEOUT,
|
|
25
|
+
NotConnected,
|
|
24
26
|
ReadingValueCallback,
|
|
25
27
|
SignalBackend,
|
|
26
28
|
T,
|
|
@@ -28,9 +30,8 @@ from ophyd_async.core import (
|
|
|
28
30
|
get_unique,
|
|
29
31
|
wait_for_connection,
|
|
30
32
|
)
|
|
31
|
-
from ophyd_async.core.utils import DEFAULT_TIMEOUT, NotConnected
|
|
32
33
|
|
|
33
|
-
from .
|
|
34
|
+
from ._common import LimitPair, Limits, common_meta, get_supported_values
|
|
34
35
|
|
|
35
36
|
dbr_to_dtype: Dict[Dbr, Dtype] = {
|
|
36
37
|
dbr.DBR_STRING: "string",
|
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
from enum import Enum
|
|
6
6
|
|
|
7
7
|
try:
|
|
8
|
-
from
|
|
8
|
+
from ._aioca import CaSignalBackend
|
|
9
9
|
except ImportError as ca_error:
|
|
10
10
|
|
|
11
11
|
class CaSignalBackend: # type: ignore
|
|
@@ -14,7 +14,7 @@ except ImportError as ca_error:
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
try:
|
|
17
|
-
from
|
|
17
|
+
from ._p4p import PvaSignalBackend
|
|
18
18
|
except ImportError as pva_error:
|
|
19
19
|
|
|
20
20
|
class PvaSignalBackend: # type: ignore
|
|
@@ -22,7 +22,7 @@ except ImportError as pva_error:
|
|
|
22
22
|
raise NotImplementedError("PVA support not available") from pva_error
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
class
|
|
25
|
+
class _EpicsTransport(Enum):
|
|
26
26
|
"""The sorts of transport EPICS support"""
|
|
27
27
|
|
|
28
28
|
#: Use Channel Access (using aioca library)
|
|
@@ -13,17 +13,18 @@ from p4p import Value
|
|
|
13
13
|
from p4p.client.asyncio import Context, Subscription
|
|
14
14
|
|
|
15
15
|
from ophyd_async.core import (
|
|
16
|
+
DEFAULT_TIMEOUT,
|
|
17
|
+
NotConnected,
|
|
16
18
|
ReadingValueCallback,
|
|
19
|
+
RuntimeSubsetEnum,
|
|
17
20
|
SignalBackend,
|
|
18
21
|
T,
|
|
19
22
|
get_dtype,
|
|
20
23
|
get_unique,
|
|
21
24
|
wait_for_connection,
|
|
22
25
|
)
|
|
23
|
-
from ophyd_async.core.signal_backend import RuntimeSubsetEnum
|
|
24
|
-
from ophyd_async.core.utils import DEFAULT_TIMEOUT, NotConnected
|
|
25
26
|
|
|
26
|
-
from .
|
|
27
|
+
from ._common import LimitPair, Limits, common_meta, get_supported_values
|
|
27
28
|
|
|
28
29
|
# https://mdavidsaver.github.io/p4p/values.html
|
|
29
30
|
specifier_to_dtype: Dict[str, Dtype] = {
|
|
@@ -14,26 +14,27 @@ from ophyd_async.core import (
|
|
|
14
14
|
get_unique,
|
|
15
15
|
)
|
|
16
16
|
|
|
17
|
-
from ._epics_transport import
|
|
17
|
+
from ._epics_transport import _EpicsTransport
|
|
18
18
|
|
|
19
|
-
_default_epics_transport =
|
|
19
|
+
_default_epics_transport = _EpicsTransport.ca
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
def _transport_pv(pv: str) -> Tuple[
|
|
22
|
+
def _transport_pv(pv: str) -> Tuple[_EpicsTransport, str]:
|
|
23
23
|
split = pv.split("://", 1)
|
|
24
24
|
if len(split) > 1:
|
|
25
25
|
# We got something like pva://mydevice, so use specified comms mode
|
|
26
26
|
transport_str, pv = split
|
|
27
|
-
transport =
|
|
27
|
+
transport = _EpicsTransport[transport_str]
|
|
28
28
|
else:
|
|
29
29
|
# No comms mode specified, use the default
|
|
30
30
|
transport = _default_epics_transport
|
|
31
31
|
return transport, pv
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
def
|
|
34
|
+
def _epics_signal_backend(
|
|
35
35
|
datatype: Optional[Type[T]], read_pv: str, write_pv: str
|
|
36
36
|
) -> SignalBackend[T]:
|
|
37
|
+
"""Create an epics signal backend."""
|
|
37
38
|
r_transport, r_pv = _transport_pv(read_pv)
|
|
38
39
|
w_transport, w_pv = _transport_pv(write_pv)
|
|
39
40
|
transport = get_unique({read_pv: r_transport, write_pv: w_transport}, "transports")
|
|
@@ -54,7 +55,7 @@ def epics_signal_rw(
|
|
|
54
55
|
write_pv:
|
|
55
56
|
If given, use this PV to write to, otherwise use read_pv
|
|
56
57
|
"""
|
|
57
|
-
backend =
|
|
58
|
+
backend = _epics_signal_backend(datatype, read_pv, write_pv or read_pv)
|
|
58
59
|
return SignalRW(backend, name=name)
|
|
59
60
|
|
|
60
61
|
|
|
@@ -85,7 +86,7 @@ def epics_signal_r(datatype: Type[T], read_pv: str, name: str = "") -> SignalR[T
|
|
|
85
86
|
read_pv:
|
|
86
87
|
The PV to read and monitor
|
|
87
88
|
"""
|
|
88
|
-
backend =
|
|
89
|
+
backend = _epics_signal_backend(datatype, read_pv, read_pv)
|
|
89
90
|
return SignalR(backend, name=name)
|
|
90
91
|
|
|
91
92
|
|
|
@@ -99,7 +100,7 @@ def epics_signal_w(datatype: Type[T], write_pv: str, name: str = "") -> SignalW[
|
|
|
99
100
|
write_pv:
|
|
100
101
|
The PV to write to
|
|
101
102
|
"""
|
|
102
|
-
backend =
|
|
103
|
+
backend = _epics_signal_backend(datatype, write_pv, write_pv)
|
|
103
104
|
return SignalW(backend, name=name)
|
|
104
105
|
|
|
105
106
|
|
|
@@ -111,5 +112,5 @@ def epics_signal_x(write_pv: str, name: str = "") -> SignalX:
|
|
|
111
112
|
write_pv:
|
|
112
113
|
The PV to write its initial value to on trigger
|
|
113
114
|
"""
|
|
114
|
-
backend: SignalBackend =
|
|
115
|
+
backend: SignalBackend = _epics_signal_backend(None, write_pv, write_pv)
|
|
115
116
|
return SignalX(backend, name=name)
|
|
File without changes
|
|
@@ -10,8 +10,11 @@ from ._common_blocks import (
|
|
|
10
10
|
TimeUnits,
|
|
11
11
|
)
|
|
12
12
|
from ._hdf_panda import HDFPanda
|
|
13
|
+
from ._hdf_writer import PandaHDFWriter
|
|
13
14
|
from ._panda_controller import PandaPcapController
|
|
14
15
|
from ._table import (
|
|
16
|
+
DatasetTable,
|
|
17
|
+
PandaHdf5DatasetType,
|
|
15
18
|
SeqTable,
|
|
16
19
|
SeqTableRow,
|
|
17
20
|
SeqTrigger,
|
|
@@ -28,25 +31,27 @@ from ._utils import phase_sorter
|
|
|
28
31
|
|
|
29
32
|
__all__ = [
|
|
30
33
|
"CommonPandaBlocks",
|
|
31
|
-
"
|
|
32
|
-
"PcompBlock",
|
|
33
|
-
"PcompInfo",
|
|
34
|
-
"PcompDirectionOptions",
|
|
34
|
+
"DataBlock",
|
|
35
35
|
"EnableDisableOptions",
|
|
36
36
|
"PcapBlock",
|
|
37
|
+
"PcompBlock",
|
|
38
|
+
"PcompDirectionOptions",
|
|
37
39
|
"PulseBlock",
|
|
38
|
-
"seq_table_from_arrays",
|
|
39
|
-
"seq_table_from_rows",
|
|
40
40
|
"SeqBlock",
|
|
41
|
-
"
|
|
41
|
+
"TimeUnits",
|
|
42
|
+
"HDFPanda",
|
|
43
|
+
"PandaHDFWriter",
|
|
44
|
+
"PandaPcapController",
|
|
45
|
+
"DatasetTable",
|
|
46
|
+
"PandaHdf5DatasetType",
|
|
42
47
|
"SeqTable",
|
|
43
48
|
"SeqTableRow",
|
|
44
49
|
"SeqTrigger",
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"CommonPandABlocks",
|
|
50
|
-
"StaticSeqTableTriggerLogic",
|
|
50
|
+
"seq_table_from_arrays",
|
|
51
|
+
"seq_table_from_rows",
|
|
52
|
+
"PcompInfo",
|
|
53
|
+
"SeqTableInfo",
|
|
51
54
|
"StaticPcompTriggerLogic",
|
|
55
|
+
"StaticSeqTableTriggerLogic",
|
|
56
|
+
"phase_sorter",
|
|
52
57
|
]
|
|
@@ -2,9 +2,9 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from enum import Enum
|
|
4
4
|
|
|
5
|
-
from ophyd_async.core import Device, DeviceVector, SignalR, SignalRW
|
|
6
|
-
|
|
7
|
-
from
|
|
5
|
+
from ophyd_async.core import Device, DeviceVector, SignalR, SignalRW, SubsetEnum
|
|
6
|
+
|
|
7
|
+
from ._table import DatasetTable, SeqTable
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class DataBlock(Device):
|
|
@@ -2,17 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Sequence
|
|
4
4
|
|
|
5
|
-
from ophyd_async.core import
|
|
6
|
-
DEFAULT_TIMEOUT,
|
|
7
|
-
PathProvider,
|
|
8
|
-
SignalR,
|
|
9
|
-
StandardDetector,
|
|
10
|
-
)
|
|
5
|
+
from ophyd_async.core import DEFAULT_TIMEOUT, PathProvider, SignalR, StandardDetector
|
|
11
6
|
from ophyd_async.epics.pvi import create_children_from_annotations, fill_pvi_entries
|
|
12
7
|
|
|
13
8
|
from ._common_blocks import CommonPandaBlocks
|
|
9
|
+
from ._hdf_writer import PandaHDFWriter
|
|
14
10
|
from ._panda_controller import PandaPcapController
|
|
15
|
-
from .writers._hdf_writer import PandaHDFWriter
|
|
16
11
|
|
|
17
12
|
|
|
18
13
|
class HDFPanda(CommonPandaBlocks, StandardDetector):
|
|
@@ -8,14 +8,15 @@ from p4p.client.thread import Context
|
|
|
8
8
|
from ophyd_async.core import (
|
|
9
9
|
DEFAULT_TIMEOUT,
|
|
10
10
|
DetectorWriter,
|
|
11
|
+
HDFDataset,
|
|
12
|
+
HDFFile,
|
|
11
13
|
NameProvider,
|
|
12
14
|
PathProvider,
|
|
15
|
+
observe_value,
|
|
13
16
|
wait_for_value,
|
|
14
17
|
)
|
|
15
|
-
from ophyd_async.core.signal import observe_value
|
|
16
|
-
from ophyd_async.epics.areadetector.writers.general_hdffile import _HDFDataset, _HDFFile
|
|
17
18
|
|
|
18
|
-
from
|
|
19
|
+
from ._common_blocks import CommonPandaBlocks
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
class PandaHDFWriter(DetectorWriter):
|
|
@@ -32,8 +33,8 @@ class PandaHDFWriter(DetectorWriter):
|
|
|
32
33
|
self._prefix = prefix
|
|
33
34
|
self._path_provider = path_provider
|
|
34
35
|
self._name_provider = name_provider
|
|
35
|
-
self._datasets: List[
|
|
36
|
-
self._file: Optional[
|
|
36
|
+
self._datasets: List[HDFDataset] = []
|
|
37
|
+
self._file: Optional[HDFFile] = None
|
|
37
38
|
self._multiplier = 1
|
|
38
39
|
|
|
39
40
|
# Triggered on PCAP arm
|
|
@@ -93,7 +94,7 @@ class PandaHDFWriter(DetectorWriter):
|
|
|
93
94
|
|
|
94
95
|
capture_table = await self.panda_device.data.datasets.get_value()
|
|
95
96
|
self._datasets = [
|
|
96
|
-
|
|
97
|
+
HDFDataset(dataset_name, "/" + dataset_name, [1], multiplier=1)
|
|
97
98
|
for dataset_name in capture_table["name"]
|
|
98
99
|
]
|
|
99
100
|
|
|
@@ -128,7 +129,7 @@ class PandaHDFWriter(DetectorWriter):
|
|
|
128
129
|
# TODO: fail if we get dropped frames
|
|
129
130
|
if indices_written:
|
|
130
131
|
if not self._file:
|
|
131
|
-
self._file =
|
|
132
|
+
self._file = HDFFile(
|
|
132
133
|
self._path_provider(),
|
|
133
134
|
Path(await self.panda_device.data.hdf_directory.get_value())
|
|
134
135
|
/ Path(await self.panda_device.data.hdf_file_name.get_value()),
|
|
@@ -4,13 +4,9 @@ from typing import Optional
|
|
|
4
4
|
from pydantic import BaseModel, Field
|
|
5
5
|
|
|
6
6
|
from ophyd_async.core import TriggerLogic, wait_for_value
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
SeqBlock,
|
|
11
|
-
SeqTable,
|
|
12
|
-
TimeUnits,
|
|
13
|
-
)
|
|
7
|
+
|
|
8
|
+
from ._common_blocks import PcompBlock, PcompDirectionOptions, SeqBlock, TimeUnits
|
|
9
|
+
from ._table import SeqTable
|
|
14
10
|
|
|
15
11
|
|
|
16
12
|
class SeqTableInfo(BaseModel):
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
from .
|
|
2
|
-
from .
|
|
1
|
+
from ._ensure_connected import ensure_connected
|
|
2
|
+
from ._fly import (
|
|
3
3
|
fly_and_collect,
|
|
4
4
|
prepare_static_seq_table_flyer_and_detectors_with_same_trigger,
|
|
5
5
|
time_resolved_fly_and_collect_with_static_seq_table,
|
|
@@ -3,10 +3,14 @@ from typing import List, Optional
|
|
|
3
3
|
import bluesky.plan_stubs as bps
|
|
4
4
|
from bluesky.utils import short_uid
|
|
5
5
|
|
|
6
|
-
from ophyd_async.core
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
from ophyd_async.core import (
|
|
7
|
+
DetectorTrigger,
|
|
8
|
+
StandardDetector,
|
|
9
|
+
StandardFlyer,
|
|
10
|
+
TriggerInfo,
|
|
11
|
+
in_micros,
|
|
12
|
+
)
|
|
13
|
+
from ophyd_async.fastcs.panda import (
|
|
10
14
|
PcompDirectionOptions,
|
|
11
15
|
PcompInfo,
|
|
12
16
|
SeqTable,
|
|
@@ -17,7 +21,7 @@ from ophyd_async.panda import (
|
|
|
17
21
|
|
|
18
22
|
|
|
19
23
|
def prepare_static_pcomp_flyer_and_detectors(
|
|
20
|
-
flyer:
|
|
24
|
+
flyer: StandardFlyer[PcompInfo],
|
|
21
25
|
detectors: List[StandardDetector],
|
|
22
26
|
pcomp_info: PcompInfo,
|
|
23
27
|
trigger_info: TriggerInfo,
|
|
@@ -36,7 +40,7 @@ def prepare_static_pcomp_flyer_and_detectors(
|
|
|
36
40
|
|
|
37
41
|
|
|
38
42
|
def prepare_static_seq_table_flyer_and_detectors_with_same_trigger(
|
|
39
|
-
flyer:
|
|
43
|
+
flyer: StandardFlyer[SeqTableInfo],
|
|
40
44
|
detectors: List[StandardDetector],
|
|
41
45
|
number_of_frames: int,
|
|
42
46
|
exposure: float,
|
|
@@ -100,7 +104,7 @@ def prepare_static_seq_table_flyer_and_detectors_with_same_trigger(
|
|
|
100
104
|
|
|
101
105
|
def fly_and_collect(
|
|
102
106
|
stream_name: str,
|
|
103
|
-
flyer:
|
|
107
|
+
flyer: StandardFlyer[SeqTableInfo] | StandardFlyer[PcompInfo],
|
|
104
108
|
detectors: List[StandardDetector],
|
|
105
109
|
):
|
|
106
110
|
"""Kickoff, complete and collect with a flyer and multiple detectors.
|
|
@@ -140,7 +144,7 @@ def fly_and_collect(
|
|
|
140
144
|
|
|
141
145
|
def fly_and_collect_with_static_pcomp(
|
|
142
146
|
stream_name: str,
|
|
143
|
-
flyer:
|
|
147
|
+
flyer: StandardFlyer[PcompInfo],
|
|
144
148
|
detectors: List[StandardDetector],
|
|
145
149
|
number_of_pulses: int,
|
|
146
150
|
pulse_width: int,
|
|
@@ -166,7 +170,7 @@ def fly_and_collect_with_static_pcomp(
|
|
|
166
170
|
|
|
167
171
|
def time_resolved_fly_and_collect_with_static_seq_table(
|
|
168
172
|
stream_name: str,
|
|
169
|
-
flyer:
|
|
173
|
+
flyer: StandardFlyer[SeqTableInfo],
|
|
170
174
|
detectors: List[StandardDetector],
|
|
171
175
|
number_of_frames: int,
|
|
172
176
|
exposure: float,
|
ophyd_async/sim/__init__.py
CHANGED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
from .pattern_generator import PatternGenerator
|
|
2
|
-
from .sim_pattern_detector_control import SimPatternDetectorControl
|
|
3
|
-
from .sim_pattern_detector_writer import SimPatternDetectorWriter
|
|
4
|
-
from .sim_pattern_generator import SimPatternDetector
|
|
5
|
-
|
|
6
|
-
__all__ = [
|
|
7
|
-
"PatternGenerator",
|
|
8
|
-
"SimPatternDetectorControl",
|
|
9
|
-
"SimPatternDetectorWriter",
|
|
10
|
-
"SimPatternDetector",
|
|
11
|
-
]
|
ophyd_async/sim/demo/__init__.py
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
-
from .
|
|
1
|
+
from ._pattern_detector import (
|
|
2
|
+
DATA_PATH,
|
|
3
|
+
SUM_PATH,
|
|
4
|
+
PatternDetector,
|
|
5
|
+
PatternDetectorController,
|
|
6
|
+
PatternDetectorWriter,
|
|
7
|
+
PatternGenerator,
|
|
8
|
+
)
|
|
9
|
+
from ._sim_motor import SimMotor
|
|
2
10
|
|
|
3
|
-
__all__ = [
|
|
11
|
+
__all__ = [
|
|
12
|
+
"DATA_PATH",
|
|
13
|
+
"SUM_PATH",
|
|
14
|
+
"PatternGenerator",
|
|
15
|
+
"PatternDetector",
|
|
16
|
+
"PatternDetectorController",
|
|
17
|
+
"PatternDetectorWriter",
|
|
18
|
+
"SimMotor",
|
|
19
|
+
]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from ._pattern_detector import PatternDetector
|
|
2
|
+
from ._pattern_detector_controller import PatternDetectorController
|
|
3
|
+
from ._pattern_detector_writer import PatternDetectorWriter
|
|
4
|
+
from ._pattern_generator import DATA_PATH, SUM_PATH, PatternGenerator
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"PatternDetector",
|
|
8
|
+
"PatternDetectorController",
|
|
9
|
+
"PatternDetectorWriter",
|
|
10
|
+
"DATA_PATH",
|
|
11
|
+
"SUM_PATH",
|
|
12
|
+
"PatternGenerator",
|
|
13
|
+
]
|
|
@@ -2,20 +2,20 @@ from pathlib import Path
|
|
|
2
2
|
from typing import Sequence
|
|
3
3
|
|
|
4
4
|
from ophyd_async.core import (
|
|
5
|
+
AsyncReadable,
|
|
5
6
|
FilenameProvider,
|
|
6
7
|
PathProvider,
|
|
8
|
+
StandardDetector,
|
|
7
9
|
StaticFilenameProvider,
|
|
8
10
|
StaticPathProvider,
|
|
9
11
|
)
|
|
10
|
-
from ophyd_async.core.detector import StandardDetector
|
|
11
|
-
from ophyd_async.protocols import AsyncReadable
|
|
12
|
-
from ophyd_async.sim.pattern_generator import PatternGenerator
|
|
13
12
|
|
|
14
|
-
from .
|
|
15
|
-
from .
|
|
13
|
+
from ._pattern_detector_controller import PatternDetectorController
|
|
14
|
+
from ._pattern_detector_writer import PatternDetectorWriter
|
|
15
|
+
from ._pattern_generator import PatternGenerator
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
class
|
|
18
|
+
class PatternDetector(StandardDetector):
|
|
19
19
|
def __init__(
|
|
20
20
|
self,
|
|
21
21
|
path: Path,
|
|
@@ -25,12 +25,12 @@ class SimPatternDetector(StandardDetector):
|
|
|
25
25
|
fp: FilenameProvider = StaticFilenameProvider(name)
|
|
26
26
|
self.path_provider: PathProvider = StaticPathProvider(fp, path)
|
|
27
27
|
self.pattern_generator = PatternGenerator()
|
|
28
|
-
writer =
|
|
28
|
+
writer = PatternDetectorWriter(
|
|
29
29
|
pattern_generator=self.pattern_generator,
|
|
30
30
|
path_provider=self.path_provider,
|
|
31
31
|
name_provider=lambda: self.name,
|
|
32
32
|
)
|
|
33
|
-
controller =
|
|
33
|
+
controller = PatternDetectorController(
|
|
34
34
|
pattern_generator=self.pattern_generator,
|
|
35
35
|
path_provider=self.path_provider,
|
|
36
36
|
)
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
from typing import Optional
|
|
3
3
|
|
|
4
|
-
from ophyd_async.core import PathProvider
|
|
5
|
-
from ophyd_async.core.async_status import AsyncStatus
|
|
6
|
-
from ophyd_async.core.detector import DetectorControl, DetectorTrigger
|
|
7
|
-
from ophyd_async.sim.pattern_generator import PatternGenerator
|
|
4
|
+
from ophyd_async.core import AsyncStatus, DetectorControl, DetectorTrigger, PathProvider
|
|
8
5
|
|
|
6
|
+
from ._pattern_generator import PatternGenerator
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
|
|
9
|
+
class PatternDetectorController(DetectorControl):
|
|
11
10
|
def __init__(
|
|
12
11
|
self,
|
|
13
12
|
pattern_generator: PatternGenerator,
|
|
@@ -2,12 +2,12 @@ from typing import AsyncGenerator, AsyncIterator, Dict
|
|
|
2
2
|
|
|
3
3
|
from bluesky.protocols import DataKey
|
|
4
4
|
|
|
5
|
-
from ophyd_async.core import NameProvider, PathProvider
|
|
6
|
-
from ophyd_async.core.detector import DetectorWriter
|
|
7
|
-
from ophyd_async.sim.pattern_generator import PatternGenerator
|
|
5
|
+
from ophyd_async.core import DetectorWriter, NameProvider, PathProvider
|
|
8
6
|
|
|
7
|
+
from ._pattern_generator import PatternGenerator
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
|
|
10
|
+
class PatternDetectorWriter(DetectorWriter):
|
|
11
11
|
pattern_generator: PatternGenerator
|
|
12
12
|
|
|
13
13
|
def __init__(
|