ophyd-async 0.5.0__py3-none-any.whl → 0.5.1__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.
Files changed (36) hide show
  1. ophyd_async/_version.py +2 -2
  2. ophyd_async/core/__init__.py +2 -0
  3. ophyd_async/core/_detector.py +38 -28
  4. ophyd_async/core/_hdf_dataset.py +1 -5
  5. ophyd_async/core/_mock_signal_utils.py +4 -3
  6. ophyd_async/core/_providers.py +24 -37
  7. ophyd_async/core/_signal.py +73 -28
  8. ophyd_async/epics/adcore/__init__.py +14 -3
  9. ophyd_async/epics/adcore/_core_io.py +29 -5
  10. ophyd_async/epics/adcore/_hdf_writer.py +45 -21
  11. ophyd_async/epics/adcore/_utils.py +69 -70
  12. ophyd_async/epics/adkinetix/_kinetix_io.py +4 -1
  13. ophyd_async/epics/adpilatus/_pilatus_controller.py +1 -1
  14. ophyd_async/epics/adpilatus/_pilatus_io.py +1 -1
  15. ophyd_async/epics/advimba/_vimba_controller.py +3 -3
  16. ophyd_async/epics/advimba/_vimba_io.py +6 -4
  17. ophyd_async/epics/motor.py +15 -2
  18. ophyd_async/epics/signal/_aioca.py +12 -5
  19. ophyd_async/epics/signal/_common.py +1 -1
  20. ophyd_async/epics/signal/_p4p.py +14 -11
  21. ophyd_async/fastcs/panda/__init__.py +3 -3
  22. ophyd_async/fastcs/panda/{_common_blocks.py → _block.py} +2 -0
  23. ophyd_async/fastcs/panda/{_panda_controller.py → _control.py} +1 -1
  24. ophyd_async/fastcs/panda/_hdf_panda.py +4 -4
  25. ophyd_async/fastcs/panda/_trigger.py +1 -1
  26. ophyd_async/fastcs/panda/{_hdf_writer.py → _writer.py} +29 -22
  27. ophyd_async/plan_stubs/__init__.py +3 -0
  28. ophyd_async/plan_stubs/_nd_attributes.py +63 -0
  29. ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py +5 -2
  30. ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py +1 -3
  31. {ophyd_async-0.5.0.dist-info → ophyd_async-0.5.1.dist-info}/METADATA +46 -44
  32. {ophyd_async-0.5.0.dist-info → ophyd_async-0.5.1.dist-info}/RECORD +36 -35
  33. {ophyd_async-0.5.0.dist-info → ophyd_async-0.5.1.dist-info}/WHEEL +1 -1
  34. {ophyd_async-0.5.0.dist-info → ophyd_async-0.5.1.dist-info}/LICENSE +0 -0
  35. {ophyd_async-0.5.0.dist-info → ophyd_async-0.5.1.dist-info}/entry_points.txt +0 -0
  36. {ophyd_async-0.5.0.dist-info → ophyd_async-0.5.1.dist-info}/top_level.txt +0 -0
@@ -16,7 +16,7 @@ from ophyd_async.core import (
16
16
  wait_for_value,
17
17
  )
18
18
 
19
- from ._common_blocks import CommonPandaBlocks
19
+ from ._block import DataBlock
20
20
 
21
21
 
22
22
  class PandaHDFWriter(DetectorWriter):
@@ -27,9 +27,9 @@ class PandaHDFWriter(DetectorWriter):
27
27
  prefix: str,
28
28
  path_provider: PathProvider,
29
29
  name_provider: NameProvider,
30
- panda_device: CommonPandaBlocks,
30
+ panda_data_block: DataBlock,
31
31
  ) -> None:
32
- self.panda_device = panda_device
32
+ self.panda_data_block = panda_data_block
33
33
  self._prefix = prefix
34
34
  self._path_provider = path_provider
35
35
  self._name_provider = name_provider
@@ -42,25 +42,33 @@ class PandaHDFWriter(DetectorWriter):
42
42
  """Retrieve and get descriptor of all PandA signals marked for capture"""
43
43
 
44
44
  # Ensure flushes are immediate
45
- await self.panda_device.data.flush_period.set(0)
45
+ await self.panda_data_block.flush_period.set(0)
46
46
 
47
47
  self._file = None
48
- info = self._path_provider(device_name=self.panda_device.name)
48
+ info = self._path_provider(device_name=self._name_provider())
49
+
50
+ # Set create dir depth first to guarantee that callback when setting
51
+ # directory path has correct value
52
+ await self.panda_data_block.create_directory.set(info.create_dir_depth)
53
+
49
54
  # Set the initial values
50
55
  await asyncio.gather(
51
- self.panda_device.data.hdf_directory.set(
52
- str(info.root / info.resource_dir)
53
- ),
54
- self.panda_device.data.hdf_file_name.set(
56
+ self.panda_data_block.hdf_directory.set(str(info.directory_path)),
57
+ self.panda_data_block.hdf_file_name.set(
55
58
  f"{info.filename}.h5",
56
59
  ),
57
- self.panda_device.data.num_capture.set(0),
58
- # TODO: Set create_dir_depth once available
59
- # https://github.com/bluesky/ophyd-async/issues/317
60
+ self.panda_data_block.num_capture.set(0),
60
61
  )
61
62
 
63
+ # Make sure that directory exists or has been created.
64
+ if not await self.panda_data_block.directory_exists.get_value() == 1:
65
+ raise OSError(
66
+ f"Directory {info.directory_path} does not exist or "
67
+ "is not writable by the PandABlocks-ioc!"
68
+ )
69
+
62
70
  # Wait for it to start, stashing the status that tells us when it finishes
63
- await self.panda_device.data.capture.set(True)
71
+ await self.panda_data_block.capture.set(True)
64
72
  if multiplier > 1:
65
73
  raise ValueError(
66
74
  "All PandA datasets should be scalar, multiplier should be 1"
@@ -76,7 +84,7 @@ class PandaHDFWriter(DetectorWriter):
76
84
  await self._update_datasets()
77
85
  describe = {
78
86
  ds.data_key: DataKey(
79
- source=self.panda_device.data.hdf_directory.source,
87
+ source=self.panda_data_block.hdf_directory.source,
80
88
  shape=ds.shape,
81
89
  dtype="array" if ds.shape != [1] else "number",
82
90
  dtype_numpy="<f8", # PandA data should always be written as Float64
@@ -92,7 +100,7 @@ class PandaHDFWriter(DetectorWriter):
92
100
  representation of datasets that the panda will write.
93
101
  """
94
102
 
95
- capture_table = await self.panda_device.data.datasets.get_value()
103
+ capture_table = await self.panda_data_block.datasets.get_value()
96
104
  self._datasets = [
97
105
  HDFDataset(dataset_name, "/" + dataset_name, [1], multiplier=1)
98
106
  for dataset_name in capture_table["name"]
@@ -108,18 +116,18 @@ class PandaHDFWriter(DetectorWriter):
108
116
 
109
117
  matcher.__name__ = f"index_at_least_{index}"
110
118
  await wait_for_value(
111
- self.panda_device.data.num_captured, matcher, timeout=timeout
119
+ self.panda_data_block.num_captured, matcher, timeout=timeout
112
120
  )
113
121
 
114
122
  async def get_indices_written(self) -> int:
115
- return await self.panda_device.data.num_captured.get_value()
123
+ return await self.panda_data_block.num_captured.get_value()
116
124
 
117
125
  async def observe_indices_written(
118
126
  self, timeout=DEFAULT_TIMEOUT
119
127
  ) -> AsyncGenerator[int, None]:
120
128
  """Wait until a specific index is ready to be collected"""
121
129
  async for num_captured in observe_value(
122
- self.panda_device.data.num_captured, timeout
130
+ self.panda_data_block.num_captured, timeout
123
131
  ):
124
132
  yield num_captured // self._multiplier
125
133
 
@@ -130,9 +138,8 @@ class PandaHDFWriter(DetectorWriter):
130
138
  if indices_written:
131
139
  if not self._file:
132
140
  self._file = HDFFile(
133
- self._path_provider(),
134
- Path(await self.panda_device.data.hdf_directory.get_value())
135
- / Path(await self.panda_device.data.hdf_file_name.get_value()),
141
+ Path(await self.panda_data_block.hdf_directory.get_value())
142
+ / Path(await self.panda_data_block.hdf_file_name.get_value()),
136
143
  self._datasets,
137
144
  )
138
145
  for doc in self._file.stream_resources():
@@ -142,6 +149,6 @@ class PandaHDFWriter(DetectorWriter):
142
149
 
143
150
  # Could put this function as default for StandardDetector
144
151
  async def close(self):
145
- await self.panda_device.data.capture.set(
152
+ await self.panda_data_block.capture.set(
146
153
  False, wait=True, timeout=DEFAULT_TIMEOUT
147
154
  )
@@ -4,10 +4,13 @@ from ._fly import (
4
4
  prepare_static_seq_table_flyer_and_detectors_with_same_trigger,
5
5
  time_resolved_fly_and_collect_with_static_seq_table,
6
6
  )
7
+ from ._nd_attributes import setup_ndattributes, setup_ndstats_sum
7
8
 
8
9
  __all__ = [
9
10
  "fly_and_collect",
10
11
  "prepare_static_seq_table_flyer_and_detectors_with_same_trigger",
11
12
  "time_resolved_fly_and_collect_with_static_seq_table",
12
13
  "ensure_connected",
14
+ "setup_ndattributes",
15
+ "setup_ndstats_sum",
13
16
  ]
@@ -0,0 +1,63 @@
1
+ from typing import Sequence
2
+ from xml.etree import cElementTree as ET
3
+
4
+ import bluesky.plan_stubs as bps
5
+
6
+ from ophyd_async.core._device import Device
7
+ from ophyd_async.epics.adcore._core_io import NDArrayBaseIO
8
+ from ophyd_async.epics.adcore._utils import (
9
+ NDAttributeDataType,
10
+ NDAttributeParam,
11
+ NDAttributePv,
12
+ )
13
+
14
+
15
+ def setup_ndattributes(
16
+ device: NDArrayBaseIO, ndattributes: Sequence[NDAttributePv | NDAttributeParam]
17
+ ):
18
+ xml_text = ET.Element("Attributes")
19
+
20
+ for ndattribute in ndattributes:
21
+ if isinstance(ndattribute, NDAttributeParam):
22
+ ET.SubElement(
23
+ xml_text,
24
+ "Attribute",
25
+ name=ndattribute.name,
26
+ type="PARAM",
27
+ source=ndattribute.param,
28
+ addr=str(ndattribute.addr),
29
+ datatype=ndattribute.datatype.value,
30
+ description=ndattribute.description,
31
+ )
32
+ elif isinstance(ndattribute, NDAttributePv):
33
+ ET.SubElement(
34
+ xml_text,
35
+ "Attribute",
36
+ name=ndattribute.name,
37
+ type="EPICS_PV",
38
+ source=ndattribute.signal.source.split("ca://")[-1],
39
+ dbrtype=ndattribute.dbrtype.value,
40
+ description=ndattribute.description,
41
+ )
42
+ else:
43
+ raise ValueError(
44
+ f"Invalid type for ndattributes: {type(ndattribute)}. "
45
+ "Expected NDAttributePv or NDAttributeParam."
46
+ )
47
+ yield from bps.mv(device.nd_attributes_file, xml_text)
48
+
49
+
50
+ def setup_ndstats_sum(detector: Device):
51
+ yield from (
52
+ setup_ndattributes(
53
+ detector.hdf,
54
+ [
55
+ NDAttributeParam(
56
+ name=f"{detector.name}-sum",
57
+ param="NDPluginStatsTotal",
58
+ datatype=NDAttributeDataType.DOUBLE,
59
+ description="Sum of the array",
60
+ )
61
+ ],
62
+ )
63
+ )
@@ -14,6 +14,8 @@ class PatternDetectorController(DetectorControl):
14
14
  exposure: float = 0.1,
15
15
  ) -> None:
16
16
  self.pattern_generator: PatternGenerator = pattern_generator
17
+ if exposure is None:
18
+ exposure = 0.1
17
19
  self.pattern_generator.set_exposure(exposure)
18
20
  self.path_provider: PathProvider = path_provider
19
21
  self.task: Optional[asyncio.Task] = None
@@ -25,7 +27,8 @@ class PatternDetectorController(DetectorControl):
25
27
  trigger: DetectorTrigger = DetectorTrigger.internal,
26
28
  exposure: Optional[float] = 0.01,
27
29
  ) -> AsyncStatus:
28
- assert exposure is not None
30
+ if exposure is None:
31
+ exposure = 0.1
29
32
  period: float = exposure + self.get_deadtime(exposure)
30
33
  task = asyncio.create_task(
31
34
  self._coroutine_for_image_writing(exposure, period, num)
@@ -42,7 +45,7 @@ class PatternDetectorController(DetectorControl):
42
45
  pass
43
46
  self.task = None
44
47
 
45
- def get_deadtime(self, exposure: float) -> float:
48
+ def get_deadtime(self, exposure: float | None) -> float:
46
49
  return 0.001
47
50
 
48
51
  async def _coroutine_for_image_writing(
@@ -166,8 +166,7 @@ class PatternGenerator:
166
166
 
167
167
  def _get_new_path(self, path_provider: PathProvider) -> Path:
168
168
  info = path_provider(device_name="pattern")
169
- filename = info.filename
170
- new_path: Path = info.root / info.resource_dir / filename
169
+ new_path: Path = info.directory_path / info.filename
171
170
  return new_path
172
171
 
173
172
  async def collect_stream_docs(
@@ -188,7 +187,6 @@ class PatternGenerator:
188
187
  if not self._hdf_stream_provider:
189
188
  assert self.target_path, "open file has not been called"
190
189
  self._hdf_stream_provider = HDFFile(
191
- self._path_provider(),
192
190
  self.target_path,
193
191
  self._datasets,
194
192
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ophyd-async
3
- Version: 0.5.0
3
+ Version: 0.5.1
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
@@ -40,59 +40,61 @@ Classifier: Programming Language :: Python :: 3.11
40
40
  Requires-Python: >=3.10
41
41
  Description-Content-Type: text/markdown
42
42
  License-File: LICENSE
43
- Requires-Dist: networkx >=2.0
44
- Requires-Dist: numpy <2.0.0
43
+ Requires-Dist: networkx>=2.0
44
+ Requires-Dist: numpy<2.0.0
45
45
  Requires-Dist: packaging
46
46
  Requires-Dist: pint
47
- Requires-Dist: bluesky >=1.13.0a3
47
+ Requires-Dist: bluesky>=1.13.0a3
48
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
52
+ Requires-Dist: pydantic>=2.0
53
53
  Requires-Dist: pydantic-numpy
54
54
  Provides-Extra: ca
55
- Requires-Dist: aioca >=1.6 ; extra == 'ca'
55
+ Requires-Dist: aioca>=1.6; extra == "ca"
56
56
  Provides-Extra: dev
57
- Requires-Dist: ophyd-async[pva] ; extra == 'dev'
58
- Requires-Dist: ophyd-async[ca] ; extra == 'dev'
59
- Requires-Dist: black ; extra == 'dev'
60
- Requires-Dist: flake8 ; extra == 'dev'
61
- Requires-Dist: flake8-isort ; extra == 'dev'
62
- Requires-Dist: Flake8-pyproject ; extra == 'dev'
63
- Requires-Dist: h5py ; extra == 'dev'
64
- Requires-Dist: inflection ; extra == 'dev'
65
- Requires-Dist: ipython ; extra == 'dev'
66
- Requires-Dist: ipywidgets ; extra == 'dev'
67
- Requires-Dist: matplotlib ; extra == 'dev'
68
- Requires-Dist: myst-parser ; extra == 'dev'
69
- Requires-Dist: numpydoc ; extra == 'dev'
70
- Requires-Dist: ophyd ; extra == 'dev'
71
- Requires-Dist: pickleshare ; extra == 'dev'
72
- Requires-Dist: pipdeptree ; extra == 'dev'
73
- Requires-Dist: pre-commit ; extra == 'dev'
74
- Requires-Dist: pydata-sphinx-theme >=0.12 ; extra == 'dev'
75
- Requires-Dist: pyepics >=3.4.2 ; extra == 'dev'
76
- Requires-Dist: pyside6 ==6.7.0 ; extra == 'dev'
77
- Requires-Dist: pytest ; extra == 'dev'
78
- Requires-Dist: pytest-asyncio ; extra == 'dev'
79
- Requires-Dist: pytest-cov ; extra == 'dev'
80
- Requires-Dist: pytest-faulthandler ; extra == 'dev'
81
- Requires-Dist: pytest-rerunfailures ; extra == 'dev'
82
- Requires-Dist: pytest-timeout ; extra == 'dev'
83
- Requires-Dist: ruff ; extra == 'dev'
84
- Requires-Dist: sphinx <7.4.0 ; extra == 'dev'
85
- Requires-Dist: sphinx-autobuild ; extra == 'dev'
86
- Requires-Dist: autodoc-pydantic ; extra == 'dev'
87
- Requires-Dist: sphinxcontrib-mermaid ; extra == 'dev'
88
- Requires-Dist: sphinx-copybutton ; extra == 'dev'
89
- Requires-Dist: sphinx-design ; extra == 'dev'
90
- Requires-Dist: super-state-machine ; extra == 'dev'
91
- Requires-Dist: tox-direct ; extra == 'dev'
92
- Requires-Dist: types-mock ; extra == 'dev'
93
- Requires-Dist: types-pyyaml ; extra == 'dev'
57
+ Requires-Dist: ophyd-async[pva]; extra == "dev"
58
+ Requires-Dist: ophyd-async[sim]; extra == "dev"
59
+ Requires-Dist: ophyd-async[ca]; extra == "dev"
60
+ Requires-Dist: black; extra == "dev"
61
+ Requires-Dist: flake8; extra == "dev"
62
+ Requires-Dist: flake8-isort; extra == "dev"
63
+ Requires-Dist: Flake8-pyproject; extra == "dev"
64
+ Requires-Dist: inflection; extra == "dev"
65
+ Requires-Dist: ipython; extra == "dev"
66
+ Requires-Dist: ipywidgets; extra == "dev"
67
+ Requires-Dist: matplotlib; extra == "dev"
68
+ Requires-Dist: myst-parser; extra == "dev"
69
+ Requires-Dist: numpydoc; extra == "dev"
70
+ Requires-Dist: ophyd; extra == "dev"
71
+ Requires-Dist: pickleshare; extra == "dev"
72
+ Requires-Dist: pipdeptree; extra == "dev"
73
+ Requires-Dist: pre-commit; extra == "dev"
74
+ Requires-Dist: pydata-sphinx-theme>=0.12; extra == "dev"
75
+ Requires-Dist: pyepics>=3.4.2; extra == "dev"
76
+ Requires-Dist: pyside6==6.7.0; extra == "dev"
77
+ Requires-Dist: pytest; extra == "dev"
78
+ Requires-Dist: pytest-asyncio; extra == "dev"
79
+ Requires-Dist: pytest-cov; extra == "dev"
80
+ Requires-Dist: pytest-faulthandler; extra == "dev"
81
+ Requires-Dist: pytest-rerunfailures; extra == "dev"
82
+ Requires-Dist: pytest-timeout; extra == "dev"
83
+ Requires-Dist: ruff; extra == "dev"
84
+ Requires-Dist: sphinx<7.4.0; extra == "dev"
85
+ Requires-Dist: sphinx-autobuild; extra == "dev"
86
+ Requires-Dist: autodoc-pydantic; extra == "dev"
87
+ Requires-Dist: sphinxcontrib-mermaid; extra == "dev"
88
+ Requires-Dist: sphinx-copybutton; extra == "dev"
89
+ Requires-Dist: sphinx-design; extra == "dev"
90
+ Requires-Dist: super-state-machine; extra == "dev"
91
+ Requires-Dist: tox-direct; extra == "dev"
92
+ Requires-Dist: types-mock; extra == "dev"
93
+ Requires-Dist: types-pyyaml; extra == "dev"
94
94
  Provides-Extra: pva
95
- Requires-Dist: p4p ; extra == 'pva'
95
+ Requires-Dist: p4p; extra == "pva"
96
+ Provides-Extra: sim
97
+ Requires-Dist: h5py; extra == "sim"
96
98
 
97
99
  [![CI](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml/badge.svg)](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml)
98
100
  [![Coverage](https://codecov.io/gh/bluesky/ophyd-async/branch/main/graph/badge.svg)](https://codecov.io/gh/bluesky/ophyd-async)
@@ -1,50 +1,50 @@
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=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
3
+ ophyd_async/_version.py,sha256=8W5N0WKS0YIWUpfry5TouisDYjsMUIZ7Vc0crGGGQQU,411
4
+ ophyd_async/core/__init__.py,sha256=avd3aVLO3CPq09h0cKon5QMew7RvtbWtmo2rOagFdkA,3745
5
+ ophyd_async/core/_detector.py,sha256=n5MKTVAzTHVUWH5ZMxcSq7u4qP2nAGemaPyGrPAZQq4,11811
6
6
  ophyd_async/core/_device.py,sha256=DDdRujYLCDSuGDB0gqElkzI0qEGb3sMlFP6FgmH2u3A,7554
7
7
  ophyd_async/core/_device_save_loader.py,sha256=pTom5EOFa9_5Z3bV37zOnbGx2ujWIOl_D9PVYhpY1FY,8232
8
8
  ophyd_async/core/_flyer.py,sha256=8_N9u6s2P9qPZmNtHFfdmFv8FD7sKrKb9-IuvNUVHPw,2267
9
- ophyd_async/core/_hdf_dataset.py,sha256=ZFfG6hmWRcExFhTxbnWB5NwuaOI_cwE4z_fjXV2Vg8s,2600
9
+ ophyd_async/core/_hdf_dataset.py,sha256=H3fFzsnLc7BwPgmDP7P9emQ5u6f0GFQ16Myj6qWxQq0,2430
10
10
  ophyd_async/core/_log.py,sha256=Hsk2Iwx81n3HpxNR30xGTnLJh_lPGd_CGy2MI3OGpWs,3588
11
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
12
+ ophyd_async/core/_mock_signal_utils.py,sha256=LTrmjQTqvP4yY2bsaOmfLNJAegD850_BNZ6Y8uY5XPQ,4717
13
13
  ophyd_async/core/_protocol.py,sha256=aRoqet0ThyVK_wrULh4k_StnpeHnNhXc0YffWdRJNZw,3391
14
- ophyd_async/core/_providers.py,sha256=-HlisysZZcqs6z1yQsWCpof7hQ9QTbg2IYpm4XaErGQ,7454
14
+ ophyd_async/core/_providers.py,sha256=gCkzLcoXYy2as4CAlLzoA6RzvrYAVIamgRpLsV708ro,7033
15
15
  ophyd_async/core/_readable.py,sha256=WayM35JOJj732-YgvGsjUSlCZwZ_zq1zbAmk-1U0uwU,8998
16
- ophyd_async/core/_signal.py,sha256=IE_7Enn_RU8IUg6L1bpchbMvwwA4YZdrA8S7bOKk_7o,18503
16
+ ophyd_async/core/_signal.py,sha256=38whsWlm4Wo7r7Beh_i0OJ4iqtJNR5TIGtS7_uZ736Y,19610
17
17
  ophyd_async/core/_signal_backend.py,sha256=-Vze8-57W0jpcC4gq4P4rZpXXJvi2qrbu0A8AjqA594,2638
18
18
  ophyd_async/core/_soft_signal_backend.py,sha256=Z4LiADd9xKrxhhPOx8q5xq4yrJRdJbfuKeB0o2wBjCk,6653
19
19
  ophyd_async/core/_status.py,sha256=mjzoGyaMFCfQLIWNKv_VcuCz9unZ9Gs3nCkaa1dTne8,4334
20
20
  ophyd_async/core/_utils.py,sha256=3oZcXNqAUHX4ZWMBH5gSuK6cFWEhSkZ9GSDYv0pf8jc,5783
21
21
  ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- ophyd_async/epics/motor.py,sha256=z1a61P1-tA3RxeD36uhhE6WJ0AfLU6xodtdk2avV_Ss,8495
22
+ ophyd_async/epics/motor.py,sha256=na1WmomnPsFVYTMJwL0ViFjay1UaepeXprKKAJc7pdk,8771
23
23
  ophyd_async/epics/adaravis/__init__.py,sha256=u979_9nQTYB0TvDOTXFN4qMrbDP8-xQFfXYMGzLVBo4,207
24
24
  ophyd_async/epics/adaravis/_aravis.py,sha256=f2xiKQr1AcX6R-NjaMMgfXBfbHIsYfDGp4-CyHKIT6I,1949
25
25
  ophyd_async/epics/adaravis/_aravis_controller.py,sha256=SzyajBNoqvBOUVtNE0t8ghffY2pYP8U99XgQ-4u2pVI,2635
26
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
27
+ ophyd_async/epics/adcore/__init__.py,sha256=krbCmdOoW2eIbFCztDe1MAlsIyO6vHEcFwkH8DPmy98,1080
28
+ ophyd_async/epics/adcore/_core_io.py,sha256=F4TlnWW0ntAekZlr8qxCpKhFyEThSgjYQCOoKOg4DN8,5918
29
29
  ophyd_async/epics/adcore/_core_logic.py,sha256=XpM1t2kqof9q_7fkKlFPKP2vT0DoLgc0drj7cTUHsbU,3421
30
- ophyd_async/epics/adcore/_hdf_writer.py,sha256=rnNNwFAr3KtNJCIk0jRGA0Fz5MPhUV3bvShG00OpG7A,5882
30
+ ophyd_async/epics/adcore/_hdf_writer.py,sha256=YBQRQJN6Ep62SaAz7zW_9pX7IPwsmqiuNxMuLQwV8sA,6870
31
31
  ophyd_async/epics/adcore/_single_trigger.py,sha256=LGhAZV0GoRwRTNFQmgLpkfq73HsiMCu20JKYGOzxt0I,1159
32
- ophyd_async/epics/adcore/_utils.py,sha256=EgpofUaLV9AofcMmwLYmRybDGWRonRZNYUzWrMxoQL4,3587
32
+ ophyd_async/epics/adcore/_utils.py,sha256=A5AUQIfdbzLgF7A4V-1TSoPD6Kvgs4sbZBGOV7zb8SY,3909
33
33
  ophyd_async/epics/adkinetix/__init__.py,sha256=QEft12PURied6LRzjw-NhUmngjAm1XNA3k-5o5aMXDQ,216
34
34
  ophyd_async/epics/adkinetix/_kinetix.py,sha256=Xnt54pqxWArcBIZ8RdLMXfMX0kCDCInJQp48MMx6Gmw,1181
35
35
  ophyd_async/epics/adkinetix/_kinetix_controller.py,sha256=jHe6MSfqCOdzw0jQ5L6cYq55I0TD5Bso2ZGOZmv1j3Q,1504
36
- ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=zm3MnJkOVCAIyHi3x3t0trAv4GlEFZMJPd8VGsn50Lc,838
36
+ ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=AbCoYliAobU3I6z3NaswQnExwGTgV458zF3uwkBEQPc,893
37
37
  ophyd_async/epics/adpilatus/__init__.py,sha256=daimScOCCMHR2eb8VbezHOcGOkd6uIRZQiyeTQsaAx4,308
38
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
39
+ ophyd_async/epics/adpilatus/_pilatus_controller.py,sha256=1GfzcnhwLam8fAhf889lPz2rrn9mWDaGO3BIELP3R50,2450
40
+ ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=WB_N2RRpcFCFI6i57PRqjIdpK6hzLpWxn71cWUHUZnc,722
41
41
  ophyd_async/epics/adsimdetector/__init__.py,sha256=t3crUgTEvVJGI8o6FsfN42k0A-l4v9ZBwXIYtixoE-M,128
42
42
  ophyd_async/epics/adsimdetector/_sim.py,sha256=nk4Xj_j_WeKk1FJov-Zo2W7NHnHcBUDbIzranHUpngI,863
43
43
  ophyd_async/epics/adsimdetector/_sim_controller.py,sha256=v0GrMXg7U1PUvLKW8zmx8zrunk_MfFt7GbckbVlnUys,1494
44
44
  ophyd_async/epics/advimba/__init__.py,sha256=GSnFWGPNJsCJZ-Tgyv-L38Smwzp2bWC64U_4uD2TLvs,198
45
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
46
+ ophyd_async/epics/advimba/_vimba_controller.py,sha256=JvQ4M2IdixDI6TXNHSqUs0sX3ncgosecuLmT8bYhU9w,2003
47
+ ophyd_async/epics/advimba/_vimba_io.py,sha256=nf1BdIWey4RR7KuqyZhH6X5yB8Msg0oOtkVLOuwn6Uc,1843
48
48
  ophyd_async/epics/demo/__init__.py,sha256=wCrgemEo-zR4TTvaqCKnQ-AIUHorotV5jhftbq1tXz0,1368
49
49
  ophyd_async/epics/demo/_mover.py,sha256=7GEmF-mgN0qxiHUE3Tgboh0p9S5AuPBYR-pFeg5QFTk,3520
50
50
  ophyd_async/epics/demo/_sensor.py,sha256=8OyFAsB3EXMzrQreOIg_TGHrseUtI5rxXpfwwUaC76I,1165
@@ -53,37 +53,38 @@ ophyd_async/epics/demo/sensor.db,sha256=AVtiydrdtwAz2EFurO2Ult9SSRtre3r0akOBbL98
53
53
  ophyd_async/epics/pvi/__init__.py,sha256=ZvJO69ApL7N9rWT9-hD-JZMC_KsHxgeEqxe-01jNUVw,137
54
54
  ophyd_async/epics/pvi/_pvi.py,sha256=PUst4KhX8emkbRunLrJeqTruaOMF3mm1s7YJsBB7HpQ,12099
55
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
56
+ ophyd_async/epics/signal/_aioca.py,sha256=8I3CFNtHWsxDe1DC95VGAITR6hKaW03L_8pBnvdF4-A,11764
57
+ ophyd_async/epics/signal/_common.py,sha256=v8nHeAZcdrAtqwzHDOia03HAhPL0zEP-4qhg4DwK8vY,1867
58
58
  ophyd_async/epics/signal/_epics_transport.py,sha256=MnkhnbpYSxrS7Wo8jDJ1YGnkrvjfYEt1oOe-uxjGCPU,839
59
- ophyd_async/epics/signal/_p4p.py,sha256=jozZoyCC6bOtpJMWCcPLWA3sxQTf9YLo_Koq9hOVrLA,15752
59
+ ophyd_async/epics/signal/_p4p.py,sha256=cvzj6VD3mK-tns1nH8ZukgpvHo1ULMbUc8Qg-B6drBQ,15981
60
60
  ophyd_async/epics/signal/_signal.py,sha256=i5q7zTv5y3HFQRI1JrwWT-gN6bViPWNuks14le2pTFI,3252
61
61
  ophyd_async/fastcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
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
63
+ ophyd_async/fastcs/panda/__init__.py,sha256=IHVn0wHsCuvQLdgKTRyr1F8-Ol81ImuEx_JJZpfPUv0,1166
64
+ ophyd_async/fastcs/panda/_block.py,sha256=ElnwPg0HEx7gToB6l_0o-Pf2foIQaCdVi69VFYxr-RA,1614
65
+ ophyd_async/fastcs/panda/_control.py,sha256=Xwes9eRlR4WgTEtQy9LmnQjk596qxAdw33AFxMDF9Rg,1229
66
+ ophyd_async/fastcs/panda/_hdf_panda.py,sha256=ty-mc5c8z-OcX0zXt5ymlCeqE1G5_UYAEhOmNUv0f_M,1309
68
67
  ophyd_async/fastcs/panda/_table.py,sha256=atd9wiam0XQH89doqzn0U6J42CFQBKDs9K1_q5GcJR8,6093
69
- ophyd_async/fastcs/panda/_trigger.py,sha256=iqmLN1Dh8n_p4amhTKSP5ifSaLhYwqqHhva0G-oVSvM,3062
68
+ ophyd_async/fastcs/panda/_trigger.py,sha256=f7VqYCdXYoT2JyPovXdeYUC0SdWFFcSnVVdUHRd0OO0,3054
70
69
  ophyd_async/fastcs/panda/_utils.py,sha256=VHW5kPVISyEkmse_qQcyisBkkEwMO6GG2Ago-CH1AFA,487
71
- ophyd_async/plan_stubs/__init__.py,sha256=Qn0VDrlT2CmzP32qzAeP3YFvLWdLfpveq3qGQM_4TsE,407
70
+ ophyd_async/fastcs/panda/_writer.py,sha256=1WSoxUPfMIprcShccjZtsnSVLJwKOCcxsBw8FIemlBk,5326
71
+ ophyd_async/plan_stubs/__init__.py,sha256=wjpEj_BoBZJ9x2fhUPY6BzWMqyYH96JrBlJvV7frdN4,524
72
72
  ophyd_async/plan_stubs/_ensure_connected.py,sha256=6Q7_UWQ-UQ0awe6mnN4PdNCAOGRm4GZR9X2M-ghQCeI,711
73
73
  ophyd_async/plan_stubs/_fly.py,sha256=PWT7cbnVUDBFtjKkMQ7Lr960M9d0JcUBseXFYhzBc8I,6299
74
+ ophyd_async/plan_stubs/_nd_attributes.py,sha256=r7Ly2fPIklOJGIHw0uoWl4gOsIfP5Df6dg_tU__hUSE,1986
74
75
  ophyd_async/sim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
76
  ophyd_async/sim/demo/__init__.py,sha256=JKWFnHqmFuRRMvvU0aBuclke3OdF0iq89yvHEd4J7Bg,371
76
77
  ophyd_async/sim/demo/_sim_motor.py,sha256=Dfc-1faeqbVLsCLuM2FFJ2F20Ib0UsS2vsHdqgVt2Zk,3601
77
78
  ophyd_async/sim/demo/_pattern_detector/__init__.py,sha256=o_dSZDIl_CyS3YPSNKpGiQiR9UaC4cNzZ8_ByEN9dIk,402
78
79
  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_controller.py,sha256=JjgCiX1CO284ykwzutdp0whqehHPqi83akiAyL7CqmY,1800
80
81
  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/demo/_pattern_detector/_pattern_generator.py,sha256=KRB8y3rwoaemeQx4ewoFO7CCTHtvokWe4zTE0Rg3K0Q,7176
82
83
  ophyd_async/sim/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
84
  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,,
85
+ ophyd_async-0.5.1.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
86
+ ophyd_async-0.5.1.dist-info/METADATA,sha256=iU7ylsJXDvQ829UX8Q6-2UUUNnu_9wMTP5NirO23HF0,6511
87
+ ophyd_async-0.5.1.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
88
+ ophyd_async-0.5.1.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
89
+ ophyd_async-0.5.1.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
90
+ ophyd_async-0.5.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (74.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5