Ejemplo n.º 1
0
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        
        self.isConnected = False
        self.tempConnected = False
        self.measurementActive = False
        self.si255 = None
        self.tc08usb = None
        self.HyperionIP = '10.0.0.55'
        self.__numChannel = 1
        self.__wavelength = None
        self.__wavelength = np.zeros(20000)
        self.__scaledWavelength = None
        self.__scalePos = None
        self.plotW = pl.Plot()
        
        self.loadSettings()
        
        
        
        self.testModus = 0
        
        
        self.updateTimer = QtCore.QTimer()
        self.updateTimer.timeout.connect(self.getData)
        self.updateTempTimer = QtCore.QTimer()
        self.updateTempTimer.timeout.connect(self.getTemp)
        self.startTime = None
        self.heatingTimer = QtCore.QTimer()
        
        self.setWindowTitle(__title__ + ' ' + __version__)
        self.resize(900, 600)
        
        
        self.prodInfo = productionInfo.ProductionInfo()
        self.waitHeating = False
        self.__activateCooling = False
        self.__finalTemp = 90
        self.cogSpectralWin = 2.5
        self.__SpecWinRL = 2
        
        mainVSplit = QtGui.QSplitter()
        mainVSplit.setOrientation(QtCore.Qt.Vertical)
        mainVSplit.addWidget(self.plotW)
        mainVSplit.addWidget(self.prodInfo)
        
        mainHSplit = QtGui.QSplitter()
        mainHSplit.setOrientation(QtCore.Qt.Horizontal)
        mainHSplit.addWidget(mainVSplit)
        mainHSplit.addWidget(self.createInfoWidget())
        
        self.setCentralWidget(mainHSplit)
        
        self.createMenu()
                
        self.plotW.returnSlope.connect(self.setSlope)
        
        self.slopeCh1Dial.setSlope(0)
        self.setActionState()
        
        self.prodInfo.emitSoll.connect(self.setSollLabel)
        self.prodInfo.emitProdIds.connect(self.setProdIDs)
        self.prodInfo.emitClearIDs.connect(self.clearIDs)
        self.prodInfo.buttons.startButton.clicked.connect(self.prodSequenzClicked)
        self.prodInfo.buttons.backButton.clicked.connect(self.prodSequenzBack)
        
        self.loadSettings()


    
    def initDevice(self):
        if self.isConnected:
            try:
                if self.si255.comm.connected:
                    self.si255.comm.close()
                    self.isConnected = False
                    self.setActionState()
            except:
                pass
        else:
            try:
                si255Comm = hyperion.HCommTCPSocket(self.HyperionIP, timeout = 5000)
            except hyperion.HyperionError as e:
                print e , ' \thaha'   
            if si255Comm.connected:
                self.si255 = hyperion.Hyperion(comm = si255Comm)
                self.isConnected=True
                self.__wavelength =np.array(self.si255.wavelengths)
                self.__scalePos = np.where((self.__wavelength>=self.__minWl) & (self.__wavelength<self.__maxWl))[0]
                self.__scaledWavelength = self.__wavelength[self.__scalePos]
                self.setActionState()   
                return 1
            else:
                self.isConnected=False
                self.printError(5)
                self.setActionState()   
                return 0
         
    def about(self):
        QtGui.QMessageBox.about(self,'About '+__title__,
            self.tr("""<font size=8 color=red>
                        <b><center>{0}</center></b></font>
                   <br><font size=5 color=blue>
                        <b>{1}</b></font>
                    <br><br>Author: {2}<br>
                    Version: {3}<br>
                    Date: {4}<br><br>""".format(__title__, __about__, __author__, __version__, __date__)+__cp__))
                    
    def addActions(self, target, actions):
        for action in actions:
            if action is None:
                target.addSeparator()
            else:
                target.addAction(action)
    
    def calculateLabelColor(self):
        font = QtGui.QFont()
        font.setBold(True)
        font.setPointSize(24)
        if self.chan1SollLabel.isVisible():
            tol = self.prodInfo.getTolaranz()
            diff = float(self.chan1IsLabel.text())-float(self.chan1SollLabel.text())
            #print(diff, self.sollGreen[self.prodStep], self.sollGreen[self.prodStep]*3)
            if self.prodInfo.getProdPlanNum() == 2:
                if diff < tol:
                    self.chan1IsLabel.setStyleSheet("color: green")
                elif diff < tol*2:
                    self.chan1IsLabel.setStyleSheet("color: orange")
                else:
                    self.chan1IsLabel.setStyleSheet("color: red")
            else:
                if abs(diff) <= tol:
                    self.chan1IsLabel.setStyleSheet("color: green")
                elif abs(diff) <= tol*3:
                    self.chan1IsLabel.setStyleSheet("color: orange")
                else:
                    self.chan1IsLabel.setStyleSheet("color: red")
        else:
            self.chan1IsLabel.setStyleSheet("color: black")
            
    def clearIDs(self):
        self.proID.clear()
        self.fbgID.clear()
        self.sensorID.clear()
            
    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            try:
                if self.si255.comm.connected:
                    self.si255.comm.close()
                if self.tempConnected:
                    self.tc08usb.close_unit()
            except:
                pass
            event.accept()
        else:
            event.ignore()
             
    def connectTemp(self):
        dll_path = os.path.join(os.getenv('ProgramFiles'),'Pico Technology', 'SDK', 'lib')
        try:
            self.tc08usb = TC08USB(dll_path = dll_path)
            if self.tc08usb.open_unit():
                self.tempQ = Queue.Queue(100)
                self.tempConnected = True
                self.tempMon = MonitorTC08USBThread(self.tc08usb, self.tempQ)
                self.tempMon.start()
                self.tempConnected = True
                self.updateTempTimer.start(250)
                return 1
            else:
                self.tempConnected = False
                #self.connectTempAction.setChecked(False)
                QtGui.QMessageBox.critical(self,'Verbindungsfehler',
                                       'Konnte keine Verbindung zu TC08-USB herstellen. Bitte nochmal versuchen!')
                return 0
                
        except USBTC08_ERROR as e:
            print(e)
            
        self.setActionState()
        
        
    def createAction(self, text, slot=None, shortcut=None,
                     icon=None,tip=None,checkable=False,
                     signal='triggered()'):
        action = QtGui.QAction(text, self)
        if icon is not None:
            action.setIcon(QtGui.QIcon('../icons/%s.png' % icon))
        if shortcut is not None:
            action.setShortcut(shortcut)
        if tip is not None:
            action.setToolTip(tip)
            action.setStatusTip(tip)
        if slot is not None and not checkable:
            action.triggered.connect(slot)
        elif slot is not None and checkable:
            action.toggled.connect(slot)
        if checkable:
            action.setCheckable(True)
       
        return action
       
    def createIdFrame(self):
        f = QtGui.QGroupBox(self, title='IDs:')
        l = QtGui.QGridLayout(f)
        font = QtGui.QFont()
        font.setBold(False)
        font.setPointSize(16)
        prodIdLabel = QtGui.QLabel(text='Produktion:', font=font) 
        self.proID = QtGui.QLineEdit(font=font)
        self.proID.setAlignment(QtCore.Qt.AlignRight)
        fbgIdLabel = QtGui.QLabel(text='Faser:', font=font) 
        self.fbgID = QtGui.QLineEdit(font=font)
        self.fbgID.setAlignment(QtCore.Qt.AlignRight)
        sensorIdLabel = QtGui.QLabel(text='Sensor:', font=font)
        self.sensorID = QtGui.QLineEdit(font=font)
        self.sensorID.setAlignment(QtCore.Qt.AlignRight)
        
        l.addWidget(prodIdLabel,0,0)
        l.addWidget(self.proID,0,1)
        l.addWidget(fbgIdLabel,1,0)
        l.addWidget(self.fbgID,1,1)
        l.addWidget(sensorIdLabel,2,0)
        l.addWidget(self.sensorID,2,1)
        
        return f
        
    def createInfoWidget(self):
        i = QtGui.QFrame()
        #i.setMaximumWidth(400)
        il = QtGui.QVBoxLayout()
        
        logo = QtGui.QLabel()
        logo.setPixmap(QtGui.QPixmap('../pics/Logo loptek.jpg'))
        logoLay = QtGui.QHBoxLayout()
        logoLay.addStretch()
        logoLay.addWidget(logo)
        
        il.addLayout(logoLay)
        il.addWidget(self.createIdFrame())
        
        font = QtGui.QFont()
        font.setBold(True)
        font.setPointSize(20)
        isLabel = QtGui.QLabel(text='Ist')
        isLabel.setAlignment(QtCore.Qt.AlignCenter)
        isLabel.setFont(font)
        self.sollLabel= QtGui.QLabel(text='Soll')
        self.sollLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.sollLabel.setFont(font)
        self.sollLabel.setVisible(False)
        self.chan1IsLabel = QtGui.QLabel()
        self.chan1IsLabel.setText('0.0')
        self.chan1IsLabel.setFont(font)
        self.chan1SollLabel = QtGui.QLabel()
        #self.chan1SollLabel.setText('----.---')
        self.chan1SollLabel.setFont(font)
        self.chan1SollLabel.setAlignment(QtCore.Qt.AlignRight)
        self.chan1SollLabel.setVisible(False)
        font.setBold(True)
        font.setPointSize(12)
        #slopeLabel = QtGui.QLabel(text='Slope [pm/s]:')
        #slopeLabel.setFont(font)
        self.slopeCh1Dial = SlopeMeter()
        self.tempDisplay = QtGui.QLabel(text=u'-.- \u00b0C')
        font.setBold(True)
        font.setPointSize(16)
        self.tempDisplay.setAlignment(QtCore.Qt.AlignRight)
        self.tempDisplay.setFont(font)
        
        font.setBold(True)
        font.setPointSize(44)
        self.__timeStr = '00:00'        
        self.__timerLabel = QtGui.QLabel(self,text=self.__timeStr)
        self.__timerLabel.setFont(font)
        self.__timerLabel.setFrameShape(QtGui.QFrame.StyledPanel)
        self.__timerLabel.setFrameShadow(QtGui.QFrame.Raised)
        
        style = "font-size: 16px; font-weight: bold"
        self.openSensorButton = QtGui.QPushButton(text='SensorID laden')
        self.openSensorButton.setStyleSheet(style)
        self.openSensorButton.clicked.connect(self.openSensor)     
        self.openSensorButton.setEnabled(False)
        self.openSensorButton.setVisible(False)
        
        valLayout = QtGui.QGridLayout()
        valLayout.addWidget(isLabel,0,0)
        valLayout.addWidget(self.sollLabel,0,1)
        valLayout.addWidget(self.chan1IsLabel,1,0)
        valLayout.addWidget(self.chan1SollLabel,1,1)
        valLayout.addWidget(self.slopeCh1Dial,3,0)
        valLayout.addWidget(self.tempDisplay,2,1)
        #valLayout.addWidget(self.__timerLabel,4,0)
        #valLayout.addWidget(self.openSensorButton,4,0)
        
        
        self.slopeCh1Dial.setValue(0.)
        bottomL = QtGui.QHBoxLayout()
        bottomL.addStretch()
        bottomL.addWidget(self.__timerLabel)
        bottomL.addWidget(self.openSensorButton)
        bottomL.addStretch()
        
        il.addLayout(valLayout)
        il.addStretch()
        il.addLayout(bottomL)
        i.setLayout(il)
        
        return i
        
        
    def createMenu(self):
        
        self.fileMenu = self.menuBar().addMenu('&Datei')
        self.maesMenu = self.menuBar().addMenu('&Messung')
        self.helpMenu = self.menuBar().addMenu('&Hilfe')
        waL = QtGui.QWidgetAction(self)
        dispSpinLabel = QtGui.QLabel(text='Points displayed: ')
        waL.setDefaultWidget(dispSpinLabel)
        
        #self.menuBar().addAction(wa)
        self.quitAction = self.createAction('Q&uit',slot=self.close,shortcut='Ctrl+Q',
                                            icon='Button Close',tip='Close App')
        self.connectAction = self.createAction('Verbinden', slot=self.initDevice,
                                              tip='Verbinde Spectrometer')        
        self.connectTempAction = self.createAction('Thermo', slot=self.tempActionToggled, tip='Verbinde Thermometer',
                                                   icon='Thermo')
        
        self.startAction = self.createAction('St&art', slot=self.startMeasurement, shortcut='Ctrl+M',
                                             tip='Start Messung', icon='Button Play')
#         #self.pauseAction = self.createAction('Pa&use', #slot=self.pauseMeasurement, shortcut='Ctrl+U', 
#          #                                    tip='Pause Measurement', icon='Button Pause')
#         
        self.stopAction = self.createAction('St&op', slot=self.stopMeasurement, shortcut='Ctrl+T',
                                        tip='Stop Messung', icon='Button Stop')
        
        self.buildAction = self.createAction('Aufbau', checkable=True)
        self.siliconAction = self.createAction('Silikon', checkable=True)
        self.terminationAction = self.createAction('Faserterminierung', checkable=True)
        
        self.buildAction.setChecked(True)
        self.buildAction.toggled.connect(self.setBuildAction)
        self.siliconAction.toggled.connect(self.setSiliconAction)
        self.terminationAction.toggled.connect(self.setTerminationAction)
        
        
        self.fileMenu.addAction(self.quitAction)

        aboutAction = self.createAction('About', slot=self.about)
        
        optionAction = self.createAction('O&ptionen', tip='Optionsdialog', slot=self.openOptionsDialog)
                                     
        self.helpMenu.addAction(aboutAction)
        self.helpMenu.addAction(optionAction)
        
        self.toolbar = self.addToolBar('Measurement')
        
        self.addActions(self.toolbar, (self.connectAction, self.connectTempAction, None, self.startAction, self.stopAction, None,
                                       self.buildAction, self.siliconAction, self.terminationAction))#, self.importFileAction, self.importLogAction, self.exportData, None,self.showOptAction,None,self.fitAction, self.showFitAction))
    
    def setBuildAction(self):
        if self.buildAction.isChecked():
            self.siliconAction.setChecked(False)
            self.terminationAction.setChecked(False)
            self.clearIDs()
            
            self.prodInfo.changeProdPlan(0)
                        
            
    def setSiliconAction(self):
        if self.siliconAction.isChecked():
            self.buildAction.setChecked(False)
            self.terminationAction.setChecked(False)
            self.clearIDs()
            
            self.prodInfo.changeProdPlan(1)
            self.__timerLabel.setVisible(False)
                        
    def setTerminationAction(self):
        if self.terminationAction.isChecked():
            self.buildAction.setChecked(False)
            self.siliconAction.setChecked(False)
            self.clearIDs()
            
            self.prodInfo.changeProdPlan(2)
            
            
    def disconnectTemp(self):
        if self.updateTempTimer.isActive():
            self.updateTempTimer.stop()
        if self.tempMon:
            if self.tempMon.alive.isSet():
                self.tempMon.join()
        self.tempMon = None
        self.tc08usb.close_unit()
        self.tc08usb = None
        self.tempConnected = False
        self.tempDisplay = QtGui.QLabel(text=u'-.- \u00b0C')
        
    def getAllFromQueue(self, Q):
        """ Generator to yield one after the others all items 
            currently in the queue Q, without any waiting.
        """
        try:
            while True:
                yield Q.get_nowait( )
        except Queue.Empty:
            raise StopIteration
   
    def getData(self):
        #get spectra
        data, timestamp, success  = self.readDataFromQ()
        if not success: 
            return None
        
        self.dbmData = data[0]
        actualTime = timestamp-self.startTime
        
        wl = self.__scaledWavelength
        self.plotW.plotS(wl,self.dbmData)
        if self.prodInfo.getProdPlanNum() == 2:
            rl = self.calcReturnloss()
            self.chan1IsLabel.setText(str("{0:.1f}".format(rl)))
            self.calculateLabelColor()
        else:
        #get peak data
            numVal = self.getPeakData(wl, self.dbmData, actualTime)
            self.plotW.plotT(self.peaksTime[:numVal-1], self.peaks[:numVal-1])
                
    def readDataFromQ(self):
        qData = list(list(self.getAllFromQueue(self.dataQ)))
        timestamp = 0
        d = None
        if len(qData) > 0:
            d = np.array(qData[-1][0])
            timestamp = qData[-1][1]
            d = d[:,self.__scalePos]
            return d, timestamp , 1
        else:
            return 0,0,0
        
    def getdBmSpec(self):
        try:
            dbmData = np.array(self.si255.get_spectrum([1,]), dtype=float)
            
        except hyperion.HyperionError as e:
            print(e)
        
        return dbmData
        
    def getIDs(self):
        pro = self.proID.text()
        fbg = self.fbgID.text()
        sensor = self.sensorID.text()
        er = self.prodInfo.setIDs(pro, fbg, sensor)        
        return er
        
    def getPeakData(self, wl, dbmData, timestamp):
        peak = self.peakFit(wl, dbmData)[0]
        numVal = np.count_nonzero(self.peaks)
        self.chan1IsLabel.setText(str("{0:.3f}".format(peak)))
        self.calculateLabelColor()
        if self.waitHeating:
            if peak >= self.__heatingStartWl:
                self.heatingTimer.start()
                self.waitHeating = False
                self.prodInfo.buttons.startButton.setEnabled(True)
                self.prodInfo.buttons.backButton.setEnabled(False)
                self.prodInfo.buttons.stopButton.setEnabled(False)
                self.__heatingStartTime = time.time()

                
        if numVal < self.__maxBuffer:
            self.peaks[numVal] = peak
            self.peaksTime[numVal] = timestamp
        else:
            self.peaks = shift(self.peaks, -1, cval = peak)
            self.peaksTime = shift(self.peaksTime, -1, cval = timestamp)
            
        return numVal
        
    def getTemp(self):
        try: 
            temp = self.tempQ.get(True, 0.01)
            
        except Queue.Empty:
            return None
        tempStr = str("{0:.1f}".format(temp)) + u' \u00b0C'
        self.tempDisplay.setText(tempStr)

    def loadSettings(self):
        print('Lade Einstellungen Hauptfenster')
        self.__Vorsp = []
        self.__VorspTol = []
        settings = QtCore.QSettings('test.ini',QtCore.QSettings.IniFormat)
        settings.beginGroup('Produktion')
        self.__heatingTime = settings.value('Heizdauer').toInt()[0]
        vorSp = settings.value('VorspannFein').toFloat()[0]
        deltaHeating = settings.value('HeizDetekt').toFloat()[0]
        self.__SpecWinRL = settings.value('windowRL').toFloat()[0]
        settings.endGroup()
        
        settings.beginGroup('Dateipfade')
        self.specFolder = str(settings.value('Spektrenordner').toString())
        settings.endGroup()
        self.__heatingStartWl = vorSp + deltaHeating
        
        settings.beginGroup('Plot')
        self.__maxBuffer = settings.value('Buffer').toInt()[0]
        self.plotW.setTracePoints(settings.value('TracePunkte').toInt()[0])
        showTrace = settings.value('ShowTrace').toInt()[0]
        showSpec = settings.value('ShowSpec').toInt()[0]
        minWl = settings.value('MinWl').toFloat()[0]
        maxWl = settings.value('MaxWl').toFloat()[0]
        regPoints = settings.value('RegPoints').toInt()[0]
        settings.endGroup()
        self.showPlot(showTrace,showSpec)
        self.scaleInputSpectrum(minWl,maxWl)
        self.setBuffer()
        self.plotW.setRegPoints(regPoints)
        print('Einstellungen Hauptfenster wurden geladen')
        
    
    def openOptionsDialog(self):
        passW, ok = QtGui.QInputDialog.getText(self,"Optionen", "Bitte Password eingeben")
        if ok and passW == 'Test':
            option = OptionDialog()
            if option.exec_():
                self.prodInfo.loadSettings()
                self.loadSettings()

    def openSensor(self):
        ids = self.prodInfo.getSensorIDs() 
        newDia = NewSensorDialog(ids)
        index = 0
        if newDia.exec_():
            index = newDia.setSensor()
            self.setIDbyIndex(index)
            
    def setIDbyIndex(self, index =-1):
        pro, fbg, sens = self.prodInfo.getIDbyIndex(index)
        self.proID.setText(pro)
        self.fbgID.setText(fbg)
        self.sensorID.setText(sens)
        
    def saveSpectrum(self, x, y):
        if len(x) == 0:
            y = self.dbmData
            x = self.__scaledWavelength
        fname = time.strftime('%Y%m%d_%H%M%S') + self.sensorID.text() + '.spc'
        _file = os.path.join(str(self.specFolder) , str(fname))  
        
        File = open(_file,'w')
        for i in range(len(x)):
            File.write(str("{0:.3f}".format(x[i])) + '\t' + str(y[i]) + '\n')
        File.close()
        return fname
            
    def scaleInputSpectrum(self,_min,_max):
        self.__minWl = _min
        self.__maxWl = _max
        self.__scalePos = np.where((self.__wavelength>=self.__minWl)&(self.__wavelength<=self.__maxWl))[0]
        self.__scaledWavelength = self.__wavelength[self.__scalePos]
        
    def setActionState(self):
        if self.isConnected:
            self.connectAction.setIcon(QtGui.QIcon('../icons/Button Delete.png'))
            if self.measurementActive:
                self.connectAction.setEnabled(False)
                self.connectTempAction.setEnabled(False)
                self.startAction.setEnabled(False)
                self.stopAction.setEnabled(True)
            else:
                self.connectAction.setEnabled(True)
                self.connectTempAction.setEnabled(True)
                self.startAction.setEnabled(True)
                self.stopAction.setEnabled(False)
        else:
            self.connectAction.setIcon(QtGui.QIcon('../icons/Button Add.png'))
            self.startAction.setEnabled(False)
            self.stopAction.setEnabled(False)
        if self.tempConnected:
            self.connectTempAction.setIcon(QtGui.QIcon('../icons/Thermo.png'))
        else:
            self.connectTempAction.setIcon(QtGui.QIcon('../icons/NoThermo.png'))
            
    def setBuffer(self):
        self.peaks = np.zeros(self.__maxBuffer)
        self.peaksTime = np.zeros(self.__maxBuffer)
            
    def setProdIDs(self, proID, sensorID, fbgID):
        self.proID.setText(proID)
        self.fbgID.setText(fbgID)
        self.fbgID.setFocus()
        self.sensorID.setText(sensorID)
            
    def setSlope(self, slope):
        self.slopeCh1Dial.setSlope(slope)
        
    def setSollLabel(self, text):
        if text:
            self.sollLabel.setVisible(True)
            self.chan1SollLabel.setVisible(True)
            self.chan1SollLabel.setText(text)
        else:
            self.sollLabel.setVisible(False)
            self.chan1SollLabel.setVisible(False)
            
            
    def setTime(self, sec):
        m, s = divmod(sec, 60)
        timeStr="%02d:%02d" % (m, s)
        self.__timerLabel.setText(timeStr)
        
    def setAutoScale(self, state):
        if state:
            self.minWlSpin.setEnabled(True)
            self.maxWlSpin.setEnabled(True)
            self.plotW.setAutoScaleWavelength(True)
        else:
            self.minWlSpin.setEnabled(False)
            self.maxWlSpin.setEnabled(False)
            self.plotW.setAutoScaleWavelength(False)
        
    def showPlot(self,plotT, plotS):
        self.plotW.setShowPlot(plotT, plotS)
        
    def startMeasurement(self):
        self.setBuffer()
        self.startTime = time.time()
        #initialize Queue
        self.dataQ = Queue.Queue(100)
        #self.initTempArray()
        self.Monitor = MonitorHyperionThread(self.dataQ, self.si255, 
                                         channelList=[1,], specDevider=1)
        self.Monitor.start()
        self.updateTimer.start(100)
        self.measurementActive = True
        self.setActionState()
        
    def stopMeasurement(self):
        self.updateTimer.stop()
        try:
            self.Monitor.join(0.1)
        except:
            pass
        self.Monitor = None
        self.si255.disable_spectrum_streaming()
        self.measurementActive = False
        self.setActionState()
    

    def testChannelForPeaks(self):
        data = self.peakFit(self.__scaledWavelength, self.dbmData)
        #print(data)
        if data[0] > 1543. and data[0] < 1550.:
            print('Peak found')
            FBG = 1
        else:
            FBG = 0
        return FBG
        
    def testSpectrometer(self):
        print('Test for Spectrometer')
        try:
            if self.si255:
                if self.si255.comm.connected:
                    return 1
                else:
                    return self.initDevice()
            else:
                return self.initDevice()
        except:
            pass
            
    def testThermometer(self):
        print('Test for Thermometer')
        try:
            if not self.tempConnected:
                self.connectTemp()
        except:
            pass
        if self.tempConnected:
            return 1
        else:
            self.printError(6)
            return 0
                
    def tempActionToggled(self, state):
        if not self.tempConnected:
            self.connectTemp()
        else:
            self.disconnectTemp()
        self.setActionState()
            
#### Production
            
    def activateTimer(self):
        self.heatingTimer = QtCore.QTimer()
        self.heatingTimer.setInterval(500)
        self.heatingTimer.timeout.connect(self.updateHeatingTimer)
        self.waitHeating = True
        self.prodInfo.buttons.startButton.setEnabled(False)
        self.__timerLabel.setStyleSheet("color: black")
        
    def activateCooling(self):
        self.__activateCooling = True
        
    def activateOpenSensor(self):
        
        if self.prodInfo.getProdPlanNum():
            self.__timerLabel.setVisible(False)
            self.openSensorButton.setVisible(True)
            if self.prodInfo.getProStep() == 0:
                self.clearIDs()
                self.openSensorButton.setEnabled(True)
            else:
                self.openSensorButton.setEnabled(False)
        else:
            self.__timerLabel.setVisible(True)
            self.openSensorButton.setVisible(False)
        
        
    def updateHeatingTimer(self):
        ht = time.time() - self.__heatingStartTime
        self.setTime(ht)
        if ht >= self.__heatingTime:
            self.heatingTimer.stop()
            self.__timerLabel.setStyleSheet("color: green")
#==============================================================================
#             peak = self.chan1IsLabel.text()
#             self.prodInfo.setPeakWavelength(peak)
#             temp = self.tempDisplay.text()
#             self.prodInfo.setTemp(temp)
#             self.prodInfo.buttons.startButton.setEnabled(True)
#             self.prodInfo.buttons.backButton.setEnabled(True)
#             self.prodInfo.buttons.stopButton.setEnabled(True)
#             self.setTime(0)
#==============================================================================
                
    def startProductionSequence(self):
        if not self.testModus:
            if not self.testThermometer(): 
                return 0
            if not self.testSpectrometer(): 
                return 0
            if not self.measurementActive:
                self.startMeasurement()
        print('Starte neue Produktionssequenz')
        self.prodInfo.startProduction()
        
        
    def prodSequenzClicked(self):
        if self.prodInfo.buttons.startButton.text() == 'Start':
            self.startProductionSequence()
            
        elif self.prodInfo.buttons.startButton.text() == 'Weiter':
            print('Next Step')
            if self.prodInfo.getProStep() < self.prodInfo.proStepNb[-1]-2:
                self.prodInfo.buttons.setEnabled(False)
                if self.parseProdCondition():
                    self.parseProdMeas()
                    self.prodInfo.nextProductionStep()
                self.prodInfo.buttons.setEnabled(True)
                
            elif self.prodInfo.getProStep() == self.prodInfo.proStepNb[-1]-2:
                if self.parseProdCondition():
                    self.parseProdMeas()
                    self.prodInfo.buttons.startButton.setText('Neu')
                    self.prodInfo.nextProductionStep()
        elif self.prodInfo.buttons.startButton.text() == 'Neu':
            self.prodInfo.productionSequenzCancel(0)
            
        else:
            print('Error Production Sequenz')
        self.activateOpenSensor()
        #self.prodInfo.buttons.startButton.setFocus()
        
            
    def prodSequenzBack(self):
        if self.prodInfo.getProStep() > 0:
            self.prodInfo.productionSequenzBack()
        self.activateOpenSensor()
            
    def parseProdCondition(self):
        cond = self.prodInfo.getProCondition()
        if cond:
            cond = cond.split(',')
            #print(cond)
            for c in cond:
                c = c.strip()
                if c == 'fbg':
                    if not self.testModus:
                        if not self.testChannelForPeaks():
                            self.printError(0)
                            return 0
                elif c == 'ids':
                    print('Test for IDs')
                    if not self.testModus:
                        if self.prodInfo.getProdPlanNum() == 0:
                            text = self.proID.text()
                            if not text:
                                self.printError(1)
                                self.proID.setFocus()
                                return 0
                            if not self.prodInfo.testID(0,text):
                                self.printError(9)
                                self.proID.clear()
                                self.proID.setFocus()
                                return 0
                                
                            text = self.fbgID.text()
                            fID=text.split('-')
                            if not text.split('-')[1]:
                                self.printError(2)
                                self.fbgID.setFocus()
                                return 0
                            if not self.prodInfo.testID(1,text):
                                if not self.printError(10,1):
                                    self.fbgID.clear()
                                    self.fbgID.setFocus()
                                    return 0
                                
                            text = self.sensorID.text()
                            if not text:
                                self.printError(3)
                                self.sensorID.setFocus()
                                return 0
                            if not self.prodInfo.testID(2,text):
                                if not self.printError(11,1):
                                    self.sensorID.clear()
                                    self.sensorID.setFocus()
                                    return 0
                        else:
                            if not self.proID.text():
                                self.printError(7)
                                return 0
                        
                elif c == 'Zielwert':
                    tol = self.prodInfo.getTolaranz()
                    diff = float(self.chan1IsLabel.text())-float(self.chan1SollLabel.text())
                    msgWl = unicode("""Peakwellenlänge entspricht nicht der Vorgabe!
                                    \n\n Wollen Sie wirklich fortfahren""", 'utf-8')
                    msgRl = unicode("""Rückstreuung entspricht nicht der Vorgabe!
                                    \n\n Wollen Sie wirklich fortfahren""", 'utf-8')
                    if self.prodInfo.getProdPlanNum() == 2:
                        isTol = diff <tol
                        msg = msgRl
                    else:
                        isTol = abs(diff) < tol
                        msg = msgWl
                    if not isTol:
                        reply = QtGui.QMessageBox.question(self, 'Warnung', msg, 
                                    QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

                        if reply == QtGui.QMessageBox.Yes:
                            return 1
                        else:
                            return 0
        return 1
     
    def parseProdMeas(self):
        if not self.testModus:
            meas = self.prodInfo.getProMeas()
            x = self.__scaledWavelength
            y = self.dbmData
            cenFit = 0.
            cenCoG = 0.
            fwhm = 0
            asym = 0.
            peak = 0.
            if meas:
                meas = meas.split(',')
                #print (meas)
                for m in meas:
                    m = m.strip()
                    if m == 'ids':
                        print('Write ids')
                        if not self.testModus:
                            if not self.getIDs():
                                self.printError(4)
                                return 0
                            
                    elif m == 'date':
                        print('Write date')
                        if not self.testModus:
                            self.prodInfo.setDate()
                    elif m == 'peak':
                        print('Measure Peak Wavelength')
                        if not self.testModus:
                            peak = self.chan1IsLabel.text()
                            self.prodInfo.setPeakWavelength(peak)
                    elif m == 'spectrum':
                        print('Measure Spectrum')
                        if not self.testModus:
                            fname = self.saveSpectrum(x,y)
                            self.prodInfo.setSpecFile(fname)
                    elif m == 'fwhm':
                        print('Determine FWHM')
                        if not self.testModus:
                            cenFit = self.peakFit(x,y)[0]
                            fwhm = self.calcFWHM(x,y)
                            self.prodInfo.setFWHM(fwhm)
                    elif m == 'asymm':
                        print('Determine Asymmety Ratio')
                        if not self.testModus:
                            cenCoG = self.centerOfGravity(x,y, peak)
                            asym = self.calculateAsym(cenFit, cenCoG)
                            self.prodInfo.setAsymmetrie(asym)
                    elif m == 'temp':
                        print('Measure Temperature')
                        if not self.testModus:
                            temp = self.tempDisplay.text()
                            self.prodInfo.setTemp(temp)
                    elif m == 'timer':
                        print('Activate heating Timer.')
                        if not self.testModus:
                            if self.heatingTimer.isActive():
                                self.printError(8)
                                self.prodSequenzBack()
                            else:
                                self.activateTimer()
                    elif m == 'cooling':
                        print('Wait for Temprature = 90°C')
                        if not self.testModus:
                            self.activateCooling()
   
#### calculations
   
    def peakFit(self, x, y):
        y=np.power(10,y/10)
        p0 = [x[np.argmax(y)], 1, .2, 0]
        popt, pcov = curve_fit(self.gauss, x, y, p0)
        return popt
        
    def calcFWHM(self, x,y):
        hmdB = np.max(y) - 3
        maxX = x[np.argmax(y)]
        hmX = x[np.where((y> hmdB-.5) & (y< hmdB+.5) )[0]]
        hm1 = np.mean(hmX[np.where(hmX < maxX)[0]])
        hm2 = np.mean(hmX[np.where(hmX > maxX)[0]])
        fwhm = abs(hm2-hm1)
        print('FWHM: %s'% fwhm)
        return fwhm
   
    def centerOfGravity(self, x, y, peak=None):
        y = np.power(10,y/10)
        if not peak:
            pos = np.where(y>(np.max(y)*.3))[0]
        else:
            print('CoG spectral Window')
            xmin = float(peak)-float(self.cogSpectralWin)
            xmax = float(peak)+float(self.cogSpectralWin)
            pos = np.where((x>=xmin)&(x<=xmax))[0]
        x = x[pos]
        y = y[pos]
           
        cog = (x*y).sum()/y.sum()
        return cog
   
    def calculateAsym(self, pFit, pCOG):
        if pFit:
            return np.abs(pFit-pCOG)
        else:
            return 0
    
    def calcReturnloss(self):
        x = self.__scaledWavelength
        y = self.dbmData
        maxX = x[np.argmax(y)]
        xmin = float(maxX)-float(self.__SpecWinRL)
        xmax = float(maxX)+float(self.__SpecWinRL)
        pos = np.where((x<=xmin)|(x>=xmax))[0]
        return np.mean(y[pos])
                  
    def gauss(self,x, center, amp, sig, off):
        up = x - center
        up2 = up*up
        down = 2*sig*sig
        frac = up2/down * -1
        _exp = np.exp(frac)
        
        return amp*_exp + off
            
    def printError(self, errorCode, warning=0):
        errorHeader = ['Kein FBG gefunden',     #0
                       'Keine Produktions ID',  #1
                       'Keine Faser ID',          #2
                       'Keine Sensor ID',       #3
                       'Schreibfehler',         #4
                       'Kein Spektrometer',     #5
                       'Kein Thermometer',      #6
                       'Kein Sensor geladen',    #7
                       'Timer aktiv',           #8
                       'Produktions ID bereits vorhanden',  #9
                       'Faser ID bereits vorhanden',        #10
                       'Sensor ID bereits vorhanden']       #11
                       
        errorMessage = [unicode('Konnte keinen Peak detektieren. Bitte überprüfen Sie die angeschlossene Faser', 'utf-8'),
                        unicode('Bitte geben Sie eine Produktions-Identifikationsnummer ein.', 'utf-8'),
                        unicode('Bitte geben Sie eine Faser-Identifikationsnummer ein.', 'utf-8'),
                        unicode('Bitte geben Sie eine Sensor-Identifikationsnummer ein.', 'utf-8'),
                        unicode('Konnte Identifikationsnummern nicht in Tabelle schreiben.', 'utf-8'),
                        unicode('Bitte überprüfen Sie ob das Spektrometer angeschaltet bzw. angeschlossen ist.', 'utf-8'),
                        unicode('Bitte überprüfen Sie ob das Thermometer angeschaltet bzw. angeschlossen ist.', 'utf-8'),
                        unicode('Bitte SensorID laden.','utf-8'),
                        unicode('Bitte warten bis die aktuelle Heizperiode beendet ist.','utf-8'),
                        unicode('Die gewählte Produktions ID ist bereits vorhanden.\nBitte geben Sie eine neue ID ein.','utf-8'),
                        unicode('Die gewählte Faser ID ist bereits vorhanden.\n\nWollen Sie wirklich fortfahren?','utf-8'),
                        unicode('Die gewählte Sensor ID ist bereits vorhanden.\n\nWollen Sie wirklich fortfahren?','utf-8')]
        
        if warning:
            reply = QtGui.QMessageBox.question(self, errorHeader[errorCode], errorMessage[errorCode] ,
                                    QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
            if reply == QtGui.QMessageBox.Yes:
                return 1
            else:
                return 0
        else:
            QtGui.QMessageBox.critical(self,errorHeader[errorCode],errorMessage[errorCode])
Ejemplo n.º 2
0
 def createInfoWidget(self):
     i = QtGui.QFrame()
     #i.setMaximumWidth(400)
     il = QtGui.QVBoxLayout()
     
     logo = QtGui.QLabel()
     logo.setPixmap(QtGui.QPixmap('../pics/Logo loptek.jpg'))
     logoLay = QtGui.QHBoxLayout()
     logoLay.addStretch()
     logoLay.addWidget(logo)
     
     il.addLayout(logoLay)
     il.addWidget(self.createIdFrame())
     
     font = QtGui.QFont()
     font.setBold(True)
     font.setPointSize(20)
     isLabel = QtGui.QLabel(text='Ist')
     isLabel.setAlignment(QtCore.Qt.AlignCenter)
     isLabel.setFont(font)
     self.sollLabel= QtGui.QLabel(text='Soll')
     self.sollLabel.setAlignment(QtCore.Qt.AlignCenter)
     self.sollLabel.setFont(font)
     self.sollLabel.setVisible(False)
     self.chan1IsLabel = QtGui.QLabel()
     self.chan1IsLabel.setText('0.0')
     self.chan1IsLabel.setFont(font)
     self.chan1SollLabel = QtGui.QLabel()
     #self.chan1SollLabel.setText('----.---')
     self.chan1SollLabel.setFont(font)
     self.chan1SollLabel.setAlignment(QtCore.Qt.AlignRight)
     self.chan1SollLabel.setVisible(False)
     font.setBold(True)
     font.setPointSize(12)
     #slopeLabel = QtGui.QLabel(text='Slope [pm/s]:')
     #slopeLabel.setFont(font)
     self.slopeCh1Dial = SlopeMeter()
     self.tempDisplay = QtGui.QLabel(text=u'-.- \u00b0C')
     font.setBold(True)
     font.setPointSize(16)
     self.tempDisplay.setAlignment(QtCore.Qt.AlignRight)
     self.tempDisplay.setFont(font)
     
     font.setBold(True)
     font.setPointSize(44)
     self.__timeStr = '00:00'        
     self.__timerLabel = QtGui.QLabel(self,text=self.__timeStr)
     self.__timerLabel.setFont(font)
     self.__timerLabel.setFrameShape(QtGui.QFrame.StyledPanel)
     self.__timerLabel.setFrameShadow(QtGui.QFrame.Raised)
     
     style = "font-size: 16px; font-weight: bold"
     self.openSensorButton = QtGui.QPushButton(text='SensorID laden')
     self.openSensorButton.setStyleSheet(style)
     self.openSensorButton.clicked.connect(self.openSensor)     
     self.openSensorButton.setEnabled(False)
     self.openSensorButton.setVisible(False)
     
     valLayout = QtGui.QGridLayout()
     valLayout.addWidget(isLabel,0,0)
     valLayout.addWidget(self.sollLabel,0,1)
     valLayout.addWidget(self.chan1IsLabel,1,0)
     valLayout.addWidget(self.chan1SollLabel,1,1)
     valLayout.addWidget(self.slopeCh1Dial,3,0)
     valLayout.addWidget(self.tempDisplay,2,1)
     #valLayout.addWidget(self.__timerLabel,4,0)
     #valLayout.addWidget(self.openSensorButton,4,0)
     
     
     self.slopeCh1Dial.setValue(0.)
     bottomL = QtGui.QHBoxLayout()
     bottomL.addStretch()
     bottomL.addWidget(self.__timerLabel)
     bottomL.addWidget(self.openSensorButton)
     bottomL.addStretch()
     
     il.addLayout(valLayout)
     il.addStretch()
     il.addLayout(bottomL)
     i.setLayout(il)
     
     return i