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
@@ -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,30 +1,19 @@
1
- from ophyd_async.core import (
2
- DEFAULT_TIMEOUT,
3
- AsyncStatus,
4
- ConfigSignal,
5
- HintedSignal,
6
- SignalR,
7
- SignalRW,
8
- SignalX,
9
- )
10
- from ophyd_async.tango import TangoReadable, tango_polling
1
+ from typing import Annotated as A
2
+
3
+ from ophyd_async.core import DEFAULT_TIMEOUT, AsyncStatus, SignalR, SignalRW, SignalX
4
+ from ophyd_async.core import StandardReadableFormat as Format
5
+ from ophyd_async.tango.core import TangoPolling, TangoReadable
11
6
 
12
7
 
13
- # Enable device level polling, useful for servers that do not support events
14
- # Polling for individual signal can be enabled with a dict
15
- @tango_polling({"counts": (1.0, 0.1, 0.1), "sample_time": (0.1, 0.1, 0.1)})
16
8
  class TangoCounter(TangoReadable):
17
9
  # Enter the name and type of the signals you want to use
18
- # If type is None or Signal, the type will be inferred from the Tango device
19
- counts: SignalR[int]
20
- sample_time: SignalRW[float]
10
+ # If the server doesn't support events, the TangoPolling annotation gives
11
+ # the parameters for ophyd to poll instead
12
+ counts: A[SignalR[int], Format.HINTED_SIGNAL, TangoPolling(1.0, 0.1, 0.1)]
13
+ sample_time: A[SignalRW[float], Format.CONFIG_SIGNAL, TangoPolling(0.1, 0.1, 0.1)]
21
14
  start: SignalX
22
- _reset: SignalX
23
-
24
- def __init__(self, trl: str | None = "", name=""):
25
- super().__init__(trl, name=name)
26
- self.add_readables([self.counts], HintedSignal)
27
- self.add_readables([self.sample_time], ConfigSignal)
15
+ # If a tango name clashes with a bluesky verb, add a trailing underscore
16
+ reset_: SignalX
28
17
 
29
18
  @AsyncStatus.wrap
30
19
  async def trigger(self) -> None:
@@ -34,4 +23,4 @@ class TangoCounter(TangoReadable):
34
23
 
35
24
  @AsyncStatus.wrap
36
25
  async def reset(self) -> None:
37
- await self._reset.trigger(wait=True, timeout=DEFAULT_TIMEOUT)
26
+ await self.reset_.trigger(wait=True, timeout=DEFAULT_TIMEOUT)
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ from typing import Annotated as A
2
3
 
3
4
  from bluesky.protocols import Movable, Stoppable
4
5
 
@@ -7,8 +8,6 @@ from ophyd_async.core import (
7
8
  DEFAULT_TIMEOUT,
8
9
  AsyncStatus,
9
10
  CalculatableTimeout,
10
- ConfigSignal,
11
- HintedSignal,
12
11
  SignalR,
13
12
  SignalRW,
14
13
  SignalX,
@@ -17,24 +16,25 @@ from ophyd_async.core import (
17
16
  observe_value,
18
17
  wait_for_value,
19
18
  )
20
- from ophyd_async.tango import TangoReadable, tango_polling
19
+ from ophyd_async.core import StandardReadableFormat as Format
20
+ from ophyd_async.tango.core import TangoPolling, TangoReadable
21
21
  from tango import DevState
22
22
 
23
23
 
24
- # Enable device level polling, useful for servers that do not support events
25
- @tango_polling((0.1, 0.1, 0.1))
26
24
  class TangoMover(TangoReadable, Movable, Stoppable):
27
25
  # Enter the name and type of the signals you want to use
28
- # If type is None or Signal, the type will be inferred from the Tango device
29
- position: SignalRW[float]
30
- velocity: SignalRW[float]
31
- state: SignalR[DevState]
32
- _stop: SignalX
26
+ # If the server doesn't support events, the TangoPolling annotation gives
27
+ # the parameters for ophyd to poll instead
28
+ position: A[SignalRW[float], TangoPolling(0.1, 0.1, 0.1)]
29
+ velocity: A[SignalRW[float], TangoPolling(0.1, 0.1, 0.1)]
30
+ state: A[SignalR[DevState], TangoPolling(0.1)]
31
+ # If a tango name clashes with a bluesky verb, add a trailing underscore
32
+ stop_: SignalX
33
33
 
34
34
  def __init__(self, trl: str | None = "", name=""):
35
35
  super().__init__(trl, name=name)
36
- self.add_readables([self.position], HintedSignal)
37
- self.add_readables([self.velocity], ConfigSignal)
36
+ self.add_readables([self.position], Format.HINTED_SIGNAL)
37
+ self.add_readables([self.velocity], Format.CONFIG_SIGNAL)
38
38
  self._set_success = True
39
39
 
40
40
  @WatchableAsyncStatus.wrap
@@ -74,4 +74,4 @@ class TangoMover(TangoReadable, Movable, Stoppable):
74
74
 
75
75
  def stop(self, success: bool = True) -> AsyncStatus:
76
76
  self._set_success = success
77
- return self._stop.trigger()
77
+ return self.stop_.trigger()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ophyd-async
3
- Version: 0.7.0
3
+ Version: 0.8.0
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,73 +40,70 @@ 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
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
- 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'
56
- Provides-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: 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
- Requires-Dist: inflection ; extra == 'dev'
66
- Requires-Dist: ipython ; extra == 'dev'
67
- Requires-Dist: ipywidgets ; extra == 'dev'
68
- Requires-Dist: matplotlib ; extra == 'dev'
69
- Requires-Dist: myst-parser ; extra == 'dev'
70
- Requires-Dist: numpydoc ; extra == 'dev'
71
- Requires-Dist: ophyd ; extra == 'dev'
72
- Requires-Dist: pickleshare ; extra == 'dev'
73
- Requires-Dist: pipdeptree ; extra == 'dev'
74
- Requires-Dist: pre-commit ; extra == 'dev'
75
- Requires-Dist: pydata-sphinx-theme >=0.12 ; extra == 'dev'
76
- Requires-Dist: pyepics >=3.4.2 ; extra == 'dev'
77
- Requires-Dist: pyright ; extra == 'dev'
78
- Requires-Dist: pyside6 ==6.7.0 ; extra == 'dev'
79
- Requires-Dist: pytest ; extra == 'dev'
80
- Requires-Dist: pytest-asyncio ; extra == 'dev'
81
- Requires-Dist: pytest-cov ; extra == 'dev'
82
- Requires-Dist: pytest-faulthandler ; extra == 'dev'
83
- Requires-Dist: pytest-forked ; extra == 'dev'
84
- Requires-Dist: pytest-rerunfailures ; extra == 'dev'
85
- Requires-Dist: pytest-timeout ; extra == 'dev'
86
- Requires-Dist: ruff ; extra == 'dev'
87
- Requires-Dist: sphinx <7.4.0 ; extra == 'dev'
88
- Requires-Dist: sphinx-autobuild ; extra == 'dev'
89
- Requires-Dist: autodoc-pydantic ; extra == 'dev'
90
- Requires-Dist: sphinxcontrib-mermaid ; extra == 'dev'
91
- Requires-Dist: sphinx-copybutton ; extra == 'dev'
92
- Requires-Dist: sphinx-design ; extra == 'dev'
93
- Requires-Dist: super-state-machine ; extra == 'dev'
94
- Requires-Dist: tox-direct ; extra == 'dev'
95
- Requires-Dist: types-mock ; extra == 'dev'
96
- Requires-Dist: types-pyyaml ; extra == 'dev'
55
+ Requires-Dist: aioca>=1.6; extra == "ca"
97
56
  Provides-Extra: pva
98
- Requires-Dist: p4p ; extra == 'pva'
57
+ Requires-Dist: p4p; extra == "pva"
99
58
  Provides-Extra: sim
100
- Requires-Dist: h5py ; extra == 'sim'
59
+ Requires-Dist: h5py; extra == "sim"
101
60
  Provides-Extra: tango
102
- Requires-Dist: pytango >=10.0.0 ; extra == 'tango'
61
+ Requires-Dist: pytango>=10.0.0; extra == "tango"
62
+ Provides-Extra: dev
63
+ Requires-Dist: ophyd_async[pva]; extra == "dev"
64
+ Requires-Dist: ophyd_async[sim]; extra == "dev"
65
+ Requires-Dist: ophyd_async[ca]; extra == "dev"
66
+ Requires-Dist: ophyd_async[tango]; extra == "dev"
67
+ Requires-Dist: inflection; extra == "dev"
68
+ Requires-Dist: ipython; extra == "dev"
69
+ Requires-Dist: ipywidgets; extra == "dev"
70
+ Requires-Dist: import-linter; extra == "dev"
71
+ Requires-Dist: matplotlib; extra == "dev"
72
+ Requires-Dist: myst-parser; extra == "dev"
73
+ Requires-Dist: numpydoc; extra == "dev"
74
+ Requires-Dist: ophyd; extra == "dev"
75
+ Requires-Dist: pickleshare; extra == "dev"
76
+ Requires-Dist: pipdeptree; extra == "dev"
77
+ Requires-Dist: pre-commit; extra == "dev"
78
+ Requires-Dist: pydata-sphinx-theme>=0.12; extra == "dev"
79
+ Requires-Dist: pyepics>=3.4.2; extra == "dev"
80
+ Requires-Dist: pyright; extra == "dev"
81
+ Requires-Dist: pyside6==6.7.0; extra == "dev"
82
+ Requires-Dist: pytest; extra == "dev"
83
+ Requires-Dist: pytest-asyncio; extra == "dev"
84
+ Requires-Dist: pytest-cov; extra == "dev"
85
+ Requires-Dist: pytest-faulthandler; extra == "dev"
86
+ Requires-Dist: pytest-forked; extra == "dev"
87
+ Requires-Dist: pytest-rerunfailures; extra == "dev"
88
+ Requires-Dist: pytest-timeout; extra == "dev"
89
+ Requires-Dist: ruff; extra == "dev"
90
+ Requires-Dist: sphinx<7.4.0; extra == "dev"
91
+ Requires-Dist: sphinx-autobuild; extra == "dev"
92
+ Requires-Dist: autodoc-pydantic; extra == "dev"
93
+ Requires-Dist: sphinxcontrib-mermaid; extra == "dev"
94
+ Requires-Dist: sphinx-copybutton; extra == "dev"
95
+ Requires-Dist: sphinx-design; extra == "dev"
96
+ Requires-Dist: super_state_machine; extra == "dev"
97
+ Requires-Dist: tox-direct; extra == "dev"
98
+ Requires-Dist: types-mock; extra == "dev"
99
+ Requires-Dist: types-pyyaml; extra == "dev"
103
100
 
104
101
  [![CI](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml/badge.svg)](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml)
105
102
  [![Coverage](https://codecov.io/gh/bluesky/ophyd-async/branch/main/graph/badge.svg)](https://codecov.io/gh/bluesky/ophyd-async)
106
103
  [![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)
104
+ [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://choosealicense.com/licenses/bsd-3-clause)
108
105
 
109
- # ophyd-async
106
+ # ![ophyd-async](https://raw.githubusercontent.com/bluesky/ophyd-async/main/docs/images/ophyd-async-logo.svg)
110
107
 
111
108
  Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango.
112
109
 
@@ -116,7 +113,7 @@ Asynchronous Bluesky hardware abstraction code, compatible with control systems
116
113
  | Documentation | <https://bluesky.github.io/ophyd-async> |
117
114
  | Releases | <https://github.com/bluesky/ophyd-async/releases> |
118
115
 
119
- Ophyd-async is a Python library for asynchronously interfacing with hardware, intended to
116
+ Ophyd-async is a Python library for asynchronously interfacing with hardware, intended to
120
117
  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
118
  systems.
122
119
 
@@ -0,0 +1,116 @@
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=vspFLRfYI6gAAN7kyihey2lhPos0jxqKaNDWFlKPlmU,411
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=GyWyk3uzLej4moei2-tKUBKZJ2SKzWGFRJ82wunv7Zs,22359
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.0.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
112
+ ophyd_async-0.8.0.dist-info/METADATA,sha256=Kb1qZ7dqyg95NcgzbruGtpoQvZ3qW8li7xONx178PGc,6700
113
+ ophyd_async-0.8.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
114
+ ophyd_async-0.8.0.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
115
+ ophyd_async-0.8.0.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
116
+ ophyd_async-0.8.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.2.0)
2
+ Generator: setuptools (75.6.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"]