summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gr-uhd/apps/uhd_app.py127
-rwxr-xr-xgr-uhd/apps/uhd_siggen6
-rw-r--r--gr-uhd/apps/uhd_siggen_base.py54
-rwxr-xr-xgr-uhd/apps/uhd_siggen_gui186
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: