예제 #1
0
    def __init__(self, ins):
        gtk.Frame.__init__(self)

        self.set_label(_L('Bookmarks'))

        self._add_button = gtk.Button(_L('Add'))
        self._add_button.connect('clicked', self._add_clicked_cb)

        self._goxy_button = gtk.Button(_L('Goto XY'))
        self._goxy_button.connect('clicked', self._go_clicked_cb, 2)

        self._goxyz_button = gtk.Button(_L('Goto XYZ'))
        self._goxyz_button.connect('clicked', self._go_clicked_cb, 3)

        self._remove_button = gtk.Button(_L('Remove'))
        self._remove_button.connect('clicked', self._remove_clicked_cb)

        self._bookmark_data = {}
        self._tree_model = gtk.ListStore(str, str)
        self._tree_view = QTTable([
            ('Label', {}),
            ('Position', {})
            ], self._tree_model)

        self._config = qt.config
        self._load_bookmarks()

        self._label_entry = gtk.Entry()

        self.set_instrument(ins)

        vbox = pack_vbox([
                pack_hbox([
                    gtk.Label(_L('Label')),
                    self._label_entry], True, False),
                pack_hbox([
                    self._add_button,
                    self._goxy_button,
                    self._goxyz_button,
                    self._remove_button], True, True),
                self._tree_view
                ], False, False)
        vbox.set_border_width(4)

        self.add(vbox)
예제 #2
0
    def __init__(self, ins):
        gtk.Frame.__init__(self)

        self.set_label(_L('Bookmarks'))

        self._add_button = gtk.Button(_L('Add'))
        self._add_button.connect('clicked', self._add_clicked_cb)

        self._goxy_button = gtk.Button(_L('Goto XY'))
        self._goxy_button.connect('clicked', self._go_clicked_cb, 2)

        self._goxyz_button = gtk.Button(_L('Goto XYZ'))
        self._goxyz_button.connect('clicked', self._go_clicked_cb, 3)

        self._remove_button = gtk.Button(_L('Remove'))
        self._remove_button.connect('clicked', self._remove_clicked_cb)

        self._bookmark_data = {}
        self._tree_model = gtk.ListStore(str, str)
        self._tree_view = QTTable([
            ('Label', {}),
            ('Position', {})
            ], self._tree_model)

        self._config = qt.config
        self._load_bookmarks()

        self._label_entry = gtk.Entry()

        self.set_instrument(ins)

        vbox = pack_vbox([
                pack_hbox([
                    gtk.Label(_L('Label')),
                    self._label_entry], True, False),
                pack_hbox([
                    self._add_button,
                    self._goxy_button,
                    self._goxyz_button,
                    self._remove_button], True, True),
                self._tree_view
                ], False, False)
        vbox.set_border_width(4)

        self.add(vbox)
예제 #3
0
class PositionBookmarks(gtk.Frame):

    __gsignals__ = {
        'go-request': (gobject.SIGNAL_RUN_FIRST,
                        gobject.TYPE_NONE,
                        ([gobject.TYPE_PYOBJECT])),
    }

    def __init__(self, ins):
        gtk.Frame.__init__(self)

        self.set_label(_L('Bookmarks'))

        self._add_button = gtk.Button(_L('Add'))
        self._add_button.connect('clicked', self._add_clicked_cb)

        self._goxy_button = gtk.Button(_L('Goto XY'))
        self._goxy_button.connect('clicked', self._go_clicked_cb, 2)

        self._goxyz_button = gtk.Button(_L('Goto XYZ'))
        self._goxyz_button.connect('clicked', self._go_clicked_cb, 3)

        self._remove_button = gtk.Button(_L('Remove'))
        self._remove_button.connect('clicked', self._remove_clicked_cb)

        self._bookmark_data = {}
        self._tree_model = gtk.ListStore(str, str)
        self._tree_view = QTTable([
            ('Label', {}),
            ('Position', {})
            ], self._tree_model)

        self._config = qt.config
        self._load_bookmarks()

        self._label_entry = gtk.Entry()

        self.set_instrument(ins)

        vbox = pack_vbox([
                pack_hbox([
                    gtk.Label(_L('Label')),
                    self._label_entry], True, False),
                pack_hbox([
                    self._add_button,
                    self._goxy_button,
                    self._goxyz_button,
                    self._remove_button], True, True),
                self._tree_view
                ], False, False)
        vbox.set_border_width(4)

        self.add(vbox)

    def set_instrument(self, ins):
        self._ins = ins

        bval = False
        if ins is not None:
            bval = True
        self._add_button.set_sensitive(bval)

        bval = False
        if ins is not None and ins.get_channels() > 1:
            bval = True
        self._goxy_button.set_sensitive(bval)

        bval = False
        if ins is not None and ins.get_channels() > 2:
            bval = True
        self._goxyz_button.set_sensitive(bval)

    def _add_clicked_cb(self, widget):
        pos = self._ins.get_position()
        posstr = self._ins.format_parameter_value('position', pos)
        label = self._label_entry.get_text()

        index = "%s%s" % (label, posstr)
        if index in self._bookmark_data:
            return

        self._tree_model.append((label, posstr))
        self._bookmark_data[index] = pos

        self._save_bookmarks()

    def _remove_clicked_cb(self, widget):
        (model, rows) = self._tree_view.get_selection().get_selected_rows()
        for row in rows:
            it = model.get_iter(row)
            rowdata = model.get(it, 0, 1)
            index = "%s%s" % (rowdata[0], rowdata[1])
            if index in self._bookmark_data:
                del self._bookmark_data[index]
            model.remove(it)

        self._save_bookmarks()

    def _go_clicked_cb(self, widget, nchannels):
        (model, rows) = self._tree_view.get_selection().get_selected_rows()
        if len(rows) != 1:
            logging.warning('Select 1 row only!')

        row = rows[0]
        it = model.get_iter(row)
        label = model.get_value(it, 0)
        posstr = model.get_value(it, 1)
        index = "%s%s" % (label, posstr)
        pos = self._bookmark_data[index]

        pos = pos[:nchannels]
        self.emit('go-request', pos)

    def _load_bookmarks(self):
        for row in self._config.get('positioner_bookmarks', []):
            it = self._tree_model.append(row[:2])
            index = "%s%s" % (row[0], row[1])
            self._bookmark_data[index] = row[2]

    def _save_bookmarks(self):
        data = []
        for row in self._tree_model:
            index = "%s%s" % (row[0], row[1])
            data.append((row[0], row[1], self._bookmark_data[index]))
        self._config.set('positioner_bookmarks', data)
예제 #4
0
    def __init__(self):
        qtwindow.QTWindow.__init__(self, 'watch', 'Watch')
        self.connect("delete-event", self._delete_event_cb)
        qt.flow.connect('measurement-start', self._mstart_cb)
        qt.flow.connect('measurement-end', self._mend_cb)

        self._watch = {}
        self._paused = False

        self._frame = gtk.Frame()
        self._frame.set_label(_L('Add variable'))

        self._ins_combo = dropdowns.InstrumentDropdown()
        self._ins_combo.connect('changed', self._instrument_changed_cb)

        self._param_combo = dropdowns.InstrumentParameterDropdown()
        self._param_combo.connect('changed', self._parameter_changed_cb)

        label = gtk.Label(_L('Interval'))
        self._interval = gtk.SpinButton(climb_rate=1, digits=0)
        self._interval.set_range(0, 100000)
        self._interval.set_value(500)
        interval = gui.pack_hbox(
            [label, self._interval, gtk.Label('ms')], False, False)

        self._graph_check = gtk.CheckButton('Graph')
        self._graph_check.set_active(True)
        self._graph_check.connect('toggled', self._graph_toggled_cb)
        label = gtk.Label('Data points')
        self._npoints = gtk.SpinButton(climb_rate=1, digits=0)
        self._npoints.set_range(10, 1000)
        self._npoints.set_value(100)
        self._npoints.set_increments(1, 10)
        graph = gui.pack_hbox([self._graph_check, label, self._npoints], True,
                              False)

        self._ma_check = gtk.CheckButton('Moving average')
        self._ma_check.set_active(False)
        self._ma_check.connect('toggled', self._ma_toggled_cb)
        label = gtk.Label('Constant')
        self._ma_const = gtk.SpinButton(climb_rate=0.01, digits=2)
        self._ma_const.set_sensitive(False)
        self._ma_const.set_range(0, 1.0)
        self._ma_const.set_increments(0.01, 0.1)
        self._ma_const.set_value(0.95)
        ma = gui.pack_hbox([self._ma_check, label, self._ma_const], True,
                           False)

        self._add_button = gtk.Button(_L('Add'))
        self._add_button.connect('clicked', self._add_clicked_cb)
        self._remove_button = gtk.Button(_L('Remove'))
        self._remove_button.connect('clicked', self._remove_clicked_cb)
        self._pause_button = gtk.ToggleButton(_L('Pause'))
        self._pause_button.set_active(False)
        self._pause_button.connect('clicked', self._toggle_pause_cb)
        buttons = gui.pack_hbox(
            [self._add_button, self._remove_button, self._pause_button], False,
            False)

        self._tree_model = gtk.ListStore(str, str, str)
        self._tree_view = QTTable([
            (_L('Parameter'), {}),
            (_L('Delay'), {}),
            (_L('Value'), {
                'scale': 3.0
            }),
        ], self._tree_model)

        vbox = gui.pack_vbox([
            self._ins_combo,
            self._param_combo,
            interval,
            graph,
            ma,
            buttons,
        ], False, False)
        vbox.set_border_width(4)
        self._frame.add(vbox)

        vbox = gui.pack_vbox([
            self._frame,
            self._tree_view,
        ], False, False)
        self.add(vbox)

        vbox.show_all()
예제 #5
0
class WatchWindow(qtwindow.QTWindow):

    ORDERID = 22

    def __init__(self):
        qtwindow.QTWindow.__init__(self, 'watch', 'Watch')
        self.connect("delete-event", self._delete_event_cb)
        qt.flow.connect('measurement-start', self._mstart_cb)
        qt.flow.connect('measurement-end', self._mend_cb)

        self._watch = {}
        self._paused = False

        self._frame = gtk.Frame()
        self._frame.set_label(_L('Add variable'))

        self._ins_combo = dropdowns.InstrumentDropdown()
        self._ins_combo.connect('changed', self._instrument_changed_cb)

        self._param_combo = dropdowns.InstrumentParameterDropdown()
        self._param_combo.connect('changed', self._parameter_changed_cb)

        label = gtk.Label(_L('Interval'))
        self._interval = gtk.SpinButton(climb_rate=1, digits=0)
        self._interval.set_range(0, 100000)
        self._interval.set_value(500)
        interval = gui.pack_hbox(
            [label, self._interval, gtk.Label('ms')], False, False)

        self._graph_check = gtk.CheckButton('Graph')
        self._graph_check.set_active(True)
        self._graph_check.connect('toggled', self._graph_toggled_cb)
        label = gtk.Label('Data points')
        self._npoints = gtk.SpinButton(climb_rate=1, digits=0)
        self._npoints.set_range(10, 1000)
        self._npoints.set_value(100)
        self._npoints.set_increments(1, 10)
        graph = gui.pack_hbox([self._graph_check, label, self._npoints], True,
                              False)

        self._ma_check = gtk.CheckButton('Moving average')
        self._ma_check.set_active(False)
        self._ma_check.connect('toggled', self._ma_toggled_cb)
        label = gtk.Label('Constant')
        self._ma_const = gtk.SpinButton(climb_rate=0.01, digits=2)
        self._ma_const.set_sensitive(False)
        self._ma_const.set_range(0, 1.0)
        self._ma_const.set_increments(0.01, 0.1)
        self._ma_const.set_value(0.95)
        ma = gui.pack_hbox([self._ma_check, label, self._ma_const], True,
                           False)

        self._add_button = gtk.Button(_L('Add'))
        self._add_button.connect('clicked', self._add_clicked_cb)
        self._remove_button = gtk.Button(_L('Remove'))
        self._remove_button.connect('clicked', self._remove_clicked_cb)
        self._pause_button = gtk.ToggleButton(_L('Pause'))
        self._pause_button.set_active(False)
        self._pause_button.connect('clicked', self._toggle_pause_cb)
        buttons = gui.pack_hbox(
            [self._add_button, self._remove_button, self._pause_button], False,
            False)

        self._tree_model = gtk.ListStore(str, str, str)
        self._tree_view = QTTable([
            (_L('Parameter'), {}),
            (_L('Delay'), {}),
            (_L('Value'), {
                'scale': 3.0
            }),
        ], self._tree_model)

        vbox = gui.pack_vbox([
            self._ins_combo,
            self._param_combo,
            interval,
            graph,
            ma,
            buttons,
        ], False, False)
        vbox.set_border_width(4)
        self._frame.add(vbox)

        vbox = gui.pack_vbox([
            self._frame,
            self._tree_view,
        ], False, False)
        self.add(vbox)

        vbox.show_all()

    def _delete_event_cb(self, widget, event, data=None):
        self.hide()
        return True

    def set_paused(self, paused):
        logging.info('Watch win: setting paused to %s', paused)
        self._pause_button.set_active(paused)
        self._paused = paused

    def get_paused(self):
        return self._paused

    def _mstart_cb(self, sender):
        self.set_paused(True)

    def _mend_cb(self, sender):
        self.set_paused(False)

    def _toggle_pause_cb(self, sender):
        self.set_paused(not self.get_paused())

    def _instrument_changed_cb(self, widget):
        ins = self._ins_combo.get_instrument()
        self._param_combo.set_instrument(ins)

    def _parameter_changed_cb(self, widget):
        param = self._param_combo.get_parameter()

    def _graph_toggled_cb(self, widget):
        active = self._graph_check.get_active()
        self._npoints.set_sensitive(active)

    def _ma_toggled_cb(self, widget):
        active = self._ma_check.get_active()
        self._ma_const.set_sensitive(active)

    def _receive_reply(self, ins_param, result):
        if ins_param not in self._watch:
            return

        # Update delay if we're querying too fast
        info = self._watch[ins_param]
        delta = time.time() - info['req_t']
        info['avgtime'] = info['avgtime'] * 0.9 + delta * 0.1
        if info['avgtime'] > info['delay'] / 1000.0:
            self._set_delay(ins_param, info['delay'] * 2)
        info['reply_received'] = True
        self._update_cb(None, ins_param, result)

    def _query_ins(self, ins_param):
        info = self._watch[ins_param]
        if not info['reply_received'] or self._paused:
            logging.info('Not querying...')
            return True

        info['reply_received'] = False
        info['req_t'] = time.time()
        ins = info['instrument']
        param = info['parameter']
        ins.get(param, callback=lambda x: self._receive_reply(ins_param, x))

        return True

    def _ins_changed_cb(self, sender, changes, param, ins_param):
        if ins_param not in self._watch or param not in changes:
            return
        info = self._watch[ins_param]
        self._update_cb(None, ins_param, changes[param])

    def _add_clicked_cb(self, widget):
        ins = self._ins_combo.get_instrument()
        param = self._param_combo.get_parameter()
        if ins is None or param is None:
            return
        delay = int(self._interval.get_value())
        ins_param = ins.get_name() + "." + param
        if ins_param in self._watch:
            return

        iter = self._tree_model.append((ins_param, '%d ms' % delay, ''))
        info = {
            'instrument': ins,
            'parameter': param,
            'delay': delay,
            'avgtime': delay / 1000.0,
            'reply_received': True,
            'iter': iter,
            'options': ins.get_shared_parameter_options(param),
            'graph': self._graph_check.get_active(),
            'points': self._npoints.get_value(),
            'ma': self._ma_check.get_active(),
            'ma_const': self._ma_const.get_value(),
        }

        self._watch[ins_param] = info
        if delay != 0:
            hid = gobject.timeout_add(int(delay), self._query_ins, ins_param)
        else:
            hid = ins.connect('changed', lambda sender, changes: \
                    self._ins_changed_cb(sender, changes, param, ins_param))

        self._watch[ins_param]['hid'] = hid

    def _get_ncols(self, info, val):
        nvals = 1
        try:
            nvals = len(val)
        except:
            pass
        if info['ma']:
            nvals *= 2
        return nvals + 1

    def _get_row(self, info, val, prevrow=None):
        row = [timesec()]
        mac = info['ma_const']
        try:
            for i, v in enumerate(val):
                row.append(v)
                if info['ma']:
                    if prevrow is not None and info['ma']:
                        row.append(prevrow[2 * i + 2] * mac + (1 - mac) * v)
                    else:
                        row.append(v)
        except:
            row.append(val)
            if info['ma']:
                if prevrow is not None:
                    row.append(prevrow[2] * mac + (1 - mac) * val)
                else:
                    row.append(val)

        return row

    def _update_cb(self, sender, ins_param, val):
        if ins_param not in self._watch:
            return

        info = self._watch[ins_param]
        ins = info['instrument']
        param = info['parameter']
        strval = qt.format_parameter_value(info['options'], val)
        self._tree_model.set(info['iter'], 2, strval)

        if not info.get('graph', False):
            return

        plotname = 'watch_%s.%s' % (ins.get_name(), param)
        if 'data' not in info or info['data'] is None:
            cols = self._get_ncols(info, val)
            d = np.zeros([info['points'], cols], dtype=np.float)
            r = self._get_row(info, val)
            d[0, :] = self._get_row(info, val)
            info['data'] = d
            info['tempfile'] = temp.File(mode='w')

            cmd = 'qt.plot_file("%s", name="%s", clear=True)' % (
                info['tempfile'].name, plotname)
            qt.cmd(cmd, callback=lambda *x: do_print(x))
            for i in range(cols - 2):
                cmd = 'qt.plot_file("%s", name="%s", valdim=%d)' % (
                    info['tempfile'].name, plotname, i + 2)
                qt.cmd(cmd, callback=lambda *x: do_print(x))

        else:
            info['tempfile'].reopen()

        info['data'][0:-1, :] = info['data'][1:, :]
        r = self._get_row(info, val, prevrow=info['data'][-2, :])
        info['data'][-1, :] = self._get_row(info,
                                            val,
                                            prevrow=info['data'][-2, :])
        np.savetxt(info['tempfile'].get_file(), info['data'])
        info['tempfile'].close()
        cmd = 'qt.plots["%s"].update()' % (plotname, )
        qt.cmd(cmd)

    def _set_delay(self, ins_param, delay):
        info = self._watch[ins_param]
        gobject.source_remove(info['hid'])
        info['hid'] = gobject.timeout_add(int(delay), self._query_ins,
                                          ins_param)
        info['delay'] = delay
        strval = '%d ms' % (delay, )
        self._tree_model.set(info['iter'], 1, strval)

    def _remove_clicked_cb(self, widget):
        (model, rows) = self._tree_view.get_selection().get_selected_rows()
        for row in rows:
            iter = model.get_iter(row)
            ins_param = model.get_value(iter, 0)
            model.remove(iter)

            info = self._watch[ins_param]
            if info['delay'] != 0:
                gobject.source_remove(info['hid'])
            else:
                info['ins'].disconnect(info['hid'])
            del self._watch[ins_param]
예제 #6
0
    def __init__(self):
        qtwindow.QTWindow.__init__(self, 'watch', 'Watch')
        self.connect("delete-event", self._delete_event_cb)
        qt.flow.connect('measurement-start', self._mstart_cb)
        qt.flow.connect('measurement-end', self._mend_cb)

        self._watch = {}
        self._paused = False

        self._frame = gtk.Frame()
        self._frame.set_label(_L('Add variable'))

        self._ins_combo = dropdowns.InstrumentDropdown()
        self._ins_combo.connect('changed', self._instrument_changed_cb)

        self._param_combo = dropdowns.InstrumentParameterDropdown()
        self._param_combo.connect('changed', self._parameter_changed_cb)

        label = gtk.Label(_L('Interval'))
        self._interval = gtk.SpinButton(climb_rate=1, digits=0)
        self._interval.set_range(0, 100000)
        self._interval.set_value(500)
        interval = gui.pack_hbox([label, self._interval, gtk.Label('ms')],
                False, False)

        self._graph_check = gtk.CheckButton('Graph')
        self._graph_check.set_active(True)
        self._graph_check.connect('toggled', self._graph_toggled_cb)
        label = gtk.Label('Data points')
        self._npoints = gtk.SpinButton(climb_rate=1, digits=0)
        self._npoints.set_range(10, 1000)
        self._npoints.set_value(100)
        self._npoints.set_increments(1, 10)
        graph = gui.pack_hbox([self._graph_check, label, self._npoints],
                True, False)

        self._ma_check = gtk.CheckButton('Moving average')
        self._ma_check.set_active(False)
        self._ma_check.connect('toggled', self._ma_toggled_cb)
        label = gtk.Label('Constant')
        self._ma_const = gtk.SpinButton(climb_rate=0.01, digits=2)
        self._ma_const.set_sensitive(False)
        self._ma_const.set_range(0, 1.0)
        self._ma_const.set_increments(0.01, 0.1)
        self._ma_const.set_value(0.95)
        ma = gui.pack_hbox([self._ma_check, label, self._ma_const],
                True, False)

        self._add_button = gtk.Button(_L('Add'))
        self._add_button.connect('clicked', self._add_clicked_cb)
        self._remove_button = gtk.Button(_L('Remove'))
        self._remove_button.connect('clicked', self._remove_clicked_cb)
        self._pause_button = gtk.ToggleButton(_L('Pause'))
        self._pause_button.set_active(False)
        self._pause_button.connect('clicked', self._toggle_pause_cb)
        buttons = gui.pack_hbox([self._add_button, self._remove_button,
                self._pause_button], False, False)

        self._tree_model = gtk.ListStore(str, str, str)
        self._tree_view = QTTable([
            (_L('Parameter'), {}),
            (_L('Delay'), {}),
            (_L('Value'), {'scale': 3.0}),
            ], self._tree_model)

        vbox = gui.pack_vbox([
            self._ins_combo,
    		self._param_combo,
    		interval,
            graph,
            ma,
    		buttons,
    	], False, False)
        vbox.set_border_width(4)
        self._frame.add(vbox)

        vbox = gui.pack_vbox([
            self._frame,
            self._tree_view,
        ], False, False)
        self.add(vbox)

        vbox.show_all()
예제 #7
0
class WatchWindow(qtwindow.QTWindow):

    ORDERID = 22

    def __init__(self):
        qtwindow.QTWindow.__init__(self, 'watch', 'Watch')
        self.connect("delete-event", self._delete_event_cb)
        qt.flow.connect('measurement-start', self._mstart_cb)
        qt.flow.connect('measurement-end', self._mend_cb)

        self._watch = {}
        self._paused = False

        self._frame = gtk.Frame()
        self._frame.set_label(_L('Add variable'))

        self._ins_combo = dropdowns.InstrumentDropdown()
        self._ins_combo.connect('changed', self._instrument_changed_cb)

        self._param_combo = dropdowns.InstrumentParameterDropdown()
        self._param_combo.connect('changed', self._parameter_changed_cb)

        label = gtk.Label(_L('Interval'))
        self._interval = gtk.SpinButton(climb_rate=1, digits=0)
        self._interval.set_range(0, 100000)
        self._interval.set_value(500)
        interval = gui.pack_hbox([label, self._interval, gtk.Label('ms')],
                False, False)

        self._graph_check = gtk.CheckButton('Graph')
        self._graph_check.set_active(True)
        self._graph_check.connect('toggled', self._graph_toggled_cb)
        label = gtk.Label('Data points')
        self._npoints = gtk.SpinButton(climb_rate=1, digits=0)
        self._npoints.set_range(10, 1000)
        self._npoints.set_value(100)
        self._npoints.set_increments(1, 10)
        graph = gui.pack_hbox([self._graph_check, label, self._npoints],
                True, False)

        self._ma_check = gtk.CheckButton('Moving average')
        self._ma_check.set_active(False)
        self._ma_check.connect('toggled', self._ma_toggled_cb)
        label = gtk.Label('Constant')
        self._ma_const = gtk.SpinButton(climb_rate=0.01, digits=2)
        self._ma_const.set_sensitive(False)
        self._ma_const.set_range(0, 1.0)
        self._ma_const.set_increments(0.01, 0.1)
        self._ma_const.set_value(0.95)
        ma = gui.pack_hbox([self._ma_check, label, self._ma_const],
                True, False)

        self._add_button = gtk.Button(_L('Add'))
        self._add_button.connect('clicked', self._add_clicked_cb)
        self._remove_button = gtk.Button(_L('Remove'))
        self._remove_button.connect('clicked', self._remove_clicked_cb)
        self._pause_button = gtk.ToggleButton(_L('Pause'))
        self._pause_button.set_active(False)
        self._pause_button.connect('clicked', self._toggle_pause_cb)
        buttons = gui.pack_hbox([self._add_button, self._remove_button,
                self._pause_button], False, False)

        self._tree_model = gtk.ListStore(str, str, str)
        self._tree_view = QTTable([
            (_L('Parameter'), {}),
            (_L('Delay'), {}),
            (_L('Value'), {'scale': 3.0}),
            ], self._tree_model)

        vbox = gui.pack_vbox([
            self._ins_combo,
    		self._param_combo,
    		interval,
            graph,
            ma,
    		buttons,
    	], False, False)
        vbox.set_border_width(4)
        self._frame.add(vbox)

        vbox = gui.pack_vbox([
            self._frame,
            self._tree_view,
        ], False, False)
        self.add(vbox)

        vbox.show_all()

    def _delete_event_cb(self, widget, event, data=None):
        self.hide()
        return True

    def set_paused(self, paused):
        logging.info('Watch win: setting paused to %s', paused)
        self._pause_button.set_active(paused)
        self._paused = paused

    def get_paused(self):
        return self._paused

    def _mstart_cb(self, sender):
        self.set_paused(True)

    def _mend_cb(self, sender):
        self.set_paused(False)

    def _toggle_pause_cb(self, sender):
        self.set_paused(not self.get_paused())

    def _instrument_changed_cb(self, widget):
        ins = self._ins_combo.get_instrument()
        self._param_combo.set_instrument(ins)

    def _parameter_changed_cb(self, widget):
        param = self._param_combo.get_parameter()

    def _graph_toggled_cb(self, widget):
        active = self._graph_check.get_active()
        self._npoints.set_sensitive(active)

    def _ma_toggled_cb(self, widget):
        active = self._ma_check.get_active()
        self._ma_const.set_sensitive(active)

    def _receive_reply(self, ins_param, result):
        if ins_param not in self._watch:
            return

        # Update delay if we're querying too fast
        info = self._watch[ins_param]
        delta = time.time() - info['req_t']
        info['avgtime'] = info['avgtime'] * 0.9 + delta * 0.1
        if info['avgtime'] > info['delay'] / 1000.0:
            self._set_delay(ins_param, info['delay'] * 2)
        info['reply_received'] = True
        self._update_cb(None, ins_param, result)

    def _query_ins(self, ins_param):
        info = self._watch[ins_param]
        if not info['reply_received'] or self._paused:
            logging.info('Not querying...')
            return True

        info['reply_received']= False
        info['req_t']= time.time()
        ins = info['instrument']
        param = info['parameter']
        ins.get(param, callback=lambda x: self._receive_reply(ins_param, x))

        return True

    def _ins_changed_cb(self, sender, changes, param, ins_param):
        if ins_param not in self._watch or param not in changes:
            return
        info = self._watch[ins_param]
        self._update_cb(None, ins_param, changes[param])

    def _add_clicked_cb(self, widget):
        ins = self._ins_combo.get_instrument()
        param = self._param_combo.get_parameter()
        if ins is None or param is None:
            return
        delay = int(self._interval.get_value())
        ins_param = ins.get_name() + "." + param
        if ins_param in self._watch:
            return

        iter = self._tree_model.append((ins_param, '%d ms' % delay, ''))
        info = {
            'instrument': ins,
            'parameter': param,
            'delay': delay,
            'avgtime': delay / 1000.0,
            'reply_received': True,
            'iter': iter,
            'options': ins.get_shared_parameter_options(param),
            'graph': self._graph_check.get_active(),
            'points': self._npoints.get_value(),
            'ma': self._ma_check.get_active(),
            'ma_const': self._ma_const.get_value(),
        }

        self._watch[ins_param] = info
        if delay != 0:
            hid = gobject.timeout_add(int(delay), self._query_ins, ins_param)
        else:
            hid = ins.connect('changed', lambda sender, changes: \
                    self._ins_changed_cb(sender, changes, param, ins_param))

        self._watch[ins_param]['hid'] = hid

    def _get_ncols(self, info, val):
        nvals = 1
        try:
            nvals = len(val)
        except:
            pass
        if info['ma']:
            nvals *= 2
        return nvals + 1

    def _get_row(self, info, val, prevrow=None):
        row = [timesec()]
        mac = info['ma_const']
        try:
            for i, v in enumerate(val):
                row.append(v)
                if info['ma']:
                    if prevrow is not None and info['ma']:
                        row.append(prevrow[2*i+2] * mac + (1 - mac) * v)
                    else:
                        row.append(v)
        except:
            row.append(val)
            if info['ma']:
                if prevrow is not None:
                    row.append(prevrow[2] * mac + (1 - mac) * val)
                else:
                    row.append(val)

        return row

    def _update_cb(self, sender, ins_param, val):
        if ins_param not in self._watch:
            return

        info = self._watch[ins_param]
        ins = info['instrument']
        param = info['parameter']
        strval = qt.format_parameter_value(info['options'], val)
        self._tree_model.set(info['iter'], 2, strval)

        if not info.get('graph', False):
            return

        plotname = 'watch_%s.%s' % (ins.get_name(), param)
        if 'data' not in info or info['data'] is None:
            cols = self._get_ncols(info, val)
            d = np.zeros([info['points'], cols], dtype=np.float)
            r = self._get_row(info, val)
            d[0,:] = self._get_row(info, val)
            info['data'] = d
            info['tempfile'] = temp.File(mode='w')

            cmd = 'qt.plot_file("%s", name="%s", clear=True)' % (info['tempfile'].name, plotname)
            qt.cmd(cmd, callback=lambda *x: do_print(x))
            for i in range(cols - 2):
                cmd = 'qt.plot_file("%s", name="%s", valdim=%d)' % (info['tempfile'].name, plotname, i+2)
                qt.cmd(cmd, callback=lambda *x: do_print(x))

        else:
            info['tempfile'].reopen()

        info['data'][0:-1,:] = info['data'][1:,:]
        r = self._get_row(info, val, prevrow=info['data'][-2,:])
        info['data'][-1,:] = self._get_row(info, val, prevrow=info['data'][-2,:])
        np.savetxt(info['tempfile'].get_file(), info['data'])
        info['tempfile'].close()
        cmd = 'qt.plots["%s"].update()' % (plotname, )
        qt.cmd(cmd)

    def _set_delay(self, ins_param, delay):
        info = self._watch[ins_param]
        gobject.source_remove(info['hid'])
        info['hid'] = gobject.timeout_add(int(delay), self._query_ins, ins_param)
        info['delay'] = delay
        strval = '%d ms' % (delay,)
        self._tree_model.set(info['iter'], 1, strval)

    def _remove_clicked_cb(self, widget):
        (model, rows) = self._tree_view.get_selection().get_selected_rows()
        for row in rows:
            iter = model.get_iter(row)
            ins_param = model.get_value(iter, 0)
            model.remove(iter)

            info = self._watch[ins_param]
            if info['delay'] != 0:
                gobject.source_remove(info['hid'])
            else:
                info['ins'].disconnect(info['hid'])
            del self._watch[ins_param]
예제 #8
0
class PositionBookmarks(gtk.Frame):

    __gsignals__ = {
        'go-request': (gobject.SIGNAL_RUN_FIRST,
                        gobject.TYPE_NONE,
                        ([gobject.TYPE_PYOBJECT])),
    }

    def __init__(self, ins):
        gtk.Frame.__init__(self)

        self.set_label(_L('Bookmarks'))

        self._add_button = gtk.Button(_L('Add'))
        self._add_button.connect('clicked', self._add_clicked_cb)

        self._goxy_button = gtk.Button(_L('Goto XY'))
        self._goxy_button.connect('clicked', self._go_clicked_cb, 2)

        self._goxyz_button = gtk.Button(_L('Goto XYZ'))
        self._goxyz_button.connect('clicked', self._go_clicked_cb, 3)

        self._remove_button = gtk.Button(_L('Remove'))
        self._remove_button.connect('clicked', self._remove_clicked_cb)

        self._bookmark_data = {}
        self._tree_model = gtk.ListStore(str, str)
        self._tree_view = QTTable([
            ('Label', {}),
            ('Position', {})
            ], self._tree_model)

        self._config = qt.config
        self._load_bookmarks()

        self._label_entry = gtk.Entry()

        self.set_instrument(ins)

        vbox = pack_vbox([
                pack_hbox([
                    gtk.Label(_L('Label')),
                    self._label_entry], True, False),
                pack_hbox([
                    self._add_button,
                    self._goxy_button,
                    self._goxyz_button,
                    self._remove_button], True, True),
                self._tree_view
                ], False, False)
        vbox.set_border_width(4)

        self.add(vbox)

    def set_instrument(self, ins):
        self._ins = ins

        bval = False
        if ins is not None:
            bval = True
        self._add_button.set_sensitive(bval)

        bval = False
        if ins is not None and ins.get_channels() > 1:
            bval = True
        self._goxy_button.set_sensitive(bval)

        bval = False
        if ins is not None and ins.get_channels() > 2:
            bval = True
        self._goxyz_button.set_sensitive(bval)

    def _add_clicked_cb(self, widget):
        pos = self._ins.get_position()
        posstr = self._ins.format_parameter_value('position', pos)
        label = self._label_entry.get_text()

        index = "%s%s" % (label, posstr)
        if index in self._bookmark_data:
            return

        self._tree_model.append((label, posstr))
        self._bookmark_data[index] = pos

        self._save_bookmarks()

    def _remove_clicked_cb(self, widget):
        (model, rows) = self._tree_view.get_selection().get_selected_rows()
        for row in rows:
            it = model.get_iter(row)
            rowdata = model.get(it, 0, 1)
            index = "%s%s" % (rowdata[0], rowdata[1])
            if index in self._bookmark_data:
                del self._bookmark_data[index]
            model.remove(it)

        self._save_bookmarks()

    def _go_clicked_cb(self, widget, nchannels):
        (model, rows) = self._tree_view.get_selection().get_selected_rows()
        if len(rows) != 1:
            logging.warning('Select 1 row only!')

        row = rows[0]
        it = model.get_iter(row)
        label = model.get_value(it, 0)
        posstr = model.get_value(it, 1)
        index = "%s%s" % (label, posstr)
        pos = self._bookmark_data[index]

        pos = pos[:nchannels]
        self.emit('go-request', pos)

    def _load_bookmarks(self):
        for row in self._config.get('positioner_bookmarks', []):
            it = self._tree_model.append(row[:2])
            index = "%s%s" % (row[0], row[1])
            self._bookmark_data[index] = row[2]

    def _save_bookmarks(self):
        data = []
        for row in self._tree_model:
            index = "%s%s" % (row[0], row[1])
            data.append((row[0], row[1], self._bookmark_data[index]))
        self._config.set('positioner_bookmarks', data)