ophyd-async 0.3.2__py3-none-any.whl → 0.3.3__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 +47 -44
- ophyd_async/core/signal_backend.py +47 -1
- ophyd_async/core/soft_signal_backend.py +29 -12
- ophyd_async/epics/_backend/common.py +24 -10
- ophyd_async/epics/areadetector/controllers/pilatus_controller.py +4 -1
- ophyd_async/epics/areadetector/drivers/__init__.py +2 -0
- ophyd_async/epics/areadetector/drivers/ad_base.py +32 -0
- ophyd_async/epics/motion/motor.py +0 -2
- {ophyd_async-0.3.2.dist-info → ophyd_async-0.3.3.dist-info}/METADATA +1 -1
- {ophyd_async-0.3.2.dist-info → ophyd_async-0.3.3.dist-info}/RECORD +15 -15
- {ophyd_async-0.3.2.dist-info → ophyd_async-0.3.3.dist-info}/WHEEL +1 -1
- {ophyd_async-0.3.2.dist-info → ophyd_async-0.3.3.dist-info}/LICENSE +0 -0
- {ophyd_async-0.3.2.dist-info → ophyd_async-0.3.3.dist-info}/entry_points.txt +0 -0
- {ophyd_async-0.3.2.dist-info → ophyd_async-0.3.3.dist-info}/top_level.txt +0 -0
ophyd_async/_version.py
CHANGED
ophyd_async/core/__init__.py
CHANGED
|
@@ -50,7 +50,7 @@ from .signal import (
|
|
|
50
50
|
soft_signal_rw,
|
|
51
51
|
wait_for_value,
|
|
52
52
|
)
|
|
53
|
-
from .signal_backend import SignalBackend
|
|
53
|
+
from .signal_backend import RuntimeSubsetEnum, SignalBackend, SubsetEnum
|
|
54
54
|
from .soft_signal_backend import SoftSignalBackend
|
|
55
55
|
from .standard_readable import ConfigSignal, HintedSignal, StandardReadable
|
|
56
56
|
from .utils import (
|
|
@@ -68,66 +68,69 @@ from .utils import (
|
|
|
68
68
|
)
|
|
69
69
|
|
|
70
70
|
__all__ = [
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"SoftSignalBackend",
|
|
71
|
+
"AsyncStatus",
|
|
72
|
+
"CalculatableTimeout",
|
|
73
|
+
"CalculateTimeout",
|
|
74
|
+
"Callback",
|
|
75
|
+
"ConfigSignal",
|
|
76
|
+
"DEFAULT_TIMEOUT",
|
|
78
77
|
"DetectorControl",
|
|
79
|
-
"MockSignalBackend",
|
|
80
78
|
"DetectorTrigger",
|
|
81
79
|
"DetectorWriter",
|
|
82
|
-
"StandardDetector",
|
|
83
80
|
"Device",
|
|
84
81
|
"DeviceCollector",
|
|
85
82
|
"DeviceVector",
|
|
86
|
-
"Signal",
|
|
87
|
-
"SignalR",
|
|
88
|
-
"SignalW",
|
|
89
|
-
"SignalRW",
|
|
90
|
-
"SignalX",
|
|
91
|
-
"soft_signal_r_and_setter",
|
|
92
|
-
"soft_signal_rw",
|
|
93
|
-
"observe_value",
|
|
94
|
-
"set_and_wait_for_value",
|
|
95
|
-
"set_mock_put_proceeds",
|
|
96
|
-
"set_mock_value",
|
|
97
|
-
"wait_for_value",
|
|
98
|
-
"AsyncStatus",
|
|
99
|
-
"WatchableAsyncStatus",
|
|
100
83
|
"DirectoryInfo",
|
|
101
84
|
"DirectoryProvider",
|
|
85
|
+
"HardwareTriggeredFlyable",
|
|
86
|
+
"HintedSignal",
|
|
87
|
+
"MockSignalBackend",
|
|
102
88
|
"NameProvider",
|
|
89
|
+
"NotConnected",
|
|
90
|
+
"ReadingValueCallback",
|
|
91
|
+
"RuntimeSubsetEnum",
|
|
92
|
+
"SubsetEnum",
|
|
103
93
|
"ShapeProvider",
|
|
104
|
-
"
|
|
94
|
+
"Signal",
|
|
95
|
+
"SignalBackend",
|
|
96
|
+
"SignalR",
|
|
97
|
+
"SignalRW",
|
|
98
|
+
"SignalW",
|
|
99
|
+
"SignalX",
|
|
100
|
+
"SoftSignalBackend",
|
|
101
|
+
"StandardDetector",
|
|
105
102
|
"StandardReadable",
|
|
106
|
-
"
|
|
107
|
-
"
|
|
103
|
+
"StaticDirectoryProvider",
|
|
104
|
+
"T",
|
|
108
105
|
"TriggerInfo",
|
|
109
106
|
"TriggerLogic",
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"T",
|
|
107
|
+
"WatchableAsyncStatus",
|
|
108
|
+
"assert_configuration",
|
|
109
|
+
"assert_emitted",
|
|
110
|
+
"assert_mock_put_called_with",
|
|
111
|
+
"assert_reading",
|
|
112
|
+
"assert_value",
|
|
113
|
+
"callback_on_mock_put",
|
|
118
114
|
"get_dtype",
|
|
119
|
-
"
|
|
120
|
-
"merge_gathered_dicts",
|
|
121
|
-
"wait_for_connection",
|
|
115
|
+
"get_mock_put",
|
|
122
116
|
"get_signal_values",
|
|
117
|
+
"get_unique",
|
|
118
|
+
"load_device",
|
|
123
119
|
"load_from_yaml",
|
|
120
|
+
"merge_gathered_dicts",
|
|
121
|
+
"mock_puts_blocked",
|
|
122
|
+
"observe_value",
|
|
123
|
+
"reset_mock_put_calls",
|
|
124
|
+
"save_device",
|
|
124
125
|
"save_to_yaml",
|
|
126
|
+
"set_and_wait_for_value",
|
|
127
|
+
"set_mock_put_proceeds",
|
|
128
|
+
"set_mock_value",
|
|
129
|
+
"set_mock_values",
|
|
125
130
|
"set_signal_values",
|
|
131
|
+
"soft_signal_r_and_setter",
|
|
132
|
+
"soft_signal_rw",
|
|
133
|
+
"wait_for_connection",
|
|
134
|
+
"wait_for_value",
|
|
126
135
|
"walk_rw_signals",
|
|
127
|
-
"load_device",
|
|
128
|
-
"save_device",
|
|
129
|
-
"assert_reading",
|
|
130
|
-
"assert_value",
|
|
131
|
-
"assert_configuration",
|
|
132
|
-
"assert_emitted",
|
|
133
136
|
]
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
from abc import abstractmethod
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import (
|
|
3
|
+
TYPE_CHECKING,
|
|
4
|
+
ClassVar,
|
|
5
|
+
Generic,
|
|
6
|
+
Literal,
|
|
7
|
+
Optional,
|
|
8
|
+
Tuple,
|
|
9
|
+
Type,
|
|
10
|
+
)
|
|
3
11
|
|
|
4
12
|
from bluesky.protocols import DataKey, Reading
|
|
5
13
|
|
|
@@ -45,3 +53,41 @@ class SignalBackend(Generic[T]):
|
|
|
45
53
|
@abstractmethod
|
|
46
54
|
def set_callback(self, callback: Optional[ReadingValueCallback[T]]) -> None:
|
|
47
55
|
"""Observe changes to the current value, timestamp and severity"""
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class _RuntimeSubsetEnumMeta(type):
|
|
59
|
+
def __str__(cls):
|
|
60
|
+
if hasattr(cls, "choices"):
|
|
61
|
+
return f"SubsetEnum{list(cls.choices)}"
|
|
62
|
+
return "SubsetEnum"
|
|
63
|
+
|
|
64
|
+
def __getitem__(cls, _choices):
|
|
65
|
+
if isinstance(_choices, str):
|
|
66
|
+
_choices = (_choices,)
|
|
67
|
+
else:
|
|
68
|
+
if not isinstance(_choices, tuple) or not all(
|
|
69
|
+
isinstance(c, str) for c in _choices
|
|
70
|
+
):
|
|
71
|
+
raise TypeError(
|
|
72
|
+
"Choices must be a str or a tuple of str, " f"not {type(_choices)}."
|
|
73
|
+
)
|
|
74
|
+
if len(set(_choices)) != len(_choices):
|
|
75
|
+
raise TypeError("Duplicate elements in runtime enum choices.")
|
|
76
|
+
|
|
77
|
+
class _RuntimeSubsetEnum(cls):
|
|
78
|
+
choices = _choices
|
|
79
|
+
|
|
80
|
+
return _RuntimeSubsetEnum
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class RuntimeSubsetEnum(metaclass=_RuntimeSubsetEnumMeta):
|
|
84
|
+
choices: ClassVar[Tuple[str, ...]]
|
|
85
|
+
|
|
86
|
+
def __init__(self):
|
|
87
|
+
raise RuntimeError("SubsetEnum cannot be instantiated")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if TYPE_CHECKING:
|
|
91
|
+
SubsetEnum = Literal
|
|
92
|
+
else:
|
|
93
|
+
SubsetEnum = RuntimeSubsetEnum
|
|
@@ -3,14 +3,23 @@ from __future__ import annotations
|
|
|
3
3
|
import inspect
|
|
4
4
|
import time
|
|
5
5
|
from collections import abc
|
|
6
|
-
from dataclasses import dataclass
|
|
7
6
|
from enum import Enum
|
|
8
|
-
from typing import
|
|
7
|
+
from typing import (
|
|
8
|
+
Dict,
|
|
9
|
+
Generic,
|
|
10
|
+
Optional,
|
|
11
|
+
Tuple,
|
|
12
|
+
Type,
|
|
13
|
+
TypedDict,
|
|
14
|
+
Union,
|
|
15
|
+
cast,
|
|
16
|
+
get_origin,
|
|
17
|
+
)
|
|
9
18
|
|
|
10
19
|
import numpy as np
|
|
11
20
|
from bluesky.protocols import DataKey, Dtype, Reading
|
|
12
21
|
|
|
13
|
-
from .signal_backend import SignalBackend
|
|
22
|
+
from .signal_backend import RuntimeSubsetEnum, SignalBackend
|
|
14
23
|
from .utils import DEFAULT_TIMEOUT, ReadingValueCallback, T, get_dtype
|
|
15
24
|
|
|
16
25
|
primitive_dtypes: Dict[type, Dtype] = {
|
|
@@ -74,23 +83,27 @@ class SoftArrayConverter(SoftConverter):
|
|
|
74
83
|
return cast(T, datatype(shape=0)) # type: ignore
|
|
75
84
|
|
|
76
85
|
|
|
77
|
-
@dataclass
|
|
78
86
|
class SoftEnumConverter(SoftConverter):
|
|
79
|
-
|
|
87
|
+
choices: Tuple[str, ...]
|
|
80
88
|
|
|
81
|
-
def
|
|
89
|
+
def __init__(self, datatype: Union[RuntimeSubsetEnum, Enum]):
|
|
90
|
+
if issubclass(datatype, Enum):
|
|
91
|
+
self.choices = tuple(v.value for v in datatype)
|
|
92
|
+
else:
|
|
93
|
+
self.choices = datatype.choices
|
|
94
|
+
|
|
95
|
+
def write_value(self, value: Union[Enum, str]) -> str:
|
|
82
96
|
if isinstance(value, Enum):
|
|
97
|
+
return value.value
|
|
98
|
+
else: # Runtime enum
|
|
83
99
|
return value
|
|
84
|
-
else:
|
|
85
|
-
return self.enum_class(value)
|
|
86
100
|
|
|
87
101
|
def get_datakey(self, source: str, value, **metadata) -> DataKey:
|
|
88
|
-
choices = [e.value for e in self.enum_class]
|
|
89
102
|
return {
|
|
90
103
|
"source": source,
|
|
91
104
|
"dtype": "string",
|
|
92
105
|
"shape": [],
|
|
93
|
-
"choices": choices,
|
|
106
|
+
"choices": self.choices,
|
|
94
107
|
**metadata,
|
|
95
108
|
}
|
|
96
109
|
|
|
@@ -98,13 +111,17 @@ class SoftEnumConverter(SoftConverter):
|
|
|
98
111
|
if datatype is None:
|
|
99
112
|
return cast(T, None)
|
|
100
113
|
|
|
101
|
-
|
|
114
|
+
if issubclass(datatype, Enum):
|
|
115
|
+
return cast(T, list(datatype.__members__.values())[0]) # type: ignore
|
|
116
|
+
return cast(T, self.choices[0])
|
|
102
117
|
|
|
103
118
|
|
|
104
119
|
def make_converter(datatype):
|
|
105
120
|
is_array = get_dtype(datatype) is not None
|
|
106
121
|
is_sequence = get_origin(datatype) == abc.Sequence
|
|
107
|
-
is_enum =
|
|
122
|
+
is_enum = inspect.isclass(datatype) and (
|
|
123
|
+
issubclass(datatype, Enum) or issubclass(datatype, RuntimeSubsetEnum)
|
|
124
|
+
)
|
|
108
125
|
|
|
109
126
|
if is_array or is_sequence:
|
|
110
127
|
return SoftArrayConverter()
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import inspect
|
|
1
2
|
from enum import Enum
|
|
2
3
|
from typing import Dict, Optional, Tuple, Type, TypedDict
|
|
3
4
|
|
|
5
|
+
from ophyd_async.core.signal_backend import RuntimeSubsetEnum
|
|
6
|
+
|
|
4
7
|
common_meta = {
|
|
5
8
|
"units",
|
|
6
9
|
"precision",
|
|
@@ -30,19 +33,30 @@ def get_supported_values(
|
|
|
30
33
|
datatype: Optional[Type[str]],
|
|
31
34
|
pv_choices: Tuple[str, ...],
|
|
32
35
|
) -> Dict[str, str]:
|
|
33
|
-
if
|
|
36
|
+
if inspect.isclass(datatype) and issubclass(datatype, RuntimeSubsetEnum):
|
|
37
|
+
if not set(datatype.choices).issubset(set(pv_choices)):
|
|
38
|
+
raise TypeError(
|
|
39
|
+
f"{pv} has choices {pv_choices}, "
|
|
40
|
+
f"which is not a superset of {str(datatype)}."
|
|
41
|
+
)
|
|
34
42
|
return {x: x or "_" for x in pv_choices}
|
|
43
|
+
elif inspect.isclass(datatype) and issubclass(datatype, Enum):
|
|
44
|
+
if not issubclass(datatype, str):
|
|
45
|
+
raise TypeError(
|
|
46
|
+
f"{pv} is type Enum but {datatype} does not inherit from String."
|
|
47
|
+
)
|
|
35
48
|
|
|
36
|
-
if not issubclass(datatype, str):
|
|
37
|
-
raise TypeError(f"{pv} is type Enum but doesn't inherit from String")
|
|
38
|
-
if issubclass(datatype, Enum):
|
|
39
49
|
choices = tuple(v.value for v in datatype)
|
|
40
50
|
if set(choices) != set(pv_choices):
|
|
41
51
|
raise TypeError(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
f"which do not match {datatype}, which has {choices}"
|
|
45
|
-
)
|
|
52
|
+
f"{pv} has choices {pv_choices}, "
|
|
53
|
+
f"which do not match {datatype}, which has {choices}."
|
|
46
54
|
)
|
|
47
|
-
return {x: datatype(x) for x in pv_choices}
|
|
48
|
-
|
|
55
|
+
return {x: datatype(x) if x else "_" for x in pv_choices}
|
|
56
|
+
elif datatype is None:
|
|
57
|
+
return {x: x or "_" for x in pv_choices}
|
|
58
|
+
|
|
59
|
+
raise TypeError(
|
|
60
|
+
f"{pv} has choices {pv_choices}. "
|
|
61
|
+
"Use an Enum or SubsetEnum to represent this."
|
|
62
|
+
)
|
|
@@ -5,6 +5,7 @@ from ophyd_async.core import DEFAULT_TIMEOUT, wait_for_value
|
|
|
5
5
|
from ophyd_async.core.async_status import AsyncStatus
|
|
6
6
|
from ophyd_async.core.detector import DetectorControl, DetectorTrigger
|
|
7
7
|
from ophyd_async.epics.areadetector.drivers.ad_base import (
|
|
8
|
+
set_exposure_time_and_acquire_period_if_supplied,
|
|
8
9
|
start_acquiring_driver_and_ensure_status,
|
|
9
10
|
)
|
|
10
11
|
from ophyd_async.epics.areadetector.drivers.pilatus_driver import (
|
|
@@ -39,7 +40,9 @@ class PilatusController(DetectorControl):
|
|
|
39
40
|
exposure: Optional[float] = None,
|
|
40
41
|
) -> AsyncStatus:
|
|
41
42
|
if exposure is not None:
|
|
42
|
-
await
|
|
43
|
+
await set_exposure_time_and_acquire_period_if_supplied(
|
|
44
|
+
self, self._drv, exposure
|
|
45
|
+
)
|
|
43
46
|
await asyncio.gather(
|
|
44
47
|
self._drv.trigger_mode.set(self._get_trigger_mode(trigger)),
|
|
45
48
|
self._drv.num_images.set(999_999 if num == 0 else num),
|
|
@@ -2,6 +2,7 @@ from .ad_base import (
|
|
|
2
2
|
ADBase,
|
|
3
3
|
ADBaseShapeProvider,
|
|
4
4
|
DetectorState,
|
|
5
|
+
set_exposure_time_and_acquire_period_if_supplied,
|
|
5
6
|
start_acquiring_driver_and_ensure_status,
|
|
6
7
|
)
|
|
7
8
|
from .aravis_driver import AravisDriver
|
|
@@ -17,5 +18,6 @@ __all__ = [
|
|
|
17
18
|
"KinetixDriver",
|
|
18
19
|
"VimbaDriver",
|
|
19
20
|
"start_acquiring_driver_and_ensure_status",
|
|
21
|
+
"set_exposure_time_and_acquire_period_if_supplied",
|
|
20
22
|
"DetectorState",
|
|
21
23
|
]
|
|
@@ -5,6 +5,7 @@ from typing import FrozenSet, Sequence, Set
|
|
|
5
5
|
from ophyd_async.core import (
|
|
6
6
|
DEFAULT_TIMEOUT,
|
|
7
7
|
AsyncStatus,
|
|
8
|
+
DetectorControl,
|
|
8
9
|
ShapeProvider,
|
|
9
10
|
set_and_wait_for_value,
|
|
10
11
|
)
|
|
@@ -44,6 +45,7 @@ class ADBase(NDArrayBase):
|
|
|
44
45
|
def __init__(self, prefix: str, name: str = "") -> None:
|
|
45
46
|
# Define some signals
|
|
46
47
|
self.acquire_time = epics_signal_rw_rbv(float, prefix + "AcquireTime")
|
|
48
|
+
self.acquire_period = epics_signal_rw_rbv(float, prefix + "AcquirePeriod")
|
|
47
49
|
self.num_images = epics_signal_rw_rbv(int, prefix + "NumImages")
|
|
48
50
|
self.image_mode = epics_signal_rw_rbv(ImageMode, prefix + "ImageMode")
|
|
49
51
|
self.detector_state = epics_signal_r(
|
|
@@ -52,6 +54,36 @@ class ADBase(NDArrayBase):
|
|
|
52
54
|
super().__init__(prefix, name=name)
|
|
53
55
|
|
|
54
56
|
|
|
57
|
+
async def set_exposure_time_and_acquire_period_if_supplied(
|
|
58
|
+
controller: DetectorControl,
|
|
59
|
+
driver: ADBase,
|
|
60
|
+
exposure: float | None = None,
|
|
61
|
+
timeout: float = DEFAULT_TIMEOUT,
|
|
62
|
+
) -> None:
|
|
63
|
+
"""
|
|
64
|
+
Sets the exposure time if it is not None and the acquire period to the
|
|
65
|
+
exposure time plus the deadtime. This is expected behavior for most
|
|
66
|
+
AreaDetectors, but some may require more specialized handling.
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
controller:
|
|
71
|
+
Controller that can supply a deadtime.
|
|
72
|
+
driver:
|
|
73
|
+
The driver to start acquiring. Must subclass ADBase.
|
|
74
|
+
exposure:
|
|
75
|
+
Desired exposure time, this is a noop if it is None.
|
|
76
|
+
timeout:
|
|
77
|
+
How long to wait for the exposure time and acquire period to be set.
|
|
78
|
+
"""
|
|
79
|
+
if exposure is not None:
|
|
80
|
+
full_frame_time = exposure + controller.get_deadtime(exposure)
|
|
81
|
+
await asyncio.gather(
|
|
82
|
+
driver.acquire_time.set(exposure, timeout=timeout),
|
|
83
|
+
driver.acquire_period.set(full_frame_time, timeout=timeout),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
55
87
|
async def start_acquiring_driver_and_ensure_status(
|
|
56
88
|
driver: ADBase,
|
|
57
89
|
good_states: Set[DetectorState] = set(DEFAULT_GOOD_STATES),
|
|
@@ -95,5 +95,3 @@ class Motor(StandardReadable, Movable, Stoppable):
|
|
|
95
95
|
# Put with completion will never complete as we are waiting for completion on
|
|
96
96
|
# the move above, so need to pass wait=False
|
|
97
97
|
await self.motor_stop.trigger(wait=False)
|
|
98
|
-
# Trigger any callbacks
|
|
99
|
-
await self.user_readback._backend.put(await self.user_readback.get_value())
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ophyd-async
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
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
|
|
@@ -1,9 +1,9 @@
|
|
|
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=FKnJIExgNrZG2xJ0y_dGNBpxGbGBYylvfat-jHhLUuM,411
|
|
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=xqO9riU_uKqGAOi0ty0cbcI4Oawi_J3XTYLtwNSXGOE,3061
|
|
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
9
|
ophyd_async/core/detector.py,sha256=NMX8y_yiViHbv3CaJ7LxzXYkH6tCWI3LocpQ3w4lGEQ,11176
|
|
@@ -13,15 +13,15 @@ ophyd_async/core/flyer.py,sha256=bIjzBkrl8HVAlKgsZ_FF0WL69Qvksyzp9ZWmTLl8Yrw,230
|
|
|
13
13
|
ophyd_async/core/mock_signal_backend.py,sha256=Ug6jK72wm9vM6EueoUrYgcXtiFzdPUEISRe86LdyYKc,2844
|
|
14
14
|
ophyd_async/core/mock_signal_utils.py,sha256=LE8VxNq3jfaTePnHHpZpKCi1vwKi8EIg-g1jfw-Q5bQ,4726
|
|
15
15
|
ophyd_async/core/signal.py,sha256=hPpMcdq7zx6HOkyQCJrMD5F3uLBEJJTfwL6DsbcTELo,17601
|
|
16
|
-
ophyd_async/core/signal_backend.py,sha256=
|
|
17
|
-
ophyd_async/core/soft_signal_backend.py,sha256=
|
|
16
|
+
ophyd_async/core/signal_backend.py,sha256=U9J6jzHXRNIrdtGiZBVxXTRtzeejXiXEEIOGRIQhiS8,2678
|
|
17
|
+
ophyd_async/core/soft_signal_backend.py,sha256=6ve1NWuEZFW4oFkAdSfTKFg06fv7rDLgr5IAEr_axeo,6262
|
|
18
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
|
|
22
22
|
ophyd_async/epics/_backend/_aioca.py,sha256=YsKHGaHtYjBte5Tz-AftTENaeV6UGRnonX-1UmAQGqg,11319
|
|
23
23
|
ophyd_async/epics/_backend/_p4p.py,sha256=oCT8MeVWlhmsxZ8YRSrelrY8W3NvfpXcMlfAKL_AUNY,14331
|
|
24
|
-
ophyd_async/epics/_backend/common.py,sha256=
|
|
24
|
+
ophyd_async/epics/_backend/common.py,sha256=ffdcKhtUc8Mmm0AsV0K7cUoOttF6avcN6Kdd4QHjrSw,1833
|
|
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
|
|
@@ -33,10 +33,10 @@ 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=6AiMz2yBA9xig-BrAIAc9CDxwM4Cjfebc4dd7QRutB0,2740
|
|
37
37
|
ophyd_async/epics/areadetector/controllers/vimba_controller.py,sha256=Eh4Hr9rWgq1mKvE93JzgixntjPHxF3_07GTFqiOdZqE,2123
|
|
38
|
-
ophyd_async/epics/areadetector/drivers/__init__.py,sha256
|
|
39
|
-
ophyd_async/epics/areadetector/drivers/ad_base.py,sha256=
|
|
38
|
+
ophyd_async/epics/areadetector/drivers/__init__.py,sha256=X-KdXw7YWNXpaUCXby2Spqvho2x2n72OavR-3mRlxzk,605
|
|
39
|
+
ophyd_async/epics/areadetector/drivers/ad_base.py,sha256=OMySyCE9dcFRcVLC5Q0wUkri3QtRljIbn4KFdkumI4M,4553
|
|
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
42
|
ophyd_async/epics/areadetector/drivers/pilatus_driver.py,sha256=0DBBuiR_FtwzVVdDW0ifdSrdKZtnprWuy87g66o8RlQ,619
|
|
@@ -52,7 +52,7 @@ ophyd_async/epics/demo/demo_ad_sim_detector.py,sha256=06y65yvaqXvL2rDocjYyLz9kTV
|
|
|
52
52
|
ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
|
|
53
53
|
ophyd_async/epics/demo/sensor.db,sha256=AVtiydrdtwAz2EFurO2Ult9SSRtre3r0akOBbL98LT0,554
|
|
54
54
|
ophyd_async/epics/motion/__init__.py,sha256=tnmVRIwKa9PdN_xonJdAUD04UpEceh-hoD7XI62yDB0,46
|
|
55
|
-
ophyd_async/epics/motion/motor.py,sha256=
|
|
55
|
+
ophyd_async/epics/motion/motor.py,sha256=tqLV4TaW2MIapZsmx4wxnGOdKfkhxKLUPbTHA4YLdYE,3514
|
|
56
56
|
ophyd_async/epics/pvi/__init__.py,sha256=TbOQNY4enQWgtr1T7x129vpo2p7FIFlr8cyZqqv5Lk4,158
|
|
57
57
|
ophyd_async/epics/pvi/pvi.py,sha256=Kc3klnA9F82h_p2atFYXe-wFO9OzN5TV69Tc56tD2do,12204
|
|
58
58
|
ophyd_async/epics/signal/__init__.py,sha256=JXKBSGpRL9y3auh27JRxsqDn_rBOXpJjtd4nCuDOX2g,261
|
|
@@ -78,9 +78,9 @@ ophyd_async/sim/sim_pattern_detector_writer.py,sha256=ESpcVyHd1TP7Cojznv2hJAwLin
|
|
|
78
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.3.
|
|
82
|
-
ophyd_async-0.3.
|
|
83
|
-
ophyd_async-0.3.
|
|
84
|
-
ophyd_async-0.3.
|
|
85
|
-
ophyd_async-0.3.
|
|
86
|
-
ophyd_async-0.3.
|
|
81
|
+
ophyd_async-0.3.3.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
|
|
82
|
+
ophyd_async-0.3.3.dist-info/METADATA,sha256=Qxc3xG70gcEsnobVJlfDQzmkW5Y-sEAagHCNtcr_Lwk,6292
|
|
83
|
+
ophyd_async-0.3.3.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
|
|
84
|
+
ophyd_async-0.3.3.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
|
|
85
|
+
ophyd_async-0.3.3.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
|
|
86
|
+
ophyd_async-0.3.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|