def __init__(self, parent): """ Create a new control panel. @param parent the wx parent window """ self.parent = parent wx.Panel.__init__(self, parent, style=wx.SUNKEN_BORDER) parent[constants.SHOW_CONTROL_PANEL_KEY] = True parent.subscribe(constants.SHOW_CONTROL_PANEL_KEY, self.Show) control_box = wx.BoxSizer(wx.VERTICAL) control_box.AddStretchSpacer() #checkboxes for average and peak hold options_box = forms.static_box_sizer( parent=self, sizer=control_box, label='Trace Options', bold=True, orient=wx.VERTICAL, ) forms.check_box( sizer=options_box, parent=self, label='Peak Hold', ps=parent, key=constants.PEAK_HOLD_KEY, ) forms.check_box( sizer=options_box, parent=self, label='Average', ps=parent, key=constants.AVERAGE_KEY, ) #static text and slider for averaging avg_alpha_text = forms.static_text( sizer=options_box, parent=self, label='Avg Alpha', converter=forms.float_converter(lambda x: '%.4f'%x), ps=parent, key=constants.AVG_ALPHA_KEY, width=50, ) avg_alpha_slider = forms.log_slider( sizer=options_box, parent=self, min_exp=AVG_ALPHA_MIN_EXP, max_exp=AVG_ALPHA_MAX_EXP, num_steps=SLIDER_STEPS, ps=parent, key=constants.AVG_ALPHA_KEY, ) for widget in (avg_alpha_text, avg_alpha_slider): parent.subscribe(constants.AVERAGE_KEY, widget.Enable) widget.Enable(parent[constants.AVERAGE_KEY]) parent.subscribe(constants.AVERAGE_KEY, widget.ShowItems) #allways show initially, so room is reserved for them widget.ShowItems(True) # (parent[AVERAGE_KEY]) parent.subscribe(constants.AVERAGE_KEY, self._update_layout) forms.check_box( sizer=options_box, parent=self, label='Persistence', ps=parent, key=constants.USE_PERSISTENCE_KEY, ) #static text and slider for persist alpha persist_alpha_text = forms.static_text( sizer=options_box, parent=self, label='Persist Alpha', converter=forms.float_converter(lambda x: '%.4f'%x), ps=parent, key=constants.PERSIST_ALPHA_KEY, width=50, ) persist_alpha_slider = forms.log_slider( sizer=options_box, parent=self, min_exp=PERSIST_ALPHA_MIN_EXP, max_exp=PERSIST_ALPHA_MAX_EXP, num_steps=SLIDER_STEPS, ps=parent, key=constants.PERSIST_ALPHA_KEY, ) for widget in (persist_alpha_text, persist_alpha_slider): parent.subscribe(constants.USE_PERSISTENCE_KEY, widget.Enable) widget.Enable(parent[constants.USE_PERSISTENCE_KEY]) parent.subscribe(constants.USE_PERSISTENCE_KEY, widget.ShowItems) #allways show initially, so room is reserved for them widget.ShowItems(True) # (parent[USE_PERSISTENCE_KEY]) parent.subscribe(constants.USE_PERSISTENCE_KEY, self._update_layout) #trace menu for trace in TRACES: trace_box = wx.BoxSizer(wx.HORIZONTAL) options_box.Add(trace_box, 0, wx.EXPAND) forms.check_box( sizer=trace_box, parent=self, ps=parent, key=constants.TRACE_SHOW_KEY+trace, label='Trace %s'%trace, ) trace_box.AddSpacer(10) forms.single_button( sizer=trace_box, parent=self, ps=parent, key=constants.TRACE_STORE_KEY+trace, label='Store', style=wx.BU_EXACTFIT, ) trace_box.AddSpacer(10) #radio buttons for div size control_box.AddStretchSpacer() y_ctrl_box = forms.static_box_sizer( parent=self, sizer=control_box, label='Axis Options', bold=True, orient=wx.VERTICAL, ) forms.incr_decr_buttons( parent=self, sizer=y_ctrl_box, label='dB/Div', on_incr=self._on_incr_db_div, on_decr=self._on_decr_db_div, ) #ref lvl buttons forms.incr_decr_buttons( parent=self, sizer=y_ctrl_box, label='Ref Level', on_incr=self._on_incr_ref_level, on_decr=self._on_decr_ref_level, ) y_ctrl_box.AddSpacer(2) #autoscale forms.single_button( sizer=y_ctrl_box, parent=self, label='Autoscale', callback=self.parent.autoscale, ) #run/stop control_box.AddStretchSpacer() forms.toggle_button( sizer=control_box, parent=self, true_label='Stop', false_label='Run', ps=parent, key=constants.RUNNING_KEY, ) #set sizer self.SetSizerAndFit(control_box) def on_mouse_wheel(event): """ Mouse wheel event """ if event.GetWheelRotation() < 0: self._on_incr_ref_level(event) else: self._on_decr_ref_level(event) parent.plotter.Bind(wx.EVT_MOUSEWHEEL, on_mouse_wheel)
def build_gui(self): self.vbox.AddSpacer(5) self.vbox.AddStretchSpacer() ################################################## # Baseband controls ################################################## bb_vbox = forms.static_box_sizer(parent=self.panel, label="Baseband Modulation", orient=wx.VERTICAL, bold=True) self.vbox.Add(bb_vbox, 0, wx.EXPAND) sine_bb_hbox = wx.BoxSizer(wx.HORIZONTAL) sweep_bb_hbox = wx.BoxSizer(wx.HORIZONTAL) tone_bb_hbox = wx.BoxSizer(wx.HORIZONTAL) self.vbox.AddSpacer(10) self.vbox.AddStretchSpacer() #callback to show/hide forms def set_type(type): sine_bb_hbox.ShowItems(type == gr.GR_SIN_WAVE) sweep_bb_hbox.ShowItems(type == 'sweep') tone_bb_hbox.ShowItems(type == '2tone') self.vbox.Layout() self.tb.subscribe(usrp_siggen.TYPE_KEY, set_type) #create sine forms sine_bb_hbox.AddSpacer(10) forms.text_box( parent=self.panel, sizer=sine_bb_hbox, label='Frequency (Hz)', ps=self.tb, key=usrp_siggen.WAVEFORM_FREQ_KEY, converter=forms.float_converter(), ) sine_bb_hbox.AddStretchSpacer() #create sweep forms sweep_bb_hbox.AddSpacer(10) forms.text_box( parent=self.panel, sizer=sweep_bb_hbox, label='Sweep Width (Hz)', ps=self.tb, key=usrp_siggen.WAVEFORM_FREQ_KEY, converter=forms.float_converter(), ) sweep_bb_hbox.AddStretchSpacer() forms.text_box( parent=self.panel, sizer=sweep_bb_hbox, label='Sweep Rate (Hz)', ps=self.tb, key=usrp_siggen.WAVEFORM2_FREQ_KEY, converter=forms.float_converter(), ) sweep_bb_hbox.AddStretchSpacer() #create 2tone forms tone_bb_hbox.AddSpacer(10) forms.text_box( parent=self.panel, sizer=tone_bb_hbox, label='Tone 1 (Hz)', ps=self.tb, key=usrp_siggen.WAVEFORM_FREQ_KEY, converter=forms.float_converter(), ) tone_bb_hbox.AddStretchSpacer() forms.text_box( parent=self.panel, sizer=tone_bb_hbox, label='Tone 2 (Hz)', ps=self.tb, key=usrp_siggen.WAVEFORM2_FREQ_KEY, converter=forms.float_converter(), ) tone_bb_hbox.AddStretchSpacer() forms.radio_buttons( parent=self.panel, sizer=bb_vbox, choices=usrp_siggen.waveforms.keys(), labels=usrp_siggen.waveforms.values(), ps=self.tb, key=usrp_siggen.TYPE_KEY, style=wx.NO_BORDER | wx.RA_HORIZONTAL, ) bb_vbox.AddSpacer(10) bb_vbox.Add(sine_bb_hbox, 0, wx.EXPAND) bb_vbox.Add(sweep_bb_hbox, 0, wx.EXPAND) bb_vbox.Add(tone_bb_hbox, 0, wx.EXPAND) set_type(self.tb[usrp_siggen.TYPE_KEY]) ################################################## # Frequency controls ################################################## fc_vbox = forms.static_box_sizer(parent=self.panel, label="Center Frequency", orient=wx.VERTICAL, bold=True) fc_vbox.AddSpacer(5) # First row of frequency controls (center frequency) freq_hbox = wx.BoxSizer(wx.HORIZONTAL) fc_vbox.Add(freq_hbox, 0, wx.EXPAND) fc_vbox.AddSpacer(10) # Second row of frequency controls (results) tr_hbox = wx.BoxSizer(wx.HORIZONTAL) fc_vbox.Add(tr_hbox, 0, wx.EXPAND) fc_vbox.AddSpacer(5) # Add frequency controls to top window sizer self.vbox.Add(fc_vbox, 0, wx.EXPAND) self.vbox.AddSpacer(10) self.vbox.AddStretchSpacer() freq_hbox.AddSpacer(5) forms.text_box( parent=self.panel, sizer=freq_hbox, proportion=1, converter=forms.float_converter(), ps=self.tb, key=usrp_siggen.TX_FREQ_KEY, ) freq_hbox.AddSpacer(10) forms.slider( parent=self.panel, sizer=freq_hbox, proportion=2, ps=self.tb, key=usrp_siggen.TX_FREQ_KEY, minimum=self.tb[usrp_siggen.FREQ_RANGE_KEY][0], maximum=self.tb[usrp_siggen.FREQ_RANGE_KEY][1], num_steps=100, ) freq_hbox.AddSpacer(5) tr_hbox.AddSpacer(5) forms.static_text( parent=self.panel, sizer=tr_hbox, label='Daughterboard (Hz)', ps=self.tb, key=usrp_siggen.BB_FREQ_KEY, converter=forms.float_converter(), proportion=1, ) tr_hbox.AddSpacer(10) forms.static_text( parent=self.panel, sizer=tr_hbox, label='USRP DDC (Hz)', ps=self.tb, key=usrp_siggen.DDC_FREQ_KEY, converter=forms.float_converter(), proportion=1, ) tr_hbox.AddSpacer(5) ################################################## # Amplitude controls ################################################## amp_hbox = forms.static_box_sizer(parent=self.panel, label="Amplitude", orient=wx.VERTICAL, bold=True) amp_hbox.AddSpacer(5) # First row of amp controls (ampl) lvl_hbox = wx.BoxSizer(wx.HORIZONTAL) amp_hbox.Add(lvl_hbox, 0, wx.EXPAND) amp_hbox.AddSpacer(10) # Second row of amp controls (tx gain) gain_hbox = wx.BoxSizer(wx.HORIZONTAL) amp_hbox.Add(gain_hbox, 0, wx.EXPAND) amp_hbox.AddSpacer(5) self.vbox.Add(amp_hbox, 0, wx.EXPAND) self.vbox.AddSpacer(10) self.vbox.AddStretchSpacer() lvl_hbox.AddSpacer(5) forms.text_box( parent=self.panel, sizer=lvl_hbox, proportion=1, converter=forms.float_converter(), ps=self.tb, key=usrp_siggen.AMPLITUDE_KEY, label="Level (0.0-1.0)", ) lvl_hbox.AddSpacer(10) forms.log_slider( parent=self.panel, sizer=lvl_hbox, proportion=2, ps=self.tb, key=usrp_siggen.AMPLITUDE_KEY, min_exp=-6, max_exp=0, base=10, num_steps=100, ) lvl_hbox.AddSpacer(5) if self.tb[usrp_siggen.GAIN_RANGE_KEY][0] < self.tb[usrp_siggen.GAIN_RANGE_KEY][1]: gain_hbox.AddSpacer(5) forms.text_box( parent=self.panel, sizer=gain_hbox, proportion=1, converter=forms.float_converter(), ps=self.tb, key=usrp_siggen.GAIN_KEY, label="TX Gain (dB)", ) gain_hbox.AddSpacer(10) forms.slider( parent=self.panel, sizer=gain_hbox, proportion=2, ps=self.tb, key=usrp_siggen.GAIN_KEY, minimum=self.tb[usrp_siggen.GAIN_RANGE_KEY][0], maximum=self.tb[usrp_siggen.GAIN_RANGE_KEY][1], step_size=self.tb[usrp_siggen.GAIN_RANGE_KEY][2], ) gain_hbox.AddSpacer(5) ################################################## # Sample Rate controls ################################################## sam_hbox = forms.static_box_sizer(parent=self.panel, label="Sample Rate", orient=wx.HORIZONTAL, bold=True) self.vbox.Add(sam_hbox, 0, wx.EXPAND) self.vbox.AddSpacer(10) self.vbox.AddStretchSpacer() sam_hbox.AddSpacer(5) forms.text_box( parent=self.panel, sizer=sam_hbox, converter=forms.int_converter(), ps=self.tb, key=usrp_siggen.INTERP_KEY, label="Interpolation", ) sam_hbox.AddStretchSpacer(20) forms.static_text( parent=self.panel, sizer=sam_hbox, label='Sample Rate (sps)', ps=self.tb, key=usrp_siggen.SAMP_RATE_KEY, converter=forms.float_converter(), ) sam_hbox.AddStretchSpacer(20) forms.static_text( parent=self.panel, sizer=sam_hbox, label='Link Rate (bits/sec)', ps=self.tb, key=usrp_siggen.LINK_RATE_KEY, converter=forms.float_converter(), ) sam_hbox.AddSpacer(5) ################################################## # USRP status ################################################## u2_hbox = forms.static_box_sizer(parent=self.panel, label="USRP Status", orient=wx.HORIZONTAL, bold=True) self.vbox.Add(u2_hbox, 0, wx.EXPAND) self.vbox.AddSpacer(10) self.vbox.AddStretchSpacer() u2_hbox.AddSpacer(10) forms.static_text( parent=self.panel, sizer=u2_hbox, ps=self.tb, key=usrp_siggen.DESC_KEY, converter=forms.str_converter(), ) self.vbox.AddSpacer(5) self.vbox.AddStretchSpacer()