ophyd-async 0.3a6__py3-none-any.whl → 0.3.1a1__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 +3 -5
- ophyd_async/core/detector.py +15 -10
- ophyd_async/core/mock_signal_backend.py +5 -8
- ophyd_async/core/mock_signal_utils.py +25 -11
- ophyd_async/core/signal_backend.py +1 -1
- ophyd_async/core/standard_readable.py +2 -0
- ophyd_async/epics/areadetector/controllers/pilatus_controller.py +18 -5
- ophyd_async/epics/areadetector/drivers/pilatus_driver.py +2 -2
- ophyd_async/epics/areadetector/pilatus.py +21 -4
- ophyd_async/panda/_hdf_panda.py +0 -1
- ophyd_async/plan_stubs/fly.py +4 -0
- ophyd_async/sim/sim_pattern_generator.py +0 -2
- {ophyd_async-0.3a6.dist-info → ophyd_async-0.3.1a1.dist-info}/METADATA +2 -2
- {ophyd_async-0.3a6.dist-info → ophyd_async-0.3.1a1.dist-info}/RECORD +19 -19
- {ophyd_async-0.3a6.dist-info → ophyd_async-0.3.1a1.dist-info}/LICENSE +0 -0
- {ophyd_async-0.3a6.dist-info → ophyd_async-0.3.1a1.dist-info}/WHEEL +0 -0
- {ophyd_async-0.3a6.dist-info → ophyd_async-0.3.1a1.dist-info}/entry_points.txt +0 -0
- {ophyd_async-0.3a6.dist-info → ophyd_async-0.3.1a1.dist-info}/top_level.txt +0 -0
ophyd_async/_version.py
CHANGED
ophyd_async/core/__init__.py
CHANGED
|
@@ -24,12 +24,10 @@ from .device_save_loader import (
|
|
|
24
24
|
walk_rw_signals,
|
|
25
25
|
)
|
|
26
26
|
from .flyer import HardwareTriggeredFlyable, TriggerLogic
|
|
27
|
-
from .mock_signal_backend import
|
|
28
|
-
MockSignalBackend,
|
|
29
|
-
)
|
|
27
|
+
from .mock_signal_backend import MockSignalBackend
|
|
30
28
|
from .mock_signal_utils import (
|
|
31
|
-
assert_mock_put_called_with,
|
|
32
29
|
callback_on_mock_put,
|
|
30
|
+
get_mock_put,
|
|
33
31
|
mock_puts_blocked,
|
|
34
32
|
reset_mock_put_calls,
|
|
35
33
|
set_mock_put_proceeds,
|
|
@@ -70,7 +68,7 @@ from .utils import (
|
|
|
70
68
|
)
|
|
71
69
|
|
|
72
70
|
__all__ = [
|
|
73
|
-
"
|
|
71
|
+
"get_mock_put",
|
|
74
72
|
"callback_on_mock_put",
|
|
75
73
|
"mock_puts_blocked",
|
|
76
74
|
"set_mock_values",
|
ophyd_async/core/detector.py
CHANGED
|
@@ -63,6 +63,8 @@ class TriggerInfo:
|
|
|
63
63
|
deadtime: float
|
|
64
64
|
#: What is the maximum high time of the triggers
|
|
65
65
|
livetime: float
|
|
66
|
+
#: What is the maximum timeout on waiting for a frame
|
|
67
|
+
frame_timeout: float | None = None
|
|
66
68
|
|
|
67
69
|
|
|
68
70
|
class DetectorControl(ABC):
|
|
@@ -162,7 +164,6 @@ class StandardDetector(
|
|
|
162
164
|
writer: DetectorWriter,
|
|
163
165
|
config_sigs: Sequence[AsyncReadable] = (),
|
|
164
166
|
name: str = "",
|
|
165
|
-
writer_timeout: float = DEFAULT_TIMEOUT,
|
|
166
167
|
) -> None:
|
|
167
168
|
"""
|
|
168
169
|
Constructor
|
|
@@ -173,16 +174,11 @@ class StandardDetector(
|
|
|
173
174
|
config_sigs: Signals to read when describe and read
|
|
174
175
|
configuration are called. Defaults to ().
|
|
175
176
|
name: Device name. Defaults to "".
|
|
176
|
-
writer_timeout: Timeout for frame writing to start, if the
|
|
177
|
-
timeout is reached, ophyd-async assumes the detector
|
|
178
|
-
has a problem and raises an error.
|
|
179
|
-
Defaults to DEFAULT_TIMEOUT.
|
|
180
177
|
"""
|
|
181
178
|
self._controller = controller
|
|
182
179
|
self._writer = writer
|
|
183
180
|
self._describe: Dict[str, DataKey] = {}
|
|
184
181
|
self._config_sigs = list(config_sigs)
|
|
185
|
-
self._frame_writing_timeout = writer_timeout
|
|
186
182
|
# For prepare
|
|
187
183
|
self._arm_status: Optional[AsyncStatus] = None
|
|
188
184
|
self._trigger_info: Optional[TriggerInfo] = None
|
|
@@ -245,17 +241,21 @@ class StandardDetector(
|
|
|
245
241
|
|
|
246
242
|
@AsyncStatus.wrap
|
|
247
243
|
async def trigger(self) -> None:
|
|
244
|
+
# set default trigger_info
|
|
245
|
+
self._trigger_info = TriggerInfo(
|
|
246
|
+
num=1, trigger=DetectorTrigger.internal, deadtime=0.0, livetime=0.0
|
|
247
|
+
)
|
|
248
248
|
# Arm the detector and wait for it to finish.
|
|
249
249
|
indices_written = await self.writer.get_indices_written()
|
|
250
250
|
written_status = await self.controller.arm(
|
|
251
|
-
num=
|
|
252
|
-
trigger=
|
|
251
|
+
num=self._trigger_info.num,
|
|
252
|
+
trigger=self._trigger_info.trigger,
|
|
253
253
|
)
|
|
254
254
|
await written_status
|
|
255
255
|
end_observation = indices_written + 1
|
|
256
256
|
|
|
257
257
|
async for index in self.writer.observe_indices_written(
|
|
258
|
-
self.
|
|
258
|
+
DEFAULT_TIMEOUT + self._trigger_info.livetime + self._trigger_info.deadtime
|
|
259
259
|
):
|
|
260
260
|
if index >= end_observation:
|
|
261
261
|
break
|
|
@@ -309,7 +309,12 @@ class StandardDetector(
|
|
|
309
309
|
assert self._arm_status, "Prepare not run"
|
|
310
310
|
assert self._trigger_info
|
|
311
311
|
async for index in self.writer.observe_indices_written(
|
|
312
|
-
self.
|
|
312
|
+
self._trigger_info.frame_timeout
|
|
313
|
+
or (
|
|
314
|
+
DEFAULT_TIMEOUT
|
|
315
|
+
+ self._trigger_info.livetime
|
|
316
|
+
+ self._trigger_info.deadtime
|
|
317
|
+
)
|
|
313
318
|
):
|
|
314
319
|
yield WatcherUpdate(
|
|
315
320
|
name=self.name,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
from functools import cached_property
|
|
3
|
-
from typing import Optional, Type
|
|
3
|
+
from typing import Callable, Optional, Type
|
|
4
4
|
from unittest.mock import Mock
|
|
5
5
|
|
|
6
6
|
from bluesky.protocols import Descriptor, Reading
|
|
@@ -10,7 +10,7 @@ from ophyd_async.core.soft_signal_backend import SoftSignalBackend
|
|
|
10
10
|
from ophyd_async.core.utils import DEFAULT_TIMEOUT, ReadingValueCallback, T
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
class MockSignalBackend(SignalBackend):
|
|
13
|
+
class MockSignalBackend(SignalBackend[T]):
|
|
14
14
|
def __init__(
|
|
15
15
|
self,
|
|
16
16
|
datatype: Optional[Type[T]] = None,
|
|
@@ -31,11 +31,11 @@ class MockSignalBackend(SignalBackend):
|
|
|
31
31
|
|
|
32
32
|
if not isinstance(self.initial_backend, SoftSignalBackend):
|
|
33
33
|
# If the backend is a hard signal backend, or not provided,
|
|
34
|
-
# then we create a soft signal to
|
|
34
|
+
# then we create a soft signal to mimic it
|
|
35
35
|
|
|
36
36
|
self.soft_backend = SoftSignalBackend(datatype=datatype)
|
|
37
37
|
else:
|
|
38
|
-
self.soft_backend = initial_backend
|
|
38
|
+
self.soft_backend = self.initial_backend
|
|
39
39
|
|
|
40
40
|
def source(self, name: str) -> str:
|
|
41
41
|
if self.initial_backend:
|
|
@@ -47,7 +47,7 @@ class MockSignalBackend(SignalBackend):
|
|
|
47
47
|
|
|
48
48
|
@cached_property
|
|
49
49
|
def put_mock(self) -> Mock:
|
|
50
|
-
return Mock(name="put")
|
|
50
|
+
return Mock(name="put", spec=Callable)
|
|
51
51
|
|
|
52
52
|
@cached_property
|
|
53
53
|
def put_proceeds(self) -> asyncio.Event:
|
|
@@ -65,9 +65,6 @@ class MockSignalBackend(SignalBackend):
|
|
|
65
65
|
def set_value(self, value: T):
|
|
66
66
|
self.soft_backend.set_value(value)
|
|
67
67
|
|
|
68
|
-
async def get_descriptor(self, source: str) -> Descriptor:
|
|
69
|
-
return await self.soft_backend.get_descriptor(source)
|
|
70
|
-
|
|
71
68
|
async def get_reading(self) -> Reading:
|
|
72
69
|
return await self.soft_backend.get_reading()
|
|
73
70
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from contextlib import asynccontextmanager, contextmanager
|
|
2
|
-
from typing import Any, Callable, Iterable
|
|
3
|
-
from unittest.mock import
|
|
2
|
+
from typing import Any, Callable, Iterable
|
|
3
|
+
from unittest.mock import Mock
|
|
4
4
|
|
|
5
5
|
from ophyd_async.core.signal import Signal
|
|
6
6
|
from ophyd_async.core.utils import T
|
|
@@ -22,7 +22,7 @@ def set_mock_value(signal: Signal[T], value: T):
|
|
|
22
22
|
backend.set_value(value)
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
def set_mock_put_proceeds(signal: Signal
|
|
25
|
+
def set_mock_put_proceeds(signal: Signal, proceeds: bool):
|
|
26
26
|
"""Allow or block a put with wait=True from proceeding"""
|
|
27
27
|
backend = _get_mock_signal_backend(signal)
|
|
28
28
|
|
|
@@ -33,7 +33,7 @@ def set_mock_put_proceeds(signal: Signal[T], proceeds: bool):
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
@asynccontextmanager
|
|
36
|
-
async def mock_puts_blocked(*signals:
|
|
36
|
+
async def mock_puts_blocked(*signals: Signal):
|
|
37
37
|
for signal in signals:
|
|
38
38
|
set_mock_put_proceeds(signal, False)
|
|
39
39
|
yield
|
|
@@ -41,9 +41,9 @@ async def mock_puts_blocked(*signals: List[Signal]):
|
|
|
41
41
|
set_mock_put_proceeds(signal, True)
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
def
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
def get_mock_put(signal: Signal) -> Mock:
|
|
45
|
+
"""Get the mock associated with the put call on the signal."""
|
|
46
|
+
return _get_mock_signal_backend(signal).put_mock
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
def reset_mock_put_calls(signal: Signal):
|
|
@@ -79,15 +79,29 @@ class _SetValuesIterator:
|
|
|
79
79
|
return next_value
|
|
80
80
|
|
|
81
81
|
def __del__(self):
|
|
82
|
-
if self.require_all_consumed
|
|
83
|
-
|
|
82
|
+
if self.require_all_consumed:
|
|
83
|
+
# Values is cast to a list here because the user has supplied
|
|
84
|
+
# require_all_consumed=True, we can therefore assume they
|
|
85
|
+
# supplied a finite list.
|
|
86
|
+
# In the case of require_all_consumed=False, an infinite
|
|
87
|
+
# iterble is permitted
|
|
88
|
+
values = list(self.values)
|
|
89
|
+
if self.index != len(values):
|
|
90
|
+
# Report the values consumed and the values yet to be
|
|
91
|
+
# consumed
|
|
92
|
+
consumed = values[0 : self.index]
|
|
93
|
+
to_be_consumed = values[self.index :]
|
|
94
|
+
raise AssertionError(
|
|
95
|
+
f"{self.signal.name}: {consumed} were consumed "
|
|
96
|
+
f"but {to_be_consumed} were not consumed"
|
|
97
|
+
)
|
|
84
98
|
|
|
85
99
|
|
|
86
100
|
def set_mock_values(
|
|
87
101
|
signal: Signal,
|
|
88
102
|
values: Iterable[Any],
|
|
89
103
|
require_all_consumed: bool = False,
|
|
90
|
-
) ->
|
|
104
|
+
) -> _SetValuesIterator:
|
|
91
105
|
"""Iterator to set a signal to a sequence of values, optionally repeating the
|
|
92
106
|
sequence.
|
|
93
107
|
|
|
@@ -127,7 +141,7 @@ def _unset_side_effect_cm(put_mock: Mock):
|
|
|
127
141
|
put_mock.side_effect = None
|
|
128
142
|
|
|
129
143
|
|
|
130
|
-
def callback_on_mock_put(signal: Signal, callback: Callable[[T], None]):
|
|
144
|
+
def callback_on_mock_put(signal: Signal[T], callback: Callable[[T], None]):
|
|
131
145
|
"""For setting a callback when a backend is put to.
|
|
132
146
|
|
|
133
147
|
Can either be used in a context, with the callback being
|
|
@@ -14,7 +14,7 @@ class SignalBackend(Generic[T]):
|
|
|
14
14
|
|
|
15
15
|
#: Like ca://PV_PREFIX:SIGNAL
|
|
16
16
|
@abstractmethod
|
|
17
|
-
def source(name: str) -> str:
|
|
17
|
+
def source(self, name: str) -> str:
|
|
18
18
|
"""Return source of signal. Signals may pass a name to the backend, which can be
|
|
19
19
|
used or discarded."""
|
|
20
20
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
from typing import Optional
|
|
3
3
|
|
|
4
|
+
from ophyd_async.core import DEFAULT_TIMEOUT, wait_for_value
|
|
4
5
|
from ophyd_async.core.async_status import AsyncStatus
|
|
5
6
|
from ophyd_async.core.detector import DetectorControl, DetectorTrigger
|
|
6
7
|
from ophyd_async.epics.areadetector.drivers.ad_base import (
|
|
@@ -23,14 +24,13 @@ class PilatusController(DetectorControl):
|
|
|
23
24
|
def __init__(
|
|
24
25
|
self,
|
|
25
26
|
driver: PilatusDriver,
|
|
27
|
+
readout_time: float,
|
|
26
28
|
) -> None:
|
|
27
29
|
self._drv = driver
|
|
30
|
+
self._readout_time = readout_time
|
|
28
31
|
|
|
29
32
|
def get_deadtime(self, exposure: float) -> float:
|
|
30
|
-
|
|
31
|
-
"""The required minimum time difference between ExpPeriod and ExpTime
|
|
32
|
-
(readout time) is 2.28 ms"""
|
|
33
|
-
return 2.28e-3
|
|
33
|
+
return self._readout_time
|
|
34
34
|
|
|
35
35
|
async def arm(
|
|
36
36
|
self,
|
|
@@ -45,7 +45,20 @@ class PilatusController(DetectorControl):
|
|
|
45
45
|
self._drv.num_images.set(999_999 if num == 0 else num),
|
|
46
46
|
self._drv.image_mode.set(ImageMode.multiple),
|
|
47
47
|
)
|
|
48
|
-
|
|
48
|
+
|
|
49
|
+
# Standard arm the detector and wait for the acquire PV to be True
|
|
50
|
+
idle_status = await start_acquiring_driver_and_ensure_status(self._drv)
|
|
51
|
+
|
|
52
|
+
# The pilatus has an additional PV that goes True when the camserver
|
|
53
|
+
# is actually ready. Should wait for that too or we risk dropping
|
|
54
|
+
# a frame
|
|
55
|
+
await wait_for_value(
|
|
56
|
+
self._drv.armed_for_triggers,
|
|
57
|
+
True,
|
|
58
|
+
timeout=DEFAULT_TIMEOUT,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
return idle_status
|
|
49
62
|
|
|
50
63
|
@classmethod
|
|
51
64
|
def _get_trigger_mode(cls, trigger: DetectorTrigger) -> PilatusTriggerMode:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from enum import Enum
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
|
|
3
|
+
from ...signal import epics_signal_r, epics_signal_rw_rbv
|
|
5
4
|
from .ad_base import ADBase
|
|
6
5
|
|
|
7
6
|
|
|
@@ -18,4 +17,5 @@ class PilatusDriver(ADBase):
|
|
|
18
17
|
self.trigger_mode = epics_signal_rw_rbv(
|
|
19
18
|
PilatusTriggerMode, prefix + "TriggerMode"
|
|
20
19
|
)
|
|
20
|
+
self.armed_for_triggers = epics_signal_r(bool, prefix + "Armed")
|
|
21
21
|
super().__init__(prefix, name)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
1
3
|
from bluesky.protocols import Hints
|
|
2
4
|
|
|
3
5
|
from ophyd_async.core import DirectoryProvider
|
|
@@ -11,6 +13,20 @@ from ophyd_async.epics.areadetector.writers.hdf_writer import HDFWriter
|
|
|
11
13
|
from ophyd_async.epics.areadetector.writers.nd_file_hdf import NDFileHDF
|
|
12
14
|
|
|
13
15
|
|
|
16
|
+
#: Cite: https://media.dectris.com/User_Manual-PILATUS2-V1_4.pdf
|
|
17
|
+
#: The required minimum time difference between ExpPeriod and ExpTime
|
|
18
|
+
#: (readout time) is 2.28 ms
|
|
19
|
+
#: We provide an option to override for newer Pilatus models
|
|
20
|
+
class PilatusReadoutTime(float, Enum):
|
|
21
|
+
"""Pilatus readout time per model in ms"""
|
|
22
|
+
|
|
23
|
+
# Cite: https://media.dectris.com/User_Manual-PILATUS2-V1_4.pdf
|
|
24
|
+
pilatus2 = 2.28e-3
|
|
25
|
+
|
|
26
|
+
# Cite: https://media.dectris.com/user-manual-pilatus3-2020.pdf
|
|
27
|
+
pilatus3 = 0.95e-3
|
|
28
|
+
|
|
29
|
+
|
|
14
30
|
class PilatusDetector(StandardDetector):
|
|
15
31
|
"""A Pilatus StandardDetector writing HDF files"""
|
|
16
32
|
|
|
@@ -21,15 +37,16 @@ class PilatusDetector(StandardDetector):
|
|
|
21
37
|
self,
|
|
22
38
|
prefix: str,
|
|
23
39
|
directory_provider: DirectoryProvider,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
40
|
+
readout_time: PilatusReadoutTime = PilatusReadoutTime.pilatus3,
|
|
41
|
+
drv_suffix: str = "cam1:",
|
|
42
|
+
hdf_suffix: str = "HDF1:",
|
|
43
|
+
name: str = "",
|
|
27
44
|
):
|
|
28
45
|
self.drv = PilatusDriver(prefix + drv_suffix)
|
|
29
46
|
self.hdf = NDFileHDF(prefix + hdf_suffix)
|
|
30
47
|
|
|
31
48
|
super().__init__(
|
|
32
|
-
PilatusController(self.drv),
|
|
49
|
+
PilatusController(self.drv, readout_time=readout_time.value),
|
|
33
50
|
HDFWriter(
|
|
34
51
|
self.hdf,
|
|
35
52
|
directory_provider,
|
ophyd_async/panda/_hdf_panda.py
CHANGED
ophyd_async/plan_stubs/fly.py
CHANGED
|
@@ -18,6 +18,7 @@ def prepare_static_seq_table_flyer_and_detectors_with_same_trigger(
|
|
|
18
18
|
shutter_time: float,
|
|
19
19
|
repeats: int = 1,
|
|
20
20
|
period: float = 0.0,
|
|
21
|
+
frame_timeout: float | None = None,
|
|
21
22
|
):
|
|
22
23
|
"""Prepare a hardware triggered flyable and one or more detectors.
|
|
23
24
|
|
|
@@ -39,6 +40,7 @@ def prepare_static_seq_table_flyer_and_detectors_with_same_trigger(
|
|
|
39
40
|
trigger=DetectorTrigger.constant_gate,
|
|
40
41
|
deadtime=deadtime,
|
|
41
42
|
livetime=exposure,
|
|
43
|
+
frame_timeout=frame_timeout,
|
|
42
44
|
)
|
|
43
45
|
trigger_time = number_of_frames * (exposure + deadtime)
|
|
44
46
|
pre_delay = max(period - 2 * shutter_time - trigger_time, 0)
|
|
@@ -120,6 +122,7 @@ def time_resolved_fly_and_collect_with_static_seq_table(
|
|
|
120
122
|
shutter_time: float,
|
|
121
123
|
repeats: int = 1,
|
|
122
124
|
period: float = 0.0,
|
|
125
|
+
frame_timeout: float | None = None,
|
|
123
126
|
):
|
|
124
127
|
"""Run a scan wth a flyer and multiple detectors.
|
|
125
128
|
|
|
@@ -144,6 +147,7 @@ def time_resolved_fly_and_collect_with_static_seq_table(
|
|
|
144
147
|
shutter_time=shutter_time,
|
|
145
148
|
repeats=repeats,
|
|
146
149
|
period=period,
|
|
150
|
+
frame_timeout=frame_timeout,
|
|
147
151
|
)
|
|
148
152
|
# Run the fly scan
|
|
149
153
|
yield from fly_and_collect(stream_name, flyer, detectors)
|
|
@@ -16,7 +16,6 @@ class SimPatternDetector(StandardDetector):
|
|
|
16
16
|
path: Path,
|
|
17
17
|
config_sigs: Sequence[AsyncReadable] = [],
|
|
18
18
|
name: str = "sim_pattern_detector",
|
|
19
|
-
writer_timeout: float = 1,
|
|
20
19
|
) -> None:
|
|
21
20
|
self.directory_provider: DirectoryProvider = StaticDirectoryProvider(path)
|
|
22
21
|
self.pattern_generator = PatternGenerator()
|
|
@@ -33,5 +32,4 @@ class SimPatternDetector(StandardDetector):
|
|
|
33
32
|
writer=writer,
|
|
34
33
|
config_sigs=config_sigs,
|
|
35
34
|
name=name,
|
|
36
|
-
writer_timeout=writer_timeout,
|
|
37
35
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ophyd-async
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1a1
|
|
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
|
|
@@ -96,7 +96,7 @@ Requires-Dist: p4p ; extra == 'pva'
|
|
|
96
96
|
|
|
97
97
|
# ophyd-async
|
|
98
98
|
|
|
99
|
-
Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango
|
|
99
|
+
Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango.
|
|
100
100
|
|
|
101
101
|
| Source | <https://github.com/bluesky/ophyd-async> |
|
|
102
102
|
| :-----------: | :-----------------------------------------------: |
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
ophyd_async/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
|
|
2
2
|
ophyd_async/__main__.py,sha256=G-Zcv_G9zK7Nhx6o5L5w-wyhMxdl_WgyMELu8IMFqAE,328
|
|
3
|
-
ophyd_async/_version.py,sha256=
|
|
3
|
+
ophyd_async/_version.py,sha256=39a0mpBwpK0E4r9y1sT8m6uZMtoy7wbaTItax3Zomyc,413
|
|
4
4
|
ophyd_async/log.py,sha256=DbMjt0bkfUOLHIinZYt0Q0FHZmCXXi5x8y0uFiEmqoQ,3587
|
|
5
5
|
ophyd_async/protocols.py,sha256=EF2W9nfElV-0QNMYrX1zusL1PqDJR3kNsjlalR29j0I,3412
|
|
6
|
-
ophyd_async/core/__init__.py,sha256=
|
|
6
|
+
ophyd_async/core/__init__.py,sha256=znjVeRfrDVJbGLEkUczeKMW46kV6HDrlE4lV0SqvZt4,2952
|
|
7
7
|
ophyd_async/core/_providers.py,sha256=LrlTMPHKXWOPVkpAOw-pqBq0kip-c3C9ZZPoFfiaV4M,2212
|
|
8
8
|
ophyd_async/core/async_status.py,sha256=9TOgOXIAuH62RDo5t-Y5GdjrJ76d_6TFlBxYv-5_a88,4367
|
|
9
|
-
ophyd_async/core/detector.py,sha256=
|
|
9
|
+
ophyd_async/core/detector.py,sha256=NMX8y_yiViHbv3CaJ7LxzXYkH6tCWI3LocpQ3w4lGEQ,11176
|
|
10
10
|
ophyd_async/core/device.py,sha256=280zFnLCoiMZAA-Dh1_AjUSnhxUfKYGgj4H_2S1njOA,7086
|
|
11
11
|
ophyd_async/core/device_save_loader.py,sha256=RXA3dPUPihAR2ZGDStlGiA-TAsr_xqL0snsCjMsMnfA,9138
|
|
12
12
|
ophyd_async/core/flyer.py,sha256=bIjzBkrl8HVAlKgsZ_FF0WL69Qvksyzp9ZWmTLl8Yrw,2304
|
|
13
|
-
ophyd_async/core/mock_signal_backend.py,sha256=
|
|
14
|
-
ophyd_async/core/mock_signal_utils.py,sha256=
|
|
13
|
+
ophyd_async/core/mock_signal_backend.py,sha256=Ug6jK72wm9vM6EueoUrYgcXtiFzdPUEISRe86LdyYKc,2844
|
|
14
|
+
ophyd_async/core/mock_signal_utils.py,sha256=LE8VxNq3jfaTePnHHpZpKCi1vwKi8EIg-g1jfw-Q5bQ,4726
|
|
15
15
|
ophyd_async/core/signal.py,sha256=FbTb5qDPLhVxEbh6gimqXfkZwcqB4ymHTEYVXZVZYrk,16456
|
|
16
|
-
ophyd_async/core/signal_backend.py,sha256=
|
|
16
|
+
ophyd_async/core/signal_backend.py,sha256=fT3q0WED3JHmNKYCs7PzDLCK4cUPVin3wQjDNPdHqAY,1525
|
|
17
17
|
ophyd_async/core/soft_signal_backend.py,sha256=56zvcEi4c8n1yYbafTbp7X0VhSkhoehm3L8RBhu2fik,5596
|
|
18
|
-
ophyd_async/core/standard_readable.py,sha256=
|
|
18
|
+
ophyd_async/core/standard_readable.py,sha256=fhq_WAZtLYWrw6DvvrFRYRAPOUP2_IcX4qLucoEEeOg,9049
|
|
19
19
|
ophyd_async/core/utils.py,sha256=3oZcXNqAUHX4ZWMBH5gSuK6cFWEhSkZ9GSDYv0pf8jc,5783
|
|
20
20
|
ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
21
|
ophyd_async/epics/_backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -25,7 +25,7 @@ ophyd_async/epics/_backend/common.py,sha256=16mAuxDwA3eZFjUW8DHMabaW3CtEI0Qe8DLp
|
|
|
25
25
|
ophyd_async/epics/areadetector/__init__.py,sha256=ViKzx-wUxkRyNR33wfpL11QB97o0J47_KMyI2C_NphI,510
|
|
26
26
|
ophyd_async/epics/areadetector/aravis.py,sha256=YklN4V0loqUQBs4swVX304N49JIGPvrNOk8iA5EWofg,2127
|
|
27
27
|
ophyd_async/epics/areadetector/kinetix.py,sha256=7rE2MLnz9DEmeiN9pCekDfpXuZ2DErnMajRp_9eoLZY,1359
|
|
28
|
-
ophyd_async/epics/areadetector/pilatus.py,sha256=
|
|
28
|
+
ophyd_async/epics/areadetector/pilatus.py,sha256=hs3v8QUIwTHNg7i1mRSg9SbIIsoUZg90OxJ740gEKpo,2044
|
|
29
29
|
ophyd_async/epics/areadetector/single_trigger_det.py,sha256=U92dqhioIfnve3jtCThq9gXBCdEzzqzY4ezk6rZV19g,1182
|
|
30
30
|
ophyd_async/epics/areadetector/utils.py,sha256=p66UbVdKRFj6Sm1Qvm23kmlVyBMMqIvXFxA3x17YnSk,2824
|
|
31
31
|
ophyd_async/epics/areadetector/vimba.py,sha256=IxG8KLzfb84iLtzf6ZoX9JikqZLP49lwkWu33bkDV9Y,1291
|
|
@@ -33,13 +33,13 @@ ophyd_async/epics/areadetector/controllers/__init__.py,sha256=af58ci7X2z2s_FyUwR
|
|
|
33
33
|
ophyd_async/epics/areadetector/controllers/ad_sim_controller.py,sha256=mthZ6WxajMEgUKptq3bnkIctbLhjzTagV66i1auB8cg,1587
|
|
34
34
|
ophyd_async/epics/areadetector/controllers/aravis_controller.py,sha256=CIfnZdq_NobO_UMC2TJoAfUEP9GlzZg5z5bz6Dn1DxY,2669
|
|
35
35
|
ophyd_async/epics/areadetector/controllers/kinetix_controller.py,sha256=9QmydX85QOXfQL_UX49M9EQ2b2hUZPVzLxgGQn-A9Oc,1611
|
|
36
|
-
ophyd_async/epics/areadetector/controllers/pilatus_controller.py,sha256=
|
|
36
|
+
ophyd_async/epics/areadetector/controllers/pilatus_controller.py,sha256=jJdY97JATz-bWtEPtmnyQ-Zyjvhy2M78i0wUuXO2dtE,2617
|
|
37
37
|
ophyd_async/epics/areadetector/controllers/vimba_controller.py,sha256=Eh4Hr9rWgq1mKvE93JzgixntjPHxF3_07GTFqiOdZqE,2123
|
|
38
38
|
ophyd_async/epics/areadetector/drivers/__init__.py,sha256=-Ib0Lz4fFQQmB7K0uFxMDvAerkLxadMQERH7lNAvrs4,495
|
|
39
39
|
ophyd_async/epics/areadetector/drivers/ad_base.py,sha256=18WFAiWEUg0H2LcvTQHrKYj2wThGafQzDpiyAWki6vo,3411
|
|
40
40
|
ophyd_async/epics/areadetector/drivers/aravis_driver.py,sha256=PmIygsVNoxxYHvZZzFAbAm2DXmXFc13nAzL_DJB6YSU,1464
|
|
41
41
|
ophyd_async/epics/areadetector/drivers/kinetix_driver.py,sha256=yIV23BkGBJ4i0VskLiLL7AFbadCCR6Ch1UwUDJ9r2YM,743
|
|
42
|
-
ophyd_async/epics/areadetector/drivers/pilatus_driver.py,sha256=
|
|
42
|
+
ophyd_async/epics/areadetector/drivers/pilatus_driver.py,sha256=0DBBuiR_FtwzVVdDW0ifdSrdKZtnprWuy87g66o8RlQ,619
|
|
43
43
|
ophyd_async/epics/areadetector/drivers/vimba_driver.py,sha256=J54VtWkOklfbSqZYxGWH1e6Uzm9_Gph_ZbCf9Zax0LU,1713
|
|
44
44
|
ophyd_async/epics/areadetector/writers/__init__.py,sha256=tpPcrYd1hs8WS7C0gmCnR2EBwjE5RzCljI7WwZ2V_LM,191
|
|
45
45
|
ophyd_async/epics/areadetector/writers/_hdfdataset.py,sha256=E0C9VgsPyY35h7k0mvcIhjsIVNavApLxizqNWlM388w,167
|
|
@@ -60,7 +60,7 @@ ophyd_async/epics/signal/_epics_transport.py,sha256=DEIL0iYUAWssysVEgWGu1fHSM1l-
|
|
|
60
60
|
ophyd_async/epics/signal/signal.py,sha256=M8ZVG_zLdYJfroCRX-u_w8c3yIhswSRw8e3RkW2szio,3166
|
|
61
61
|
ophyd_async/panda/__init__.py,sha256=FuSnvp-RtdA0X4RcHEF0nTiXymRts2MNdFmF_1_i41w,775
|
|
62
62
|
ophyd_async/panda/_common_blocks.py,sha256=n0PPc1rar43oDSIA-yNubTc8fR5YCW1tyjQU58whsg0,1038
|
|
63
|
-
ophyd_async/panda/_hdf_panda.py,sha256=
|
|
63
|
+
ophyd_async/panda/_hdf_panda.py,sha256=TWzBnyJcLmltQyOr5nXbCAZdVRqY633ogBX6pY06p3g,1375
|
|
64
64
|
ophyd_async/panda/_panda_controller.py,sha256=dIqcjmaIHVrki8UXSoDx46kk6I2Lhpe2o3sXNg5f-RQ,1238
|
|
65
65
|
ophyd_async/panda/_table.py,sha256=dLoRP4zYNOkD_s0Vkp2wVYAwkjVG8nNdf8-FaXOTfPo,5655
|
|
66
66
|
ophyd_async/panda/_trigger.py,sha256=tBH8uq_4o1ASG9yofVxq3tjf5v8LPzniDTRL4yjramI,1195
|
|
@@ -70,17 +70,17 @@ ophyd_async/panda/writers/_hdf_writer.py,sha256=vnyIg3JmlzMIIq75o0IDMfGzBm_GJAhO
|
|
|
70
70
|
ophyd_async/panda/writers/_panda_hdf_file.py,sha256=42iHaTax4JjOBpNC7d4nkNL9SM14OTnFPTIcXv2jg-4,1759
|
|
71
71
|
ophyd_async/plan_stubs/__init__.py,sha256=nO9ELG9J7fYwfVTVRWVorz4kffeszYpwk1ROh6Ha--w,405
|
|
72
72
|
ophyd_async/plan_stubs/ensure_connected.py,sha256=1MkDu8UqVRPHLnW9IXRn-QvKiG8-rCV8T4KDbjf9K6w,557
|
|
73
|
-
ophyd_async/plan_stubs/fly.py,sha256=
|
|
73
|
+
ophyd_async/plan_stubs/fly.py,sha256=fQwBeLw57-NeBsroVxKDa8kpuu6fgTWYWimbsatCL28,4999
|
|
74
74
|
ophyd_async/sim/__init__.py,sha256=ScjH1g7FMo5yPACfJRZE6xGBWCHU4bKDzNQk1tqObnA,366
|
|
75
75
|
ophyd_async/sim/pattern_generator.py,sha256=pvSk2zb82D08j2jiKAMqMAfRohGnYd_rpjUraLrCD6c,10640
|
|
76
76
|
ophyd_async/sim/sim_pattern_detector_control.py,sha256=Ypz8IuRYAY2J243IhVbNyGr_Z-XtpJZ1qxma6NR3TgM,1838
|
|
77
77
|
ophyd_async/sim/sim_pattern_detector_writer.py,sha256=ESpcVyHd1TP7Cojznv2hJAwLinu3XbgAiVKfX12FCII,1237
|
|
78
|
-
ophyd_async/sim/sim_pattern_generator.py,sha256=
|
|
78
|
+
ophyd_async/sim/sim_pattern_generator.py,sha256=L4jTnEVUFBRXIWq_UMHqx00YDdbGO2pjo_IuuVwpzXE,1258
|
|
79
79
|
ophyd_async/sim/demo/__init__.py,sha256=9mxKpslrL89cfSj4g3og8Br3O--pMj3hhWZS-Xu6kyA,56
|
|
80
80
|
ophyd_async/sim/demo/sim_motor.py,sha256=a2p5wnHXjF-V5zOFai7jnszk4kbGmrZRnUqBtkOgEfQ,3733
|
|
81
|
-
ophyd_async-0.
|
|
82
|
-
ophyd_async-0.
|
|
83
|
-
ophyd_async-0.
|
|
84
|
-
ophyd_async-0.
|
|
85
|
-
ophyd_async-0.
|
|
86
|
-
ophyd_async-0.
|
|
81
|
+
ophyd_async-0.3.1a1.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
|
|
82
|
+
ophyd_async-0.3.1a1.dist-info/METADATA,sha256=UzvVcuHH--IPgAEy0SCsfaBBUXHs6QcDJkzuw4l3eDs,6287
|
|
83
|
+
ophyd_async-0.3.1a1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
84
|
+
ophyd_async-0.3.1a1.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
|
|
85
|
+
ophyd_async-0.3.1a1.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
|
|
86
|
+
ophyd_async-0.3.1a1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|