ophyd-async 0.7.0a1__py3-none-any.whl → 0.8.0a3__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 (83) hide show
  1. ophyd_async/_version.py +2 -2
  2. ophyd_async/core/__init__.py +30 -9
  3. ophyd_async/core/_detector.py +5 -10
  4. ophyd_async/core/_device.py +146 -67
  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 +32 -40
  8. ophyd_async/core/_mock_signal_utils.py +22 -16
  9. ophyd_async/core/_protocol.py +28 -8
  10. ophyd_async/core/_readable.py +133 -134
  11. ophyd_async/core/_signal.py +140 -152
  12. ophyd_async/core/_signal_backend.py +131 -64
  13. ophyd_async/core/_soft_signal_backend.py +125 -194
  14. ophyd_async/core/_status.py +22 -6
  15. ophyd_async/core/_table.py +97 -100
  16. ophyd_async/core/_utils.py +79 -18
  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/_hdf_writer.py +2 -2
  21. ophyd_async/epics/adcore/_single_trigger.py +4 -9
  22. ophyd_async/epics/adcore/_utils.py +15 -10
  23. ophyd_async/epics/adkinetix/__init__.py +2 -1
  24. ophyd_async/epics/adkinetix/_kinetix_controller.py +6 -3
  25. ophyd_async/epics/adkinetix/_kinetix_io.py +4 -5
  26. ophyd_async/epics/adpilatus/_pilatus_controller.py +2 -2
  27. ophyd_async/epics/adpilatus/_pilatus_io.py +3 -4
  28. ophyd_async/epics/adsimdetector/_sim_controller.py +2 -2
  29. ophyd_async/epics/advimba/__init__.py +4 -1
  30. ophyd_async/epics/advimba/_vimba_controller.py +6 -3
  31. ophyd_async/epics/advimba/_vimba_io.py +8 -9
  32. ophyd_async/epics/core/__init__.py +26 -0
  33. ophyd_async/epics/core/_aioca.py +323 -0
  34. ophyd_async/epics/core/_epics_connector.py +53 -0
  35. ophyd_async/epics/core/_epics_device.py +13 -0
  36. ophyd_async/epics/core/_p4p.py +382 -0
  37. ophyd_async/epics/core/_pvi_connector.py +92 -0
  38. ophyd_async/epics/core/_signal.py +171 -0
  39. ophyd_async/epics/core/_util.py +61 -0
  40. ophyd_async/epics/demo/_mover.py +4 -5
  41. ophyd_async/epics/demo/_sensor.py +14 -13
  42. ophyd_async/epics/eiger/_eiger.py +1 -2
  43. ophyd_async/epics/eiger/_eiger_controller.py +1 -1
  44. ophyd_async/epics/eiger/_eiger_io.py +3 -5
  45. ophyd_async/epics/eiger/_odin_io.py +5 -5
  46. ophyd_async/epics/motor.py +4 -5
  47. ophyd_async/epics/signal.py +11 -0
  48. ophyd_async/fastcs/core.py +9 -0
  49. ophyd_async/fastcs/panda/__init__.py +4 -4
  50. ophyd_async/fastcs/panda/_block.py +23 -11
  51. ophyd_async/fastcs/panda/_control.py +3 -5
  52. ophyd_async/fastcs/panda/_hdf_panda.py +5 -19
  53. ophyd_async/fastcs/panda/_table.py +29 -51
  54. ophyd_async/fastcs/panda/_trigger.py +8 -8
  55. ophyd_async/fastcs/panda/_writer.py +4 -7
  56. ophyd_async/plan_stubs/_ensure_connected.py +3 -1
  57. ophyd_async/plan_stubs/_fly.py +2 -2
  58. ophyd_async/plan_stubs/_nd_attributes.py +5 -4
  59. ophyd_async/py.typed +0 -0
  60. ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py +1 -2
  61. ophyd_async/sim/demo/_sim_motor.py +3 -4
  62. ophyd_async/tango/__init__.py +2 -4
  63. ophyd_async/tango/base_devices/_base_device.py +76 -144
  64. ophyd_async/tango/demo/_counter.py +8 -18
  65. ophyd_async/tango/demo/_mover.py +5 -6
  66. ophyd_async/tango/signal/__init__.py +2 -4
  67. ophyd_async/tango/signal/_signal.py +29 -50
  68. ophyd_async/tango/signal/_tango_transport.py +38 -40
  69. {ophyd_async-0.7.0a1.dist-info → ophyd_async-0.8.0a3.dist-info}/METADATA +8 -12
  70. ophyd_async-0.8.0a3.dist-info/RECORD +112 -0
  71. {ophyd_async-0.7.0a1.dist-info → ophyd_async-0.8.0a3.dist-info}/WHEEL +1 -1
  72. ophyd_async/epics/pvi/__init__.py +0 -3
  73. ophyd_async/epics/pvi/_pvi.py +0 -338
  74. ophyd_async/epics/signal/__init__.py +0 -21
  75. ophyd_async/epics/signal/_aioca.py +0 -378
  76. ophyd_async/epics/signal/_common.py +0 -57
  77. ophyd_async/epics/signal/_epics_transport.py +0 -34
  78. ophyd_async/epics/signal/_p4p.py +0 -518
  79. ophyd_async/epics/signal/_signal.py +0 -114
  80. ophyd_async-0.7.0a1.dist-info/RECORD +0 -108
  81. {ophyd_async-0.7.0a1.dist-info → ophyd_async-0.8.0a3.dist-info}/LICENSE +0 -0
  82. {ophyd_async-0.7.0a1.dist-info → ophyd_async-0.8.0a3.dist-info}/entry_points.txt +0 -0
  83. {ophyd_async-0.7.0a1.dist-info → ophyd_async-0.8.0a3.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,6 @@ import asyncio
2
2
  import functools
3
3
  import time
4
4
  from abc import abstractmethod
5
- from asyncio import CancelledError
6
5
  from collections.abc import Callable, Coroutine
7
6
  from enum import Enum
8
7
  from typing import Any, TypeVar, cast
@@ -11,12 +10,11 @@ import numpy as np
11
10
  from bluesky.protocols import Descriptor, Reading
12
11
 
13
12
  from ophyd_async.core import (
14
- DEFAULT_TIMEOUT,
15
13
  AsyncStatus,
14
+ Callback,
16
15
  NotConnected,
17
- ReadingValueCallback,
18
16
  SignalBackend,
19
- T,
17
+ SignalDatatypeT,
20
18
  get_dtype,
21
19
  get_unique,
22
20
  wait_for_connection,
@@ -121,7 +119,7 @@ class TangoProxy:
121
119
  """indicates, that this trl already subscribed"""
122
120
 
123
121
  @abstractmethod
124
- def subscribe_callback(self, callback: ReadingValueCallback | None):
122
+ def subscribe_callback(self, callback: Callback | None):
125
123
  """subscribe tango CHANGE event to callback"""
126
124
 
127
125
  @abstractmethod
@@ -140,7 +138,7 @@ class TangoProxy:
140
138
 
141
139
 
142
140
  class AttributeProxy(TangoProxy):
143
- _callback: ReadingValueCallback | None = None
141
+ _callback: Callback | None = None
144
142
  _eid: int | None = None
145
143
  _poll_task: asyncio.Task | None = None
146
144
  _abs_change: float | None = None
@@ -178,6 +176,7 @@ class AttributeProxy(TangoProxy):
178
176
  async def put(
179
177
  self, value: object | None, wait: bool = True, timeout: float | None = None
180
178
  ) -> AsyncStatus | None:
179
+ # TODO: remove the timeout from this as it is handled at the signal level
181
180
  if wait:
182
181
  try:
183
182
 
@@ -236,7 +235,7 @@ class AttributeProxy(TangoProxy):
236
235
  def has_subscription(self) -> bool:
237
236
  return bool(self._callback)
238
237
 
239
- def subscribe_callback(self, callback: ReadingValueCallback | None):
238
+ def subscribe_callback(self, callback: Callback | None):
240
239
  # If the attribute supports events, then we can subscribe to them
241
240
  # If the callback is not a callable, then we raise an error
242
241
  if callback is not None and not callable(callback):
@@ -283,21 +282,20 @@ class AttributeProxy(TangoProxy):
283
282
  if self._callback is not None:
284
283
  # Call the callback with the last reading
285
284
  try:
286
- self._callback(self._last_reading, self._last_reading["value"])
285
+ self._callback(self._last_reading)
287
286
  except TypeError:
288
287
  pass
289
288
  self._callback = None
290
289
 
291
290
  def _event_processor(self, event):
292
291
  if not event.err:
293
- value = event.attr_value.value
294
292
  reading = Reading(
295
- value=value,
293
+ value=event.attr_value.value,
296
294
  timestamp=event.get_date().totime(),
297
295
  alarm_severity=event.attr_value.quality,
298
296
  )
299
297
  if self._callback is not None:
300
- self._callback(reading, value)
298
+ self._callback(reading)
301
299
 
302
300
  async def poll(self):
303
301
  """
@@ -310,7 +308,7 @@ class AttributeProxy(TangoProxy):
310
308
  flag = 0
311
309
  # Initial reading
312
310
  if self._callback is not None:
313
- self._callback(last_reading, last_reading["value"])
311
+ self._callback(last_reading)
314
312
  except Exception as e:
315
313
  raise RuntimeError(f"Could not poll the attribute: {e}") from e
316
314
 
@@ -325,7 +323,7 @@ class AttributeProxy(TangoProxy):
325
323
  diff = abs(reading["value"] - last_reading["value"])
326
324
  if self._abs_change is not None and diff >= abs(self._abs_change):
327
325
  if self._callback is not None:
328
- self._callback(reading, reading["value"])
326
+ self._callback(reading)
329
327
  flag = 0
330
328
 
331
329
  elif (
@@ -333,13 +331,13 @@ class AttributeProxy(TangoProxy):
333
331
  and diff >= self._rel_change * abs(last_reading["value"])
334
332
  ):
335
333
  if self._callback is not None:
336
- self._callback(reading, reading["value"])
334
+ self._callback(reading)
337
335
  flag = 0
338
336
 
339
337
  else:
340
338
  flag = (flag + 1) % 4
341
339
  if flag == 0 and self._callback is not None:
342
- self._callback(reading, reading["value"])
340
+ self._callback(reading)
343
341
 
344
342
  last_reading = reading.copy()
345
343
  if self._callback is None:
@@ -358,13 +356,13 @@ class AttributeProxy(TangoProxy):
358
356
  reading["value"], last_reading["value"]
359
357
  ):
360
358
  if self._callback is not None:
361
- self._callback(reading, reading["value"])
359
+ self._callback(reading)
362
360
  else:
363
361
  break
364
362
  else:
365
363
  if reading["value"] != last_reading["value"]:
366
364
  if self._callback is not None:
367
- self._callback(reading, reading["value"])
365
+ self._callback(reading)
368
366
  else:
369
367
  break
370
368
  last_reading = reading.copy()
@@ -390,7 +388,7 @@ class AttributeProxy(TangoProxy):
390
388
  class CommandProxy(TangoProxy):
391
389
  _last_reading: Reading = Reading(value=None, timestamp=0, alarm_severity=0)
392
390
 
393
- def subscribe_callback(self, callback: ReadingValueCallback | None) -> None:
391
+ def subscribe_callback(self, callback: Callback | None) -> None:
394
392
  raise NotImplementedError("Cannot subscribe to commands")
395
393
 
396
394
  def unsubscribe_callback(self) -> None:
@@ -584,14 +582,14 @@ def get_trl_descriptor(
584
582
 
585
583
 
586
584
  async def get_tango_trl(
587
- full_trl: str, device_proxy: DeviceProxy | TangoProxy | None
585
+ full_trl: str, device_proxy: DeviceProxy | TangoProxy | None, timeout: float
588
586
  ) -> TangoProxy:
589
587
  if isinstance(device_proxy, TangoProxy):
590
588
  return device_proxy
591
589
  device_trl, trl_name = full_trl.rsplit("/", 1)
592
590
  trl_name = trl_name.lower()
593
591
  if device_proxy is None:
594
- device_proxy = await AsyncDeviceProxy(device_trl)
592
+ device_proxy = await AsyncDeviceProxy(device_trl, timeout=timeout)
595
593
 
596
594
  # all attributes can be always accessible with low register
597
595
  if isinstance(device_proxy, DeviceProxy):
@@ -620,16 +618,15 @@ async def get_tango_trl(
620
618
  raise RuntimeError(f"{trl_name} cannot be found in {device_proxy.name()}")
621
619
 
622
620
 
623
- class TangoSignalBackend(SignalBackend[T]):
621
+ class TangoSignalBackend(SignalBackend[SignalDatatypeT]):
624
622
  def __init__(
625
623
  self,
626
- datatype: type[T] | None,
624
+ datatype: type[SignalDatatypeT] | None,
627
625
  read_trl: str = "",
628
626
  write_trl: str = "",
629
627
  device_proxy: DeviceProxy | None = None,
630
628
  ):
631
629
  self.device_proxy = device_proxy
632
- self.datatype = datatype
633
630
  self.read_trl = read_trl
634
631
  self.write_trl = write_trl
635
632
  self.proxies: dict[str, TangoProxy | DeviceProxy | None] = {
@@ -646,6 +643,7 @@ class TangoSignalBackend(SignalBackend[T]):
646
643
  )
647
644
  self.support_events: bool = True
648
645
  self.status: AsyncStatus | None = None
646
+ super().__init__(datatype)
649
647
 
650
648
  @classmethod
651
649
  def datatype_allowed(cls, dtype: Any) -> bool:
@@ -659,14 +657,14 @@ class TangoSignalBackend(SignalBackend[T]):
659
657
  write_trl: self.device_proxy,
660
658
  }
661
659
 
662
- def source(self, name: str) -> str:
663
- return self.read_trl
660
+ def source(self, name: str, read: bool) -> str:
661
+ return self.read_trl if read else self.write_trl
664
662
 
665
- async def _connect_and_store_config(self, trl: str) -> None:
663
+ async def _connect_and_store_config(self, trl: str, timeout: float) -> None:
666
664
  if not trl:
667
665
  raise RuntimeError(f"trl not set for {self}")
668
666
  try:
669
- self.proxies[trl] = await get_tango_trl(trl, self.proxies[trl])
667
+ self.proxies[trl] = await get_tango_trl(trl, self.proxies[trl], timeout)
670
668
  if self.proxies[trl] is None:
671
669
  raise NotConnected(f"Not connected to {trl}")
672
670
  # Pyright does not believe that self.proxies[trl] is not None despite
@@ -674,27 +672,27 @@ class TangoSignalBackend(SignalBackend[T]):
674
672
  await self.proxies[trl].connect() # type: ignore
675
673
  self.trl_configs[trl] = await self.proxies[trl].get_config() # type: ignore
676
674
  self.proxies[trl].support_events = self.support_events # type: ignore
677
- except CancelledError as ce:
678
- raise NotConnected(f"Could not connect to {trl}") from ce
675
+ except TimeoutError as ce:
676
+ raise NotConnected(f"tango://{trl}") from ce
679
677
 
680
- async def connect(self, timeout: float = DEFAULT_TIMEOUT) -> None:
678
+ async def connect(self, timeout: float) -> None:
681
679
  if not self.read_trl:
682
680
  raise RuntimeError(f"trl not set for {self}")
683
681
  if self.read_trl != self.write_trl:
684
682
  # Different, need to connect both
685
683
  await wait_for_connection(
686
- read_trl=self._connect_and_store_config(self.read_trl),
687
- write_trl=self._connect_and_store_config(self.write_trl),
684
+ read_trl=self._connect_and_store_config(self.read_trl, timeout),
685
+ write_trl=self._connect_and_store_config(self.write_trl, timeout),
688
686
  )
689
687
  else:
690
688
  # The same, so only need to connect one
691
- await self._connect_and_store_config(self.read_trl)
689
+ await self._connect_and_store_config(self.read_trl, timeout)
692
690
  self.proxies[self.read_trl].set_polling(*self._polling) # type: ignore
693
691
  self.descriptor = get_trl_descriptor(
694
692
  self.datatype, self.read_trl, self.trl_configs
695
693
  )
696
694
 
697
- async def put(self, value: T | None, wait=True, timeout=None) -> None:
695
+ async def put(self, value: SignalDatatypeT | None, wait=True, timeout=None) -> None:
698
696
  if self.proxies[self.write_trl] is None:
699
697
  raise NotConnected(f"Not connected to {self.write_trl}")
700
698
  self.status = None
@@ -704,28 +702,28 @@ class TangoSignalBackend(SignalBackend[T]):
704
702
  async def get_datakey(self, source: str) -> Descriptor:
705
703
  return self.descriptor
706
704
 
707
- async def get_reading(self) -> Reading:
705
+ async def get_reading(self) -> Reading[SignalDatatypeT]:
708
706
  if self.proxies[self.read_trl] is None:
709
707
  raise NotConnected(f"Not connected to {self.read_trl}")
710
708
  return await self.proxies[self.read_trl].get_reading() # type: ignore
711
709
 
712
- async def get_value(self) -> T:
710
+ async def get_value(self) -> SignalDatatypeT:
713
711
  if self.proxies[self.read_trl] is None:
714
712
  raise NotConnected(f"Not connected to {self.read_trl}")
715
713
  proxy = self.proxies[self.read_trl]
716
714
  if proxy is None:
717
715
  raise NotConnected(f"Not connected to {self.read_trl}")
718
- return cast(T, await proxy.get())
716
+ return cast(SignalDatatypeT, await proxy.get())
719
717
 
720
- async def get_setpoint(self) -> T:
718
+ async def get_setpoint(self) -> SignalDatatypeT:
721
719
  if self.proxies[self.write_trl] is None:
722
720
  raise NotConnected(f"Not connected to {self.write_trl}")
723
721
  proxy = self.proxies[self.write_trl]
724
722
  if proxy is None:
725
723
  raise NotConnected(f"Not connected to {self.write_trl}")
726
- return cast(T, await proxy.get_w_value())
724
+ return cast(SignalDatatypeT, await proxy.get_w_value())
727
725
 
728
- def set_callback(self, callback: ReadingValueCallback | None) -> None:
726
+ def set_callback(self, callback: Callback | None) -> None:
729
727
  if self.proxies[self.read_trl] is None:
730
728
  raise NotConnected(f"Not connected to {self.read_trl}")
731
729
  if self.support_events is False and self._polling[0] is False:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ophyd-async
3
- Version: 0.7.0a1
3
+ Version: 0.8.0a3
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
@@ -41,12 +41,12 @@ Requires-Python: >=3.10
41
41
  Description-Content-Type: text/markdown
42
42
  License-File: LICENSE
43
43
  Requires-Dist: networkx >=2.0
44
- Requires-Dist: numpy <2.0.0
44
+ Requires-Dist: numpy
45
45
  Requires-Dist: packaging
46
46
  Requires-Dist: pint
47
- Requires-Dist: bluesky >=1.13.0a3
48
- Requires-Dist: event-model
49
- Requires-Dist: p4p
47
+ Requires-Dist: bluesky >=1.13
48
+ Requires-Dist: event-model >=1.22.1
49
+ Requires-Dist: p4p >=4.2.0a3
50
50
  Requires-Dist: pyyaml
51
51
  Requires-Dist: colorlog
52
52
  Requires-Dist: pydantic >=2.0
@@ -58,10 +58,6 @@ Requires-Dist: ophyd-async[pva] ; extra == 'dev'
58
58
  Requires-Dist: ophyd-async[sim] ; extra == 'dev'
59
59
  Requires-Dist: ophyd-async[ca] ; extra == 'dev'
60
60
  Requires-Dist: ophyd-async[tango] ; extra == 'dev'
61
- Requires-Dist: black ; extra == 'dev'
62
- Requires-Dist: flake8 ; extra == 'dev'
63
- Requires-Dist: flake8-isort ; extra == 'dev'
64
- Requires-Dist: Flake8-pyproject ; extra == 'dev'
65
61
  Requires-Dist: inflection ; extra == 'dev'
66
62
  Requires-Dist: ipython ; extra == 'dev'
67
63
  Requires-Dist: ipywidgets ; extra == 'dev'
@@ -104,9 +100,9 @@ Requires-Dist: pytango >=10.0.0 ; extra == 'tango'
104
100
  [![CI](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml/badge.svg)](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml)
105
101
  [![Coverage](https://codecov.io/gh/bluesky/ophyd-async/branch/main/graph/badge.svg)](https://codecov.io/gh/bluesky/ophyd-async)
106
102
  [![PyPI](https://img.shields.io/pypi/v/ophyd-async.svg)](https://pypi.org/project/ophyd-async)
107
- [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
103
+ [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://choosealicense.com/licenses/bsd-3-clause)
108
104
 
109
- # ophyd-async
105
+ # ![ophyd-async](https://raw.githubusercontent.com/bluesky/ophyd-async/main/docs/images/ophyd-async-logo.svg)
110
106
 
111
107
  Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango.
112
108
 
@@ -116,7 +112,7 @@ Asynchronous Bluesky hardware abstraction code, compatible with control systems
116
112
  | Documentation | <https://bluesky.github.io/ophyd-async> |
117
113
  | Releases | <https://github.com/bluesky/ophyd-async/releases> |
118
114
 
119
- Ophyd-async is a Python library for asynchronously interfacing with hardware, intended to
115
+ Ophyd-async is a Python library for asynchronously interfacing with hardware, intended to
120
116
  be used as an abstraction layer that enables experiment orchestration and data acquisition code to operate above the specifics of particular devices and control
121
117
  systems.
122
118
 
@@ -0,0 +1,112 @@
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=7HtuNUHmvgApFDFxIXlpPtAL7GP25idINU4Fd3AJSWE,413
4
+ ophyd_async/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ ophyd_async/core/__init__.py,sha256=0UUwdcqeXFVxGDBLIbZkA5cZx4rbqdud6n4rCfcrpIY,4253
6
+ ophyd_async/core/_detector.py,sha256=bKLekM2J3GzLXsKwe8qXQjNP_sAVsa8EtwFEWD-8MeA,14307
7
+ ophyd_async/core/_device.py,sha256=AJvqPRfN4LOSVptPC9hyyabH2gBUFMLMNpugWsP501E,11019
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=E8YMLJJyAt8UAwX-5PMQCuAuHuVVs5ko7vJtY5qR9P8,2656
14
+ ophyd_async/core/_mock_signal_utils.py,sha256=i7CCFeB6JkTpdAe32Jtap2nrvFL-gbz_3zrnlK7Lbow,5139
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=4Umj1EXgz89ZO1Ej-b5TEkmr72pdw3Jbyk-nIsYIYpo,20011
19
+ ophyd_async/core/_signal_backend.py,sha256=YWPgLSPbfPnWIUDHvP1ArCVK8zKXJxzzbloqQe_ucCI,5040
20
+ ophyd_async/core/_soft_signal_backend.py,sha256=VBemKbSM397zhtjm6zLKozhJ8cY3XhDu42OagBc_d64,5663
21
+ ophyd_async/core/_status.py,sha256=OUKhblRQ4KU5PDsWbpvYduM7G60JMk1NqeV4eqyPtKc,5131
22
+ ophyd_async/core/_table.py,sha256=ZToBVmAPDmhrVDgjx0f8SErxVdKhvGdGwQ-fXxGCtN8,5386
23
+ ophyd_async/core/_utils.py,sha256=agOw4xTv2NFPfywDUkY_NYT2GNXI6p7GGs08z0H51jk,7548
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=JjrSmKErRFSv1C98or1Upwi01k3NWDRMi2fPHVWMmWw,3561
34
+ ophyd_async/epics/adcore/_hdf_writer.py,sha256=eWT9SH7uegf9rpCWRmVCZTsOxF1drPaOAMmoXm99mVk,7215
35
+ ophyd_async/epics/adcore/_single_trigger.py,sha256=tu1kZ1zsqgL0PM3ibmnxabNUA3gXaluQ6JW5C093tYc,1177
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=318lw_dGWnckgyQ1f4K8QeX_KVOD4idzWX8sx2jbnyk,11625
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=Ap_WVWCa4Eb44i50bxjy8qS-n8AUKTaLbFNq5eZZk0w,14619
57
+ ophyd_async/epics/core/_pvi_connector.py,sha256=D4IM_SiNkUEe01DsstTX-s2XEgT3X-jspGmZePSCYZE,3577
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=GCoZ40BGCFkxDUrgYk9_CwzSr86l-CALw9nUILJVaZA,2251
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/fastcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
+ ophyd_async/fastcs/core.py,sha256=kykwmblZfj9xfakL8FTAqmPmPA8qRbQ90OS3d8WLyto,342
72
+ ophyd_async/fastcs/odin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ ophyd_async/fastcs/panda/__init__.py,sha256=_o7n7ckoTM6hTRHpLphpL7r_9sADE59MRNM0gq_ut2o,980
74
+ ophyd_async/fastcs/panda/_block.py,sha256=STQo6NJAqIVfxyMf-2pxINPyr9_nKtXSdicp92a25xo,1709
75
+ ophyd_async/fastcs/panda/_control.py,sha256=61vcJMjYQiUGAM5J0SfkfthFs7U28m9Pe9mgmGGf0-w,1021
76
+ ophyd_async/fastcs/panda/_hdf_panda.py,sha256=WdgWgdrU2yT4keH70VG-ZBVOmT-IpKVyukEuKk7QnJs,1049
77
+ ophyd_async/fastcs/panda/_table.py,sha256=8XkfpdZETflzoZE4qB5Y5ySi8JFxxZulDszVccgY_w4,2293
78
+ ophyd_async/fastcs/panda/_trigger.py,sha256=forImtdnDnaZ0KKhqSxCqwHWXq13SJ4mn9wdM4yqNLY,3056
79
+ ophyd_async/fastcs/panda/_utils.py,sha256=NdvzdKy0SOG1eCVMQo_nwRXpBo0wyi6lM5Xw3HvssOw,508
80
+ ophyd_async/fastcs/panda/_writer.py,sha256=wDN6uWX1ENofmI3JBXJ7_CGooI7WsZP-JJQrRiSc6sM,6000
81
+ ophyd_async/plan_stubs/__init__.py,sha256=wjpEj_BoBZJ9x2fhUPY6BzWMqyYH96JrBlJvV7frdN4,524
82
+ ophyd_async/plan_stubs/_ensure_connected.py,sha256=MIn-aWKiaGI0k7ac-_Ca40uouoGsyRX1gAHY-A-ifGI,750
83
+ ophyd_async/plan_stubs/_fly.py,sha256=WxghBAHsF-8xFrILCm44jeHIu9udLhm-tj4JXd9kZjY,6208
84
+ ophyd_async/plan_stubs/_nd_attributes.py,sha256=TVfy3bhnrLFBXZ6b2bREBj0LzEviEGzuGvgWK3I7tII,2198
85
+ ophyd_async/sim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
+ ophyd_async/sim/demo/__init__.py,sha256=JKWFnHqmFuRRMvvU0aBuclke3OdF0iq89yvHEd4J7Bg,371
87
+ ophyd_async/sim/demo/_sim_motor.py,sha256=hZAoZniLd-Fh5Ru9v6TyFNJHrQB_l9ljM04vByuz_Ls,3665
88
+ ophyd_async/sim/demo/_pattern_detector/__init__.py,sha256=o_dSZDIl_CyS3YPSNKpGiQiR9UaC4cNzZ8_ByEN9dIk,402
89
+ ophyd_async/sim/demo/_pattern_detector/_pattern_detector.py,sha256=R-UbcxHLFfCK9tBryKZN5Dit0IjYeJGP-QKV2ssKFoQ,1275
90
+ ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py,sha256=HqlKNgjd_9pjy6pc74xdJ7JtV1Iko6cNxB2aZReJozw,1999
91
+ ophyd_async/sim/demo/_pattern_detector/_pattern_detector_writer.py,sha256=nQOks4EK1Ax0Ib1pkCrmJPF8Jqr7tPusMnby-HGUnP0,1370
92
+ ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py,sha256=gP0Q1-1p_3KOH7mWZc5m-8OUEx_jb7SAdRXcpleRqX4,7096
93
+ ophyd_async/sim/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ ophyd_async/tango/__init__.py,sha256=2XxSpJWvvAlCs0GLPv6sEnUUD40fWq9OzKuiBEZ_MEs,861
95
+ ophyd_async/tango/base_devices/__init__.py,sha256=fbn1-rfK8MCErpSmjAJuQioDikbjOobd4sDvAB9Xupw,157
96
+ ophyd_async/tango/base_devices/_base_device.py,sha256=5Jt3UXIK1wNlKGnlGcKthigHBoLQ-MX7tzq4J3QY-_8,5968
97
+ ophyd_async/tango/base_devices/_tango_readable.py,sha256=J-XeR2fmQU5RTdsNhRvzNPJD8xZRVJ6-qXt09vfpVtI,951
98
+ ophyd_async/tango/demo/__init__.py,sha256=_j-UicTnckuIBp8PnieFMOMnLFGivnaKdmo9o0hYtzc,256
99
+ ophyd_async/tango/demo/_counter.py,sha256=neKkuepWfpBxMOPnnHJ79SHgwepymG4gTDVacuHE6fA,1134
100
+ ophyd_async/tango/demo/_detector.py,sha256=0wwk7Y-Dl9QF1YsCIU_BxqI6-PQ40qN_0gknrYBkxsY,1292
101
+ ophyd_async/tango/demo/_mover.py,sha256=hlg0IeR6_1m7ZeavQ1HS_ZFA_MdE0c1kAso6H1Ntz-w,2701
102
+ ophyd_async/tango/demo/_tango/__init__.py,sha256=FfONT7vM49nNo3a1Lv-LcMZO9EHv6bv91yY-RnxIib4,85
103
+ ophyd_async/tango/demo/_tango/_servers.py,sha256=MwkkoZWJQm_cgafCBBXeQfwyAiOgU8cE90_uNfcdcGA,2916
104
+ ophyd_async/tango/signal/__init__.py,sha256=-_wBvhSPb58h_XSeGVaJ6gMFOY8TQNsVYfZxQuxGB1c,750
105
+ ophyd_async/tango/signal/_signal.py,sha256=72iOxCt6HkyaYPgE402h5fd1KryyVUarR0exV2A3UbU,6277
106
+ ophyd_async/tango/signal/_tango_transport.py,sha256=DVTdLu8C19k-QzYaKUzFK2WMbaSd6dIO77k99ugD8U4,28990
107
+ ophyd_async-0.8.0a3.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
108
+ ophyd_async-0.8.0a3.dist-info/METADATA,sha256=tAf70XFrRZAkgiqGePl9EqzyGRpYsKEh3Jz2-_3qj5w,6708
109
+ ophyd_async-0.8.0a3.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
110
+ ophyd_async-0.8.0a3.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
111
+ ophyd_async-0.8.0a3.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
112
+ ophyd_async-0.8.0a3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,3 +0,0 @@
1
- from ._pvi import create_children_from_annotations, fill_pvi_entries
2
-
3
- __all__ = ["fill_pvi_entries", "create_children_from_annotations"]