Source code for apstools.devices.dict_device_support

"""
DictionaryDevice
+++++++++++++++++++++++++++++++++++++++

Create an ophyd Device defined by a dictionary so
that a simple dictionary can be recorded in a bluesky data stream.

.. autosummary::

    ~dict_device_factory
    ~make_dict_device
"""

import time

from ophyd import Component
from ophyd import Device
from ophyd import Signal


[docs]def dict_device_factory(data={}): """ Create a DictionaryDevice class using the supplied dictionary. """ component_dict = {k: Component(Signal, value=v) for k, v in data.items()} fc = type("DictionaryDevice", (Device,), component_dict) return fc
[docs]def make_dict_device(obj, name="ddev"): """ Make recordable DictionaryDevice instance from dictionary. New in release 1.6.4. """ def standardize(obj): """Make obj look like .read()""" d_new = {} ts = time.time() # new timestamps will be the same for k, v in obj.items(): # fmt: off # Same structure as from Signal.read()? if ( isinstance(v, dict) and sorted(list(v.keys())) == sorted("value timestamp".split()) ): # looks like v is from .read(), accept it d_new[k] = v else: # Make it look like .read() d_new[k] = dict(value=v, timestamp=ts) # fmt: on return d_new obj = standardize(obj) kv = {k: v["value"] for k, v in obj.items()} ddev = dict_device_factory(kv)("", name=name) # set the timestamps to what was read for k, v in obj.items(): getattr(ddev, k)._metadata["timestamp"] = v["timestamp"] return ddev
# ----------------------------------------------------------------------------- # :author: Pete R. Jemian # :email: jemian@anl.gov # :copyright: (c) 2017-2024, UChicago Argonne, LLC # # Distributed under the terms of the Argonne National Laboratory Open Source License. # # The full license is in the file LICENSE.txt, distributed with this software. # -----------------------------------------------------------------------------