def __init__( self, parent, controller, size, title, units, show_gauge, real, minval, maxval, decimal_places, msg_key, sample_rate_key, ): pubsub.__init__(self) wx.Panel.__init__(self, parent, style=wx.SUNKEN_BORDER) #setup self.peak_val_real = NEG_INF self.real = real self.units = units self.decimal_places = decimal_places #proxy the keys self.proxy(MSG_KEY, controller, msg_key) #initialize values self[RUNNING_KEY] = True self[VALUE_REAL_KEY] = minval #setup the box with display and controls main_box = wx.BoxSizer(wx.HORIZONTAL) sizer = forms.static_box_sizer( parent=self, sizer=main_box, label=title, bold=True, orient=wx.VERTICAL, proportion=1, ) sizer.AddStretchSpacer() forms.static_text( parent=self, sizer=sizer, ps=self, key=VALUE_REPR_KEY, width=size[0], converter=forms.str_converter(), ) sizer.AddStretchSpacer() self.gauge_real = forms.gauge( parent=self, sizer=sizer, style=wx.GA_HORIZONTAL, ps=self, key=VALUE_REAL_KEY, length=size[0], minimum=minval, maximum=maxval, num_steps=DEFAULT_GAUGE_RANGE, ) #hide/show gauges self.gauge_real.ShowItems(show_gauge) self.SetSizerAndFit(main_box) #register events self.subscribe(MSG_KEY, self.handle_msg)
def __init__(self, parent): """ Create a new control panel. Args: parent: the wx parent window """ self.parent = parent wx.Panel.__init__(self, parent, style=wx.SUNKEN_BORDER) parent[SHOW_CONTROL_PANEL_KEY] = True parent.subscribe(SHOW_CONTROL_PANEL_KEY, self.Show) control_box = wx.BoxSizer(wx.VERTICAL) control_box.AddStretchSpacer() options_box = forms.static_box_sizer( parent=self, sizer=control_box, label="Options", bold=True, orient=wx.VERTICAL ) # average # forms.check_box( # sizer=options_box, parent=self, label='Average', # ps=parent, key=AVERAGE_KEY, # ) # 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=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=AVG_ALPHA_KEY, # ) # for widget in (avg_alpha_text, avg_alpha_slider): # parent.subscribe(AVERAGE_KEY, widget.Enable) # widget.Enable(parent[AVERAGE_KEY]) # begin axes box control_box.AddStretchSpacer() axes_box = forms.static_box_sizer( parent=self, sizer=control_box, label="Axes Options", bold=True, orient=wx.VERTICAL ) # num lines buttons # forms.incr_decr_buttons( # parent=self, sizer=axes_box, label='Time Scale', # on_incr=self._on_incr_time_scale, on_decr=self._on_decr_time_scale, # ) # dyanmic range buttons forms.incr_decr_buttons( parent=self, sizer=axes_box, label="Dyn Range", on_incr=self._on_incr_dynamic_range, on_decr=self._on_decr_dynamic_range, ) # ref lvl buttons forms.incr_decr_buttons( parent=self, sizer=axes_box, label="Ref Level", on_incr=self._on_incr_ref_level, on_decr=self._on_decr_ref_level, ) # color mode forms.drop_down( parent=self, sizer=axes_box, width=100, ps=parent, key=COLOR_MODE_KEY, label="Color", choices=map(lambda x: x[1], COLOR_MODES), labels=map(lambda x: x[0], COLOR_MODES), ) # autoscale forms.single_button(parent=self, sizer=axes_box, label="Autoscale", callback=self.parent.autoscale) # clear control_box.AddStretchSpacer() forms.single_button(parent=self, sizer=control_box, label="Clear", callback=self._on_clear_button) # run/stop forms.toggle_button( sizer=control_box, parent=self, true_label="Stop", false_label="Run", ps=parent, key=RUNNING_KEY ) # set sizer self.SetSizerAndFit(control_box)
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, vbox): def _form_set_freq(kv): return self.set_freq(kv['freq']) vbox.Add(self.scope.win, 10, wx.EXPAND) # add control area at the bottom self.myform = myform = form.form() hbox = wx.BoxSizer(wx.HORIZONTAL) hbox.Add((5,0), 0, 0) myform['freq'] = form.float_field( parent=self.panel, sizer=hbox, label="Center freq", weight=1, callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg)) hbox.Add((5,0), 0, 0) g = self.u.get_gain_range() # some configurations don't have gain control if g.stop() <= g.start(): glow = 0.0 ghigh = 1.0 else: glow = g.start() ghigh = g.stop() myform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, label="Gain", weight=3, min=int(glow), max=int(ghigh), callback=self.set_gain) try: mboard_id = self.u.get_usrp_info().get("mboard_id").split(" ")[0] mboard_serial = self.u.get_usrp_info().get("mboard_serial") if mboard_serial == "": mboard_serial = "no serial" dboard_id = self.u.get_usrp_info().get("rx_id").split(" ")[0].split(",")[0] dboard_serial = self.u.get_usrp_info().get("rx_serial") if dboard_serial == "": dboard_serial = "no serial" subdev = self.u.get_subdev_spec() antenna = self.u.get_antenna() usrp_config_val = "%s (%s), %s (%s, %s, %s)" % (mboard_id, mboard_serial, dboard_id, dboard_serial, subdev, antenna) except: usrp_config_val = "Not implemented in this version." uhd_box = forms.static_box_sizer(parent=self.panel, label="UHD (%s)" % (uhd.get_version_string()), orient=wx.HORIZONTAL) usrp_config_form = forms.static_text( parent=self.panel, sizer=uhd_box, value=usrp_config_val, label="USRP", converter=forms.str_converter(), ) vbox.Add(uhd_box, 0, wx.EXPAND) vbox.AddSpacer(5) hbox.Add((5,0), 0, 0) vbox.Add(hbox, 0, wx.EXPAND) self._build_subpanel(vbox)
def __init__(self, parent): """ Create a new control panel. Args: parent: the wx parent window """ self.parent = parent wx.Panel.__init__(self, parent, style=wx.SUNKEN_BORDER) parent[SHOW_CONTROL_PANEL_KEY] = True parent.subscribe(SHOW_CONTROL_PANEL_KEY, self.Show) control_box = wx.BoxSizer(wx.VERTICAL) control_box.AddStretchSpacer() options_box = forms.static_box_sizer( parent=self, sizer=control_box, label='Options', bold=True, orient=wx.VERTICAL, ) #average #forms.check_box( # sizer=options_box, parent=self, label='Average', # ps=parent, key=AVERAGE_KEY, #) #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=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=AVG_ALPHA_KEY, #) #for widget in (avg_alpha_text, avg_alpha_slider): # parent.subscribe(AVERAGE_KEY, widget.Enable) # widget.Enable(parent[AVERAGE_KEY]) #begin axes box control_box.AddStretchSpacer() axes_box = forms.static_box_sizer( parent=self, sizer=control_box, label='Axes Options', bold=True, orient=wx.VERTICAL, ) #num lines buttons #forms.incr_decr_buttons( # parent=self, sizer=axes_box, label='Time Scale', # on_incr=self._on_incr_time_scale, on_decr=self._on_decr_time_scale, #) #dyanmic range buttons forms.incr_decr_buttons( parent=self, sizer=axes_box, label='Dyn Range', on_incr=self._on_incr_dynamic_range, on_decr=self._on_decr_dynamic_range, ) #ref lvl buttons forms.incr_decr_buttons( parent=self, sizer=axes_box, label='Ref Level', on_incr=self._on_incr_ref_level, on_decr=self._on_decr_ref_level, ) #color mode forms.drop_down( parent=self, sizer=axes_box, width=100, ps=parent, key=COLOR_MODE_KEY, label='Color', choices=map(lambda x: x[1], COLOR_MODES), labels=map(lambda x: x[0], COLOR_MODES), ) #autoscale forms.single_button( parent=self, sizer=axes_box, label='Autoscale', callback=self.parent.autoscale, ) #clear control_box.AddStretchSpacer() forms.single_button( parent=self, sizer=control_box, label='Clear', callback=self._on_clear_button, ) #run/stop forms.toggle_button( sizer=control_box, parent=self, true_label='Stop', false_label='Run', ps=parent, key=RUNNING_KEY, ) #set sizer self.SetSizerAndFit(control_box)
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()
def _build_gui(self, vbox): vbox.Add(self.fft.win, 1, wx.EXPAND) vbox.Add(self.scope.win, 1, wx.EXPAND) vbox.AddSpacer(3) # add control area at the bottom self.myform = myform = form.form() ################################################## # DC Offset controls ################################################## dc_offset_vbox = forms.static_box_sizer(parent=self.panel, label="DC Offset Correction", orient=wx.VERTICAL, bold=True) dc_offset_vbox.AddSpacer(3) # First row of sample rate controls dc_offset_hbox = wx.BoxSizer(wx.HORIZONTAL) dc_offset_vbox.Add(dc_offset_hbox, 0, wx.EXPAND) dc_offset_vbox.AddSpacer(3) # Add frequency controls to top window sizer vbox.Add(dc_offset_vbox, 0, wx.EXPAND) vbox.AddSpacer(3) dc_offset_hbox.AddSpacer(3) self.dc_offset_real_text = forms.text_box( parent=self.panel, sizer=dc_offset_hbox, label='Real', proportion=1, converter=forms.float_converter(), ps=self, key='dc_offset_real', ) dc_offset_hbox.AddSpacer(3) self.dc_offset_real_slider = forms.slider( parent=self.panel, sizer=dc_offset_hbox, proportion=3, minimum=-1, maximum=+1, step_size=0.0005, ps=self, key='dc_offset_real', ) dc_offset_hbox.AddSpacer(3) dc_offset_hbox.AddSpacer(3) self.dc_offset_imag_text = forms.text_box( parent=self.panel, sizer=dc_offset_hbox, label='Imag', proportion=1, converter=forms.float_converter(), ps=self, key='dc_offset_imag', ) dc_offset_hbox.AddSpacer(3) self.dc_offset_imag_slider = forms.slider( parent=self.panel, sizer=dc_offset_hbox, proportion=3, minimum=-1, maximum=+1, step_size=0.0005, ps=self, key='dc_offset_imag', ) dc_offset_hbox.AddSpacer(3) ################################################## # IQ Imbalance controls ################################################## iq_balance_vbox = forms.static_box_sizer(parent=self.panel, label="IQ Imbalance Correction", orient=wx.VERTICAL, bold=True) iq_balance_vbox.AddSpacer(3) # First row of sample rate controls iq_balance_hbox = wx.BoxSizer(wx.HORIZONTAL) iq_balance_vbox.Add(iq_balance_hbox, 0, wx.EXPAND) iq_balance_vbox.AddSpacer(3) # Add frequency controls to top window sizer vbox.Add(iq_balance_vbox, 0, wx.EXPAND) vbox.AddSpacer(3) iq_balance_hbox.AddSpacer(3) self.iq_balance_mag_text = forms.text_box( parent=self.panel, sizer=iq_balance_hbox, label='Mag', proportion=1, converter=forms.float_converter(), ps=self, key=KEY_IQ_BAL_I, ) iq_balance_hbox.AddSpacer(3) self.iq_balance_mag_slider = forms.slider( parent=self.panel, sizer=iq_balance_hbox, proportion=3, minimum=-1, maximum=+1, step_size=0.00025, ps=self, key=KEY_IQ_BAL_I, ) iq_balance_hbox.AddSpacer(3) iq_balance_hbox.AddSpacer(3) self.iq_balance_pha_text = forms.text_box( parent=self.panel, sizer=iq_balance_hbox, label='Phase', proportion=1, converter=forms.float_converter(), ps=self, key=KEY_IQ_BAL_Q, ) iq_balance_hbox.AddSpacer(3) self.iq_balance_pha_slider = forms.slider( parent=self.panel, sizer=iq_balance_hbox, proportion=3, minimum=-1, maximum=+1, step_size=0.00025, ps=self, key=KEY_IQ_BAL_Q, ) iq_balance_hbox.AddSpacer(3)