diff --git a/src/ophyd_async/epics/core/_aioca.py b/src/ophyd_async/epics/core/_aioca.py index 3dccc76b25..d23eef249f 100644 --- a/src/ophyd_async/epics/core/_aioca.py +++ b/src/ophyd_async/epics/core/_aioca.py @@ -294,8 +294,17 @@ async def connect(self, timeout: float): self.converter = make_converter(self.datatype, self.initial_values) async def _caget(self, pv: str, format: Format) -> AugmentedValue: + # Target: avoid breaking backwards compatability + # perhaps overcautious on how to define element count + # aioca.caget documentation states that element_count=1 + # by default. If this is provided values do change + # Todo: + # need to check what pvaccess and p4p provide + kws = dict() + if self.options.element_count is not None: + kws["count"] = self.options.element_count return await caget( - pv, datatype=self.converter.read_dbr, format=format, timeout=None + pv, datatype=self.converter.read_dbr, format=format, timeout=None, **kws ) def _make_reading(self, value: AugmentedValue) -> Reading[SignalDatatypeT]: diff --git a/src/ophyd_async/epics/core/_signal.py b/src/ophyd_async/epics/core/_signal.py index 92b253fa0a..a263c90bb7 100644 --- a/src/ophyd_async/epics/core/_signal.py +++ b/src/ophyd_async/epics/core/_signal.py @@ -155,6 +155,7 @@ def epics_signal_r( read_pv: str, name: str = "", timeout: float = DEFAULT_TIMEOUT, + element_count: int | None = None ) -> SignalR[SignalDatatypeT]: """Create a `SignalR` backed by 1 EPICS PV. @@ -163,7 +164,9 @@ def epics_signal_r( :param name: The name of the signal (defaults to empty string) :param timeout: A timeout to be used when reading (not connecting) this signal """ - backend = _epics_signal_backend(datatype, read_pv, read_pv) + backend = _epics_signal_backend( + datatype, read_pv, read_pv, options=EpicsOptions(element_count=element_count) + ) return SignalR(backend, name=name, timeout=timeout) diff --git a/src/ophyd_async/epics/core/_util.py b/src/ophyd_async/epics/core/_util.py index 4376307f01..d2bd37f316 100644 --- a/src/ophyd_async/epics/core/_util.py +++ b/src/ophyd_async/epics/core/_util.py @@ -38,6 +38,15 @@ class EpicsOptions(Generic[SignalDatatypeT]): as it causes a deadlock. """ + element_count: None | int = None + """Epics allows to specify the maximum number of elements to transfer + + Fast devices provide buffers that acquire large data sets. Typically + one only needs the beginning of this buffer. + + None is used as standard argument: transfer as many elements as provided + """ + def get_pv_basename_and_field(pv: str) -> tuple[str, str | None]: """Split PV into record name and field."""