示例#1
0
    def __init__(self, parent=None):

        QMainWindow.__init__(self)
        self.setupUi(self)

        print (pg.__version__)

        self.sb = SerialDAQ()

        while not self.sb.connected:

            msg = QMessageBox.critical(None, "Warning",
                                       u"DAQ board not connected.",
                                       QMessageBox.Retry | QMessageBox.Abort)

            if msg == QMessageBox.Retry:
                self.sb.open()
            else:
                sys.exit(1)

        self.updateTimer = QTimer()
        self.updateTimer.timeout.connect(self.update)

        self.pbSalidaDig1.clicked.connect(partial(self.activarDigital, 1))
        self.pbSalidaDig2.clicked.connect(partial(self.activarDigital, 2))
        self.pbSalidaDig3.clicked.connect(partial(self.activarDigital, 3))
        self.pbSalidaDig4.clicked.connect(partial(self.activarDigital, 4))

        self.pbActualizarEntDig.clicked.connect(self.actualizarEntDig)

        self.salidaDigital = 0x00
        # Asigna valores iniciales por defecto a los parámetros de cada canal
        for i in range(NUM_CANALES):

            str_pendiente = 'pendiente_' + str(i + 1)
            pendiente = getattr(self, str_pendiente)

            str_ordenada = 'ordenada_' + str(i + 1)
            ordenada = getattr(self, str_ordenada)

            str_nombre = 'nombre_' + str(i + 1)
            nombre = getattr(self, str_nombre)

            str_unidad = 'unidad_' + str(i + 1)
            unidad = getattr(self, str_unidad)

            pendiente.setText(str(PENDIENTE_DEF))
            ordenada.setText(str(0.0))

            nombre.setText('Canal ' + str(i + 1))
            unidad.setText('Volt')

            self.sb.config_analog(i + 1, 
                                  name=nombre.text(),
                                  activate=False,
                                  calib=(float(ordenada.text()),
                                         float(pendiente.text())))
        self.sb.activate_analog(1)
        self.midiendo = False
        self.guardado = True
        self.modo_continuo = False
        self.modo_burst = False
        
        self.modo_PWM = False
        
        self.vent_grafico = []
        self.grafico = []
        
        self.actionMedir.triggered.connect(self.medir)
        self.actionGuardar.triggered.connect(self.guardar)
        self.actionSalir.triggered.connect(self.close)
        
        self.pbActivatePWM.clicked.connect(self.activarPWM)
        
        self.dial.setTracking(True)
        self.dial_2.setTracking(True)
        
        self.dial.valueChanged.connect(self.atenderDial1)

        self.dial_2.valueChanged.connect(self.atenderDial2)

        self.pushButton.clicked.connect(self.mideTiempo)
        
        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')
        
        
        
        self.textBrowser.setText(str(self.sb.get_state()))
示例#2
0
class Main(QMainWindow, ui_main.Ui_Main):

    def __init__(self, parent=None):

        QMainWindow.__init__(self)
        self.setupUi(self)

        print (pg.__version__)

        self.sb = SerialDAQ()

        while not self.sb.connected:

            msg = QMessageBox.critical(None, "Warning",
                                       u"DAQ board not connected.",
                                       QMessageBox.Retry | QMessageBox.Abort)

            if msg == QMessageBox.Retry:
                self.sb.open()
            else:
                sys.exit(1)

        self.updateTimer = QTimer()
        self.updateTimer.timeout.connect(self.update)

        self.pbSalidaDig1.clicked.connect(partial(self.activarDigital, 1))
        self.pbSalidaDig2.clicked.connect(partial(self.activarDigital, 2))
        self.pbSalidaDig3.clicked.connect(partial(self.activarDigital, 3))
        self.pbSalidaDig4.clicked.connect(partial(self.activarDigital, 4))

        self.pbActualizarEntDig.clicked.connect(self.actualizarEntDig)

        self.salidaDigital = 0x00
        # Asigna valores iniciales por defecto a los parámetros de cada canal
        for i in range(NUM_CANALES):

            str_pendiente = 'pendiente_' + str(i + 1)
            pendiente = getattr(self, str_pendiente)

            str_ordenada = 'ordenada_' + str(i + 1)
            ordenada = getattr(self, str_ordenada)

            str_nombre = 'nombre_' + str(i + 1)
            nombre = getattr(self, str_nombre)

            str_unidad = 'unidad_' + str(i + 1)
            unidad = getattr(self, str_unidad)

            pendiente.setText(str(PENDIENTE_DEF))
            ordenada.setText(str(0.0))

            nombre.setText('Canal ' + str(i + 1))
            unidad.setText('Volt')

            self.sb.config_analog(i + 1, 
                                  name=nombre.text(),
                                  activate=False,
                                  calib=(float(ordenada.text()),
                                         float(pendiente.text())))
        self.sb.activate_analog(1)
        self.midiendo = False
        self.guardado = True
        self.modo_continuo = False
        self.modo_burst = False
        
        self.modo_PWM = False
        
        self.vent_grafico = []
        self.grafico = []
        
        self.actionMedir.triggered.connect(self.medir)
        self.actionGuardar.triggered.connect(self.guardar)
        self.actionSalir.triggered.connect(self.close)
        
        self.pbActivatePWM.clicked.connect(self.activarPWM)
        
        self.dial.setTracking(True)
        self.dial_2.setTracking(True)
        
        self.dial.valueChanged.connect(self.atenderDial1)

        self.dial_2.valueChanged.connect(self.atenderDial2)

        self.pushButton.clicked.connect(self.mideTiempo)
        
        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')
        
        
        
        self.textBrowser.setText(str(self.sb.get_state()))
    
    def mideTiempo(self, value):
        
        self.lcdNumber.display(0)
        
        if self.radioButton_4.isChecked():
            
            result = self.sb.read_time(mode=1)
        
        else:
            result = self.sb.read_time(mode=2)
            
        self.lcdNumber.display(result)
            
        
        
    def atenderDial1(self):
 
        self.spinBoxPWM1.setValue(self.dial.value())
            
        freq = int(self.cbPWM_freq.currentText())
        duty1 = self.spinBoxPWM1.value()
        duty2 = self.spinBoxPWM2.value()
        
        if self.modo_PWM:
            self.sb.set_PWM(freq, duty1, duty2)
    
    def atenderDial2(self):
      
        self.spinBoxPWM2.setValue(self.dial_2.value())
            
        freq = int(self.cbPWM_freq.currentText())
        duty1 = self.spinBoxPWM1.value()
        duty2 = self.spinBoxPWM2.value()
        
        if self.modo_PWM:
            self.sb.set_PWM(freq, duty1, duty2)
            
    def activarPWM(self):
        
        if self.modo_PWM:
            self.pbActivatePWM.setText("Activar")           
            self.sb.stop()            
            self.modo_PWM = False
        
        else:
            
            self.pbActivatePWM.setText("Desactivar")
            self.modo_PWM = True
            
            freq = int(self.cbPWM_freq.currentText())
            duty1 = self.spinBoxPWM1.value()
            duty2 = self.spinBoxPWM2.value()
            
            print duty1, duty2, type(duty1), type(duty2)
            self.sb.set_PWM(freq, duty1, duty2)
            
        
        
    def actualizarEntDig(self):
        
        self.cbEntradaDig1.setChecked(self.sb.read_digital(1))
        self.cbEntradaDig2.setChecked(self.sb.read_digital(2))
        self.cbEntradaDig3.setChecked(self.sb.read_digital(3))
        self.cbEntradaDig4.setChecked(self.sb.read_digital(4))
        
    
    def activarDigital(self, num):
        
        temp = self.salidaDigital
        
        num = 1 << (4 + (num - 1))
        temp = temp & 0xF0
        temp = temp ^ num                
        
        self.salidaDigital = temp | (self.salidaDigital & 0x0F)
        
        self.sb.board.write(chr(27) + b'S' + chr(self.salidaDigital))

        
        
    def guardar(self):
        
        fileName = QFileDialog.getSaveFileName(self, "Guardar datos", ".", "*.csv")
        print(fileName)
        np.savetxt(fileName, self.sb.channel_data[0][0:self.sb.channel_pointer], fmt='%.3f', delimiter=",")
        self.guardado = True

    def medir(self):

        if not self.midiendo:
            if not self.guardado:
                msg = QMessageBox.critical(None, "Advertencia",
                                       u"Se perderán los datos actuales",
                                       QMessageBox.Ok | QMessageBox.Cancel)
                if msg == QMessageBox.Cancel:
                    return

            self.guardado = False
            self.midiendo = True
            
            if self.burstGroupBox.isChecked():
                self.modo_burst = True                
            else:
                self.modo_continuo = True
            
            self.vent_grafico = []
            self.grafico = []
            self.sb.clear_analog()
            
           
            self.num_ventana = 0
            
            self.cur_range = 0
            self.frecuencia = self.frecuenciaSpinBox.value()
            print "Frecuencia deseada =",  1. / self.frecuencia
            print "Frecuencia deseada =",  int(10000. / self.frecuencia) * 0.0001
            self.timestamp = 0.0001 * int(10000./self.frecuencia) * np.arange(0, self.sb.bufsize)
            
            
            for i in range(NUM_CANALES):

                gb = getattr(self, 'groupBox_' + str(i + 1))
                nombre = getattr(self, 'nombre_' + str(i + 1))

                str_pendiente = 'pendiente_' + str(i + 1)
                pendiente = getattr(self, str_pendiente)

                str_ordenada = 'ordenada_' + str(i + 1)
                ordenada = getattr(self, str_ordenada)

                self.sb.config_analog(i + 1, name=nombre.text(),
                                      activate=gb.isChecked(),
                                      calib=(float(ordenada.text()),
                                             float(pendiente.text())))

                if self.sb.channel_active[i]:

                    print('Canal {0} activo.'.format(str(i + 1),))

                    self.vent_grafico.append(Plot(self, self.num_ventana))
                    
                    self.num_ventana += 1
                    self.grafico.append(self.vent_grafico[i].graphicsView.plot(autoDownsample=False, clipToView=True, antialias=True, pen=pg.mkPen('r', width=1.), symbol='o', symbolSize=0, symbolPen=pg.mkPen('r', width=1), symbolBrush=pg.mkBrush('r')))
                    title = 'Canal {0}: '.format(str(i + 1)) + \
                            self.sb.channel_name[i]

                    self.vent_grafico[i].setWindowTitle(title)
                    self.vent_grafico[i].graphicsView.setYRange(0., self.sb.channel_calib[i][1] * 2**ADC_BITS)
                    # self.vent_grafico[i].graphicsView.setXRange(0., TIME_RANGE )
                    
                    #.setLimits(maxXRange=100, minXRange=50)
                    #self.grafico[i].setDownsampling(auto=True)
#                    self.vent_grafico[i].graphicsView.setXRange(0., 50.)
                    self.vent_grafico[i].show()

                else:

                    print('Canal {0} inactivo.'.format(str(i + 1), ))
                    self.grafico.append(None)
                    self.vent_grafico.append(None)
                    
            print(u'Iniciando medición')
            
            
            if self.modo_continuo:            
                self.actionMedir.setIconText('Detener')
                self.sb.start_continuous(self.frecuencia)
                self.updateTimer.start(50) #1./self.frecuencia*1000)
            else:
                
                print("Estoy en modo burst")
                self.actionMedir.setIconText('Midiendo...')
                
                print(self.sb.board.inWaiting())
                self.sb.start_burst(self.frecuencia)
                
                time.sleep(0.5)
                app.processEvents()
                time.sleep(0.5)
                app.processEvents()
                time.sleep(0.5)
                app.processEvents()
                time.sleep(0.5)
                app.processEvents()                
                time.sleep(0.5)
                app.processEvents()
                time.sleep(0.5)
                

                #print (self.sb.update_analog())
#                self.sb.clear_analog()
                
#                delay = 0.100 + BURST_BUFFER_SIZE / 2. / self.frecuencia / self.sb.enabled_channels
                time.sleep(0.5)
                app.processEvents()
                time.sleep(0.5)
                app.processEvents()
                
#                
#                samples_read = self.sb.update_analog()                
#
#                while(samples_read != 0):                    
#                    samples_read = self.sb.update_analog()                
#                    time.sleep(0.010)
                self.update()
                app.processEvents()

                self.sb.stop()                
                print("Salí del modo burst")
                self.actionMedir.setIconText('Medir')
                
                
                self.midiendo = False
                self.modo_burst = False
                
        else:
            if self.modo_continuo:
                self.midiendo = False
                self.modo_continuo = False
                print(u'Deteniendo medición')
                self.actionMedir.setIconText('Medir')

                self.updateTimer.stop()
                self.sb.update_analog()
                self.sb.stop()

            # self.vent_grafico = []
            # 

    def update(self):

        self.sb.update_analog()
        
        new_range = False

        if (self.sb.channel_pointer / self.frecuencia) / TIME_RANGE > self.cur_range:
            self.cur_range += 1
            new_range = True
        # print self.cur_range
        for i in range(NUM_CANALES):

            if self.sb.channel_active[i]:
#                if new_range:
#                    self.vent_grafico[i].graphicsView.setXRange((self.cur_range - 1) * TIME_RANGE, self.cur_range * TIME_RANGE )
                    
                    
                self.grafico[i].setData(
                    self.timestamp[0:self.sb.channel_pointer],
                    self.sb.channel_data[i][0:self.sb.channel_pointer])

    def closeEvent(self, event):

        if not self.guardado:
            msg = QMessageBox.critical(None, "Salir",
                                       u"Se perderán los datos actuales",
                                       QMessageBox.Ok | QMessageBox.Cancel)
            if msg == QMessageBox.Cancel:
                    event.ignore()
                    return

        for ventana in self.vent_grafico:
            if ventana is not None:
                ventana.destroy()

        event.accept()
示例#3
0
    def __init__(self, parent=None):

        QMainWindow.__init__(self)
        self.setupUi(self)

        print (pg.__version__)
        
        self.sb = SerialDAQ() #'/dev/pts/6')

        while not self.sb.connected:

            msg = QMessageBox.critical(None, "Advertencia",
                                       u"La interfaz no está conectada",
                                       QMessageBox.Retry | QMessageBox.Abort)

            if msg == QMessageBox.Retry:
                self.sb.open()
            else:
                sys.exit(1)

        self.updateTimer = QTimer()
        self.updateTimer.timeout.connect(self.update)

        # Asigna valores iniciales por defecto a los parámetros de cada canal
        for i in range(NUM_CANALES):

            str_pendiente = 'pendiente_' + str(i + 1)
            pendiente = getattr(self, str_pendiente)

            str_ordenada = 'ordenada_' + str(i + 1)
            ordenada = getattr(self, str_ordenada)

            str_nombre = 'nombre_' + str(i + 1)
            nombre = getattr(self, str_nombre)

            str_unidad = 'unidad_' + str(i + 1)
            unidad = getattr(self, str_unidad)

            pendiente.setText(str(PENDIENTE_DEF))
            ordenada.setText(str(0.0))

            nombre.setText('Canal ' + str(i + 1))
            unidad.setText('Volt')

            self.sb.config_analog(i + 1, 
                                  name=nombre.text(),
                                  activate=False,
                                  calib=(float(ordenada.text()),
                                         float(pendiente.text())))
        self.sb.activate_analog(1)
        self.midiendo = False
        self.guardado = True
        
        self.vent_grafico = []
        self.grafico = []
        
        self.actionMedir.triggered.connect(self.medir)
        self.actionGuardar.triggered.connect(self.guardar)
        self.actionSalir.triggered.connect(self.close)
        
        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')
示例#4
0
class Principal(QMainWindow, ui_principal.Ui_Principal):

    def __init__(self, parent=None):

        QMainWindow.__init__(self)
        self.setupUi(self)

        print (pg.__version__)
        
        self.sb = SerialDAQ() #'/dev/pts/6')

        while not self.sb.connected:

            msg = QMessageBox.critical(None, "Advertencia",
                                       u"La interfaz no está conectada",
                                       QMessageBox.Retry | QMessageBox.Abort)

            if msg == QMessageBox.Retry:
                self.sb.open()
            else:
                sys.exit(1)

        self.updateTimer = QTimer()
        self.updateTimer.timeout.connect(self.update)

        # Asigna valores iniciales por defecto a los parámetros de cada canal
        for i in range(NUM_CANALES):

            str_pendiente = 'pendiente_' + str(i + 1)
            pendiente = getattr(self, str_pendiente)

            str_ordenada = 'ordenada_' + str(i + 1)
            ordenada = getattr(self, str_ordenada)

            str_nombre = 'nombre_' + str(i + 1)
            nombre = getattr(self, str_nombre)

            str_unidad = 'unidad_' + str(i + 1)
            unidad = getattr(self, str_unidad)

            pendiente.setText(str(PENDIENTE_DEF))
            ordenada.setText(str(0.0))

            nombre.setText('Canal ' + str(i + 1))
            unidad.setText('Volt')

            self.sb.config_analog(i + 1, 
                                  name=nombre.text(),
                                  activate=False,
                                  calib=(float(ordenada.text()),
                                         float(pendiente.text())))
        self.sb.activate_analog(1)
        self.midiendo = False
        self.guardado = True
        
        self.vent_grafico = []
        self.grafico = []
        
        self.actionMedir.triggered.connect(self.medir)
        self.actionGuardar.triggered.connect(self.guardar)
        self.actionSalir.triggered.connect(self.close)
        
        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')
        
    
    def guardar(self):
        
        self.guardado = True

    def medir(self):

        if not self.midiendo:
            if not self.guardado:
                msg = QMessageBox.critical(None, "Advertencia",
                                       u"Se perderán los datos actuales",
                                       QMessageBox.Ok | QMessageBox.Cancel)
                if msg == QMessageBox.Cancel:
                    return

            self.guardado = False
            self.midiendo = True
            
            self.vent_grafico = []
            self.grafico = []
            self.sb.clear_analog()
            
            print(u'Iniciando medición')
            self.actionMedir.setIconText('Detener')

            self.frecuencia = self.frecuenciaSpinBox.value()
            self.num_ventana = 0
            
            self.cur_range = 0

            print "Frecuencia deseada =",  1. / self.frecuencia
            print "Frecuencia deseada =",  int(10000. / self.frecuencia) * 0.0001
            self.timestamp = 1.065 * 0.0001 * int(10000./self.frecuencia) * np.arange(0, self.sb.bufsize)
            
            
            for i in range(NUM_CANALES):

                gb = getattr(self, 'groupBox_' + str(i + 1))
                nombre = getattr(self, 'nombre_' + str(i + 1))

                str_pendiente = 'pendiente_' + str(i + 1)
                pendiente = getattr(self, str_pendiente)

                str_ordenada = 'ordenada_' + str(i + 1)
                ordenada = getattr(self, str_ordenada)

                self.sb.config_analog(i + 1, name=nombre.text(),
                                      activate=gb.isChecked(),
                                      calib=(float(ordenada.text()),
                                             float(pendiente.text())))

                if self.sb.channel_active[i]:

                    print('Canal {0} activo.'.format(str(i + 1),))

                    self.vent_grafico.append(Grafico(self, self.num_ventana))
                    
                    self.num_ventana += 1
                    self.grafico.append(self.vent_grafico[i].graphicsView.plot(autoDownsample=False, clipToView=True, antialias=True, pen=pg.mkPen('r', width=1.), symbol='o', symbolSize=4, symbolPen=pg.mkPen('r', width=1), symbolBrush=pg.mkBrush('r')))
                    title = 'Canal {0}: '.format(str(i + 1)) + \
                            self.sb.channel_name[i]

                    self.vent_grafico[i].setWindowTitle(title)
                    self.vent_grafico[i].graphicsView.setYRange(0., self.sb.channel_calib[i][1] * 2**ADC_BITS)
                    # self.vent_grafico[i].graphicsView.setXRange(0., TIME_RANGE )
                    
                    #.setLimits(maxXRange=100, minXRange=50)
                    #self.grafico[i].setDownsampling(auto=True)
#                    self.vent_grafico[i].graphicsView.setXRange(0., 50.)
                    self.vent_grafico[i].show()

                else:

                    print('Canal {0} inactivo.'.format(str(i + 1), ))
                    self.grafico.append(None)
                    self.vent_grafico.append(None)

            self.sb.start_continuous(self.frecuencia)

            self.updateTimer.start(50) #1./self.frecuencia*1000)

        else:
            self.midiendo = False
            print(u'Deteniendo medición')
            self.actionMedir.setIconText('Medir')

            self.updateTimer.stop()
            self.sb.update_analog()
            self.sb.stop()

            # self.vent_grafico = []
            # 

    def update(self):

        self.sb.update_analog()
        
        new_range = False

        if (self.sb.channel_pointer / self.frecuencia) / TIME_RANGE > self.cur_range:
            self.cur_range += 1
            new_range = True
        # print self.cur_range
        for i in range(NUM_CANALES):

            if self.sb.channel_active[i]:
#                if new_range:
#                    self.vent_grafico[i].graphicsView.setXRange((self.cur_range - 1) * TIME_RANGE, self.cur_range * TIME_RANGE )
                    
                    
                self.grafico[i].setData(
                    self.timestamp[0:self.sb.channel_pointer],
                    self.sb.channel_data[i][0:self.sb.channel_pointer])

    def closeEvent(self, event):

        if not self.guardado:
            msg = QMessageBox.critical(None, "Salir",
                                       u"Se perderán los datos actuales",
                                       QMessageBox.Ok | QMessageBox.Cancel)
            if msg == QMessageBox.Cancel:
                    event.ignore()
                    return

        for ventana in self.vent_grafico:
            if ventana is not None:
                ventana.destroy()

        event.accept()
示例#5
0
    def __init__(self, parent=None):

        QMainWindow.__init__(self)
        self.setupUi(self)

        print(pg.__version__)

        self.sb = SerialDAQ()  #'/dev/pts/6')

        while not self.sb.connected:

            msg = QMessageBox.critical(None, "Advertencia",
                                       u"La interfaz no está conectada",
                                       QMessageBox.Retry | QMessageBox.Abort)

            if msg == QMessageBox.Retry:
                self.sb.open()
            else:
                sys.exit(1)

        self.updateTimer = QTimer()
        self.updateTimer.timeout.connect(self.update)

        # Asigna valores iniciales por defecto a los parámetros de cada canal
        for i in range(NUM_CANALES):

            str_pendiente = 'pendiente_' + str(i + 1)
            pendiente = getattr(self, str_pendiente)

            str_ordenada = 'ordenada_' + str(i + 1)
            ordenada = getattr(self, str_ordenada)

            str_nombre = 'nombre_' + str(i + 1)
            nombre = getattr(self, str_nombre)

            str_unidad = 'unidad_' + str(i + 1)
            unidad = getattr(self, str_unidad)

            pendiente.setText(str(PENDIENTE_DEF))
            ordenada.setText(str(0.0))

            nombre.setText('Canal ' + str(i + 1))
            unidad.setText('Volt')

            self.sb.config_analog(i + 1,
                                  name=nombre.text(),
                                  activate=False,
                                  calib=(float(ordenada.text()),
                                         float(pendiente.text())))
        self.sb.activate_analog(1)
        self.midiendo = False
        self.guardado = True

        self.vent_grafico = []
        self.grafico = []

        self.actionMedir.triggered.connect(self.medir)
        self.actionGuardar.triggered.connect(self.guardar)
        self.actionSalir.triggered.connect(self.close)

        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')
示例#6
0
class Principal(QMainWindow, ui_principal.Ui_Principal):
    def __init__(self, parent=None):

        QMainWindow.__init__(self)
        self.setupUi(self)

        print(pg.__version__)

        self.sb = SerialDAQ()  #'/dev/pts/6')

        while not self.sb.connected:

            msg = QMessageBox.critical(None, "Advertencia",
                                       u"La interfaz no está conectada",
                                       QMessageBox.Retry | QMessageBox.Abort)

            if msg == QMessageBox.Retry:
                self.sb.open()
            else:
                sys.exit(1)

        self.updateTimer = QTimer()
        self.updateTimer.timeout.connect(self.update)

        # Asigna valores iniciales por defecto a los parámetros de cada canal
        for i in range(NUM_CANALES):

            str_pendiente = 'pendiente_' + str(i + 1)
            pendiente = getattr(self, str_pendiente)

            str_ordenada = 'ordenada_' + str(i + 1)
            ordenada = getattr(self, str_ordenada)

            str_nombre = 'nombre_' + str(i + 1)
            nombre = getattr(self, str_nombre)

            str_unidad = 'unidad_' + str(i + 1)
            unidad = getattr(self, str_unidad)

            pendiente.setText(str(PENDIENTE_DEF))
            ordenada.setText(str(0.0))

            nombre.setText('Canal ' + str(i + 1))
            unidad.setText('Volt')

            self.sb.config_analog(i + 1,
                                  name=nombre.text(),
                                  activate=False,
                                  calib=(float(ordenada.text()),
                                         float(pendiente.text())))
        self.sb.activate_analog(1)
        self.midiendo = False
        self.guardado = True

        self.vent_grafico = []
        self.grafico = []

        self.actionMedir.triggered.connect(self.medir)
        self.actionGuardar.triggered.connect(self.guardar)
        self.actionSalir.triggered.connect(self.close)

        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')

    def guardar(self):

        self.guardado = True

    def medir(self):

        if not self.midiendo:
            if not self.guardado:
                msg = QMessageBox.critical(None, "Advertencia",
                                           u"Se perderán los datos actuales",
                                           QMessageBox.Ok | QMessageBox.Cancel)
                if msg == QMessageBox.Cancel:
                    return

            self.guardado = False
            self.midiendo = True

            self.vent_grafico = []
            self.grafico = []
            self.sb.clear_analog()

            print(u'Iniciando medición')
            self.actionMedir.setIconText('Detener')

            self.frecuencia = self.frecuenciaSpinBox.value()
            self.num_ventana = 0

            self.cur_range = 0

            print "Frecuencia deseada =", 1. / self.frecuencia
            print "Frecuencia deseada =", int(
                10000. / self.frecuencia) * 0.0001
            self.timestamp = 1.065 * 0.0001 * int(
                10000. / self.frecuencia) * np.arange(0, self.sb.bufsize)

            for i in range(NUM_CANALES):

                gb = getattr(self, 'groupBox_' + str(i + 1))
                nombre = getattr(self, 'nombre_' + str(i + 1))

                str_pendiente = 'pendiente_' + str(i + 1)
                pendiente = getattr(self, str_pendiente)

                str_ordenada = 'ordenada_' + str(i + 1)
                ordenada = getattr(self, str_ordenada)

                self.sb.config_analog(i + 1,
                                      name=nombre.text(),
                                      activate=gb.isChecked(),
                                      calib=(float(ordenada.text()),
                                             float(pendiente.text())))

                if self.sb.channel_active[i]:

                    print('Canal {0} activo.'.format(str(i + 1), ))

                    self.vent_grafico.append(Grafico(self, self.num_ventana))

                    self.num_ventana += 1
                    self.grafico.append(self.vent_grafico[i].graphicsView.plot(
                        autoDownsample=False,
                        clipToView=True,
                        antialias=True,
                        pen=pg.mkPen('r', width=1.),
                        symbol='o',
                        symbolSize=4,
                        symbolPen=pg.mkPen('r', width=1),
                        symbolBrush=pg.mkBrush('r')))
                    title = 'Canal {0}: '.format(str(i + 1)) + \
                            self.sb.channel_name[i]

                    self.vent_grafico[i].setWindowTitle(title)
                    self.vent_grafico[i].graphicsView.setYRange(
                        0., self.sb.channel_calib[i][1] * 2**ADC_BITS)
                    # self.vent_grafico[i].graphicsView.setXRange(0., TIME_RANGE )

                    #.setLimits(maxXRange=100, minXRange=50)
                    #self.grafico[i].setDownsampling(auto=True)
                    #                    self.vent_grafico[i].graphicsView.setXRange(0., 50.)
                    self.vent_grafico[i].show()

                else:

                    print('Canal {0} inactivo.'.format(str(i + 1), ))
                    self.grafico.append(None)
                    self.vent_grafico.append(None)

            self.sb.start_continuous(self.frecuencia)

            self.updateTimer.start(50)  #1./self.frecuencia*1000)

        else:
            self.midiendo = False
            print(u'Deteniendo medición')
            self.actionMedir.setIconText('Medir')

            self.updateTimer.stop()
            self.sb.update_analog()
            self.sb.stop()

            # self.vent_grafico = []
            #

    def update(self):

        self.sb.update_analog()

        new_range = False

        if (self.sb.channel_pointer /
                self.frecuencia) / TIME_RANGE > self.cur_range:
            self.cur_range += 1
            new_range = True
        # print self.cur_range
        for i in range(NUM_CANALES):

            if self.sb.channel_active[i]:
                #                if new_range:
                #                    self.vent_grafico[i].graphicsView.setXRange((self.cur_range - 1) * TIME_RANGE, self.cur_range * TIME_RANGE )

                self.grafico[i].setData(
                    self.timestamp[0:self.sb.channel_pointer],
                    self.sb.channel_data[i][0:self.sb.channel_pointer])

    def closeEvent(self, event):

        if not self.guardado:
            msg = QMessageBox.critical(None, "Salir",
                                       u"Se perderán los datos actuales",
                                       QMessageBox.Ok | QMessageBox.Cancel)
            if msg == QMessageBox.Cancel:
                event.ignore()
                return

        for ventana in self.vent_grafico:
            if ventana is not None:
                ventana.destroy()

        event.accept()