def parse(self, device_url):
     device = DeviceProxy(device_url)
     result = Documentation()
     result.name = device.info().dev_class
     result.description = device.description()
     # FIXME: perhaps need to query the database about the propertiess
     propertyNames = device.get_property_list('*')
     for propertyName in propertyNames:
         result.addproperty(propertyName, 'TODO description', 'TODO type name', 'TODO default')
     attributeInfos = device.attribute_list_query()
     for attributeInfo in attributeInfos:
         result.addattribute(attributeInfo.name, attributeInfo.description, self.translate(attributeInfo.data_type, attributeInfo.data_format))
     commandInfos = device.command_list_query()
     for commandInfo in commandInfos:
         result.addcommand(
             commandInfo.cmd_name,
             'TODO command description',
             self.translate_command_argument(commandInfo.in_type),
             commandInfo.in_type_desc,
             self.translate_command_argument(commandInfo.out_type),
             commandInfo.out_type_desc)
     return [result]
Ejemplo n.º 2
0
class _DeviceHelper(object):

    __CMD_FILTER = set(("init", "state", "status"))
    __ATTR_FILTER = set(("state", "status"))

    def __init__(self, dev_name, *args, **kwargs):
        self.dev_name = dev_name
        self.device = Device(dev_name, *args, **kwargs)
        self.slots = weakref.WeakKeyDictionary()

    def connect(self, signal, slot, event_type=PyTango.EventType.CHANGE_EVENT):
        i = self.device.subscribe_event(signal, event_type, slot)
        self.slots[slot] = i
        return i

    def disconnect(self, signal, slot):
        i = self.slots.pop(slot)
        self.device.unsubscribe_event(i)

    def get_attr_cache(self, refresh=False):
        try:
            cache = self.__attr_cache
            if not cache:
                refresh = True
        except AttributeError:
            refresh = True
        if refresh:
            cache = {}
            dev = self.device
            try:
                for attr_info in dev.attribute_list_query_ex():
                    attr_name = attr_info.name
                    if attr_name.lower() in self.__ATTR_FILTER:
                        continue
                    cache[attr_name] = attr_info
            except PyTango.DevFailed:
                pass
            self.__attr_cache = cache
        return cache

    def get_attr_info(self, name):
        cache = self.get_attr_cache()
        result = cache.get(name)
        if result:
            return result
        else:
            cache = self.get_attr_cache(refresh=True)
            return cache.get(name)

    def get_cmd_cache(self, refresh=False):
        try:
            cache = self.__cmd_cache
            if not cache:
                refresh = True
        except AttributeError:
            refresh = True
        if refresh:
            cache = {}
            dev = self.device
            try:
                for cmd_info in dev.command_list_query():
                    cmd_name = cmd_info.cmd_name
                    if cmd_name.lower() in self.__CMD_FILTER:
                        continue
                    cmd_func = functools.partial(_command, dev, cmd_info)
                    cmd_func.__name__ = cmd_name
                    cmd_func.__doc__ = cmd_info.in_type_desc
                    cmd_info.func = cmd_func
                    cache[cmd_name] = cmd_info
            except PyTango.DevFailed:
                pass
            self.__cmd_cache = cache
        return cache

    def get_cmd_info(self, name):
        cache = self.get_cmd_cache()
        result = cache.get(name)
        if result:
            return result
        else:
            cache = self.get_cmd_cache(refresh=True)
            return cache.get(name)

    def is_cmd(self, name):
        return name.lower() in self.get_cmd_cache()

    def members(self):
        result = self.get_attr_cache().keys()
        result.extend(self.get_cmd_cache().keys())
        return result

    def get(self, name):
        dev = self.device
        result = self.get_attr_info(name)
        if result:
            result = dev.read_attribute(name)
            value = result.value
            if result.type == PyTango.DevEncoded:
                result = loads(*value)
            else:
                result = value
            return result
        result = self.get_cmd_info(name)
        if result is None:
            raise KeyError("Unknown %s" % name)
        return result

    def set(self, name, value):
        result = self.get_attr_info(name)
        if result is None:
            raise KeyError("Unknown attribute %s" % name)
        if result.data_type == PyTango.DevEncoded:
            self.device.write_attribute(name, dumps(value))
        else:
            self.device.write_attribute(name, value)

    def get_info(self):
        try:
            return self.__info
        except AttributeError:
            pass
        try:
            info = self.device.info()
            self.__dict__["__info"] = info
            return info
        except PyTango.DevFailed:
            return None

    def __str__(self):
        return self.dstr()

    def __repr__(self):
        return str(self)

    def dstr(self):
        info = self.get_info()
        klass = "Device"
        if info:
            klass = info.dev_class
        return "{0}({1})".format(klass, self.dev_name)
Ejemplo n.º 3
0
 def __init__(self, connector=None, uri=None, updateInterval = 0.02):
     Motor.__init__(self)
     self.uri = uri
     self.type = "Simulation"
     attributes = {}
     attributes["AerotechEnsemble"] = [ \
             {"attr": "Position", "delta": 0.1},
             {"attr": "Velocity"},
             {"attr": "Acceleration"},
             {"attr": "SoftLimitCcw", "name": "soft_limit_min"},
             {"attr": "SoftLimitCw", "name": "soft_limit_max"},
             {"attr": "CcwSoftLimitFault", "name": "soft_limit_min_fault"},
             {"attr": "CwSoftLimitFault", "name": "soft_limit_max_fault"},
             {"attr": "CcwLimitFault", "name": "hard_limit_min_fault"},
             {"attr": "CwLimitFault", "name": "hard_limit_max_fault"},
             {"attr": "AbortMove", "name": "stop", "mode": "execute"},
             {"attr": "Calibrate", "mode": "execute"},
     ]
     attributes["GalilDMCMotor"] = [ \
             {"attr": "Position", "delta": 0.1},
             {"attr": "Velocity"},
             {"attr": "Acceleration"},
             {"attr": "SoftCcwLimit", "name": "soft_limit_min"},
             {"attr": "SoftCwLimit", "name": "soft_limit_max"},
             {"attr": "SoftCcwLimitFault", "name": "soft_limit_min_fault"},
             {"attr": "SoftCwLimitFault", "name": "soft_limit_max_fault"},
             {"attr": "Stop", "name": "stop", "mode": "execute"},
             {"attr": "Calibrate", "mode": "execute"},
     ]
     attributes["OmsMaxV"] = [ \
             {"attr": "Position", "delta": 0.1},
             {"attr": "VelocityUnits", "name": "velocity"},
             {"attr": "AccelerationUnits"},
             {"attr": "SoftLimitMinUnits", "name": "soft_limit_min"},
             {"attr": "SoftLimitMaxUnits", "name": "soft_limit_max"},
             {"attr": "FlagCcwLimit", "name": "hard_limit_min_fault"},
             {"attr": "FlagCwLimit", "name": "hard_limit_max_fault"},
             {"attr": "AbortMove", "name": "stop", "mode": "execute"},
             {"attr": "Calibrate", "mode": "execute"},
             {"attr": "PIDactive", "name": "pid_active"},
     ]
     attributes["OmsVme58"] = [ \
             {"attr": "Position"},
             {"attr": "SlewRate", "name": "velocity"},
             {"attr": "Acceleration"},
             {"attr": "UnitLimitMin", "name": "soft_limit_min"},
             {"attr": "UnitLimitMax", "name": "soft_limit_max"},
             {"attr": "CcwLimit", "name": "hard_limit_min_fault"},
             {"attr": "CwLimit", "name": "hard_limit_max_fault"},
             {"attr": "StopMove", "name": "stop", "mode": "execute"},
             {"attr": "Calibrate", "mode": "execute"},
             {"attr": "Conversion"},
     ]
     attributes["PowerPMAC_Motor"] = [ \
             {"attr": "Position", "delta": 0.1},
             {"attr": "Velocity"},
             {"attr": "Acceleration"},
             {"attr": "SoftCcwLimit", "name": "soft_limit_min"},
             {"attr": "SoftCwLimit", "name": "soft_limit_max"},
             {"attr": "SoftCcwLimitFault", "name": "soft_limit_min_fault"},
             {"attr": "SoftCwLimitFault", "name": "soft_limit_max_fault"},
             {"attr": "CcwLimitFault", "name": "hard_limit_min_fault"},
             {"attr": "CwLimitFault", "name": "hard_limit_max_fault"},
             {"attr": "Stop", "name": "stop", "mode": "execute"},
             {"attr": "Calibrate", "mode": "execute"},
     ]
     attributes["Simulation"] = [ \
             {"attr": "Position"},
             {"attr": "Velocity"},
             {"attr": "Acceleration"},
             {"attr": "Soft_Limit_Min"},
             {"attr": "Soft_Limit_Max"},
             {"attr": "Stop", "mode": "execute"},
             {"attr": "Calibrate", "mode": "execute"},
     ]
     self.connector = None
     if connector == "tango":
         try:
             proxy = DeviceProxy(uri)
             type = proxy.info().dev_class
             self.type = type
             if self.type == "GalilDMCMotor" and "CwLimitFault" in \
                     proxy.get_attribute_list():
                 attributes["GalilDMCMotor"].append(
                         {"attr": "CcwLimitFault", "name": "hard_limit_min_fault"},
                         {"attr": "CwLimitFault", "name": "hard_limit_max_fault"},
                     )
         except Exception as e:
             self.janus.utils["logger"].error(
                 "TangoMotor({}).__init__() connection failed".format(self.uri))
             self.janus.utils["logger"].debug("", exc_info=True)
         if self.type in attributes:
             self.connector = TangoConnector(uri, attributes[self.type], interval=updateInterval)
     if connector == "simulation" or self.connector is None:
         self.connector = SimulationConnector(uri, attributes["Simulation"])
         self.connector.write("state", State.ON)
         if connector != "simulation":
             self.connector.write("state", State.UNKNOWN)
         self.connector.write("position", 0)
         self.connector.write("velocity", 1000)
         self.connector.write("acceleration", 1000)
         self.connector.write("soft_limit_min", 0)
         self.connector.write("soft_limit_max", 0)
     self.last_soft_limit_min_fault = \
             self.soft_limit_min_fault(refresh=True)
     self.last_soft_limit_max_fault = \
             self.soft_limit_max_fault(refresh=True)
     self.last_state = self.connector.read("state", refresh=True)
     if self.type in ["OmsMaxV", "OmsVme58", "Simulation"]:
         self.connector.value_changed.connect(self.on_value_changed)
     else:
         self.connector.value_changed.connect(self.value_changed.emit)
Ejemplo n.º 4
0
class _DeviceHelper(object):

    __CMD_FILTER = set(("init", "state", "status"))
    __ATTR_FILTER = set(("state", "status"))

    def __init__(self, dev_name, *args, **kwargs):
        self.dev_name = dev_name
        self.device = Device(dev_name, *args, **kwargs)
        self.slots = weakref.WeakKeyDictionary()

    def connect(self, signal, slot, event_type=PyTango.EventType.CHANGE_EVENT):
        i = self.device.subscribe_event(signal, event_type, slot)
        self.slots[slot] = i
        return i

    def disconnect(self, signal, slot):
        i = self.slots.pop(slot)
        self.device.unsubscribe_event(i)

    def get_attr_cache(self, refresh=False):
        try:
            cache = self.__attr_cache
            if not cache:
                refresh = True
        except AttributeError:
            refresh = True
        if refresh:
            cache = {}
            dev = self.device
            try:
                for attr_info in dev.attribute_list_query_ex():
                    attr_name = attr_info.name
                    if attr_name.lower() in self.__ATTR_FILTER:
                        continue
                    cache[attr_name] = attr_info
            except PyTango.DevFailed:
                pass
            self.__attr_cache = cache
        return cache

    def get_attr_info(self, name):
        cache = self.get_attr_cache()
        result = cache.get(name)
        if result:
            return result
        else:
            cache = self.get_attr_cache(refresh=True)
            return cache.get(name)

    def get_cmd_cache(self, refresh=False):
        try:
            cache = self.__cmd_cache
            if not cache:
                refresh = True
        except AttributeError:
            refresh = True
        if refresh:
            cache = {}
            dev = self.device
            try:
                for cmd_info in dev.command_list_query():
                    cmd_name = cmd_info.cmd_name
                    if cmd_name.lower() in self.__CMD_FILTER:
                        continue
                    cmd_func = functools.partial(_command, dev, cmd_info)
                    cmd_func.__name__ = cmd_name
                    cmd_func.__doc__ = cmd_info.in_type_desc
                    cmd_info.func = cmd_func
                    cache[cmd_name] = cmd_info
            except PyTango.DevFailed:
                pass
            self.__cmd_cache = cache
        return cache

    def get_cmd_info(self, name):
        cache = self.get_cmd_cache()
        result = cache.get(name)
        if result:
            return result
        else:
            cache = self.get_cmd_cache(refresh=True)
            return cache.get(name)

    def is_cmd(self, name):
        return name.lower() in self.get_cmd_cache()

    def members(self):
        result = self.get_attr_cache().keys()
        result.extend(self.get_cmd_cache().keys())
        return result

    def get(self, name):
        dev = self.device
        result = self.get_attr_info(name)
        if result:
            result = dev.read_attribute(name)
            value = result.value
            if result.type == PyTango.DevEncoded:
                result = loads(*value)
            else:
                result = value
            return result
        result = self.get_cmd_info(name)
        if result is None:
            raise KeyError("Unknown %s" % name)
        return result

    def set(self, name, value):
        result = self.get_attr_info(name)
        if result is None:
            raise KeyError("Unknown attribute %s" % name)
        if result.data_type == PyTango.DevEncoded:
            self.device.write_attribute(name, dumps(value))
        else:
            self.device.write_attribute(name, value)

    def get_info(self):
        try:
            return self.__info
        except AttributeError:
            pass
        try:
            info = self.device.info()
            self.__dict__["__info"] = info
            return info
        except PyTango.DevFailed:
            return None

    def __str__(self):
        return self.dstr()

    def __repr__(self):
        return str(self)

    def dstr(self):
        info = self.get_info()
        klass = "Device"
        if info:
            klass = info.dev_class
        return "{0}({1})".format(klass, self.dev_name)