def __init__(self, processing_process, get_data_process): QtGui.QMainWindow.__init__(self) uic.loadUi(UIFILE, self) #self.tabifyDockWidget(self.firing_rates_dock,self.clustering_dock); self.showMaximized() self.SpS_dock.setVisible(False) self.actionSpS.setChecked(False) self.fft_dock.setVisible(False) self.actionFFT.setChecked(False) self.lfp_dock.setVisible(False) self.actionLFP.setChecked(False) self.neu_firing_rates_dock.setVisible(False) self.actionNeu_firing_rates.setChecked(False) self.show_group.setVisible(False) self.actionGroup_Viewer.setChecked(False) self.processing_process = processing_process self.get_data_process = get_data_process self.data_handler = bci_data_handler() self.signal_config = Channels_Configuration(queue = self.processing_process.ui_config_queue)#HARDCODE self.signal_config.try_send() self.channel_changed.connect(self.change_channel) self.spectral_handler = SpectralHandler(self, self.data_handler) self.spike_sorting_handler = SpikeSortingHandler(queue = self.processing_process.ui_config_queue, main_window = self) self.group_info = plus_display(self.data_handler, self.plus_grid, self.grid_group, self.plus_grid_fr, self.signal_config, self.thr_p,self.channel_changed) self.general_display = GeneralDisplay(self.data_handler, self.espacio_pg, self.channel_changed) ###Signal Slots Connections### QtCore.QObject.connect(self.display_scale, QtCore.SIGNAL("valueChanged(int)"), self.general_display.changeYrange) QtCore.QObject.connect(self.filter_mode_button, QtCore.SIGNAL("clicked( bool)"), self.change_filter_mode) QtCore.QObject.connect(self.paq_view, QtCore.SIGNAL("valueChanged(int)"), self.changeXrange) QtCore.QObject.connect(self.active_channel_cb, QtCore.SIGNAL("clicked( bool)"), self.activate_channel) QtCore.QObject.connect(self.manual_thr_cb, QtCore.SIGNAL("clicked( bool)"), self.group_info.change_th_mode) QtCore.QObject.connect(self.thr_p, QtCore.SIGNAL("textEdited(const QString&)"), self.group_info.thr_changed) QtCore.QObject.connect(self.pausa, QtCore.SIGNAL("clicked (bool)"), self.group_info.set_pause) self.thr_p.setValidator(QtGui.QDoubleValidator()) self.contador_registro = -1 self.timer = QtCore.QTimer() self.loss_data = 0 self.timer.timeout.connect(self.update) self.timer.start(0) #si va demasiado lento deberia bajarse el tiempo get_data_process.process.start() processing_process.process.start() self.file_label = QtGui.QLabel("") self.statusBar.addPermanentWidget(self.file_label) #self.dockWidget.setTitleBarWidget(QtGui.QWidget()) self.file_label.setText(NOT_SAVING_MESSAGE) self.change_filter_mode(self.filter_mode_button.isChecked()) #self.elec_group = 0 self.channel_changed.emit(0)
class MainWindow(QtGui.QMainWindow): channel_changed = QtCore.pyqtSignal(int) def __init__(self, processing_process, get_data_process): QtGui.QMainWindow.__init__(self) uic.loadUi(UIFILE, self) #self.tabifyDockWidget(self.firing_rates_dock,self.clustering_dock); self.showMaximized() self.SpS_dock.setVisible(False) self.actionSpS.setChecked(False) self.fft_dock.setVisible(False) self.actionFFT.setChecked(False) self.lfp_dock.setVisible(False) self.actionLFP.setChecked(False) self.neu_firing_rates_dock.setVisible(False) self.actionNeu_firing_rates.setChecked(False) self.show_group.setVisible(False) self.actionGroup_Viewer.setChecked(False) self.processing_process = processing_process self.get_data_process = get_data_process self.data_handler = bci_data_handler() self.signal_config = Channels_Configuration(queue = self.processing_process.ui_config_queue)#HARDCODE self.signal_config.try_send() self.channel_changed.connect(self.change_channel) self.spectral_handler = SpectralHandler(self, self.data_handler) self.spike_sorting_handler = SpikeSortingHandler(queue = self.processing_process.ui_config_queue, main_window = self) self.group_info = plus_display(self.data_handler, self.plus_grid, self.grid_group, self.plus_grid_fr, self.signal_config, self.thr_p,self.channel_changed) self.general_display = GeneralDisplay(self.data_handler, self.espacio_pg, self.channel_changed) ###Signal Slots Connections### QtCore.QObject.connect(self.display_scale, QtCore.SIGNAL("valueChanged(int)"), self.general_display.changeYrange) QtCore.QObject.connect(self.filter_mode_button, QtCore.SIGNAL("clicked( bool)"), self.change_filter_mode) QtCore.QObject.connect(self.paq_view, QtCore.SIGNAL("valueChanged(int)"), self.changeXrange) QtCore.QObject.connect(self.active_channel_cb, QtCore.SIGNAL("clicked( bool)"), self.activate_channel) QtCore.QObject.connect(self.manual_thr_cb, QtCore.SIGNAL("clicked( bool)"), self.group_info.change_th_mode) QtCore.QObject.connect(self.thr_p, QtCore.SIGNAL("textEdited(const QString&)"), self.group_info.thr_changed) QtCore.QObject.connect(self.pausa, QtCore.SIGNAL("clicked (bool)"), self.group_info.set_pause) self.thr_p.setValidator(QtGui.QDoubleValidator()) self.contador_registro = -1 self.timer = QtCore.QTimer() self.loss_data = 0 self.timer.timeout.connect(self.update) self.timer.start(0) #si va demasiado lento deberia bajarse el tiempo get_data_process.process.start() processing_process.process.start() self.file_label = QtGui.QLabel("") self.statusBar.addPermanentWidget(self.file_label) #self.dockWidget.setTitleBarWidget(QtGui.QWidget()) self.file_label.setText(NOT_SAVING_MESSAGE) self.change_filter_mode(self.filter_mode_button.isChecked()) #self.elec_group = 0 self.channel_changed.emit(0) def keyPressEvent(self, e): if e.key() == QtCore.Qt.Key_A and not e.isAutoRepeat(): autoRange_state = self.group_info.VB.getState().get('autoRange') if autoRange_state.count(True) > 0: self.group_info.VB.disableAutoRange() else: self.group_info.VB.enableAutoRange() elif e.key() == QtCore.Qt.Key_P and not e.isAutoRepeat(): self.pausa.click() def change_channel(self, channel): self.manual_thr_cb.setChecked(self.signal_config.th_manual_modes[channel]) self.active_channel_cb.setChecked(self.signal_config.active_channels[channel]) if LG_CONFIG['PROBE_CONF_L']: aux = '{}:{} | C:{}'.format(LG_CONFIG['PROBE_CONF_L'], int(channel/CONFIG['ELEC_GROUP']) + 1, channel%CONFIG['ELEC_GROUP'] + 1) self.show_group.setWindowTitle('{} {}'.format(LG_CONFIG['GROUP_LABEL'],int(channel/CONFIG['ELEC_GROUP'])+ 1)) self.fft_dock.setWindowTitle('Spectrum '+aux) else: aux = 'Electrode : {}'.format(channel+1) self.show_group.setWindowTitle(aux) self.fft_dock.setWindowTitle('Spectrum '+aux) self.info_label.setText(aux) self.show_s_channel.setWindowTitle(aux) #self.elec_group = channel%CONFIG['ELEC_GROUP'] def about(self): QtGui.QMessageBox.about(self, "About", """Essentially, all expressions of human nature ever produced, from a caveman's paintings to Mozart's symphonies and Einstein's view of the universe, emerge from the same source: the relentless dynamic toil of large populations of interconnected neurons. Miguel Nicolelis""") def change_filter_mode(self, mode): """"Define si se pide la segnial pura o la filtrada""" self.signal_config.change_filter_mode(mode) self.group_info.show_line = mode self.group_info.threshold_visible(mode) def update(self): """"Loop que se ejecuta si llegan nuevos paquetes""" try: new_struct = self.processing_process.new_data_queue.get(TIMEOUT_GET) except Queue_Empty: return 1 if new_struct['type'] == 'signal': self.data_handler.update(new_struct) if self.beepbox.isChecked(): t = Thread(target = beep, args = [self.data_handler.spikes_times[self.group_info.channel]]) t.start() if (not self.get_data_process.warnings.empty()): new_mess = self.get_data_process.warnings.get(TIMEOUT_GET) if new_mess[0] != SLOW_PROCESS_SIGNAL: self.loss_data += new_mess[1] self.statusBar.showMessage("Loss data: " + str(self.loss_data), SHOW_ERROR_TIME) else: self.statusBar.showMessage(Errors_Messages[new_mess[0]], SHOW_ERROR_TIME) if (not self.processing_process.warnings.empty()): self.statusBar.showMessage(Errors_Messages[self.processing_process.warnings.get(TIMEOUT_GET)], SHOW_ERROR_TIME) self.spectral_handler.update() self.general_display.update() self.group_info.update() self.signal_config.try_send() def on_actionDetener(self): """detiene el guardado de datos""" self.get_data_process.control.send(STOP_SIGNAL) self.file_label.setText(NOT_SAVING_MESSAGE) def on_actionSalir(self): """Pide verificacion, detiene procesos y termina de guardar archivos""" if(QtGui.QMessageBox.question( QtGui.QWidget(), 'Exit', "Are you sure you want to exit the application?", QtGui.QMessageBox.Yes |QtGui.QMessageBox.No, QtGui.QMessageBox.No) == QtGui.QMessageBox.No): return self.timer.stop() self.get_data_process.control.send(EXIT_SIGNAL) self.processing_process.control.send(EXIT_SIGNAL) self.get_data_process.process.join(2) self.processing_process.process.join(1) self.processing_process.process.terminate() self.get_data_process.process.terminate() self.general_display.close() #self.close() QtCore.QCoreApplication.instance().quit() #QtCore.QCoreApplication.instance().exit(N) devuelve N en APP.exec_() import sys sys.exit() def on_actionNuevo(self): """Nuevo archivo de registro""" self.get_data_process.control.send(START_SIGNAL) self.contador_registro += 1 self.file_label.setText(SAVING_MESSAGE + FILE_CONFIG['GENERIC_FILE'] +'-'+str(self.contador_registro)) #def set_autoRange(self): #if self.autoRange.isChecked(): #self.general_display.setAutoRange(True) #else: #self.general_display.setAutoRange(False) def closeEvent(self, event): u"""Redirige las senales que disparen ese evento al metodo on_actionSalir()""" event.ignore() self.on_actionSalir() def changeXrange(self, i): """Modifica la cantidad de paquetes que se dibujan en los displays""" self.data_handler.change_paq_view(i) self.general_display.changeXrange(i) def activate_channel(self, i): """Agrega el canal seleccionado a la lista de canales activos""" self.signal_config.active_channels[self.group_info.channel] = i def on_actionStop_SP(self): """stop all spike sorting process""" pass