def show_fft(self): for ch in range(4): if self.chanStatus[ch] == 1: try: fa = em.fit_sine(self.timeData[ch],self.voltData[ch]) except Exception as err: print('fit_sine error:', err) fa=None if fa != None: fr = fa[1][1]*1000 # frequency in Hz dt = int(1.e6/ (20 * fr)) # dt in usecs, 20 samples per cycle try: t,v = self.p.capture1(self.sources[ch], 3000, dt) except: self.comerr() xa,ya = em.fft(v,dt) xa *= 1000 peak = self.peak_index(xa,ya) ypos = np.max(ya) pop = pg.plot(xa,ya, pen = self.traceCols[ch]) pop.showGrid(x=True, y=True) txt = pg.TextItem(text=unicode(self.tr('Fundamental frequency = %5.1f Hz')) %peak, color = 'w') txt.setPos(peak, ypos) pop.addItem(txt) pop.setWindowTitle(self.tr('Frequency Spectrum')) else: self.msg(self.tr('FFT Error'))
def showRange(self, ch): spacing = self.tbvals[self.TBval] self.pwin.removeItem(self.scaleLabs[ch]) if self.chanStatus[ch] == 0: return self.scaleLabs[ch] = pg.TextItem(text=self.rangeTexts[ch], color= self.resultCols[ch], angle=315) self.scaleLabs[ch].setPos(ch*spacing/3, 15.5) #self.scaleLabs[ch].setText('hello') self.pwin.addItem(self.scaleLabs[ch])
def showVoltagesAtCursor(self,xval): for k in range(self.MAXRES): self.pwin.removeItem(self.resLabs[k]) t = self.timeData[0] index = 0 for k in range(len(t)-1): # find out Time at the cursor position if t[k] < xval < t[k+1]: index = k self.resLabs[0] = pg.TextItem( text= unicode(self.tr('Time: %6.2fmS ')) %t[index], color= self.resultCols[0] ) self.resLabs[0].setPos(0, -11) self.pwin.addItem(self.resLabs[0]) for k in range(self.MAXCHAN): if self.chanStatus[k] == 1: self.Results[k+1] = unicode(self.tr('%s:%6.2fV ')) %(self.sources[k],self.voltData[k][index]) self.resLabs[k+1] = pg.TextItem(text= self.Results[k+1], color= self.resultCols[k]) self.resLabs[k+1].setPos(0, -12 - 1.0*k) self.pwin.addItem(self.resLabs[k+1])
def __init__(self, device=None): super(Expt, self).__init__() self.setupUi(self) try: self.setStyleSheet(open(os.path.join(os.path.dirname(__file__),"layouts/style.qss"), "r").read()) except Exception as e: print('stylesheet missing. ',e) self.resultCols = utils.makeResultColors() self.traceCols = utils.makeTraceColors() self.htmlColors = utils.makeHtmlColors() self.pwin = pg.PlotWidget(self.pwinview) self.plotLayout.addWidget(self.pwin) self.p = device # connection to the device hardware self.chanStatus = [1,0,0,0] # PyQt problem. chanStatus somehow getting preserved ??? self.offSliders = [self.slider1,self.slider2,self.slider3,self.slider4] for ch in range(self.MAXCHAN): self.offSliders[ch].valueChanged.connect(partial (self.set_offset,ch)) self.offSliders[ch].setStyleSheet('''QSlider::handle:vertical{background: %s;};'''%(self.htmlColors[ch])) self.pwin.proxy = pg.SignalProxy(self.pwin.scene().sigMouseMoved, rateLimit=60, slot=self.updateTV) self.pwin.showGrid(x=True, y=True) # with grid for k in range(self.MAXCHAN): # pg textItem to show the voltage scales self.scaleLabs[k] = pg.TextItem(text='') for k in range(self.MAXRES): # pg textItem to show the Results self.resLabs[k] = pg.TextItem() self.pwin.addItem(self.resLabs[k]) vLine = pg.InfiniteLine(angle=90, movable=False, pen = 'r') self.pwin.addItem(vLine, ignoreBounds=True) self.pwin.vLine=vLine self.pwin.vLine.setPos(-1) ax = self.pwin.getAxis('bottom') ax.setLabel(self.tr('Time (mS)')) ax = self.pwin.getAxis('left') ax.setStyle(showValues=False) ax.setLabel(self.tr('Voltage')) self.set_timebase(self.TBval) self.pwin.disableAutoRange() self.pwin.setXRange(0, self.tbvals[self.TBval]*10) self.pwin.setYRange(-16, 16) self.pwin.hideButtons() # Do not show the 'A' button of pg for ch in range(self.MAXCHAN): # initialize the pg trace widgets self.traceWidget[ch] = self.pwin.plot([0,0],[0,0], pen = self.traceCols[ch]) self.diffTraceW = self.pwin.plot([0,0],[0,0], pen = self.traceCols[-1]) self.CAP.clicked.connect(self.measure_cap) self.FREQ.clicked.connect(self.measure_freq) self.OD1.stateChanged.connect(self.control_od1) self.CCS.stateChanged.connect(self.control_ccs) self.chanSelCB = [self.A1Box,self.A2Box,self.A3Box,self.MICBox] self.rangeSelPB = [self.A1Range,self.A2Range,self.A3Range,self.MICRange] self.fitSelCB = [self.A1Fit,self.A2Fit,self.A3Fit,self.MICFit] self.voltMeterCB = [self.voltMeterCB1,self.voltMeterCB2,self.voltMeterCB3] for ch in range(4): self.chanSelCB[ch].stateChanged.connect(partial (self.select_channel,ch)) self.chanSelCB[ch].setStyleSheet('''border: 1px solid %s;'''%(self.htmlColors[ch])) #<font color="%s"> self.rangeSelPB[ch].currentIndexChanged['int'].connect(partial(self.select_range,ch)) self.chanSelCB[0].setChecked(True) self.trigBox.addItems(self.sources) self.A1Map.addItems(self.sources) self.recover() self.timer = QTimer() self.timer.timeout.connect(self.update) self.timer.start(self.TIMER)