Пример #1
0
    def __init__(self, q):
        self.q = q
        self.builder = Gtk.Builder()
        self.builder.add_from_file('gusbamptool.glade')
        handler = {
                'onDeleteWindow' : self.onDeleteWindow,
                'onConnectButtonClicked' : self.onConnectButtonClicked,
                'onDisconnectButtonClicked' : self.onDisconnectButtonClicked,
                'onStartButtonClicked' : self.onStartButtonClicked,
                'onStopButtonClicked' : self.onStopButtonClicked,
                'onSetFilterButtonClicked' : self.onSetFilterButtonClicked,
                'onComboBoxChanged' : self.onComboBoxChanged,
                'onComboBox2Changed' : self.onComboBox2Changed,
                'onSamplingFrequencyComboBoxChanged' : self.onSamplingFrequencyComboBoxChanged
                }
        self.builder.connect_signals(handler)
        window = self.builder.get_object('window1')
        window.show_all()

        # set up the figure
        fig = Figure()
        self.canvas = FigureCanvas(fig)
        self.canvas.show()
        self.canvas.set_size_request(800, 600)
        self.axis = fig.add_subplot(111)
        place = self.builder.get_object('box1')
        place.pack_start(self.canvas, True, True, 0)
        place.reorder_child(self.canvas, 1)

        self.CHANNELS = 18
        self.PAST_POINTS = 256
        self.SCALE = 30000

        self.init_plot()
        GObject.idle_add(self.visualizer)
Пример #2
0
class Gui(object):


    def __init__(self, q):
        self.q = q
        self.builder = Gtk.Builder()
        self.builder.add_from_file('gusbamptool.glade')
        handler = {
                'onDeleteWindow' : self.onDeleteWindow,
                'onConnectButtonClicked' : self.onConnectButtonClicked,
                'onDisconnectButtonClicked' : self.onDisconnectButtonClicked,
                'onStartButtonClicked' : self.onStartButtonClicked,
                'onStopButtonClicked' : self.onStopButtonClicked,
                'onSetFilterButtonClicked' : self.onSetFilterButtonClicked,
                'onComboBoxChanged' : self.onComboBoxChanged,
                'onComboBox2Changed' : self.onComboBox2Changed,
                'onSamplingFrequencyComboBoxChanged' : self.onSamplingFrequencyComboBoxChanged
                }
        self.builder.connect_signals(handler)
        window = self.builder.get_object('window1')
        window.show_all()

        # set up the figure
        fig = Figure()
        self.canvas = FigureCanvas(fig)
        self.canvas.show()
        self.canvas.set_size_request(800, 600)
        self.axis = fig.add_subplot(111)
        place = self.builder.get_object('box1')
        place.pack_start(self.canvas, True, True, 0)
        place.reorder_child(self.canvas, 1)

        self.CHANNELS = 18
        self.PAST_POINTS = 256
        self.SCALE = 30000

        self.init_plot()
        GObject.idle_add(self.visualizer)


    def onDeleteWindow(self, *args):
        Gtk.main_quit(*args)

    def onConnectButtonClicked(self, button):
        logger.debug('Connect.')

    def onDisconnectButtonClicked(self, button):
        logger.debug('Disconnect.')

    def onStartButtonClicked(self, button):
        logger.debug('Start.')
        amp.start()

    def onStopButtonClicked(self, button):
        logger.debug('Stop.')
        amp.stop()

    def onSetFilterButtonClicked(self, button):
        channels = [True for i in range(16)]

        combo = self.builder.get_object('comboboxtext_fs')
        tree_iter = combo.get_active_iter()
        if tree_iter != None:
            model = combo.get_model()
            row_id, name = model[tree_iter][:2]
            fs = int(row_id)


        if self.builder.get_object('checkbutton_notch').get_active():
            notch_order = self.builder.get_object('spin_order_notch').get_value_as_int()
            notch_hp = self.builder.get_object('spin_hp_notch').get_value()
            notch_lp = self.builder.get_object('spin_lp_notch').get_value()
            notchfilter = (notch_hp, notch_lp, fs, notch_order)
        else:
            notchfilter = None

        if self.builder.get_object('checkbutton_band').get_active():
            band_order = self.builder.get_object('spin_order_band').get_value_as_int()
            band_hp = self.builder.get_object('spin_hp_band').get_value()
            band_lp = self.builder.get_object('spin_lp_band').get_value()
            bpfilter = (band_hp, band_lp, fs, band_order)
        else:
            bpfilter = None

        amp.set_sampling_ferquency(fs, channels, bpfilter, notchfilter)
        pass


    def onComboBoxChanged(self, combo):
        logger.debug('ComboBox changed.')
        tree_iter = combo.get_active_iter()
        if tree_iter != None:
            model = combo.get_model()
            row_id, name = model[tree_iter][:2]
            logger.debug("Selected: ID=%s, name=%s" % (row_id, name))
            if row_id == 'Data':
                amp.set_mode('data')
            elif row_id == 'Impedance':
                amp.set_mode('impedance')
            elif row_id == 'Calibration':
                amp.set_mode('calibrate')


    def onComboBox2Changed(self, combo):
        tree_iter = combo.get_active_iter()
        if tree_iter != None:
            model = combo.get_model()
            row_id, name = model[tree_iter][:2]
            if row_id == 'Sine':
                amp.set_calibration_mode('sine')
            elif row_id == 'Sawtooth':
                amp.set_calibration_mode('sawtooth')
            elif row_id == 'White Noise':
                amp.set_calibration_mode('whitenoise')
            elif row_id == 'Square':
                amp.set_calibration_mode('square')
            elif row_id == 'DLR':
                amp.set_calibration_mode('dlr')
            else:
                logger.error('Unknown row_id: %s' % row_id)


    def onSamplingFrequencyComboBoxChanged(self, combo):
        tree_iter = combo.get_active_iter()
        if tree_iter != None:
            model = combo.get_model()
            row_id, name = model[tree_iter][:2]
            fs = int(row_id)
            amp.set_sampling_ferquency(fs, [False for i in range(16)], None, None)


    def init_plot(self):
        for i in range(self.CHANNELS):
            self.axis.plot(0)
        self.canvas.draw()
        self.data = np.array([]).reshape(-1, self.CHANNELS)
        self.data_buffer = []
        self.t2 = time.time()
        self.k = 0
        self.nsamples = 0


    def visualizer(self):
        t = time.time()
        tmp = []
        tmp.append(self.q.recv())
        while self.q.poll():
            i = self.q.recv()
            if i == 'quit':
                return False
            if i is None:
                return True
            tmp.append(i)
        # display #samples / second
        if tmp != None:
            self.nsamples += sum([i.shape[0] for i in tmp])
            self.k += 1
            if self.k == 100:
                sps = self.nsamples / (time.time() - self.t2)
                logger.debug('%.2f samples / second\r' % sps)
                self.t2 = time.time()
                self.nsamples = 0
                self.k = 0
        # append the new data
        new_data = np.concatenate(tmp)
        self.data = np.concatenate([self.data, new_data])
        self.data = self.data[-self.PAST_POINTS:]
        # plot the data
        dmin = self.data.min()
        dmax = self.data.max()
        dr = (dmax - dmin) * 0.7
        SCALE = dr
        x = [i for i in range(len(self.data))]
        for j, line in enumerate(self.axis.lines):
            line.set_xdata(x)
            line.set_ydata(self.data[:, j] + j * SCALE)
        self.axis.set_ylim(-SCALE, (1 + self.CHANNELS) * SCALE)
        self.axis.set_xlim(i - self.PAST_POINTS, i)
        self.canvas.draw()
        #logger.debug('%.2f FPS' % (1 / (time.time() - t)))
        return True