ophyd-async 0.4.0__py3-none-any.whl → 0.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. ophyd_async/_version.py +2 -2
  2. ophyd_async/core/__init__.py +84 -73
  3. ophyd_async/core/{detector.py → _detector.py} +4 -8
  4. ophyd_async/core/{device.py → _device.py} +1 -1
  5. ophyd_async/core/{device_save_loader.py → _device_save_loader.py} +3 -3
  6. ophyd_async/core/{flyer.py → _flyer.py} +6 -8
  7. ophyd_async/{epics/areadetector/writers/general_hdffile.py → core/_hdf_dataset.py} +4 -4
  8. ophyd_async/{log.py → core/_log.py} +11 -3
  9. ophyd_async/core/{mock_signal_backend.py → _mock_signal_backend.py} +3 -3
  10. ophyd_async/core/{mock_signal_utils.py → _mock_signal_utils.py} +3 -4
  11. ophyd_async/{protocols.py → core/_protocol.py} +1 -1
  12. ophyd_async/core/{standard_readable.py → _readable.py} +6 -16
  13. ophyd_async/core/{signal.py → _signal.py} +7 -8
  14. ophyd_async/core/{signal_backend.py → _signal_backend.py} +4 -13
  15. ophyd_async/core/{soft_signal_backend.py → _soft_signal_backend.py} +3 -12
  16. ophyd_async/core/{async_status.py → _status.py} +3 -11
  17. ophyd_async/epics/adaravis/__init__.py +9 -0
  18. ophyd_async/epics/{areadetector/aravis.py → adaravis/_aravis.py} +9 -11
  19. ophyd_async/epics/{areadetector/controllers/aravis_controller.py → adaravis/_aravis_controller.py} +7 -10
  20. ophyd_async/epics/{areadetector/drivers/aravis_driver.py → adaravis/_aravis_io.py} +6 -3
  21. ophyd_async/epics/adcore/__init__.py +36 -0
  22. ophyd_async/epics/adcore/_core_io.py +114 -0
  23. ophyd_async/epics/{areadetector/drivers/ad_base.py → adcore/_core_logic.py} +16 -52
  24. ophyd_async/epics/{areadetector/writers/hdf_writer.py → adcore/_hdf_writer.py} +12 -11
  25. ophyd_async/epics/{areadetector/single_trigger_det.py → adcore/_single_trigger.py} +5 -6
  26. ophyd_async/epics/{areadetector/utils.py → adcore/_utils.py} +29 -0
  27. ophyd_async/epics/adkinetix/__init__.py +9 -0
  28. ophyd_async/epics/{areadetector/kinetix.py → adkinetix/_kinetix.py} +9 -11
  29. ophyd_async/epics/{areadetector/controllers/kinetix_controller.py → adkinetix/_kinetix_controller.py} +6 -9
  30. ophyd_async/epics/{areadetector/drivers/kinetix_driver.py → adkinetix/_kinetix_io.py} +5 -4
  31. ophyd_async/epics/adpilatus/__init__.py +11 -0
  32. ophyd_async/epics/{areadetector/pilatus.py → adpilatus/_pilatus.py} +10 -14
  33. ophyd_async/epics/{areadetector/controllers/pilatus_controller.py → adpilatus/_pilatus_controller.py} +14 -16
  34. ophyd_async/epics/{areadetector/drivers/pilatus_driver.py → adpilatus/_pilatus_io.py} +5 -3
  35. ophyd_async/epics/adsimdetector/__init__.py +7 -0
  36. ophyd_async/epics/{demo/demo_ad_sim_detector.py → adsimdetector/_sim.py} +10 -11
  37. ophyd_async/epics/{areadetector/controllers/ad_sim_controller.py → adsimdetector/_sim_controller.py} +8 -14
  38. ophyd_async/epics/advimba/__init__.py +9 -0
  39. ophyd_async/epics/{areadetector/vimba.py → advimba/_vimba.py} +9 -9
  40. ophyd_async/epics/{areadetector/controllers/vimba_controller.py → advimba/_vimba_controller.py} +6 -14
  41. ophyd_async/epics/{areadetector/drivers/vimba_driver.py → advimba/_vimba_io.py} +5 -4
  42. ophyd_async/epics/demo/__init__.py +9 -132
  43. ophyd_async/epics/demo/_mover.py +97 -0
  44. ophyd_async/epics/demo/_sensor.py +36 -0
  45. ophyd_async/epics/{motion/motor.py → motor.py} +13 -12
  46. ophyd_async/epics/pvi/__init__.py +2 -2
  47. ophyd_async/epics/pvi/{pvi.py → _pvi.py} +17 -14
  48. ophyd_async/epics/signal/__init__.py +7 -1
  49. ophyd_async/epics/{_backend → signal}/_aioca.py +3 -2
  50. ophyd_async/epics/{_backend/common.py → signal/_common.py} +1 -1
  51. ophyd_async/epics/signal/_epics_transport.py +3 -3
  52. ophyd_async/epics/{_backend → signal}/_p4p.py +4 -3
  53. ophyd_async/epics/signal/{signal.py → _signal.py} +10 -9
  54. ophyd_async/fastcs/odin/__init__.py +0 -0
  55. ophyd_async/{panda → fastcs/panda}/__init__.py +18 -13
  56. ophyd_async/{panda → fastcs/panda}/_common_blocks.py +3 -3
  57. ophyd_async/{panda → fastcs/panda}/_hdf_panda.py +2 -7
  58. ophyd_async/{panda/writers → fastcs/panda}/_hdf_writer.py +8 -7
  59. ophyd_async/{panda → fastcs/panda}/_panda_controller.py +2 -1
  60. ophyd_async/{panda → fastcs/panda}/_trigger.py +3 -7
  61. ophyd_async/plan_stubs/__init__.py +2 -2
  62. ophyd_async/plan_stubs/{ensure_connected.py → _ensure_connected.py} +1 -2
  63. ophyd_async/plan_stubs/{fly.py → _fly.py} +13 -9
  64. ophyd_async/sim/__init__.py +0 -11
  65. ophyd_async/sim/demo/__init__.py +18 -2
  66. ophyd_async/sim/demo/_pattern_detector/__init__.py +13 -0
  67. ophyd_async/sim/{sim_pattern_generator.py → demo/_pattern_detector/_pattern_detector.py} +8 -8
  68. ophyd_async/sim/{sim_pattern_detector_control.py → demo/_pattern_detector/_pattern_detector_controller.py} +4 -5
  69. ophyd_async/sim/{sim_pattern_detector_writer.py → demo/_pattern_detector/_pattern_detector_writer.py} +4 -4
  70. ophyd_async/sim/{pattern_generator.py → demo/_pattern_detector/_pattern_generator.py} +12 -8
  71. ophyd_async/sim/demo/{sim_motor.py → _sim_motor.py} +7 -5
  72. ophyd_async/sim/testing/__init__.py +0 -0
  73. ophyd_async/tango/__init__.py +0 -0
  74. {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/METADATA +1 -1
  75. ophyd_async-0.5.0.dist-info/RECORD +89 -0
  76. {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/WHEEL +1 -1
  77. ophyd_async/epics/areadetector/__init__.py +0 -23
  78. ophyd_async/epics/areadetector/controllers/__init__.py +0 -5
  79. ophyd_async/epics/areadetector/drivers/__init__.py +0 -23
  80. ophyd_async/epics/areadetector/writers/__init__.py +0 -5
  81. ophyd_async/epics/areadetector/writers/nd_file_hdf.py +0 -43
  82. ophyd_async/epics/areadetector/writers/nd_plugin.py +0 -68
  83. ophyd_async/epics/motion/__init__.py +0 -3
  84. ophyd_async/panda/writers/__init__.py +0 -3
  85. ophyd_async-0.4.0.dist-info/RECORD +0 -84
  86. /ophyd_async/core/{utils.py → _utils.py} +0 -0
  87. /ophyd_async/{epics/_backend → fastcs}/__init__.py +0 -0
  88. /ophyd_async/{panda → fastcs/panda}/_table.py +0 -0
  89. /ophyd_async/{panda → fastcs/panda}/_utils.py +0 -0
  90. {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/LICENSE +0 -0
  91. {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/entry_points.txt +0 -0
  92. {ophyd_async-0.4.0.dist-info → ophyd_async-0.5.0.dist-info}/top_level.txt +0 -0
@@ -10,25 +10,28 @@ from typing import (
10
10
  Optional,
11
11
  Tuple,
12
12
  Type,
13
- TypeVar,
14
13
  Union,
15
14
  get_args,
16
15
  get_origin,
17
16
  get_type_hints,
18
17
  )
19
18
 
20
- from ophyd_async.core import Device, DeviceVector, SoftSignalBackend
21
- from ophyd_async.core.signal import Signal
22
- from ophyd_async.core.utils import DEFAULT_TIMEOUT
23
- from ophyd_async.epics._backend._p4p import PvaSignalBackend
24
- from ophyd_async.epics.signal.signal import (
19
+ from ophyd_async.core import (
20
+ DEFAULT_TIMEOUT,
21
+ Device,
22
+ DeviceVector,
23
+ Signal,
24
+ SoftSignalBackend,
25
+ T,
26
+ )
27
+ from ophyd_async.epics.signal import (
28
+ PvaSignalBackend,
25
29
  epics_signal_r,
26
30
  epics_signal_rw,
27
31
  epics_signal_w,
28
32
  epics_signal_x,
29
33
  )
30
34
 
31
- T = TypeVar("T")
32
35
  Access = FrozenSet[
33
36
  Union[Literal["r"], Literal["w"], Literal["rw"], Literal["x"], Literal["d"]]
34
37
  ]
@@ -74,19 +77,19 @@ def _strip_device_vector(field: Union[Type[Device]]) -> Tuple[bool, Type[Device]
74
77
 
75
78
 
76
79
  @dataclass
77
- class PVIEntry:
80
+ class _PVIEntry:
78
81
  """
79
82
  A dataclass to represent a single entry in the PVI table.
80
83
  This could either be a signal or a sub-table.
81
84
  """
82
85
 
83
- sub_entries: Dict[str, Union[Dict[int, "PVIEntry"], "PVIEntry"]]
86
+ sub_entries: Dict[str, Union[Dict[int, "_PVIEntry"], "_PVIEntry"]]
84
87
  pvi_pv: Optional[str] = None
85
88
  device: Optional[Device] = None
86
89
  common_device_type: Optional[Type[Device]] = None
87
90
 
88
91
 
89
- def _verify_common_blocks(entry: PVIEntry, common_device: Type[Device]):
92
+ def _verify_common_blocks(entry: _PVIEntry, common_device: Type[Device]):
90
93
  if not entry.sub_entries:
91
94
  return
92
95
  common_sub_devices = get_type_hints(common_device)
@@ -205,7 +208,7 @@ def _mock_common_blocks(device: Device, stripped_type: Optional[Type] = None):
205
208
  sub_device.parent = device
206
209
 
207
210
 
208
- async def _get_pvi_entries(entry: PVIEntry, timeout=DEFAULT_TIMEOUT):
211
+ async def _get_pvi_entries(entry: _PVIEntry, timeout=DEFAULT_TIMEOUT):
209
212
  if not entry.pvi_pv or not entry.pvi_pv.endswith(":PVI"):
210
213
  raise RuntimeError("Top level entry must be a pvi table")
211
214
 
@@ -235,7 +238,7 @@ async def _get_pvi_entries(entry: PVIEntry, timeout=DEFAULT_TIMEOUT):
235
238
  else:
236
239
  device = getattr(entry.device, sub_name, device_type())
237
240
 
238
- sub_entry = PVIEntry(
241
+ sub_entry = _PVIEntry(
239
242
  device=device, common_device_type=device_type, sub_entries={}
240
243
  )
241
244
 
@@ -257,7 +260,7 @@ async def _get_pvi_entries(entry: PVIEntry, timeout=DEFAULT_TIMEOUT):
257
260
  _verify_common_blocks(entry, entry.common_device_type)
258
261
 
259
262
 
260
- def _set_device_attributes(entry: PVIEntry):
263
+ def _set_device_attributes(entry: _PVIEntry):
261
264
  for sub_name, sub_entry in entry.sub_entries.items():
262
265
  if isinstance(sub_entry, dict):
263
266
  sub_device = DeviceVector() # type: ignore
@@ -289,7 +292,7 @@ async def fill_pvi_entries(
289
292
  _mock_common_blocks(device)
290
293
  else:
291
294
  # check the pvi table for devices and fill the device with them
292
- root_entry = PVIEntry(
295
+ root_entry = _PVIEntry(
293
296
  pvi_pv=root_pv,
294
297
  device=device,
295
298
  common_device_type=type(device),
@@ -1,4 +1,6 @@
1
- from .signal import (
1
+ from ._common import LimitPair, Limits, get_supported_values
2
+ from ._p4p import PvaSignalBackend
3
+ from ._signal import (
2
4
  epics_signal_r,
3
5
  epics_signal_rw,
4
6
  epics_signal_rw_rbv,
@@ -7,6 +9,10 @@ from .signal import (
7
9
  )
8
10
 
9
11
  __all__ = [
12
+ "get_supported_values",
13
+ "LimitPair",
14
+ "Limits",
15
+ "PvaSignalBackend",
10
16
  "epics_signal_r",
11
17
  "epics_signal_rw",
12
18
  "epics_signal_rw_rbv",
@@ -21,6 +21,8 @@ from bluesky.protocols import DataKey, Dtype, Reading
21
21
  from epicscorelibs.ca import dbr
22
22
 
23
23
  from ophyd_async.core import (
24
+ DEFAULT_TIMEOUT,
25
+ NotConnected,
24
26
  ReadingValueCallback,
25
27
  SignalBackend,
26
28
  T,
@@ -28,9 +30,8 @@ from ophyd_async.core import (
28
30
  get_unique,
29
31
  wait_for_connection,
30
32
  )
31
- from ophyd_async.core.utils import DEFAULT_TIMEOUT, NotConnected
32
33
 
33
- from .common import LimitPair, Limits, common_meta, get_supported_values
34
+ from ._common import LimitPair, Limits, common_meta, get_supported_values
34
35
 
35
36
  dbr_to_dtype: Dict[Dbr, Dtype] = {
36
37
  dbr.DBR_STRING: "string",
@@ -4,7 +4,7 @@ from typing import Dict, Optional, Tuple, Type
4
4
 
5
5
  from typing_extensions import TypedDict
6
6
 
7
- from ophyd_async.core.signal_backend import RuntimeSubsetEnum
7
+ from ophyd_async.core import RuntimeSubsetEnum
8
8
 
9
9
  common_meta = {
10
10
  "units",
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  from enum import Enum
6
6
 
7
7
  try:
8
- from .._backend._aioca import CaSignalBackend
8
+ from ._aioca import CaSignalBackend
9
9
  except ImportError as ca_error:
10
10
 
11
11
  class CaSignalBackend: # type: ignore
@@ -14,7 +14,7 @@ except ImportError as ca_error:
14
14
 
15
15
 
16
16
  try:
17
- from .._backend._p4p import PvaSignalBackend
17
+ from ._p4p import PvaSignalBackend
18
18
  except ImportError as pva_error:
19
19
 
20
20
  class PvaSignalBackend: # type: ignore
@@ -22,7 +22,7 @@ except ImportError as pva_error:
22
22
  raise NotImplementedError("PVA support not available") from pva_error
23
23
 
24
24
 
25
- class EpicsTransport(Enum):
25
+ class _EpicsTransport(Enum):
26
26
  """The sorts of transport EPICS support"""
27
27
 
28
28
  #: Use Channel Access (using aioca library)
@@ -13,17 +13,18 @@ from p4p import Value
13
13
  from p4p.client.asyncio import Context, Subscription
14
14
 
15
15
  from ophyd_async.core import (
16
+ DEFAULT_TIMEOUT,
17
+ NotConnected,
16
18
  ReadingValueCallback,
19
+ RuntimeSubsetEnum,
17
20
  SignalBackend,
18
21
  T,
19
22
  get_dtype,
20
23
  get_unique,
21
24
  wait_for_connection,
22
25
  )
23
- from ophyd_async.core.signal_backend import RuntimeSubsetEnum
24
- from ophyd_async.core.utils import DEFAULT_TIMEOUT, NotConnected
25
26
 
26
- from .common import LimitPair, Limits, common_meta, get_supported_values
27
+ from ._common import LimitPair, Limits, common_meta, get_supported_values
27
28
 
28
29
  # https://mdavidsaver.github.io/p4p/values.html
29
30
  specifier_to_dtype: Dict[str, Dtype] = {
@@ -14,26 +14,27 @@ from ophyd_async.core import (
14
14
  get_unique,
15
15
  )
16
16
 
17
- from ._epics_transport import EpicsTransport
17
+ from ._epics_transport import _EpicsTransport
18
18
 
19
- _default_epics_transport = EpicsTransport.ca
19
+ _default_epics_transport = _EpicsTransport.ca
20
20
 
21
21
 
22
- def _transport_pv(pv: str) -> Tuple[EpicsTransport, str]:
22
+ def _transport_pv(pv: str) -> Tuple[_EpicsTransport, str]:
23
23
  split = pv.split("://", 1)
24
24
  if len(split) > 1:
25
25
  # We got something like pva://mydevice, so use specified comms mode
26
26
  transport_str, pv = split
27
- transport = EpicsTransport[transport_str]
27
+ transport = _EpicsTransport[transport_str]
28
28
  else:
29
29
  # No comms mode specified, use the default
30
30
  transport = _default_epics_transport
31
31
  return transport, pv
32
32
 
33
33
 
34
- def _make_backend(
34
+ def _epics_signal_backend(
35
35
  datatype: Optional[Type[T]], read_pv: str, write_pv: str
36
36
  ) -> SignalBackend[T]:
37
+ """Create an epics signal backend."""
37
38
  r_transport, r_pv = _transport_pv(read_pv)
38
39
  w_transport, w_pv = _transport_pv(write_pv)
39
40
  transport = get_unique({read_pv: r_transport, write_pv: w_transport}, "transports")
@@ -54,7 +55,7 @@ def epics_signal_rw(
54
55
  write_pv:
55
56
  If given, use this PV to write to, otherwise use read_pv
56
57
  """
57
- backend = _make_backend(datatype, read_pv, write_pv or read_pv)
58
+ backend = _epics_signal_backend(datatype, read_pv, write_pv or read_pv)
58
59
  return SignalRW(backend, name=name)
59
60
 
60
61
 
@@ -85,7 +86,7 @@ def epics_signal_r(datatype: Type[T], read_pv: str, name: str = "") -> SignalR[T
85
86
  read_pv:
86
87
  The PV to read and monitor
87
88
  """
88
- backend = _make_backend(datatype, read_pv, read_pv)
89
+ backend = _epics_signal_backend(datatype, read_pv, read_pv)
89
90
  return SignalR(backend, name=name)
90
91
 
91
92
 
@@ -99,7 +100,7 @@ def epics_signal_w(datatype: Type[T], write_pv: str, name: str = "") -> SignalW[
99
100
  write_pv:
100
101
  The PV to write to
101
102
  """
102
- backend = _make_backend(datatype, write_pv, write_pv)
103
+ backend = _epics_signal_backend(datatype, write_pv, write_pv)
103
104
  return SignalW(backend, name=name)
104
105
 
105
106
 
@@ -111,5 +112,5 @@ def epics_signal_x(write_pv: str, name: str = "") -> SignalX:
111
112
  write_pv:
112
113
  The PV to write its initial value to on trigger
113
114
  """
114
- backend: SignalBackend = _make_backend(None, write_pv, write_pv)
115
+ backend: SignalBackend = _epics_signal_backend(None, write_pv, write_pv)
115
116
  return SignalX(backend, name=name)
File without changes
@@ -10,8 +10,11 @@ from ._common_blocks import (
10
10
  TimeUnits,
11
11
  )
12
12
  from ._hdf_panda import HDFPanda
13
+ from ._hdf_writer import PandaHDFWriter
13
14
  from ._panda_controller import PandaPcapController
14
15
  from ._table import (
16
+ DatasetTable,
17
+ PandaHdf5DatasetType,
15
18
  SeqTable,
16
19
  SeqTableRow,
17
20
  SeqTrigger,
@@ -28,25 +31,27 @@ from ._utils import phase_sorter
28
31
 
29
32
  __all__ = [
30
33
  "CommonPandaBlocks",
31
- "HDFPanda",
32
- "PcompBlock",
33
- "PcompInfo",
34
- "PcompDirectionOptions",
34
+ "DataBlock",
35
35
  "EnableDisableOptions",
36
36
  "PcapBlock",
37
+ "PcompBlock",
38
+ "PcompDirectionOptions",
37
39
  "PulseBlock",
38
- "seq_table_from_arrays",
39
- "seq_table_from_rows",
40
40
  "SeqBlock",
41
- "SeqTableInfo",
41
+ "TimeUnits",
42
+ "HDFPanda",
43
+ "PandaHDFWriter",
44
+ "PandaPcapController",
45
+ "DatasetTable",
46
+ "PandaHdf5DatasetType",
42
47
  "SeqTable",
43
48
  "SeqTableRow",
44
49
  "SeqTrigger",
45
- "phase_sorter",
46
- "PandaPcapController",
47
- "TimeUnits",
48
- "DataBlock",
49
- "CommonPandABlocks",
50
- "StaticSeqTableTriggerLogic",
50
+ "seq_table_from_arrays",
51
+ "seq_table_from_rows",
52
+ "PcompInfo",
53
+ "SeqTableInfo",
51
54
  "StaticPcompTriggerLogic",
55
+ "StaticSeqTableTriggerLogic",
56
+ "phase_sorter",
52
57
  ]
@@ -2,9 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  from enum import Enum
4
4
 
5
- from ophyd_async.core import Device, DeviceVector, SignalR, SignalRW
6
- from ophyd_async.core.signal_backend import SubsetEnum
7
- from ophyd_async.panda._table import DatasetTable, SeqTable
5
+ from ophyd_async.core import Device, DeviceVector, SignalR, SignalRW, SubsetEnum
6
+
7
+ from ._table import DatasetTable, SeqTable
8
8
 
9
9
 
10
10
  class DataBlock(Device):
@@ -2,17 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Sequence
4
4
 
5
- from ophyd_async.core import (
6
- DEFAULT_TIMEOUT,
7
- PathProvider,
8
- SignalR,
9
- StandardDetector,
10
- )
5
+ from ophyd_async.core import DEFAULT_TIMEOUT, PathProvider, SignalR, StandardDetector
11
6
  from ophyd_async.epics.pvi import create_children_from_annotations, fill_pvi_entries
12
7
 
13
8
  from ._common_blocks import CommonPandaBlocks
9
+ from ._hdf_writer import PandaHDFWriter
14
10
  from ._panda_controller import PandaPcapController
15
- from .writers._hdf_writer import PandaHDFWriter
16
11
 
17
12
 
18
13
  class HDFPanda(CommonPandaBlocks, StandardDetector):
@@ -8,14 +8,15 @@ from p4p.client.thread import Context
8
8
  from ophyd_async.core import (
9
9
  DEFAULT_TIMEOUT,
10
10
  DetectorWriter,
11
+ HDFDataset,
12
+ HDFFile,
11
13
  NameProvider,
12
14
  PathProvider,
15
+ observe_value,
13
16
  wait_for_value,
14
17
  )
15
- from ophyd_async.core.signal import observe_value
16
- from ophyd_async.epics.areadetector.writers.general_hdffile import _HDFDataset, _HDFFile
17
18
 
18
- from .._common_blocks import CommonPandaBlocks
19
+ from ._common_blocks import CommonPandaBlocks
19
20
 
20
21
 
21
22
  class PandaHDFWriter(DetectorWriter):
@@ -32,8 +33,8 @@ class PandaHDFWriter(DetectorWriter):
32
33
  self._prefix = prefix
33
34
  self._path_provider = path_provider
34
35
  self._name_provider = name_provider
35
- self._datasets: List[_HDFDataset] = []
36
- self._file: Optional[_HDFFile] = None
36
+ self._datasets: List[HDFDataset] = []
37
+ self._file: Optional[HDFFile] = None
37
38
  self._multiplier = 1
38
39
 
39
40
  # Triggered on PCAP arm
@@ -93,7 +94,7 @@ class PandaHDFWriter(DetectorWriter):
93
94
 
94
95
  capture_table = await self.panda_device.data.datasets.get_value()
95
96
  self._datasets = [
96
- _HDFDataset(dataset_name, "/" + dataset_name, [1], multiplier=1)
97
+ HDFDataset(dataset_name, "/" + dataset_name, [1], multiplier=1)
97
98
  for dataset_name in capture_table["name"]
98
99
  ]
99
100
 
@@ -128,7 +129,7 @@ class PandaHDFWriter(DetectorWriter):
128
129
  # TODO: fail if we get dropped frames
129
130
  if indices_written:
130
131
  if not self._file:
131
- self._file = _HDFFile(
132
+ self._file = HDFFile(
132
133
  self._path_provider(),
133
134
  Path(await self.panda_device.data.hdf_directory.get_value())
134
135
  / Path(await self.panda_device.data.hdf_file_name.get_value()),
@@ -7,7 +7,8 @@ from ophyd_async.core import (
7
7
  DetectorTrigger,
8
8
  wait_for_value,
9
9
  )
10
- from ophyd_async.panda import PcapBlock
10
+
11
+ from ._common_blocks import PcapBlock
11
12
 
12
13
 
13
14
  class PandaPcapController(DetectorControl):
@@ -4,13 +4,9 @@ from typing import Optional
4
4
  from pydantic import BaseModel, Field
5
5
 
6
6
  from ophyd_async.core import TriggerLogic, wait_for_value
7
- from ophyd_async.panda import (
8
- PcompBlock,
9
- PcompDirectionOptions,
10
- SeqBlock,
11
- SeqTable,
12
- TimeUnits,
13
- )
7
+
8
+ from ._common_blocks import PcompBlock, PcompDirectionOptions, SeqBlock, TimeUnits
9
+ from ._table import SeqTable
14
10
 
15
11
 
16
12
  class SeqTableInfo(BaseModel):
@@ -1,5 +1,5 @@
1
- from .ensure_connected import ensure_connected
2
- from .fly import (
1
+ from ._ensure_connected import ensure_connected
2
+ from ._fly import (
3
3
  fly_and_collect,
4
4
  prepare_static_seq_table_flyer_and_detectors_with_same_trigger,
5
5
  time_resolved_fly_and_collect_with_static_seq_table,
@@ -1,7 +1,6 @@
1
1
  import bluesky.plan_stubs as bps
2
2
 
3
- from ophyd_async.core.device import Device
4
- from ophyd_async.core.utils import DEFAULT_TIMEOUT, wait_for_connection
3
+ from ophyd_async.core import DEFAULT_TIMEOUT, Device, wait_for_connection
5
4
 
6
5
 
7
6
  def ensure_connected(
@@ -3,10 +3,14 @@ from typing import List, Optional
3
3
  import bluesky.plan_stubs as bps
4
4
  from bluesky.utils import short_uid
5
5
 
6
- from ophyd_async.core.detector import DetectorTrigger, StandardDetector, TriggerInfo
7
- from ophyd_async.core.flyer import HardwareTriggeredFlyable
8
- from ophyd_async.core.utils import in_micros
9
- from ophyd_async.panda import (
6
+ from ophyd_async.core import (
7
+ DetectorTrigger,
8
+ StandardDetector,
9
+ StandardFlyer,
10
+ TriggerInfo,
11
+ in_micros,
12
+ )
13
+ from ophyd_async.fastcs.panda import (
10
14
  PcompDirectionOptions,
11
15
  PcompInfo,
12
16
  SeqTable,
@@ -17,7 +21,7 @@ from ophyd_async.panda import (
17
21
 
18
22
 
19
23
  def prepare_static_pcomp_flyer_and_detectors(
20
- flyer: HardwareTriggeredFlyable[PcompInfo],
24
+ flyer: StandardFlyer[PcompInfo],
21
25
  detectors: List[StandardDetector],
22
26
  pcomp_info: PcompInfo,
23
27
  trigger_info: TriggerInfo,
@@ -36,7 +40,7 @@ def prepare_static_pcomp_flyer_and_detectors(
36
40
 
37
41
 
38
42
  def prepare_static_seq_table_flyer_and_detectors_with_same_trigger(
39
- flyer: HardwareTriggeredFlyable[SeqTableInfo],
43
+ flyer: StandardFlyer[SeqTableInfo],
40
44
  detectors: List[StandardDetector],
41
45
  number_of_frames: int,
42
46
  exposure: float,
@@ -100,7 +104,7 @@ def prepare_static_seq_table_flyer_and_detectors_with_same_trigger(
100
104
 
101
105
  def fly_and_collect(
102
106
  stream_name: str,
103
- flyer: HardwareTriggeredFlyable[SeqTableInfo] | HardwareTriggeredFlyable[PcompInfo],
107
+ flyer: StandardFlyer[SeqTableInfo] | StandardFlyer[PcompInfo],
104
108
  detectors: List[StandardDetector],
105
109
  ):
106
110
  """Kickoff, complete and collect with a flyer and multiple detectors.
@@ -140,7 +144,7 @@ def fly_and_collect(
140
144
 
141
145
  def fly_and_collect_with_static_pcomp(
142
146
  stream_name: str,
143
- flyer: HardwareTriggeredFlyable[PcompInfo],
147
+ flyer: StandardFlyer[PcompInfo],
144
148
  detectors: List[StandardDetector],
145
149
  number_of_pulses: int,
146
150
  pulse_width: int,
@@ -166,7 +170,7 @@ def fly_and_collect_with_static_pcomp(
166
170
 
167
171
  def time_resolved_fly_and_collect_with_static_seq_table(
168
172
  stream_name: str,
169
- flyer: HardwareTriggeredFlyable[SeqTableInfo],
173
+ flyer: StandardFlyer[SeqTableInfo],
170
174
  detectors: List[StandardDetector],
171
175
  number_of_frames: int,
172
176
  exposure: float,
@@ -1,11 +0,0 @@
1
- from .pattern_generator import PatternGenerator
2
- from .sim_pattern_detector_control import SimPatternDetectorControl
3
- from .sim_pattern_detector_writer import SimPatternDetectorWriter
4
- from .sim_pattern_generator import SimPatternDetector
5
-
6
- __all__ = [
7
- "PatternGenerator",
8
- "SimPatternDetectorControl",
9
- "SimPatternDetectorWriter",
10
- "SimPatternDetector",
11
- ]
@@ -1,3 +1,19 @@
1
- from .sim_motor import SimMotor
1
+ from ._pattern_detector import (
2
+ DATA_PATH,
3
+ SUM_PATH,
4
+ PatternDetector,
5
+ PatternDetectorController,
6
+ PatternDetectorWriter,
7
+ PatternGenerator,
8
+ )
9
+ from ._sim_motor import SimMotor
2
10
 
3
- __all__ = ["SimMotor"]
11
+ __all__ = [
12
+ "DATA_PATH",
13
+ "SUM_PATH",
14
+ "PatternGenerator",
15
+ "PatternDetector",
16
+ "PatternDetectorController",
17
+ "PatternDetectorWriter",
18
+ "SimMotor",
19
+ ]
@@ -0,0 +1,13 @@
1
+ from ._pattern_detector import PatternDetector
2
+ from ._pattern_detector_controller import PatternDetectorController
3
+ from ._pattern_detector_writer import PatternDetectorWriter
4
+ from ._pattern_generator import DATA_PATH, SUM_PATH, PatternGenerator
5
+
6
+ __all__ = [
7
+ "PatternDetector",
8
+ "PatternDetectorController",
9
+ "PatternDetectorWriter",
10
+ "DATA_PATH",
11
+ "SUM_PATH",
12
+ "PatternGenerator",
13
+ ]
@@ -2,20 +2,20 @@ from pathlib import Path
2
2
  from typing import Sequence
3
3
 
4
4
  from ophyd_async.core import (
5
+ AsyncReadable,
5
6
  FilenameProvider,
6
7
  PathProvider,
8
+ StandardDetector,
7
9
  StaticFilenameProvider,
8
10
  StaticPathProvider,
9
11
  )
10
- from ophyd_async.core.detector import StandardDetector
11
- from ophyd_async.protocols import AsyncReadable
12
- from ophyd_async.sim.pattern_generator import PatternGenerator
13
12
 
14
- from .sim_pattern_detector_control import SimPatternDetectorControl
15
- from .sim_pattern_detector_writer import SimPatternDetectorWriter
13
+ from ._pattern_detector_controller import PatternDetectorController
14
+ from ._pattern_detector_writer import PatternDetectorWriter
15
+ from ._pattern_generator import PatternGenerator
16
16
 
17
17
 
18
- class SimPatternDetector(StandardDetector):
18
+ class PatternDetector(StandardDetector):
19
19
  def __init__(
20
20
  self,
21
21
  path: Path,
@@ -25,12 +25,12 @@ class SimPatternDetector(StandardDetector):
25
25
  fp: FilenameProvider = StaticFilenameProvider(name)
26
26
  self.path_provider: PathProvider = StaticPathProvider(fp, path)
27
27
  self.pattern_generator = PatternGenerator()
28
- writer = SimPatternDetectorWriter(
28
+ writer = PatternDetectorWriter(
29
29
  pattern_generator=self.pattern_generator,
30
30
  path_provider=self.path_provider,
31
31
  name_provider=lambda: self.name,
32
32
  )
33
- controller = SimPatternDetectorControl(
33
+ controller = PatternDetectorController(
34
34
  pattern_generator=self.pattern_generator,
35
35
  path_provider=self.path_provider,
36
36
  )
@@ -1,13 +1,12 @@
1
1
  import asyncio
2
2
  from typing import Optional
3
3
 
4
- from ophyd_async.core import PathProvider
5
- from ophyd_async.core.async_status import AsyncStatus
6
- from ophyd_async.core.detector import DetectorControl, DetectorTrigger
7
- from ophyd_async.sim.pattern_generator import PatternGenerator
4
+ from ophyd_async.core import AsyncStatus, DetectorControl, DetectorTrigger, PathProvider
8
5
 
6
+ from ._pattern_generator import PatternGenerator
9
7
 
10
- class SimPatternDetectorControl(DetectorControl):
8
+
9
+ class PatternDetectorController(DetectorControl):
11
10
  def __init__(
12
11
  self,
13
12
  pattern_generator: PatternGenerator,
@@ -2,12 +2,12 @@ from typing import AsyncGenerator, AsyncIterator, Dict
2
2
 
3
3
  from bluesky.protocols import DataKey
4
4
 
5
- from ophyd_async.core import NameProvider, PathProvider
6
- from ophyd_async.core.detector import DetectorWriter
7
- from ophyd_async.sim.pattern_generator import PatternGenerator
5
+ from ophyd_async.core import DetectorWriter, NameProvider, PathProvider
8
6
 
7
+ from ._pattern_generator import PatternGenerator
9
8
 
10
- class SimPatternDetectorWriter(DetectorWriter):
9
+
10
+ class PatternDetectorWriter(DetectorWriter):
11
11
  pattern_generator: PatternGenerator
12
12
 
13
13
  def __init__(