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