def initTrialSecs(self): secsSizer = wx.BoxSizer(orient=wx.HORIZONTAL) trialSecsControlBox = widgets.ControlBox(self, label='Trial Secs', orient=wx.VERTICAL) self.trialSecsFloatSpin = agwfs.FloatSpin(self, min_val=0.25, max_val=50.0, increment=1 / 4.0, value=self.pg.trialSecs) self.trialSecsFloatSpin.SetFormat("%f") self.trialSecsFloatSpin.SetDigits(3) self.Bind(agwfs.EVT_FLOATSPIN, self.setTrialSecs, self.trialSecsFloatSpin) self.offlineControls += [self.trialSecsFloatSpin] trialSecsControlBox.Add(self.trialSecsFloatSpin, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) secsSizer.Add(trialSecsControlBox, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) itiSecsControlBox = widgets.ControlBox(self, label='Inter-Trial Secs', orient=wx.VERTICAL) self.itiFloatSpin = agwfs.FloatSpin(self, min_val=0.25, max_val=10.0, increment=1 / 4.0, value=self.pg.iti) self.itiFloatSpin.SetFormat("%f") self.itiFloatSpin.SetDigits(3) self.Bind(agwfs.EVT_FLOATSPIN, self.setITI, self.itiFloatSpin) self.offlineControls += [self.itiFloatSpin] itiSecsControlBox.Add(self.itiFloatSpin, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) secsSizer.Add(itiSecsControlBox, proportion=1, flag=wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.sizer.Add(secsSizer, proportion=0, flag=wx.EXPAND)
def initTiming(self): timingSizer = wx.BoxSizer(orient=wx.HORIZONTAL) widthControlBox = widgets.ControlBox(self, label='Train Width', orient=wx.VERTICAL) self.widthFloatSpin = agwfs.FloatSpin(self, min_val=0.5, max_val=60.0, increment=0.25, value=self.pg.width) self.widthFloatSpin.SetFormat('%f') self.widthFloatSpin.SetDigits(3) self.Bind(agwfs.EVT_FLOATSPIN, self.setWidth, self.widthFloatSpin) self.offlineControls += [self.widthFloatSpin] widthControlBox.Add(self.widthFloatSpin, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) timingSizer.Add(widthControlBox, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) retrainDelayControlBox = widgets.ControlBox(self, label='Retrain Delay', orient=wx.VERTICAL) self.retrainDelayFloatSpin = agwfs.FloatSpin( self, min_val=2.0, max_val=60.0, increment=0.25, value=self.pg.retrainDelay) self.retrainDelayFloatSpin.SetFormat('%f') self.retrainDelayFloatSpin.SetDigits(4) self.Bind(agwfs.EVT_FLOATSPIN, self.setRetrainDelay, self.retrainDelayFloatSpin) self.offlineControls += [self.retrainDelayFloatSpin] retrainDelayControlBox.Add(self.retrainDelayFloatSpin, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) timingSizer.Add(retrainDelayControlBox, proportion=1, flag=wx.BOTTOM | wx.RIGHT | wx.TOP | wx.EXPAND, border=10) self.sizer.Add(timingSizer, proportion=0, flag=wx.EXPAND)
def initSigControls(self): """Initialize signal controls. """ sigSizer = wx.BoxSizer(orient=wx.VERTICAL) scaleControlBox = widgets.ControlBox(self, label='Noise', orient=wx.VERTICAL) self.scaleText = wx.StaticText(self, label='%4.1f' % self.src.scale.value) scaleTextSizer = wx.BoxSizer(orient=wx.VERTICAL) scaleTextSizer.Add(self.scaleText, proportion=1, flag=wx.EXPAND) self.scaleSlider = wx.Slider(self, style=wx.SL_VERTICAL, value=self.src.scale.value * 10.0, minValue=1, maxValue=100) self.Bind(wx.EVT_SLIDER, self.setScale, self.scaleSlider) scaleControlBox.Add(scaleTextSizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) scaleControlBox.Add(self.scaleSlider, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) sigSizer.Add(scaleControlBox, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.sizer.Add(sigSizer, proportion=1, flag=wx.EXPAND)
def initOptions(self): optionsSizer = wx.BoxSizer(wx.HORIZONTAL) # sizes should only be odd, easiest way is to implement this as slider with odd values XXX - idfah sizeControlBox = widgets.ControlBox(self, label='Size', orient=wx.HORIZONTAL) self.sizeSpinCtrl = wx.SpinCtrl(self, value=str(self.flt.size), min=3, max=100) self.Bind(wx.EVT_SPINCTRL, self.setSize, self.sizeSpinCtrl) sizeControlBox.Add(self.sizeSpinCtrl, proportion=1, flag=wx.ALL, border=8) optionsSizer.Add(sizeControlBox, proportion=0, flag=wx.TOP | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=8) # need to add slider for noise parameter XXX - idfah self.sizer.Add(optionsSizer, proportion=0) #, flag=wx.EXPAND)
def initControls(self): # slider for controlling the length of the spans in Welch's method # since sliders are int, we use divide by 4 to get float value spanControlBox = widgets.ControlBox(self, label='Span', orient=wx.HORIZONTAL) self.spanText = wx.StaticText(self, label='%4.2f(s)' % self.pg.welchConfig.span) spanTextSizer = wx.BoxSizer(orient=wx.VERTICAL) spanTextSizer.Add(self.spanText, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=8) self.spanSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=int(self.pg.welchConfig.span * 4), minValue=1, maxValue=12) spanControlBox.Add(spanTextSizer, proportion=0, flag=wx.TOP, border=10) spanControlBox.Add(self.spanSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_SLIDER, self.setSpan, self.spanSlider) self.sizer.Add(spanControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10)
def initFileControls(self): fileSizer = wx.BoxSizer(orient=wx.VERTICAL) fileControlBox = widgets.ControlBox(self, label='Data File', orient=wx.VERTICAL) self.fileTextCtrl = wx.TextCtrl(self, value=str('SAMPLE DATA'), style=wx.TE_READONLY) self.fileBrowseButton = wx.Button(self, label='Browse') fileControlBox.Add(self.fileTextCtrl, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) fileControlBox.Add(self.fileBrowseButton, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) fileSizer.Add(fileControlBox, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.sizer.Add(fileSizer, proportion=1, flag=wx.EXPAND)
def initGain(self): gainSizer = wx.BoxSizer(orient=wx.VERTICAL) gainControlBox = widgets.ControlBox(self, label='Gain', orient=wx.HORIZONTAL) self.gainText = wx.StaticText(self, label='%0.2f' % self.pg.gain) gainTextSizer = wx.BoxSizer(orient=wx.VERTICAL) gainTextSizer.Add(self.gainText, proportion=1, flag=wx.EXPAND) self.gainSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=int(self.pg.gain * 100.0), minValue=1, maxValue=100) self.Bind(wx.EVT_SLIDER, self.setGain, self.gainSlider) gainControlBox.Add(gainTextSizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) gainControlBox.Add(self.gainSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) gainSizer.Add(gainControlBox, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.sizer.Add(gainSizer, proportion=0, flag=wx.EXPAND)
def initMediaPath(self): mediaPathControlBox = widgets.ControlBox(self, label='Media Path', orient=wx.HORIZONTAL) self.mediaPathTextCtrl = wx.TextCtrl(parent=self, style=wx.TE_PROCESS_ENTER) self.mediaPathTextCtrl.SetValue(self.pg.defaultMusicDir) mediaPathControlBox.Add(self.mediaPathTextCtrl, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_TEXT_ENTER, self.setMediaPath, self.mediaPathTextCtrl) self.offlineControls += [self.mediaPathTextCtrl] self.mediaBrowseButton = wx.Button(self, label='Browse') mediaPathControlBox.Add(self.mediaBrowseButton, proportion=0, flag=wx.TOP | wx.RIGHT | wx.BOTTOM, border=10) self.Bind(wx.EVT_BUTTON, self.mediaBrowse, self.mediaBrowseButton) self.offlineControls += [self.mediaBrowseButton] self.sizer.Add(mediaPathControlBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10)
def initIntervals(self): intervalSizer = wx.BoxSizer(orient=wx.HORIZONTAL) siControlBox = widgets.ControlBox(self, label='Stim Secs', orient=wx.VERTICAL) self.siFloatSpin = agwfs.FloatSpin(self, min_val=0.025, max_val=0.5, increment=1 / 40.0, value=self.pg.si) self.siFloatSpin.SetFormat("%f") self.siFloatSpin.SetDigits(3) self.Bind(agwfs.EVT_FLOATSPIN, self.setSI, self.siFloatSpin) self.offlineControls += [self.siFloatSpin] siControlBox.Add(self.siFloatSpin, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) intervalSizer.Add(siControlBox, proportion=1, flag=wx.RIGHT | wx.BOTTOM | wx.LEFT | wx.EXPAND, border=10) isiControlBox = widgets.ControlBox(self, label='Inter-Stim Secs', orient=wx.VERTICAL) self.isiFloatSpin = agwfs.FloatSpin(self, min_val=0.05, max_val=1.0, increment=1 / 20.0, value=self.pg.isi) self.isiFloatSpin.SetFormat("%f") self.isiFloatSpin.SetDigits(3) self.Bind(agwfs.EVT_FLOATSPIN, self.setISI, self.isiFloatSpin) self.offlineControls += [self.isiFloatSpin] isiControlBox.Add(self.isiFloatSpin, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) intervalSizer.Add(isiControlBox, proportion=1, flag=wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=10) self.sizer.Add(intervalSizer, proportion=0, flag=wx.EXPAND)
def initLattice(self): latticeSizer = wx.BoxSizer(orient=wx.HORIZONTAL) latticeSizeXControlBox = widgets.ControlBox(self, label='Lattice Size X', orient=wx.VERTICAL) self.latticeSizeXSpinCtrl = wx.SpinCtrl( self, #style=wx.SP_WRAP, value=str(self.pg.latticeSize[0]), min=1, max=512) self.Bind(wx.EVT_SPINCTRL, self.setLatticeSizeX, self.latticeSizeXSpinCtrl) self.offlineControls += [self.latticeSizeXSpinCtrl] latticeSizeXControlBox.Add(self.latticeSizeXSpinCtrl, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) latticeSizer.Add(latticeSizeXControlBox, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) latticeSizeYControlBox = widgets.ControlBox(self, label='Lattice Size Y', orient=wx.VERTICAL) self.latticeSizeYSpinCtrl = wx.SpinCtrl( self, #style=wx.SP_WRAP, value=str(self.pg.latticeSize[0]), min=1, max=512) self.Bind(wx.EVT_SPINCTRL, self.setLatticeSizeY, self.latticeSizeYSpinCtrl) self.offlineControls += [self.latticeSizeYSpinCtrl] latticeSizeYControlBox.Add(self.latticeSizeYSpinCtrl, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) latticeSizer.Add(latticeSizeYControlBox, proportion=1, flag=wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.sizer.Add(latticeSizer, proportion=0, flag=wx.EXPAND)
def initNTrial(self): trialSizer = wx.BoxSizer(orient=wx.HORIZONTAL) trainTrialControlBox = widgets.ControlBox(self, label='Train Trials', orient=wx.VERTICAL) self.trainTrialSpinCtrl = wx.SpinCtrl( self, #style=wx.SP_WRAP, value=str(self.pg.nTrainTrial), min=2, max=100) self.Bind(wx.EVT_SPINCTRL, self.setNTrainTrial, self.trainTrialSpinCtrl) self.offlineControls += [self.trainTrialSpinCtrl] trainTrialControlBox.Add(self.trainTrialSpinCtrl, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) trialSizer.Add(trainTrialControlBox, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) testTrialControlBox = widgets.ControlBox(self, label='Test Trials', orient=wx.VERTICAL) self.testTrialSpinCtrl = wx.SpinCtrl( self, #style=wx.SP_WRAP, value=str(self.pg.nTestTrial), min=1, max=100) self.Bind(wx.EVT_SPINCTRL, self.setNTestTrial, self.testTrialSpinCtrl) self.offlineControls += [self.testTrialSpinCtrl] testTrialControlBox.Add(self.testTrialSpinCtrl, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) trialSizer.Add(testTrialControlBox, proportion=1, flag=wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.sizer.Add(trialSizer, proportion=0, flag=wx.EXPAND)
def initOptions(self): STransConfigPanel.initOptions(self) optionsSizer = wx.BoxSizer(wx.HORIZONTAL) kurtosisControlBox = widgets.ControlBox(self, label='Kurtosis', orient=wx.VERTICAL) self.kurtosisComboBox = wx.ComboBox(self, choices=('Adapt', 'Sub', 'Super'), value=self.flt.kurtosis, style=wx.CB_DROPDOWN) self.Bind(wx.EVT_COMBOBOX, self.setKurtosis, self.kurtosisComboBox) kurtosisControlBox.Add(self.kurtosisComboBox, proportion=1, flag=wx.ALL, border=8) optionsSizer.Add(kurtosisControlBox, proportion=1, flag=wx.LEFT | wx.RIGHT, border=8) maxIterControlBox = widgets.ControlBox(self, label='Max Iter.', orient=wx.HORIZONTAL) self.maxIterSpinCtrl = wx.SpinCtrl(self, value=str(self.flt.maxIter), min=50, max=3500) self.Bind(wx.EVT_SPINCTRL, self.setMaxIter, self.maxIterSpinCtrl) maxIterControlBox.Add(self.maxIterSpinCtrl, proportion=1, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=8) optionsSizer.Add(maxIterControlBox, proportion=0, flag=wx.RIGHT | wx.EXPAND, border=8) #lrControlBox = widgets.ControlBox(self, label='Learning Rate.', orient=wx.HORIZONTAL) self.sizer.Add(optionsSizer, proportion=0)
def initChannelConfig(self): """Initialize the channel configuration area. """ # controlbox to surround the area chanControlBox = widgets.ControlBox(self.scrolledPanel, label='Channels', orient=wx.HORIZONTAL) # only supports two columns, this could probably be done better XXX - idfah ## # left column ## leftChanSizer = wx.BoxSizer(orient=wx.VERTICAL) ## # create text controls ## self.chanTextCtrls = [] ## for c in range(16): ## curChanTextCtrl = wx.TextCtrl(self.scrolledPanel) ## self.chanTextCtrls.append(curChanTextCtrl) ## leftChanSizer.Add(curChanTextCtrl, proportion=0, ## flag=wx.RIGHT | wx.TOP | wx.LEFT, border=10) ## # add to sizer ## chanControlBox.Add(leftChanSizer) ## # right column ## rightChanSizer = wx.BoxSizer(orient=wx.VERTICAL) ## # create text controls ## for c in range(16): ## curChanTextCtrl = wx.TextCtrl(self.scrolledPanel) ## self.chanTextCtrls.append(curChanTextCtrl) ## rightChanSizer.Add(curChanTextCtrl, proportion=0, ## flag=wx.RIGHT | wx.TOP | wx.LEFT, border=10) ## # add to sizer ## chanControlBox.Add(rightChanSizer) self.chanSizer = wx.GridSizer(40, 2, 10, 10) #self.chanSizer = wx.BoxSizer(orient=wx.VERTICAL) self.chanTextCtrls = [ wx.TextCtrl(self.scrolledPanel) for i in range(40 * 2) ] self.chanSizer.AddMany(self.chanTextCtrls) #for ctc in self.chanTextCtrls: # self.chanSizer.Add(ctc, proportion=0, flag=wx.TOP | wx.LEFT | wx.RIGHT, border=2) chanControlBox.Add(self.chanSizer, flag=wx.ALL, border=10) # sizer for channel configuration area self.chanSizer = wx.BoxSizer(orient=wx.VERTICAL) self.chanSizer.Add(chanControlBox, proportion=1, flag=wx.TOP | wx.BOTTOM, border=10)
def initClassifierKind(self): classifierControlBox = widgets.ControlBox(self, label='Classifier', orient=wx.VERTICAL) self.classifierKindComboBox = wx.ComboBox(self, value=self.pg.classifierKind, style=wx.CB_READONLY, choices=self.pg.classifierChoices) self.Bind(wx.EVT_COMBOBOX, self.setClassifier, self.classifierKindComboBox) self.offlineControls += [self.classifierKindComboBox] classifierControlBox.Add(self.classifierKindComboBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.sizer.Add(classifierControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10)
def initResponse(self): self.freqResponseFig = plt.Figure() self.freqResponseCanvas = FigureCanvas(parent=self, id=wx.ID_ANY, figure=self.freqResponseFig) self.freqResponseAx = self.freqResponseFig.add_subplot(1,1,1) #self.freqResponseFig.tight_layout() self.phaseResponseFig = plt.Figure() self.phaseResponseCanvas = FigureCanvas(parent=self, id=wx.ID_ANY, figure=self.phaseResponseFig) self.phaseResponseAx = self.phaseResponseFig.add_subplot(1,1,1) #self.freqResponseFig.tight_layout() responseSizer = wx.BoxSizer(wx.VERTICAL) freqResponseControlBox = widgets.ControlBox(self, label='Frequency Response', orient=wx.VERTICAL) freqResponseControlBox.Add(self.freqResponseCanvas, proportion=1, flag=wx.ALL | wx.EXPAND, border=8) responseSizer.Add(freqResponseControlBox, proportion=1, flag=wx.TOP | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=10) phaseResponseControlBox = widgets.ControlBox(self, label='Phase Response', orient=wx.VERTICAL) phaseResponseControlBox.Add(self.phaseResponseCanvas, proportion=1, flag=wx.ALL | wx.EXPAND, border=8) responseSizer.Add(phaseResponseControlBox, proportion=1, flag=wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=10) self.bottomSizer.Add(responseSizer, proportion=1, flag=wx.EXPAND) self.freqResponseCanvas.SetMinSize((0,0)) self.phaseResponseCanvas.SetMinSize((0,0)) # could we prevent resize when panel is not visible? XXX - idfah self.freqResponseLastSize = (0,0) self.freqResponseCanvas.Bind(wx.EVT_SIZE, self.freqResponseResize) self.phaseResponseLastSize = (0,0) self.phaseResponseCanvas.Bind(wx.EVT_SIZE, self.phaseResponseResize) self.updateResponse()
def initOptions(self): optionsSizer = wx.BoxSizer(wx.HORIZONTAL) kernTypeControlBox = widgets.ControlBox(self, label='Kernel Type', orient=wx.HORIZONTAL) self.kernTypeComboBox = wx.ComboBox(self, choices=list( self.flt.kernMap.keys()), value=self.flt.kernType, style=wx.CB_DROPDOWN) self.Bind(wx.EVT_COMBOBOX, self.setKernType, self.kernTypeComboBox) kernTypeControlBox.Add(self.kernTypeComboBox, proportion=1, flag=wx.ALL, border=8) optionsSizer.Add(kernTypeControlBox, proportion=1, flag=wx.ALL | wx.ALIGN_CENTER, border=8) widthControlBox = widgets.ControlBox(self, label='Width', orient=wx.HORIZONTAL) self.widthSpinCtrl = wx.SpinCtrl(self, value=str(self.flt.width), min=2, max=100) self.Bind(wx.EVT_SPINCTRL, self.setWidth, self.widthSpinCtrl) widthControlBox.Add(self.widthSpinCtrl, proportion=1, flag=wx.ALL, border=8) optionsSizer.Add(widthControlBox, proportion=0, flag=wx.TOP | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=8) self.sizer.Add(optionsSizer, proportion=0) #, flag=wx.EXPAND)
def initTriggerControls(self): """Initialize trigger controls. """ triggerSizer = wx.BoxSizer(orient=wx.VERTICAL) triggerControlBox = widgets.ControlBox(self, label='Manual Trigger', orient=wx.VERTICAL) self.trigger0Button = wx.Button(self, label='Class 0') self.Bind(wx.EVT_BUTTON, self.trigger0, self.trigger0Button) triggerControlBox.Add(self.trigger0Button, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.trigger1Button = wx.Button(self, label='Class 1') self.Bind(wx.EVT_BUTTON, self.trigger1, self.trigger1Button) triggerControlBox.Add(self.trigger1Button, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.trigger2Button = wx.Button(self, label='Class 2') self.Bind(wx.EVT_BUTTON, self.trigger2, self.trigger2Button) triggerControlBox.Add(self.trigger2Button, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.trigger3Button = wx.Button(self, label='Class 3') self.Bind(wx.EVT_BUTTON, self.trigger3, self.trigger3Button) triggerControlBox.Add(self.trigger3Button, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.trigger4Button = wx.Button(self, label='Class 4') self.Bind(wx.EVT_BUTTON, self.trigger4, self.trigger4Button) triggerControlBox.Add(self.trigger4Button, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) triggerSizer.Add(triggerControlBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.sizer.Add(triggerSizer)
def initMethod(self): methodControlBox = widgets.ControlBox(self, label='Method', orient=wx.VERTICAL) self.methodComboBox = wx.ComboBox( self, value=self.pg.method, style=wx.CB_READONLY, choices=('Welch Power', 'Autoregressive', 'Time Embedded Net', 'Convolutional Net')) self.Bind(wx.EVT_COMBOBOX, self.setMethod, self.methodComboBox) self.offlineControls += [self.methodComboBox] methodControlBox.Add(self.methodComboBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.sizer.Add(methodControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.methodConfigSizer = wx.BoxSizer(orient=wx.VERTICAL) self.welchPanel = WelchConfigPanel(self, pg=self.pg, cp=self) self.methodConfigSizer.Add(self.welchPanel, proportion=1, flag=wx.EXPAND) self.autoregPanel = AutoregConfigPanel(self, pg=self.pg, cp=self) self.methodConfigSizer.Add(self.autoregPanel, proportion=1, flag=wx.EXPAND) self.tdeNetPanel = ConvNetConfigPanel(self, pg=self.pg, cp=self) self.methodConfigSizer.Add(self.tdeNetPanel, proportion=1, flag=wx.EXPAND) self.convNetPanel = ConvNetConfigPanel(self, pg=self.pg, cp=self) self.methodConfigSizer.Add(self.convNetPanel, proportion=1, flag=wx.EXPAND) self.sizer.Add(self.methodConfigSizer, proportion=1, flag=wx.EXPAND) self.methodConfig = self.welchPanel
def initDeviceControls(self): deviceControlBox = widgets.ControlBox(self, label='Device Path', orient=wx.HORIZONTAL) self.deviceTextCtrl = wx.TextCtrl(self, value=self.src.getDeviceName()) self.Bind(wx.EVT_TEXT, self.setDeviceName, self.deviceTextCtrl) deviceControlBox.Add(self.deviceTextCtrl, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.sizer.Add(deviceControlBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10)
def initPollSizeSelector(self): pollSizeControlBox = widgets.ControlBox(self, label='Poll Size', orient=wx.HORIZONTAL) self.pollSizeSpinCtrl = wx.SpinCtrl(self, style=wx.SP_WRAP, value=str(self.src.pollSize), min=1, max=32) pollSizeControlBox.Add(self.pollSizeSpinCtrl, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_SPINCTRL, self.setPollSize, self.pollSizeSpinCtrl) self.sizer.Add(pollSizeControlBox, proportion=0, flag=wx.ALL, border=10)
def initChoices(self): choiceControlBox = widgets.ControlBox(self, label='Choices', orient=wx.VERTICAL) self.choiceTextCtrl = wx.TextCtrl(parent=self, value=', '.join(self.pg.choices), style=wx.TE_PROCESS_ENTER) choiceControlBox.Add(self.choiceTextCtrl, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.choiceTextCtrl.Bind(wx.EVT_KILL_FOCUS, self.setChoices, self.choiceTextCtrl) self.offlineControls += [self.choiceTextCtrl] self.sizer.Add(choiceControlBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10)
def initChoices(self): choiceControlBox = widgets.ControlBox(self, label='Choices', orient=wx.VERTICAL) choiceGridSizer = wx.GridSizer(1, 2, 10, 10) self.leftChoiceTextCtrl = wx.TextCtrl(parent=self, value=self.pg.choices[0], style=wx.TE_PROCESS_ENTER) self.Bind(wx.EVT_TEXT_ENTER, self.setChoices, self.leftChoiceTextCtrl) self.leftChoiceTextCtrl.Bind(wx.EVT_KILL_FOCUS, self.setChoices, self.leftChoiceTextCtrl) self.offlineControls += [self.leftChoiceTextCtrl] choiceGridSizer.Add(self.leftChoiceTextCtrl, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.rightChoiceTextCtrl = wx.TextCtrl(parent=self, value=self.pg.choices[1], style=wx.TE_PROCESS_ENTER) self.Bind(wx.EVT_TEXT_ENTER, self.setChoices, self.rightChoiceTextCtrl) self.rightChoiceTextCtrl.Bind(wx.EVT_KILL_FOCUS, self.setChoices, self.rightChoiceTextCtrl) self.offlineControls += [self.rightChoiceTextCtrl] choiceGridSizer.Add(self.rightChoiceTextCtrl, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) choiceControlBox.Add(choiceGridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=0) self.sizer.Add(choiceControlBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10)
def initRateControls(self): """Initialize the sample rate and poll size controls. """ rateSizer = wx.BoxSizer(orient=wx.VERTICAL) pollSizeControlBox = widgets.ControlBox(self, label='Poll Size', orient=wx.HORIZONTAL) self.pollSizeSpinCtrl = wx.SpinCtrl(self, style=wx.SP_WRAP, value=str(self.src.pollSize), min=1, max=32) pollSizeControlBox.Add(self.pollSizeSpinCtrl, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_SPINCTRL, self.setPollSize, self.pollSizeSpinCtrl) rateSizer.Add(pollSizeControlBox, proportion=0, flag=wx.BOTTOM | wx.RIGHT | wx.TOP, border=10) self.sizer.Add(rateSizer)
def initControls(self): orderControlBox = widgets.ControlBox(self, label='Model Order', orient=wx.HORIZONTAL) self.orderText = wx.StaticText(self, label='%3d' % self.pg.autoregConfig.order) orderTextSizer = wx.BoxSizer(orient=wx.VERTICAL) orderTextSizer.Add(self.orderText, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=8) self.orderSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=self.pg.autoregConfig.order, minValue=1, maxValue=100) orderControlBox.Add(orderTextSizer, proportion=0, flag=wx.TOP, border=10) orderControlBox.Add(self.orderSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_SLIDER, self.setOrder, self.orderSlider) self.sizer.Add(orderControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) nFreqControlBox = widgets.ControlBox(self, label='Num Freqs', orient=wx.HORIZONTAL) self.nFreqText = wx.StaticText(self, label='%3d' % self.pg.autoregConfig.nFreq) nFreqTextSizer = wx.BoxSizer(orient=wx.VERTICAL) nFreqTextSizer.Add(self.nFreqText, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=8) self.nFreqSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=self.pg.autoregConfig.nFreq / 5, minValue=1, maxValue=100) nFreqControlBox.Add(nFreqTextSizer, proportion=0, flag=wx.TOP, border=10) nFreqControlBox.Add(self.nFreqSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_SLIDER, self.setNFreq, self.nFreqSlider) self.sizer.Add(nFreqControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10)
def initControls(self): # combobox for selecting filtered or non-filtered signal self.filterControlBox = widgets.ControlBox(self, label='Signal', orient=wx.VERTICAL) self.filterComboBox = wx.ComboBox(self, choices=('Raw', 'Filtered'), value='Filtered', style=wx.CB_READONLY) self.filterControlBox.Add(self.filterComboBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_COMBOBOX, self.setFilter, self.filterComboBox) # slider for controlling width of window # since sliders are int, we use divide by 4 to get float value self.widthControlBox = widgets.ControlBox(self, label='Width', orient=wx.HORIZONTAL) self.widthText = wx.StaticText(self, label='%5.2f(s)' % self.pg.width) widthTextSizer = wx.BoxSizer(orient=wx.VERTICAL) widthTextSizer.Add(self.widthText, proportion=1, flag=wx.EXPAND) self.widthSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=int(self.pg.width * 4.0), minValue=12, maxValue=120) self.widthControlBox.Add(widthTextSizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.widthControlBox.Add(self.widthSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_SLIDER, self.setWidth, self.widthSlider) # radio buttons for selection decimation factor self.decimateControlBox = widgets.ControlBox(self, label='Decimation', orient=wx.HORIZONTAL) # list of buttons, first button determines group rbtns = [wx.RadioButton(self, label='None', style=wx.RB_GROUP)] + \ [wx.RadioButton(self, label=l) for l in ('1/2', '1/4', '1/8')] rbtns[0].SetValue(True) # select first button to start # bind callbacks to each radio button with appropriate factors for rbtn, factor in zip(rbtns, (1, 2, 4, 8)): # Uses lexical scoping to save ratio for each button. def setDecimationWrapper(event, factor=factor): self.setDecimation(factor=factor) self.Bind(wx.EVT_RADIOBUTTON, setDecimationWrapper, rbtn) for rbtn in rbtns[:-1]: self.decimateControlBox.Add(rbtn, proportion=0, flag=wx.TOP | wx.LEFT | wx.BOTTOM, border=10) self.decimateControlBox.Add(rbtns[-1], proportion=0, flag=wx.ALL, border=10) # radio buttons for selecting plot quality self.qualityControlBox = widgets.ControlBox(self, label='Plot Quality', orient=wx.HORIZONTAL) # low quality radio button # first button determines group using wx.RB_GROUP lowQualityRbtn = wx.RadioButton(self, label='Low', style=wx.RB_GROUP) self.Bind(wx.EVT_RADIOBUTTON, self.setLowQuality, lowQualityRbtn) self.qualityControlBox.Add(lowQualityRbtn, proportion=0, flag=wx.ALL, border=10) # medium quality radio button mediumQualityRbtn = wx.RadioButton(self, label='Medium') mediumQualityRbtn.SetValue(True) self.Bind(wx.EVT_RADIOBUTTON, self.setMediumQuality, mediumQualityRbtn) self.qualityControlBox.Add(mediumQualityRbtn, proportion=0, flag=wx.ALL, border=10) # high quality radio button highQualityRbtn = wx.RadioButton(self, label='High') self.Bind(wx.EVT_RADIOBUTTON, self.setHighQuality, highQualityRbtn) self.qualityControlBox.Add(highQualityRbtn, proportion=0, flag=wx.ALL, border=10) # slider for selecting delay between consecutive refreshes of the plot self.refreshControlBox = widgets.ControlBox(self, label='Refresh', orient=wx.HORIZONTAL) self.refreshText = wx.StaticText(self, label='%4d(ms)' % int(self.pg.getRefreshDelay()), style=wx.ALIGN_CENTER) refreshTextSizer = wx.BoxSizer(orient=wx.VERTICAL) refreshTextSizer.Add(self.refreshText, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=8) self.refreshSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=int(self.pg.getRefreshDelay() / 10), minValue=1, maxValue=200) self.refreshControlBox.Add(refreshTextSizer, proportion=0, flag=wx.TOP, border=10) self.refreshControlBox.Add(self.refreshSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_SLIDER, self.setRefresh, self.refreshSlider) # combobox for selecting PSD estimation method self.methodControlBox = widgets.ControlBox(self, label='Method', orient=wx.VERTICAL) self.methodComboBox = wx.ComboBox(self, choices=('FFT+Welch', 'AR Model'), value='FFT+Welch', style=wx.CB_READONLY) self.methodControlBox.Add(self.methodComboBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_COMBOBOX, self.setMethod, self.methodComboBox) self.methodConfigSizer = wx.BoxSizer(orient=wx.VERTICAL) self.welchPanel = WelchConfigPanel(self, pg=self.pg) self.methodConfigSizer.Add(self.welchPanel, proportion=1, flag=wx.EXPAND) self.autoregPanel = AutoregConfigPanel(self, pg=self.pg) self.methodConfigSizer.Add(self.autoregPanel, proportion=1, flag=wx.EXPAND) self.methodConfigPanel = self.welchPanel
def initSigControls(self): """Initialize signal controls. """ sigSizer = wx.BoxSizer(orient=wx.VERTICAL) scaleControlBox = widgets.ControlBox(self, label='Noise Scale', orient=wx.HORIZONTAL) self.scaleText = wx.StaticText(self, label='%4.1f' % self.src.scale.value) scaleTextSizer = wx.BoxSizer(orient=wx.VERTICAL) scaleTextSizer.Add(self.scaleText, proportion=1, flag=wx.EXPAND) self.scaleSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=self.src.scale.value * 10.0, minValue=1, maxValue=300) self.Bind(wx.EVT_SLIDER, self.setScale, self.scaleSlider) scaleControlBox.Add(scaleTextSizer, proportion=0, flag=wx.ALL, border=10) scaleControlBox.Add(self.scaleSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) sigSizer.Add(scaleControlBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) erpSpeedControlBox = widgets.ControlBox(self, label='ERP Speed', orient=wx.HORIZONTAL) self.erpSpeedText = wx.StaticText(self, label='%4.1f' % self.src.erpSpeed.value) erpSpeedTextSizer = wx.BoxSizer(orient=wx.VERTICAL) erpSpeedTextSizer.Add(self.erpSpeedText, proportion=1, flag=wx.EXPAND) self.erpSpeedSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=self.src.erpSpeed.value * 10.0, minValue=1, maxValue=300) self.Bind(wx.EVT_SLIDER, self.setERPSpeed, self.erpSpeedSlider) erpSpeedControlBox.Add(erpSpeedTextSizer, proportion=0, flag=wx.ALL, border=10) erpSpeedControlBox.Add(self.erpSpeedSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) sigSizer.Add(erpSpeedControlBox, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT, border=10) triggerControlBox = widgets.ControlBox(self, label='Trigger', orient=wx.HORIZONTAL) self.triggerValueTextCtrl = wx.TextCtrl( self, value=str(self.src.trigger.value)) #, style=wx.TE_PROCESS_ENTER) self.Bind(wx.EVT_TEXT, self.setTrigger, self.triggerValueTextCtrl) self.triggerButton = wx.Button(self, label='Manual') self.Bind(wx.EVT_BUTTON, self.manualTrigger, self.triggerButton) triggerControlBox.Add(self.triggerValueTextCtrl, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) triggerControlBox.Add(self.triggerButton, proportion=1, flag=wx.TOP | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=10) sigSizer.Add(triggerControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.sizer.Add(sigSizer)
def initBottombar(self): """Initialize controls at bottom of panel. """ # sizer for bottom of configPanel self.bottombar = wx.BoxSizer(orient=wx.HORIZONTAL) # slider for controlling width of trace # since sliders are int, we use divide by 4 to get float value widthControlBox = widgets.ControlBox(self, label='Width', orient=wx.VERTICAL) self.widthText = wx.StaticText(self, label='%6.2f(s)' % self.pg.width) widthTextSizer = wx.BoxSizer(orient=wx.VERTICAL) widthTextSizer.Add(self.widthText, proportion=0, flag=wx.ALIGN_CENTER_HORIZONTAL) self.widthSlider = wx.Slider(self, style=wx.SL_VERTICAL, value=int(self.pg.width * 4.0), minValue=1, maxValue=240) widthControlBox.Add(widthTextSizer, proportion=0, flag=wx.TOP | wx.BOTTOM | wx.EXPAND, border=8) widthControlBox.Add(self.widthSlider, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=25) self.Bind(wx.EVT_SLIDER, self.setWidth, self.widthSlider) # add widthControlBox to bottombar sizer self.bottombar.Add(widthControlBox, proportion=1, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) # slider for controlling scale of trace # since sliders are int, we use divide by 4 to get float value # zero results in automagic scaling scaleControlBox = widgets.ControlBox(self, label='Scale', orient=wx.VERTICAL) self.scaleText = wx.StaticText(self, label='auto ') scaleTextSizer = wx.BoxSizer(orient=wx.VERTICAL) scaleTextSizer.Add(self.scaleText, proportion=0, flag=wx.ALIGN_CENTER_HORIZONTAL) self.scaleSlider = wx.Slider(self, style=wx.SL_VERTICAL, value=self.pg.scale, minValue=0, maxValue=5000) scaleControlBox.Add(scaleTextSizer, proportion=0, flag=wx.TOP | wx.BOTTOM | wx.EXPAND, border=8) scaleControlBox.Add(self.scaleSlider, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=25) self.Bind(wx.EVT_SLIDER, self.setScale, self.scaleSlider) # add scaleControlBox to bottombar sizer self.bottombar.Add(scaleControlBox, proportion=1, flag=wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) # slider for selecting delay between consecutive refreshes of the trace refreshControlBox = widgets.ControlBox(self, label='Refresh', orient=wx.VERTICAL) self.refreshText = wx.StaticText(self, label='%3d(ms)' % int(self.pg.getRefreshDelay())) refreshTextSizer = wx.BoxSizer(orient=wx.VERTICAL) refreshTextSizer.Add(self.refreshText, proportion=0, flag=wx.ALIGN_CENTER_HORIZONTAL) self.refreshSlider = wx.Slider(self, style=wx.SL_VERTICAL, value=int(self.pg.getRefreshDelay() / 10), minValue=1, maxValue=200) refreshControlBox.Add(refreshTextSizer, proportion=0, flag=wx.TOP | wx.BOTTOM | wx.EXPAND, border=8) refreshControlBox.Add(self.refreshSlider, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=25) self.Bind(wx.EVT_SLIDER, self.setRefresh, self.refreshSlider) # add refreshControlBox to bottombar sizer self.bottombar.Add(refreshControlBox, proportion=1, flag=wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) # make sure sliders don't collapse vertically all the way when undocked minX, minY = self.bottombar.GetMinSize() minY *= 3 self.bottombar.SetMinSize((minX, minY)) self.sizer.Add(self.bottombar, proportion=1, flag=wx.EXPAND)
def initTopbar(self): """Initialize controls at top of panel. """ # sizer for top of config panel self.topbar = wx.BoxSizer(orient=wx.VERTICAL) # combobox for selecting filtered or non-filtered signal filterControlBox = widgets.ControlBox(self, label='Signal', orient=wx.VERTICAL) self.filterComboBox = wx.ComboBox(self, choices=('Raw', 'Filtered'), value='FIltered', style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.setFilter, self.filterComboBox) filterControlBox.Add(self.filterComboBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) # add filterControlBox to topbar sizer self.topbar.Add(filterControlBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) # radio buttons for turning marker channel on and off markerControlBox = widgets.ControlBox(self, label='Marker Channel', orient=wx.HORIZONTAL) markerOnRbtn = wx.RadioButton(self, label='On', style=wx.RB_GROUP) self.Bind(wx.EVT_RADIOBUTTON, self.setMarkerOn, markerOnRbtn) markerControlBox.Add(markerOnRbtn, proportion=0, flag=wx.ALL, border=10) markerOffRbtn = wx.RadioButton(self, label='Off') markerOffRbtn.SetValue(True) self.Bind(wx.EVT_RADIOBUTTON, self.setMarkerOff, markerOffRbtn) markerControlBox.Add(markerOffRbtn, proportion=0, flag=wx.ALL, border=10) # add markerControlBox to topbar sizer self.topbar.Add(markerControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) # radio buttons for selecting plot quality qualityControlBox = widgets.ControlBox(self, label='Plot Quality', orient=wx.HORIZONTAL) # low quality radio button # first button determines group using wx.RB_GROUP lowQualityRbtn = wx.RadioButton(self, label='Low', style=wx.RB_GROUP) self.Bind(wx.EVT_RADIOBUTTON, self.setLowQuality, lowQualityRbtn) qualityControlBox.Add(lowQualityRbtn, proportion=0, flag=wx.ALL, border=10) # medium quality radio button mediumQualityRbtn = wx.RadioButton(self, label='Medium') mediumQualityRbtn.SetValue(True) self.Bind(wx.EVT_RADIOBUTTON, self.setMediumQuality, mediumQualityRbtn) qualityControlBox.Add(mediumQualityRbtn, proportion=0, flag=wx.ALL, border=10) # high quality radio button highQualityRbtn = wx.RadioButton(self, label='High') self.Bind(wx.EVT_RADIOBUTTON, self.setHighQuality, highQualityRbtn) qualityControlBox.Add(highQualityRbtn, proportion=0, flag=wx.ALL, border=10) # add qualityControlBox to topbar sizer self.topbar.Add(qualityControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) # radio buttons for selection decimation factor decimateControlBox = widgets.ControlBox(self, label='Decimation', orient=wx.HORIZONTAL) # list of buttons, first button determines group rbtns = [wx.RadioButton(self, label='None', style=wx.RB_GROUP)] + \ [wx.RadioButton(self, label=l) for l in ('1/2', '1/4', '1/8')] rbtns[0].SetValue(True) # select first button to start # bind callbacks to each radio button with appropriate factors for rbtn, factor in zip(rbtns, (1, 2, 4, 8)): # Uses lexical scoping to save ratio for each button. def setDecimationWrapper(event, factor=factor): self.setDecimation(factor=factor) self.Bind(wx.EVT_RADIOBUTTON, setDecimationWrapper, rbtn) #decimateControlBox.Add(rbtn, proportion=0, flag=wx.ALL, border=10) for rbtn in rbtns[:-1]: decimateControlBox.Add(rbtn, proportion=0, flag=wx.TOP | wx.LEFT | wx.BOTTOM, border=10) decimateControlBox.Add(rbtns[-1], proportion=0, flag=wx.ALL, border=10) # add decimateControlBox to topbar sizer self.topbar.Add(decimateControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, border=10) self.sizer.Add(self.topbar, proportion=0, flag=wx.EXPAND)
def initControls(self): # combobox for selecting filtered or non-filtered signal self.filterControlBox = widgets.ControlBox(self, label='Signal', orient=wx.VERTICAL) self.filterComboBox = wx.ComboBox(self, choices=('Raw', 'Filtered'), value='Filtered', style=wx.CB_READONLY) self.filterControlBox.Add(self.filterComboBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_COMBOBOX, self.setFilter, self.filterComboBox) # combobox for selecting the displayed channel self.chanControlBox = widgets.ControlBox(self, label='Channel', orient=wx.VERTICAL) self.chanComboBox = wx.ComboBox(self, choices=[''], value='', style=wx.CB_READONLY) self.updateChannels() self.chanControlBox.Add(self.chanComboBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_COMBOBOX, self.setChannel, self.chanComboBox) # slider for controlling width of window # since sliders are int, we use divide by 4 to get float value self.widthControlBox = widgets.ControlBox(self, label='Width', orient=wx.HORIZONTAL) self.widthText = wx.StaticText(self, label='%5.2f(s)' % self.pg.width) widthTextSizer = wx.BoxSizer(orient=wx.VERTICAL) widthTextSizer.Add(self.widthText, proportion=1, flag=wx.EXPAND) self.widthSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=int(self.pg.width * 4.0), minValue=12, maxValue=120) self.widthControlBox.Add(widthTextSizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.widthControlBox.Add(self.widthSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_SLIDER, self.setWidth, self.widthSlider) # scaleControlBox contains slider and radio buttons self.scaleControlBox = widgets.ControlBox(self, label='Scale', orient=wx.VERTICAL) # slider for adjusting the scale of power density in the plot scaleSliderSizer = wx.BoxSizer(orient=wx.HORIZONTAL) self.scaleText = wx.StaticText(self, label='10^%4.2f' % int(self.pg.scale), style=wx.ALIGN_CENTER) scaleTextSizer = wx.BoxSizer(orient=wx.VERTICAL) scaleTextSizer.Add(self.scaleText, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=8) self.scaleSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=int(self.pg.scale * 4), minValue=-16, maxValue=40) scaleSliderSizer.Add(scaleTextSizer, proportion=0, flag=wx.TOP, border=8) scaleSliderSizer.Add(self.scaleSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=8) self.Bind(wx.EVT_SLIDER, self.setScale, self.scaleSlider) self.scaleControlBox.Add(scaleSliderSizer, proportion=1, flag=wx.ALL | wx.EXPAND) # radio buttons for selecting log or linear scale scaleRBtnSizer = wx.BoxSizer(orient=wx.HORIZONTAL) linScaleRbtn = wx.RadioButton(self, label='Linear', style=wx.RB_GROUP) self.Bind(wx.EVT_RADIOBUTTON, self.setLinScale, linScaleRbtn) scaleRBtnSizer.Add(linScaleRbtn, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT, border=8) logScaleRbtn = wx.RadioButton(self, label='Log10') logScaleRbtn.SetValue(True) self.Bind(wx.EVT_RADIOBUTTON, self.setLogScale, logScaleRbtn) scaleRBtnSizer.Add(logScaleRbtn, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT, border=8) self.scaleControlBox.Add(scaleRBtnSizer, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER_HORIZONTAL) # radio buttons for selection decimation factor self.decimateControlBox = widgets.ControlBox(self, label='Decimation', orient=wx.HORIZONTAL) # list of buttons, first button determines group rbtns = [wx.RadioButton(self, label='None', style=wx.RB_GROUP)] + \ [wx.RadioButton(self, label=l) for l in ('1/2', '1/4', '1/8')] rbtns[0].SetValue(True) # select first button to start # bind callbacks to each radio button with appropriate factors for rbtn, factor in zip(rbtns, (1, 2, 4, 8)): # Uses lexical scoping to save ratio for each button. def setDecimationWrapper(event, factor=factor): self.setDecimation(factor=factor) self.Bind(wx.EVT_RADIOBUTTON, setDecimationWrapper, rbtn) for rbtn in rbtns[:-1]: self.decimateControlBox.Add(rbtn, proportion=0, flag=wx.TOP | wx.LEFT | wx.BOTTOM, border=10) self.decimateControlBox.Add(rbtns[-1], proportion=0, flag=wx.ALL, border=10) # radio buttons for selecting plot interpolation self.interpControlBox = widgets.ControlBox(self, label='Interpolation', orient=wx.HORIZONTAL) # no interpolation radio button # first button determines group using wx.RB_GROUP noInterpRbtn = wx.RadioButton(self, label='None', style=wx.RB_GROUP) noInterpRbtn.SetValue(True) self.Bind(wx.EVT_RADIOBUTTON, self.setNoInterp, noInterpRbtn) self.interpControlBox.Add(noInterpRbtn, proportion=0, flag=wx.TOP | wx.LEFT | wx.BOTTOM, border=10) # bicubic interpolation radio button nearInterpRbtn = wx.RadioButton(self, label='Bicubic') self.Bind(wx.EVT_RADIOBUTTON, self.setBicubicInterp, nearInterpRbtn) self.interpControlBox.Add(nearInterpRbtn, proportion=0, flag=wx.TOP | wx.LEFT | wx.BOTTOM, border=10) # lanczos interpolation radio button lanczosInterpRbtn = wx.RadioButton(self, label='Lanczos') self.Bind(wx.EVT_RADIOBUTTON, self.setLanczosInterp, lanczosInterpRbtn) self.interpControlBox.Add(lanczosInterpRbtn, proportion=0, flag=wx.ALL, border=10) # slider for selecting delay between consecutive refreshes of the plot self.refreshControlBox = widgets.ControlBox(self, label='Refresh', orient=wx.HORIZONTAL) self.refreshText = wx.StaticText(self, label='%4d(ms)' % int(self.pg.getRefreshDelay()), style=wx.ALIGN_CENTER) refreshTextSizer = wx.BoxSizer(orient=wx.VERTICAL) refreshTextSizer.Add(self.refreshText, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=8) self.refreshSlider = wx.Slider(self, style=wx.SL_HORIZONTAL, value=int(self.pg.getRefreshDelay() / 10), minValue=1, maxValue=200) self.refreshControlBox.Add(refreshTextSizer, proportion=0, flag=wx.TOP, border=10) self.refreshControlBox.Add(self.refreshSlider, proportion=1, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_SLIDER, self.setRefresh, self.refreshSlider) # combobox for selecting PSD estimation method self.methodControlBox = widgets.ControlBox(self, label='Method', orient=wx.VERTICAL) self.methodComboBox = wx.ComboBox(self, choices=('Wavelet', 'Fourier'), value='Wavelet', style=wx.CB_READONLY) self.methodControlBox.Add(self.methodComboBox, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.Bind(wx.EVT_COMBOBOX, self.setMethod, self.methodComboBox) self.methodConfigSizer = wx.BoxSizer(orient=wx.VERTICAL) self.waveletPanel = WaveletConfigPanel(self, pg=self.pg) self.methodConfigSizer.Add(self.waveletPanel, proportion=1, flag=wx.EXPAND) self.fourierPanel = FourierConfigPanel(self, pg=self.pg) self.methodConfigSizer.Add(self.fourierPanel, proportion=1, flag=wx.EXPAND) self.methodConfigPanel = self.waveletPanel
def initRateControls(self): # sample rate config rateSizer = wx.BoxSizer(orient=wx.HORIZONTAL) sampRates = np.array((64, 128, 256, 512, 1024)) self.sampRateRadios = [wx.RadioButton(self, label=str(sampRates[0])+'Hz', style=wx.RB_GROUP)] +\ [wx.RadioButton(self, label=str(sr)+'Hz') for sr in sampRates[1:]] self.sampRateRadios[2].SetValue(True) sampRateControlBox = widgets.ControlBox(self, label='Sample Rate', orient=wx.VERTICAL) for sr, rbtn in zip(sampRates, self.sampRateRadios): def sampRadioWrapper(event, sr=sr): try: self.src.setSampRate(sr) except Exception as e: wx.LogError('Failed to set sample rate: ' + str(e.message)) self.Bind(wx.EVT_RADIOBUTTON, sampRadioWrapper, id=rbtn.GetId()) for rbtn in self.sampRateRadios[:-1]: sampRateControlBox.Add(rbtn, proportion=0, flag=wx.TOP | wx.LEFT | wx.RIGHT, border=10) sampRateControlBox.Add(self.sampRateRadios[-1], proportion=0, flag=wx.ALL, border=10) rateSizer.Add(sampRateControlBox, proportion=0, flag=wx.LEFT | wx.BOTTOM | wx.RIGHT, border=10) # block size config blockSizes = np.array((96, 192, 384, 768)) self.blockSizeRadios = [wx.RadioButton(self, label=str(blockSizes[0])+'KB', style=wx.RB_GROUP)] +\ [wx.RadioButton(self, label=str(bs)+'KB') for bs in blockSizes[1:]] self.blockSizeRadios[3].SetValue(True) blockSizeControlBox = widgets.ControlBox(self, label='Block Size', orient=wx.VERTICAL) for bs, rbtn in zip(blockSizes, self.blockSizeRadios): def sampRadioWrapper(event, bs=bs): try: self.src.setBlockSize(bs) except Exception as e: wx.LogError('Failed to set block size: ' + str(e.message)) self.Bind(wx.EVT_RADIOBUTTON, sampRadioWrapper, id=rbtn.GetId()) for rbtn in self.blockSizeRadios[:-1]: blockSizeControlBox.Add(rbtn, proportion=0, flag=wx.TOP | wx.LEFT | wx.RIGHT, border=10) blockSizeControlBox.Add(self.blockSizeRadios[-1], proportion=0, flag=wx.ALL, border=10) rateSizer.Add(blockSizeControlBox, proportion=0, flag=wx.BOTTOM | wx.RIGHT, border=10) self.sizer.Add(rateSizer)