ophyd-async 0.14.1__py3-none-any.whl → 0.15__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 (38) hide show
  1. ophyd_async/_version.py +2 -2
  2. ophyd_async/core/__init__.py +17 -5
  3. ophyd_async/core/{_table.py → _datatypes.py} +18 -9
  4. ophyd_async/core/_derived_signal.py +57 -24
  5. ophyd_async/core/_derived_signal_backend.py +1 -5
  6. ophyd_async/core/_device_filler.py +30 -7
  7. ophyd_async/core/_mock_signal_backend.py +25 -7
  8. ophyd_async/core/_mock_signal_utils.py +7 -11
  9. ophyd_async/core/_signal.py +11 -11
  10. ophyd_async/core/_signal_backend.py +7 -19
  11. ophyd_async/core/_soft_signal_backend.py +6 -6
  12. ophyd_async/core/_status.py +81 -4
  13. ophyd_async/core/_typing.py +0 -0
  14. ophyd_async/core/_utils.py +57 -7
  15. ophyd_async/epics/adcore/_core_io.py +12 -5
  16. ophyd_async/epics/adcore/_core_logic.py +1 -1
  17. ophyd_async/epics/core/__init__.py +2 -1
  18. ophyd_async/epics/core/_aioca.py +13 -3
  19. ophyd_async/epics/core/_epics_connector.py +4 -1
  20. ophyd_async/epics/core/_p4p.py +13 -3
  21. ophyd_async/epics/core/_signal.py +18 -6
  22. ophyd_async/epics/core/_util.py +23 -3
  23. ophyd_async/epics/demo/_motor.py +2 -2
  24. ophyd_async/epics/motor.py +15 -17
  25. ophyd_async/epics/odin/_odin_io.py +1 -1
  26. ophyd_async/epics/pmac/_pmac_io.py +23 -4
  27. ophyd_async/epics/pmac/_pmac_trajectory.py +47 -10
  28. ophyd_async/fastcs/eiger/_eiger_io.py +20 -1
  29. ophyd_async/fastcs/jungfrau/_signals.py +4 -1
  30. ophyd_async/fastcs/panda/_block.py +28 -6
  31. ophyd_async/fastcs/panda/_writer.py +1 -3
  32. ophyd_async/tango/core/_tango_transport.py +7 -17
  33. ophyd_async/tango/demo/_counter.py +2 -2
  34. {ophyd_async-0.14.1.dist-info → ophyd_async-0.15.dist-info}/METADATA +1 -1
  35. {ophyd_async-0.14.1.dist-info → ophyd_async-0.15.dist-info}/RECORD +38 -37
  36. {ophyd_async-0.14.1.dist-info → ophyd_async-0.15.dist-info}/WHEEL +1 -1
  37. {ophyd_async-0.14.1.dist-info → ophyd_async-0.15.dist-info}/licenses/LICENSE +0 -0
  38. {ophyd_async-0.14.1.dist-info → ophyd_async-0.15.dist-info}/top_level.txt +0 -0
@@ -97,7 +97,7 @@ class InstantMotorMock(DeviceMock["Motor"]):
97
97
  set_mock_value(device.motor_done_move, 1)
98
98
 
99
99
  # When setpoint is written to, immediately update readback and done flag
100
- def _instant_move(value, wait):
100
+ def _instant_move(value):
101
101
  set_mock_value(device.motor_done_move, 0) # Moving
102
102
  set_mock_value(device.user_readback, value) # Arrive instantly
103
103
  set_mock_value(device.motor_done_move, 1) # Done
@@ -145,7 +145,9 @@ class Motor(
145
145
  # Note:cannot use epics_signal_x here, as the motor record specifies that
146
146
  # we must write 1 to stop the motor. Simply processing the record is not
147
147
  # sufficient.
148
- self.motor_stop = epics_signal_w(int, prefix + ".STOP")
148
+ # Put with completion will never complete as we are waiting for completion on
149
+ # the move in set, so need to pass wait=False
150
+ self.motor_stop = epics_signal_w(int, prefix + ".STOP", wait=False)
149
151
 
150
152
  # Whether set() should complete successfully or not
151
153
  self._set_success = True
@@ -283,27 +285,23 @@ class Motor(
283
285
 
284
286
  await self.check_motor_limit(old_position, new_position)
285
287
 
286
- move_status = self.user_setpoint.set(new_position, wait=True, timeout=timeout)
287
- async for current_position in observe_value(
288
- self.user_readback, done_status=move_status
289
- ):
290
- yield WatcherUpdate(
291
- current=current_position,
292
- initial=old_position,
293
- target=new_position,
294
- name=self.name,
295
- unit=units,
296
- precision=precision,
297
- )
288
+ async with self.user_setpoint.set(new_position, timeout=timeout):
289
+ async for current_position in observe_value(self.user_readback):
290
+ yield WatcherUpdate(
291
+ current=current_position,
292
+ initial=old_position,
293
+ target=new_position,
294
+ name=self.name,
295
+ unit=units,
296
+ precision=precision,
297
+ )
298
298
  if not self._set_success:
299
299
  raise RuntimeError("Motor was stopped")
300
300
 
301
301
  async def stop(self, success=False):
302
302
  """Request to stop moving and return immediately."""
303
303
  self._set_success = success
304
- # Put with completion will never complete as we are waiting for completion on
305
- # the move above, so need to pass wait=False
306
- await self.motor_stop.set(1, wait=False)
304
+ await self.motor_stop.set(1)
307
305
 
308
306
  async def locate(self) -> Location[float]:
309
307
  """Return the current setpoint and readback of the motor."""
@@ -163,7 +163,7 @@ class OdinWriter(DetectorWriter):
163
163
 
164
164
  async def close(self) -> None:
165
165
  await stop_busy_record(self._drv.capture, Writing.DONE, timeout=DEFAULT_TIMEOUT)
166
- await self._drv.meta_stop.set(True, wait=True)
166
+ await self._drv.meta_stop.set(True)
167
167
  if self._capture_status and not self._capture_status.done:
168
168
  await self._capture_status
169
169
  self._capture_status = None
@@ -2,7 +2,7 @@ from collections.abc import Sequence
2
2
 
3
3
  import numpy as np
4
4
 
5
- from ophyd_async.core import Array1D, Device, DeviceVector, StandardReadable
5
+ from ophyd_async.core import Array1D, Device, DeviceVector, StandardReadable, SubsetEnum
6
6
  from ophyd_async.epics import motor
7
7
  from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal_x
8
8
 
@@ -10,8 +10,16 @@ from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal
10
10
  CS_INDEX = {letter: index + 1 for index, letter in enumerate("ABCUVWXYZ")}
11
11
 
12
12
 
13
+ class PmacExecuteState(SubsetEnum):
14
+ DONE = "Done"
15
+ EXECUTING = "Executing"
16
+
17
+
13
18
  class PmacTrajectoryIO(StandardReadable):
14
- """Device that moves a PMAC Motor record."""
19
+ """Device that moves a PMAC Motor record.
20
+
21
+ This mirrors the interface provided by pmac/Db/pmacControllerTrajectory.template
22
+ """
15
23
 
16
24
  def __init__(self, prefix: str, name: str = "") -> None:
17
25
  self.time_array = epics_signal_rw(
@@ -45,6 +53,9 @@ class PmacTrajectoryIO(StandardReadable):
45
53
  # be a SignalRW to be waited on in PmacTrajectoryTriggerLogic.
46
54
  # TODO: Change record type to bo from busy (https://github.com/DiamondLightSource/pmac/issues/154)
47
55
  self.execute_profile = epics_signal_rw(bool, prefix + "ProfileExecute")
56
+ self.execute_state = epics_signal_r(
57
+ PmacExecuteState, prefix + "ProfileExecuteState_RBV"
58
+ )
48
59
  self.abort_profile = epics_signal_x(prefix + "ProfileAbort")
49
60
  self.profile_cs_name = epics_signal_rw(str, prefix + "ProfileCsName")
50
61
  self.calculate_velocities = epics_signal_rw(bool, prefix + "ProfileCalcVel")
@@ -56,6 +67,7 @@ class PmacAxisAssignmentIO(Device):
56
67
  """A Device that (direct) moves a PMAC Coordinate System Motor.
57
68
 
58
69
  Note that this does not go through a motor record.
70
+ This mirrors the interface provided by pmac/Db/motor_in_cs.template
59
71
  """
60
72
 
61
73
  def __init__(self, prefix: str, name: str = "") -> None:
@@ -66,7 +78,11 @@ class PmacAxisAssignmentIO(Device):
66
78
 
67
79
 
68
80
  class PmacCoordIO(Device):
69
- """A Device that represents a Pmac Coordinate System."""
81
+ """A Device that represents a Pmac Coordinate System.
82
+
83
+ This mirrors the interfaces provided by pmac/Db/pmacCsController.template,
84
+ and pmac/Db/pmacDirectMotor.template
85
+ """
70
86
 
71
87
  def __init__(self, prefix: str, name: str = "") -> None:
72
88
  self.defer_moves = epics_signal_rw(bool, f"{prefix}DeferMoves")
@@ -81,7 +97,10 @@ class PmacCoordIO(Device):
81
97
 
82
98
 
83
99
  class PmacIO(Device):
84
- """Device that represents a pmac controller."""
100
+ """Device that represents a pmac controller.
101
+
102
+ This mirrors the interface provided by pmac/Db/pmacController.template
103
+ """
85
104
 
86
105
  def __init__(
87
106
  self,
@@ -2,13 +2,18 @@ import asyncio
2
2
  from dataclasses import dataclass
3
3
 
4
4
  import numpy as np
5
+ from bluesky.protocols import (
6
+ Flyable,
7
+ Preparable,
8
+ Stageable,
9
+ )
5
10
  from scanspec.core import Path, Slice
6
11
  from scanspec.specs import Spec
7
12
 
8
13
  from ophyd_async.core import (
9
14
  DEFAULT_TIMEOUT,
10
15
  AsyncStatus,
11
- FlyerController,
16
+ Device,
12
17
  error_if_none,
13
18
  gather_dict,
14
19
  observe_value,
@@ -17,8 +22,8 @@ from ophyd_async.core import (
17
22
  )
18
23
  from ophyd_async.epics.motor import Motor
19
24
 
20
- from ._pmac_io import CS_INDEX, PmacIO
21
- from ._pmac_trajectory_generation import PVT, Trajectory
25
+ from ._pmac_io import CS_INDEX, PmacExecuteState, PmacIO
26
+ from ._pmac_trajectory_generation import PVT, Trajectory, UserProgram
22
27
  from ._utils import (
23
28
  _PmacMotorInfo,
24
29
  calculate_ramp_position_and_duration,
@@ -40,14 +45,21 @@ class PmacPrepareContext:
40
45
  ramp_up_time: float
41
46
 
42
47
 
43
- class PmacTrajectoryTriggerLogic(FlyerController):
44
- def __init__(self, pmac: PmacIO) -> None:
48
+ class PmacTrajectoryTriggerLogic(
49
+ Device,
50
+ Stageable,
51
+ Preparable,
52
+ Flyable,
53
+ ):
54
+ def __init__(self, pmac: PmacIO, name: str = "") -> None:
45
55
  self.pmac = pmac
46
56
  self._next_pvt: PVT | None
47
57
  self._loaded: int = 0
48
58
  self._trajectory_status: AsyncStatus | None = None
49
59
  self._prepare_context: PmacPrepareContext | None = None
60
+ super().__init__(name=name)
50
61
 
62
+ @AsyncStatus.wrap
51
63
  async def prepare(self, value: Spec[Motor]):
52
64
  path = Path(value.calculate())
53
65
  slice = path.consume(SLICE_SIZE)
@@ -65,6 +77,7 @@ class PmacTrajectoryTriggerLogic(FlyerController):
65
77
  self._move_to_start(motor_info, ramp_up_pos),
66
78
  )
67
79
 
80
+ @AsyncStatus.wrap
68
81
  async def kickoff(self):
69
82
  prepare_context = error_if_none(
70
83
  self._prepare_context, "Cannot kickoff. Must call prepare first."
@@ -80,6 +93,7 @@ class PmacTrajectoryTriggerLogic(FlyerController):
80
93
  prepare_context.ramp_up_time + DEFAULT_TIMEOUT,
81
94
  )
82
95
 
96
+ @AsyncStatus.wrap
83
97
  async def complete(self):
84
98
  trajectory_status = error_if_none(
85
99
  self._trajectory_status, "Cannot complete. Must call kickoff first."
@@ -89,14 +103,37 @@ class PmacTrajectoryTriggerLogic(FlyerController):
89
103
  self._trajectory_status = None
90
104
  self._loaded = 0
91
105
 
92
- async def stop(self):
93
- await self.pmac.trajectory.abort_profile.trigger()
106
+ @AsyncStatus.wrap
107
+ async def stage(self) -> None:
108
+ await self._stop_if_running()
109
+
110
+ # Run an empty fly scan to reset EQU on Panda Brick
111
+ for use_axis in self.pmac.trajectory.use_axis.values():
112
+ await use_axis.set(False)
113
+
114
+ await asyncio.gather(
115
+ self.pmac.trajectory.time_array.set(np.array(0)),
116
+ self.pmac.trajectory.user_array.set(np.array(UserProgram.END)),
117
+ self.pmac.trajectory.points_to_build.set(1),
118
+ )
119
+ await self.pmac.trajectory.build_profile.trigger()
120
+ await self.pmac.trajectory.execute_profile.set(True)
121
+
122
+ @AsyncStatus.wrap
123
+ async def unstage(self) -> None:
124
+ await self._stop_if_running()
125
+
126
+ async def _stop_if_running(self):
127
+ # Abort current trajectory, if one is running
128
+ if (
129
+ await self.pmac.trajectory.execute_state.get_value()
130
+ == PmacExecuteState.EXECUTING
131
+ ):
132
+ await self.pmac.trajectory.abort_profile.trigger()
94
133
 
95
134
  @AsyncStatus.wrap
96
135
  async def _execute_trajectory(self, path: Path, motor_info: _PmacMotorInfo):
97
- execute_status = self.pmac.trajectory.execute_profile.set(
98
- True, wait=True, timeout=None
99
- )
136
+ execute_status = self.pmac.trajectory.execute_profile.set(True, timeout=None)
100
137
  # We consume SLICE_SIZE from self.path and parse a trajectory
101
138
  # containing at least 2 * SLICE_SIZE, as a gapless trajectory
102
139
  # will contain 2 points per slice frame. If gaps are present,
@@ -15,14 +15,29 @@ class EigerTriggerMode(StrictEnum):
15
15
 
16
16
 
17
17
  class EigerMonitorIO(Device):
18
+ """Driver for Eiger Monitor subsystem.
19
+
20
+ This mirrors the interface provided by https://media.dectris.com/SIMPLON_APIReference_v1p6.pdf#page=25
21
+ """
22
+
18
23
  pass
19
24
 
20
25
 
21
26
  class EigerStreamIO(Device):
27
+ """Driver for Eiger Stream subsystem.
28
+
29
+ This mirrors the interface provided by https://media.dectris.com/SIMPLON_APIReference_v1p6.pdf#page=32
30
+ """
31
+
22
32
  pass
23
33
 
24
34
 
25
35
  class EigerDetectorIO(Device):
36
+ """Driver for Eiger Detector subsystem.
37
+
38
+ This mirrors the interface provided by https://media.dectris.com/SIMPLON_APIReference_v1p6.pdf#page=17
39
+ """
40
+
26
41
  bit_depth_image: SignalR[int]
27
42
  state: SignalR[str]
28
43
  count_time: SignalRW[float]
@@ -44,7 +59,11 @@ class EigerDetectorIO(Device):
44
59
 
45
60
 
46
61
  class EigerDriverIO(Device):
47
- """Contains signals for handling IO on the Eiger detector."""
62
+ """Contains signals for handling IO on the Eiger detector.
63
+
64
+ This mirrors the interface provided by
65
+ https://github.com/DiamondLightSource/fastcs-eiger/blob/main/src/fastcs_eiger/controllers/eiger_controller.py
66
+ """
48
67
 
49
68
  stale_parameters: SignalR[bool]
50
69
  monitor: EigerMonitorIO
@@ -58,7 +58,10 @@ JUNGFRAU_TRIGGER_MODE_MAP = {
58
58
 
59
59
 
60
60
  class JungfrauDriverIO(Device):
61
- """Contains signals for handling IO on the Jungfrau detector."""
61
+ """Contains signals for handling IO on the Jungfrau detector.
62
+
63
+ This mirrors the intefrace provided by slsDetector/Db/slsDetector.template
64
+ """
62
65
 
63
66
  exposure_time: SignalRW[float] # in s
64
67
 
@@ -19,7 +19,11 @@ class PandaCaptureMode(StrictEnum):
19
19
 
20
20
 
21
21
  class DataBlock(Device):
22
- """Data block for the PandA. Used for writing data through the IOC."""
22
+ """Data block for the PandA. Used for writing data through the IOC.
23
+
24
+ This mirrors the interface provided by
25
+ https://github.com/PandABlocks/fastcs-PandABlocks/blob/main/src/fastcs_pandablocks/panda/blocks/data.py
26
+ """
23
27
 
24
28
  # In future we may decide to make hdf_* optional
25
29
  hdf_directory: SignalRW[str]
@@ -56,7 +60,11 @@ class PandaPosMux(SubsetEnum):
56
60
 
57
61
 
58
62
  class PulseBlock(Device):
59
- """Used for configuring pulses in the PandA."""
63
+ """Used for configuring pulses in the PandA.
64
+
65
+ This mirrors the interface provided by
66
+ PandABlocks-FPGA/modules/pulse/pulse.block.ini
67
+ """
60
68
 
61
69
  enable: SignalRW[PandaBitMux]
62
70
  delay: SignalRW[float]
@@ -66,7 +74,11 @@ class PulseBlock(Device):
66
74
 
67
75
 
68
76
  class PcompBlock(Device):
69
- """Position compare block in the PandA."""
77
+ """Position compare block in the PandA.
78
+
79
+ This mirrors the interface provided by
80
+ PandABlocks-FPGA/modules/pcomp/pcomp.block.ini
81
+ """
70
82
 
71
83
  active: SignalR[bool]
72
84
  dir: SignalRW[PandaPcompDirection]
@@ -87,7 +99,10 @@ class PandaTimeUnits(StrictEnum):
87
99
 
88
100
 
89
101
  class SeqBlock(Device):
90
- """Sequencer block in the PandA."""
102
+ """Sequencer block in the PandA.
103
+
104
+ This mirrors the interface provided by PandABlocks-FPGA/modules/seq/seq.block.ini
105
+ """
91
106
 
92
107
  table: SignalRW[SeqTable]
93
108
  active: SignalR[bool]
@@ -99,14 +114,21 @@ class SeqBlock(Device):
99
114
 
100
115
 
101
116
  class PcapBlock(Device):
102
- """Position capture block in the PandA."""
117
+ """Position capture block in the PandA.
118
+
119
+ This mirrors the interface provided by PandABlocks-FPGA/modules/pcap/pcap.block.ini
120
+ """
103
121
 
104
122
  active: SignalR[bool]
105
123
  arm: SignalRW[bool]
106
124
 
107
125
 
108
126
  class InencBlock(Device):
109
- """In encoder block in the PandA."""
127
+ """In encoder block in the PandA.
128
+
129
+ This mirrors the interface provided by
130
+ PandABlocks-FPGA/modules/inenc/inenc.block.ini
131
+ """
110
132
 
111
133
  val_scale: SignalRW[float]
112
134
  val_offset: SignalRW[float]
@@ -159,6 +159,4 @@ class PandaHDFWriter(DetectorWriter):
159
159
 
160
160
  # Could put this function as default for StandardDetector
161
161
  async def close(self):
162
- await self.panda_data_block.capture.set(
163
- False, wait=True, timeout=DEFAULT_TIMEOUT
164
- )
162
+ await self.panda_data_block.capture.set(False, timeout=DEFAULT_TIMEOUT)
@@ -195,7 +195,7 @@ class TangoProxy:
195
195
 
196
196
  @abstractmethod
197
197
  async def put(
198
- self, value: object | None, wait: bool = True, timeout: float | None = None
198
+ self, value: object | None, timeout: float | None = None
199
199
  ) -> AsyncStatus | None:
200
200
  """Put value to TRL."""
201
201
 
@@ -272,13 +272,8 @@ class AttributeProxy(TangoProxy):
272
272
 
273
273
  @ensure_proper_executor
274
274
  async def put( # type: ignore
275
- self, value: object | None, wait: bool = True, timeout: float | None = None
275
+ self, value: object | None, timeout: float | None = None
276
276
  ) -> AsyncStatus | None:
277
- if wait is False:
278
- raise RuntimeWarning(
279
- "wait=False is not supported in Tango."
280
- "Simply don't await the status object."
281
- )
282
277
  # TODO: remove the timeout from this as it is handled at the signal level
283
278
  value = self._converter.write_value(value)
284
279
  try:
@@ -522,7 +517,7 @@ class CommandProxy(TangoProxy):
522
517
  if self._read_character == CommandProxyReadCharacter.READ_WRITE:
523
518
  return self._last_reading["value"]
524
519
  elif self._read_character == CommandProxyReadCharacter.READ:
525
- await self.put(value=None, wait=True, timeout=None)
520
+ await self.put(value=None, timeout=None)
526
521
  return self._last_reading["value"]
527
522
 
528
523
  async def get_w_value(self) -> object:
@@ -534,13 +529,8 @@ class CommandProxy(TangoProxy):
534
529
 
535
530
  @ensure_proper_executor
536
531
  async def put( # type: ignore
537
- self, value: object | None, wait: bool = True, timeout: float | None = None
532
+ self, value: object | None, timeout: float | None = None
538
533
  ) -> AsyncStatus | None:
539
- if wait is False:
540
- raise RuntimeError(
541
- "wait=False is not supported in Tango."
542
- " Simply don't await the status object."
543
- )
544
534
  value = self._converter.write_value(value)
545
535
  try:
546
536
 
@@ -568,7 +558,7 @@ class CommandProxy(TangoProxy):
568
558
 
569
559
  async def get_reading(self) -> Reading:
570
560
  if self._read_character == CommandProxyReadCharacter.READ:
571
- await self.put(value=None, wait=True, timeout=None)
561
+ await self.put(value=None, timeout=None)
572
562
  return self._last_reading
573
563
  else:
574
564
  return self._last_reading
@@ -923,11 +913,11 @@ class TangoSignalBackend(SignalBackend[SignalDatatypeT]):
923
913
  self.converter = make_converter(self.trl_configs[self.read_trl], self.datatype)
924
914
  self.proxies[self.read_trl].set_converter(self.converter) # type: ignore
925
915
 
926
- async def put(self, value: SignalDatatypeT | None, wait=True, timeout=None) -> None:
916
+ async def put(self, value: SignalDatatypeT | None, timeout=None) -> None:
927
917
  if self.proxies[self.write_trl] is None:
928
918
  raise NotConnectedError(f"Not connected to {self.write_trl}")
929
919
  self.status = None
930
- put_status = await self.proxies[self.write_trl].put(value, wait, timeout) # type: ignore
920
+ put_status = await self.proxies[self.write_trl].put(value, timeout) # type: ignore
931
921
  self.status = put_status
932
922
 
933
923
  async def get_datakey(self, source: str) -> DataKey:
@@ -28,8 +28,8 @@ class TangoCounter(TangoDevice, StandardReadable):
28
28
  async def trigger(self) -> None:
29
29
  sample_time = await self.sample_time.get_value()
30
30
  timeout = sample_time + DEFAULT_TIMEOUT
31
- await self.start.trigger(wait=True, timeout=timeout)
31
+ await self.start.trigger(timeout=timeout)
32
32
 
33
33
  @AsyncStatus.wrap
34
34
  async def reset(self) -> None:
35
- await self.reset_.trigger(wait=True, timeout=DEFAULT_TIMEOUT)
35
+ await self.reset_.trigger(timeout=DEFAULT_TIMEOUT)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ophyd-async
3
- Version: 0.14.1
3
+ Version: 0.15
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,33 +1,34 @@
1
1
  ophyd_async/__init__.py,sha256=dcAA3qsj1nNIMe5l-v2tlduZ_ypwBmyuHe45Lsq4k4w,206
2
2
  ophyd_async/__main__.py,sha256=n_U4O9bgm97OuboUB_9eK7eFiwy8BZSgXJ0OzbE0DqU,481
3
3
  ophyd_async/_docs_parser.py,sha256=gPYrigfSbYCF7QoSf2UvE-cpQu4snSssl7ZWN-kKDzI,352
4
- ophyd_async/_version.py,sha256=a3VJZDtDsD7dO22j4y92zbdkUlJwzXf_QabiVquJm1Y,706
4
+ ophyd_async/_version.py,sha256=PoKyHbEj9RCTgE7Yy971GX8SAg4Ykby8LuwUO7eDG5Q,701
5
5
  ophyd_async/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- ophyd_async/core/__init__.py,sha256=GJxLNTxXD3Qlghq6CNe-mCeludgBBpHkHXkbDFojdHQ,6084
7
- ophyd_async/core/_derived_signal.py,sha256=TuZza_j3J1Bw4QSqBYB9Ta2FyQP5BycO3nSHVtJ890Q,13015
8
- ophyd_async/core/_derived_signal_backend.py,sha256=Ibce9JHghiI5Ir8w0pUYULHL2qWkobeUYc0-CDrsO2E,12615
6
+ ophyd_async/core/__init__.py,sha256=tScD6-v7XHYXe9Mt52il0QnUIxVi-M8_CA9BCJIWJ3U,6293
7
+ ophyd_async/core/_datatypes.py,sha256=9ItymwrWqvl2Vj7aTIJfnvG7mlm1fXL8Cxwx88UHvyw,7677
8
+ ophyd_async/core/_derived_signal.py,sha256=ensigHhfsrAQD8Tb0vJRYOoCogy0dYHyImpU_tdDzhU,14107
9
+ ophyd_async/core/_derived_signal_backend.py,sha256=5uAeTdRCBOPWsh8dlGhc6-uXpz4FFpKzp-wtTg09jTs,12493
9
10
  ophyd_async/core/_detector.py,sha256=9fYbBPmRnMGADcDTYkspDAL2uzhtNNiKCEeBUU0oKaY,14942
10
11
  ophyd_async/core/_device.py,sha256=tm-khZLMy-Q7nn86GYHkbXRJOc83DgkbrdQ6WCjZhUs,17638
11
- ophyd_async/core/_device_filler.py,sha256=MDz8eQQ-eEAwo-UEMxfqPfpcBuMG01tLCGR6utwVnmE,14825
12
+ ophyd_async/core/_device_filler.py,sha256=jOQiUSSjfnMWBnOZQTx-ZexLJydokCA4HZ-QqX4TQ98,15772
12
13
  ophyd_async/core/_enums.py,sha256=2vh6x0rZ6SLiw2xxq1xVIn-GpbLDFc8wZoVdA55QiE8,370
13
14
  ophyd_async/core/_flyer.py,sha256=8zKyU5aQOr_t59GIUwsYeb8NSabdvBp0swwuRe4v5VQ,3457
14
15
  ophyd_async/core/_hdf_dataset.py,sha256=0bIX_ZbFSMdXqDwRtEvV-0avHnwXhjPddE5GVNmo7H8,2608
15
16
  ophyd_async/core/_log.py,sha256=DxKR4Nz3SgTaTzKBZWqt-w48yT8WUAr_3Qr223TEWRw,3587
16
- ophyd_async/core/_mock_signal_backend.py,sha256=cFovZEwwqYKV2LuQDZStSr3TFFvA31IJeSRoheHnZ8Q,3401
17
- ophyd_async/core/_mock_signal_utils.py,sha256=ePFBDaon2lFT0vcnAaCRuoLr953QV6tYgHmY2fXQW-8,5520
17
+ ophyd_async/core/_mock_signal_backend.py,sha256=TbIOiPA0f2nnz2UJJDuPb31lZur7VwzCoKtIjodttP8,4081
18
+ ophyd_async/core/_mock_signal_utils.py,sha256=Ryh_SmYrgnoHuyzQJ8bkvoL10Ga1d7PnHFo7TY1srKM,5394
18
19
  ophyd_async/core/_protocol.py,sha256=wQ_snxhTprHqEjQb1HgFwBljwolMY6A8C3xgV1PXwdU,4051
19
20
  ophyd_async/core/_providers.py,sha256=IO6xlAVQLkbECT96ezgzoDfZ_OhbD9NrDdXvEcyWJkI,13087
20
21
  ophyd_async/core/_readable.py,sha256=iBo1YwA5bsAbzLbznvmSnzKDWUuGkLh850Br3BXsgeU,11707
21
22
  ophyd_async/core/_settings.py,sha256=_ZccbXKP7j5rG6-bMKk7aaLr8hChdRDAPY_YSR71XXM,4213
22
- ophyd_async/core/_signal.py,sha256=OEfjW_BIC3dVxgsWC0aVUj9rQL36KHkNTBCUVXjSRFo,28274
23
- ophyd_async/core/_signal_backend.py,sha256=F3ma45cIIJ3D702zsVZIqn4Jv7u05YzMQBQND70QCbQ,6987
24
- ophyd_async/core/_soft_signal_backend.py,sha256=NJUuyaCKtBZjggt8WKi7_lKQRHasToxviuQvl5xbhLU,6222
25
- ophyd_async/core/_status.py,sha256=a2IDvv_GvUcFuhjQA5bQzWm9ngR6zGc9PR4XcZiaeqk,6557
26
- ophyd_async/core/_table.py,sha256=ryJ7AwJBglQUzwP9_aSjR8cu8EKvYXfo1q1byhke3Uc,7248
27
- ophyd_async/core/_utils.py,sha256=xv03NYanpeKEsErZkpkkGffwdSs7UElHtJQZ--1KLz8,11207
23
+ ophyd_async/core/_signal.py,sha256=CXxrwk0IUk-vrJDJLOmbBCeR5no_5fl-bGsF8FASgkc,28426
24
+ ophyd_async/core/_signal_backend.py,sha256=HEPaWVm6KexwyaNqPvOlhMWjOz4P8Z-lOmJYqPDfclw,6460
25
+ ophyd_async/core/_soft_signal_backend.py,sha256=gnpg-hhPSa1a0_SoyijUNPGiAdxD_ARldtXXVIR39ic,6235
26
+ ophyd_async/core/_status.py,sha256=9lP6yZunLlkjueOod8o_wzRA_0PQ1JqdxJnEI6Y0f9A,9863
27
+ ophyd_async/core/_typing.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ ophyd_async/core/_utils.py,sha256=-MZ_hynTM2jgP8KTue9Lw6-7w8UakGz1iJVPMOEVaR8,12986
28
29
  ophyd_async/core/_yaml_settings.py,sha256=Qojhku9l5kPSkTnEylCRWTe0gpw6S_XP5av5dPpqFgQ,2089
29
30
  ophyd_async/epics/__init__.py,sha256=ou4yEaH9VZHz70e8oM614-arLMQvUfQyXhRJsnEpWn8,60
30
- ophyd_async/epics/motor.py,sha256=ZFr6n3IE3qW68sRwNEj_8OnJOQebmkswCMK9qXP0ZqA,11803
31
+ ophyd_async/epics/motor.py,sha256=RMefrfezxhpiqDNJJ4VKM4_qGM1rJ6cqFU_LetZ5tDU,11774
31
32
  ophyd_async/epics/signal.py,sha256=0A-supp9ajr63O6aD7F9oG0-Q26YmRjk-ZGh57-jo1Y,239
32
33
  ophyd_async/epics/adandor/__init__.py,sha256=dlitllrAdhvh16PAcVMUSSEytTDNMu6_HuYk8KD1EoY,343
33
34
  ophyd_async/epics/adandor/_andor.py,sha256=TijGjNVxuH-P0X7UACPt9eLLQ449DwMyVhbn1kV7Le8,1245
@@ -39,8 +40,8 @@ ophyd_async/epics/adaravis/_aravis_controller.py,sha256=aqIIj6awD2h870HAT3rPXg3R
39
40
  ophyd_async/epics/adaravis/_aravis_io.py,sha256=af639qsO2V8NU5I0LgxK8jrxuhXgM6eMxEFJwsCPdjQ,624
40
41
  ophyd_async/epics/adcore/__init__.py,sha256=NWNLe2uFqU86P5mYbKINfHHrUVoTHeDN6829-7lBHxE,1631
41
42
  ophyd_async/epics/adcore/_core_detector.py,sha256=m821Ji4WVMYd0CI5NOXSkHMiHzkO1aA0mvQzWrig6Z0,2592
42
- ophyd_async/epics/adcore/_core_io.py,sha256=hEz_yFB2pr7CyTN9JjC7RlLUPfhxjJ1r380XhYEcId4,9647
43
- ophyd_async/epics/adcore/_core_logic.py,sha256=QVphp-N2o0j4HrzSRISa21cb1oJdYdbFgwj8eFXwOGM,8972
43
+ ophyd_async/epics/adcore/_core_io.py,sha256=3ScIswkmtj82beeVfgq3RrRIosfN_oKKVFX9SQtRq2M,10059
44
+ ophyd_async/epics/adcore/_core_logic.py,sha256=-yL21VZya7WcOBS74krwypaJ8GnSvc2J9AdGZ-wpT4g,8960
44
45
  ophyd_async/epics/adcore/_core_writer.py,sha256=iQV5xodp63Fsoww1ply5dyQMIysVY_f6_EryzoNkjbk,8383
45
46
  ophyd_async/epics/adcore/_hdf_writer.py,sha256=nKXOjVZfM6_BlYv5f1l8nwo7tjenYjx-3AN18gzhUBA,6074
46
47
  ophyd_async/epics/adcore/_jpeg_writer.py,sha256=VYpUWQGEjrKG2kiRGQZlBCPXVJ1BzWb9GyB9KhxPWgo,688
@@ -63,18 +64,18 @@ ophyd_async/epics/advimba/__init__.py,sha256=fPfuakXOwQsFej26gLksqkfBiP6BZlfTyut
63
64
  ophyd_async/epics/advimba/_vimba.py,sha256=4XlEnsJMGDzHLuYaIDUmaxx0gtOAehn5BKBZMUAzoHQ,1241
64
65
  ophyd_async/epics/advimba/_vimba_controller.py,sha256=KSbP4LHqYkCDplpmBk7hdf0Yz9J2vOxWn0fStFFAklA,1942
65
66
  ophyd_async/epics/advimba/_vimba_io.py,sha256=E3XlCKLQbGOWho0dQPeD4xeEl5pZGINyYstGD43qNrM,1492
66
- ophyd_async/epics/core/__init__.py,sha256=q73i4aJ_0HApVNmf3eAw-q30XuazAyZW2MW5TXk-pOY,648
67
- ophyd_async/epics/core/_aioca.py,sha256=KnD_LWBlIiJFf3ujPe7ZH3_j2P5uWtg5d9_XaVk-cqQ,13240
68
- ophyd_async/epics/core/_epics_connector.py,sha256=KXQ1WVpNrgQ30KiiXTYRwfoHdaU5oWv1jVZAvx3tGig,2557
67
+ ophyd_async/epics/core/__init__.py,sha256=fOGvQnGOBdwLqITsEndechnFTEpoK5Ku7L1ueJlL7Mo,682
68
+ ophyd_async/epics/core/_aioca.py,sha256=JBgVMUREozDEWD6wOF2bTPT4qFl0tn57rNwo7HmakUk,13452
69
+ ophyd_async/epics/core/_epics_connector.py,sha256=-jJXU11qtdIhksTxkbx7IHhoG-eIPYWXv2NPQCdUsy8,2681
69
70
  ophyd_async/epics/core/_epics_device.py,sha256=wGdR24I7GSPh3HmM7jsWKZhBZgt4IyLrCn4Ut7Wx_xo,510
70
- ophyd_async/epics/core/_p4p.py,sha256=IUu0cROcgRee9er6qyskkX7GMS4Ixr94TV4_4a7joYA,16395
71
+ ophyd_async/epics/core/_p4p.py,sha256=4jPb102HZFpu6u0k39d6ZarARQby-6xYT5INVl2ZO1k,16607
71
72
  ophyd_async/epics/core/_pvi_connector.py,sha256=SfKkZqGCRvJJtQpJQzmfuLJQqOge0wBsMeuTSQ-KPjs,5553
72
- ophyd_async/epics/core/_signal.py,sha256=qAEe8mgXRMgBTcxuwN-KDGSRtJTwrhygThTDe5vA3EQ,5916
73
- ophyd_async/epics/core/_util.py,sha256=wcbZ6Qa2qqme6AlKAfxGI68EMEPEMJSl7BiDRz3mrEg,2820
73
+ ophyd_async/epics/core/_signal.py,sha256=cPYEQ4DK-btrb-wEm6UH5xUYr8Exg2U5GQKODT-WHjg,6293
74
+ ophyd_async/epics/core/_util.py,sha256=Gk2NwQyz6D9wRZ9hIPuzq9si2qLDzkZ5O9gAQFqd5gs,3559
74
75
  ophyd_async/epics/demo/__init__.py,sha256=WR2M3D8dbHcisJW2OIU2ManZu5SWez8ytZEp4jSBfDY,416
75
76
  ophyd_async/epics/demo/__main__.py,sha256=o6M0FSWduPHe2lN9yNEdsXb48NckSd54-XJGoLe20Pc,1116
76
77
  ophyd_async/epics/demo/_ioc.py,sha256=UtwTReKTR-1_tPIhdGBr7OxP_Vqi6xWyCcFABd9BYPY,1040
77
- ophyd_async/epics/demo/_motor.py,sha256=7A-htbAISgB8ZBipouSoSGmpe1wN00VH7H4To16sE4E,3218
78
+ ophyd_async/epics/demo/_motor.py,sha256=Obljz5QUaKUxnzT5g0p3rsn0oK_-LHRwTDDbq1KcgOc,3175
78
79
  ophyd_async/epics/demo/_point_detector.py,sha256=5m00mBh5knkChnuZD3JNDPaHIGLN0g0toksYm_hpFKo,1398
79
80
  ophyd_async/epics/demo/_point_detector_channel.py,sha256=UkidtyaHR_u00lxLb64F7xYhqJowFQQe6kUXKMPHDqE,721
80
81
  ophyd_async/epics/demo/_stage.py,sha256=KPnwr5EX8f_0xxkNWT-70a0AqB0D9DoiTbxMmy0iOTo,485
@@ -82,10 +83,10 @@ ophyd_async/epics/demo/motor.db,sha256=3xb6WTXo4crrvk-M8Y16G9pUidp27vD5vIKKBpLTU
82
83
  ophyd_async/epics/demo/point_detector.db,sha256=8kBa3XKpmfXCxetT4tq5_RFXa_XqS1Z2ZNzsa2AtLds,1366
83
84
  ophyd_async/epics/demo/point_detector_channel.db,sha256=FZ9H6HjqplhcF2jgimv_dT1nn-CBlfjs7Y--iCfHp5Y,632
84
85
  ophyd_async/epics/odin/__init__.py,sha256=7kRqVzwoD8PVtp7Nj9iQWlgbLeoWE_8oiq-B0kixwTE,93
85
- ophyd_async/epics/odin/_odin_io.py,sha256=YDBrS15PnEKe5SHmz397Emh--lZSQEnbR3G7p8pbShY,6533
86
+ ophyd_async/epics/odin/_odin_io.py,sha256=jnFeE9Lqq-LTDBeIbsrtmfJuu_1jlQBXikvBI0ZEAOA,6522
86
87
  ophyd_async/epics/pmac/__init__.py,sha256=GqJTiJudqE9pu050ZNED09F9tKRfazn0wBsojsMH2gg,273
87
- ophyd_async/epics/pmac/_pmac_io.py,sha256=cbChieNrDWRzrr5Mdsqtm2Azp8sG0KHP9rGeJxmbYrA,4332
88
- ophyd_async/epics/pmac/_pmac_trajectory.py,sha256=DzO6gfvbK8M3Ec6vq0WTlz0RRYGNzP8qDJIMWTWJeLo,8150
88
+ ophyd_async/epics/pmac/_pmac_io.py,sha256=oiIKEIYSeGoay5BFXPaZEx5xpF7H9aI7hGRhSx_R6BE,4918
89
+ ophyd_async/epics/pmac/_pmac_trajectory.py,sha256=MAn_6r7y98swUuYaXbG5yFAI70Z33iJYEI2JH6Hbsy0,9291
89
90
  ophyd_async/epics/pmac/_pmac_trajectory_generation.py,sha256=3IIxXa0r6-2uNnILKLGxp3xosOZx8MubKF-F_OM7uaw,27331
90
91
  ophyd_async/epics/pmac/_utils.py,sha256=MfuY6NicT7wkwVIWAZkWoCu1ZoSzy6jda1wLK9XAOLA,8614
91
92
  ophyd_async/epics/testing/__init__.py,sha256=aTIv4D2DYrpnGco5RQF8QuLG1SfFkIlTyM2uYEKXltA,522
@@ -98,20 +99,20 @@ ophyd_async/fastcs/core.py,sha256=pL_srtTrfuoBHUjDFpxES92owFq9M4Jve0Skk1oeuFA,51
98
99
  ophyd_async/fastcs/eiger/__init__.py,sha256=RxwOFjERKy5tUD_IDGCGuMh716FaZgCq7R9elPixBwo,312
99
100
  ophyd_async/fastcs/eiger/_eiger.py,sha256=jo3K5dM3Co_RDYIyO6poCVDqp2g_1z4MqnYftwnMhUk,1103
100
101
  ophyd_async/fastcs/eiger/_eiger_controller.py,sha256=Cucj-1M-1CaxSJxHZmHs3f_OXwtTIspcqUFhRNGzn_E,2361
101
- ophyd_async/fastcs/eiger/_eiger_io.py,sha256=mVgDC296B4RkSObWBiA7AXtVRTQw388lJPw2roQctFs,1249
102
+ ophyd_async/fastcs/eiger/_eiger_io.py,sha256=mnoBllyltac2rJRMPF59x2ONAYxu3_Dqez7O-7HvYA0,1892
102
103
  ophyd_async/fastcs/jungfrau/__init__.py,sha256=xwTaPiqvtyyljP2acz07FSlUW79Io8EsKks9ENgbumA,765
103
104
  ophyd_async/fastcs/jungfrau/_controller.py,sha256=TvUxRuP3NJFTOcyHeMn5-1Va7HzOJswWCYSGdp1NMFI,5778
104
105
  ophyd_async/fastcs/jungfrau/_jungfrau.py,sha256=KAHCmRHMyzIh-r2JXVJcQOGLkCOOdW5Mao_KChITO2s,929
105
- ophyd_async/fastcs/jungfrau/_signals.py,sha256=8seZCkKTb-xJL0IdB2el8VTEbWNaCvZIhpP0609GpxI,2500
106
+ ophyd_async/fastcs/jungfrau/_signals.py,sha256=MIFd44I0M9RDOdoODXQ9qH4aVpfmqSNtqCQVkjtVFy0,2585
106
107
  ophyd_async/fastcs/jungfrau/_utils.py,sha256=QpdWbPT_31Jwyi7INFMRq9hncSZIK_4J3l6wpuppzn8,2875
107
108
  ophyd_async/fastcs/odin/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
108
109
  ophyd_async/fastcs/panda/__init__.py,sha256=GbnPqH_13wvyPK1CvRHGAViamKVWHY9n-sTmfAdcnMA,1229
109
- ophyd_async/fastcs/panda/_block.py,sha256=Bffta9IkuSq_NSvidDvLyC1YUrfQCwMhppsu1Te7vec,2679
110
+ ophyd_async/fastcs/panda/_block.py,sha256=NCz05yZliJmbeUxQHr6bqu-a37vZKqKQRA3COsIdbu4,3322
110
111
  ophyd_async/fastcs/panda/_control.py,sha256=lUogRZMkQk4eZFghTuhwSDLqxR16-DQvx9MyFpg10Qc,1387
111
112
  ophyd_async/fastcs/panda/_hdf_panda.py,sha256=tL_OWHxlMQcMZGq9sxHLSeag6hP9MRIbTPn1W0u0iNI,1237
112
113
  ophyd_async/fastcs/panda/_table.py,sha256=maKGoKypEuYqTSVWGgDO6GMEKOtlDm9Dn5YiYdBzu6c,2486
113
114
  ophyd_async/fastcs/panda/_trigger.py,sha256=iBxW4YMfRYrpg7AoQaHb7rHKCE95UbSxguRuR9FOgw8,7610
114
- ophyd_async/fastcs/panda/_writer.py,sha256=UqsU44u0uIqkDNky3mIzhW3OhLeZ8TSqFS666qrRdmA,6181
115
+ ophyd_async/fastcs/panda/_writer.py,sha256=j3GlbbUJ9h4mCKjg6oxSCn3NiJWwWL8xEhz0YiEBIcI,6148
115
116
  ophyd_async/plan_stubs/__init__.py,sha256=sRe1Jna_6i7aKjE3pPzsP4iNMWeWdtiptLnOq9pov9M,619
116
117
  ophyd_async/plan_stubs/_ensure_connected.py,sha256=YR6VRj7koccJ4x35NV-Ugl4ZbxgAoGN9PjVIjhv0gpw,894
117
118
  ophyd_async/plan_stubs/_fly.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -136,10 +137,10 @@ ophyd_async/tango/core/__init__.py,sha256=cgO5GWfEZqjH0Aj9KUeoZwxMrOQOTn9V9kaYel
136
137
  ophyd_async/tango/core/_base_device.py,sha256=X5ncxaWKOfRhhqPyT8tmTBJGc3ldGthw1ZCe_j_M2Tg,5088
137
138
  ophyd_async/tango/core/_converters.py,sha256=xI_RhMR8dY6IVORUZVVCL9LdYnEE6TA6BBPX_lTu06w,2183
138
139
  ophyd_async/tango/core/_signal.py,sha256=8mIxRVEVjhDN33LDbbKZWGMUYn9Gl5ZMEIYw6GSBTUE,5569
139
- ophyd_async/tango/core/_tango_transport.py,sha256=fPICZzsF9Rf53sHtM3NXlKmhF-8CNO2prra3msD74R0,37177
140
+ ophyd_async/tango/core/_tango_transport.py,sha256=lknp46-lJwkQ1ego7meq6jOgyoIOYOVGL76aad91rHA,36710
140
141
  ophyd_async/tango/core/_utils.py,sha256=pwT7V1DNWSyPOSzvDZ6OsDZTjaV-pAeDLDlmgtHVcNM,1673
141
142
  ophyd_async/tango/demo/__init__.py,sha256=_j-UicTnckuIBp8PnieFMOMnLFGivnaKdmo9o0hYtzc,256
142
- ophyd_async/tango/demo/_counter.py,sha256=m6zxOJLbHgCEBAapVc1UiOOqKj5lvrlxjA6mXWMRMjo,1200
143
+ ophyd_async/tango/demo/_counter.py,sha256=01dZBMh9C1r2lp4qdXyfBPTz3kic_k2PbDKt04PxCFo,1178
143
144
  ophyd_async/tango/demo/_detector.py,sha256=X5YWHAjukKZ7iYF1fBNle4CBDj1X5rvj0lnPMOcnRCU,1340
144
145
  ophyd_async/tango/demo/_mover.py,sha256=FyG9g1TLaWoqjbLblqWK8inMuDcNVlioq0MIeD5npz4,2913
145
146
  ophyd_async/tango/demo/_tango/__init__.py,sha256=FfONT7vM49nNo3a1Lv-LcMZO9EHv6bv91yY-RnxIib4,85
@@ -154,8 +155,8 @@ ophyd_async/testing/_one_of_everything.py,sha256=U9ui7B-iNHDM3H3hIWUuaCb8Gc2eLlU
154
155
  ophyd_async/testing/_single_derived.py,sha256=5-HOTzgePcZ354NK_ssVpyIbJoJmKyjVQCxSwQXUC-4,2730
155
156
  ophyd_async/testing/_utils.py,sha256=zClRo5ve8RGia7wQnby41W-Zprj-slOA5da1LfYnuhw,45
156
157
  ophyd_async/testing/_wait_for_pending.py,sha256=YZAR48n-CW0GsPey3zFRzMJ4byDAr3HvMIoawjmTrHw,732
157
- ophyd_async-0.14.1.dist-info/licenses/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
158
- ophyd_async-0.14.1.dist-info/METADATA,sha256=I2Y_2-lFXNeZYNYDhNxPvrubLM8bd8d5OzPbPzdn0mM,5703
159
- ophyd_async-0.14.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
160
- ophyd_async-0.14.1.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
161
- ophyd_async-0.14.1.dist-info/RECORD,,
158
+ ophyd_async-0.15.dist-info/licenses/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
159
+ ophyd_async-0.15.dist-info/METADATA,sha256=wwFA5EcCu6U5BWhZAIu-rMMqhlaYgqE07MOnNfQusd0,5701
160
+ ophyd_async-0.15.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
161
+ ophyd_async-0.15.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
162
+ ophyd_async-0.15.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5