diff options
-rw-r--r-- | gr-uhd/apps/uhd_app.py | 127 | ||||
-rwxr-xr-x | gr-uhd/apps/uhd_siggen | 6 | ||||
-rw-r--r-- | gr-uhd/apps/uhd_siggen_base.py | 54 | ||||
-rwxr-xr-x | gr-uhd/apps/uhd_siggen_gui | 186 |
4 files changed, 209 insertions, 164 deletions
diff --git a/gr-uhd/apps/uhd_app.py b/gr-uhd/apps/uhd_app.py index 571518cb2a..f666e1e28f 100644 --- a/gr-uhd/apps/uhd_app.py +++ b/gr-uhd/apps/uhd_app.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright 2015-2016 Free Software Foundation, Inc. # @@ -28,7 +28,7 @@ LONG_TPL = """{prefix} Motherboard: {mb_id} ({mb_serial}) {prefix} Antenna: {ant} """ -class UHDApp(object): +class UHDApp: " Base class for simple UHD-based applications " def __init__(self, prefix=None, args=None): self.prefix = prefix @@ -53,6 +53,8 @@ class UHDApp(object): self.time_source = None self.lo_source = None self.lo_export = None + self.usrp = None + self.lo_source_channel = None def vprint(self, *args): """ @@ -61,12 +63,7 @@ class UHDApp(object): if self.verbose: print("[{prefix}]".format(prefix=self.prefix), *args) - def get_usrp_info_string(self, - compact=False, - tx_or_rx='rx', - chan=0, - mboard=0, - ): + def get_usrp_info_string(self, compact=False, tx_or_rx='rx', chan=0, mboard=0): """ Return a nice textual description of the USRP we're using. """ @@ -175,7 +172,7 @@ class UHDApp(object): for i, chan in enumerate(self.channels): if not self.antenna[i] in self.usrp.get_antennas(i): print("[ERROR] {} is not a valid antenna name for this USRP device!".format(self.antenna[i])) - exit(1) + sys.exit(1) self.usrp.set_antenna(self.antenna[i], i) self.vprint("[{prefix}] Channel {chan}: Using antenna {ant}.".format( prefix=self.prefix, chan=chan, ant=self.usrp.get_antenna(i) @@ -203,22 +200,28 @@ class UHDApp(object): self.usrp.set_lo_export_enabled(True, uhd.ALL_LOS, chan) if lo_source == "internal": self.lo_source_channel = chan - tune_resp = self.usrp.set_center_freq(treq,chan) - self.usrp.set_lo_source(lo_source, uhd.ALL_LOS,chan) + tune_resp = self.usrp.set_center_freq(treq, chan) + self.usrp.set_lo_source(lo_source, uhd.ALL_LOS, chan) # Use lo source tune response to tune dsp_freq on remaining channels if self.lo_source_channel is not None: if getattr(args, 'lo_offset', None) is not None: - treq = uhd.tune_request(target_freq=args.freq, rf_freq=args.freq+args.lo_offset, rf_freq_policy=uhd.tune_request.POLICY_MANUAL, - dsp_freq=tune_resp.actual_dsp_freq, - dsp_freq_policy=uhd.tune_request.POLICY_MANUAL) + treq = uhd.tune_request( + target_freq=args.freq, + rf_freq=args.freq+args.lo_offset, + rf_freq_policy=uhd.tune_request.POLICY_MANUAL, + dsp_freq=tune_resp.actual_dsp_freq, + dsp_freq_policy=uhd.tune_request.POLICY_MANUAL) else: - treq = uhd.tune_request(target_freq=args.freq, rf_freq=args.freg, rf_freq_policy=uhd.tune_request.POLICY_MANUAL, - dsp_freq=tune_resp.actual_dsp_freq, - dsp_freq_policy=uhd.tune_request.POLICY_MANUAL) + treq = uhd.tune_request( + target_freq=args.freq, + rf_freq=args.freg, + rf_freq_policy=uhd.tune_request.POLICY_MANUAL, + dsp_freq=tune_resp.actual_dsp_freq, + dsp_freq_policy=uhd.tune_request.POLICY_MANUAL) for chan in args.channels: if chan == self.lo_source_channel: continue - self.usrp.set_center_freq(treq,chan) + self.usrp.set_center_freq(treq, chan) # Make sure tuning is synched: command_time_set = False if len(self.channels) > 1: @@ -233,11 +236,11 @@ class UHDApp(object): sys.stderr.write('[{prefix}] [WARNING] Failed to set command times.\n'.format(prefix=self.prefix)) for i, chan in enumerate(self.channels): self.tr = self.usrp.set_center_freq(treq, i) - if self.tr == None: - sys.stderr.write('[{prefix}] [ERROR] Failed to set center frequency on channel {chan}\n'.format( - prefix=self.prefix, chan=chan - )) - exit(1) + if self.tr is None: + sys.stderr.write( + '[{prefix}] [ERROR] Failed to set center frequency on channel {chan}\n' + .format(prefix=self.prefix, chan=chan)) + sys.exit(1) if command_time_set: for mb_idx in range(self.usrp.get_num_mboards()): self.usrp.clear_command_time(mb_idx) @@ -262,11 +265,11 @@ class UHDApp(object): self.usrp.set_normalized_gain(.5, i) if self.args.verbose: self.vprint("Channel {chan} gain: {g} dB".format( - prefix=self.prefix, chan=chan, g=self.usrp.get_gain(i) + chan=chan, g=self.usrp.get_gain(i) )) else: self.vprint("Setting gain to {g} dB.".format(g=gain)) - for chan in range( len( self.channels ) ): + for chan in range(len(self.channels)): self.usrp.set_gain(gain, chan) self.gain = self.usrp.get_gain(0) @@ -284,18 +287,23 @@ class UHDApp(object): if getattr(self, 'lo_source_channel', None) is not None: tune_resp = self.usrp.set_center_freq(treq, self.lo_source_channel) if getattr(self.args, 'lo_offset', None) is not None: - treq = uhd.tune_request(target_freq=freq, rf_freq=freq+self.args.lo_offset, rf_freq_policy=uhd.tune_request.POLICY_MANUAL, - dsp_freq=tune_resp.actual_dsp_freq, - dsp_freq_policy=uhd.tune_request.POLICY_MANUAL) + treq = uhd.tune_request( + target_freq=freq, + rf_freq=freq+self.args.lo_offset, + rf_freq_policy=uhd.tune_request.POLICY_MANUAL, + dsp_freq=tune_resp.actual_dsp_freq, + dsp_freq_policy=uhd.tune_request.POLICY_MANUAL) else: - treq = uhd.tune_request(target_freq=freq, rf_freq=freq, rf_freq_policy=uhd.tune_reqest.POLICY_MANUAL, - dsp_freq=tune_resp.actual_dsp_freq, - dsp_freq_policy=uhd.tune_request.POLICY_MANUAL) + treq = uhd.tune_request( + target_freq=freq, + rf_freq=freq, + rf_freq_policy=uhd.tune_reqest.POLICY_MANUAL, + dsp_freq=tune_resp.actual_dsp_freq, + dsp_freq_policy=uhd.tune_request.POLICY_MANUAL) for chan in self.channels: if chan == self.lo_source_channel: continue - self.usrp.set_center_freq(treq,chan) - + self.usrp.set_center_freq(treq, chan) # Make sure tuning is synched: command_time_set = False if len(self.channels) > 1 and not skip_sync: @@ -306,13 +314,13 @@ class UHDApp(object): command_time_set = True except RuntimeError: sys.stderr.write('[{prefix}] [WARNING] Failed to set command times.\n'.format(prefix=self.prefix)) - for i, chan in enumerate(self.channels ): + for i, chan in enumerate(self.channels): self.tr = self.usrp.set_center_freq(treq, i) - if self.tr == None: + if self.tr is None: sys.stderr.write('[{prefix}] [ERROR] Failed to set center frequency on channel {chan}\n'.format( prefix=self.prefix, chan=chan )) - exit(1) + sys.exit(1) if command_time_set: for mb_idx in range(self.usrp.get_num_mboards()): self.usrp.clear_command_time(mb_idx) @@ -342,42 +350,55 @@ class UHDApp(object): raise argparse.ArgumentTypeError("Not a comma-separated list: {string}".format(string=string)) if parser is None: parser = argparse.ArgumentParser( - description=description, + description=description, ) tx_or_rx = tx_or_rx.strip() + " " group = parser.add_argument_group('USRP Arguments') group.add_argument("-a", "--args", default="", help="UHD device address args") - group.add_argument("--spec", help="Subdevice(s) of UHD device where appropriate. Use a comma-separated list to set different boards to different specs.") + group.add_argument( + "--spec", + help="Subdevice(s) of UHD device where appropriate. " + "Use a comma-separated list to set different boards to different specs.") group.add_argument("-A", "--antenna", help="Select {xx}antenna(s) where appropriate".format(xx=tx_or_rx)) group.add_argument("-s", "--samp-rate", type=eng_arg.eng_float, default=1e6, - help="Sample rate") + help="Sample rate") group.add_argument("-g", "--gain", type=eng_arg.eng_float, default=None, - help="Gain (default is midpoint)") + help="Gain (default is midpoint)") group.add_argument("--gain-type", choices=('db', 'normalized'), default='db', - help="Gain Type (applies to -g)") + help="Gain Type (applies to -g)") + group.add_argument("-p", "--power-ref", type=eng_arg.eng_float, default=None, + help="Reference power level (in dBm). " + "Not supported by all devices (see UHD manual). " + "Will fail if not supported. Precludes --gain. ") if not skip_freq: group.add_argument("-f", "--freq", type=eng_arg.eng_float, default=None, required=True, - help="Set carrier frequency to FREQ", - metavar="FREQ") + help="Set carrier frequency to FREQ", + metavar="FREQ") group.add_argument("--lo-offset", type=eng_arg.eng_float, default=0.0, - help="Set daughterboard LO offset to OFFSET [default=hw default]") + help="Set daughterboard LO offset to OFFSET [default=hw default]") if allow_mimo: group.add_argument("-c", "--channels", default=[0,], type=cslist, - help="Select {xx} Channels".format(xx=tx_or_rx)) - group.add_argument("--lo-export", help="Set TwinRX LO export {None, True, False} for each channel with a comma-separated list. None skips a channel.") - group.add_argument("--lo-source", help="Set TwinRX LO source {None, internal, companion, external} for each channel with a comma-separated list. None skips this channel. ") + help="Select {xx} Channels".format(xx=tx_or_rx)) + group.add_argument( + "--lo-export", + help="Set TwinRX LO export {None, True, False} for each channel " + "with a comma-separated list. None skips a channel.") + group.add_argument( + "--lo-source", + help="Set TwinRX LO source {None, internal, companion, external} " + "for each channel with a comma-separated list. None skips this channel.") group.add_argument("--otw-format", choices=['sc16', 'sc12', 'sc8'], default='sc16', - help="Choose over-the-wire data format") + help="Choose over-the-wire data format") group.add_argument("--stream-args", default="", help="Set additional stream arguments") group.add_argument("-m", "--amplitude", type=eng_arg.eng_float, default=0.15, - help="Set output amplitude to AMPL (0.0-1.0)", metavar="AMPL") + help="Set output amplitude to AMPL (0.0-1.0)", metavar="AMPL") group.add_argument("-v", "--verbose", action="count", help="Use verbose console output") group.add_argument("--show-async-msg", action="store_true", - help="Show asynchronous message notifications from UHD") + help="Show asynchronous message notifications from UHD") group.add_argument("--sync", choices=('default', 'pps', 'auto'), - default='auto', help="Set to 'pps' to sync devices to PPS") + default='auto', help="Set to 'pps' to sync devices to PPS") group.add_argument("--clock-source", - help="Set the clock source; typically 'internal', 'external' or 'gpsdo'") + help="Set the clock source; typically 'internal', 'external' or 'gpsdo'") group.add_argument("--time-source", - help="Set the time source") + help="Set the time source") return parser diff --git a/gr-uhd/apps/uhd_siggen b/gr-uhd/apps/uhd_siggen index f869ed0bfa..ab828157b1 100755 --- a/gr-uhd/apps/uhd_siggen +++ b/gr-uhd/apps/uhd_siggen @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright 2008,2009,2011,2012,2015 Free Software Foundation, Inc. # @@ -6,7 +6,9 @@ # # SPDX-License-Identifier: GPL-3.0-or-later # -# +""" +Command-line siggen app +""" try: import uhd_siggen_base as uhd_siggen diff --git a/gr-uhd/apps/uhd_siggen_base.py b/gr-uhd/apps/uhd_siggen_base.py index 4cd81c4e25..38d197e3ad 100644 --- a/gr-uhd/apps/uhd_siggen_base.py +++ b/gr-uhd/apps/uhd_siggen_base.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright 2008,2009,2011,2012,2015 Free Software Foundation, Inc. # @@ -12,6 +12,7 @@ Provide a base flow graph for USRP signal generators. """ import math +import sys try: from uhd_app import UHDApp except ImportError: @@ -37,8 +38,6 @@ FREQ_RANGE_KEY = 'freq_range' GAIN_RANGE_KEY = 'gain_range' TYPE_KEY = 'type' -n2s = eng_notation.num_to_str - WAVEFORMS = { analog.GR_CONST_WAVE : "Constant", analog.GR_SIN_WAVE : "Complex Sinusoid", @@ -66,8 +65,8 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): # Initialize device: self.setup_usrp( - ctor=uhd.usrp_sink, - args=args, + ctor=uhd.usrp_sink, + args=args, ) print("[UHD-SIGGEN] UHD Signal Generator") print("[UHD-SIGGEN] UHD Version: {ver}".format(ver=uhd.get_version_string())) @@ -150,7 +149,6 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): self._src2.set_frequency(freq) elif self[TYPE_KEY] == "sweep": self._src1.set_frequency(freq) - return True def set_waveform(self, waveform_type): """ @@ -159,13 +157,13 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): self.vprint("Selecting waveform...") self.lock() self.disconnect_all() - if waveform_type == analog.GR_SIN_WAVE or waveform_type == analog.GR_CONST_WAVE: - self._src = analog.sig_source_c(self[SAMP_RATE_KEY], # Sample rate - waveform_type, # Waveform waveform_type - self[WAVEFORM_FREQ_KEY], # Waveform frequency - self[AMPLITUDE_KEY], # Waveform amplitude - self[WAVEFORM_OFFSET_KEY]) # Waveform offset - elif waveform_type == analog.GR_GAUSSIAN or waveform_type == analog.GR_UNIFORM: + if waveform_type in (analog.GR_SIN_WAVE, analog.GR_CONST_WAVE): + self._src = analog.sig_source_c(self[SAMP_RATE_KEY], # Sample rate + waveform_type, # Waveform waveform_type + self[WAVEFORM_FREQ_KEY], # Waveform frequency + self[AMPLITUDE_KEY], # Waveform amplitude + self[WAVEFORM_OFFSET_KEY]) # Waveform offset + elif waveform_type in (analog.GR_GAUSSIAN, analog.GR_UNIFORM): self._src = analog.noise_source_c(waveform_type, self[AMPLITUDE_KEY]) elif waveform_type == "2tone": self._src1 = analog.sig_source_c(self[SAMP_RATE_KEY], @@ -206,6 +204,7 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): self.connect(self._src, self.extra_sink) self.unlock() self.vprint("Set baseband modulation to:", WAVEFORMS[waveform_type]) + n2s = eng_notation.num_to_str if waveform_type == analog.GR_SIN_WAVE: self.vprint("Modulation frequency: %sHz" % (n2s(self[WAVEFORM_FREQ_KEY]),)) self.vprint("Initial phase:", self[WAVEFORM_OFFSET_KEY]) @@ -213,7 +212,8 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): self.vprint("Tone 1: %sHz" % (n2s(self[WAVEFORM_FREQ_KEY]),)) self.vprint("Tone 2: %sHz" % (n2s(self[WAVEFORM2_FREQ_KEY]),)) elif waveform_type == "sweep": - self.vprint("Sweeping across %sHz to %sHz" % (n2s(-self[WAVEFORM_FREQ_KEY] / 2.0), n2s(self[WAVEFORM_FREQ_KEY] / 2.0))) + self.vprint("Sweeping across {} Hz to {} Hz".format( + n2s(-self[WAVEFORM_FREQ_KEY] / 2.0), n2s(self[WAVEFORM_FREQ_KEY] / 2.0))) self.vprint("Sweep rate: %sHz" % (n2s(self[WAVEFORM2_FREQ_KEY]),)) self.vprint("TX amplitude:", self[AMPLITUDE_KEY]) @@ -242,29 +242,29 @@ def setup_argparser(): Create argument parser for signal generator. """ parser = UHDApp.setup_argparser( - description="USRP Signal Generator.", - tx_or_rx="Tx", + description="USRP Signal Generator.", + tx_or_rx="Tx", ) group = parser.add_argument_group('Siggen Arguments') group.add_argument("-x", "--waveform-freq", type=eng_arg.eng_float, default=0.0, - help="Set baseband waveform frequency to FREQ") + help="Set baseband waveform frequency to FREQ") group.add_argument("-y", "--waveform2-freq", type=eng_arg.eng_float, default=0.0, - help="Set 2nd waveform frequency to FREQ") + help="Set 2nd waveform frequency to FREQ") group.add_argument("--sine", dest="type", action="store_const", const=analog.GR_SIN_WAVE, - help="Generate a carrier modulated by a complex sine wave", - default=analog.GR_SIN_WAVE) + help="Generate a carrier modulated by a complex sine wave", + default=analog.GR_SIN_WAVE) group.add_argument("--const", dest="type", action="store_const", const=analog.GR_CONST_WAVE, - help="Generate a constant carrier") + help="Generate a constant carrier") group.add_argument("--offset", type=eng_arg.eng_float, default=0, - help="Set waveform phase offset to OFFSET", metavar="OFFSET") + help="Set waveform phase offset to OFFSET", metavar="OFFSET") group.add_argument("--gaussian", dest="type", action="store_const", const=analog.GR_GAUSSIAN, - help="Generate Gaussian random output") + help="Generate Gaussian random output") group.add_argument("--uniform", dest="type", action="store_const", const=analog.GR_UNIFORM, - help="Generate Uniform random output") + help="Generate Uniform random output") group.add_argument("--2tone", dest="type", action="store_const", const="2tone", - help="Generate Two Tone signal for IMD testing") + help="Generate Two Tone signal for IMD testing") group.add_argument("--sweep", dest="type", action="store_const", const="sweep", - help="Generate a swept sine wave") + help="Generate a swept sine wave") return parser def main(): @@ -278,7 +278,7 @@ def main(): tb = USRPSiggen(args) except RuntimeError as ex: print(ex) - exit(1) + sys.exit(1) tb.start() input('[UHD-SIGGEN] Press Enter to quit:\n') tb.stop() diff --git a/gr-uhd/apps/uhd_siggen_gui b/gr-uhd/apps/uhd_siggen_gui index 231105d742..26d1bf647c 100755 --- a/gr-uhd/apps/uhd_siggen_gui +++ b/gr-uhd/apps/uhd_siggen_gui @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright 2015-2016,2018 Free Software Foundation, Inc. # @@ -38,6 +38,9 @@ except ImportError: from gnuradio.uhd import uhd_siggen_base as uhd_siggen +# The Qt stuff will throw PyLint warnings like crazy, so let's disable them +# pylint: disable=c-extension-no-member + class uhd_siggen_gui(Qt.QWidget): """ Signal Generator Flowgraph @@ -103,62 +106,62 @@ class uhd_siggen_gui(Qt.QWidget): self._waveform_button_group.buttonClicked[int].connect( lambda i: self.set_waveform(self._waveform_options[i]) ) - self.top_grid_layout.addWidget(self._waveform_group_box, 0,0,1,5) + self.top_grid_layout.addWidget(self._waveform_group_box, 0, 0, 1, 5) ### Center Frequency Sliders self.freq_coarse = self._sg.usrp.get_center_freq(self._sg.channels[0]) self._freq_coarse_range = Range( - self.usrp.get_freq_range(self._sg.channels[0]).start(), - self.usrp.get_freq_range(self._sg.channels[0]).stop(), - 1e3, # Step - self.freq_coarse, - 200, # Min Width + self.usrp.get_freq_range(self._sg.channels[0]).start(), + self.usrp.get_freq_range(self._sg.channels[0]).stop(), + 1e3, # Step + self.freq_coarse, + 200, # Min Width ) self._freq_coarse_win = RangeWidget( - self._freq_coarse_range, - self.set_freq_coarse, - "Center Frequency", - "counter_slider", - float + self._freq_coarse_range, + self.set_freq_coarse, + "Center Frequency", + "counter_slider", + float ) - self.top_grid_layout.addWidget(self._freq_coarse_win, 1,0,1,5) + self.top_grid_layout.addWidget(self._freq_coarse_win, 1, 0, 1, 5) self.freq_fine = 0.0 self._freq_fine_range = Range( - -1e6, 1e6, 1e3, - self.freq_fine, - 200 + -1e6, 1e6, 1e3, + self.freq_fine, + 200 ) self._freq_fine_win = RangeWidget( - self._freq_fine_range, - self.set_freq_fine, - "Fine Tuning", - "counter_slider", - float + self._freq_fine_range, + self.set_freq_fine, + "Fine Tuning", + "counter_slider", + float ) - self.top_grid_layout.addWidget(self._freq_fine_win, 2,0,1,5) + self.top_grid_layout.addWidget(self._freq_fine_win, 2, 0, 1, 5) self.lo_offset = self._sg.args.lo_offset self._lo_offset_range = Range( - -self._sg[uhd_siggen.SAMP_RATE_KEY]/2, - self._sg[uhd_siggen.SAMP_RATE_KEY]/2, - 1e3, - self.lo_offset, - 200 + -self._sg[uhd_siggen.SAMP_RATE_KEY]/2, + self._sg[uhd_siggen.SAMP_RATE_KEY]/2, + 1e3, + self.lo_offset, + 200 ) self._lo_offset_win = RangeWidget( - self._lo_offset_range, - self.set_lo_offset, - "LO Offset", - "counter_slider", - float + self._lo_offset_range, + self.set_lo_offset, + "LO Offset", + "counter_slider", + float ) - self.top_grid_layout.addWidget(self._lo_offset_win, 3,0,1,5) + self.top_grid_layout.addWidget(self._lo_offset_win, 3, 0, 1, 5) ### Signal frequencies self._freq1_enable_on = (analog.GR_SIN_WAVE, "2tone", "sweep") self._freq1_offset_range = Range( - -self._sg[uhd_siggen.SAMP_RATE_KEY]/2, - self._sg[uhd_siggen.SAMP_RATE_KEY]/2, - 100, - self._sg.args.waveform_freq, - 200 + -self._sg[uhd_siggen.SAMP_RATE_KEY]/2, + self._sg[uhd_siggen.SAMP_RATE_KEY]/2, + 100, + self._sg.args.waveform_freq, + 200 ) self._freq1_offset_win = RangeWidget( self._freq1_offset_range, @@ -168,14 +171,14 @@ class uhd_siggen_gui(Qt.QWidget): float ) self._freq1_offset_win.setEnabled(self._sg[uhd_siggen.TYPE_KEY] in self._freq1_enable_on) - self.top_grid_layout.addWidget(self._freq1_offset_win, 4,0,1,3) + self.top_grid_layout.addWidget(self._freq1_offset_win, 4, 0, 1, 3) self._freq2_enable_on = ("2tone", "sweep") self._freq2_offset_range = Range( - -self._sg[uhd_siggen.SAMP_RATE_KEY]/2, - self._sg[uhd_siggen.SAMP_RATE_KEY]/2, - 100, - self._sg.args.waveform2_freq, - 200 + -self._sg[uhd_siggen.SAMP_RATE_KEY]/2, + self._sg[uhd_siggen.SAMP_RATE_KEY]/2, + 100, + self._sg.args.waveform2_freq, + 200 ) self._freq2_offset_win = RangeWidget( self._freq2_offset_range, @@ -185,31 +188,31 @@ class uhd_siggen_gui(Qt.QWidget): float ) self._freq2_offset_win.setEnabled(self._sg[uhd_siggen.TYPE_KEY] in self._freq2_enable_on) - self.top_grid_layout.addWidget(self._freq2_offset_win, 4,3,1,2) + self.top_grid_layout.addWidget(self._freq2_offset_win, 4, 3, 1, 2) ### Amplitude self._amplitude_range = Range(0, 1, .001, .7, 200) self._amplitude_win = RangeWidget( - self._amplitude_range, - self.set_amplitude, - "Signal Amplitude", - "counter_slider", - float + self._amplitude_range, + self.set_amplitude, + "Signal Amplitude", + "counter_slider", + float ) - self.top_grid_layout.addWidget(self._amplitude_win, 5,0,1,5) + self.top_grid_layout.addWidget(self._amplitude_win, 5, 0, 1, 5) ### Gain self._gain_range = Range( - self.usrp.get_gain_range(self._sg.channels[0]).start(), - self.usrp.get_gain_range(self._sg.channels[0]).stop(), - .5, - self.usrp.get_gain(self._sg.channels[0]), - 200., + self.usrp.get_gain_range(self._sg.channels[0]).start(), + self.usrp.get_gain_range(self._sg.channels[0]).stop(), + .5, + self.usrp.get_gain(self._sg.channels[0]), + 200., ) self._gain_win = RangeWidget( - self._gain_range, - self._sg.set_gain, - "TX Gain", "counter_slider", float + self._gain_range, + self._sg.set_gain, + "TX Gain", "counter_slider", float ) - self.top_grid_layout.addWidget(self._gain_win, 6,0,1,5) + self.top_grid_layout.addWidget(self._gain_win, 6, 0, 1, 5) ### Samp rate, LO sync, Antenna Select self.samp_rate = self._sg[uhd_siggen.SAMP_RATE_KEY] self._samp_rate_tool_bar = Qt.QToolBar(self) @@ -219,11 +222,11 @@ class uhd_siggen_gui(Qt.QWidget): self._samp_rate_line_edit.returnPressed.connect( lambda: self.set_samp_rate(eng_notation.str_to_num(str(self._samp_rate_line_edit.text()))) ) - self.top_grid_layout.addWidget(self._samp_rate_tool_bar, 7,0,1,2) + self.top_grid_layout.addWidget(self._samp_rate_tool_bar, 7, 0, 1, 2) _sync_phases_push_button = Qt.QPushButton("Sync LOs") _sync_phases_push_button.pressed.connect(lambda: self.set_sync_phases(True)) _sync_phases_push_button.setEnabled(bool(len(self._sg.channels) > 1)) - self.top_grid_layout.addWidget(_sync_phases_push_button, 7,2,1,1) + self.top_grid_layout.addWidget(_sync_phases_push_button, 7, 2, 1, 1) # Antenna Select self._ant_tool_bar = Qt.QToolBar(self) self._ant_tool_bar.addWidget(Qt.QLabel("Antenna: ")) @@ -238,22 +241,24 @@ class uhd_siggen_gui(Qt.QWidget): ) self._ant_callback(self.usrp.get_antenna(self._sg.channels[0])) self._ant_combo_box.currentIndexChanged.connect(lambda i: self.set_ant(self._ant_options[i])) - self.top_grid_layout.addWidget(self._ant_tool_bar, 7,4,1,1) + self.top_grid_layout.addWidget(self._ant_tool_bar, 7, 4, 1, 1) # Labels + Lock Sensors self._lo_locked_probe_0_tool_bar = Qt.QToolBar(self) self._lo_locked_probe_0_formatter = lambda x: x self._lo_locked_probe_0_tool_bar.addWidget(Qt.QLabel("LO locked: ")) self._lo_locked_probe_0_label = Qt.QLabel(str(False)) self._lo_locked_probe_0_tool_bar.addWidget(self._lo_locked_probe_0_label) - self.top_grid_layout.addWidget(self._lo_locked_probe_0_tool_bar, 8,0,1,1) + self.top_grid_layout.addWidget(self._lo_locked_probe_0_tool_bar, 8, 0, 1, 1) def _chan0_lo_locked_probe(): " Monitor lock status of LO on channel 0 " while True: try: - val = all([self.usrp.get_sensor('lo_locked', c).to_bool() for c in range(len(self._sg.channels))]) + val = all([ + self.usrp.get_sensor('lo_locked', c).to_bool() + for c in range(len(self._sg.channels))]) self.set_chan0_lo_locked(val) except: - pass + self.set_chan0_lo_locked("Lock Detect Failed!") time.sleep(.1) _chan0_lo_locked_thread = threading.Thread(target=_chan0_lo_locked_probe) _chan0_lo_locked_thread.daemon = True @@ -264,14 +269,14 @@ class uhd_siggen_gui(Qt.QWidget): self._label_rf_freq_tool_bar.addWidget(Qt.QLabel("LO freq: ")) self._label_rf_freq_label = Qt.QLabel(str(self._label_rf_freq_formatter(self.label_rf_freq))) self._label_rf_freq_tool_bar.addWidget(self._label_rf_freq_label) - self.top_grid_layout.addWidget(self._label_rf_freq_tool_bar, 8,1,1,1) + self.top_grid_layout.addWidget(self._label_rf_freq_tool_bar, 8, 1, 1, 1) self.label_dsp_freq = self._sg.tr.actual_dsp_freq self._label_dsp_freq_tool_bar = Qt.QToolBar(self) self._label_dsp_freq_formatter = lambda x: x self._label_dsp_freq_tool_bar.addWidget(Qt.QLabel("DSP Freq: ")) self._label_dsp_freq_label = Qt.QLabel(str(self._label_dsp_freq_formatter(self.label_dsp_freq))) self._label_dsp_freq_tool_bar.addWidget(self._label_dsp_freq_label) - self.top_grid_layout.addWidget(self._label_dsp_freq_tool_bar, 8,2,1,1) + self.top_grid_layout.addWidget(self._label_dsp_freq_tool_bar, 8, 2, 1, 1) ################################################## # Freq Sink ################################################## @@ -296,7 +301,7 @@ class uhd_siggen_gui(Qt.QWidget): self.qtgui_freq_sink_x_0.set_line_color(0, "blue") self.qtgui_freq_sink_x_0.set_line_alpha(0, 1.0) self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget) - self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_win, 9,0,2,5) + self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_win, 9, 0, 2, 5) # Reconnect: self._sg.extra_sink = self.qtgui_freq_sink_x_0 self._sg[uhd_siggen.TYPE_KEY] = self._sg[uhd_siggen.TYPE_KEY] @@ -309,6 +314,7 @@ class uhd_siggen_gui(Qt.QWidget): # QT + Flowgraph stuff ################################################## def closeEvent(self, event): + """ Qt closeEvent() """ self.settings = Qt.QSettings("GNU Radio", "uhd_siggen_gui") self.settings.setValue("geometry", self.saveGeometry()) event.accept() @@ -325,26 +331,35 @@ class uhd_siggen_gui(Qt.QWidget): # Setters ################################################## def set_waveform(self, waveform): + """ Execute when the set-waveform button is clicked """ self._freq1_offset_win.setEnabled(waveform in self._freq1_enable_on) self._freq2_offset_win.setEnabled(waveform in self._freq2_enable_on) self._sg[uhd_siggen.TYPE_KEY] = waveform self._waveform_callback(waveform) def set_freq_coarse(self, freq_coarse): + """ Execute when the coarse freq slider is moved """ self.freq_coarse = freq_coarse self.update_center_freq() def set_freq_fine(self, freq_fine): + """ Execute when the fine freq slider is moved """ self.freq_fine = freq_fine self.update_center_freq() def set_lo_offset(self, lo_offset): + """ Execute when the LO offset slider is moved """ self.lo_offset = lo_offset self.update_center_freq() def update_center_freq(self): + """ + Call this when a widget changes the frequency. + Will update both spectrum widget and USRP. + """ if hasattr(self, "qtgui_freq_sink_x_0"): - self.qtgui_freq_sink_x_0.set_frequency_range(self.freq_coarse + self.freq_fine, self.samp_rate) + self.qtgui_freq_sink_x_0.set_frequency_range( + self.freq_coarse + self.freq_fine, self.samp_rate) self.tune() def tune(self): @@ -352,8 +367,8 @@ class uhd_siggen_gui(Qt.QWidget): Multi-channel tune """ tune_req = uhd.tune_request( - self.freq_fine + self.freq_coarse, - self.lo_offset + self.freq_fine + self.freq_coarse, + self.lo_offset ) for idx, chan in enumerate(self._sg.channels): tune_res = self.usrp.set_center_freq(tune_req, chan) @@ -362,25 +377,30 @@ class uhd_siggen_gui(Qt.QWidget): self.set_label_rf_freq(tune_res.actual_rf_freq) def set_freq1_offset(self, freq1_offset): + """ Execute when the freq1 slider is moved """ self._sg[uhd_siggen.WAVEFORM_FREQ_KEY] = freq1_offset def set_freq2_offset(self, freq2_offset): + """ Execute when the freq2 slider is moved """ self._sg[uhd_siggen.WAVEFORM2_FREQ_KEY] = freq2_offset def set_amplitude(self, amplitude): - self.amplitude = amplitude + """ Execute when the amplitude slider is moved """ self._sg[uhd_siggen.AMPLITUDE_KEY] = amplitude def set_sync_phases(self, sync): + """ Execute when the sync-phases button is pushed """ if sync: self._sg.vprint("Attempting to sync LO phases. This does not work with all boards.") self._sg.set_freq(self.freq_coarse + self.freq_fine, False) def set_ant(self, ant): + """ Execute when the antenna selection is changed """ self.ant = ant self._ant_callback(self.ant) def set_samp_rate(self, samp_rate): + """ Execute when the sampling rate is changed """ self.samp_rate = samp_rate Qt.QMetaObject.invokeMethod( self._samp_rate_line_edit, "setText", @@ -390,6 +410,7 @@ class uhd_siggen_gui(Qt.QWidget): self.update_center_freq() def set_label_rf_freq(self, label_rf_freq): + """ Update the RF frequency label """ self.label_rf_freq = label_rf_freq Qt.QMetaObject.invokeMethod( self._label_rf_freq_label, "setText", @@ -400,6 +421,7 @@ class uhd_siggen_gui(Qt.QWidget): ) def set_label_dsp_freq(self, label_dsp_freq): + """ Update the DSP frequency label """ self.label_dsp_freq = label_dsp_freq Qt.QMetaObject.invokeMethod( self._label_dsp_freq_label, "setText", @@ -410,15 +432,14 @@ class uhd_siggen_gui(Qt.QWidget): ) def set_chan0_lo_locked(self, chan0_lo_locked): - self.set_lo_locked_probe_0(chan0_lo_locked) - - def set_lo_locked_probe_0(self, lo_locked_probe_0): + """ + Update the LO locked label + """ Qt.QMetaObject.invokeMethod( - self._lo_locked_probe_0_label, "setText", - Qt.Q_ARG("QString", str(lo_locked_probe_0)) + self._lo_locked_probe_0_label, "setText", + Qt.Q_ARG("QString", str(chan0_lo_locked)) ) - def setup_parser(): """ Argument parser for siggen_gui @@ -426,8 +447,8 @@ def setup_parser(): parser = uhd_siggen.setup_argparser() group = parser.add_argument_group('GUI Arguments') group.add_argument( - "-q", "--show-freq-sink", action="store_true", - help="Show QT Frequency Widget" + "-q", "--show-freq-sink", action="store_true", + help="Show QT Frequency Widget" ) return parser @@ -447,9 +468,10 @@ def main(): def x11_init_threads(): " If on X11, init threads " - import ctypes if sys.platform.startswith('linux'): try: + # pylint: disable=import-outside-toplevel + import ctypes x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() except: |