def __init__(self, prefix, desc): if isinstance(desc, str): desc = {'dev': desc} else: desc = desc._options if 'dev' in desc: dev = desc.pop('dev') if 'name' not in desc: desc['name'] = dev dev, indices, _scale, _offset = extractKeyAndIndex( dev, False, normalize=lambda s: s.lower()) if indices: desc['item'] = indices desc['key'] = prefix + dev + '/value' desc['statuskey'] = prefix + dev + '/status' desc['fixedkey'] = prefix + dev + '/fixed' if 'unit' not in desc: desc['unitkey'] = prefix + dev + '/unit' if 'format' not in desc: desc['formatkey'] = prefix + dev + '/fmtstr' elif 'key' in desc: key, indices, _scale, _offset = extractKeyAndIndex( desc['key'], False) if indices: desc['item'] = indices if 'name' not in desc: desc['name'] = desc['key'] desc['key'] = prefix + key for kn in ('statuskey', 'fixedkey', 'unitkey', 'formatkey'): if kn in desc: desc[kn] = (prefix + desc[kn]).lower().replace('.', '/') self.__dict__.update(desc)
def registerKey(self, valuekey, statuskey='', unit='', fmtstr=''): valuekey, valueindex, _scale, _offset = extractKeyAndIndex( valuekey, False) self.devinfo[valuekey] = self._newDevinfo(valueindex, unit, fmtstr, False) self._devmap[self._source.register(self, valuekey)] = valuekey if statuskey: self._devmap[self._source.register(self, statuskey)] = valuekey
def registerKeys(self): for key, name in zip_longest(self.props['devices'], self.props['names']): if name is None: name = key key, index, scale, offset = extractKeyAndIndex(key) keyid = self._source.register(self, key) self.keyindices.setdefault(keyid, []).append(index) self.addcurve(keyid, index, name, scale, offset)
def registerDevice(self, dev, unit='', fmtstr=''): dev, valueindex, _scale, _offset = extractKeyAndIndex( dev, False, normalize=lambda s: s.lower()) self.devinfo[dev] = self._newDevinfo(valueindex, unit, fmtstr, True) self._devmap[self._source.register(self, dev + '/value')] = dev self._devmap[self._source.register(self, dev + '/status')] = dev self._devmap[self._source.register(self, dev + '/fixed')] = dev if not unit: self._devmap[self._source.register(self, dev + '/unit')] = dev if not fmtstr: self._devmap[self._source.register(self, dev + '/fmtstr')] = dev
def _syncDeviceTree(self): # restore selection from entries in textbox if not self.devices.text(): return tree = self.deviceTree tree.itemChanged.disconnect(self.on_deviceTree_itemChanged) keys_indices = [ extractKeyAndIndex(d.strip()) for d in self.devices.text().split(',') ] for key, indices, scale, offset in keys_indices: dev, _, param = key.partition('/') for i in range(tree.topLevelItemCount()): if tree.topLevelItem(i).text(0).lower() == dev: devitem = tree.topLevelItem(i) break else: continue if param == 'value': item = devitem newkey = devitem.text(0) else: if not devitem.childCount(): tree.on_itemExpanded(devitem) for i in range(devitem.childCount()): if devitem.child(i).text(0).lower() == param: item = devitem.child(i) item.parent().setExpanded(True) break else: continue newkey = devitem.text(0) + '.' + item.text(0) suffix = ''.join('[%s]' % i for i in indices) if scale != 1: suffix += '*%.4g' % scale if offset != 0: suffix += '%+.4g' % offset item.setCheckState(0, Qt.Checked) item.setText(1, ','.join(map(str, indices))) item.setText(2, '%.4g' % scale) item.setText(3, '%.4g' % offset) self.deviceTreeSel[newkey] = suffix tree.itemChanged.connect(self.on_deviceTree_itemChanged)
def _createViewFromDialog(self, info, row=None): if not info['devices'].strip(): return keys_indices = [ extractKeyAndIndex(d.strip()) for d in info['devices'].split(',') ] if self.client is not None: meta = self._getMetainfo(keys_indices) else: meta = ({}, {}) name = info['name'] if not name: name = info['devices'] if info['simpleTime']: name += ' (%s)' % info['simpleTimeSpec'] window = None if info['simpleTime']: try: itime, _ = get_time_and_interval(info['simpleTimeSpec']) except ValueError: return fromtime = currenttime() - itime totime = None if info['slidingWindow']: window = itime else: if info['frombox']: fromtime = mktime(localtime(info['fromdate'])) else: fromtime = None if info['tobox']: totime = mktime(localtime(info['todate'])) else: totime = None try: interval = float(info['interval']) except ValueError: interval = 5.0 if info['customY']: try: yfrom = float(info['customYFrom']) except ValueError: return try: yto = float(info['customYTo']) except ValueError: return else: yfrom = yto = None view = View(self, name, keys_indices, interval, fromtime, totime, yfrom, yto, window, meta, info, self.gethistory_callback) self.views.append(view) view.listitem = QListWidgetItem(view.name) if row is not None: self.viewList.insertItem(row, view.listitem) else: self.viewList.addItem(view.listitem) self.openView(view) if view.totime is None: for key in view.uniq_keys: self.keyviews.setdefault(key, []).append(view) return view
def test_extract_key_and_index(): assert extractKeyAndIndex('dev') == ('dev/value', (), 1, 0) assert extractKeyAndIndex('dev.key') == ('dev/key', (), 1, 0) assert extractKeyAndIndex('dev.key[0]') == ('dev/key', (0, ), 1, 0) assert extractKeyAndIndex('dev.key[0][1]') == ('dev/key', (0, 1), 1, 0) assert extractKeyAndIndex('dev[0][1]') == ('dev/value', (0, 1), 1, 0) assert extractKeyAndIndex('dev[0,1]') == ('dev[0,1]', (), 1, 0) assert extractKeyAndIndex('dev.key[0][ 1]') == ('dev/key', (0, 1), 1, 0) assert extractKeyAndIndex('dev.key[ 0][ 1]') == ('dev/key', (0, 1), 1, 0) assert extractKeyAndIndex('dev.key[ 0 ][ 1]') == ('dev/key', (0, 1), 1, 0) assert extractKeyAndIndex('dev.key[ 0 ][ 1 ]') == ('dev/key', (0, 1), 1, 0) assert extractKeyAndIndex('dev.key[10 ][ 1]') == ('dev/key', (10, 1), 1, 0) assert extractKeyAndIndex('dev.key[0') == ('dev/key[0', (), 1, 0) assert extractKeyAndIndex('dev.key0]') == ('dev/key0]', (), 1, 0) assert extractKeyAndIndex('dev.key*10') == ('dev/key', (), 10, 0) assert extractKeyAndIndex('dev.key*-10') == ('dev/key', (), -10, 0) assert extractKeyAndIndex('dev.key * -1') == ('dev/key', (), -1, 0) assert extractKeyAndIndex('dev.key +5') == ('dev/key', (), 1, 5) assert extractKeyAndIndex('dev.key- 5') == ('dev/key', (), 1, -5) assert extractKeyAndIndex('dev.key*10 -5') == ('dev/key', (), 10, -5) assert extractKeyAndIndex('dev.key[0] * 10+5') == ('dev/key', (0, ), 10, 5) assert extractKeyAndIndex('dev*1.2e1 +5e-2') == ('dev/value', (), 12, 0.05) assert extractKeyAndIndex('dev*1e+1+5e1') == ('dev/value', (), 10, 50)