ophyd-async 0.8.0a6__py3-none-any.whl → 0.9.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. ophyd_async/_version.py +2 -2
  2. ophyd_async/core/__init__.py +15 -46
  3. ophyd_async/core/_detector.py +68 -44
  4. ophyd_async/core/_device.py +120 -79
  5. ophyd_async/core/_device_filler.py +17 -8
  6. ophyd_async/core/_flyer.py +2 -2
  7. ophyd_async/core/_protocol.py +0 -28
  8. ophyd_async/core/_readable.py +30 -23
  9. ophyd_async/core/_settings.py +104 -0
  10. ophyd_async/core/_signal.py +91 -151
  11. ophyd_async/core/_signal_backend.py +4 -1
  12. ophyd_async/core/_soft_signal_backend.py +2 -1
  13. ophyd_async/core/_table.py +18 -10
  14. ophyd_async/core/_utils.py +30 -5
  15. ophyd_async/core/_yaml_settings.py +64 -0
  16. ophyd_async/epics/adandor/__init__.py +9 -0
  17. ophyd_async/epics/adandor/_andor.py +45 -0
  18. ophyd_async/epics/adandor/_andor_controller.py +49 -0
  19. ophyd_async/epics/adandor/_andor_io.py +36 -0
  20. ophyd_async/epics/adaravis/__init__.py +3 -1
  21. ophyd_async/epics/adaravis/_aravis.py +23 -37
  22. ophyd_async/epics/adaravis/_aravis_controller.py +21 -30
  23. ophyd_async/epics/adaravis/_aravis_io.py +4 -4
  24. ophyd_async/epics/adcore/__init__.py +15 -8
  25. ophyd_async/epics/adcore/_core_detector.py +41 -0
  26. ophyd_async/epics/adcore/_core_io.py +56 -31
  27. ophyd_async/epics/adcore/_core_logic.py +99 -86
  28. ophyd_async/epics/adcore/_core_writer.py +219 -0
  29. ophyd_async/epics/adcore/_hdf_writer.py +33 -59
  30. ophyd_async/epics/adcore/_jpeg_writer.py +26 -0
  31. ophyd_async/epics/adcore/_single_trigger.py +5 -4
  32. ophyd_async/epics/adcore/_tiff_writer.py +26 -0
  33. ophyd_async/epics/adcore/_utils.py +37 -36
  34. ophyd_async/epics/adkinetix/_kinetix.py +29 -24
  35. ophyd_async/epics/adkinetix/_kinetix_controller.py +15 -27
  36. ophyd_async/epics/adkinetix/_kinetix_io.py +7 -7
  37. ophyd_async/epics/adpilatus/__init__.py +2 -2
  38. ophyd_async/epics/adpilatus/_pilatus.py +28 -40
  39. ophyd_async/epics/adpilatus/_pilatus_controller.py +47 -25
  40. ophyd_async/epics/adpilatus/_pilatus_io.py +5 -5
  41. ophyd_async/epics/adsimdetector/__init__.py +3 -3
  42. ophyd_async/epics/adsimdetector/_sim.py +33 -17
  43. ophyd_async/epics/advimba/_vimba.py +23 -23
  44. ophyd_async/epics/advimba/_vimba_controller.py +21 -35
  45. ophyd_async/epics/advimba/_vimba_io.py +23 -23
  46. ophyd_async/epics/core/_aioca.py +52 -21
  47. ophyd_async/epics/core/_p4p.py +59 -16
  48. ophyd_async/epics/core/_pvi_connector.py +4 -2
  49. ophyd_async/epics/core/_signal.py +9 -2
  50. ophyd_async/epics/core/_util.py +10 -1
  51. ophyd_async/epics/eiger/_eiger_controller.py +4 -4
  52. ophyd_async/epics/eiger/_eiger_io.py +3 -3
  53. ophyd_async/epics/motor.py +26 -15
  54. ophyd_async/epics/sim/_ioc.py +29 -0
  55. ophyd_async/epics/{demo → sim}/_mover.py +12 -6
  56. ophyd_async/epics/{demo → sim}/_sensor.py +2 -2
  57. ophyd_async/epics/testing/__init__.py +14 -14
  58. ophyd_async/epics/testing/_example_ioc.py +53 -67
  59. ophyd_async/epics/testing/_utils.py +17 -45
  60. ophyd_async/epics/testing/test_records.db +22 -0
  61. ophyd_async/fastcs/core.py +2 -2
  62. ophyd_async/fastcs/panda/__init__.py +0 -2
  63. ophyd_async/fastcs/panda/_block.py +9 -9
  64. ophyd_async/fastcs/panda/_control.py +9 -4
  65. ophyd_async/fastcs/panda/_hdf_panda.py +7 -2
  66. ophyd_async/fastcs/panda/_table.py +4 -1
  67. ophyd_async/fastcs/panda/_trigger.py +7 -7
  68. ophyd_async/plan_stubs/__init__.py +14 -0
  69. ophyd_async/plan_stubs/_ensure_connected.py +11 -17
  70. ophyd_async/plan_stubs/_fly.py +2 -2
  71. ophyd_async/plan_stubs/_nd_attributes.py +7 -5
  72. ophyd_async/plan_stubs/_panda.py +13 -0
  73. ophyd_async/plan_stubs/_settings.py +125 -0
  74. ophyd_async/plan_stubs/_wait_for_awaitable.py +13 -0
  75. ophyd_async/sim/__init__.py +19 -0
  76. ophyd_async/sim/{demo/_pattern_detector → _pattern_detector}/_pattern_detector_controller.py +9 -2
  77. ophyd_async/sim/{demo/_pattern_detector → _pattern_detector}/_pattern_generator.py +13 -6
  78. ophyd_async/sim/{demo/_sim_motor.py → _sim_motor.py} +34 -32
  79. ophyd_async/tango/core/_signal.py +3 -1
  80. ophyd_async/tango/core/_tango_transport.py +13 -15
  81. ophyd_async/tango/{demo → sim}/_mover.py +5 -2
  82. ophyd_async/testing/__init__.py +52 -0
  83. ophyd_async/testing/__pytest_assert_rewrite.py +4 -0
  84. ophyd_async/testing/_assert.py +176 -0
  85. ophyd_async/{core → testing}/_mock_signal_utils.py +15 -11
  86. ophyd_async/testing/_one_of_everything.py +126 -0
  87. ophyd_async/testing/_wait_for_pending.py +22 -0
  88. {ophyd_async-0.8.0a6.dist-info → ophyd_async-0.9.0.dist-info}/METADATA +4 -2
  89. ophyd_async-0.9.0.dist-info/RECORD +129 -0
  90. {ophyd_async-0.8.0a6.dist-info → ophyd_async-0.9.0.dist-info}/WHEEL +1 -1
  91. ophyd_async/core/_device_save_loader.py +0 -274
  92. ophyd_async/epics/adsimdetector/_sim_controller.py +0 -51
  93. ophyd_async/fastcs/panda/_utils.py +0 -16
  94. ophyd_async/sim/demo/__init__.py +0 -19
  95. ophyd_async/sim/testing/__init__.py +0 -0
  96. ophyd_async-0.8.0a6.dist-info/RECORD +0 -116
  97. ophyd_async-0.8.0a6.dist-info/entry_points.txt +0 -2
  98. /ophyd_async/epics/{demo → sim}/__init__.py +0 -0
  99. /ophyd_async/epics/{demo → sim}/mover.db +0 -0
  100. /ophyd_async/epics/{demo → sim}/sensor.db +0 -0
  101. /ophyd_async/sim/{demo/_pattern_detector → _pattern_detector}/__init__.py +0 -0
  102. /ophyd_async/sim/{demo/_pattern_detector → _pattern_detector}/_pattern_detector.py +0 -0
  103. /ophyd_async/sim/{demo/_pattern_detector → _pattern_detector}/_pattern_detector_writer.py +0 -0
  104. /ophyd_async/tango/{demo → sim}/__init__.py +0 -0
  105. /ophyd_async/tango/{demo → sim}/_counter.py +0 -0
  106. /ophyd_async/tango/{demo → sim}/_detector.py +0 -0
  107. /ophyd_async/tango/{demo → sim}/_tango/__init__.py +0 -0
  108. /ophyd_async/tango/{demo → sim}/_tango/_servers.py +0 -0
  109. {ophyd_async-0.8.0a6.dist-info → ophyd_async-0.9.0.dist-info}/LICENSE +0 -0
  110. {ophyd_async-0.8.0a6.dist-info → ophyd_async-0.9.0.dist-info}/top_level.txt +0 -0
@@ -1,274 +0,0 @@
1
- from collections.abc import Callable, Generator, Sequence
2
- from enum import Enum
3
- from pathlib import Path
4
- from typing import Any
5
-
6
- import numpy as np
7
- import numpy.typing as npt
8
- import yaml
9
- from bluesky.plan_stubs import abs_set, wait
10
- from bluesky.protocols import Location
11
- from bluesky.utils import Msg
12
- from pydantic import BaseModel
13
-
14
- from ._device import Device
15
- from ._signal import SignalRW
16
-
17
-
18
- def ndarray_representer(dumper: yaml.Dumper, array: npt.NDArray[Any]) -> yaml.Node:
19
- return dumper.represent_sequence(
20
- "tag:yaml.org,2002:seq", array.tolist(), flow_style=True
21
- )
22
-
23
-
24
- def pydantic_model_abstraction_representer(
25
- dumper: yaml.Dumper, model: BaseModel
26
- ) -> yaml.Node:
27
- return dumper.represent_data(model.model_dump(mode="python"))
28
-
29
-
30
- def enum_representer(dumper: yaml.Dumper, enum: Enum) -> yaml.Node:
31
- return dumper.represent_data(enum.value)
32
-
33
-
34
- def get_signal_values(
35
- signals: dict[str, SignalRW[Any]], ignore: list[str] | None = None
36
- ) -> Generator[Msg, Sequence[Location[Any]], dict[str, Any]]:
37
- """Get signal values in bulk.
38
-
39
- Used as part of saving the signals of a device to a yaml file.
40
-
41
- Parameters
42
- ----------
43
- signals : Dict[str, SignalRW]
44
- Dictionary with pv names and matching SignalRW values. Often the direct result
45
- of :func:`walk_rw_signals`.
46
-
47
- ignore : Optional[List[str]]
48
- Optional list of PVs that should be ignored.
49
-
50
- Returns
51
- -------
52
- Dict[str, Any]
53
- A dictionary containing pv names and their associated values. Ignored pvs are
54
- set to None.
55
-
56
- See Also
57
- --------
58
- :func:`ophyd_async.core.walk_rw_signals`
59
- :func:`ophyd_async.core.save_to_yaml`
60
- """
61
-
62
- ignore = ignore or []
63
- selected_signals = {
64
- key: signal for key, signal in signals.items() if key not in ignore
65
- }
66
- selected_values = yield Msg("locate", *selected_signals.values())
67
-
68
- assert selected_values is not None, "No signalRW's were able to be located"
69
- named_values = {
70
- key: value["setpoint"]
71
- for key, value in zip(selected_signals, selected_values, strict=False)
72
- }
73
- # Ignored values place in with value None so we know which ones were ignored
74
- named_values.update(dict.fromkeys(ignore))
75
- return named_values
76
-
77
-
78
- def walk_rw_signals(
79
- device: Device, path_prefix: str | None = ""
80
- ) -> dict[str, SignalRW[Any]]:
81
- """Retrieve all SignalRWs from a device.
82
-
83
- Stores retrieved signals with their dotted attribute paths in a dictionary. Used as
84
- part of saving and loading a device.
85
-
86
- Parameters
87
- ----------
88
- device : Device
89
- Ophyd device to retrieve read-write signals from.
90
-
91
- path_prefix : str
92
- For internal use, leave blank when calling the method.
93
-
94
- Returns
95
- -------
96
- SignalRWs : dict
97
- A dictionary matching the string attribute path of a SignalRW with the
98
- signal itself.
99
-
100
- See Also
101
- --------
102
- :func:`ophyd_async.core.get_signal_values`
103
- :func:`ophyd_async.core.save_to_yaml`
104
-
105
- """
106
-
107
- if not path_prefix:
108
- path_prefix = ""
109
-
110
- signals: dict[str, SignalRW[Any]] = {}
111
-
112
- for attr_name, attr in device.children():
113
- dot_path = f"{path_prefix}{attr_name}"
114
- if type(attr) is SignalRW:
115
- signals[dot_path] = attr
116
- attr_signals = walk_rw_signals(attr, path_prefix=dot_path + ".")
117
- signals.update(attr_signals)
118
- return signals
119
-
120
-
121
- def save_to_yaml(phases: Sequence[dict[str, Any]], save_path: str | Path) -> None:
122
- """Plan which serialises a phase or set of phases of SignalRWs to a yaml file.
123
-
124
- Parameters
125
- ----------
126
- phases : dict or list of dicts
127
- The values to save. Each item in the list is a seperate phase used when loading
128
- a device. In general this variable be the return value of `get_signal_values`.
129
-
130
- save_path : str
131
- Path of the yaml file to write to
132
-
133
- See Also
134
- --------
135
- :func:`ophyd_async.core.walk_rw_signals`
136
- :func:`ophyd_async.core.get_signal_values`
137
- :func:`ophyd_async.core.load_from_yaml`
138
- """
139
-
140
- yaml.add_representer(np.ndarray, ndarray_representer, Dumper=yaml.Dumper)
141
- yaml.add_multi_representer(
142
- BaseModel,
143
- pydantic_model_abstraction_representer,
144
- Dumper=yaml.Dumper,
145
- )
146
- yaml.add_multi_representer(Enum, enum_representer, Dumper=yaml.Dumper)
147
-
148
- with open(save_path, "w") as file:
149
- yaml.dump(phases, file)
150
-
151
-
152
- def load_from_yaml(save_path: str) -> Sequence[dict[str, Any]]:
153
- """Plan that returns a list of dicts with saved signal values from a yaml file.
154
-
155
- Parameters
156
- ----------
157
- save_path : str
158
- Path of the yaml file to load from
159
-
160
- See Also
161
- --------
162
- :func:`ophyd_async.core.save_to_yaml`
163
- :func:`ophyd_async.core.set_signal_values`
164
- """
165
- with open(save_path) as file:
166
- return yaml.full_load(file)
167
-
168
-
169
- def set_signal_values(
170
- signals: dict[str, SignalRW[Any]], values: Sequence[dict[str, Any]]
171
- ) -> Generator[Msg, None, None]:
172
- """Maps signals from a yaml file into device signals.
173
-
174
- ``values`` contains signal values in phases, which are loaded in sequentially
175
- into the provided signals, to ensure signals are set in the correct order.
176
-
177
- Parameters
178
- ----------
179
- signals : Dict[str, SignalRW[Any]]
180
- Dictionary of named signals to be updated if value found in values argument.
181
- Can be the output of :func:`walk_rw_signals()` for a device.
182
-
183
- values : Sequence[Dict[str, Any]]
184
- List of dictionaries of signal name and value pairs, if a signal matches
185
- the name of one in the signals argument, sets the signal to that value.
186
- The groups of signals are loaded in their list order.
187
- Can be the output of :func:`load_from_yaml()` for a yaml file.
188
-
189
- See Also
190
- --------
191
- :func:`ophyd_async.core.load_from_yaml`
192
- :func:`ophyd_async.core.walk_rw_signals`
193
- """
194
- # For each phase, set all the signals,
195
- # load them to the correct value and wait for the load to complete
196
- for phase_number, phase in enumerate(values):
197
- # Key is signal name
198
- for key, value in phase.items():
199
- # Skip ignored values
200
- if value is None:
201
- continue
202
-
203
- if key in signals:
204
- yield from abs_set(
205
- signals[key], value, group=f"load-phase{phase_number}"
206
- )
207
-
208
- yield from wait(f"load-phase{phase_number}")
209
-
210
-
211
- def load_device(device: Device, path: str):
212
- """Plan which loads PVs from a yaml file into a device.
213
-
214
- Parameters
215
- ----------
216
- device: Device
217
- The device to load PVs into
218
- path: str
219
- Path of the yaml file to load
220
-
221
- See Also
222
- --------
223
- :func:`ophyd_async.core.save_device`
224
- """
225
- values = load_from_yaml(path)
226
- signals_to_set = walk_rw_signals(device)
227
- yield from set_signal_values(signals_to_set, values)
228
-
229
-
230
- def all_at_once(values: dict[str, Any]) -> Sequence[dict[str, Any]]:
231
- """Sort all the values into a single phase so they are set all at once"""
232
- return [values]
233
-
234
-
235
- def save_device(
236
- device: Device,
237
- path: str,
238
- sorter: Callable[[dict[str, Any]], Sequence[dict[str, Any]]] = all_at_once,
239
- ignore: list[str] | None = None,
240
- ):
241
- """Plan that saves the state of all PV's on a device using a sorter.
242
-
243
- The default sorter assumes all saved PVs can be loaded at once, and therefore
244
- can be saved at one time, i.e. all PVs will appear on one list in the
245
- resulting yaml file.
246
-
247
- This can be a problem, because when the yaml is ingested with
248
- :func:`ophyd_async.core.load_device`, it will set all of those PVs at once.
249
- However, some PV's need to be set before others - this is device specific.
250
-
251
- Therefore, users should consider the order of device loading and write their
252
- own sorter algorithms accordingly.
253
-
254
- See :func:`ophyd_async.fastcs.panda.phase_sorter` for a valid implementation of the
255
- sorter.
256
-
257
- Parameters
258
- ----------
259
- device : Device
260
- The device whose PVs should be saved.
261
-
262
- path : str
263
- The path where the resulting yaml should be saved to
264
-
265
- sorter : Callable[[Dict[str, Any]], Sequence[Dict[str, Any]]]
266
-
267
- ignore : Optional[List[str]]
268
-
269
- See Also
270
- --------
271
- :func:`ophyd_async.core.load_device`
272
- """
273
- values = yield from get_signal_values(walk_rw_signals(device), ignore=ignore)
274
- save_to_yaml(sorter(values), path)
@@ -1,51 +0,0 @@
1
- import asyncio
2
-
3
- from ophyd_async.core import (
4
- DEFAULT_TIMEOUT,
5
- AsyncStatus,
6
- DetectorController,
7
- DetectorTrigger,
8
- TriggerInfo,
9
- )
10
- from ophyd_async.epics import adcore
11
-
12
-
13
- class SimController(DetectorController):
14
- def __init__(
15
- self,
16
- driver: adcore.ADBaseIO,
17
- good_states: frozenset[adcore.DetectorState] = adcore.DEFAULT_GOOD_STATES,
18
- ) -> None:
19
- self.driver = driver
20
- self.good_states = good_states
21
- self.frame_timeout: float
22
- self._arm_status: AsyncStatus | None = None
23
-
24
- def get_deadtime(self, exposure: float | None) -> float:
25
- return 0.002
26
-
27
- async def prepare(self, trigger_info: TriggerInfo):
28
- assert (
29
- trigger_info.trigger == DetectorTrigger.internal
30
- ), "fly scanning (i.e. external triggering) is not supported for this device"
31
- self.frame_timeout = (
32
- DEFAULT_TIMEOUT + await self.driver.acquire_time.get_value()
33
- )
34
- await asyncio.gather(
35
- self.driver.num_images.set(trigger_info.total_number_of_triggers),
36
- self.driver.image_mode.set(adcore.ImageMode.multiple),
37
- )
38
-
39
- async def arm(self):
40
- self._arm_status = await adcore.start_acquiring_driver_and_ensure_status(
41
- self.driver, good_states=self.good_states, timeout=self.frame_timeout
42
- )
43
-
44
- async def wait_for_idle(self):
45
- if self._arm_status:
46
- await self._arm_status
47
-
48
- async def disarm(self):
49
- # We can't use caput callback as we already used it in arm() and we can't have
50
- # 2 or they will deadlock
51
- await adcore.stop_busy_record(self.driver.acquire, False, timeout=1)
@@ -1,16 +0,0 @@
1
- from collections.abc import Sequence
2
- from typing import Any
3
-
4
-
5
- def phase_sorter(panda_signal_values: dict[str, Any]) -> Sequence[dict[str, Any]]:
6
- # Panda has two load phases. If the signal name ends in the string "UNITS",
7
- # it needs to be loaded first so put in first phase
8
- phase_1, phase_2 = {}, {}
9
-
10
- for key, value in panda_signal_values.items():
11
- if key.endswith("units"):
12
- phase_1[key] = value
13
- else:
14
- phase_2[key] = value
15
-
16
- return [phase_1, phase_2]
@@ -1,19 +0,0 @@
1
- from ._pattern_detector import (
2
- DATA_PATH,
3
- SUM_PATH,
4
- PatternDetector,
5
- PatternDetectorController,
6
- PatternDetectorWriter,
7
- PatternGenerator,
8
- )
9
- from ._sim_motor import SimMotor
10
-
11
- __all__ = [
12
- "DATA_PATH",
13
- "SUM_PATH",
14
- "PatternGenerator",
15
- "PatternDetector",
16
- "PatternDetectorController",
17
- "PatternDetectorWriter",
18
- "SimMotor",
19
- ]
File without changes
@@ -1,116 +0,0 @@
1
- ophyd_async/__init__.py,sha256=tEfgj45lRItQ-_u8SRFPM-mpBh3gWvHXr3emhiJJG_M,225
2
- ophyd_async/__main__.py,sha256=n_U4O9bgm97OuboUB_9eK7eFiwy8BZSgXJ0OzbE0DqU,481
3
- ophyd_async/_version.py,sha256=ZD22enHN3Ksu7M8yQMQARN-EdJEmdiwqlIccg7HRQDs,413
4
- ophyd_async/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- ophyd_async/core/__init__.py,sha256=aJP0ZNIVvfbodCpUQUHXidz18W02hI2nvYhFS4Ubq1g,4339
6
- ophyd_async/core/_detector.py,sha256=bKLekM2J3GzLXsKwe8qXQjNP_sAVsa8EtwFEWD-8MeA,14307
7
- ophyd_async/core/_device.py,sha256=ygXxDKiTO43qDnLeLzrKKyABwlrfGvSVii7PHyCIjHg,12074
8
- ophyd_async/core/_device_filler.py,sha256=Nw-DUyuXYpvt4mmCAQaNVA0LFBBaPK84ubZo3bR39Ak,11407
9
- ophyd_async/core/_device_save_loader.py,sha256=OViN9_LWNOLuajzrHDKYEqd5I47u5npQACdGceKcIGY,8375
10
- ophyd_async/core/_flyer.py,sha256=us5z6MNGCvIfgPDTmFTxNERSP37g0WVRkRD0Z2JiMgM,1701
11
- ophyd_async/core/_hdf_dataset.py,sha256=wW_OL8OYLGOsE01ny3hGaapOrxK7BzhWTxKgz8CIXK0,2492
12
- ophyd_async/core/_log.py,sha256=UbL9AtnHVUg7r9LofzgmuKEtBESy03usCp7ejmDltG4,3679
13
- ophyd_async/core/_mock_signal_backend.py,sha256=8Upnz6QrSigeDXemjZ-jB4sV2yIPUzid-6GOfTZ-7Io,2805
14
- ophyd_async/core/_mock_signal_utils.py,sha256=YeKjStClwp1etlmHMx1tb_VV1GjeFPg83Hkq7-YPkpg,5306
15
- ophyd_async/core/_protocol.py,sha256=MuYRqSfakdry9RllX7G9UTzp4lw3eDjtkdGPpnbNb34,4040
16
- ophyd_async/core/_providers.py,sha256=ff9ZT5-PZ6rhTTdE-q8w9l_k9DuZqLWLebsKZLeJ0Ds,7112
17
- ophyd_async/core/_readable.py,sha256=7FxqxhAT1wBQqOEivgnY731zA9QoK1Tt-ZGcH7GBOXM,10623
18
- ophyd_async/core/_signal.py,sha256=Mp8hmod7nBzWsf9N-Q4fWexRGF7hKtyQUAJlgAYUKKY,22358
19
- ophyd_async/core/_signal_backend.py,sha256=YWPgLSPbfPnWIUDHvP1ArCVK8zKXJxzzbloqQe_ucCI,5040
20
- ophyd_async/core/_soft_signal_backend.py,sha256=w9zzD4eoD9SsJpORXNSaFOLJrD6biYBbCSVAybLa_7k,5926
21
- ophyd_async/core/_status.py,sha256=OUKhblRQ4KU5PDsWbpvYduM7G60JMk1NqeV4eqyPtKc,5131
22
- ophyd_async/core/_table.py,sha256=tNu396gDGjpX1xUBQXgKI7aiDugaBl2McH_kVZPn_kQ,5535
23
- ophyd_async/core/_utils.py,sha256=wzzGL7yPAMuPueGOG1cpTgh0vho5YxI86m8SSX7Z9hw,9494
24
- ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- ophyd_async/epics/motor.py,sha256=pujJXV_vslvo3AxsVySTAEoFuduuv5Hp6sz8aRvIbeQ,8792
26
- ophyd_async/epics/signal.py,sha256=hJCGIIWjRVhjEHkeL1I_oPEaaN7dDFKmm7G7ZmgoTYQ,219
27
- ophyd_async/epics/adaravis/__init__.py,sha256=u979_9nQTYB0TvDOTXFN4qMrbDP8-xQFfXYMGzLVBo4,207
28
- ophyd_async/epics/adaravis/_aravis.py,sha256=XBuLQBZYj2tptY39bVzXjl6t-ZpPwqrUOwpR54l-hSo,1952
29
- ophyd_async/epics/adaravis/_aravis_controller.py,sha256=t4vuMsQ_67tNsAYPFFtBKq3YIHhRnK08DwPzi8Am_-k,2831
30
- ophyd_async/epics/adaravis/_aravis_io.py,sha256=KCfylSNGN7rC6W4uJDCVtaQ4-o5_FR_bTyTDXnhmMt4,1603
31
- ophyd_async/epics/adcore/__init__.py,sha256=3wMOyFGaq1X61LqK4iY4pq-m_BjhOgYZD2-mNCAjpzk,1086
32
- ophyd_async/epics/adcore/_core_io.py,sha256=ZQjRLdpFMVS9kwEm5LAh60pxiy7XWyYtc2TzEvCEVYM,6076
33
- ophyd_async/epics/adcore/_core_logic.py,sha256=_RJELnIeoAceqVoLolCnhBH0XAbTKxuCzH9QJ1gqOs0,3606
34
- ophyd_async/epics/adcore/_hdf_writer.py,sha256=eWT9SH7uegf9rpCWRmVCZTsOxF1drPaOAMmoXm99mVk,7215
35
- ophyd_async/epics/adcore/_single_trigger.py,sha256=7SzmadatWk4zXIweRIhVX5odc__ZZKuGicL7vlW0JbY,1208
36
- ophyd_async/epics/adcore/_utils.py,sha256=MZBKeSPIRzyo6f84MpzPp28KwOLa9qgrkMIFc618wOE,3932
37
- ophyd_async/epics/adkinetix/__init__.py,sha256=cvnwOqbvEENf70eFp6bPGwayP0u14UTIhs3WiZEcF_Q,262
38
- ophyd_async/epics/adkinetix/_kinetix.py,sha256=JsQVc4d7lRCnVObJlM775hHLfp3rYRSRgOoIyRvrSek,1184
39
- ophyd_async/epics/adkinetix/_kinetix_controller.py,sha256=LyK-CWkEV1l_RVhCOHf2lLgo1FRIkDCa4P8JnAGZ4us,1701
40
- ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=D72HNtob74SnhBa3Zsbp37MhqS6kdrCPac7pnTlm0PQ,910
41
- ophyd_async/epics/adpilatus/__init__.py,sha256=daimScOCCMHR2eb8VbezHOcGOkd6uIRZQiyeTQsaAx4,308
42
- ophyd_async/epics/adpilatus/_pilatus.py,sha256=AbWfxEds8ESB73kRXz56FzRPYqy67Ue0m11HRaNUqZY,1751
43
- ophyd_async/epics/adpilatus/_pilatus_controller.py,sha256=eBZnNPHJosYAMdD-efLNgAmTYaqONLJ3qKX-2RW13fg,2676
44
- ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=upIc5mr8RMmPjQMZcG7-Y8C9a5nPl91OTDjZ5JYDVIc,738
45
- ophyd_async/epics/adsimdetector/__init__.py,sha256=t3crUgTEvVJGI8o6FsfN42k0A-l4v9ZBwXIYtixoE-M,128
46
- ophyd_async/epics/adsimdetector/_sim.py,sha256=jzsPJdcwdciR2mVPbvg9KhGHWWGNDQwK5TwPcS7_tco,1009
47
- ophyd_async/epics/adsimdetector/_sim_controller.py,sha256=lxBCJtREDOySrpLNl7_9DbuIw2IhRpSOBK_CvJ5XBs4,1677
48
- ophyd_async/epics/advimba/__init__.py,sha256=l0ElP3Zyff_pzrTRdj9oUO9xigCfmzo3pMVjstlVsJY,320
49
- ophyd_async/epics/advimba/_vimba.py,sha256=E_RJ0uJQt-RWAY7uFTNkHaOdGYS5sa7ZbRgAe6ngXTA,1125
50
- ophyd_async/epics/advimba/_vimba_controller.py,sha256=Ej7irxTab9cfjmqz4G4Zxv3CjhJw_eRmIb3E62YWh6g,2226
51
- ophyd_async/epics/advimba/_vimba_io.py,sha256=F3KUzMN-GMe637za-iRVGGTt8v9F1a79fRcl3MCkfXA,1864
52
- ophyd_async/epics/core/__init__.py,sha256=8NoQxEEc2Ny_L9nrD2fnGSf_2gJr1wCR1LwUeLNcIJo,588
53
- ophyd_async/epics/core/_aioca.py,sha256=iQWiHWYbMJLa7qeBrCz4_e16Y8A-NYYi6oYNi8oOFVY,11617
54
- ophyd_async/epics/core/_epics_connector.py,sha256=n1FlQYui8HdobPxaX3VAflrzi2UT7QCe3cFasssmVLw,1789
55
- ophyd_async/epics/core/_epics_device.py,sha256=kshNiKQhevsL2OZXa-r093L_sQGvGK_0J4PWVLg3Eqw,437
56
- ophyd_async/epics/core/_p4p.py,sha256=S6zXXApRF0454aOcxUI_cd7Y7tXiOnss_ODhjjk0PMo,14691
57
- ophyd_async/epics/core/_pvi_connector.py,sha256=Rjc8g3Rdny_O-4JxhoCpD4L7XWIRq-lnGHXKpsIUrSU,3621
58
- ophyd_async/epics/core/_signal.py,sha256=jHdMXV1-0bd7PC8XV32Sso1xgubZVDhWFNsWV-UuamQ,4642
59
- ophyd_async/epics/core/_util.py,sha256=6CCWDfp54WeBIJdGjg_YBVZTKoNjponWyykMmLPrj7U,1820
60
- ophyd_async/epics/demo/__init__.py,sha256=wCrgemEo-zR4TTvaqCKnQ-AIUHorotV5jhftbq1tXz0,1368
61
- ophyd_async/epics/demo/_mover.py,sha256=uyg60SlL7k2C3KA_05EUFOlDe6RB5QBbw7QGs969ItQ,3571
62
- ophyd_async/epics/demo/_sensor.py,sha256=ATlS5jejoHzpgjHhEienEmRguTzZ7DGvzZkuPCHY49U,1040
63
- ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
64
- ophyd_async/epics/demo/sensor.db,sha256=AstyG9E0R4KZBz2FZQSrV_QlrfLoU6M2cvYc15Lf548,553
65
- ophyd_async/epics/eiger/__init__.py,sha256=b3Tt4pVLk23Giyj50R4e94d2MxWDDmNHWhWwNq2jlaw,221
66
- ophyd_async/epics/eiger/_eiger.py,sha256=hkMsjVwrzDcE1u5BRIQtn8RSR2e0b1JMpDvuIONoNaI,1133
67
- ophyd_async/epics/eiger/_eiger_controller.py,sha256=u7T5--97VLm3pbz3E3Lxumb7hzKLzUN18wDtRj_AVZA,2343
68
- ophyd_async/epics/eiger/_eiger_io.py,sha256=0iimpsa8TI2mJ8hTolQByIhdeKltUGcg6aEkY5GwIyQ,1806
69
- ophyd_async/epics/eiger/_odin_io.py,sha256=3E33ysvMlf8t0bbSVPnzUrvPgUwA7491uoViWpivpf8,4153
70
- ophyd_async/epics/testing/__init__.py,sha256=terWt7TtNaxk4dCdAGQs-7HM2Z7Vcy34eX6kcngDbi8,498
71
- ophyd_async/epics/testing/_example_ioc.py,sha256=C0fDqsjpCbD_XaqZ6ti_t-SJTr2vsjt356PJqK1WC4Y,3377
72
- ophyd_async/epics/testing/_utils.py,sha256=-D6aKJydhM-n6290DyyKlnwCHFkbQ-j4tu5AD2JjWZ0,2443
73
- ophyd_async/epics/testing/test_records.db,sha256=zbucdyUKYOTQAkF-u8dei08VCrrX7LlDyQd1zKTLQ-w,3078
74
- ophyd_async/epics/testing/test_records_pva.db,sha256=NyceNGaCZXNYaXjH2VLhvKl8Z-L6dwfE_kYZKqdIcTU,4054
75
- ophyd_async/fastcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
- ophyd_async/fastcs/core.py,sha256=kykwmblZfj9xfakL8FTAqmPmPA8qRbQ90OS3d8WLyto,342
77
- ophyd_async/fastcs/odin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
- ophyd_async/fastcs/panda/__init__.py,sha256=_o7n7ckoTM6hTRHpLphpL7r_9sADE59MRNM0gq_ut2o,980
79
- ophyd_async/fastcs/panda/_block.py,sha256=STQo6NJAqIVfxyMf-2pxINPyr9_nKtXSdicp92a25xo,1709
80
- ophyd_async/fastcs/panda/_control.py,sha256=61vcJMjYQiUGAM5J0SfkfthFs7U28m9Pe9mgmGGf0-w,1021
81
- ophyd_async/fastcs/panda/_hdf_panda.py,sha256=WdgWgdrU2yT4keH70VG-ZBVOmT-IpKVyukEuKk7QnJs,1049
82
- ophyd_async/fastcs/panda/_table.py,sha256=5YyAfsl3H7kxH3bDjUKHuH9DyrWQmAn9dv-v0NYzFNo,2289
83
- ophyd_async/fastcs/panda/_trigger.py,sha256=forImtdnDnaZ0KKhqSxCqwHWXq13SJ4mn9wdM4yqNLY,3056
84
- ophyd_async/fastcs/panda/_utils.py,sha256=NdvzdKy0SOG1eCVMQo_nwRXpBo0wyi6lM5Xw3HvssOw,508
85
- ophyd_async/fastcs/panda/_writer.py,sha256=wDN6uWX1ENofmI3JBXJ7_CGooI7WsZP-JJQrRiSc6sM,6000
86
- ophyd_async/plan_stubs/__init__.py,sha256=wjpEj_BoBZJ9x2fhUPY6BzWMqyYH96JrBlJvV7frdN4,524
87
- ophyd_async/plan_stubs/_ensure_connected.py,sha256=uoqfAzghjifdfD_JM860TvMvj9T2Y12nKPvtI5l6zZc,1021
88
- ophyd_async/plan_stubs/_fly.py,sha256=WxghBAHsF-8xFrILCm44jeHIu9udLhm-tj4JXd9kZjY,6208
89
- ophyd_async/plan_stubs/_nd_attributes.py,sha256=TVfy3bhnrLFBXZ6b2bREBj0LzEviEGzuGvgWK3I7tII,2198
90
- ophyd_async/sim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- ophyd_async/sim/demo/__init__.py,sha256=JKWFnHqmFuRRMvvU0aBuclke3OdF0iq89yvHEd4J7Bg,371
92
- ophyd_async/sim/demo/_sim_motor.py,sha256=hZAoZniLd-Fh5Ru9v6TyFNJHrQB_l9ljM04vByuz_Ls,3665
93
- ophyd_async/sim/demo/_pattern_detector/__init__.py,sha256=o_dSZDIl_CyS3YPSNKpGiQiR9UaC4cNzZ8_ByEN9dIk,402
94
- ophyd_async/sim/demo/_pattern_detector/_pattern_detector.py,sha256=R-UbcxHLFfCK9tBryKZN5Dit0IjYeJGP-QKV2ssKFoQ,1275
95
- ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py,sha256=HqlKNgjd_9pjy6pc74xdJ7JtV1Iko6cNxB2aZReJozw,1999
96
- ophyd_async/sim/demo/_pattern_detector/_pattern_detector_writer.py,sha256=nQOks4EK1Ax0Ib1pkCrmJPF8Jqr7tPusMnby-HGUnP0,1370
97
- ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py,sha256=gP0Q1-1p_3KOH7mWZc5m-8OUEx_jb7SAdRXcpleRqX4,7096
98
- ophyd_async/sim/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
- ophyd_async/tango/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
- ophyd_async/tango/core/__init__.py,sha256=pBslTNkIt22-g-CDbG9N7pKLQVJqFe6DYXHFFYJZIo8,905
101
- ophyd_async/tango/core/_base_device.py,sha256=IN1HF1DOf9W9_FhVlzWyuU58gBFu86rYOD1vDZ_a7Wc,4717
102
- ophyd_async/tango/core/_signal.py,sha256=5ks0dyzCX66cV9R_CnmM949H1RzNQH3Q1XIUhHQCOaI,6421
103
- ophyd_async/tango/core/_tango_readable.py,sha256=c6xVH56oBp5o3C3y3PuHA5MftvmjKm20BBvrgsTO260,913
104
- ophyd_async/tango/core/_tango_transport.py,sha256=DVTdLu8C19k-QzYaKUzFK2WMbaSd6dIO77k99ugD8U4,28990
105
- ophyd_async/tango/demo/__init__.py,sha256=_j-UicTnckuIBp8PnieFMOMnLFGivnaKdmo9o0hYtzc,256
106
- ophyd_async/tango/demo/_counter.py,sha256=efBqrFj6ejzDh1aggtPXpn1iub1zB4XocRvHqBEiwcs,1105
107
- ophyd_async/tango/demo/_detector.py,sha256=0wwk7Y-Dl9QF1YsCIU_BxqI6-PQ40qN_0gknrYBkxsY,1292
108
- ophyd_async/tango/demo/_mover.py,sha256=c5whb380th1eCThs35ftW1bfNRyYRmcofg7xUp6zvV8,2837
109
- ophyd_async/tango/demo/_tango/__init__.py,sha256=FfONT7vM49nNo3a1Lv-LcMZO9EHv6bv91yY-RnxIib4,85
110
- ophyd_async/tango/demo/_tango/_servers.py,sha256=MwkkoZWJQm_cgafCBBXeQfwyAiOgU8cE90_uNfcdcGA,2916
111
- ophyd_async-0.8.0a6.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
112
- ophyd_async-0.8.0a6.dist-info/METADATA,sha256=s3TuMMjVrTqzvsxEL-YjmsaSA41eN1hqy16TDEPMPCM,6657
113
- ophyd_async-0.8.0a6.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
114
- ophyd_async-0.8.0a6.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
115
- ophyd_async-0.8.0a6.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
116
- ophyd_async-0.8.0a6.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- ophyd-async = ophyd_async.__main__:main
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes