3. Add device factory decorator with lazy connect support#
Date: 2024-04-26
Status#
Accepted
Context#
Device instances should be capable of being created without necessarily connecting, so long as they are connected prior to being utilised to collect data. The current method puts requirements on the init method of device classes, and does not expose all options for connecting to ophyd-async devices.
Decision#
DAQ members led us to this proposal:
ophyd-async: make Device.connect(mock, timeout, force=False) idempotent
ophyd-async: make ensure_connected(*devices) plan stub
dodal: make device_factory() decorator that may construct, name, cache and connect a device
dodal: collect_factories() returns all device factories
blueapi: call collect_factories(), instantiate and connect Devices appropriately, log those that fail
blueapi: when plan is called, run ensure_connected on all plan args and defaults that are Devices
We can then iterate on this if the parallel connect causes a broadcast storm. We could also in future add a monitor to a heartbeat PV per device in Device.connect so that it would reconnect next time it was called.
Consequences#
Beamlines will be converted to use the decorator, and default arguments to plans should be replaced with a non-eagerly connecting call to the initializer controlling device.