def openArduino(self): try: self.doLoop = False self.thQueryingLoop.wait() except Exception as e: log.error("Error waiting for previous loop {}".format(e)) try: self.arduino.close() except: pass try: self.arduino = ArduinoWavemeter(str(self.ui.cGPIB.currentText())) except: log.error("Error opening arduino") self.ui.cGPIB.currentIndexChanged.disconnect(self.openArduino) self.arduino = ArduinoWavemeter('Fake') self.ui.cGPIB.setCurrentIndex(self.ui.cGPIB.findText('Fake')) self.ui.cGPIB.currentIndexChanged.connect(self.openArduino) self.arduino.open() self.doLoop = True self.thQueryingLoop.start()
class ArduinoWavemeterWindow(QtGui.QMainWindow): thQueryingLoop = TempThread() sigUpdateGraphs = QtCore.pyqtSignal(object) def __init__(self, *arg, **kwargs): super(ArduinoWavemeterWindow, self).__init__(*arg, **kwargs) self.initUI() self.arduino = None self.doLoop = True self.arduinoData = [0] self.fftData = [0] self.debug = [[], [], []] self.wavelengthNM = 0.0 self.wavelengthCM = 0.0 self.ui.cGPIB.currentIndexChanged.connect(self.openArduino) self.openArduino() self.sigUpdateGraphs.connect(self.updateGraphs) self.thQueryingLoop.target = self.loopArduinoCalls self.thQueryingLoop.start() def initUI(self): self.ui = Ui_ArduinoWavemeter() self.ui.setupUi(self) self.ui.splitter_2.setStretchFactor(0, 10) self.ui.splitter_2.setStretchFactor(1, 1) resources = list(visa.ResourceManager().list_resources()) resources.append('Fake') self.ui.cGPIB.addItems(resources) self.ui.cGPIB.setCurrentIndex(self.ui.cGPIB.findText('Fake')) self.pRealSpace = self.ui.gRealSpace.plot(pen='k') pi = self.ui.gRealSpace.plotItem pi.setTitle('Real Space Output') pi.setLabel('left', 'Signal') pi.setLabel('bottom', 'Pixel') self.pFFT = self.ui.gFFT.plot(pen='k') pi = self.ui.gFFT.plotItem pi.setTitle('Peak fit') pi.setLabel('left', 'Pixel') pi.setLabel('bottom', 'Peak num') # pi.setLogMode(y=True) self.debugElements = [ self.ui.gRealSpace, self.ui.gFFT, self.ui.bSave, self.ui.gbSaveName, self.ui.gbSpacing, self.ui.gbPhase ] self.ui.mExtrasDebugmode.triggered.connect(self.toggleDebugFeatures) self.ui.bSave.clicked.connect(self.saveOutput) self.toggleDebugFeatures(False) self.show() def openArduino(self): try: self.doLoop = False self.thQueryingLoop.wait() except Exception as e: log.error("Error waiting for previous loop {}".format(e)) try: self.arduino.close() except: pass try: self.arduino = ArduinoWavemeter(str(self.ui.cGPIB.currentText())) except: log.error("Error opening arduino") self.ui.cGPIB.currentIndexChanged.disconnect(self.openArduino) self.arduino = ArduinoWavemeter('Fake') self.ui.cGPIB.setCurrentIndex(self.ui.cGPIB.findText('Fake')) self.ui.cGPIB.currentIndexChanged.connect(self.openArduino) self.arduino.open() self.doLoop = True self.thQueryingLoop.start() def loopArduinoCalls(self): while self.doLoop: try: newData = self.arduino.read_values(self.ui.tExposure.value())[20:-5][::-1] if not newData: self.sigUpdateGraphs.emit('r') continue self.arduinoData = np.array(newData) self.doWavelengthCalculation() self.sigUpdateGraphs.emit('k') except AttributeError: pass # happens before you open the resource time.sleep(0.5) def doWavelengthCalculation(self): debug = [] wl = getWavelength(self.arduinoData, debug) if not debug: # prevent exceptions if there's nothign to fit debug = [[0, 0], [],[]] self.debug = debug if wl is None: wl = -1 # MessageDialog("Error with fit!") self.wavelengthNM = wl self.wavelengthCM = 1e7/wl def updateGraphs(self, pen='k'): if not pen=='r': self.ui.tWavelengthnm.setText("{:.3f}".format(self.wavelengthNM)) self.ui.tWavelengthcm.setText("{:.3f}".format(self.wavelengthCM)) if not self.ui.mExtrasDebugmode.isChecked(): return self.ui.tSpacing.setText("{:.4f}".format(self.debug[0][0])) self.ui.tPhase.setText("{:.4f}".format(self.debug[0][1])) try: self.pRealSpace.setData(self.arduinoData, pen=pen) self.pFFT.setData(self.debug[1],self.debug[2], pen=pen) except Exception as e: print "ERRO UPDATING", e def toggleDebugFeatures(self, b): for e in self.debugElements: e.setVisible(b) if b: print "it's debug time!" self.ui.splitter_2.setStretchFactor(0, 1000) self.ui.splitter_2.setStretchFactor(1, 1) def saveOutput(self): try: baseText = str(self.ui.tSaveName.text()) filelist = glob.glob('{}*.txt'.format(baseText)) print "there are tehse files already,", filelist newname = '{}_{:03d}.txt'.format(baseText, len(filelist)) np.savetxt(newname, self.arduinoData, fmt='%d') except Exception as e: print "error saving", e def closeEvent(self, *args, **kwargs): self.doLoop = False try: self.thQueryingLoop.wait() except Exception as e: log.error("Error waiting for thread to close {}".format(e)) self.arduino.close() self.close()