ophyd-async 0.10.0a2__py3-none-any.whl → 0.10.0a3__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 (44) hide show
  1. ophyd_async/_version.py +2 -2
  2. ophyd_async/core/__init__.py +0 -2
  3. ophyd_async/core/_derived_signal.py +5 -5
  4. ophyd_async/core/_derived_signal_backend.py +4 -4
  5. ophyd_async/core/_detector.py +69 -55
  6. ophyd_async/core/_device.py +3 -3
  7. ophyd_async/core/_hdf_dataset.py +1 -5
  8. ophyd_async/core/_providers.py +0 -8
  9. ophyd_async/core/_readable.py +13 -1
  10. ophyd_async/epics/adandor/_andor_controller.py +1 -1
  11. ophyd_async/epics/adaravis/_aravis_controller.py +2 -2
  12. ophyd_async/epics/adcore/_core_logic.py +3 -3
  13. ophyd_async/epics/adcore/_core_writer.py +22 -29
  14. ophyd_async/epics/adcore/_hdf_writer.py +17 -15
  15. ophyd_async/epics/adcore/_jpeg_writer.py +1 -3
  16. ophyd_async/epics/adcore/_tiff_writer.py +1 -3
  17. ophyd_async/epics/adkinetix/_kinetix_controller.py +1 -1
  18. ophyd_async/epics/adpilatus/_pilatus_controller.py +2 -2
  19. ophyd_async/epics/adpilatus/_pilatus_io.py +1 -1
  20. ophyd_async/epics/advimba/_vimba_controller.py +1 -1
  21. ophyd_async/epics/core/_p4p.py +1 -1
  22. ophyd_async/epics/core/_pvi_connector.py +5 -3
  23. ophyd_async/epics/eiger/__init__.py +2 -4
  24. ophyd_async/epics/eiger/_odin_io.py +57 -34
  25. ophyd_async/epics/testing/_example_ioc.py +1 -0
  26. ophyd_async/epics/testing/test_records.db +5 -0
  27. ophyd_async/fastcs/eiger/__init__.py +13 -0
  28. ophyd_async/{epics → fastcs}/eiger/_eiger.py +5 -5
  29. ophyd_async/{epics → fastcs}/eiger/_eiger_controller.py +12 -26
  30. ophyd_async/fastcs/eiger/_eiger_io.py +53 -0
  31. ophyd_async/fastcs/panda/_block.py +2 -0
  32. ophyd_async/fastcs/panda/_hdf_panda.py +0 -1
  33. ophyd_async/fastcs/panda/_writer.py +23 -22
  34. ophyd_async/plan_stubs/_fly.py +2 -2
  35. ophyd_async/sim/_blob_detector.py +0 -1
  36. ophyd_async/sim/_blob_detector_controller.py +1 -1
  37. ophyd_async/sim/_blob_detector_writer.py +15 -19
  38. ophyd_async/sim/_pattern_generator.py +2 -0
  39. {ophyd_async-0.10.0a2.dist-info → ophyd_async-0.10.0a3.dist-info}/METADATA +1 -1
  40. {ophyd_async-0.10.0a2.dist-info → ophyd_async-0.10.0a3.dist-info}/RECORD +43 -42
  41. {ophyd_async-0.10.0a2.dist-info → ophyd_async-0.10.0a3.dist-info}/WHEEL +1 -1
  42. ophyd_async/epics/eiger/_eiger_io.py +0 -42
  43. {ophyd_async-0.10.0a2.dist-info → ophyd_async-0.10.0a3.dist-info}/licenses/LICENSE +0 -0
  44. {ophyd_async-0.10.0a2.dist-info → ophyd_async-0.10.0a3.dist-info}/top_level.txt +0 -0
@@ -10,7 +10,6 @@ from ophyd_async.core import (
10
10
  DetectorWriter,
11
11
  HDFDatasetDescription,
12
12
  HDFDocumentComposer,
13
- NameProvider,
14
13
  PathProvider,
15
14
  observe_value,
16
15
  wait_for_value,
@@ -25,24 +24,22 @@ class PandaHDFWriter(DetectorWriter):
25
24
  def __init__(
26
25
  self,
27
26
  path_provider: PathProvider,
28
- name_provider: NameProvider,
29
27
  panda_data_block: DataBlock,
30
28
  ) -> None:
31
29
  self.panda_data_block = panda_data_block
32
30
  self._path_provider = path_provider
33
- self._name_provider = name_provider
34
31
  self._datasets: list[HDFDatasetDescription] = []
35
32
  self._composer: HDFDocumentComposer | None = None
36
- self._multiplier = 1
37
33
 
38
34
  # Triggered on PCAP arm
39
- async def open(self, multiplier: int = 1) -> dict[str, DataKey]:
35
+ async def open(self, name: str, exposures_per_event: int = 1) -> dict[str, DataKey]:
40
36
  """Retrieve and get descriptor of all PandA signals marked for capture."""
37
+ self._exposures_per_event = exposures_per_event
41
38
  # Ensure flushes are immediate
42
39
  await self.panda_data_block.flush_period.set(0)
43
40
 
44
41
  self._composer = None
45
- info = self._path_provider(device_name=self._name_provider())
42
+ info = self._path_provider(device_name=name)
46
43
 
47
44
  # Set create dir depth first to guarantee that callback when setting
48
45
  # directory path has correct value
@@ -66,21 +63,19 @@ class PandaHDFWriter(DetectorWriter):
66
63
 
67
64
  # Wait for it to start, stashing the status that tells us when it finishes
68
65
  await self.panda_data_block.capture.set(True)
69
- if multiplier > 1:
70
- raise ValueError(
71
- "All PandA datasets should be scalar, multiplier should be 1"
72
- )
73
66
 
74
- return await self._describe()
67
+ return await self._describe(name)
75
68
 
76
- async def _describe(self) -> dict[str, DataKey]:
69
+ async def _describe(self, name: str) -> dict[str, DataKey]:
77
70
  """Return a describe based on the datasets PV."""
78
- await self._update_datasets()
71
+ await self._update_datasets(name)
79
72
  describe = {
80
73
  ds.data_key: DataKey(
81
74
  source=self.panda_data_block.hdf_directory.source,
82
75
  shape=list(ds.shape),
83
- dtype="number",
76
+ dtype="array"
77
+ if self._exposures_per_event > 1 or len(ds.shape) > 1
78
+ else "number",
84
79
  # PandA data should always be written as Float64
85
80
  dtype_numpy=ds.dtype_numpy,
86
81
  external="STREAM:",
@@ -89,7 +84,7 @@ class PandaHDFWriter(DetectorWriter):
89
84
  }
90
85
  return describe
91
86
 
92
- async def _update_datasets(self) -> None:
87
+ async def _update_datasets(self, name: str) -> None:
93
88
  # Load data from the datasets PV on the panda, update internal
94
89
  # representation of datasets that the panda will write.
95
90
  capture_table = await self.panda_data_block.datasets.get_value()
@@ -99,9 +94,10 @@ class PandaHDFWriter(DetectorWriter):
99
94
  HDFDatasetDescription(
100
95
  data_key=dataset_name,
101
96
  dataset="/" + dataset_name,
102
- shape=(),
97
+ shape=(self._exposures_per_event,)
98
+ if self._exposures_per_event > 1
99
+ else (),
103
100
  dtype_numpy="<f8",
104
- multiplier=1,
105
101
  chunk_shape=(1024,),
106
102
  )
107
103
  for dataset_name in capture_table.name
@@ -111,7 +107,7 @@ class PandaHDFWriter(DetectorWriter):
111
107
  # i.e. no stream resources will be generated
112
108
  if len(self._datasets) == 0:
113
109
  self.panda_data_block.log.warning(
114
- f"PandA {self._name_provider()} DATASETS table is empty! "
110
+ f"PandA {name} DATASETS table is empty! "
115
111
  "No stream resource docs will be generated. "
116
112
  "Make sure captured positions have their corresponding "
117
113
  "*:DATASET PV set to a scientifically relevant name."
@@ -121,7 +117,9 @@ class PandaHDFWriter(DetectorWriter):
121
117
  # StandardDetector behavior
122
118
  async def wait_for_index(self, index: int, timeout: float | None = DEFAULT_TIMEOUT):
123
119
  def matcher(value: int) -> bool:
124
- return value >= index
120
+ # Index is already divided by exposures_per_event, so we need to also
121
+ # divide the value by exposures_per_event to get the correct index
122
+ return value // self._exposures_per_event >= index
125
123
 
126
124
  matcher.__name__ = f"index_at_least_{index}"
127
125
  await wait_for_value(
@@ -129,7 +127,10 @@ class PandaHDFWriter(DetectorWriter):
129
127
  )
130
128
 
131
129
  async def get_indices_written(self) -> int:
132
- return await self.panda_data_block.num_captured.get_value()
130
+ return (
131
+ await self.panda_data_block.num_captured.get_value()
132
+ // self._exposures_per_event
133
+ )
133
134
 
134
135
  async def observe_indices_written(
135
136
  self, timeout: float
@@ -138,10 +139,10 @@ class PandaHDFWriter(DetectorWriter):
138
139
  async for num_captured in observe_value(
139
140
  self.panda_data_block.num_captured, timeout
140
141
  ):
141
- yield num_captured // self._multiplier
142
+ yield num_captured // self._exposures_per_event
142
143
 
143
144
  async def collect_stream_docs(
144
- self, indices_written: int
145
+ self, name: str, indices_written: int
145
146
  ) -> AsyncIterator[StreamAsset]:
146
147
  # TODO: fail if we get dropped frames
147
148
  if indices_written:
@@ -60,11 +60,11 @@ def prepare_static_seq_table_flyer_and_detectors_with_same_trigger(
60
60
  deadtime = max(det._controller.get_deadtime(exposure) for det in detectors) # noqa: SLF001
61
61
 
62
62
  trigger_info = TriggerInfo(
63
- number_of_triggers=number_of_frames * repeats,
63
+ number_of_events=number_of_frames * repeats,
64
64
  trigger=DetectorTrigger.CONSTANT_GATE,
65
65
  deadtime=deadtime,
66
66
  livetime=exposure,
67
- frame_timeout=frame_timeout,
67
+ exposure_timeout=frame_timeout,
68
68
  )
69
69
  trigger_time = number_of_frames * (exposure + deadtime)
70
70
  pre_delay = max(period - 2 * shutter_time - trigger_time, 0)
@@ -26,7 +26,6 @@ class SimBlobDetector(StandardDetector):
26
26
  writer=BlobDetectorWriter(
27
27
  pattern_generator=self.pattern_generator,
28
28
  path_provider=path_provider,
29
- name_provider=lambda: self.name,
30
29
  ),
31
30
  config_sigs=config_sigs,
32
31
  name=name,
@@ -30,7 +30,7 @@ class BlobDetectorController(DetectorController):
30
30
  coro = self.pattern_generator.write_images_to_file(
31
31
  exposure=livetime,
32
32
  period=livetime + self.trigger_info.deadtime,
33
- number_of_frames=self.trigger_info.total_number_of_triggers,
33
+ number_of_frames=self.trigger_info.total_number_of_exposures,
34
34
  )
35
35
  self.task = asyncio.create_task(coro)
36
36
 
@@ -9,7 +9,6 @@ from ophyd_async.core import (
9
9
  DetectorWriter,
10
10
  HDFDatasetDescription,
11
11
  HDFDocumentComposer,
12
- NameProvider,
13
12
  PathProvider,
14
13
  )
15
14
 
@@ -24,69 +23,66 @@ class BlobDetectorWriter(DetectorWriter):
24
23
  self,
25
24
  pattern_generator: PatternGenerator,
26
25
  path_provider: PathProvider,
27
- name_provider: NameProvider,
28
26
  ) -> None:
29
27
  self.pattern_generator = pattern_generator
30
28
  self.path_provider = path_provider
31
- self.name_provider = name_provider
32
29
  self.path: Path | None = None
33
30
  self.composer: HDFDocumentComposer | None = None
34
31
  self.datasets: list[HDFDatasetDescription] = []
35
32
 
36
- async def open(self, multiplier: int = 1) -> dict[str, DataKey]:
37
- name = self.name_provider()
33
+ async def open(self, name: str, exposures_per_event: int = 1) -> dict[str, DataKey]:
38
34
  path_info = self.path_provider(name)
39
35
  self.path = path_info.directory_path / f"{path_info.filename}.h5"
40
36
  self.pattern_generator.open_file(self.path, WIDTH, HEIGHT)
37
+ self.exposures_per_event = exposures_per_event
41
38
  # We know it will write data and sum, so emit those
42
39
  self.datasets = [
43
40
  HDFDatasetDescription(
44
41
  data_key=name,
45
42
  dataset=DATA_PATH,
46
- shape=(HEIGHT, WIDTH),
43
+ shape=(exposures_per_event, HEIGHT, WIDTH),
47
44
  dtype_numpy=np.dtype(np.uint8).str,
48
- chunk_shape=(HEIGHT, WIDTH),
49
- multiplier=multiplier,
45
+ chunk_shape=(1024,),
50
46
  ),
51
47
  HDFDatasetDescription(
52
48
  data_key=f"{name}-sum",
53
49
  dataset=SUM_PATH,
54
- shape=(),
50
+ shape=(exposures_per_event,) if exposures_per_event > 1 else (),
55
51
  dtype_numpy=np.dtype(np.int64).str,
56
- multiplier=multiplier,
57
52
  chunk_shape=(1024,),
58
53
  ),
59
54
  ]
60
55
  self.composer = None
61
- outer_shape = (multiplier,) if multiplier > 1 else ()
62
56
  describe = {
63
57
  ds.data_key: DataKey(
64
58
  source="sim://pattern-generator-hdf-file",
65
- shape=list(outer_shape) + list(ds.shape),
66
- dtype="array" if ds.shape else "number",
59
+ shape=list(ds.shape),
60
+ dtype="array"
61
+ if exposures_per_event > 1 or len(ds.shape) > 1
62
+ else "number",
63
+ dtype_numpy=ds.dtype_numpy,
67
64
  external="STREAM:",
68
65
  )
69
66
  for ds in self.datasets
70
67
  }
71
68
  return describe
72
69
 
73
- @property
74
- def hints(self) -> Hints:
70
+ def get_hints(self, name: str) -> Hints:
75
71
  """The hints to be used for the detector."""
76
- return {"fields": [self.name_provider()]}
72
+ return {"fields": [name]}
77
73
 
78
74
  async def get_indices_written(self) -> int:
79
- return self.pattern_generator.get_last_index()
75
+ return self.pattern_generator.get_last_index() // self.exposures_per_event
80
76
 
81
77
  async def observe_indices_written(
82
78
  self, timeout: float
83
79
  ) -> AsyncGenerator[int, None]:
84
80
  while True:
85
- yield self.pattern_generator.get_last_index()
81
+ yield self.pattern_generator.get_last_index() // self.exposures_per_event
86
82
  await self.pattern_generator.wait_for_next_index(timeout)
87
83
 
88
84
  async def collect_stream_docs(
89
- self, indices_written: int
85
+ self, name: str, indices_written: int
90
86
  ) -> AsyncIterator[StreamAsset]:
91
87
  # When we have written something to the file
92
88
  if indices_written:
@@ -45,12 +45,14 @@ class PatternFile:
45
45
  shape=(0, height, width),
46
46
  dtype=np.uint8,
47
47
  maxshape=(None, height, width),
48
+ chunks=(1024, height, width),
48
49
  )
49
50
  self.sum = self.file.create_dataset(
50
51
  name=SUM_PATH,
51
52
  shape=(0,),
52
53
  dtype=np.int64,
53
54
  maxshape=(None,),
55
+ chunks=(1024,),
54
56
  )
55
57
  # Once datasets written, can switch the model to single writer multiple reader
56
58
  self.file.swmr_mode = True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ophyd-async
3
- Version: 0.10.0a2
3
+ Version: 0.10.0a3
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,21 +1,21 @@
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=vwU_BgU9ApXpWH564vijXNOtjK-ww1iSaNC4uWmoIT4,515
4
+ ophyd_async/_version.py,sha256=-EBD05g6kq94GHd6lTD2fVHvQZpXxxsDi5077QEreeE,521
5
5
  ophyd_async/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- ophyd_async/core/__init__.py,sha256=eFRVN5WJQKNcZbFtP8abDcra6d_mwFLA0A60AbXL2Vw,4484
7
- ophyd_async/core/_derived_signal.py,sha256=DS2-t_N8WOGjZjzt-0xRHaWIr3VzKFyV-WiRKRxf7ks,10404
8
- ophyd_async/core/_derived_signal_backend.py,sha256=5_J9AfRPueJZ-CEgpE7GSG9B1nHUFzanD0N2D1mrGrY,12216
9
- ophyd_async/core/_detector.py,sha256=J5Chu4sI9WgupB_3qh1c7ZOtlv9tSMJ3tXkHnsc9WIw,14517
10
- ophyd_async/core/_device.py,sha256=UjpKuGvwCYN0-I0qpdWzBI9uLSLieHryDsLf_9Qeu-Y,14593
6
+ ophyd_async/core/__init__.py,sha256=3hj-8M2bRbYUjr8lgjp-DLOOtVQZQnPVLEJKhnlskQs,4446
7
+ ophyd_async/core/_derived_signal.py,sha256=s8VSOkjl8QVg5RTusCOAeGM_cAAJkfjO5e0cyTJ4qwg,10482
8
+ ophyd_async/core/_derived_signal_backend.py,sha256=pci61vJkGnsMYxB54AZHyOr4rJECRpigNFtUZTM0P20,12211
9
+ ophyd_async/core/_detector.py,sha256=MUkZusj7yIUKiULW2H__PQ76-Mykm1pwEcRpxuh9ho4,15232
10
+ ophyd_async/core/_device.py,sha256=QSOgjXkvBpPWE1VhQ21tIC8d9z4Oadr6C_1tk4J21W4,14617
11
11
  ophyd_async/core/_device_filler.py,sha256=MDz8eQQ-eEAwo-UEMxfqPfpcBuMG01tLCGR6utwVnmE,14825
12
12
  ophyd_async/core/_flyer.py,sha256=YPCGAokF0GofOOO2OLrsSLoZSXs_RzmmrNglBunA31o,1924
13
- ophyd_async/core/_hdf_dataset.py,sha256=eKz5wJQrhpnfnnEG9kliFqlEEdaN4oHy98JXsp-tGNE,2956
13
+ ophyd_async/core/_hdf_dataset.py,sha256=jOYcrJUvZy9VarHCxs-eOIYME5u1yGOZK9CqccCEA6E,2868
14
14
  ophyd_async/core/_log.py,sha256=DxKR4Nz3SgTaTzKBZWqt-w48yT8WUAr_3Qr223TEWRw,3587
15
15
  ophyd_async/core/_mock_signal_backend.py,sha256=SPdCbVWss6-iL9C3t9u0IvR_Ln9JeDypVd18WlivdjE,3156
16
16
  ophyd_async/core/_protocol.py,sha256=wQ_snxhTprHqEjQb1HgFwBljwolMY6A8C3xgV1PXwdU,4051
17
- ophyd_async/core/_providers.py,sha256=VbpRqV9hjv-GV8ngiy52FUoQGnR0XpQ0ZzQ1SPo0NwU,7765
18
- ophyd_async/core/_readable.py,sha256=o96tsAxOK81554TQtwJobDn6moDimu5u-k-IXfLttO8,11053
17
+ ophyd_async/core/_providers.py,sha256=0R--Slh_E16l4AQoNtessQZpOwIn7uBowvcnzh8jYgk,7538
18
+ ophyd_async/core/_readable.py,sha256=iBo1YwA5bsAbzLbznvmSnzKDWUuGkLh850Br3BXsgeU,11707
19
19
  ophyd_async/core/_settings.py,sha256=_ZccbXKP7j5rG6-bMKk7aaLr8hChdRDAPY_YSR71XXM,4213
20
20
  ophyd_async/core/_signal.py,sha256=kqIvQXRP3n34-uhgTmbwm2fTIz_phJYyTT4Rm7P-gSs,26412
21
21
  ophyd_async/core/_signal_backend.py,sha256=T8vJi-QuMfjB_uBB6iu_aApAY0j5pAFkDn5g2oSCbmI,6826
@@ -29,44 +29,44 @@ ophyd_async/epics/motor.py,sha256=6AyLQmgqzabcJ4T2yTJBP1omSxxWeya5RbR_r4zYr10,10
29
29
  ophyd_async/epics/signal.py,sha256=0A-supp9ajr63O6aD7F9oG0-Q26YmRjk-ZGh57-jo1Y,239
30
30
  ophyd_async/epics/adandor/__init__.py,sha256=qsBoZdljSaqM-kJSvTf0uq5TNwXAih9lP3yOZpKxOFQ,204
31
31
  ophyd_async/epics/adandor/_andor.py,sha256=SxAIP9OLefUqKcxrxhjNzil5D8-59Ps0vADdR6scO44,1281
32
- ophyd_async/epics/adandor/_andor_controller.py,sha256=BqHNo0CqQR9WoxkTYNy0wP0vHKmkQk7PTvEbigLZG6I,1757
32
+ ophyd_async/epics/adandor/_andor_controller.py,sha256=QojcPUIKpGL6RHuoqy5OCqLpBwzMsm81ciQDWp1cSCo,1758
33
33
  ophyd_async/epics/adandor/_andor_io.py,sha256=L1HmugU6sHK3F_pT0LaN3U1hKlDkzmSwdqr6-LHieTg,1036
34
34
  ophyd_async/epics/adaravis/__init__.py,sha256=ZQaJVQiwcQn9hUZADrYgBE1sDfFEwjhVBJRPth1_LBo,395
35
35
  ophyd_async/epics/adaravis/_aravis.py,sha256=Ju2wuebz9_ovl-Kza39s5VQ1pV-Omt_BaIWKqP4kcGA,1315
36
- ophyd_async/epics/adaravis/_aravis_controller.py,sha256=SP3Zpgv8xpOYKJECIrLisQkQMfvfbswHeW5W_mHHhWU,1906
36
+ ophyd_async/epics/adaravis/_aravis_controller.py,sha256=WiFR7_FAAu6_88zG-yzGLsR9YcO4L6xR73Wnjw9n0i4,1908
37
37
  ophyd_async/epics/adaravis/_aravis_io.py,sha256=af5RxeXF2ligvAXwMNMKHA4QHTR_WmNFz-f18qD2dbg,855
38
38
  ophyd_async/epics/adcore/__init__.py,sha256=GipuBZwaAju4g15WjvGs78S4zjGVxmbPel4E29zHFvE,1583
39
39
  ophyd_async/epics/adcore/_core_detector.py,sha256=a7S9RViLXd9XnKFWFOhcMrSbubqZoxdQt09BZr8apUQ,2617
40
40
  ophyd_async/epics/adcore/_core_io.py,sha256=-MEsDO736idCrAxvT4BnX-NBWLvZGHTNO22c5H09_J8,7406
41
- ophyd_async/epics/adcore/_core_logic.py,sha256=OPY-yF2lTHDC_KM5AarAfJnvhmmEA63FxKaIRaCCQ_4,8062
42
- ophyd_async/epics/adcore/_core_writer.py,sha256=D3qOcW8n3FMSLNACpBdCbQG0hmXE3nweTqZNuxoTYME,8207
43
- ophyd_async/epics/adcore/_hdf_writer.py,sha256=PTciHPAAqsQULncPBXUJ2tS_I232Ko6Hc6IdLHFfKmU,5519
44
- ophyd_async/epics/adcore/_jpeg_writer.py,sha256=DFv3YdqKjNq0QCb-bLBlxTaGzmHSvdU_rLB29beI46w,748
41
+ ophyd_async/epics/adcore/_core_logic.py,sha256=CjzrfC5HiwoLI1igqRKIn2SSH86T_QmAFi1-kEdyGyM,8075
42
+ ophyd_async/epics/adcore/_core_writer.py,sha256=S58plRmbNzig-r7gubKjDVDni_nf4CASaV1OJvudbHw,8019
43
+ ophyd_async/epics/adcore/_hdf_writer.py,sha256=ns7T9tb54ReGnyYs0fITg3Cb_0DSz4EDKlKtjBkmG3k,5572
44
+ ophyd_async/epics/adcore/_jpeg_writer.py,sha256=7XC4Twx_MaCBjeol27UA-hStOCQEjkEAb3ToVMPUlZ8,670
45
45
  ophyd_async/epics/adcore/_single_trigger.py,sha256=tFGLT1b_rZzAvbqWP-hyCccxJMRY26T5IER-VAqKXmc,1275
46
- ophyd_async/epics/adcore/_tiff_writer.py,sha256=5WXdW0thL9nv2jSMSqF-bMGQjztQZEnx3enY-nGsLiY,749
46
+ ophyd_async/epics/adcore/_tiff_writer.py,sha256=Na30osfkgrq4VQhUzDcuS52Gy7FS08CzbgEmKwljTmk,671
47
47
  ophyd_async/epics/adcore/_utils.py,sha256=wGWpvm2hi-80N-RxbKOO0-GcMf-vs7B9ZDBxpzGd4mA,3952
48
48
  ophyd_async/epics/adkinetix/__init__.py,sha256=A9xq3lGMrmza9lfukRixC0Up_kUDVFII8JguLr2x7Bw,308
49
49
  ophyd_async/epics/adkinetix/_kinetix.py,sha256=zZv0JZ8i1RSx7KBDn_1HGNOY0BoIP81mRK5TKq7d4eA,1302
50
- ophyd_async/epics/adkinetix/_kinetix_controller.py,sha256=cL2nf9ntmXDq3BGku9aIUYdm85DdfB7PYhypGuY1PPg,1480
50
+ ophyd_async/epics/adkinetix/_kinetix_controller.py,sha256=UI-XcQpGj7jq-_e1ceoMOZkyfejwG6H5wX-Ntp_NJjg,1481
51
51
  ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=5u4TknhcoCSjyp16HQIEp_aOmvfNAKOBoGlMRJoVxuw,770
52
52
  ophyd_async/epics/adpilatus/__init__.py,sha256=So7PrLHij7LWOqMbsHUhfqRzKp9iKtrojuWTDS1lID8,406
53
53
  ophyd_async/epics/adpilatus/_pilatus.py,sha256=SqNjGpZde_9RVSghjx6h9g2SnoJP-EWU4ew3TMXPayc,1511
54
- ophyd_async/epics/adpilatus/_pilatus_controller.py,sha256=gzGE3eTpsC-CFcNH_g_xQf3M08DcKO3Q0_LnAzKvpFc,2850
55
- ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=rzH0ciyzIOJUqDe7qdNwG1RhXyQqbJa-4h_88R1vTKc,827
54
+ ophyd_async/epics/adpilatus/_pilatus_controller.py,sha256=kpdfTPt2_gmchrMP8S3vwLfr8ixbRRMYkbWeNRRFktU,2852
55
+ ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=EhCj--x4yYy5AtRBG6Ts3A6gsKS6Ut-LaMihAuYDvE0,819
56
56
  ophyd_async/epics/adsimdetector/__init__.py,sha256=EQqxP5DUvZGLxpvSXPagTPy3ROwE-PikyRfcnZfD1KM,281
57
57
  ophyd_async/epics/adsimdetector/_sim.py,sha256=r3SuBENGkOU-8X-i3zDyZljFxf0SmsUfryNPFvP1_os,1147
58
58
  ophyd_async/epics/adsimdetector/_sim_controller.py,sha256=EmoorPTvRomEwfioA9UcrnhYaUBkvtLI2WY3zBLd4ec,476
59
59
  ophyd_async/epics/adsimdetector/_sim_io.py,sha256=TOQcawMtb0ypwUlPcbwGfvp5ZI9jceB9OXm53WBF1_o,233
60
60
  ophyd_async/epics/advimba/__init__.py,sha256=Onoe4N1DgjUZ0-00krm2-iJPXnNF8nPGs6I8pY9wB1g,429
61
61
  ophyd_async/epics/advimba/_vimba.py,sha256=4XlEnsJMGDzHLuYaIDUmaxx0gtOAehn5BKBZMUAzoHQ,1241
62
- ophyd_async/epics/advimba/_vimba_controller.py,sha256=vv133Eqgk9AI_P5Yy8ZUlry7w-ip56QZ2bPaWenspHo,1979
62
+ ophyd_async/epics/advimba/_vimba_controller.py,sha256=v0av2bGnaJ01w9Igksupt2IlkuBEFlAeRCPOVma-Xa4,1980
63
63
  ophyd_async/epics/advimba/_vimba_io.py,sha256=cb2Nfp05fBZAcNVXpz-rqRIRS-TiZW5DPUJOmaFyAw0,1589
64
64
  ophyd_async/epics/core/__init__.py,sha256=8NoQxEEc2Ny_L9nrD2fnGSf_2gJr1wCR1LwUeLNcIJo,588
65
65
  ophyd_async/epics/core/_aioca.py,sha256=HcGYyYUQZmhdUgovf0M9xxL5Ly56ELJDAoRvyRCPq8U,13003
66
66
  ophyd_async/epics/core/_epics_connector.py,sha256=S4z_wbj-aogVcjqCyUgjhcq5Y4gDC7y6wXbsSz2nODY,1918
67
67
  ophyd_async/epics/core/_epics_device.py,sha256=wGdR24I7GSPh3HmM7jsWKZhBZgt4IyLrCn4Ut7Wx_xo,510
68
- ophyd_async/epics/core/_p4p.py,sha256=EqelV3Uc7UO7KJ0Bnj5JoISnGVcrm3Hj3v8aTeVbFCo,16398
69
- ophyd_async/epics/core/_pvi_connector.py,sha256=GSIcul0g6zMEFo_7f6YJCGhekZOm0bJfay_uASw1Hng,5521
68
+ ophyd_async/epics/core/_p4p.py,sha256=uWh3oWPme74G4YfeJ6k8ZlHdKOwcf8Xp1J82b9aa_JI,16407
69
+ ophyd_async/epics/core/_pvi_connector.py,sha256=nAReSiasZA3j_0f8XhuWVO4_ck0MrusnKR9Jg-RT-ok,5584
70
70
  ophyd_async/epics/core/_signal.py,sha256=2Cp5f5Xb2junnVigypjb3hWu4MuMmbrcHOBgPl5Mhv4,5776
71
71
  ophyd_async/epics/core/_util.py,sha256=DcfX4VUTeqLrMhVlt1Q7cvBTuYzHePAA-jdR-OWcxMM,2056
72
72
  ophyd_async/epics/demo/__init__.py,sha256=WR2M3D8dbHcisJW2OIU2ManZu5SWez8ytZEp4jSBfDY,416
@@ -79,29 +79,30 @@ ophyd_async/epics/demo/_stage.py,sha256=KPnwr5EX8f_0xxkNWT-70a0AqB0D9DoiTbxMmy0i
79
79
  ophyd_async/epics/demo/motor.db,sha256=3xb6WTXo4crrvk-M8Y16G9pUidp27vD5vIKKBpLTUlk,1017
80
80
  ophyd_async/epics/demo/point_detector.db,sha256=8kBa3XKpmfXCxetT4tq5_RFXa_XqS1Z2ZNzsa2AtLds,1366
81
81
  ophyd_async/epics/demo/point_detector_channel.db,sha256=FZ9H6HjqplhcF2jgimv_dT1nn-CBlfjs7Y--iCfHp5Y,632
82
- ophyd_async/epics/eiger/__init__.py,sha256=b3Tt4pVLk23Giyj50R4e94d2MxWDDmNHWhWwNq2jlaw,221
83
- ophyd_async/epics/eiger/_eiger.py,sha256=YBEGPHFqAwrA6tvNqn9HlPkN0d7GoXlDcT6vjFhhT5Y,1123
84
- ophyd_async/epics/eiger/_eiger_controller.py,sha256=p_SdYPfSSQvQ3QXZIr7TLOSpPjC-Ce0C7azVOLfZnwY,2544
85
- ophyd_async/epics/eiger/_eiger_io.py,sha256=AorI8ybAMYQqJZG8QoE3wioPode7fwzRWptNzD5Ynfo,1873
86
- ophyd_async/epics/eiger/_odin_io.py,sha256=_KdvMEk-c2jrWYflx2a0k5RLDGal-6SVtlGqG10iQA8,4123
82
+ ophyd_async/epics/eiger/__init__.py,sha256=7kRqVzwoD8PVtp7Nj9iQWlgbLeoWE_8oiq-B0kixwTE,93
83
+ ophyd_async/epics/eiger/_odin_io.py,sha256=g3mknGWSzMYzCggHCYR_nWf72VBlUHMZK5WobNzkZ1U,5568
87
84
  ophyd_async/epics/testing/__init__.py,sha256=aTIv4D2DYrpnGco5RQF8QuLG1SfFkIlTyM2uYEKXltA,522
88
- ophyd_async/epics/testing/_example_ioc.py,sha256=lGPubU3aXP-8N-Y-6xW1ksRqoawKExFFe1l8zMZqmjk,3864
85
+ ophyd_async/epics/testing/_example_ioc.py,sha256=uUmfMXV_Pd2SMFyb0y_4uTc6gkGRUqU1cJ-XQC2ROW8,3915
89
86
  ophyd_async/epics/testing/_utils.py,sha256=6sqJ0BCwubSkK-WOJbmpKNqZKG0AmCoevzaMGaRmuJs,1702
90
- ophyd_async/epics/testing/test_records.db,sha256=hUD9jIzFmN6DgRDGv4-PkeJxCjRjfjvDq5GoTXMz4Zo,3492
87
+ ophyd_async/epics/testing/test_records.db,sha256=SgWQPZgtmc__JiLkH2VPwe5KZOua6ZCIgTLGT_5SDDc,3589
91
88
  ophyd_async/epics/testing/test_records_pva.db,sha256=HJAJSvLtPWG5B5dKv8OZ0_hPJxRFrDoYp6ROcF2lqyA,4202
92
89
  ophyd_async/fastcs/__init__.py,sha256=qlIM9-pjJ8yWfnzTM9-T9cw7zQLKjeeNROQTni5Dr6M,80
93
90
  ophyd_async/fastcs/core.py,sha256=pL_srtTrfuoBHUjDFpxES92owFq9M4Jve0Skk1oeuFA,517
91
+ ophyd_async/fastcs/eiger/__init__.py,sha256=kwYs1PuetEOTeNcFNxtyhTvfbJvWCOu8wtEw3Knotuw,354
92
+ ophyd_async/fastcs/eiger/_eiger.py,sha256=tUjTIhDvnnnNQwMjlfmCTxc6Gbg2xzo1y_wJxCVUSG4,1120
93
+ ophyd_async/fastcs/eiger/_eiger_controller.py,sha256=oeX16Vt4CRtrL87ntGbVtvFFtmCFNCeGOZpfjYDoXX0,2131
94
+ ophyd_async/fastcs/eiger/_eiger_io.py,sha256=8cyhYGRSFdW2zTfUZS82bMucW0HVHZysGkG1pIdZLEc,1195
94
95
  ophyd_async/fastcs/odin/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
95
96
  ophyd_async/fastcs/panda/__init__.py,sha256=ugrScVm4HPQFc-d1kTAfZ5UUzW9T3SPgTi0OD2s8ZH0,1003
96
- ophyd_async/fastcs/panda/_block.py,sha256=YzAxdMsE-kzyz5v47TZHRvCbdbYrSvSrfega53MyX9U,2342
97
+ ophyd_async/fastcs/panda/_block.py,sha256=SM7NaWCRwLz2Pl4wgjZMrDgx3ZLdGPTw6nU0bA-65yA,2394
97
98
  ophyd_async/fastcs/panda/_control.py,sha256=xtW3dH_MLQoycgP-4vJtYx1M9alHjWo13iu9UFTgwzY,1306
98
- ophyd_async/fastcs/panda/_hdf_panda.py,sha256=eDxEO5L3tlmPsH06fe2AluXjbGclTpPTj0CnMcVQceU,1277
99
+ ophyd_async/fastcs/panda/_hdf_panda.py,sha256=tL_OWHxlMQcMZGq9sxHLSeag6hP9MRIbTPn1W0u0iNI,1237
99
100
  ophyd_async/fastcs/panda/_table.py,sha256=maKGoKypEuYqTSVWGgDO6GMEKOtlDm9Dn5YiYdBzu6c,2486
100
101
  ophyd_async/fastcs/panda/_trigger.py,sha256=dy4kYdVIU4T90a2bhD7cdnfGrqMxZ_n0AZxkFI5txfA,3388
101
- ophyd_async/fastcs/panda/_writer.py,sha256=Xh3fNA7wr2tFuqCtnMfAbJT00rziiNypHWDnStGolXg,6143
102
+ ophyd_async/fastcs/panda/_writer.py,sha256=LcCSdEo_65bAQU_OnO_AMQ0aXSjIaWUFdUY9EM2eOI4,6381
102
103
  ophyd_async/plan_stubs/__init__.py,sha256=2ngpkB4wwqlx1dn9JPSHjQdbyWLmY6n-3XVh3RDE8-g,939
103
104
  ophyd_async/plan_stubs/_ensure_connected.py,sha256=YR6VRj7koccJ4x35NV-Ugl4ZbxgAoGN9PjVIjhv0gpw,894
104
- ophyd_async/plan_stubs/_fly.py,sha256=QdodnmBJ0zrUGxcNY7EzLsiPSD8O3Rq9lE9VrWUX5ik,6233
105
+ ophyd_async/plan_stubs/_fly.py,sha256=2xFae3b3bCux_1wmwKIF1tJx1vjg2JJfJ8iQ1aUExAs,6234
105
106
  ophyd_async/plan_stubs/_nd_attributes.py,sha256=kwzyUSeidUH714gaZQtJLxCgDZtmIRyyoKBBRbvqg38,2350
106
107
  ophyd_async/plan_stubs/_panda.py,sha256=5_Mf9kGzNjXpf_YscpCUE8tgq284nOHWCG7o_LNFfII,463
107
108
  ophyd_async/plan_stubs/_settings.py,sha256=e3dGVSUV-Htay_9fKXyQTAQLdjunetGI3OBYp_oC_FY,5574
@@ -109,13 +110,13 @@ ophyd_async/plan_stubs/_utils.py,sha256=zClRo5ve8RGia7wQnby41W-Zprj-slOA5da1LfYn
109
110
  ophyd_async/plan_stubs/_wait_for_awaitable.py,sha256=PGct_dGezKrLhm0W_GD83dwevSccG_vsmj0WSlMNVWc,364
110
111
  ophyd_async/sim/__init__.py,sha256=PzmOQS7suApaZros4h9ec5K6ehFWEjf3qYMvwFGeKsc,749
111
112
  ophyd_async/sim/__main__.py,sha256=mx6natJxnvUBTQXbS4R5OGH_MZVgYiXQkoh3JBJ8NxU,1693
112
- ophyd_async/sim/_blob_detector.py,sha256=4zWsVdn21TM2bHLA-uZRK98t5c2II68fr3Al37apCmc,1082
113
- ophyd_async/sim/_blob_detector_controller.py,sha256=DBPX3Ig0tS1kzu7uOkFzSdmRjsRP-epA7iMZsggaxhw,1787
114
- ophyd_async/sim/_blob_detector_writer.py,sha256=ao6RJ9DM_64HoMOp-vR-BaweKwQstLs3E4_MpRzXXZ4,3623
113
+ ophyd_async/sim/_blob_detector.py,sha256=bJa-G2JF6pPLJx4YIEvFTG07DvQ18ZNSYbtde6qnWPY,1033
114
+ ophyd_async/sim/_blob_detector_controller.py,sha256=y1aSNQJUPnsT2qnj2sk254Mp18anmgQy7ctHlYQZ_B0,1788
115
+ ophyd_async/sim/_blob_detector_writer.py,sha256=4sC3Kkyk4-sSaN7mSKk4A4zDH4IU_qkc1gaqt4QyTAM,3636
115
116
  ophyd_async/sim/_mirror_horizontal.py,sha256=_AfsHxp5V3rYbK-goI0iwPuDDvx1BrNoUQ4smXzqFbc,1452
116
117
  ophyd_async/sim/_mirror_vertical.py,sha256=PyWpyCrW_FCzzGN7Dk0tTB-SKbDIV4GD1fl8AXUJbEI,2029
117
118
  ophyd_async/sim/_motor.py,sha256=-YMANsq4ZvI7nZolrYaTYe44kMoIcvPKCpBbCeC7pxw,10167
118
- ophyd_async/sim/_pattern_generator.py,sha256=QU6Hk3TK0TslrDcITTzcB_UDLVIYQ_a8x4nBGJGx_ig,3652
119
+ ophyd_async/sim/_pattern_generator.py,sha256=FjPEWiBQh_7tYP_8WPhbVXnTGPPOaV6By7Skz7YNIrY,3722
119
120
  ophyd_async/sim/_point_detector.py,sha256=nXgL_1aJZciNBw8Zr2wMYaMbzzAEKXV3yV8FQz2nS_4,2940
120
121
  ophyd_async/sim/_stage.py,sha256=qaeyZbUVL1v2pTHJiZxq-y6BKpA1l_DAKyzAQppQx70,772
121
122
  ophyd_async/tango/__init__.py,sha256=g9xzjlzPpUAP12YI-kYwfAoLSYPAQdL1S11R2c-cius,60
@@ -142,8 +143,8 @@ ophyd_async/testing/_one_of_everything.py,sha256=Di0hPoKwrDOSsx50-2UdSHM2EbIKrPG
142
143
  ophyd_async/testing/_single_derived.py,sha256=5-HOTzgePcZ354NK_ssVpyIbJoJmKyjVQCxSwQXUC-4,2730
143
144
  ophyd_async/testing/_utils.py,sha256=zClRo5ve8RGia7wQnby41W-Zprj-slOA5da1LfYnuhw,45
144
145
  ophyd_async/testing/_wait_for_pending.py,sha256=YZAR48n-CW0GsPey3zFRzMJ4byDAr3HvMIoawjmTrHw,732
145
- ophyd_async-0.10.0a2.dist-info/licenses/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
146
- ophyd_async-0.10.0a2.dist-info/METADATA,sha256=HhNyZ27Piz8QHIz_DzFZnRD_ZJ5oCRRxfEGY5YF9WlU,7075
147
- ophyd_async-0.10.0a2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
148
- ophyd_async-0.10.0a2.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
149
- ophyd_async-0.10.0a2.dist-info/RECORD,,
146
+ ophyd_async-0.10.0a3.dist-info/licenses/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
147
+ ophyd_async-0.10.0a3.dist-info/METADATA,sha256=XnOI_0W1kd8zTWRvAnf0XQr96aAKyxuH6CiSUAqL2TE,7075
148
+ ophyd_async-0.10.0a3.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
149
+ ophyd_async-0.10.0a3.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
150
+ ophyd_async-0.10.0a3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (79.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,42 +0,0 @@
1
- from ophyd_async.core import Device, StrictEnum
2
- from ophyd_async.epics.core import epics_signal_r, epics_signal_rw_rbv, epics_signal_w
3
-
4
-
5
- class EigerTriggerMode(StrictEnum):
6
- INTERNAL = "ints"
7
- EDGE = "exts"
8
- GATE = "exte"
9
-
10
-
11
- class EigerDriverIO(Device):
12
- """Contains signals for handling IO on the Eiger detector."""
13
-
14
- def __init__(self, prefix: str, name: str = "") -> None:
15
- self.bit_depth = epics_signal_r(int, f"{prefix}BitDepthReadout")
16
- self.stale_parameters = epics_signal_r(bool, f"{prefix}StaleParameters")
17
- self.state = epics_signal_r(str, f"{prefix}DetectorState")
18
- self.roi_mode = epics_signal_rw_rbv(str, f"{prefix}RoiMode")
19
-
20
- self.acquire_time = epics_signal_rw_rbv(float, f"{prefix}CountTime")
21
- self.acquire_period = epics_signal_rw_rbv(float, f"{prefix}FrameTime")
22
-
23
- self.num_images = epics_signal_rw_rbv(int, f"{prefix}Nimages")
24
- self.num_triggers = epics_signal_rw_rbv(int, f"{prefix}Ntrigger")
25
-
26
- # TODO: Should be EigerTriggerMode enum, see https://github.com/DiamondLightSource/eiger-fastcs/issues/43
27
- self.trigger_mode = epics_signal_rw_rbv(str, f"{prefix}TriggerMode")
28
-
29
- self.arm = epics_signal_w(int, f"{prefix}Arm")
30
- self.disarm = epics_signal_w(int, f"{prefix}Disarm")
31
- self.abort = epics_signal_w(int, f"{prefix}Abort")
32
-
33
- self.beam_centre_x = epics_signal_rw_rbv(float, f"{prefix}BeamCenterX")
34
- self.beam_centre_y = epics_signal_rw_rbv(float, f"{prefix}BeamCenterY")
35
-
36
- self.det_distance = epics_signal_rw_rbv(float, f"{prefix}DetectorDistance")
37
- self.omega_start = epics_signal_rw_rbv(float, f"{prefix}OmegaStart")
38
- self.omega_increment = epics_signal_rw_rbv(float, f"{prefix}OmegaIncrement")
39
-
40
- self.photon_energy = epics_signal_rw_rbv(float, f"{prefix}PhotonEnergy")
41
-
42
- super().__init__(name)