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, samp_rate=2e6): grc_wxgui.top_block_gui.__init__( self, title="Amplitude calibration tool for USRP, v 0.2") ######################################################## # TODO: See if there's a sensible way to package an icon # with this program, rather than rely on some # particular Gnu Radio user's installation. # # _icon_path = "/home/dave/.local/share/icons/hicolor/32x32/apps/gnuradio-grc.png" # self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY)) ######################################################## ################################################## # Parameters # # TODO: Add enough parameters, and the right ones, # that the program will come up with sliders # set conveniently for the user. # When step-sweep support is implemented, we # want to be able to run even w/o the GUI. ################################################## self.samp_rate = samp_rate ################################################## # Variables ################################################## self.usrp_gain_slider = usrp_gain_slider = 20 self.usrp_freq_offset_slider = usrp_freq_offset_slider = -100000 self.input_signal_power = input_signal_power = -50 self.input_freq_slider = input_freq_slider = 1e9 self.cal_file = None ################################################## # Blocks ################################################## self._input_rowhdr_text_box = wx.StaticText( self.GetWin(), label='\nReference Signal:\n') font = self._input_rowhdr_text_box.GetFont() font.SetWeight(wx.FONTWEIGHT_BOLD) self._input_rowhdr_text_box.SetFont(font) self.GridAdd(self._input_rowhdr_text_box, 1, 1, 1, 1) _input_freq_slider_sizer = wx.BoxSizer(wx.VERTICAL) self._input_freq_slider_text_box = forms.text_box( parent=self.GetWin(), sizer=_input_freq_slider_sizer, value=self.input_freq_slider, callback=self.set_input_freq_slider, label='RF input frequency (Hz)', converter=forms.float_converter(), proportion=0, ) self._input_freq_slider_slider = forms.slider( parent=self.GetWin(), sizer=_input_freq_slider_sizer, value=self.input_freq_slider, callback=self.set_input_freq_slider, minimum=10e6, maximum=6000e6, num_steps=20, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_input_freq_slider_sizer, 1, 2, 1, 3) _input_signal_power_sizer = wx.BoxSizer(wx.VERTICAL) self._input_signal_power_text_box = forms.text_box( parent=self.GetWin(), sizer=_input_signal_power_sizer, value=self.input_signal_power, callback=self.set_input_signal_power, label='Input signal power (dBm)', converter=forms.float_converter(), proportion=0, ) self._input_signal_power_slider = forms.slider( parent=self.GetWin(), sizer=_input_signal_power_sizer, value=self.input_signal_power, callback=self.set_input_signal_power, minimum=-70, maximum=-20, num_steps=50, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_input_signal_power_sizer, 1, 5, 1, 2) self._row_spacer_1 = wx.StaticText(self.GetWin(), label="\n") self.GridAdd(self._row_spacer_1, 2, 1, 1, 6) self._sdr_rowhdr_text_box = wx.StaticText(self.GetWin(), label='HackRF:') font = self._sdr_rowhdr_text_box.GetFont() font.SetWeight(wx.FONTWEIGHT_BOLD) self._sdr_rowhdr_text_box.SetFont(font) self.GridAdd(self._sdr_rowhdr_text_box, 3, 1, 1, 1) _usrp_freq_offset_slider_sizer = wx.BoxSizer(wx.VERTICAL) self._usrp_freq_offset_slider_text_box = forms.text_box( parent=self.GetWin(), sizer=_usrp_freq_offset_slider_sizer, value=self.usrp_freq_offset_slider, callback=self.set_usrp_freq_offset_slider, label='Freq offset', converter=forms.float_converter(), proportion=0, ) self._usrp_freq_offset_slider_slider = forms.slider( parent=self.GetWin(), sizer=_usrp_freq_offset_slider_sizer, value=self.usrp_freq_offset_slider, callback=self.set_usrp_freq_offset_slider, minimum=-200000, maximum=200000, num_steps=5, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_usrp_freq_offset_slider_sizer, 3, 2, 1, 3) _usrp_gain_slider_sizer = wx.BoxSizer(wx.VERTICAL) self._usrp_gain_slider_text_box = forms.text_box( parent=self.GetWin(), sizer=_usrp_gain_slider_sizer, value=self.usrp_gain_slider, callback=self.set_usrp_gain_slider, label='Gain (dB) !!!8dB step!!!', converter=forms.float_converter(), proportion=0, ) self._usrp_gain_slider_slider = forms.slider( parent=self.GetWin(), sizer=_usrp_gain_slider_sizer, value=self.usrp_gain_slider, callback=self.set_usrp_gain_slider, minimum=0, maximum=38, num_steps=38, style=wx.SL_HORIZONTAL, cast=float, proportion=1, ) self.GridAdd(_usrp_gain_slider_sizer, 3, 5, 1, 2) self._row_spacer_2 = wx.StaticText(self.GetWin(), label="") self.GridAdd(self._row_spacer_2, 4, 1, 1, 6) self.wxgui_numbersink2_0_0 = numbersink2.number_sink_f( self.GetWin(), unit='dBFS', minval=-100, maxval=10, factor=1.0, decimal_places=0, ref_level=0, sample_rate=samp_rate / 10, number_rate=10, average=False, avg_alpha=None, label='Output power (digital)', peak_hold=False, show_gauge=True, ) self.GridAdd(self.wxgui_numbersink2_0_0.win, 5, 1, 1, 2) self.wxgui_numbersink2_0_0_1 = numbersink2.number_sink_f( self.GetWin(), unit='dB', minval=-20, maxval=80, factor=1.0, decimal_places=0, ref_level=0, sample_rate=samp_rate / 10, number_rate=10, average=False, avg_alpha=None, label='Power conversion value\n(output dbFS -> input dBm + gain)', peak_hold=False, show_gauge=True, ) self.GridAdd(self.wxgui_numbersink2_0_0_1.win, 5, 4, 1, 3) self.data_capture_button = forms.single_button( parent=self.GetWin(), label="Capture this data point", callback=self.checkbox_event, style=wx.BU_EXACTFIT, ) font = self.data_capture_button._button.GetFont() font.SetWeight(wx.FONTWEIGHT_BOLD) self.data_capture_button._button.SetFont(font) self.GridAdd(self.data_capture_button, 6, 4, 1, 1) self._wrapup_text_box_1 = wx.StaticText( self.GetWin(), label='\n USRP LO freq:\n', ) font = self._wrapup_text_box_1.GetFont() font.SetWeight(wx.FONTWEIGHT_BOLD) self._wrapup_text_box_1.SetFont(font) self.GridAdd(self._wrapup_text_box_1, 6, 5, 1, 1) self._wrapup_text_box_1.SetLabel("\n USRP LO freq: {0:.0f}\n".format( self.input_freq_slider + self.usrp_freq_offset_slider)) self._wrapup_text_box_2 = wx.StaticText( self.GetWin(), label='\n\n', ) self.GridAdd(self._wrapup_text_box_2, 6, 6, 1, 1) self.osmosdr_source_0 = osmosdr.source(args="numchan=" + str(1) + " " + '') self.osmosdr_source_0.set_sample_rate(samp_rate) self.osmosdr_source_0.set_center_freq( input_freq_slider + usrp_freq_offset_slider, 0) self.osmosdr_source_0.set_freq_corr(0, 0) self.osmosdr_source_0.set_dc_offset_mode(0, 0) self.osmosdr_source_0.set_iq_balance_mode(0, 0) self.osmosdr_source_0.set_gain_mode(False, 0) self.osmosdr_source_0.set_gain(0, 0) self.osmosdr_source_0.set_if_gain(usrp_gain_slider, 0) self.osmosdr_source_0.set_bb_gain(0, 0) self.osmosdr_source_0.set_antenna('', 0) self.osmosdr_source_0.set_bandwidth(samp_rate, 0) self.u = self.osmosdr_source_0 self.u_mboard_serial = "" self.u_dboard_serial = "" self.u_dboard_id = "" self.u_dboard_id = "" self._sdr_rowhdr_text_box.SetLabel( "USRP serial # {0:s} \n{1:s} serial # {2:s} ".format( self.u_mboard_serial, self.u_dboard_id, self.u_dboard_serial)) self.single_pole_iir_filter_xx_1_0 = filter.single_pole_iir_filter_ff( 1.0 / ((0.1) * samp_rate), 1) self.low_pass_filter_0 = filter.fir_filter_ccf( 1, firdes.low_pass(1, samp_rate, samp_rate / 5, samp_rate / 10, firdes.WIN_HAMMING, 6.76)) self.dc_blocker_xx_0 = filter.dc_blocker_cc(1000, True) self.blocks_tag_debug_0 = blocks.tag_debug(gr.sizeof_gr_complex * 1, '', "") self.blocks_tag_debug_0.set_display(True) self.blocks_sub_xx_0 = blocks.sub_ff(1) self.blocks_nlog10_ff_0_0 = blocks.nlog10_ff(10, 1, 0) self.blocks_keep_one_in_n_0_0 = blocks.keep_one_in_n( gr.sizeof_float * 1, 10) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n( gr.sizeof_float * 1, 10) self.blocks_complex_to_mag_squared_0_0 = blocks.complex_to_mag_squared( 1) self.analog_const_source_x_0 = analog.sig_source_f( 0, analog.GR_CONST_WAVE, 0, 0, input_signal_power + usrp_gain_slider) ################################################## # Connections ################################################## self.connect((self.analog_const_source_x_0, 0), (self.blocks_keep_one_in_n_0_0, 0)) self.connect((self.blocks_complex_to_mag_squared_0_0, 0), (self.single_pole_iir_filter_xx_1_0, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.blocks_sub_xx_0, 1)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.wxgui_numbersink2_0_0, 0)) self.connect((self.blocks_keep_one_in_n_0_0, 0), (self.blocks_sub_xx_0, 0)) self.connect((self.blocks_nlog10_ff_0_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.blocks_sub_xx_0, 0), (self.wxgui_numbersink2_0_0_1, 0)) self.connect((self.dc_blocker_xx_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.blocks_complex_to_mag_squared_0_0, 0)) self.connect((self.single_pole_iir_filter_xx_1_0, 0), (self.blocks_nlog10_ff_0_0, 0)) self.connect((self.u, 0), (self.blocks_tag_debug_0, 0)) self.connect((self.u, 0), (self.dc_blocker_xx_0, 0))
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)
self.ppmtextbox = forms.text_box( sizer=freq_sizer, width=40, parent=self.GetWin(), value=self.ppm, callback=setppm, label="ppm", proportion=0, converter=forms.float_converter() ) # self.Add(self.ppmtextbox) self.btnincppm = forms.single_button( sizer=freq_sizer, width=25, parent=self.GetWin(), label='+', proportion=0, callback=setincppm,) #self.Add(self.btnincppm) self.btndecppm = forms.single_button( sizer=freq_sizer, width=25, parent=self.GetWin(), label='-', callback=setdecppm,) self._ifreq_text_box = forms.text_box( sizer=freq_sizer, parent=self.GetWin(),