ophyd-async 0.2.0__py3-none-any.whl → 0.3.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 (79) hide show
  1. ophyd_async/__init__.py +1 -4
  2. ophyd_async/_version.py +2 -2
  3. ophyd_async/core/__init__.py +52 -19
  4. ophyd_async/core/_providers.py +38 -5
  5. ophyd_async/core/async_status.py +86 -40
  6. ophyd_async/core/detector.py +214 -72
  7. ophyd_async/core/device.py +91 -50
  8. ophyd_async/core/device_save_loader.py +96 -23
  9. ophyd_async/core/flyer.py +32 -246
  10. ophyd_async/core/mock_signal_backend.py +82 -0
  11. ophyd_async/core/mock_signal_utils.py +145 -0
  12. ophyd_async/core/signal.py +225 -58
  13. ophyd_async/core/signal_backend.py +8 -5
  14. ophyd_async/core/{sim_signal_backend.py → soft_signal_backend.py} +51 -49
  15. ophyd_async/core/standard_readable.py +212 -23
  16. ophyd_async/core/utils.py +123 -30
  17. ophyd_async/epics/_backend/_aioca.py +42 -44
  18. ophyd_async/epics/_backend/_p4p.py +96 -52
  19. ophyd_async/epics/_backend/common.py +25 -0
  20. ophyd_async/epics/areadetector/__init__.py +8 -4
  21. ophyd_async/epics/areadetector/aravis.py +63 -0
  22. ophyd_async/epics/areadetector/controllers/__init__.py +2 -1
  23. ophyd_async/epics/areadetector/controllers/ad_sim_controller.py +1 -1
  24. ophyd_async/epics/areadetector/controllers/aravis_controller.py +78 -0
  25. ophyd_async/epics/areadetector/controllers/kinetix_controller.py +49 -0
  26. ophyd_async/epics/areadetector/controllers/pilatus_controller.py +37 -25
  27. ophyd_async/epics/areadetector/controllers/vimba_controller.py +66 -0
  28. ophyd_async/epics/areadetector/drivers/__init__.py +6 -0
  29. ophyd_async/epics/areadetector/drivers/ad_base.py +8 -12
  30. ophyd_async/epics/areadetector/drivers/aravis_driver.py +38 -0
  31. ophyd_async/epics/areadetector/drivers/kinetix_driver.py +27 -0
  32. ophyd_async/epics/areadetector/drivers/pilatus_driver.py +8 -5
  33. ophyd_async/epics/areadetector/drivers/vimba_driver.py +63 -0
  34. ophyd_async/epics/areadetector/kinetix.py +46 -0
  35. ophyd_async/epics/areadetector/pilatus.py +45 -0
  36. ophyd_async/epics/areadetector/single_trigger_det.py +14 -6
  37. ophyd_async/epics/areadetector/utils.py +2 -12
  38. ophyd_async/epics/areadetector/vimba.py +43 -0
  39. ophyd_async/epics/areadetector/writers/_hdffile.py +21 -7
  40. ophyd_async/epics/areadetector/writers/hdf_writer.py +32 -17
  41. ophyd_async/epics/areadetector/writers/nd_file_hdf.py +19 -18
  42. ophyd_async/epics/areadetector/writers/nd_plugin.py +15 -7
  43. ophyd_async/epics/demo/__init__.py +75 -49
  44. ophyd_async/epics/motion/motor.py +67 -53
  45. ophyd_async/epics/pvi/__init__.py +3 -0
  46. ophyd_async/epics/pvi/pvi.py +318 -0
  47. ophyd_async/epics/signal/__init__.py +8 -3
  48. ophyd_async/epics/signal/signal.py +26 -9
  49. ophyd_async/log.py +130 -0
  50. ophyd_async/panda/__init__.py +21 -5
  51. ophyd_async/panda/_common_blocks.py +49 -0
  52. ophyd_async/panda/_hdf_panda.py +48 -0
  53. ophyd_async/panda/_panda_controller.py +37 -0
  54. ophyd_async/panda/_trigger.py +39 -0
  55. ophyd_async/panda/_utils.py +15 -0
  56. ophyd_async/panda/writers/__init__.py +3 -0
  57. ophyd_async/panda/writers/_hdf_writer.py +220 -0
  58. ophyd_async/panda/writers/_panda_hdf_file.py +58 -0
  59. ophyd_async/plan_stubs/__init__.py +13 -0
  60. ophyd_async/plan_stubs/ensure_connected.py +22 -0
  61. ophyd_async/plan_stubs/fly.py +149 -0
  62. ophyd_async/protocols.py +126 -0
  63. ophyd_async/sim/__init__.py +11 -0
  64. ophyd_async/sim/demo/__init__.py +3 -0
  65. ophyd_async/sim/demo/sim_motor.py +103 -0
  66. ophyd_async/sim/pattern_generator.py +318 -0
  67. ophyd_async/sim/sim_pattern_detector_control.py +55 -0
  68. ophyd_async/sim/sim_pattern_detector_writer.py +34 -0
  69. ophyd_async/sim/sim_pattern_generator.py +37 -0
  70. {ophyd_async-0.2.0.dist-info → ophyd_async-0.3.0.dist-info}/METADATA +31 -70
  71. ophyd_async-0.3.0.dist-info/RECORD +86 -0
  72. {ophyd_async-0.2.0.dist-info → ophyd_async-0.3.0.dist-info}/WHEEL +1 -1
  73. ophyd_async/epics/signal/pvi_get.py +0 -22
  74. ophyd_async/panda/panda.py +0 -294
  75. ophyd_async-0.2.0.dist-info/RECORD +0 -53
  76. /ophyd_async/panda/{table.py → _table.py} +0 -0
  77. {ophyd_async-0.2.0.dist-info → ophyd_async-0.3.0.dist-info}/LICENSE +0 -0
  78. {ophyd_async-0.2.0.dist-info → ophyd_async-0.3.0.dist-info}/entry_points.txt +0 -0
  79. {ophyd_async-0.2.0.dist-info → ophyd_async-0.3.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ophyd-async
3
- Version: 0.2.0
3
+ Version: 0.3.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
@@ -35,21 +35,20 @@ License: BSD 3-Clause License
35
35
  Project-URL: GitHub, https://github.com/bluesky/ophyd-async
36
36
  Classifier: Development Status :: 3 - Alpha
37
37
  Classifier: License :: OSI Approved :: BSD License
38
- Classifier: Programming Language :: Python :: 3.9
39
38
  Classifier: Programming Language :: Python :: 3.10
40
39
  Classifier: Programming Language :: Python :: 3.11
41
- Requires-Python: >=3.9
42
- Description-Content-Type: text/x-rst
40
+ Requires-Python: >=3.10
41
+ Description-Content-Type: text/markdown
43
42
  License-File: LICENSE
44
43
  Requires-Dist: networkx >=2.0
45
44
  Requires-Dist: numpy
46
45
  Requires-Dist: packaging
47
46
  Requires-Dist: pint
48
- Requires-Dist: bluesky
49
- Requires-Dist: event-model
47
+ Requires-Dist: bluesky >=1.13.0a3
48
+ Requires-Dist: event-model <1.21.0
50
49
  Requires-Dist: p4p
51
50
  Requires-Dist: pyyaml
52
- Requires-Dist: typing-extensions ; python_version < "3.8"
51
+ Requires-Dist: colorlog
53
52
  Provides-Extra: ca
54
53
  Requires-Dist: aioca >=1.6 ; extra == 'ca'
55
54
  Provides-Extra: dev
@@ -64,7 +63,6 @@ Requires-Dist: inflection ; extra == 'dev'
64
63
  Requires-Dist: ipython ; extra == 'dev'
65
64
  Requires-Dist: ipywidgets ; extra == 'dev'
66
65
  Requires-Dist: matplotlib ; extra == 'dev'
67
- Requires-Dist: mypy ; extra == 'dev'
68
66
  Requires-Dist: myst-parser ; extra == 'dev'
69
67
  Requires-Dist: numpydoc ; extra == 'dev'
70
68
  Requires-Dist: ophyd ; extra == 'dev'
@@ -73,14 +71,16 @@ Requires-Dist: pipdeptree ; extra == 'dev'
73
71
  Requires-Dist: pre-commit ; extra == 'dev'
74
72
  Requires-Dist: pydata-sphinx-theme >=0.12 ; extra == 'dev'
75
73
  Requires-Dist: pyepics >=3.4.2 ; extra == 'dev'
76
- Requires-Dist: pyside6 ; extra == 'dev'
74
+ Requires-Dist: pyside6 ==6.7.0 ; extra == 'dev'
77
75
  Requires-Dist: pytest ; extra == 'dev'
78
76
  Requires-Dist: pytest-asyncio ; extra == 'dev'
79
77
  Requires-Dist: pytest-cov ; extra == 'dev'
80
78
  Requires-Dist: pytest-faulthandler ; extra == 'dev'
81
79
  Requires-Dist: pytest-rerunfailures ; extra == 'dev'
82
80
  Requires-Dist: pytest-timeout ; extra == 'dev'
81
+ Requires-Dist: ruff ; extra == 'dev'
83
82
  Requires-Dist: sphinx-autobuild ; extra == 'dev'
83
+ Requires-Dist: sphinxcontrib-mermaid ; extra == 'dev'
84
84
  Requires-Dist: sphinx-copybutton ; extra == 'dev'
85
85
  Requires-Dist: sphinx-design ; extra == 'dev'
86
86
  Requires-Dist: tox-direct ; extra == 'dev'
@@ -89,75 +89,36 @@ Requires-Dist: types-pyyaml ; extra == 'dev'
89
89
  Provides-Extra: pva
90
90
  Requires-Dist: p4p ; extra == 'pva'
91
91
 
92
- Ophyd Async
93
- ===========
92
+ [![CI](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml/badge.svg)](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml)
93
+ [![Coverage](https://codecov.io/gh/bluesky/ophyd-async/branch/main/graph/badge.svg)](https://codecov.io/gh/bluesky/ophyd-async)
94
+ [![PyPI](https://img.shields.io/pypi/v/ophyd-async.svg)](https://pypi.org/project/ophyd-async)
95
+ [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
94
96
 
95
- |code_ci| |docs_ci| |coverage| |pypi_version| |license|
97
+ # ophyd-async
96
98
 
97
- Asynchronous device abstraction framework, building on `Ophyd`_.
99
+ Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango.
98
100
 
99
- ============== ==============================================================
100
- PyPI ``pip install ophyd-async``
101
- Source code https://github.com/bluesky/ophyd-async
102
- Documentation https://blueskyproject.io/ophyd-async
103
- ============== ==============================================================
101
+ | Source | <https://github.com/bluesky/ophyd-async> |
102
+ | :-----------: | :-----------------------------------------------: |
103
+ | PyPI | `pip install ophyd-async` |
104
+ | Documentation | <https://bluesky.github.io/ophyd-async> |
105
+ | Releases | <https://github.com/bluesky/ophyd-async/releases> |
104
106
 
105
- Python library for asynchronously interfacing with hardware, intended to
106
- be used as an abstraction layer that enables experiment orchestration and data
107
- acquisition code to operate above the specifics of particular devices and control
107
+ Ophyd-async is a Python library for asynchronously interfacing with hardware, intended to
108
+ be used as an abstraction layer that enables experiment orchestration and data acquisition code to operate above the specifics of particular devices and control
108
109
  systems.
109
110
 
110
- Both ophyd and ophyd-async are typically used with the `Bluesky Run Engine`_ for
111
- experiment orchestration and data acquisition. However, these libraries are
112
- able to be used in a stand-alone fashion. For an example of how a facility defines
113
- and uses ophyd-async devices, see `dls-dodal`_, which is currently using a
114
- mixture of ophyd and ophyd-async devices.
111
+ Both ophyd and ophyd-async are typically used with the [Bluesky Run Engine][] for experiment orchestration and data acquisition.
115
112
 
116
- While `EPICS`_ is the most common control system layer that ophyd-async can
117
- interface with, other control systems like `Tango`_ are used by some facilities
118
- also. In addition to the abstractions provided by ophyd, ophyd-async allows:
113
+ While [EPICS][] is the most common control system layer that ophyd-async can interface with, support for other control systems like [Tango][] will be supported in the future. The focus of ophyd-async is:
119
114
 
120
- * Asynchronous signal access, opening the possibility for hardware-triggered
121
- scanning (also known as fly-scanning)
122
- * Simpler instantiation of devices (groupings of signals) with less reliance
123
- upon complex class hierarchies
115
+ * Asynchronous signal access, opening the possibility for hardware-triggered scanning (also known as fly-scanning)
116
+ * Simpler instantiation of devices (groupings of signals) with less reliance upon complex class hierarchies
124
117
 
125
- NOTE: ophyd-async is included on a provisional basis until the v1.0 release.
118
+ [Bluesky Run Engine]: http://blueskyproject.io/bluesky
119
+ [EPICS]: http://www.aps.anl.gov/epics/
120
+ [Tango]: https://www.tango-controls.org/
126
121
 
127
- See the tutorials for usage examples.
122
+ <!-- README only content. Anything below this line won't be included in index.md -->
128
123
 
129
- .. |code_ci| image:: https://github.com/bluesky/ophyd-async/actions/workflows/code.yml/badge.svg?branch=main
130
- :target: https://github.com/bluesky/ophyd-async/actions/workflows/code.yml
131
- :alt: Code CI
132
-
133
- .. |docs_ci| image:: https://github.com/bluesky/ophyd-async/actions/workflows/docs.yml/badge.svg?branch=main
134
- :target: https://github.com/bluesky/ophyd-async/actions/workflows/docs.yml
135
- :alt: Docs CI
136
-
137
- .. |coverage| image:: https://codecov.io/gh/bluesky/ophyd-async/branch/master/graph/badge.svg
138
- :target: https://codecov.io/gh/bluesky/ophyd-async
139
- :alt: Test Coverage
140
-
141
- .. |pypi_version| image:: https://img.shields.io/pypi/v/ophyd-async.svg
142
- :target: https://pypi.org/project/ophyd-async
143
- :alt: Latest PyPI version
144
-
145
- .. |license| image:: https://img.shields.io/badge/License-BSD%203--Clause-blue.svg
146
- :target: https://opensource.org/licenses/BSD-3-Clause
147
- :alt: BSD 3-Clause License
148
-
149
- .. _Bluesky Run Engine: http://blueskyproject.io/bluesky
150
-
151
- .. _Ophyd: http://blueskyproject.io/ophyd
152
-
153
- .. _dls-dodal: https://github.com/DiamondLightSource/dodal
154
-
155
- .. _EPICS: http://www.aps.anl.gov/epics/
156
-
157
- .. _Tango: https://www.tango-controls.org/
158
-
159
- ..
160
- Anything below this line is used when viewing README.rst and will be replaced
161
- when included in index.rst
162
-
163
- See https://blueskyproject.io/ophyd-async for more detailed documentation.
124
+ See https://bluesky.github.io/ophyd-async for more detailed documentation.
@@ -0,0 +1,86 @@
1
+ ophyd_async/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
2
+ ophyd_async/__main__.py,sha256=G-Zcv_G9zK7Nhx6o5L5w-wyhMxdl_WgyMELu8IMFqAE,328
3
+ ophyd_async/_version.py,sha256=Jk2iAU7m-7Vx9XV1TtdD9ZoJraIncDq_4_Wd-qtUotg,411
4
+ ophyd_async/log.py,sha256=DbMjt0bkfUOLHIinZYt0Q0FHZmCXXi5x8y0uFiEmqoQ,3587
5
+ ophyd_async/protocols.py,sha256=EF2W9nfElV-0QNMYrX1zusL1PqDJR3kNsjlalR29j0I,3412
6
+ ophyd_async/core/__init__.py,sha256=znjVeRfrDVJbGLEkUczeKMW46kV6HDrlE4lV0SqvZt4,2952
7
+ ophyd_async/core/_providers.py,sha256=LrlTMPHKXWOPVkpAOw-pqBq0kip-c3C9ZZPoFfiaV4M,2212
8
+ ophyd_async/core/async_status.py,sha256=9TOgOXIAuH62RDo5t-Y5GdjrJ76d_6TFlBxYv-5_a88,4367
9
+ ophyd_async/core/detector.py,sha256=8mdLKphirgit5CVCklJI9eHqKKiCz4CYs9BElo10-lc,11007
10
+ ophyd_async/core/device.py,sha256=280zFnLCoiMZAA-Dh1_AjUSnhxUfKYGgj4H_2S1njOA,7086
11
+ ophyd_async/core/device_save_loader.py,sha256=RXA3dPUPihAR2ZGDStlGiA-TAsr_xqL0snsCjMsMnfA,9138
12
+ ophyd_async/core/flyer.py,sha256=bIjzBkrl8HVAlKgsZ_FF0WL69Qvksyzp9ZWmTLl8Yrw,2304
13
+ ophyd_async/core/mock_signal_backend.py,sha256=Ug6jK72wm9vM6EueoUrYgcXtiFzdPUEISRe86LdyYKc,2844
14
+ ophyd_async/core/mock_signal_utils.py,sha256=bF8MVZA1j9zCmS2tBbgUdfwNmcHniHixnmotjd0g7hs,4083
15
+ ophyd_async/core/signal.py,sha256=FbTb5qDPLhVxEbh6gimqXfkZwcqB4ymHTEYVXZVZYrk,16456
16
+ ophyd_async/core/signal_backend.py,sha256=fT3q0WED3JHmNKYCs7PzDLCK4cUPVin3wQjDNPdHqAY,1525
17
+ ophyd_async/core/soft_signal_backend.py,sha256=56zvcEi4c8n1yYbafTbp7X0VhSkhoehm3L8RBhu2fik,5596
18
+ ophyd_async/core/standard_readable.py,sha256=uVG3vs3s7-Kzg5dRCtT4I2mhZPqwVGYy2dxNmaOpDVU,8980
19
+ ophyd_async/core/utils.py,sha256=3oZcXNqAUHX4ZWMBH5gSuK6cFWEhSkZ9GSDYv0pf8jc,5783
20
+ ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ ophyd_async/epics/_backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ ophyd_async/epics/_backend/_aioca.py,sha256=cpPNZmRMi7FnAh2-3ec5uklLVFOqsmEmpI1nh5Ud1Ls,8794
23
+ ophyd_async/epics/_backend/_p4p.py,sha256=lIKx7kQ2o8h3M4wPwrq8JBo8xuDnasJxpDH2ATVBY78,12257
24
+ ophyd_async/epics/_backend/common.py,sha256=16mAuxDwA3eZFjUW8DHMabaW3CtEI0Qe8DLpP2xlW7Y,814
25
+ ophyd_async/epics/areadetector/__init__.py,sha256=ViKzx-wUxkRyNR33wfpL11QB97o0J47_KMyI2C_NphI,510
26
+ ophyd_async/epics/areadetector/aravis.py,sha256=YklN4V0loqUQBs4swVX304N49JIGPvrNOk8iA5EWofg,2127
27
+ ophyd_async/epics/areadetector/kinetix.py,sha256=7rE2MLnz9DEmeiN9pCekDfpXuZ2DErnMajRp_9eoLZY,1359
28
+ ophyd_async/epics/areadetector/pilatus.py,sha256=ki-BOBCEIiUD2wAtmujBIB1eX-nbXB4yMLJK_Q3opRM,1398
29
+ ophyd_async/epics/areadetector/single_trigger_det.py,sha256=U92dqhioIfnve3jtCThq9gXBCdEzzqzY4ezk6rZV19g,1182
30
+ ophyd_async/epics/areadetector/utils.py,sha256=p66UbVdKRFj6Sm1Qvm23kmlVyBMMqIvXFxA3x17YnSk,2824
31
+ ophyd_async/epics/areadetector/vimba.py,sha256=IxG8KLzfb84iLtzf6ZoX9JikqZLP49lwkWu33bkDV9Y,1291
32
+ ophyd_async/epics/areadetector/controllers/__init__.py,sha256=af58ci7X2z2s_FyUwR3IGQrws8q4TKcBw7vFyIS5FoI,217
33
+ ophyd_async/epics/areadetector/controllers/ad_sim_controller.py,sha256=mthZ6WxajMEgUKptq3bnkIctbLhjzTagV66i1auB8cg,1587
34
+ ophyd_async/epics/areadetector/controllers/aravis_controller.py,sha256=CIfnZdq_NobO_UMC2TJoAfUEP9GlzZg5z5bz6Dn1DxY,2669
35
+ ophyd_async/epics/areadetector/controllers/kinetix_controller.py,sha256=9QmydX85QOXfQL_UX49M9EQ2b2hUZPVzLxgGQn-A9Oc,1611
36
+ ophyd_async/epics/areadetector/controllers/pilatus_controller.py,sha256=cd1CKkaXlwkpQ0I1VL7nN0U8R4VweTsa08WhvHYI4nY,2243
37
+ ophyd_async/epics/areadetector/controllers/vimba_controller.py,sha256=Eh4Hr9rWgq1mKvE93JzgixntjPHxF3_07GTFqiOdZqE,2123
38
+ ophyd_async/epics/areadetector/drivers/__init__.py,sha256=-Ib0Lz4fFQQmB7K0uFxMDvAerkLxadMQERH7lNAvrs4,495
39
+ ophyd_async/epics/areadetector/drivers/ad_base.py,sha256=18WFAiWEUg0H2LcvTQHrKYj2wThGafQzDpiyAWki6vo,3411
40
+ ophyd_async/epics/areadetector/drivers/aravis_driver.py,sha256=PmIygsVNoxxYHvZZzFAbAm2DXmXFc13nAzL_DJB6YSU,1464
41
+ ophyd_async/epics/areadetector/drivers/kinetix_driver.py,sha256=yIV23BkGBJ4i0VskLiLL7AFbadCCR6Ch1UwUDJ9r2YM,743
42
+ ophyd_async/epics/areadetector/drivers/pilatus_driver.py,sha256=0DsUu9vAPXDa2v8_V0f_kPjBtLu3y4_EkmFfFjYO4Gk,553
43
+ ophyd_async/epics/areadetector/drivers/vimba_driver.py,sha256=J54VtWkOklfbSqZYxGWH1e6Uzm9_Gph_ZbCf9Zax0LU,1713
44
+ ophyd_async/epics/areadetector/writers/__init__.py,sha256=tpPcrYd1hs8WS7C0gmCnR2EBwjE5RzCljI7WwZ2V_LM,191
45
+ ophyd_async/epics/areadetector/writers/_hdfdataset.py,sha256=E0C9VgsPyY35h7k0mvcIhjsIVNavApLxizqNWlM388w,167
46
+ ophyd_async/epics/areadetector/writers/_hdffile.py,sha256=YtUgOKX53m0TaFEGBW671qXqNuuEKxEyLV5Ein1fjvo,1799
47
+ ophyd_async/epics/areadetector/writers/hdf_writer.py,sha256=ZpbVilNVv81OpbCrqaeZUoHLarrjzRWEGe-zI1Wxyyw,5436
48
+ ophyd_async/epics/areadetector/writers/nd_file_hdf.py,sha256=EkiaEh_0U6Iz17jFi2IIsRPsVQTQIJRG8EPNCiAHkkU,1762
49
+ ophyd_async/epics/areadetector/writers/nd_plugin.py,sha256=GUzaeTMdG07Rb1x0WzBBxMEltBhr10jb5dL29tEWXEQ,1547
50
+ ophyd_async/epics/demo/__init__.py,sha256=ZcuZ66aIQ58WSydLOSKnk-h_W-aWjhDRZkWQA6f3sig,5790
51
+ ophyd_async/epics/demo/demo_ad_sim_detector.py,sha256=06y65yvaqXvL2rDocjYyLz9kTVzuwV-LeuPhEfExdOA,944
52
+ ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
53
+ ophyd_async/epics/demo/sensor.db,sha256=AVtiydrdtwAz2EFurO2Ult9SSRtre3r0akOBbL98LT0,554
54
+ ophyd_async/epics/motion/__init__.py,sha256=tnmVRIwKa9PdN_xonJdAUD04UpEceh-hoD7XI62yDB0,46
55
+ ophyd_async/epics/motion/motor.py,sha256=G8cc-okSXJ6s2fGxRO155xm7PrBbVImBmBMRWts895k,3630
56
+ ophyd_async/epics/pvi/__init__.py,sha256=TbOQNY4enQWgtr1T7x129vpo2p7FIFlr8cyZqqv5Lk4,158
57
+ ophyd_async/epics/pvi/pvi.py,sha256=PJdY3rCRyIQbsbHDru-TJ-IVOItyaQwCQKAC0Widu6A,11363
58
+ ophyd_async/epics/signal/__init__.py,sha256=JXKBSGpRL9y3auh27JRxsqDn_rBOXpJjtd4nCuDOX2g,261
59
+ ophyd_async/epics/signal/_epics_transport.py,sha256=DEIL0iYUAWssysVEgWGu1fHSM1l-ATV2kjUgPtDN9LY,858
60
+ ophyd_async/epics/signal/signal.py,sha256=M8ZVG_zLdYJfroCRX-u_w8c3yIhswSRw8e3RkW2szio,3166
61
+ ophyd_async/panda/__init__.py,sha256=FuSnvp-RtdA0X4RcHEF0nTiXymRts2MNdFmF_1_i41w,775
62
+ ophyd_async/panda/_common_blocks.py,sha256=n0PPc1rar43oDSIA-yNubTc8fR5YCW1tyjQU58whsg0,1038
63
+ ophyd_async/panda/_hdf_panda.py,sha256=QjfZyYos0ZBlIqBiZ5UbyEd_wuh_cGzwV8QE9jvLiIY,1419
64
+ ophyd_async/panda/_panda_controller.py,sha256=dIqcjmaIHVrki8UXSoDx46kk6I2Lhpe2o3sXNg5f-RQ,1238
65
+ ophyd_async/panda/_table.py,sha256=dLoRP4zYNOkD_s0Vkp2wVYAwkjVG8nNdf8-FaXOTfPo,5655
66
+ ophyd_async/panda/_trigger.py,sha256=tBH8uq_4o1ASG9yofVxq3tjf5v8LPzniDTRL4yjramI,1195
67
+ ophyd_async/panda/_utils.py,sha256=VHW5kPVISyEkmse_qQcyisBkkEwMO6GG2Ago-CH1AFA,487
68
+ ophyd_async/panda/writers/__init__.py,sha256=xy7BguVQG4HNIDBfKPjMj0KQo1tptC9LbCpEuMcVGaM,70
69
+ ophyd_async/panda/writers/_hdf_writer.py,sha256=vnyIg3JmlzMIIq75o0IDMfGzBm_GJAhOUisAZE_0cyg,7597
70
+ ophyd_async/panda/writers/_panda_hdf_file.py,sha256=42iHaTax4JjOBpNC7d4nkNL9SM14OTnFPTIcXv2jg-4,1759
71
+ ophyd_async/plan_stubs/__init__.py,sha256=nO9ELG9J7fYwfVTVRWVorz4kffeszYpwk1ROh6Ha--w,405
72
+ ophyd_async/plan_stubs/ensure_connected.py,sha256=1MkDu8UqVRPHLnW9IXRn-QvKiG8-rCV8T4KDbjf9K6w,557
73
+ ophyd_async/plan_stubs/fly.py,sha256=nl8XLoY7hvlam6H3zl4NcPRUiEJ3xIjopHEfA0ehTDg,4845
74
+ ophyd_async/sim/__init__.py,sha256=ScjH1g7FMo5yPACfJRZE6xGBWCHU4bKDzNQk1tqObnA,366
75
+ ophyd_async/sim/pattern_generator.py,sha256=pvSk2zb82D08j2jiKAMqMAfRohGnYd_rpjUraLrCD6c,10640
76
+ ophyd_async/sim/sim_pattern_detector_control.py,sha256=Ypz8IuRYAY2J243IhVbNyGr_Z-XtpJZ1qxma6NR3TgM,1838
77
+ ophyd_async/sim/sim_pattern_detector_writer.py,sha256=ESpcVyHd1TP7Cojznv2hJAwLinu3XbgAiVKfX12FCII,1237
78
+ ophyd_async/sim/sim_pattern_generator.py,sha256=fbcwWxTPYKLK33OzIY15vGylnonOO8HIudz1y_56GZU,1336
79
+ ophyd_async/sim/demo/__init__.py,sha256=9mxKpslrL89cfSj4g3og8Br3O--pMj3hhWZS-Xu6kyA,56
80
+ ophyd_async/sim/demo/sim_motor.py,sha256=a2p5wnHXjF-V5zOFai7jnszk4kbGmrZRnUqBtkOgEfQ,3733
81
+ ophyd_async-0.3.0.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
82
+ ophyd_async-0.3.0.dist-info/METADATA,sha256=aNVgEtFpaffvpH6YavrgqWN48m0HO0m38POJ17FPjGM,6285
83
+ ophyd_async-0.3.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
84
+ ophyd_async-0.3.0.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
85
+ ophyd_async-0.3.0.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
86
+ ophyd_async-0.3.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.3)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,22 +0,0 @@
1
- from typing import Dict, TypedDict
2
-
3
- from p4p.client.asyncio import Context
4
-
5
-
6
- class PVIEntry(TypedDict, total=False):
7
- d: str
8
- r: str
9
- rw: str
10
- w: str
11
- x: str
12
-
13
-
14
- async def pvi_get(pv: str, ctxt: Context, timeout: float = 5.0) -> Dict[str, PVIEntry]:
15
- pv_info = ctxt.get(pv, timeout=timeout).get("pvi").todict()
16
-
17
- result = {}
18
-
19
- for attr_name, attr_info in pv_info.items():
20
- result[attr_name] = PVIEntry(**attr_info) # type: ignore
21
-
22
- return result
@@ -1,294 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import atexit
4
- import re
5
- from typing import (
6
- Callable,
7
- Dict,
8
- FrozenSet,
9
- Optional,
10
- Tuple,
11
- Type,
12
- TypedDict,
13
- cast,
14
- get_args,
15
- get_origin,
16
- get_type_hints,
17
- )
18
-
19
- from p4p.client.thread import Context
20
-
21
- from ophyd_async.core import (
22
- Device,
23
- DeviceVector,
24
- Signal,
25
- SignalBackend,
26
- SignalR,
27
- SignalRW,
28
- SignalX,
29
- SimSignalBackend,
30
- )
31
- from ophyd_async.epics.signal import (
32
- epics_signal_r,
33
- epics_signal_rw,
34
- epics_signal_w,
35
- epics_signal_x,
36
- pvi_get,
37
- )
38
- from ophyd_async.panda.table import SeqTable
39
-
40
-
41
- class PulseBlock(Device):
42
- delay: SignalRW[float]
43
- width: SignalRW[float]
44
-
45
-
46
- class SeqBlock(Device):
47
- table: SignalRW[SeqTable]
48
- active: SignalRW[bool]
49
-
50
-
51
- class PcapBlock(Device):
52
- active: SignalR[bool]
53
-
54
-
55
- class PVIEntry(TypedDict, total=False):
56
- d: str
57
- r: str
58
- rw: str
59
- w: str
60
- x: str
61
-
62
-
63
- def _block_name_number(block_name: str) -> Tuple[str, Optional[int]]:
64
- """Maps a panda block name to a block and number.
65
-
66
- There are exceptions to this rule; some blocks like pcap do not contain numbers.
67
- Other blocks may contain numbers and letters, but no numbers at the end.
68
-
69
- Such block names will only return the block name, and not a number.
70
-
71
- If this function returns both a block name and number, it should be instantiated
72
- into a device vector."""
73
- m = re.match("^([0-9a-z_-]*)([0-9]+)$", block_name)
74
- if m is not None:
75
- name, num = m.groups()
76
- return name, int(num or 1) # just to pass type checks.
77
-
78
- return block_name, None
79
-
80
-
81
- def _remove_inconsistent_blocks(pvi_info: Dict[str, PVIEntry]) -> None:
82
- """Remove blocks from pvi information.
83
-
84
- This is needed because some pandas have 'pcap' and 'pcap1' blocks, which are
85
- inconsistent with the assumption that pandas should only have a 'pcap' block,
86
- for example.
87
-
88
- """
89
- pvi_keys = set(pvi_info.keys())
90
- for k in pvi_keys:
91
- kn = re.sub(r"\d*$", "", k)
92
- if kn and k != kn and kn in pvi_keys:
93
- del pvi_info[k]
94
-
95
-
96
- async def pvi(pv: str, ctxt: Context, timeout: float = 5.0) -> Dict[str, PVIEntry]:
97
- result = await pvi_get(pv, ctxt, timeout=timeout)
98
- _remove_inconsistent_blocks(result)
99
- return result
100
-
101
-
102
- class PandA(Device):
103
- _ctxt: Optional[Context] = None
104
-
105
- pulse: DeviceVector[PulseBlock]
106
- seq: DeviceVector[SeqBlock]
107
- pcap: PcapBlock
108
-
109
- def __init__(self, pv: str) -> None:
110
- self._init_prefix = pv
111
- self.pvi_mapping: Dict[FrozenSet[str], Callable[..., Signal]] = {
112
- frozenset({"r", "w"}): lambda dtype, rpv, wpv: epics_signal_rw(
113
- dtype, rpv, wpv
114
- ),
115
- frozenset({"rw"}): lambda dtype, rpv, wpv: epics_signal_rw(dtype, rpv, wpv),
116
- frozenset({"r"}): lambda dtype, rpv, wpv: epics_signal_r(dtype, rpv),
117
- frozenset({"w"}): lambda dtype, rpv, wpv: epics_signal_w(dtype, wpv),
118
- frozenset({"x"}): lambda dtype, rpv, wpv: epics_signal_x(wpv),
119
- }
120
-
121
- @property
122
- def ctxt(self) -> Context:
123
- if PandA._ctxt is None:
124
- PandA._ctxt = Context("pva", nt=False)
125
-
126
- @atexit.register
127
- def _del_ctxt():
128
- # If we don't do this we get messages like this on close:
129
- # Error in sys.excepthook:
130
- # Original exception was:
131
- PandA._ctxt = None
132
-
133
- return PandA._ctxt
134
-
135
- def verify_block(self, name: str, num: Optional[int]):
136
- """Given a block name and number, return information about a block."""
137
- anno = get_type_hints(self, globalns=globals()).get(name)
138
-
139
- block: Device = Device()
140
-
141
- if anno:
142
- type_args = get_args(anno)
143
- block = type_args[0]() if type_args else anno()
144
-
145
- if not type_args:
146
- assert num is None, f"Only expected one {name} block, got {num}"
147
-
148
- return block
149
-
150
- async def _make_block(
151
- self, name: str, num: Optional[int], block_pv: str, sim: bool = False
152
- ):
153
- """Makes a block given a block name containing relevant signals.
154
-
155
- Loops through the signals in the block (found using type hints), if not in
156
- sim mode then does a pvi call, and identifies this signal from the pvi call.
157
- """
158
- block = self.verify_block(name, num)
159
-
160
- field_annos = get_type_hints(block, globalns=globals())
161
- block_pvi = await pvi(block_pv, self.ctxt) if not sim else None
162
-
163
- # finds which fields this class actually has, e.g. delay, width...
164
- for sig_name, sig_type in field_annos.items():
165
- origin = get_origin(sig_type)
166
- args = get_args(sig_type)
167
-
168
- # if not in sim mode,
169
- if block_pvi:
170
- block_pvi = cast(Dict[str, PVIEntry], block_pvi)
171
- # try to get this block in the pvi.
172
- entry: Optional[PVIEntry] = block_pvi.get(sig_name)
173
- if entry is None:
174
- raise Exception(
175
- f"{self.__class__.__name__} has a {name} block containing a/"
176
- + f"an {sig_name} signal which has not been retrieved by PVI."
177
- )
178
-
179
- signal = self._make_signal(entry, args[0] if len(args) > 0 else None)
180
-
181
- else:
182
- backend: SignalBackend = SimSignalBackend(
183
- args[0] if len(args) > 0 else None, block_pv
184
- )
185
- signal = SignalX(backend) if not origin else origin(backend)
186
-
187
- setattr(block, sig_name, signal)
188
-
189
- # checks for any extra pvi information not contained in this class
190
- if block_pvi:
191
- for attr, attr_pvi in block_pvi.items():
192
- if not hasattr(block, attr):
193
- # makes any extra signals
194
- signal = self._make_signal(attr_pvi)
195
- setattr(block, attr, signal)
196
-
197
- return block
198
-
199
- async def _make_untyped_block(self, block_pv: str):
200
- """Populates a block using PVI information.
201
-
202
- This block is not typed as part of the PandA interface but needs to be
203
- included dynamically anyway.
204
- """
205
- block = Device()
206
- block_pvi: Dict[str, PVIEntry] = await pvi(block_pv, self.ctxt)
207
-
208
- for signal_name, signal_pvi in block_pvi.items():
209
- signal = self._make_signal(signal_pvi)
210
- setattr(block, signal_name, signal)
211
-
212
- return block
213
-
214
- def _make_signal(self, signal_pvi: PVIEntry, dtype: Optional[Type] = None):
215
- """Make a signal.
216
-
217
- This assumes datatype is None so it can be used to create dynamic signals.
218
- """
219
- operations = frozenset(signal_pvi.keys())
220
- pvs = [signal_pvi[i] for i in operations] # type: ignore
221
- signal_factory = self.pvi_mapping[operations]
222
-
223
- write_pv = pvs[0]
224
- read_pv = write_pv if len(pvs) == 1 else pvs[1]
225
-
226
- return signal_factory(dtype, "pva://" + read_pv, "pva://" + write_pv)
227
-
228
- # TODO redo to set_panda_block? confusing name
229
- def set_attribute(self, name: str, num: Optional[int], block: Device):
230
- """Set a block on the panda.
231
-
232
- Need to be able to set device vectors on the panda as well, e.g. if num is not
233
- None, need to be able to make a new device vector and start populating it...
234
- """
235
- anno = get_type_hints(self, globalns=globals()).get(name)
236
-
237
- # if it's an annotated device vector, or it isn't but we've got a number then
238
- # make a DeviceVector on the class
239
- if get_origin(anno) == DeviceVector or (not anno and num is not None):
240
- self.__dict__.setdefault(name, DeviceVector())[num] = block
241
- else:
242
- setattr(self, name, block)
243
-
244
- async def connect(self, sim=False) -> None:
245
- """Initialises all blocks and connects them.
246
-
247
- First, checks for pvi information. If it exists, make all blocks from this.
248
- Then, checks that all required blocks in the PandA have been made.
249
-
250
- If there's no pvi information, that's because we're in sim mode. In that case,
251
- makes all required blocks.
252
- """
253
- pvi_info = await pvi(self._init_prefix + ":PVI", self.ctxt) if not sim else None
254
- hints = {
255
- attr_name: attr_type
256
- for attr_name, attr_type in get_type_hints(self, globalns=globals()).items()
257
- if not attr_name.startswith("_")
258
- }
259
-
260
- # create all the blocks pvi says it should have,
261
- if pvi_info:
262
- pvi_info = cast(Dict[str, PVIEntry], pvi_info)
263
- for block_name, block_pvi in pvi_info.items():
264
- name, num = _block_name_number(block_name)
265
-
266
- if name in hints:
267
- block = await self._make_block(name, num, block_pvi["d"])
268
- else:
269
- block = await self._make_untyped_block(block_pvi["d"])
270
-
271
- self.set_attribute(name, num, block)
272
-
273
- # then check if the ones defined in this class are in the pvi info
274
- # make them if there is no pvi info, i.e. sim mode.
275
- for block_name in hints.keys():
276
- if pvi_info is not None:
277
- pvi_name = block_name
278
-
279
- if get_origin(hints[block_name]) == DeviceVector:
280
- pvi_name += "1"
281
-
282
- entry: Optional[PVIEntry] = pvi_info.get(pvi_name)
283
-
284
- assert entry, f"Expected PandA to contain {block_name} block."
285
- assert list(entry) == [
286
- "d"
287
- ], f"Expected PandA to only contain blocks, got {entry}"
288
- else:
289
- num = 1 if get_origin(hints[block_name]) == DeviceVector else None
290
- block = await self._make_block(block_name, num, "sim://", sim=sim)
291
- self.set_attribute(block_name, num, block)
292
-
293
- self.set_name(self.name)
294
- await super().connect(sim)
@@ -1,53 +0,0 @@
1
- ophyd_async/__init__.py,sha256=WJoRU7gO-hRzyf7a-C952zF6-7zwPjP7qZ1Qu5GTUC8,124
2
- ophyd_async/__main__.py,sha256=G-Zcv_G9zK7Nhx6o5L5w-wyhMxdl_WgyMELu8IMFqAE,328
3
- ophyd_async/_version.py,sha256=H-qsvrxCpdhaQzyddR-yajEqI71hPxLa4KxzpP3uS1g,411
4
- ophyd_async/core/__init__.py,sha256=Us5DMr4ys-P4_zKWs6rN-J8QipWpOjAsmF5Cu0BY9k8,2188
5
- ophyd_async/core/_providers.py,sha256=sgEv6MabSKlrFwB8TEoTU7qKiQ6D1YsO33q2E3oKK_M,940
6
- ophyd_async/core/async_status.py,sha256=j3sE2zCvfg0GZWVY1NCEhdkdrqGhwtoDqwX_SVnFhbA,2765
7
- ophyd_async/core/detector.py,sha256=seeokcIRBj-maUuODUOKxesXRJjZLuEhOh6BzDmdIQI,6375
8
- ophyd_async/core/device.py,sha256=4PCvf7MU91CiWvJf0ERWEWE5wu7XPNrUND1ScxzMOXY,5958
9
- ophyd_async/core/device_save_loader.py,sha256=oAxWleSSOUD5TrnZWjOOmsVEfk2dE0cOvdwLTkEifvQ,6935
10
- ophyd_async/core/flyer.py,sha256=n3lqcvfXJiZooXXJocvaN6Wzi3wsqIPKzG4jD5veO7o,9970
11
- ophyd_async/core/signal.py,sha256=2szVlaxdZwc5z8gtnH8Yaol1jQIMrNMwhNWlvdZtwwI,11589
12
- ophyd_async/core/signal_backend.py,sha256=brD1MTug_AkNj3hDkhz6CxG5ygE1LF4AS9YVWCMFI0M,1312
13
- ophyd_async/core/sim_signal_backend.py,sha256=XZ2NCgoLnVPJyqwhRRhuUjY4TRXrVl6zH-5UAVLJGvY,5539
14
- ophyd_async/core/standard_readable.py,sha256=9cBetIYttAho-7wOB3T1YgSJy0iWEFTAdn9jZkrGvLA,2560
15
- ophyd_async/core/utils.py,sha256=uxmKSbLsRizna482Zsl2q14H_jiM3JksqHCFkp_QYIM,3193
16
- ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- ophyd_async/epics/_backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- ophyd_async/epics/_backend/_aioca.py,sha256=izEUbxHKRLalsbcfybmMKUHw7NvDOvST4lqzIRxlOwg,9033
19
- ophyd_async/epics/_backend/_p4p.py,sha256=vrCjX2W6mkghZfyCFI_i5VLhG3380nyW1-HiupzRjKQ,11001
20
- ophyd_async/epics/areadetector/__init__.py,sha256=oEOzL7gEVVSULeT2WkFrva8lUKeX0zmQD0tmwFz6L24,325
21
- ophyd_async/epics/areadetector/single_trigger_det.py,sha256=q5mG-OUVagIjvXLb28lsrGj4eUSoH2pNW2rT4rQR8fA,1206
22
- ophyd_async/epics/areadetector/utils.py,sha256=dez54oElIkGMnhSM9qghToUB1opSqjdWTV2vhHCgRMA,3133
23
- ophyd_async/epics/areadetector/controllers/__init__.py,sha256=UG2-M5d2ykp2T8isQJCbAsGZF1aH0BtC_OPlzzPTjnA,149
24
- ophyd_async/epics/areadetector/controllers/ad_sim_controller.py,sha256=Q5GT7nzXWL3MxJ25b6rab_qft-XQtwGEfrGG9dNKJcA,1591
25
- ophyd_async/epics/areadetector/controllers/pilatus_controller.py,sha256=n9Gkq2RtPnTzdoqpKArvod92Nu1Jo7XHJBGUkZr-N2s,1556
26
- ophyd_async/epics/areadetector/drivers/__init__.py,sha256=AOpIEYfoBhG9Nc4-SId99v4PpyEh4_RBXfNaqiXlwUI,315
27
- ophyd_async/epics/areadetector/drivers/ad_base.py,sha256=ikfyNcZwJa5ah52DckjrBzkMMT_eDY1smM4XWfb6A6E,3689
28
- ophyd_async/epics/areadetector/drivers/pilatus_driver.py,sha256=cn5WNz913UOnOttw2bssjV2Bo3p9SuJma3ckRyCdvw8,442
29
- ophyd_async/epics/areadetector/writers/__init__.py,sha256=tpPcrYd1hs8WS7C0gmCnR2EBwjE5RzCljI7WwZ2V_LM,191
30
- ophyd_async/epics/areadetector/writers/_hdfdataset.py,sha256=E0C9VgsPyY35h7k0mvcIhjsIVNavApLxizqNWlM388w,167
31
- ophyd_async/epics/areadetector/writers/_hdffile.py,sha256=bFVDlVIMXANtE146DCm4uVbnYaibQM8Qzoa32XcwMJg,1373
32
- ophyd_async/epics/areadetector/writers/hdf_writer.py,sha256=_JAU6CSOigxi7SW6Wbu1jX7__8U-03HkjaPLF5VfHfQ,4666
33
- ophyd_async/epics/areadetector/writers/nd_file_hdf.py,sha256=rutCstILCGGwhP5pH_2lWM2QUcZ88-uxx5dTZIJUMWQ,1562
34
- ophyd_async/epics/areadetector/writers/nd_plugin.py,sha256=l0yBBEazviyFsWJv_4_sfGn_YM_Iyd0_SlMdAmUlXDU,871
35
- ophyd_async/epics/demo/__init__.py,sha256=DbVO4ufJWjQnZteilW8SBs5A8DN-Xajn0YibM0q8UkE,5500
36
- ophyd_async/epics/demo/demo_ad_sim_detector.py,sha256=06y65yvaqXvL2rDocjYyLz9kTVzuwV-LeuPhEfExdOA,944
37
- ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
38
- ophyd_async/epics/demo/sensor.db,sha256=AVtiydrdtwAz2EFurO2Ult9SSRtre3r0akOBbL98LT0,554
39
- ophyd_async/epics/motion/__init__.py,sha256=tnmVRIwKa9PdN_xonJdAUD04UpEceh-hoD7XI62yDB0,46
40
- ophyd_async/epics/motion/motor.py,sha256=lQcA3PSPxA6XOnk8y5VuJGnKTq2VjkcO6ldCrssGr3M,3392
41
- ophyd_async/epics/signal/__init__.py,sha256=M1dz74L_SM5Qf3GRuQVKn-1Pvs-CEOCkoxyg1J-etHM,232
42
- ophyd_async/epics/signal/_epics_transport.py,sha256=DEIL0iYUAWssysVEgWGu1fHSM1l-ATV2kjUgPtDN9LY,858
43
- ophyd_async/epics/signal/pvi_get.py,sha256=YTNQ9nXi1v8Rig54goc4_nFTxoH_wmF3yl75FzkdXy4,479
44
- ophyd_async/epics/signal/signal.py,sha256=7GnGa4CgFgTwyHeh4wYOJ2GEWwdXsC6vHD3z9LsaHaM,2543
45
- ophyd_async/panda/__init__.py,sha256=1fyb-sP56K5zDmhKrn97YzMe7hL7LscHGgogqkGEobU,420
46
- ophyd_async/panda/panda.py,sha256=ThNzYarMlmyLqrUsDo-vjd-IxYLxnqKDIwvcBKWzED0,9901
47
- ophyd_async/panda/table.py,sha256=dLoRP4zYNOkD_s0Vkp2wVYAwkjVG8nNdf8-FaXOTfPo,5655
48
- ophyd_async-0.2.0.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
49
- ophyd_async-0.2.0.dist-info/METADATA,sha256=hF1Gj4qjAmUc2eeaX3RA8awW41LYrkSieBJ5y36pqsI,7197
50
- ophyd_async-0.2.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
51
- ophyd_async-0.2.0.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
52
- ophyd_async-0.2.0.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
53
- ophyd_async-0.2.0.dist-info/RECORD,,
File without changes