Esempio n. 1
0
    def __init__(self, name, parent, **kwargs):
        self.__enable_polling = False
        self.call__init__(TaurusAttribute, name, parent)
        self.parent = parent
        self._validator = TangoArchivingAttributeNameValidator()
        groups = self._validator.getUriGroups(name)
        self._start_date = None
        self._end_date = None
        self._return_timestamps = False
        arch_label = "(archiving)"

        self._query = groups.get('query', None)
        if self._query is not None:
            for query_elem in self._query.split(';'):
                if 't0=' in query_elem:
                    self._start_date = query_elem[3:]
                if 't1=' in query_elem:
                    self._end_date = query_elem[3:]
                    if self._end_date == 'now':
                        self._end_date = time.time()
                if 'ts' in query_elem:
                    self._return_timestamps = True
                    arch_label = "(archiving ts)"

        self._arch_values = TaurusAttrValue()
        self._arch_timestamps = TaurusAttrValue()
        # set the label
        self._tg_attr_name = groups.get('attrname')
        self._label = "{} {}".format(self._tg_attr_name, arch_label)
Esempio n. 2
0
 def decode(self, event_value):
     if isinstance(event_value, int):  # TaurusSWDevState
         new_sw_state = event_value
     else:
         self.info("Unexpected value to decode: %s" % str(event_value))
         new_sw_state = TaurusDevState.NotReady
     value = TaurusAttrValue()
     value.rvalue = new_sw_state
     return value
Esempio n. 3
0
 def decode(self, event_value):
     # TODO: Is this method ever called? (or maybe just garbage from 3.x?)
     if isinstance(event_value, int):  # TaurusSWDevState
         new_sw_state = event_value
     else:
         self.info("Unexpected value to decode: %s" % str(event_value))
         new_sw_state = TaurusDevState.NotReady
     value = TaurusAttrValue()
     value.rvalue = new_sw_state
     return value
Esempio n. 4
0
    def decode(self, pv):
        """Decodes an epics PV object into a TaurusValue, and also updates other
         properties of the Attribute object
        """
        attr_value = TaurusAttrValue()
        if not pv.connected:
            attr_value.error = ChannelAccessException('PV "%s" not connected' %
                                                      pv.pvname)
            return attr_value
        v = pv.value
        # type
        try:
            self.type = Dbr2TaurusType[pv.ftype]
        except KeyError:
            raise ValueError('Unsupported epics type "%s"' % pv.type)
        # writable
        self.writable = pv.write_access
        # data_format
        if numpy.isscalar(v):
            self.data_format = DataFormat._0D
        else:
            self.data_format = DataFormat(len(numpy.shape(v)))
        # units and limits support
        if self.type in (DataType.Integer, DataType.Float):
            v = Quantity(v, pv.units)
            self._range = self.__decode_limit(pv.lower_ctrl_limit,
                                              pv.upper_ctrl_limit)
            self._alarm = self.__decode_limit(pv.lower_alarm_limit,
                                              pv.upper_alarm_limit)
            self._warning = self.__decode_limit(pv.lower_warning_limit,
                                                pv.upper_warning_limit)

        # rvalue
        attr_value.rvalue = v
        # wvalue
        if pv.write_access:
            attr_value.wvalue = v
        # time
        if pv.timestamp is None:
            attr_value.time = TaurusTimeVal.now()
        else:
            attr_value.time = TaurusTimeVal.fromtimestamp(pv.timestamp)
        # quality
        if pv.severity > 0:
            attr_value.quality = AttrQuality.ATTR_ALARM
        else:
            attr_value.quality = AttrQuality.ATTR_VALID
        return attr_value
 def read(self, cache=True):
     if cache and self._last_value is not None:
         return self._last_value
     dev = self.getParentObj()
     # each time we need to open and close the file, otherwise the
     # file content is not updated
     with h5py.File(dev.filename) as h5file:
         data = h5file.get(self._attr_name)
         if data is None:
             msg = "Object %s does not exist" % self._attr_name
             raise TaurusException(msg)
         # we need to decode and copy the data while the file is still opened
         rvalue = self.decode(data)
     value = TaurusAttrValue()
     value.rvalue = rvalue
     value.time = TaurusTimeVal.now()
     self._last_value = value
     return value
Esempio n. 6
0
    def read(self, cache=True):
        """Returns the value of the attribute.

        :param cache: (bool) If True (default), the last calculated value will
                      be returned. If False, the referenced values will be re-
                      read.
        :return: TaurusAttrValue
        """
        if cache and self._last_value is not None:
            return self._last_value

        dev = self.getParentObj()
        self.handler.setFilename(dev.filename)

        data_frame = self.handler.parseAttrName(self._attr_name)

        value = TaurusAttrValue()
        value.rvalue = self.decode(data_frame)
        value.time = TaurusTimeVal.now()
        self._last_value = value

        return value