ophyd-async 0.8.0a2__py3-none-any.whl → 0.8.0a4__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 (45) hide show
  1. ophyd_async/_version.py +1 -1
  2. ophyd_async/core/__init__.py +9 -1
  3. ophyd_async/core/_device.py +71 -49
  4. ophyd_async/core/_device_filler.py +208 -130
  5. ophyd_async/core/_mock_signal_backend.py +10 -7
  6. ophyd_async/core/_mock_signal_utils.py +14 -11
  7. ophyd_async/core/_readable.py +128 -129
  8. ophyd_async/core/_signal.py +22 -24
  9. ophyd_async/core/_soft_signal_backend.py +2 -0
  10. ophyd_async/core/_utils.py +64 -11
  11. ophyd_async/epics/adaravis/_aravis_io.py +1 -1
  12. ophyd_async/epics/adcore/_core_io.py +1 -1
  13. ophyd_async/epics/adcore/_single_trigger.py +6 -10
  14. ophyd_async/epics/adkinetix/_kinetix_io.py +1 -1
  15. ophyd_async/epics/adpilatus/_pilatus_io.py +1 -1
  16. ophyd_async/epics/advimba/_vimba_io.py +1 -1
  17. ophyd_async/epics/core/__init__.py +26 -0
  18. ophyd_async/epics/{signal → core}/_aioca.py +3 -6
  19. ophyd_async/epics/core/_epics_connector.py +53 -0
  20. ophyd_async/epics/core/_epics_device.py +13 -0
  21. ophyd_async/epics/{signal → core}/_p4p.py +3 -6
  22. ophyd_async/epics/core/_pvi_connector.py +91 -0
  23. ophyd_async/epics/{signal → core}/_signal.py +31 -16
  24. ophyd_async/epics/{signal/_common.py → core/_util.py} +19 -1
  25. ophyd_async/epics/demo/_mover.py +4 -5
  26. ophyd_async/epics/demo/_sensor.py +9 -12
  27. ophyd_async/epics/eiger/_eiger_io.py +1 -1
  28. ophyd_async/epics/eiger/_odin_io.py +1 -1
  29. ophyd_async/epics/motor.py +4 -5
  30. ophyd_async/epics/signal.py +11 -0
  31. ophyd_async/fastcs/core.py +2 -2
  32. ophyd_async/plan_stubs/_ensure_connected.py +2 -4
  33. ophyd_async/sim/demo/_sim_motor.py +3 -4
  34. ophyd_async/tango/base_devices/_base_device.py +48 -48
  35. ophyd_async/tango/demo/_counter.py +6 -16
  36. ophyd_async/tango/demo/_mover.py +3 -4
  37. {ophyd_async-0.8.0a2.dist-info → ophyd_async-0.8.0a4.dist-info}/METADATA +1 -1
  38. {ophyd_async-0.8.0a2.dist-info → ophyd_async-0.8.0a4.dist-info}/RECORD +42 -40
  39. {ophyd_async-0.8.0a2.dist-info → ophyd_async-0.8.0a4.dist-info}/WHEEL +1 -1
  40. ophyd_async/epics/pvi/__init__.py +0 -3
  41. ophyd_async/epics/pvi/_pvi.py +0 -73
  42. ophyd_async/epics/signal/__init__.py +0 -20
  43. {ophyd_async-0.8.0a2.dist-info → ophyd_async-0.8.0a4.dist-info}/LICENSE +0 -0
  44. {ophyd_async-0.8.0a2.dist-info → ophyd_async-0.8.0a4.dist-info}/entry_points.txt +0 -0
  45. {ophyd_async-0.8.0a2.dist-info → ophyd_async-0.8.0a4.dist-info}/top_level.txt +0 -0
@@ -1,9 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from typing import TypeVar
4
- from unittest.mock import Mock
5
4
 
6
5
  from ophyd_async.core import Device, DeviceConnector, DeviceFiller
6
+ from ophyd_async.core._utils import LazyMock
7
7
  from ophyd_async.tango.signal import (
8
8
  TangoSignalBackend,
9
9
  infer_python_type,
@@ -48,7 +48,6 @@ class TangoDevice(Device):
48
48
  polling=self._polling,
49
49
  signal_polling=self._signal_polling,
50
50
  )
51
- connector.create_children_from_annotations(self)
52
51
  super().__init__(name=name, connector=connector)
53
52
 
54
53
 
@@ -106,53 +105,54 @@ class TangoDeviceConnector(DeviceConnector):
106
105
  self._signal_polling = signal_polling
107
106
 
108
107
  def create_children_from_annotations(self, device: Device):
109
- self._filler = DeviceFiller(
110
- device=device,
111
- signal_backend_factory=TangoSignalBackend,
112
- device_connector_factory=lambda: TangoDeviceConnector(
113
- None, None, (False, 0.1, None, None), {}
114
- ),
115
- )
108
+ if not hasattr(self, "filler"):
109
+ self.filler = DeviceFiller(
110
+ device=device,
111
+ signal_backend_factory=TangoSignalBackend,
112
+ device_connector_factory=lambda: TangoDeviceConnector(
113
+ None, None, (False, 0.1, None, None), {}
114
+ ),
115
+ )
116
+ list(self.filler.create_devices_from_annotations(filled=False))
117
+ list(self.filler.create_signals_from_annotations(filled=False))
118
+ self.filler.check_created()
116
119
 
117
- async def connect(
118
- self, device: Device, mock: bool | Mock, timeout: float, force_reconnect: bool
119
- ) -> None:
120
- if mock:
121
- # Make 2 entries for each DeviceVector
122
- self._filler.make_soft_device_vector_entries(2)
120
+ async def connect_mock(self, device: Device, mock: LazyMock):
121
+ # Make 2 entries for each DeviceVector
122
+ self.filler.create_device_vector_entries_to_mock(2)
123
+ # Set the name of the device to name all children
124
+ device.set_name(device.name)
125
+ return await super().connect_mock(device, mock)
126
+
127
+ async def connect_real(self, device: Device, timeout: float, force_reconnect: bool):
128
+ if self.trl and self.proxy is None:
129
+ self.proxy = await AsyncDeviceProxy(self.trl)
130
+ elif self.proxy and not self.trl:
131
+ self.trl = self.proxy.name()
123
132
  else:
124
- if self.trl and self.proxy is None:
125
- self.proxy = await AsyncDeviceProxy(self.trl)
126
- elif self.proxy and not self.trl:
127
- self.trl = self.proxy.name()
128
- else:
129
- raise TypeError("Neither proxy nor trl supplied")
130
-
131
- children = sorted(
132
- set()
133
- .union(self.proxy.get_attribute_list())
134
- .union(self.proxy.get_command_list())
135
- )
136
- for name in children:
137
- # TODO: strip attribute name
138
- full_trl = f"{self.trl}/{name}"
139
- signal_type = await infer_signal_type(full_trl, self.proxy)
140
- if signal_type:
141
- backend = self._filler.make_child_signal(name, signal_type)
142
- backend.datatype = await infer_python_type(full_trl, self.proxy)
143
- backend.set_trl(full_trl)
144
- if polling := self._signal_polling.get(name, ()):
145
- backend.set_polling(*polling)
146
- backend.allow_events(False)
147
- elif self._polling[0]:
148
- backend.set_polling(*self._polling)
149
- backend.allow_events(False)
150
- # Check that all the requested children have been created
151
- if unfilled := self._filler.unfilled():
152
- raise RuntimeError(
153
- f"{device.name}: cannot provision {unfilled} from "
154
- f"{self.trl}: {children}"
155
- )
133
+ raise TypeError("Neither proxy nor trl supplied")
134
+
135
+ children = sorted(
136
+ set()
137
+ .union(self.proxy.get_attribute_list())
138
+ .union(self.proxy.get_command_list())
139
+ )
140
+ for name in children:
141
+ # TODO: strip attribute name
142
+ full_trl = f"{self.trl}/{name}"
143
+ signal_type = await infer_signal_type(full_trl, self.proxy)
144
+ if signal_type:
145
+ backend = self.filler.fill_child_signal(name, signal_type)
146
+ backend.datatype = await infer_python_type(full_trl, self.proxy)
147
+ backend.set_trl(full_trl)
148
+ if polling := self._signal_polling.get(name, ()):
149
+ backend.set_polling(*polling)
150
+ backend.allow_events(False)
151
+ elif self._polling[0]:
152
+ backend.set_polling(*self._polling)
153
+ backend.allow_events(False)
154
+ # Check that all the requested children have been filled
155
+ self.filler.check_filled(f"{self.trl}: {children}")
156
156
  # Set the name of the device to name all children
157
157
  device.set_name(device.name)
158
- return await super().connect(device, mock, timeout, force_reconnect)
158
+ return await super().connect_real(device, timeout, force_reconnect)
@@ -1,12 +1,7 @@
1
- from ophyd_async.core import (
2
- DEFAULT_TIMEOUT,
3
- AsyncStatus,
4
- ConfigSignal,
5
- HintedSignal,
6
- SignalR,
7
- SignalRW,
8
- SignalX,
9
- )
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
10
5
  from ophyd_async.tango import TangoReadable, tango_polling
11
6
 
12
7
 
@@ -16,16 +11,11 @@ from ophyd_async.tango import TangoReadable, tango_polling
16
11
  class TangoCounter(TangoReadable):
17
12
  # Enter the name and type of the signals you want to use
18
13
  # If type is None or Signal, the type will be inferred from the Tango device
19
- counts: SignalR[int]
20
- sample_time: SignalRW[float]
14
+ counts: A[SignalR[int], Format.HINTED_SIGNAL]
15
+ sample_time: A[SignalRW[float], Format.CONFIG_SIGNAL]
21
16
  start: SignalX
22
17
  reset_: SignalX
23
18
 
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)
28
-
29
19
  @AsyncStatus.wrap
30
20
  async def trigger(self) -> None:
31
21
  sample_time = await self.sample_time.get_value()
@@ -7,8 +7,6 @@ from ophyd_async.core import (
7
7
  DEFAULT_TIMEOUT,
8
8
  AsyncStatus,
9
9
  CalculatableTimeout,
10
- ConfigSignal,
11
- HintedSignal,
12
10
  SignalR,
13
11
  SignalRW,
14
12
  SignalX,
@@ -17,6 +15,7 @@ from ophyd_async.core import (
17
15
  observe_value,
18
16
  wait_for_value,
19
17
  )
18
+ from ophyd_async.core import StandardReadableFormat as Format
20
19
  from ophyd_async.tango import TangoReadable, tango_polling
21
20
  from tango import DevState
22
21
 
@@ -33,8 +32,8 @@ class TangoMover(TangoReadable, Movable, Stoppable):
33
32
 
34
33
  def __init__(self, trl: str | None = "", name=""):
35
34
  super().__init__(trl, name=name)
36
- self.add_readables([self.position], HintedSignal)
37
- self.add_readables([self.velocity], ConfigSignal)
35
+ self.add_readables([self.position], Format.HINTED_SIGNAL)
36
+ self.add_readables([self.velocity], Format.CONFIG_SIGNAL)
38
37
  self._set_success = True
39
38
 
40
39
  @WatchableAsyncStatus.wrap
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ophyd-async
3
- Version: 0.8.0a2
3
+ Version: 0.8.0a4
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
@@ -1,72 +1,74 @@
1
1
  ophyd_async/__init__.py,sha256=tEfgj45lRItQ-_u8SRFPM-mpBh3gWvHXr3emhiJJG_M,225
2
2
  ophyd_async/__main__.py,sha256=n_U4O9bgm97OuboUB_9eK7eFiwy8BZSgXJ0OzbE0DqU,481
3
- ophyd_async/_version.py,sha256=89ACrxBz6ayPyRUoZiAmc28ARp-c3Nyrpb31qenCm-Y,413
3
+ ophyd_async/_version.py,sha256=_oysVx3AtIs7YHDdNWu47vFG8nzgweLVt7KUik2-u0Q,413
4
4
  ophyd_async/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- ophyd_async/core/__init__.py,sha256=j1QNO04b_uYqIJzEo7dGgyQq5h1VT0cFMHcimpCX6zs,4178
5
+ ophyd_async/core/__init__.py,sha256=JBKq2w50jBjxg_2KRL1jXnIzETaj8dPOD47_prgtotU,4283
6
6
  ophyd_async/core/_detector.py,sha256=bKLekM2J3GzLXsKwe8qXQjNP_sAVsa8EtwFEWD-8MeA,14307
7
- ophyd_async/core/_device.py,sha256=bKFE-RG3SS966FRcZSSfOZnAWcz1At6FFBcpKMeGxi8,10956
8
- ophyd_async/core/_device_filler.py,sha256=YoBhH_r9xEFrLPOCaIOTZdlrmSsosyn3np69RJsk-6Q,8345
7
+ ophyd_async/core/_device.py,sha256=AMuYtsWtce5rebeHvb5bntZkNLpfnJV9XgQLp0zd5Ks,11802
8
+ ophyd_async/core/_device_filler.py,sha256=Nw-DUyuXYpvt4mmCAQaNVA0LFBBaPK84ubZo3bR39Ak,11407
9
9
  ophyd_async/core/_device_save_loader.py,sha256=OViN9_LWNOLuajzrHDKYEqd5I47u5npQACdGceKcIGY,8375
10
10
  ophyd_async/core/_flyer.py,sha256=us5z6MNGCvIfgPDTmFTxNERSP37g0WVRkRD0Z2JiMgM,1701
11
11
  ophyd_async/core/_hdf_dataset.py,sha256=wW_OL8OYLGOsE01ny3hGaapOrxK7BzhWTxKgz8CIXK0,2492
12
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
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
15
  ophyd_async/core/_protocol.py,sha256=MuYRqSfakdry9RllX7G9UTzp4lw3eDjtkdGPpnbNb34,4040
16
16
  ophyd_async/core/_providers.py,sha256=ff9ZT5-PZ6rhTTdE-q8w9l_k9DuZqLWLebsKZLeJ0Ds,7112
17
- ophyd_async/core/_readable.py,sha256=KC5n-LXKzFyYkhZ7KXwFlHM05pe8iDCnyldfS1pel3s,9075
18
- ophyd_async/core/_signal.py,sha256=4Umj1EXgz89ZO1Ej-b5TEkmr72pdw3Jbyk-nIsYIYpo,20011
17
+ ophyd_async/core/_readable.py,sha256=7FxqxhAT1wBQqOEivgnY731zA9QoK1Tt-ZGcH7GBOXM,10623
18
+ ophyd_async/core/_signal.py,sha256=HO3XkSvs_5t6yJcZAHCaxOfGy8AE0B9c9sDwlG4x21g,19847
19
19
  ophyd_async/core/_signal_backend.py,sha256=YWPgLSPbfPnWIUDHvP1ArCVK8zKXJxzzbloqQe_ucCI,5040
20
- ophyd_async/core/_soft_signal_backend.py,sha256=VBemKbSM397zhtjm6zLKozhJ8cY3XhDu42OagBc_d64,5663
20
+ ophyd_async/core/_soft_signal_backend.py,sha256=d74wML22E3H81W6xsPIj44ghw3jP51Jph4vCLGFwB2k,5706
21
21
  ophyd_async/core/_status.py,sha256=OUKhblRQ4KU5PDsWbpvYduM7G60JMk1NqeV4eqyPtKc,5131
22
22
  ophyd_async/core/_table.py,sha256=ZToBVmAPDmhrVDgjx0f8SErxVdKhvGdGwQ-fXxGCtN8,5386
23
- ophyd_async/core/_utils.py,sha256=e5zmHkkCvMYJRWGIMGMww18YSyOhSsdNYTta3FQzdQY,7515
23
+ ophyd_async/core/_utils.py,sha256=230vayCyT1xsZDjpr7JRcax8zYTxImsf9gm5GiZtnZ8,9132
24
24
  ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- ophyd_async/epics/motor.py,sha256=mOrFiTt6WrXJM4d5Stksrxc_j9Vcd3L3w1QLCX_K0zM,8752
25
+ ophyd_async/epics/motor.py,sha256=pujJXV_vslvo3AxsVySTAEoFuduuv5Hp6sz8aRvIbeQ,8792
26
+ ophyd_async/epics/signal.py,sha256=hJCGIIWjRVhjEHkeL1I_oPEaaN7dDFKmm7G7ZmgoTYQ,219
26
27
  ophyd_async/epics/adaravis/__init__.py,sha256=u979_9nQTYB0TvDOTXFN4qMrbDP8-xQFfXYMGzLVBo4,207
27
28
  ophyd_async/epics/adaravis/_aravis.py,sha256=XBuLQBZYj2tptY39bVzXjl6t-ZpPwqrUOwpR54l-hSo,1952
28
29
  ophyd_async/epics/adaravis/_aravis_controller.py,sha256=t4vuMsQ_67tNsAYPFFtBKq3YIHhRnK08DwPzi8Am_-k,2831
29
- ophyd_async/epics/adaravis/_aravis_io.py,sha256=wjeN3qYVyy-HsLKJH0SZLC663AERKYPD38vvL71BRAQ,1605
30
+ ophyd_async/epics/adaravis/_aravis_io.py,sha256=KCfylSNGN7rC6W4uJDCVtaQ4-o5_FR_bTyTDXnhmMt4,1603
30
31
  ophyd_async/epics/adcore/__init__.py,sha256=3wMOyFGaq1X61LqK4iY4pq-m_BjhOgYZD2-mNCAjpzk,1086
31
- ophyd_async/epics/adcore/_core_io.py,sha256=Tgi9djvG5z-dgxO6Jq2-kAi-dAE5VOntL88xRrLLP8I,6078
32
+ ophyd_async/epics/adcore/_core_io.py,sha256=ZQjRLdpFMVS9kwEm5LAh60pxiy7XWyYtc2TzEvCEVYM,6076
32
33
  ophyd_async/epics/adcore/_core_logic.py,sha256=JjrSmKErRFSv1C98or1Upwi01k3NWDRMi2fPHVWMmWw,3561
33
34
  ophyd_async/epics/adcore/_hdf_writer.py,sha256=eWT9SH7uegf9rpCWRmVCZTsOxF1drPaOAMmoXm99mVk,7215
34
- ophyd_async/epics/adcore/_single_trigger.py,sha256=NaTOHKDD0nzAPPrva-4dR-h102khpJ3cPKqEmS3HzY8,1168
35
+ ophyd_async/epics/adcore/_single_trigger.py,sha256=7SzmadatWk4zXIweRIhVX5odc__ZZKuGicL7vlW0JbY,1208
35
36
  ophyd_async/epics/adcore/_utils.py,sha256=MZBKeSPIRzyo6f84MpzPp28KwOLa9qgrkMIFc618wOE,3932
36
37
  ophyd_async/epics/adkinetix/__init__.py,sha256=cvnwOqbvEENf70eFp6bPGwayP0u14UTIhs3WiZEcF_Q,262
37
38
  ophyd_async/epics/adkinetix/_kinetix.py,sha256=JsQVc4d7lRCnVObJlM775hHLfp3rYRSRgOoIyRvrSek,1184
38
39
  ophyd_async/epics/adkinetix/_kinetix_controller.py,sha256=LyK-CWkEV1l_RVhCOHf2lLgo1FRIkDCa4P8JnAGZ4us,1701
39
- ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=KcNqmt0ejNR6zqJ0opRuAP4DGvryzar4j-03eba090o,912
40
+ ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=D72HNtob74SnhBa3Zsbp37MhqS6kdrCPac7pnTlm0PQ,910
40
41
  ophyd_async/epics/adpilatus/__init__.py,sha256=daimScOCCMHR2eb8VbezHOcGOkd6uIRZQiyeTQsaAx4,308
41
42
  ophyd_async/epics/adpilatus/_pilatus.py,sha256=AbWfxEds8ESB73kRXz56FzRPYqy67Ue0m11HRaNUqZY,1751
42
43
  ophyd_async/epics/adpilatus/_pilatus_controller.py,sha256=eBZnNPHJosYAMdD-efLNgAmTYaqONLJ3qKX-2RW13fg,2676
43
- ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=0cqv1eXe11Oiz69C0CGEWf6saboC6OJj6cHHJ6fK8Z8,740
44
+ ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=upIc5mr8RMmPjQMZcG7-Y8C9a5nPl91OTDjZ5JYDVIc,738
44
45
  ophyd_async/epics/adsimdetector/__init__.py,sha256=t3crUgTEvVJGI8o6FsfN42k0A-l4v9ZBwXIYtixoE-M,128
45
46
  ophyd_async/epics/adsimdetector/_sim.py,sha256=jzsPJdcwdciR2mVPbvg9KhGHWWGNDQwK5TwPcS7_tco,1009
46
47
  ophyd_async/epics/adsimdetector/_sim_controller.py,sha256=lxBCJtREDOySrpLNl7_9DbuIw2IhRpSOBK_CvJ5XBs4,1677
47
48
  ophyd_async/epics/advimba/__init__.py,sha256=l0ElP3Zyff_pzrTRdj9oUO9xigCfmzo3pMVjstlVsJY,320
48
49
  ophyd_async/epics/advimba/_vimba.py,sha256=E_RJ0uJQt-RWAY7uFTNkHaOdGYS5sa7ZbRgAe6ngXTA,1125
49
50
  ophyd_async/epics/advimba/_vimba_controller.py,sha256=Ej7irxTab9cfjmqz4G4Zxv3CjhJw_eRmIb3E62YWh6g,2226
50
- ophyd_async/epics/advimba/_vimba_io.py,sha256=HlMFKv9lTDk1085Zy4n5XGriUNBAfsGd4AqLj8wyjJI,1866
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=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
51
60
  ophyd_async/epics/demo/__init__.py,sha256=wCrgemEo-zR4TTvaqCKnQ-AIUHorotV5jhftbq1tXz0,1368
52
- ophyd_async/epics/demo/_mover.py,sha256=2bNfaLZzP1MMzsaLgDEQLf9_uWeOR9fcYzKiGVM2Ze8,3531
53
- ophyd_async/epics/demo/_sensor.py,sha256=0wICt8888vS5iNQCy8NWBfQPwUhyMo6g0GwQf8cJOs0,1180
61
+ ophyd_async/epics/demo/_mover.py,sha256=uyg60SlL7k2C3KA_05EUFOlDe6RB5QBbw7QGs969ItQ,3571
62
+ ophyd_async/epics/demo/_sensor.py,sha256=ATlS5jejoHzpgjHhEienEmRguTzZ7DGvzZkuPCHY49U,1040
54
63
  ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
55
64
  ophyd_async/epics/demo/sensor.db,sha256=AstyG9E0R4KZBz2FZQSrV_QlrfLoU6M2cvYc15Lf548,553
56
65
  ophyd_async/epics/eiger/__init__.py,sha256=b3Tt4pVLk23Giyj50R4e94d2MxWDDmNHWhWwNq2jlaw,221
57
66
  ophyd_async/epics/eiger/_eiger.py,sha256=hkMsjVwrzDcE1u5BRIQtn8RSR2e0b1JMpDvuIONoNaI,1133
58
67
  ophyd_async/epics/eiger/_eiger_controller.py,sha256=GCoZ40BGCFkxDUrgYk9_CwzSr86l-CALw9nUILJVaZA,2251
59
- ophyd_async/epics/eiger/_eiger_io.py,sha256=It4BvSSbpfKlxuWqRrOe9MaQ5Z0yznoV6yEFjq6OXNM,1808
60
- ophyd_async/epics/eiger/_odin_io.py,sha256=MC0WVHHfVlpeeHixh5LcstZIuGxRAmOSBpn3qtzOj28,4155
61
- ophyd_async/epics/pvi/__init__.py,sha256=cTt0ixrEPUTXyOs7A_yscsVOvWUEDKwU94BOvhjxVy0,71
62
- ophyd_async/epics/pvi/_pvi.py,sha256=2gAuujZyAW5KiSXJrlbs-YokW_sgZJrtKi9sfBNr3-k,2697
63
- ophyd_async/epics/signal/__init__.py,sha256=e6CVNlEhxXPzruTItHFALk2JyHc5a1zJYCzoFFeqd5o,437
64
- ophyd_async/epics/signal/_aioca.py,sha256=zOIF6ca9ombRLS0QghPSheHF_lC_mxp0bShFll8bLfs,11666
65
- ophyd_async/epics/signal/_common.py,sha256=xQBoZQs1lPmocpBokxFle-BxVGq2mVjtRoe7TYZMZNw,1462
66
- ophyd_async/epics/signal/_p4p.py,sha256=eHVl7ifjdOu55K701d_Gf2TlFgJ9tDCnJQhp2ag98HA,14660
67
- ophyd_async/epics/signal/_signal.py,sha256=h8iUqXOInhJ6M-xw3KJlU3srRPFwmfdHqlohy-uHRS8,4148
68
+ ophyd_async/epics/eiger/_eiger_io.py,sha256=0iimpsa8TI2mJ8hTolQByIhdeKltUGcg6aEkY5GwIyQ,1806
69
+ ophyd_async/epics/eiger/_odin_io.py,sha256=3E33ysvMlf8t0bbSVPnzUrvPgUwA7491uoViWpivpf8,4153
68
70
  ophyd_async/fastcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
- ophyd_async/fastcs/core.py,sha256=0t9fvXeqfP8V4Qz1LIjsh6HqLxZO0R62dbThy1ruWDI,349
71
+ ophyd_async/fastcs/core.py,sha256=kykwmblZfj9xfakL8FTAqmPmPA8qRbQ90OS3d8WLyto,342
70
72
  ophyd_async/fastcs/odin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
73
  ophyd_async/fastcs/panda/__init__.py,sha256=_o7n7ckoTM6hTRHpLphpL7r_9sADE59MRNM0gq_ut2o,980
72
74
  ophyd_async/fastcs/panda/_block.py,sha256=STQo6NJAqIVfxyMf-2pxINPyr9_nKtXSdicp92a25xo,1709
@@ -77,12 +79,12 @@ ophyd_async/fastcs/panda/_trigger.py,sha256=forImtdnDnaZ0KKhqSxCqwHWXq13SJ4mn9wd
77
79
  ophyd_async/fastcs/panda/_utils.py,sha256=NdvzdKy0SOG1eCVMQo_nwRXpBo0wyi6lM5Xw3HvssOw,508
78
80
  ophyd_async/fastcs/panda/_writer.py,sha256=wDN6uWX1ENofmI3JBXJ7_CGooI7WsZP-JJQrRiSc6sM,6000
79
81
  ophyd_async/plan_stubs/__init__.py,sha256=wjpEj_BoBZJ9x2fhUPY6BzWMqyYH96JrBlJvV7frdN4,524
80
- ophyd_async/plan_stubs/_ensure_connected.py,sha256=MIn-aWKiaGI0k7ac-_Ca40uouoGsyRX1gAHY-A-ifGI,750
82
+ ophyd_async/plan_stubs/_ensure_connected.py,sha256=ofMDgOLc7SyR8SVA1hY_zvfkNLo1g5jbRU27W3ICSS0,732
81
83
  ophyd_async/plan_stubs/_fly.py,sha256=WxghBAHsF-8xFrILCm44jeHIu9udLhm-tj4JXd9kZjY,6208
82
84
  ophyd_async/plan_stubs/_nd_attributes.py,sha256=TVfy3bhnrLFBXZ6b2bREBj0LzEviEGzuGvgWK3I7tII,2198
83
85
  ophyd_async/sim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
86
  ophyd_async/sim/demo/__init__.py,sha256=JKWFnHqmFuRRMvvU0aBuclke3OdF0iq89yvHEd4J7Bg,371
85
- ophyd_async/sim/demo/_sim_motor.py,sha256=13mswR9ybIHD00BFlmrqR7c4v_3in5FBv33cVfu8Uyc,3623
87
+ ophyd_async/sim/demo/_sim_motor.py,sha256=hZAoZniLd-Fh5Ru9v6TyFNJHrQB_l9ljM04vByuz_Ls,3665
86
88
  ophyd_async/sim/demo/_pattern_detector/__init__.py,sha256=o_dSZDIl_CyS3YPSNKpGiQiR9UaC4cNzZ8_ByEN9dIk,402
87
89
  ophyd_async/sim/demo/_pattern_detector/_pattern_detector.py,sha256=R-UbcxHLFfCK9tBryKZN5Dit0IjYeJGP-QKV2ssKFoQ,1275
88
90
  ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py,sha256=HqlKNgjd_9pjy6pc74xdJ7JtV1Iko6cNxB2aZReJozw,1999
@@ -91,20 +93,20 @@ ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py,sha256=gP0Q1-1p_3KO
91
93
  ophyd_async/sim/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
94
  ophyd_async/tango/__init__.py,sha256=2XxSpJWvvAlCs0GLPv6sEnUUD40fWq9OzKuiBEZ_MEs,861
93
95
  ophyd_async/tango/base_devices/__init__.py,sha256=fbn1-rfK8MCErpSmjAJuQioDikbjOobd4sDvAB9Xupw,157
94
- ophyd_async/tango/base_devices/_base_device.py,sha256=aMhDB2REBFRLX6R1nyHEvA9xUNbOV9STI1qldfdnkLE,5924
96
+ ophyd_async/tango/base_devices/_base_device.py,sha256=3GIkU1bUyunA9uTBsEtANmlJBo4WCgQmAWYbCRcjoXM,6016
95
97
  ophyd_async/tango/base_devices/_tango_readable.py,sha256=J-XeR2fmQU5RTdsNhRvzNPJD8xZRVJ6-qXt09vfpVtI,951
96
98
  ophyd_async/tango/demo/__init__.py,sha256=_j-UicTnckuIBp8PnieFMOMnLFGivnaKdmo9o0hYtzc,256
97
- ophyd_async/tango/demo/_counter.py,sha256=u4abG9AMpiz_Xlomu05AHFEjb9YKzSFolanm8NdqnOE,1262
99
+ ophyd_async/tango/demo/_counter.py,sha256=neKkuepWfpBxMOPnnHJ79SHgwepymG4gTDVacuHE6fA,1134
98
100
  ophyd_async/tango/demo/_detector.py,sha256=0wwk7Y-Dl9QF1YsCIU_BxqI6-PQ40qN_0gknrYBkxsY,1292
99
- ophyd_async/tango/demo/_mover.py,sha256=aag8J-8Vd_wX3HitrTwh17caUAg1rq-YHfCMkEYAyy0,2659
101
+ ophyd_async/tango/demo/_mover.py,sha256=hlg0IeR6_1m7ZeavQ1HS_ZFA_MdE0c1kAso6H1Ntz-w,2701
100
102
  ophyd_async/tango/demo/_tango/__init__.py,sha256=FfONT7vM49nNo3a1Lv-LcMZO9EHv6bv91yY-RnxIib4,85
101
103
  ophyd_async/tango/demo/_tango/_servers.py,sha256=MwkkoZWJQm_cgafCBBXeQfwyAiOgU8cE90_uNfcdcGA,2916
102
104
  ophyd_async/tango/signal/__init__.py,sha256=-_wBvhSPb58h_XSeGVaJ6gMFOY8TQNsVYfZxQuxGB1c,750
103
105
  ophyd_async/tango/signal/_signal.py,sha256=72iOxCt6HkyaYPgE402h5fd1KryyVUarR0exV2A3UbU,6277
104
106
  ophyd_async/tango/signal/_tango_transport.py,sha256=DVTdLu8C19k-QzYaKUzFK2WMbaSd6dIO77k99ugD8U4,28990
105
- ophyd_async-0.8.0a2.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
106
- ophyd_async-0.8.0a2.dist-info/METADATA,sha256=sCPoZNdh3J_MsprPjPLEqfHPcsY88R9FBgWbE4DcGXY,6708
107
- ophyd_async-0.8.0a2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
108
- ophyd_async-0.8.0a2.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
109
- ophyd_async-0.8.0a2.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
110
- ophyd_async-0.8.0a2.dist-info/RECORD,,
107
+ ophyd_async-0.8.0a4.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
108
+ ophyd_async-0.8.0a4.dist-info/METADATA,sha256=W1JjO8G4VcMybLwHqOkiySyWLZ_f_TCwTLA54Hf64Sg,6708
109
+ ophyd_async-0.8.0a4.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91
110
+ ophyd_async-0.8.0a4.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
111
+ ophyd_async-0.8.0a4.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
112
+ ophyd_async-0.8.0a4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (75.4.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,3 +0,0 @@
1
- from ._pvi import PviDeviceConnector
2
-
3
- __all__ = ["PviDeviceConnector"]
@@ -1,73 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from unittest.mock import Mock
4
-
5
- from ophyd_async.core import (
6
- Device,
7
- DeviceConnector,
8
- DeviceFiller,
9
- Signal,
10
- SignalR,
11
- SignalRW,
12
- SignalX,
13
- )
14
- from ophyd_async.epics.signal import (
15
- PvaSignalBackend,
16
- pvget_with_timeout,
17
- )
18
-
19
-
20
- def _get_signal_details(entry: dict[str, str]) -> tuple[type[Signal], str, str]:
21
- match entry:
22
- case {"r": read_pv}:
23
- return SignalR, read_pv, read_pv
24
- case {"r": read_pv, "w": write_pv}:
25
- return SignalRW, read_pv, write_pv
26
- case {"rw": read_write_pv}:
27
- return SignalRW, read_write_pv, read_write_pv
28
- case {"x": execute_pv}:
29
- return SignalX, execute_pv, execute_pv
30
- case _:
31
- raise TypeError(f"Can't process entry {entry}")
32
-
33
-
34
- class PviDeviceConnector(DeviceConnector):
35
- def __init__(self, pvi_pv: str = "") -> None:
36
- self.pvi_pv = pvi_pv
37
-
38
- def create_children_from_annotations(self, device: Device):
39
- self._filler = DeviceFiller(
40
- device=device,
41
- signal_backend_factory=PvaSignalBackend,
42
- device_connector_factory=PviDeviceConnector,
43
- )
44
-
45
- async def connect(
46
- self, device: Device, mock: bool | Mock, timeout: float, force_reconnect: bool
47
- ) -> None:
48
- if mock:
49
- # Make 2 entries for each DeviceVector
50
- self._filler.make_soft_device_vector_entries(2)
51
- else:
52
- pvi_structure = await pvget_with_timeout(self.pvi_pv, timeout)
53
- entries: dict[str, dict[str, str]] = pvi_structure["value"].todict()
54
- # Ensure we have device vectors for everything that should be there
55
- self._filler.make_device_vectors(list(entries))
56
- for name, entry in entries.items():
57
- if set(entry) == {"d"}:
58
- connector = self._filler.make_child_device(name)
59
- connector.pvi_pv = entry["d"]
60
- else:
61
- signal_type, read_pv, write_pv = _get_signal_details(entry)
62
- backend = self._filler.make_child_signal(name, signal_type)
63
- backend.read_pv = read_pv
64
- backend.write_pv = write_pv
65
- # Check that all the requested children have been created
66
- if unfilled := self._filler.unfilled():
67
- raise RuntimeError(
68
- f"{device.name}: cannot provision {unfilled} from "
69
- f"{self.pvi_pv}: {entries}"
70
- )
71
- # Set the name of the device to name all children
72
- device.set_name(device.name)
73
- return await super().connect(device, mock, timeout, force_reconnect)
@@ -1,20 +0,0 @@
1
- from ._common import get_supported_values
2
- from ._p4p import PvaSignalBackend, pvget_with_timeout
3
- from ._signal import (
4
- epics_signal_r,
5
- epics_signal_rw,
6
- epics_signal_rw_rbv,
7
- epics_signal_w,
8
- epics_signal_x,
9
- )
10
-
11
- __all__ = [
12
- "get_supported_values",
13
- "PvaSignalBackend",
14
- "pvget_with_timeout",
15
- "epics_signal_r",
16
- "epics_signal_rw",
17
- "epics_signal_rw_rbv",
18
- "epics_signal_w",
19
- "epics_signal_x",
20
- ]