コード例 #1
0
    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)
コード例 #2
0
 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()