ophyd-async 0.3.2__py3-none-any.whl → 0.3.4__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 CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.3.2'
16
- __version_tuple__ = version_tuple = (0, 3, 2)
15
+ __version__ = version = '0.3.4'
16
+ __version_tuple__ = version_tuple = (0, 3, 4)
@@ -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
- "get_mock_put",
72
- "callback_on_mock_put",
73
- "mock_puts_blocked",
74
- "set_mock_values",
75
- "reset_mock_put_calls",
76
- "SignalBackend",
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
- "StaticDirectoryProvider",
94
+ "Signal",
95
+ "SignalBackend",
96
+ "SignalR",
97
+ "SignalRW",
98
+ "SignalW",
99
+ "SignalX",
100
+ "SoftSignalBackend",
101
+ "StandardDetector",
105
102
  "StandardReadable",
106
- "ConfigSignal",
107
- "HintedSignal",
103
+ "StaticDirectoryProvider",
104
+ "T",
108
105
  "TriggerInfo",
109
106
  "TriggerLogic",
110
- "HardwareTriggeredFlyable",
111
- "CalculateTimeout",
112
- "CalculatableTimeout",
113
- "DEFAULT_TIMEOUT",
114
- "Callback",
115
- "NotConnected",
116
- "ReadingValueCallback",
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
- "get_unique",
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 Generic, Optional, Type
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 Dict, Generic, Optional, Type, TypedDict, Union, cast, get_origin
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,24 @@ 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
- enum_class: Type[Enum]
87
+ choices: Tuple[str, ...]
80
88
 
81
- def write_value(self, value: Union[Enum, str]) -> Enum:
82
- if isinstance(value, Enum):
83
- return value
89
+ def __init__(self, datatype: Union[RuntimeSubsetEnum, Enum]):
90
+ if issubclass(datatype, Enum):
91
+ self.choices = tuple(v.value for v in datatype)
84
92
  else:
85
- return self.enum_class(value)
93
+ self.choices = datatype.choices
94
+
95
+ def write_value(self, value: Union[Enum, str]) -> str:
96
+ return value
86
97
 
87
98
  def get_datakey(self, source: str, value, **metadata) -> DataKey:
88
- choices = [e.value for e in self.enum_class]
89
99
  return {
90
100
  "source": source,
91
101
  "dtype": "string",
92
102
  "shape": [],
93
- "choices": choices,
103
+ "choices": self.choices,
94
104
  **metadata,
95
105
  }
96
106
 
@@ -98,13 +108,17 @@ class SoftEnumConverter(SoftConverter):
98
108
  if datatype is None:
99
109
  return cast(T, None)
100
110
 
101
- return cast(T, list(datatype.__members__.values())[0]) # type: ignore
111
+ if issubclass(datatype, Enum):
112
+ return cast(T, list(datatype.__members__.values())[0]) # type: ignore
113
+ return cast(T, self.choices[0])
102
114
 
103
115
 
104
116
  def make_converter(datatype):
105
117
  is_array = get_dtype(datatype) is not None
106
118
  is_sequence = get_origin(datatype) == abc.Sequence
107
- is_enum = issubclass(datatype, Enum) if inspect.isclass(datatype) else False
119
+ is_enum = inspect.isclass(datatype) and (
120
+ issubclass(datatype, Enum) or issubclass(datatype, RuntimeSubsetEnum)
121
+ )
108
122
 
109
123
  if is_array or is_sequence:
110
124
  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 not datatype:
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
- f"{pv} has choices {pv_choices}, "
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
- return {x: x for x in pv_choices}
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 self._drv.acquire_time.set(exposure)
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),
@@ -1,6 +1,6 @@
1
1
  from enum import Enum
2
- from typing import Literal
3
2
 
3
+ from ophyd_async.core import SubsetEnum
4
4
  from ophyd_async.epics.areadetector.drivers import ADBase
5
5
  from ophyd_async.epics.signal.signal import epics_signal_rw_rbv
6
6
 
@@ -19,7 +19,7 @@ class AravisTriggerMode(str, Enum):
19
19
  To prevent requiring one Enum class per possible configuration, we set as this Enum
20
20
  but read from the underlying signal as a str.
21
21
  """
22
- AravisTriggerSource = Literal["Freerun", "Line1", "Line2", "Line3", "Line4"]
22
+ AravisTriggerSource = SubsetEnum["Freerun", "Line1"]
23
23
 
24
24
 
25
25
  class AravisDriver(ADBase):
@@ -34,5 +34,7 @@ class AravisDriver(ADBase):
34
34
  self.trigger_mode = epics_signal_rw_rbv(
35
35
  AravisTriggerMode, prefix + "TriggerMode"
36
36
  )
37
- self.trigger_source = epics_signal_rw_rbv(str, prefix + "TriggerSource")
37
+ self.trigger_source = epics_signal_rw_rbv(
38
+ AravisTriggerSource, prefix + "TriggerSource"
39
+ )
38
40
  super().__init__(prefix, name=name)
@@ -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.2
3
+ Version: 0.3.4
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=9jP8Fo8egXoMs_T3DFqSuJYg4n9o9mnwYubl_hnut4k,411
3
+ ophyd_async/_version.py,sha256=gK2CDe_mbvAwKw5ZjOIg75LuB0kCZ4LyDYjtXPapvJw,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=znjVeRfrDVJbGLEkUczeKMW46kV6HDrlE4lV0SqvZt4,2952
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=fT3q0WED3JHmNKYCs7PzDLCK4cUPVin3wQjDNPdHqAY,1525
17
- ophyd_async/core/soft_signal_backend.py,sha256=n1Wp0jzgKTkQPlDnlUIr8Bm4JUwWc97dXiOWGjpwf4s,5926
16
+ ophyd_async/core/signal_backend.py,sha256=U9J6jzHXRNIrdtGiZBVxXTRtzeejXiXEEIOGRIQhiS8,2678
17
+ ophyd_async/core/soft_signal_backend.py,sha256=tBVt3iB3KW3vNGpQ-j_bO4_n-8oii-ZUdZNkfVfGThg,6161
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=VDL4hiSn-C_yF3-PZoc46IXnmOHyrClNwIwLzEvx9Ww,1259
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,11 +33,11 @@ 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=jJdY97JATz-bWtEPtmnyQ-Zyjvhy2M78i0wUuXO2dtE,2617
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=-Ib0Lz4fFQQmB7K0uFxMDvAerkLxadMQERH7lNAvrs4,495
39
- ophyd_async/epics/areadetector/drivers/ad_base.py,sha256=18WFAiWEUg0H2LcvTQHrKYj2wThGafQzDpiyAWki6vo,3411
40
- ophyd_async/epics/areadetector/drivers/aravis_driver.py,sha256=PmIygsVNoxxYHvZZzFAbAm2DXmXFc13nAzL_DJB6YSU,1464
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
+ ophyd_async/epics/areadetector/drivers/aravis_driver.py,sha256=K1if0Nv1ZNEvcOha6NVYA9t9VqsBNxKCmbajlysGF2Q,1491
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
43
43
  ophyd_async/epics/areadetector/drivers/vimba_driver.py,sha256=J54VtWkOklfbSqZYxGWH1e6Uzm9_Gph_ZbCf9Zax0LU,1713
@@ -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=G8cc-okSXJ6s2fGxRO155xm7PrBbVImBmBMRWts895k,3630
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.2.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
82
- ophyd_async-0.3.2.dist-info/METADATA,sha256=Jb_3qY-9kWt64Ko26THH3TIjLgYf_2dzEccB1cGa2q4,6292
83
- ophyd_async-0.3.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
84
- ophyd_async-0.3.2.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
85
- ophyd_async-0.3.2.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
86
- ophyd_async-0.3.2.dist-info/RECORD,,
81
+ ophyd_async-0.3.4.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
82
+ ophyd_async-0.3.4.dist-info/METADATA,sha256=0hkgwQmGRphuOSmg_-EOyQIdEuYWGY1z4s9Bco9oG3E,6292
83
+ ophyd_async-0.3.4.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
84
+ ophyd_async-0.3.4.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
85
+ ophyd_async-0.3.4.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
86
+ ophyd_async-0.3.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (70.1.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5