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)
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
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
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
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