ophyd-async 0.7.0__py3-none-any.whl → 0.8.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 (92) hide show
  1. ophyd_async/_version.py +2 -2
  2. ophyd_async/core/__init__.py +34 -9
  3. ophyd_async/core/_detector.py +5 -10
  4. ophyd_async/core/_device.py +170 -68
  5. ophyd_async/core/_device_filler.py +269 -0
  6. ophyd_async/core/_device_save_loader.py +6 -7
  7. ophyd_async/core/_mock_signal_backend.py +35 -40
  8. ophyd_async/core/_mock_signal_utils.py +25 -16
  9. ophyd_async/core/_protocol.py +28 -8
  10. ophyd_async/core/_readable.py +133 -134
  11. ophyd_async/core/_signal.py +219 -163
  12. ophyd_async/core/_signal_backend.py +131 -64
  13. ophyd_async/core/_soft_signal_backend.py +131 -194
  14. ophyd_async/core/_status.py +22 -6
  15. ophyd_async/core/_table.py +102 -100
  16. ophyd_async/core/_utils.py +143 -32
  17. ophyd_async/epics/adaravis/_aravis_controller.py +2 -2
  18. ophyd_async/epics/adaravis/_aravis_io.py +8 -6
  19. ophyd_async/epics/adcore/_core_io.py +5 -7
  20. ophyd_async/epics/adcore/_core_logic.py +3 -1
  21. ophyd_async/epics/adcore/_hdf_writer.py +2 -2
  22. ophyd_async/epics/adcore/_single_trigger.py +6 -10
  23. ophyd_async/epics/adcore/_utils.py +15 -10
  24. ophyd_async/epics/adkinetix/__init__.py +2 -1
  25. ophyd_async/epics/adkinetix/_kinetix_controller.py +6 -3
  26. ophyd_async/epics/adkinetix/_kinetix_io.py +4 -5
  27. ophyd_async/epics/adpilatus/_pilatus_controller.py +2 -2
  28. ophyd_async/epics/adpilatus/_pilatus_io.py +3 -4
  29. ophyd_async/epics/adsimdetector/_sim_controller.py +2 -2
  30. ophyd_async/epics/advimba/__init__.py +4 -1
  31. ophyd_async/epics/advimba/_vimba_controller.py +6 -3
  32. ophyd_async/epics/advimba/_vimba_io.py +8 -9
  33. ophyd_async/epics/core/__init__.py +26 -0
  34. ophyd_async/epics/core/_aioca.py +323 -0
  35. ophyd_async/epics/core/_epics_connector.py +53 -0
  36. ophyd_async/epics/core/_epics_device.py +13 -0
  37. ophyd_async/epics/core/_p4p.py +383 -0
  38. ophyd_async/epics/core/_pvi_connector.py +91 -0
  39. ophyd_async/epics/core/_signal.py +171 -0
  40. ophyd_async/epics/core/_util.py +61 -0
  41. ophyd_async/epics/demo/_mover.py +4 -5
  42. ophyd_async/epics/demo/_sensor.py +14 -13
  43. ophyd_async/epics/eiger/_eiger.py +1 -2
  44. ophyd_async/epics/eiger/_eiger_controller.py +7 -2
  45. ophyd_async/epics/eiger/_eiger_io.py +3 -5
  46. ophyd_async/epics/eiger/_odin_io.py +5 -5
  47. ophyd_async/epics/motor.py +4 -5
  48. ophyd_async/epics/signal.py +11 -0
  49. ophyd_async/epics/testing/__init__.py +24 -0
  50. ophyd_async/epics/testing/_example_ioc.py +105 -0
  51. ophyd_async/epics/testing/_utils.py +78 -0
  52. ophyd_async/epics/testing/test_records.db +152 -0
  53. ophyd_async/epics/testing/test_records_pva.db +177 -0
  54. ophyd_async/fastcs/core.py +9 -0
  55. ophyd_async/fastcs/panda/__init__.py +4 -4
  56. ophyd_async/fastcs/panda/_block.py +18 -13
  57. ophyd_async/fastcs/panda/_control.py +3 -5
  58. ophyd_async/fastcs/panda/_hdf_panda.py +5 -19
  59. ophyd_async/fastcs/panda/_table.py +30 -52
  60. ophyd_async/fastcs/panda/_trigger.py +8 -8
  61. ophyd_async/fastcs/panda/_writer.py +2 -5
  62. ophyd_async/plan_stubs/_ensure_connected.py +20 -13
  63. ophyd_async/plan_stubs/_fly.py +2 -2
  64. ophyd_async/plan_stubs/_nd_attributes.py +5 -4
  65. ophyd_async/py.typed +0 -0
  66. ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py +1 -2
  67. ophyd_async/sim/demo/_sim_motor.py +3 -4
  68. ophyd_async/tango/__init__.py +0 -45
  69. ophyd_async/tango/{signal → core}/__init__.py +9 -6
  70. ophyd_async/tango/core/_base_device.py +132 -0
  71. ophyd_async/tango/{signal → core}/_signal.py +42 -53
  72. ophyd_async/tango/{base_devices → core}/_tango_readable.py +3 -4
  73. ophyd_async/tango/{signal → core}/_tango_transport.py +38 -40
  74. ophyd_async/tango/demo/_counter.py +12 -23
  75. ophyd_async/tango/demo/_mover.py +13 -13
  76. {ophyd_async-0.7.0.dist-info → ophyd_async-0.8.0.dist-info}/METADATA +52 -55
  77. ophyd_async-0.8.0.dist-info/RECORD +116 -0
  78. {ophyd_async-0.7.0.dist-info → ophyd_async-0.8.0.dist-info}/WHEEL +1 -1
  79. ophyd_async/epics/pvi/__init__.py +0 -3
  80. ophyd_async/epics/pvi/_pvi.py +0 -338
  81. ophyd_async/epics/signal/__init__.py +0 -21
  82. ophyd_async/epics/signal/_aioca.py +0 -378
  83. ophyd_async/epics/signal/_common.py +0 -57
  84. ophyd_async/epics/signal/_epics_transport.py +0 -34
  85. ophyd_async/epics/signal/_p4p.py +0 -518
  86. ophyd_async/epics/signal/_signal.py +0 -114
  87. ophyd_async/tango/base_devices/__init__.py +0 -4
  88. ophyd_async/tango/base_devices/_base_device.py +0 -225
  89. ophyd_async-0.7.0.dist-info/RECORD +0 -108
  90. {ophyd_async-0.7.0.dist-info → ophyd_async-0.8.0.dist-info}/LICENSE +0 -0
  91. {ophyd_async-0.7.0.dist-info → ophyd_async-0.8.0.dist-info}/entry_points.txt +0 -0
  92. {ophyd_async-0.7.0.dist-info → ophyd_async-0.8.0.dist-info}/top_level.txt +0 -0
@@ -1,225 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import (
4
- TypeVar,
5
- get_args,
6
- get_origin,
7
- get_type_hints,
8
- )
9
-
10
- from ophyd_async.core import (
11
- DEFAULT_TIMEOUT,
12
- Device,
13
- Signal,
14
- )
15
- from ophyd_async.tango.signal import (
16
- TangoSignalBackend,
17
- __tango_signal_auto,
18
- make_backend,
19
- )
20
- from tango import DeviceProxy as DeviceProxy
21
- from tango.asyncio import DeviceProxy as AsyncDeviceProxy
22
-
23
- T = TypeVar("T")
24
-
25
-
26
- class TangoDevice(Device):
27
- """
28
- General class for TangoDevices. Extends Device to provide attributes for Tango
29
- devices.
30
-
31
- Parameters
32
- ----------
33
- trl: str
34
- Tango resource locator, typically of the device server.
35
- device_proxy: Optional[Union[AsyncDeviceProxy, SyncDeviceProxy]]
36
- Asynchronous or synchronous DeviceProxy object for the device. If not provided,
37
- an asynchronous DeviceProxy object will be created using the trl and awaited
38
- when the device is connected.
39
- """
40
-
41
- trl: str = ""
42
- proxy: DeviceProxy | None = None
43
- _polling: tuple[bool, float, float | None, float | None] = (False, 0.1, None, 0.1)
44
- _signal_polling: dict[str, tuple[bool, float, float, float]] = {}
45
- _poll_only_annotated_signals: bool = True
46
-
47
- def __init__(
48
- self,
49
- trl: str | None = None,
50
- device_proxy: DeviceProxy | None = None,
51
- name: str = "",
52
- ) -> None:
53
- self.trl = trl if trl else ""
54
- self.proxy = device_proxy
55
- tango_create_children_from_annotations(self)
56
- super().__init__(name=name)
57
-
58
- def set_trl(self, trl: str):
59
- """Set the Tango resource locator."""
60
- if not isinstance(trl, str):
61
- raise ValueError("TRL must be a string.")
62
- self.trl = trl
63
-
64
- async def connect(
65
- self,
66
- mock: bool = False,
67
- timeout: float = DEFAULT_TIMEOUT,
68
- force_reconnect: bool = False,
69
- ):
70
- if self.trl and self.proxy is None:
71
- self.proxy = await AsyncDeviceProxy(self.trl)
72
- elif self.proxy and not self.trl:
73
- self.trl = self.proxy.name()
74
-
75
- # Set the trl of the signal backends
76
- for child in self.children():
77
- if isinstance(child[1], Signal):
78
- if isinstance(child[1]._backend, TangoSignalBackend): # noqa: SLF001
79
- resource_name = child[0].lstrip("_")
80
- read_trl = f"{self.trl}/{resource_name}"
81
- child[1]._backend.set_trl(read_trl, read_trl) # noqa: SLF001
82
-
83
- if self.proxy is not None:
84
- self.register_signals()
85
- await _fill_proxy_entries(self)
86
-
87
- # set_name should be called again to propagate the new signal names
88
- self.set_name(self.name)
89
-
90
- # Set the polling configuration
91
- if self._polling[0]:
92
- for child in self.children():
93
- child_type = type(child[1])
94
- if issubclass(child_type, Signal):
95
- if isinstance(child[1]._backend, TangoSignalBackend): # noqa: SLF001 # type: ignore
96
- child[1]._backend.set_polling(*self._polling) # noqa: SLF001 # type: ignore
97
- child[1]._backend.allow_events(False) # noqa: SLF001 # type: ignore
98
- if self._signal_polling:
99
- for signal_name, polling in self._signal_polling.items():
100
- if hasattr(self, signal_name):
101
- attr = getattr(self, signal_name)
102
- if isinstance(attr._backend, TangoSignalBackend): # noqa: SLF001
103
- attr._backend.set_polling(*polling) # noqa: SLF001
104
- attr._backend.allow_events(False) # noqa: SLF001
105
-
106
- await super().connect(mock=mock, timeout=timeout)
107
-
108
- # Users can override this method to register new signals
109
- def register_signals(self):
110
- pass
111
-
112
-
113
- def tango_polling(
114
- polling: tuple[float, float, float]
115
- | dict[str, tuple[float, float, float]]
116
- | None = None,
117
- signal_polling: dict[str, tuple[float, float, float]] | None = None,
118
- ):
119
- """
120
- Class decorator to configure polling for Tango devices.
121
-
122
- This decorator allows for the configuration of both device-level and signal-level
123
- polling for Tango devices. Polling is useful for device servers that do not support
124
- event-driven updates.
125
-
126
- Parameters
127
- ----------
128
- polling : Optional[Union[Tuple[float, float, float],
129
- Dict[str, Tuple[float, float, float]]]], optional
130
- Device-level polling configuration as a tuple of three floats representing the
131
- polling interval, polling timeout, and polling delay. Alternatively,
132
- a dictionary can be provided to specify signal-level polling configurations
133
- directly.
134
- signal_polling : Optional[Dict[str, Tuple[float, float, float]]], optional
135
- Signal-level polling configuration as a dictionary where keys are signal names
136
- and values are tuples of three floats representing the polling interval, polling
137
- timeout, and polling delay.
138
- """
139
- if isinstance(polling, dict):
140
- signal_polling = polling
141
- polling = None
142
-
143
- def decorator(cls):
144
- if polling is not None:
145
- cls._polling = (True, *polling)
146
- if signal_polling is not None:
147
- cls._signal_polling = {k: (True, *v) for k, v in signal_polling.items()}
148
- return cls
149
-
150
- return decorator
151
-
152
-
153
- def tango_create_children_from_annotations(
154
- device: TangoDevice, included_optional_fields: tuple[str, ...] = ()
155
- ):
156
- """Initialize blocks at __init__ of `device`."""
157
- for name, device_type in get_type_hints(type(device)).items():
158
- if name in ("_name", "parent"):
159
- continue
160
-
161
- # device_type, is_optional = _strip_union(device_type)
162
- # if is_optional and name not in included_optional_fields:
163
- # continue
164
- #
165
- # is_device_vector, device_type = _strip_device_vector(device_type)
166
- # if is_device_vector:
167
- # n_device_vector = DeviceVector()
168
- # setattr(device, name, n_device_vector)
169
-
170
- # else:
171
- origin = get_origin(device_type)
172
- origin = origin if origin else device_type
173
-
174
- if issubclass(origin, Signal):
175
- type_args = get_args(device_type)
176
- datatype = type_args[0] if type_args else None
177
- backend = make_backend(datatype=datatype, device_proxy=device.proxy)
178
- setattr(device, name, origin(name=name, backend=backend))
179
-
180
- elif issubclass(origin, Device) or isinstance(origin, Device):
181
- assert callable(origin), f"{origin} is not callable."
182
- setattr(device, name, origin())
183
-
184
-
185
- async def _fill_proxy_entries(device: TangoDevice):
186
- if device.proxy is None:
187
- raise RuntimeError(f"Device proxy is not connected for {device.name}")
188
- proxy_trl = device.trl
189
- children = [name.lstrip("_") for name, _ in device.children()]
190
- proxy_attributes = list(device.proxy.get_attribute_list())
191
- proxy_commands = list(device.proxy.get_command_list())
192
- combined = proxy_attributes + proxy_commands
193
-
194
- for name in combined:
195
- if name not in children:
196
- full_trl = f"{proxy_trl}/{name}"
197
- try:
198
- auto_signal = await __tango_signal_auto(
199
- trl=full_trl, device_proxy=device.proxy
200
- )
201
- setattr(device, name, auto_signal)
202
- except RuntimeError as e:
203
- if "Commands with different in and out dtypes" in str(e):
204
- print(
205
- f"Skipping {name}. Commands with different in and out dtypes"
206
- f" are not supported."
207
- )
208
- continue
209
- raise e
210
-
211
-
212
- # def _strip_union(field: T | T) -> tuple[T, bool]:
213
- # if get_origin(field) is Union:
214
- # args = get_args(field)
215
- # is_optional = type(None) in args
216
- # for arg in args:
217
- # if arg is not type(None):
218
- # return arg, is_optional
219
- # return field, False
220
- #
221
- #
222
- # def _strip_device_vector(field: type[Device]) -> tuple[bool, type[Device]]:
223
- # if get_origin(field) is DeviceVector:
224
- # return True, get_args(field)[0]
225
- # return False, field
@@ -1,108 +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=akvr8ObxvMF-aaLBzW41juT4_KL3BjQUrjbwkIuQXMk,411
4
- ophyd_async/core/__init__.py,sha256=KxYHMQxnbA9J00pSCQKmu80RP8CgEbbTeSh5xu99iKY,3911
5
- ophyd_async/core/_detector.py,sha256=5QtOcBc3lA_RD6bK4gEG9EPhA5XvlDPvUN72N_cZQK4,14284
6
- ophyd_async/core/_device.py,sha256=uT0tXZhl4m-IkV-Hb1QEeN1OXEFS7xZUQwwOh4vG3Tw,7952
7
- ophyd_async/core/_device_save_loader.py,sha256=o1BXzLZJA2a3NoHXrvYQ6jhaak4QB_CdH1hX1hFQZK8,8450
8
- ophyd_async/core/_flyer.py,sha256=us5z6MNGCvIfgPDTmFTxNERSP37g0WVRkRD0Z2JiMgM,1701
9
- ophyd_async/core/_hdf_dataset.py,sha256=wW_OL8OYLGOsE01ny3hGaapOrxK7BzhWTxKgz8CIXK0,2492
10
- ophyd_async/core/_log.py,sha256=UbL9AtnHVUg7r9LofzgmuKEtBESy03usCp7ejmDltG4,3679
11
- ophyd_async/core/_mock_signal_backend.py,sha256=Ga3ajwnePjV9oN-ZJUkUh6U7um1suY4CbMVYNfCmGF0,2882
12
- ophyd_async/core/_mock_signal_utils.py,sha256=HKAqQPqSUC9hbvXkrxKzrY-FlDbxj1FtbMB_zABOdog,4809
13
- ophyd_async/core/_protocol.py,sha256=GNcnsFfHmvrsXJ9l25l6KXTaUWsAh7MGu0y2f6rsRdA,3413
14
- ophyd_async/core/_providers.py,sha256=ff9ZT5-PZ6rhTTdE-q8w9l_k9DuZqLWLebsKZLeJ0Ds,7112
15
- ophyd_async/core/_readable.py,sha256=mbKTlnjRa7ez7zRHiXvii7EGxmym8FeP5kcnB8luSo0,9097
16
- ophyd_async/core/_signal.py,sha256=q4ttdHuzhS5Z2vmc9wwFnx2JrHG8ztYcjzhnbn2CFDM,19914
17
- ophyd_async/core/_signal_backend.py,sha256=PNR7GrzWp9mTZaHSFRhPuNAEWeaYb919YJ3rV3l70sY,2851
18
- ophyd_async/core/_soft_signal_backend.py,sha256=Z9WCMDbrTrHuFdab0fyHm5CVlVZHvkMXofT6yW-6rPE,7593
19
- ophyd_async/core/_status.py,sha256=7jaxc2WkY8LCTwfEsjNMqxLKuWfiFWmEentmp7oSU5s,4594
20
- ophyd_async/core/_table.py,sha256=qHXCSAMSDfDVNAPi2oPIeHepi0FgYM7sQjNeFysPVKg,5497
21
- ophyd_async/core/_utils.py,sha256=QYH4wMQFJWkE21eS_IX-7uwuvJ1VTeEpghe8trxyvvU,5949
22
- ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- ophyd_async/epics/motor.py,sha256=mOrFiTt6WrXJM4d5Stksrxc_j9Vcd3L3w1QLCX_K0zM,8752
24
- ophyd_async/epics/adaravis/__init__.py,sha256=u979_9nQTYB0TvDOTXFN4qMrbDP8-xQFfXYMGzLVBo4,207
25
- ophyd_async/epics/adaravis/_aravis.py,sha256=XBuLQBZYj2tptY39bVzXjl6t-ZpPwqrUOwpR54l-hSo,1952
26
- ophyd_async/epics/adaravis/_aravis_controller.py,sha256=wzigo8fL5zl8XymRahdzI_kmbRg-WflKgzzGrV-cW5A,2845
27
- ophyd_async/epics/adaravis/_aravis_io.py,sha256=c6esqJO_86NTv3Mo9BKmQD74kGYLpCXelxcEGZcbKa0,1583
28
- ophyd_async/epics/adcore/__init__.py,sha256=3wMOyFGaq1X61LqK4iY4pq-m_BjhOgYZD2-mNCAjpzk,1086
29
- ophyd_async/epics/adcore/_core_io.py,sha256=s0vqTOzQ94IZU0z2K3fgTYEaOtwWHgk--WViAgKqXVY,6086
30
- ophyd_async/epics/adcore/_core_logic.py,sha256=JjrSmKErRFSv1C98or1Upwi01k3NWDRMi2fPHVWMmWw,3561
31
- ophyd_async/epics/adcore/_hdf_writer.py,sha256=4ezsPHHt2OWj9H6t4yk-mV9jkwv5vmIRrq5zGsfpGRc,7225
32
- ophyd_async/epics/adcore/_single_trigger.py,sha256=NaTOHKDD0nzAPPrva-4dR-h102khpJ3cPKqEmS3HzY8,1168
33
- ophyd_async/epics/adcore/_utils.py,sha256=MRgLwfta-1Dl45aJP_yLScAcxVll0WWR7GGCv3qNqZY,3902
34
- ophyd_async/epics/adkinetix/__init__.py,sha256=QEft12PURied6LRzjw-NhUmngjAm1XNA3k-5o5aMXDQ,216
35
- ophyd_async/epics/adkinetix/_kinetix.py,sha256=JsQVc4d7lRCnVObJlM775hHLfp3rYRSRgOoIyRvrSek,1184
36
- ophyd_async/epics/adkinetix/_kinetix_controller.py,sha256=UHdMSrKmJhq0A5wrnHHkqFZEDiIYnImYMYSA5n-szkQ,1754
37
- ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=AbCoYliAobU3I6z3NaswQnExwGTgV458zF3uwkBEQPc,893
38
- ophyd_async/epics/adpilatus/__init__.py,sha256=daimScOCCMHR2eb8VbezHOcGOkd6uIRZQiyeTQsaAx4,308
39
- ophyd_async/epics/adpilatus/_pilatus.py,sha256=AbWfxEds8ESB73kRXz56FzRPYqy67Ue0m11HRaNUqZY,1751
40
- ophyd_async/epics/adpilatus/_pilatus_controller.py,sha256=K0xzw1hrOdSRb_TlTIZK7t5uPyC1ivbSuhb1GwnzLX0,2742
41
- ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=WB_N2RRpcFCFI6i57PRqjIdpK6hzLpWxn71cWUHUZnc,722
42
- ophyd_async/epics/adsimdetector/__init__.py,sha256=t3crUgTEvVJGI8o6FsfN42k0A-l4v9ZBwXIYtixoE-M,128
43
- ophyd_async/epics/adsimdetector/_sim.py,sha256=jzsPJdcwdciR2mVPbvg9KhGHWWGNDQwK5TwPcS7_tco,1009
44
- ophyd_async/epics/adsimdetector/_sim_controller.py,sha256=R_Ya3HoKsUo69WjofcoT9Oy08Pi1zPjDoUfePM0SXOw,1743
45
- ophyd_async/epics/advimba/__init__.py,sha256=GSnFWGPNJsCJZ-Tgyv-L38Smwzp2bWC64U_4uD2TLvs,198
46
- ophyd_async/epics/advimba/_vimba.py,sha256=E_RJ0uJQt-RWAY7uFTNkHaOdGYS5sa7ZbRgAe6ngXTA,1125
47
- ophyd_async/epics/advimba/_vimba_controller.py,sha256=F3zZEgAYKvACkcKtxE7TKqHO8f-SMSALq0_DFB_OUXA,2279
48
- ophyd_async/epics/advimba/_vimba_io.py,sha256=nf1BdIWey4RR7KuqyZhH6X5yB8Msg0oOtkVLOuwn6Uc,1843
49
- ophyd_async/epics/demo/__init__.py,sha256=wCrgemEo-zR4TTvaqCKnQ-AIUHorotV5jhftbq1tXz0,1368
50
- ophyd_async/epics/demo/_mover.py,sha256=2bNfaLZzP1MMzsaLgDEQLf9_uWeOR9fcYzKiGVM2Ze8,3531
51
- ophyd_async/epics/demo/_sensor.py,sha256=8OyFAsB3EXMzrQreOIg_TGHrseUtI5rxXpfwwUaC76I,1165
52
- ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
53
- ophyd_async/epics/demo/sensor.db,sha256=AstyG9E0R4KZBz2FZQSrV_QlrfLoU6M2cvYc15Lf548,553
54
- ophyd_async/epics/eiger/__init__.py,sha256=b3Tt4pVLk23Giyj50R4e94d2MxWDDmNHWhWwNq2jlaw,221
55
- ophyd_async/epics/eiger/_eiger.py,sha256=_t0E6s0IVcV1IQcnxclJM5ZNOP74N_bakFO_pItO1VA,1171
56
- ophyd_async/epics/eiger/_eiger_controller.py,sha256=Yq5pNHmeGfubDZFoCn0mtOHgxF-byIVAwCN1h2C_YIY,2285
57
- ophyd_async/epics/eiger/_eiger_io.py,sha256=MlvLWEZ-n-Lf7y9e_WVoPFdw5YoHVWw_8LxSLajnkk8,1818
58
- ophyd_async/epics/eiger/_odin_io.py,sha256=8EQcnGLJFsgRFtwFIG3PV5vH6Fjg2xqjExZ6RqIb6ew,4170
59
- ophyd_async/epics/pvi/__init__.py,sha256=ZvJO69ApL7N9rWT9-hD-JZMC_KsHxgeEqxe-01jNUVw,137
60
- ophyd_async/epics/pvi/_pvi.py,sha256=lbgZRR_Wl1gZWEjmoTzVIOv_1il4ulLU7UCDDetoZ-0,12136
61
- ophyd_async/epics/signal/__init__.py,sha256=cJGvTnJxHNzpWyWIYXU4UGMoz3uqZ88UVXNvG-TGngo,441
62
- ophyd_async/epics/signal/_aioca.py,sha256=vmAAywEzLjbL40V7P5MmxhQhII6E70zdizNk9TGnoTI,12703
63
- ophyd_async/epics/signal/_common.py,sha256=BFz1leFG5VLeDZc8Ndni4GBqFUzvYVs0iIYUiLHS5AE,1624
64
- ophyd_async/epics/signal/_epics_transport.py,sha256=lMOOg8E1JQu1MDWtp6zFqSdhO5gNKcPn_uYXyWUxofw,824
65
- ophyd_async/epics/signal/_p4p.py,sha256=l8BcU6fbxs4CN9Hio3VNN5n6WaCx9AP8TfQT-xnaevM,17631
66
- ophyd_async/epics/signal/_signal.py,sha256=76a8V0qIjV6VKfh-3-SLcD3GZF3dd_2lQt_6mTKe_bA,3204
67
- ophyd_async/fastcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- ophyd_async/fastcs/odin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
- ophyd_async/fastcs/panda/__init__.py,sha256=4ct9vmLafK0fSWQ_HjxmT3jRhWz_8CAFpKStgah2RJY,1022
70
- ophyd_async/fastcs/panda/_block.py,sha256=sqUWLpxIapXd7-jh4l4KtLN4Ex_b1T5PnfVrXM3bswI,1756
71
- ophyd_async/fastcs/panda/_control.py,sha256=JfZVf-Xl3NYg6uLYZ6iL-n0NlyPT3eut_p0FWh17c7s,1119
72
- ophyd_async/fastcs/panda/_hdf_panda.py,sha256=nCGXOiVbvQnVRftEF5PNFeOoLO85F2leg0DVl4MDJFw,1526
73
- ophyd_async/fastcs/panda/_table.py,sha256=GLwAkepKaAHloJN57UFGrEfp8GkruY743ADIGQhNQ4M,3085
74
- ophyd_async/fastcs/panda/_trigger.py,sha256=32nGv_g7vucHEl4yRzJtAlRKLH0wrEuEKyqqE2URPXs,3032
75
- ophyd_async/fastcs/panda/_utils.py,sha256=NdvzdKy0SOG1eCVMQo_nwRXpBo0wyi6lM5Xw3HvssOw,508
76
- ophyd_async/fastcs/panda/_writer.py,sha256=r1rdzzBal_9Osh0vCX0KbvXPU9JXiRbIh0mFatgUlfk,6162
77
- ophyd_async/plan_stubs/__init__.py,sha256=wjpEj_BoBZJ9x2fhUPY6BzWMqyYH96JrBlJvV7frdN4,524
78
- ophyd_async/plan_stubs/_ensure_connected.py,sha256=6Q7_UWQ-UQ0awe6mnN4PdNCAOGRm4GZR9X2M-ghQCeI,711
79
- ophyd_async/plan_stubs/_fly.py,sha256=WJherYDc4_SUGmtJ4QhJNz7b_HDzJncQ2_0RanQtiVI,6222
80
- ophyd_async/plan_stubs/_nd_attributes.py,sha256=w26G2k3FU1nv-s3Bytwuu_K3lBrbdRYlaJ2TMLgUu7w,2141
81
- ophyd_async/sim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- ophyd_async/sim/demo/__init__.py,sha256=JKWFnHqmFuRRMvvU0aBuclke3OdF0iq89yvHEd4J7Bg,371
83
- ophyd_async/sim/demo/_sim_motor.py,sha256=13mswR9ybIHD00BFlmrqR7c4v_3in5FBv33cVfu8Uyc,3623
84
- ophyd_async/sim/demo/_pattern_detector/__init__.py,sha256=o_dSZDIl_CyS3YPSNKpGiQiR9UaC4cNzZ8_ByEN9dIk,402
85
- ophyd_async/sim/demo/_pattern_detector/_pattern_detector.py,sha256=R-UbcxHLFfCK9tBryKZN5Dit0IjYeJGP-QKV2ssKFoQ,1275
86
- ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py,sha256=B1XtzRsZM-8_8TTyUHUiEsqaHjLglEUMIhZMwzOXiPo,2037
87
- ophyd_async/sim/demo/_pattern_detector/_pattern_detector_writer.py,sha256=nQOks4EK1Ax0Ib1pkCrmJPF8Jqr7tPusMnby-HGUnP0,1370
88
- ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py,sha256=gP0Q1-1p_3KOH7mWZc5m-8OUEx_jb7SAdRXcpleRqX4,7096
89
- ophyd_async/sim/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- ophyd_async/tango/__init__.py,sha256=sy1mNNe1H5obPhuontHCy6oKzj4f7B6gFprDCGkVL48,923
91
- ophyd_async/tango/base_devices/__init__.py,sha256=fbn1-rfK8MCErpSmjAJuQioDikbjOobd4sDvAB9Xupw,157
92
- ophyd_async/tango/base_devices/_base_device.py,sha256=OZqzqLleL9cepq60z-g7KDCTOrK2F0rL1oRdovt984M,8201
93
- ophyd_async/tango/base_devices/_tango_readable.py,sha256=J-XeR2fmQU5RTdsNhRvzNPJD8xZRVJ6-qXt09vfpVtI,951
94
- ophyd_async/tango/demo/__init__.py,sha256=_j-UicTnckuIBp8PnieFMOMnLFGivnaKdmo9o0hYtzc,256
95
- ophyd_async/tango/demo/_counter.py,sha256=7tz84_uEYBaI3hoFWGXf6UdXK435D7R-eMqT_8U8lpY,1262
96
- ophyd_async/tango/demo/_detector.py,sha256=0wwk7Y-Dl9QF1YsCIU_BxqI6-PQ40qN_0gknrYBkxsY,1292
97
- ophyd_async/tango/demo/_mover.py,sha256=VTsEZVrY5p8-lQrEsfIV3UDBXbFxyuvwvilq69ySaKo,2659
98
- ophyd_async/tango/demo/_tango/__init__.py,sha256=FfONT7vM49nNo3a1Lv-LcMZO9EHv6bv91yY-RnxIib4,85
99
- ophyd_async/tango/demo/_tango/_servers.py,sha256=MwkkoZWJQm_cgafCBBXeQfwyAiOgU8cE90_uNfcdcGA,2916
100
- ophyd_async/tango/signal/__init__.py,sha256=bM2ETdQgPQHUij9pQXwKggcj1-f2_RZxquRk8uiF67E,812
101
- ophyd_async/tango/signal/_signal.py,sha256=2QoqS4drR_Qf1WYpqykNXP5HWr_RU3c4D3Z028er6TM,7106
102
- ophyd_async/tango/signal/_tango_transport.py,sha256=7zui5Pq347v9DPqfjLSaRW_vORTkflE_IQLBRs-jLoY,28988
103
- ophyd_async-0.7.0.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
104
- ophyd_async-0.7.0.dist-info/METADATA,sha256=cndLjrpwfhjAY4JfRtcec4GqlZjRELynHIsAQhyK6pY,6770
105
- ophyd_async-0.7.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
106
- ophyd_async-0.7.0.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
107
- ophyd_async-0.7.0.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
108
- ophyd_async-0.7.0.dist-info/RECORD,,