Esempio n. 1
0
File: libgraph.py Progetto: IIBM/bci
    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)
Esempio n. 2
0
File: libgraph.py Progetto: IIBM/bci
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