ophyd-async 0.3.4a1__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 +86 -63
- ophyd_async/core/{detector.py → _detector.py} +18 -23
- ophyd_async/core/{device.py → _device.py} +19 -7
- ophyd_async/core/{device_save_loader.py → _device_save_loader.py} +3 -3
- ophyd_async/core/{flyer.py → _flyer.py} +6 -8
- ophyd_async/core/_hdf_dataset.py +97 -0
- 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/_providers.py +186 -24
- ophyd_async/core/{standard_readable.py → _readable.py} +6 -16
- ophyd_async/core/{signal.py → _signal.py} +39 -16
- ophyd_async/core/{signal_backend.py → _signal_backend.py} +4 -13
- ophyd_async/core/{soft_signal_backend.py → _soft_signal_backend.py} +24 -18
- 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} +12 -14
- ophyd_async/epics/{areadetector/controllers/aravis_controller.py → adaravis/_aravis_controller.py} +8 -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} +17 -52
- ophyd_async/epics/{areadetector/writers/hdf_writer.py → adcore/_hdf_writer.py} +36 -18
- 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} +12 -14
- 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} +12 -16
- 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/adsimdetector/_sim.py +34 -0
- 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/advimba/_vimba.py +43 -0
- 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/motor.py +228 -0
- 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 +6 -2
- ophyd_async/epics/{_backend/common.py → signal/_common.py} +4 -2
- ophyd_async/epics/signal/_epics_transport.py +3 -3
- ophyd_async/epics/{_backend → signal}/_p4p.py +53 -4
- 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 +28 -9
- ophyd_async/{panda → fastcs/panda}/_common_blocks.py +24 -3
- ophyd_async/{panda → fastcs/panda}/_hdf_panda.py +6 -9
- ophyd_async/{panda/writers → fastcs/panda}/_hdf_writer.py +24 -14
- ophyd_async/{panda → fastcs/panda}/_panda_controller.py +2 -1
- ophyd_async/{panda → fastcs/panda}/_table.py +20 -18
- ophyd_async/fastcs/panda/_trigger.py +90 -0
- ophyd_async/plan_stubs/__init__.py +2 -2
- ophyd_async/plan_stubs/_ensure_connected.py +26 -0
- ophyd_async/plan_stubs/{fly.py → _fly.py} +67 -12
- 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/demo/_pattern_detector/_pattern_detector.py +42 -0
- ophyd_async/sim/{sim_pattern_detector_control.py → demo/_pattern_detector/_pattern_detector_controller.py} +6 -7
- ophyd_async/sim/{sim_pattern_detector_writer.py → demo/_pattern_detector/_pattern_detector_writer.py} +12 -8
- ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py +211 -0
- 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.3.4a1.dist-info → ophyd_async-0.5.0.dist-info}/METADATA +7 -2
- ophyd_async-0.5.0.dist-info/RECORD +89 -0
- {ophyd_async-0.3.4a1.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/vimba.py +0 -43
- ophyd_async/epics/areadetector/writers/__init__.py +0 -5
- ophyd_async/epics/areadetector/writers/_hdfdataset.py +0 -10
- ophyd_async/epics/areadetector/writers/_hdffile.py +0 -54
- ophyd_async/epics/areadetector/writers/nd_file_hdf.py +0 -40
- ophyd_async/epics/areadetector/writers/nd_plugin.py +0 -38
- ophyd_async/epics/demo/demo_ad_sim_detector.py +0 -35
- ophyd_async/epics/motion/__init__.py +0 -3
- ophyd_async/epics/motion/motor.py +0 -97
- ophyd_async/panda/_trigger.py +0 -39
- ophyd_async/panda/writers/__init__.py +0 -3
- ophyd_async/panda/writers/_panda_hdf_file.py +0 -54
- ophyd_async/plan_stubs/ensure_connected.py +0 -22
- ophyd_async/sim/pattern_generator.py +0 -318
- ophyd_async/sim/sim_pattern_generator.py +0 -35
- ophyd_async-0.3.4a1.dist-info/RECORD +0 -86
- /ophyd_async/core/{utils.py → _utils.py} +0 -0
- /ophyd_async/{epics/_backend → fastcs}/__init__.py +0 -0
- /ophyd_async/{panda → fastcs/panda}/_utils.py +0 -0
- {ophyd_async-0.3.4a1.dist-info → ophyd_async-0.5.0.dist-info}/LICENSE +0 -0
- {ophyd_async-0.3.4a1.dist-info → ophyd_async-0.5.0.dist-info}/entry_points.txt +0 -0
- {ophyd_async-0.3.4a1.dist-info → ophyd_async-0.5.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import AsyncGenerator, AsyncIterator, Dict, Optional
|
|
3
|
+
|
|
4
|
+
import h5py
|
|
5
|
+
import numpy as np
|
|
6
|
+
from bluesky.protocols import DataKey, StreamAsset
|
|
7
|
+
|
|
8
|
+
from ophyd_async.core import (
|
|
9
|
+
DEFAULT_TIMEOUT,
|
|
10
|
+
HDFDataset,
|
|
11
|
+
HDFFile,
|
|
12
|
+
PathProvider,
|
|
13
|
+
observe_value,
|
|
14
|
+
soft_signal_r_and_setter,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
# raw data path
|
|
18
|
+
DATA_PATH = "/entry/data/data"
|
|
19
|
+
|
|
20
|
+
# pixel sum path
|
|
21
|
+
SUM_PATH = "/entry/sum"
|
|
22
|
+
|
|
23
|
+
MAX_UINT8_VALUE = np.iinfo(np.uint8).max
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def generate_gaussian_blob(height: int, width: int) -> np.ndarray:
|
|
27
|
+
"""Make a Gaussian Blob with float values in range 0..1"""
|
|
28
|
+
x, y = np.meshgrid(np.linspace(-1, 1, width), np.linspace(-1, 1, height))
|
|
29
|
+
d = np.sqrt(x * x + y * y)
|
|
30
|
+
blob = np.exp(-(d**2))
|
|
31
|
+
return blob
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def generate_interesting_pattern(x: float, y: float) -> float:
|
|
35
|
+
"""This function is interesting in x and y in range -10..10, returning
|
|
36
|
+
a float value in range 0..1
|
|
37
|
+
"""
|
|
38
|
+
z = 0.5 + (np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)) / 2
|
|
39
|
+
return z
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class PatternGenerator:
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
saturation_exposure_time: float = 0.1,
|
|
46
|
+
detector_width: int = 320,
|
|
47
|
+
detector_height: int = 240,
|
|
48
|
+
) -> None:
|
|
49
|
+
self.saturation_exposure_time = saturation_exposure_time
|
|
50
|
+
self.exposure = saturation_exposure_time
|
|
51
|
+
self.x = 0.0
|
|
52
|
+
self.y = 0.0
|
|
53
|
+
self.height = detector_height
|
|
54
|
+
self.width = detector_width
|
|
55
|
+
self.image_counter: int = 0
|
|
56
|
+
|
|
57
|
+
# it automatically initializes to 0
|
|
58
|
+
self.counter_signal, self._set_counter_signal = soft_signal_r_and_setter(int)
|
|
59
|
+
self._full_intensity_blob = (
|
|
60
|
+
generate_gaussian_blob(width=detector_width, height=detector_height)
|
|
61
|
+
* MAX_UINT8_VALUE
|
|
62
|
+
)
|
|
63
|
+
self._hdf_stream_provider: Optional[HDFFile] = None
|
|
64
|
+
self._handle_for_h5_file: Optional[h5py.File] = None
|
|
65
|
+
self.target_path: Optional[Path] = None
|
|
66
|
+
|
|
67
|
+
async def write_image_to_file(self) -> None:
|
|
68
|
+
assert self._handle_for_h5_file, "no file has been opened!"
|
|
69
|
+
# prepare - resize the fixed hdf5 data structure
|
|
70
|
+
# so that the new image can be written
|
|
71
|
+
self._handle_for_h5_file[DATA_PATH].resize(
|
|
72
|
+
(self.image_counter + 1, self.height, self.width)
|
|
73
|
+
)
|
|
74
|
+
self._handle_for_h5_file[SUM_PATH].resize((self.image_counter + 1,))
|
|
75
|
+
|
|
76
|
+
# generate the simulated data
|
|
77
|
+
intensity: float = generate_interesting_pattern(self.x, self.y)
|
|
78
|
+
detector_data = (
|
|
79
|
+
self._full_intensity_blob
|
|
80
|
+
* intensity
|
|
81
|
+
* self.exposure
|
|
82
|
+
/ self.saturation_exposure_time
|
|
83
|
+
).astype(np.uint8)
|
|
84
|
+
|
|
85
|
+
# write data to disc (intermediate step)
|
|
86
|
+
self._handle_for_h5_file[DATA_PATH][self.image_counter] = detector_data
|
|
87
|
+
sum = np.sum(detector_data)
|
|
88
|
+
self._handle_for_h5_file[SUM_PATH][self.image_counter] = sum
|
|
89
|
+
|
|
90
|
+
# save metadata - so that it's discoverable
|
|
91
|
+
self._handle_for_h5_file[DATA_PATH].flush()
|
|
92
|
+
self._handle_for_h5_file[SUM_PATH].flush()
|
|
93
|
+
|
|
94
|
+
# counter increment is last
|
|
95
|
+
# as only at this point the new data is visible from the outside
|
|
96
|
+
self.image_counter += 1
|
|
97
|
+
self._set_counter_signal(self.image_counter)
|
|
98
|
+
|
|
99
|
+
def set_exposure(self, value: float) -> None:
|
|
100
|
+
self.exposure = value
|
|
101
|
+
|
|
102
|
+
def set_x(self, value: float) -> None:
|
|
103
|
+
self.x = value
|
|
104
|
+
|
|
105
|
+
def set_y(self, value: float) -> None:
|
|
106
|
+
self.y = value
|
|
107
|
+
|
|
108
|
+
async def open_file(
|
|
109
|
+
self, path_provider: PathProvider, name: str, multiplier: int = 1
|
|
110
|
+
) -> Dict[str, DataKey]:
|
|
111
|
+
await self.counter_signal.connect()
|
|
112
|
+
|
|
113
|
+
self.target_path = self._get_new_path(path_provider)
|
|
114
|
+
self._path_provider = path_provider
|
|
115
|
+
|
|
116
|
+
self._handle_for_h5_file = h5py.File(self.target_path, "w", libver="latest")
|
|
117
|
+
|
|
118
|
+
assert self._handle_for_h5_file, "not loaded the file right"
|
|
119
|
+
|
|
120
|
+
self._handle_for_h5_file.create_dataset(
|
|
121
|
+
name=DATA_PATH,
|
|
122
|
+
shape=(0, self.height, self.width),
|
|
123
|
+
dtype=np.uint8,
|
|
124
|
+
maxshape=(None, self.height, self.width),
|
|
125
|
+
)
|
|
126
|
+
self._handle_for_h5_file.create_dataset(
|
|
127
|
+
name=SUM_PATH,
|
|
128
|
+
shape=(0,),
|
|
129
|
+
dtype=np.float64,
|
|
130
|
+
maxshape=(None,),
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
# once datasets written, can switch the model to single writer multiple reader
|
|
134
|
+
self._handle_for_h5_file.swmr_mode = True
|
|
135
|
+
self.multiplier = multiplier
|
|
136
|
+
|
|
137
|
+
outer_shape = (multiplier,) if multiplier > 1 else ()
|
|
138
|
+
|
|
139
|
+
# cache state to self
|
|
140
|
+
# Add the main data
|
|
141
|
+
self._datasets = [
|
|
142
|
+
HDFDataset(
|
|
143
|
+
data_key=name,
|
|
144
|
+
dataset=DATA_PATH,
|
|
145
|
+
shape=(self.height, self.width),
|
|
146
|
+
multiplier=multiplier,
|
|
147
|
+
),
|
|
148
|
+
HDFDataset(
|
|
149
|
+
f"{name}-sum",
|
|
150
|
+
dataset=SUM_PATH,
|
|
151
|
+
shape=(),
|
|
152
|
+
multiplier=multiplier,
|
|
153
|
+
),
|
|
154
|
+
]
|
|
155
|
+
|
|
156
|
+
describe = {
|
|
157
|
+
ds.data_key: DataKey(
|
|
158
|
+
source="sim://pattern-generator-hdf-file",
|
|
159
|
+
shape=outer_shape + tuple(ds.shape),
|
|
160
|
+
dtype="array" if ds.shape else "number",
|
|
161
|
+
external="STREAM:",
|
|
162
|
+
)
|
|
163
|
+
for ds in self._datasets
|
|
164
|
+
}
|
|
165
|
+
return describe
|
|
166
|
+
|
|
167
|
+
def _get_new_path(self, path_provider: PathProvider) -> Path:
|
|
168
|
+
info = path_provider(device_name="pattern")
|
|
169
|
+
filename = info.filename
|
|
170
|
+
new_path: Path = info.root / info.resource_dir / filename
|
|
171
|
+
return new_path
|
|
172
|
+
|
|
173
|
+
async def collect_stream_docs(
|
|
174
|
+
self, indices_written: int
|
|
175
|
+
) -> AsyncIterator[StreamAsset]:
|
|
176
|
+
"""
|
|
177
|
+
stream resource says "here is a dataset",
|
|
178
|
+
stream datum says "here are N frames in that stream resource",
|
|
179
|
+
you get one stream resource and many stream datums per scan
|
|
180
|
+
"""
|
|
181
|
+
if self._handle_for_h5_file:
|
|
182
|
+
self._handle_for_h5_file.flush()
|
|
183
|
+
# when already something was written to the file
|
|
184
|
+
if indices_written:
|
|
185
|
+
# if no frames arrived yet, there's no file to speak of
|
|
186
|
+
# cannot get the full filename the HDF writer will write
|
|
187
|
+
# until the first frame comes in
|
|
188
|
+
if not self._hdf_stream_provider:
|
|
189
|
+
assert self.target_path, "open file has not been called"
|
|
190
|
+
self._hdf_stream_provider = HDFFile(
|
|
191
|
+
self._path_provider(),
|
|
192
|
+
self.target_path,
|
|
193
|
+
self._datasets,
|
|
194
|
+
)
|
|
195
|
+
for doc in self._hdf_stream_provider.stream_resources():
|
|
196
|
+
yield "stream_resource", doc
|
|
197
|
+
if self._hdf_stream_provider:
|
|
198
|
+
for doc in self._hdf_stream_provider.stream_data(indices_written):
|
|
199
|
+
yield "stream_datum", doc
|
|
200
|
+
|
|
201
|
+
def close(self) -> None:
|
|
202
|
+
if self._handle_for_h5_file:
|
|
203
|
+
self._handle_for_h5_file.close()
|
|
204
|
+
print("file closed")
|
|
205
|
+
self._handle_for_h5_file = None
|
|
206
|
+
|
|
207
|
+
async def observe_indices_written(
|
|
208
|
+
self, timeout=DEFAULT_TIMEOUT
|
|
209
|
+
) -> AsyncGenerator[int, None]:
|
|
210
|
+
async for num_captured in observe_value(self.counter_signal, timeout=timeout):
|
|
211
|
+
yield num_captured // self.multiplier
|
|
@@ -4,15 +4,17 @@ import time
|
|
|
4
4
|
|
|
5
5
|
from bluesky.protocols import Movable, Stoppable
|
|
6
6
|
|
|
7
|
-
from ophyd_async.core import
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
from ophyd_async.core import (
|
|
8
|
+
AsyncStatus,
|
|
9
|
+
ConfigSignal,
|
|
10
|
+
HintedSignal,
|
|
11
|
+
StandardReadable,
|
|
12
|
+
WatchableAsyncStatus,
|
|
13
|
+
WatcherUpdate,
|
|
10
14
|
observe_value,
|
|
11
15
|
soft_signal_r_and_setter,
|
|
12
16
|
soft_signal_rw,
|
|
13
17
|
)
|
|
14
|
-
from ophyd_async.core.standard_readable import ConfigSignal, HintedSignal
|
|
15
|
-
from ophyd_async.core.utils import WatcherUpdate
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
class SimMotor(StandardReadable, Movable, Stoppable):
|
|
File without changes
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ophyd-async
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango
|
|
5
5
|
Author-email: Tom Cobb <tom.cobb@diamond.ac.uk>
|
|
6
6
|
License: BSD 3-Clause License
|
|
@@ -45,10 +45,12 @@ Requires-Dist: numpy <2.0.0
|
|
|
45
45
|
Requires-Dist: packaging
|
|
46
46
|
Requires-Dist: pint
|
|
47
47
|
Requires-Dist: bluesky >=1.13.0a3
|
|
48
|
-
Requires-Dist: event-model
|
|
48
|
+
Requires-Dist: event-model
|
|
49
49
|
Requires-Dist: p4p
|
|
50
50
|
Requires-Dist: pyyaml
|
|
51
51
|
Requires-Dist: colorlog
|
|
52
|
+
Requires-Dist: pydantic >=2.0
|
|
53
|
+
Requires-Dist: pydantic-numpy
|
|
52
54
|
Provides-Extra: ca
|
|
53
55
|
Requires-Dist: aioca >=1.6 ; extra == 'ca'
|
|
54
56
|
Provides-Extra: dev
|
|
@@ -79,10 +81,13 @@ Requires-Dist: pytest-faulthandler ; extra == 'dev'
|
|
|
79
81
|
Requires-Dist: pytest-rerunfailures ; extra == 'dev'
|
|
80
82
|
Requires-Dist: pytest-timeout ; extra == 'dev'
|
|
81
83
|
Requires-Dist: ruff ; extra == 'dev'
|
|
84
|
+
Requires-Dist: sphinx <7.4.0 ; extra == 'dev'
|
|
82
85
|
Requires-Dist: sphinx-autobuild ; extra == 'dev'
|
|
86
|
+
Requires-Dist: autodoc-pydantic ; extra == 'dev'
|
|
83
87
|
Requires-Dist: sphinxcontrib-mermaid ; extra == 'dev'
|
|
84
88
|
Requires-Dist: sphinx-copybutton ; extra == 'dev'
|
|
85
89
|
Requires-Dist: sphinx-design ; extra == 'dev'
|
|
90
|
+
Requires-Dist: super-state-machine ; extra == 'dev'
|
|
86
91
|
Requires-Dist: tox-direct ; extra == 'dev'
|
|
87
92
|
Requires-Dist: types-mock ; extra == 'dev'
|
|
88
93
|
Requires-Dist: types-pyyaml ; extra == 'dev'
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
ophyd_async/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
|
|
2
|
+
ophyd_async/__main__.py,sha256=G-Zcv_G9zK7Nhx6o5L5w-wyhMxdl_WgyMELu8IMFqAE,328
|
|
3
|
+
ophyd_async/_version.py,sha256=aeBju2l8GTMwAhIRG_c2Q_oVPFacRkZZwGtxmvFCGPQ,411
|
|
4
|
+
ophyd_async/core/__init__.py,sha256=5TjvjpdZEAjCHsf3G5A_yrgdh0vK0KwCx-qg31f2fLs,3675
|
|
5
|
+
ophyd_async/core/_detector.py,sha256=Rk7HR_QpQskhqWDwjENQL5HSj49PJWtLbWTxoQeTZKw,11228
|
|
6
|
+
ophyd_async/core/_device.py,sha256=DDdRujYLCDSuGDB0gqElkzI0qEGb3sMlFP6FgmH2u3A,7554
|
|
7
|
+
ophyd_async/core/_device_save_loader.py,sha256=pTom5EOFa9_5Z3bV37zOnbGx2ujWIOl_D9PVYhpY1FY,8232
|
|
8
|
+
ophyd_async/core/_flyer.py,sha256=8_N9u6s2P9qPZmNtHFfdmFv8FD7sKrKb9-IuvNUVHPw,2267
|
|
9
|
+
ophyd_async/core/_hdf_dataset.py,sha256=ZFfG6hmWRcExFhTxbnWB5NwuaOI_cwE4z_fjXV2Vg8s,2600
|
|
10
|
+
ophyd_async/core/_log.py,sha256=Hsk2Iwx81n3HpxNR30xGTnLJh_lPGd_CGy2MI3OGpWs,3588
|
|
11
|
+
ophyd_async/core/_mock_signal_backend.py,sha256=M_I2LxxJrJmBAbmILjVoAR6E2U8K2UswvHGiHluMqHc,2799
|
|
12
|
+
ophyd_async/core/_mock_signal_utils.py,sha256=DSCJiwkSF1aVoUAtlsRm-3PY4Eiff4vYHjlD_QbbhdA,4696
|
|
13
|
+
ophyd_async/core/_protocol.py,sha256=aRoqet0ThyVK_wrULh4k_StnpeHnNhXc0YffWdRJNZw,3391
|
|
14
|
+
ophyd_async/core/_providers.py,sha256=-HlisysZZcqs6z1yQsWCpof7hQ9QTbg2IYpm4XaErGQ,7454
|
|
15
|
+
ophyd_async/core/_readable.py,sha256=WayM35JOJj732-YgvGsjUSlCZwZ_zq1zbAmk-1U0uwU,8998
|
|
16
|
+
ophyd_async/core/_signal.py,sha256=IE_7Enn_RU8IUg6L1bpchbMvwwA4YZdrA8S7bOKk_7o,18503
|
|
17
|
+
ophyd_async/core/_signal_backend.py,sha256=-Vze8-57W0jpcC4gq4P4rZpXXJvi2qrbu0A8AjqA594,2638
|
|
18
|
+
ophyd_async/core/_soft_signal_backend.py,sha256=Z4LiADd9xKrxhhPOx8q5xq4yrJRdJbfuKeB0o2wBjCk,6653
|
|
19
|
+
ophyd_async/core/_status.py,sha256=mjzoGyaMFCfQLIWNKv_VcuCz9unZ9Gs3nCkaa1dTne8,4334
|
|
20
|
+
ophyd_async/core/_utils.py,sha256=3oZcXNqAUHX4ZWMBH5gSuK6cFWEhSkZ9GSDYv0pf8jc,5783
|
|
21
|
+
ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
+
ophyd_async/epics/motor.py,sha256=z1a61P1-tA3RxeD36uhhE6WJ0AfLU6xodtdk2avV_Ss,8495
|
|
23
|
+
ophyd_async/epics/adaravis/__init__.py,sha256=u979_9nQTYB0TvDOTXFN4qMrbDP8-xQFfXYMGzLVBo4,207
|
|
24
|
+
ophyd_async/epics/adaravis/_aravis.py,sha256=f2xiKQr1AcX6R-NjaMMgfXBfbHIsYfDGp4-CyHKIT6I,1949
|
|
25
|
+
ophyd_async/epics/adaravis/_aravis_controller.py,sha256=SzyajBNoqvBOUVtNE0t8ghffY2pYP8U99XgQ-4u2pVI,2635
|
|
26
|
+
ophyd_async/epics/adaravis/_aravis_io.py,sha256=GY2thPUJ-6821GvfZTBLoX8g9d-U1YgyoXe3wYRVw-g,1554
|
|
27
|
+
ophyd_async/epics/adcore/__init__.py,sha256=6L2xRXI6AvrOYGqPg0oIzYF7N9lxF9mxIVFDYELjw7I,923
|
|
28
|
+
ophyd_async/epics/adcore/_core_io.py,sha256=aLl8sSYJZqPjHEVBiwWcLDsWtjCFYL-t_02KTqDiwUA,4547
|
|
29
|
+
ophyd_async/epics/adcore/_core_logic.py,sha256=XpM1t2kqof9q_7fkKlFPKP2vT0DoLgc0drj7cTUHsbU,3421
|
|
30
|
+
ophyd_async/epics/adcore/_hdf_writer.py,sha256=rnNNwFAr3KtNJCIk0jRGA0Fz5MPhUV3bvShG00OpG7A,5882
|
|
31
|
+
ophyd_async/epics/adcore/_single_trigger.py,sha256=LGhAZV0GoRwRTNFQmgLpkfq73HsiMCu20JKYGOzxt0I,1159
|
|
32
|
+
ophyd_async/epics/adcore/_utils.py,sha256=EgpofUaLV9AofcMmwLYmRybDGWRonRZNYUzWrMxoQL4,3587
|
|
33
|
+
ophyd_async/epics/adkinetix/__init__.py,sha256=QEft12PURied6LRzjw-NhUmngjAm1XNA3k-5o5aMXDQ,216
|
|
34
|
+
ophyd_async/epics/adkinetix/_kinetix.py,sha256=Xnt54pqxWArcBIZ8RdLMXfMX0kCDCInJQp48MMx6Gmw,1181
|
|
35
|
+
ophyd_async/epics/adkinetix/_kinetix_controller.py,sha256=jHe6MSfqCOdzw0jQ5L6cYq55I0TD5Bso2ZGOZmv1j3Q,1504
|
|
36
|
+
ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=zm3MnJkOVCAIyHi3x3t0trAv4GlEFZMJPd8VGsn50Lc,838
|
|
37
|
+
ophyd_async/epics/adpilatus/__init__.py,sha256=daimScOCCMHR2eb8VbezHOcGOkd6uIRZQiyeTQsaAx4,308
|
|
38
|
+
ophyd_async/epics/adpilatus/_pilatus.py,sha256=NEim_ZROa-B0uYXYgLiiAIDzqzl-IjSCqpOrosOvcHk,1748
|
|
39
|
+
ophyd_async/epics/adpilatus/_pilatus_controller.py,sha256=1dB27dZyNdcGLDDs8Lw8C0wVc_Yok0tXjGyBocI4BiE,2463
|
|
40
|
+
ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=jhD8RswxN0eTqPR-lMw7L9yGoT4H1ZIphguZk2GZOJM,735
|
|
41
|
+
ophyd_async/epics/adsimdetector/__init__.py,sha256=t3crUgTEvVJGI8o6FsfN42k0A-l4v9ZBwXIYtixoE-M,128
|
|
42
|
+
ophyd_async/epics/adsimdetector/_sim.py,sha256=nk4Xj_j_WeKk1FJov-Zo2W7NHnHcBUDbIzranHUpngI,863
|
|
43
|
+
ophyd_async/epics/adsimdetector/_sim_controller.py,sha256=v0GrMXg7U1PUvLKW8zmx8zrunk_MfFt7GbckbVlnUys,1494
|
|
44
|
+
ophyd_async/epics/advimba/__init__.py,sha256=GSnFWGPNJsCJZ-Tgyv-L38Smwzp2bWC64U_4uD2TLvs,198
|
|
45
|
+
ophyd_async/epics/advimba/_vimba.py,sha256=qDLP5KcI0PZGgpMVmzkfxfgIt3hoiqpvNlRGrtEZxl4,1122
|
|
46
|
+
ophyd_async/epics/advimba/_vimba_controller.py,sha256=R7OUQGule1HdEl4Eo7MTthU0TpLFYSAZ8l_G8G3LNxU,1995
|
|
47
|
+
ophyd_async/epics/advimba/_vimba_io.py,sha256=4tYfcPgt0uD2pf3eAV7OHMCXlecG3vfvoll_EI6_neM,1802
|
|
48
|
+
ophyd_async/epics/demo/__init__.py,sha256=wCrgemEo-zR4TTvaqCKnQ-AIUHorotV5jhftbq1tXz0,1368
|
|
49
|
+
ophyd_async/epics/demo/_mover.py,sha256=7GEmF-mgN0qxiHUE3Tgboh0p9S5AuPBYR-pFeg5QFTk,3520
|
|
50
|
+
ophyd_async/epics/demo/_sensor.py,sha256=8OyFAsB3EXMzrQreOIg_TGHrseUtI5rxXpfwwUaC76I,1165
|
|
51
|
+
ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
|
|
52
|
+
ophyd_async/epics/demo/sensor.db,sha256=AVtiydrdtwAz2EFurO2Ult9SSRtre3r0akOBbL98LT0,554
|
|
53
|
+
ophyd_async/epics/pvi/__init__.py,sha256=ZvJO69ApL7N9rWT9-hD-JZMC_KsHxgeEqxe-01jNUVw,137
|
|
54
|
+
ophyd_async/epics/pvi/_pvi.py,sha256=PUst4KhX8emkbRunLrJeqTruaOMF3mm1s7YJsBB7HpQ,12099
|
|
55
|
+
ophyd_async/epics/signal/__init__.py,sha256=cJGvTnJxHNzpWyWIYXU4UGMoz3uqZ88UVXNvG-TGngo,441
|
|
56
|
+
ophyd_async/epics/signal/_aioca.py,sha256=qvaEmGllNplWgzwjlAPsHhF8IgPkgYYKqn-_YV9t1pU,11408
|
|
57
|
+
ophyd_async/epics/signal/_common.py,sha256=MYf34SAKUPqvMv9YKJ5-3G6zVrjhRYbpQvGXGiONSws,1848
|
|
58
|
+
ophyd_async/epics/signal/_epics_transport.py,sha256=MnkhnbpYSxrS7Wo8jDJ1YGnkrvjfYEt1oOe-uxjGCPU,839
|
|
59
|
+
ophyd_async/epics/signal/_p4p.py,sha256=jozZoyCC6bOtpJMWCcPLWA3sxQTf9YLo_Koq9hOVrLA,15752
|
|
60
|
+
ophyd_async/epics/signal/_signal.py,sha256=i5q7zTv5y3HFQRI1JrwWT-gN6bViPWNuks14le2pTFI,3252
|
|
61
|
+
ophyd_async/fastcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
62
|
+
ophyd_async/fastcs/odin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
63
|
+
ophyd_async/fastcs/panda/__init__.py,sha256=REtsRQCLGi9uhjYIwLL7C6n_pbJMvG_MfWY_M5wxGIQ,1187
|
|
64
|
+
ophyd_async/fastcs/panda/_common_blocks.py,sha256=4wyc4iTpOuDnzFXk98l287E5Ygl9ZO9tN7s1Lp9t6CM,1542
|
|
65
|
+
ophyd_async/fastcs/panda/_hdf_panda.py,sha256=KXahiaMvMm2Ox9G31QBWunYTWedXnKAKS8c63FL0AgM,1321
|
|
66
|
+
ophyd_async/fastcs/panda/_hdf_writer.py,sha256=6I89I4XVUOWYA7IqmbOcL8hp9x5vFA_vJOSxAIqqRRw,5042
|
|
67
|
+
ophyd_async/fastcs/panda/_panda_controller.py,sha256=ltetcf_OSQMtLVSh1uKW7Nyu5XDbb-W9iuw767cP66E,1237
|
|
68
|
+
ophyd_async/fastcs/panda/_table.py,sha256=atd9wiam0XQH89doqzn0U6J42CFQBKDs9K1_q5GcJR8,6093
|
|
69
|
+
ophyd_async/fastcs/panda/_trigger.py,sha256=iqmLN1Dh8n_p4amhTKSP5ifSaLhYwqqHhva0G-oVSvM,3062
|
|
70
|
+
ophyd_async/fastcs/panda/_utils.py,sha256=VHW5kPVISyEkmse_qQcyisBkkEwMO6GG2Ago-CH1AFA,487
|
|
71
|
+
ophyd_async/plan_stubs/__init__.py,sha256=Qn0VDrlT2CmzP32qzAeP3YFvLWdLfpveq3qGQM_4TsE,407
|
|
72
|
+
ophyd_async/plan_stubs/_ensure_connected.py,sha256=6Q7_UWQ-UQ0awe6mnN4PdNCAOGRm4GZR9X2M-ghQCeI,711
|
|
73
|
+
ophyd_async/plan_stubs/_fly.py,sha256=PWT7cbnVUDBFtjKkMQ7Lr960M9d0JcUBseXFYhzBc8I,6299
|
|
74
|
+
ophyd_async/sim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
75
|
+
ophyd_async/sim/demo/__init__.py,sha256=JKWFnHqmFuRRMvvU0aBuclke3OdF0iq89yvHEd4J7Bg,371
|
|
76
|
+
ophyd_async/sim/demo/_sim_motor.py,sha256=Dfc-1faeqbVLsCLuM2FFJ2F20Ib0UsS2vsHdqgVt2Zk,3601
|
|
77
|
+
ophyd_async/sim/demo/_pattern_detector/__init__.py,sha256=o_dSZDIl_CyS3YPSNKpGiQiR9UaC4cNzZ8_ByEN9dIk,402
|
|
78
|
+
ophyd_async/sim/demo/_pattern_detector/_pattern_detector.py,sha256=5PH9vZ0vLhhvzN1H-7HUcaNUOQ---9i0GEBKY_luRTI,1278
|
|
79
|
+
ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py,sha256=JJ6iQexK--ODJ8am9hIu4LARzuYvdNhqHjPE6KcCdJI,1717
|
|
80
|
+
ophyd_async/sim/demo/_pattern_detector/_pattern_detector_writer.py,sha256=ayJJ2Y0rqM7gIEtxhH4-iRnYi0RQTaEWFIHUJd2W27Y,1280
|
|
81
|
+
ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py,sha256=ksgXyyErAdvFKac4vuJLB_9aXBqLzbCEZ4_ag7hFpE4,7257
|
|
82
|
+
ophyd_async/sim/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
83
|
+
ophyd_async/tango/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
84
|
+
ophyd_async-0.5.0.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
|
|
85
|
+
ophyd_async-0.5.0.dist-info/METADATA,sha256=uExqBPoTfChURS_0SJ0AZ0ktukzZYMOZ1AcXKMOJj80,6491
|
|
86
|
+
ophyd_async-0.5.0.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
|
|
87
|
+
ophyd_async-0.5.0.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
|
|
88
|
+
ophyd_async-0.5.0.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
|
|
89
|
+
ophyd_async-0.5.0.dist-info/RECORD,,
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
from .aravis import AravisDetector
|
|
2
|
-
from .kinetix import KinetixDetector
|
|
3
|
-
from .pilatus import PilatusDetector
|
|
4
|
-
from .single_trigger_det import SingleTriggerDet
|
|
5
|
-
from .utils import (
|
|
6
|
-
FileWriteMode,
|
|
7
|
-
ImageMode,
|
|
8
|
-
NDAttributeDataType,
|
|
9
|
-
NDAttributesXML,
|
|
10
|
-
)
|
|
11
|
-
from .vimba import VimbaDetector
|
|
12
|
-
|
|
13
|
-
__all__ = [
|
|
14
|
-
"AravisDetector",
|
|
15
|
-
"KinetixDetector",
|
|
16
|
-
"VimbaDetector",
|
|
17
|
-
"SingleTriggerDet",
|
|
18
|
-
"FileWriteMode",
|
|
19
|
-
"ImageMode",
|
|
20
|
-
"NDAttributeDataType",
|
|
21
|
-
"NDAttributesXML",
|
|
22
|
-
"PilatusDetector",
|
|
23
|
-
]
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
from .ad_base import (
|
|
2
|
-
ADBase,
|
|
3
|
-
ADBaseShapeProvider,
|
|
4
|
-
DetectorState,
|
|
5
|
-
set_exposure_time_and_acquire_period_if_supplied,
|
|
6
|
-
start_acquiring_driver_and_ensure_status,
|
|
7
|
-
)
|
|
8
|
-
from .aravis_driver import AravisDriver
|
|
9
|
-
from .kinetix_driver import KinetixDriver
|
|
10
|
-
from .pilatus_driver import PilatusDriver
|
|
11
|
-
from .vimba_driver import VimbaDriver
|
|
12
|
-
|
|
13
|
-
__all__ = [
|
|
14
|
-
"ADBase",
|
|
15
|
-
"ADBaseShapeProvider",
|
|
16
|
-
"PilatusDriver",
|
|
17
|
-
"AravisDriver",
|
|
18
|
-
"KinetixDriver",
|
|
19
|
-
"VimbaDriver",
|
|
20
|
-
"start_acquiring_driver_and_ensure_status",
|
|
21
|
-
"set_exposure_time_and_acquire_period_if_supplied",
|
|
22
|
-
"DetectorState",
|
|
23
|
-
]
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
from bluesky.protocols import HasHints, Hints
|
|
2
|
-
|
|
3
|
-
from ophyd_async.core import DirectoryProvider, StandardDetector
|
|
4
|
-
from ophyd_async.epics.areadetector.controllers.vimba_controller import VimbaController
|
|
5
|
-
from ophyd_async.epics.areadetector.drivers import ADBaseShapeProvider
|
|
6
|
-
from ophyd_async.epics.areadetector.drivers.vimba_driver import VimbaDriver
|
|
7
|
-
from ophyd_async.epics.areadetector.writers import HDFWriter, NDFileHDF
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class VimbaDetector(StandardDetector, HasHints):
|
|
11
|
-
"""
|
|
12
|
-
Ophyd-async implementation of an ADVimba Detector.
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
_controller: VimbaController
|
|
16
|
-
_writer: HDFWriter
|
|
17
|
-
|
|
18
|
-
def __init__(
|
|
19
|
-
self,
|
|
20
|
-
prefix: str,
|
|
21
|
-
directory_provider: DirectoryProvider,
|
|
22
|
-
drv_suffix="cam1:",
|
|
23
|
-
hdf_suffix="HDF1:",
|
|
24
|
-
name="",
|
|
25
|
-
):
|
|
26
|
-
self.drv = VimbaDriver(prefix + drv_suffix)
|
|
27
|
-
self.hdf = NDFileHDF(prefix + hdf_suffix)
|
|
28
|
-
|
|
29
|
-
super().__init__(
|
|
30
|
-
VimbaController(self.drv),
|
|
31
|
-
HDFWriter(
|
|
32
|
-
self.hdf,
|
|
33
|
-
directory_provider,
|
|
34
|
-
lambda: self.name,
|
|
35
|
-
ADBaseShapeProvider(self.drv),
|
|
36
|
-
),
|
|
37
|
-
config_sigs=(self.drv.acquire_time,),
|
|
38
|
-
name=name,
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
@property
|
|
42
|
-
def hints(self) -> Hints:
|
|
43
|
-
return self._writer.hints
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Iterator, List
|
|
3
|
-
|
|
4
|
-
from event_model import StreamDatum, StreamResource, compose_stream_resource
|
|
5
|
-
|
|
6
|
-
from ophyd_async.core import DirectoryInfo
|
|
7
|
-
|
|
8
|
-
from ._hdfdataset import _HDFDataset
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class _HDFFile:
|
|
12
|
-
"""
|
|
13
|
-
:param directory_info: Contains information about how to construct a StreamResource
|
|
14
|
-
:param full_file_name: Absolute path to the file to be written
|
|
15
|
-
:param datasets: Datasets to write into the file
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
def __init__(
|
|
19
|
-
self,
|
|
20
|
-
directory_info: DirectoryInfo,
|
|
21
|
-
full_file_name: Path,
|
|
22
|
-
datasets: List[_HDFDataset],
|
|
23
|
-
) -> None:
|
|
24
|
-
self._last_emitted = 0
|
|
25
|
-
self._bundles = [
|
|
26
|
-
compose_stream_resource(
|
|
27
|
-
spec="AD_HDF5_SWMR_SLICE",
|
|
28
|
-
root=str(directory_info.root),
|
|
29
|
-
data_key=ds.name,
|
|
30
|
-
resource_path=str(full_file_name.relative_to(directory_info.root)),
|
|
31
|
-
resource_kwargs={
|
|
32
|
-
"path": ds.path,
|
|
33
|
-
"multiplier": ds.multiplier,
|
|
34
|
-
"timestamps": "/entry/instrument/NDAttributes/NDArrayTimeStamp",
|
|
35
|
-
},
|
|
36
|
-
)
|
|
37
|
-
for ds in datasets
|
|
38
|
-
]
|
|
39
|
-
|
|
40
|
-
def stream_resources(self) -> Iterator[StreamResource]:
|
|
41
|
-
for bundle in self._bundles:
|
|
42
|
-
yield bundle.stream_resource_doc
|
|
43
|
-
|
|
44
|
-
def stream_data(self, indices_written: int) -> Iterator[StreamDatum]:
|
|
45
|
-
# Indices are relative to resource
|
|
46
|
-
if indices_written > self._last_emitted:
|
|
47
|
-
indices = {
|
|
48
|
-
"start": self._last_emitted,
|
|
49
|
-
"stop": indices_written,
|
|
50
|
-
}
|
|
51
|
-
self._last_emitted = indices_written
|
|
52
|
-
for bundle in self._bundles:
|
|
53
|
-
yield bundle.compose_stream_datum(indices)
|
|
54
|
-
return None
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
|
-
|
|
3
|
-
from ...signal.signal import epics_signal_r, epics_signal_rw, epics_signal_rw_rbv
|
|
4
|
-
from ..utils import FileWriteMode
|
|
5
|
-
from .nd_plugin import NDPluginBase
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class Compression(str, Enum):
|
|
9
|
-
none = "None"
|
|
10
|
-
nbit = "N-bit"
|
|
11
|
-
szip = "szip"
|
|
12
|
-
zlib = "zlib"
|
|
13
|
-
blosc = "Blosc"
|
|
14
|
-
bslz4 = "BSLZ4"
|
|
15
|
-
lz4 = "LZ4"
|
|
16
|
-
jpeg = "JPEG"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class NDFileHDF(NDPluginBase):
|
|
20
|
-
def __init__(self, prefix: str, name="") -> None:
|
|
21
|
-
# Define some signals
|
|
22
|
-
self.position_mode = epics_signal_rw_rbv(bool, prefix + "PositionMode")
|
|
23
|
-
self.compression = epics_signal_rw_rbv(Compression, prefix + "Compression")
|
|
24
|
-
self.num_extra_dims = epics_signal_rw_rbv(int, prefix + "NumExtraDims")
|
|
25
|
-
self.file_path = epics_signal_rw_rbv(str, prefix + "FilePath")
|
|
26
|
-
self.file_name = epics_signal_rw_rbv(str, prefix + "FileName")
|
|
27
|
-
self.file_path_exists = epics_signal_r(bool, prefix + "FilePathExists_RBV")
|
|
28
|
-
self.file_template = epics_signal_rw_rbv(str, prefix + "FileTemplate")
|
|
29
|
-
self.full_file_name = epics_signal_r(str, prefix + "FullFileName_RBV")
|
|
30
|
-
self.file_write_mode = epics_signal_rw_rbv(
|
|
31
|
-
FileWriteMode, prefix + "FileWriteMode"
|
|
32
|
-
)
|
|
33
|
-
self.num_capture = epics_signal_rw_rbv(int, prefix + "NumCapture")
|
|
34
|
-
self.num_captured = epics_signal_r(int, prefix + "NumCaptured_RBV")
|
|
35
|
-
self.swmr_mode = epics_signal_rw_rbv(bool, prefix + "SWMRMode")
|
|
36
|
-
self.lazy_open = epics_signal_rw_rbv(bool, prefix + "LazyOpen")
|
|
37
|
-
self.capture = epics_signal_rw_rbv(bool, prefix + "Capture")
|
|
38
|
-
self.flush_now = epics_signal_rw(bool, prefix + "FlushNow")
|
|
39
|
-
self.xml_file_name = epics_signal_rw_rbv(str, prefix + "XMLFileName")
|
|
40
|
-
super().__init__(prefix, name)
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
|
-
|
|
3
|
-
from ophyd_async.core import Device
|
|
4
|
-
from ophyd_async.epics.signal import epics_signal_rw
|
|
5
|
-
from ophyd_async.epics.signal.signal import epics_signal_r, epics_signal_rw_rbv
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class Callback(str, Enum):
|
|
9
|
-
Enable = "Enable"
|
|
10
|
-
Disable = "Disable"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class NDArrayBase(Device):
|
|
14
|
-
def __init__(self, prefix: str, name: str = "") -> None:
|
|
15
|
-
self.unique_id = epics_signal_r(int, prefix + "UniqueId_RBV")
|
|
16
|
-
self.nd_attributes_file = epics_signal_rw(str, prefix + "NDAttributesFile")
|
|
17
|
-
self.acquire = epics_signal_rw_rbv(bool, prefix + "Acquire")
|
|
18
|
-
self.array_size_x = epics_signal_r(int, prefix + "ArraySizeX_RBV")
|
|
19
|
-
self.array_size_y = epics_signal_r(int, prefix + "ArraySizeY_RBV")
|
|
20
|
-
self.array_counter = epics_signal_rw_rbv(int, prefix + "ArrayCounter")
|
|
21
|
-
# There is no _RBV for this one
|
|
22
|
-
self.wait_for_plugins = epics_signal_rw(bool, prefix + "WaitForPlugins")
|
|
23
|
-
|
|
24
|
-
super().__init__(name=name)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class NDPluginBase(NDArrayBase):
|
|
28
|
-
def __init__(self, prefix: str, name: str = "") -> None:
|
|
29
|
-
self.nd_array_port = epics_signal_rw_rbv(str, prefix + "NDArrayPort")
|
|
30
|
-
self.enable_callback = epics_signal_rw_rbv(Callback, prefix + "EnableCallbacks")
|
|
31
|
-
self.nd_array_address = epics_signal_rw_rbv(int, prefix + "NDArrayAddress")
|
|
32
|
-
self.array_size0 = epics_signal_r(int, prefix + "ArraySize0_RBV")
|
|
33
|
-
self.array_size1 = epics_signal_r(int, prefix + "ArraySize1_RBV")
|
|
34
|
-
super().__init__(prefix, name)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class NDPluginStats(NDPluginBase):
|
|
38
|
-
pass
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
from typing import Sequence
|
|
2
|
-
|
|
3
|
-
from ophyd_async.core import DirectoryProvider, SignalR, StandardDetector
|
|
4
|
-
|
|
5
|
-
from ..areadetector.controllers import ADSimController
|
|
6
|
-
from ..areadetector.drivers import ADBase, ADBaseShapeProvider
|
|
7
|
-
from ..areadetector.writers import HDFWriter, NDFileHDF
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class DemoADSimDetector(StandardDetector):
|
|
11
|
-
_controller: ADSimController
|
|
12
|
-
_writer: HDFWriter
|
|
13
|
-
|
|
14
|
-
def __init__(
|
|
15
|
-
self,
|
|
16
|
-
drv: ADBase,
|
|
17
|
-
hdf: NDFileHDF,
|
|
18
|
-
directory_provider: DirectoryProvider,
|
|
19
|
-
name: str = "",
|
|
20
|
-
config_sigs: Sequence[SignalR] = (),
|
|
21
|
-
):
|
|
22
|
-
self.drv = drv
|
|
23
|
-
self.hdf = hdf
|
|
24
|
-
|
|
25
|
-
super().__init__(
|
|
26
|
-
ADSimController(self.drv),
|
|
27
|
-
HDFWriter(
|
|
28
|
-
self.hdf,
|
|
29
|
-
directory_provider,
|
|
30
|
-
lambda: self.name,
|
|
31
|
-
ADBaseShapeProvider(self.drv),
|
|
32
|
-
),
|
|
33
|
-
config_sigs=config_sigs,
|
|
34
|
-
name=name,
|
|
35
|
-
)
|