Example #1
0
 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)
Example #2
0
 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
Example #3
0
 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)
Example #4
0
 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
Example #5
0
    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)
Example #6
0
 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
Example #7
0
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)