Source code for mxcubecore.utils.tango

from tango import DevFailed

from mxcubecore.BaseHardwareObjects import HardwareObject
from mxcubecore.Command.Tango import TangoChannel


[docs]class TangoAttributeReadError(Exception): def __init__(self, attribute_name: str): super().__init__() self.attribute_name = attribute_name
[docs]def add_attribute_channel( hwo: HardwareObject, tango_device: str, attribute_name: str, polling: int | None = None, update_callback=None, ) -> TangoChannel: """Utility function to add Tango attribute Channel to a hardware object. This function adds a Channel object to specified hardware object and checks that it's possible to read the specified tango attribute. If there is errors reading the attribute, the TangoAttributeReadError exception is raised. Parameters: hwo: The hardware object where to add the Channel object. tango_device: Tango device name. attribute_name: The tango attribute name. polling: Attribute polling periodicity. update_callback: Optional callback, if provided it is connected to "update" signal of Channel object """ channel = hwo.add_channel( { "type": "tango", "tangoname": tango_device, "name": attribute_name, "polling": polling, }, attribute_name, ) if not channel.is_connected(): raise TangoAttributeReadError(attribute_name) # # check if it's possible to read the Attribute # try: val = channel.get_value() except DevFailed: raise TangoAttributeReadError(attribute_name) from None # # add "update" callback # if update_callback is not None: channel.connect_signal("update", update_callback) # # We have 'consumed' the initial value of this channel above, # when we were testing if it's readable. The standard polling # will not invoke the callback with that value now. # Make sure initial value is passed to the callback. # update_callback(val) return channel