diff options
Diffstat (limited to 'gr-uhd')
31 files changed, 152 insertions, 527 deletions
diff --git a/gr-uhd/Makefile.am b/gr-uhd/Makefile.am index c81a1a049..56829e9c4 100644 --- a/gr-uhd/Makefile.am +++ b/gr-uhd/Makefile.am @@ -21,7 +21,7 @@ include $(top_srcdir)/Makefile.common -SUBDIRS = include lib apps examples +SUBDIRS = include lib apps examples doc if PYTHON SUBDIRS += swig grc diff --git a/gr-uhd/doc/.gitignore b/gr-uhd/doc/.gitignore new file mode 100644 index 000000000..b336cc7ce --- /dev/null +++ b/gr-uhd/doc/.gitignore @@ -0,0 +1,2 @@ +/Makefile +/Makefile.in diff --git a/gr-uhd/examples/multi-antenna/Makefile.am b/gr-uhd/doc/Makefile.am index 0cb944589..eee3ebcf6 100644 --- a/gr-uhd/examples/multi-antenna/Makefile.am +++ b/gr-uhd/doc/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2006,2009 Free Software Foundation, Inc. +# Copyright 2011 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -21,9 +21,7 @@ include $(top_srcdir)/Makefile.common -ourdatadir = $(exampledir)/multi-antenna +SUBDIRS = -dist_ourdata_SCRIPTS = \ - multi_fft.py \ - multi_file.py \ - multi_scope.py +dist_gr_doc_DATA = \ + README.uhd diff --git a/gr-uhd/doc/README.uhd b/gr-uhd/doc/README.uhd new file mode 100644 index 000000000..ec8024c09 --- /dev/null +++ b/gr-uhd/doc/README.uhd @@ -0,0 +1,14 @@ +This is the GNU Radio UHD package. It is the interface to the UHD +library to connect to and send and receive data between the Ettus +Research, LLC product line. To use the UHD blocks, the Python +namespaces is in gnuradio.uhd, which would be normally imported +as: + + from gnuradio import uhd + +See the Doxygen documentation for details about the blocks available +in this package. A quick listing of the details can be found in Python +after importing by using: + + help(uhd) + diff --git a/gr-uhd/doc/uhd.dox b/gr-uhd/doc/uhd.dox new file mode 100644 index 000000000..f08fe2f06 --- /dev/null +++ b/gr-uhd/doc/uhd.dox @@ -0,0 +1,35 @@ +/*! \page page_uhd UHD Interface + +\section Introduction +This is the GNU Radio UHD package. It is the interface to the UHD +library to connect to and send and receive data between the Ettus +Research, LLC product line. To use the UHD blocks, the Python +namespaces is in gnuradio.uhd, which would be normally imported +as: + +\code + from gnuradio import uhd +\endcode + +The relevant blocks are listed in the \ref uhd_blk group. + +A quick listing of the details can be found in Python after importing +by using: + +\code + help(uhd) +\endcode + + +\section External Documentation + +Ettus Research keeps the comprehensive documentation to the underlying UHD driver, which can be found: + + http://files.ettus.com/uhd_docs/manual/html/ + +The UHD Doxygen page is located: + + http://files.ettus.com/uhd_docs/doxygen/html/index.html + + +*/ diff --git a/gr-uhd/examples/Makefile.am b/gr-uhd/examples/Makefile.am index b10b48928..a5dc177c4 100644 --- a/gr-uhd/examples/Makefile.am +++ b/gr-uhd/examples/Makefile.am @@ -21,7 +21,7 @@ include $(top_srcdir)/Makefile.common -SUBDIRS = multi-antenna +SUBDIRS = ourdatadir = $(exampledir)/uhd diff --git a/gr-uhd/examples/fm_tx4.py b/gr-uhd/examples/fm_tx4.py index 9b39752c1..7b04ebd73 100755 --- a/gr-uhd/examples/fm_tx4.py +++ b/gr-uhd/examples/fm_tx4.py @@ -83,9 +83,8 @@ class fm_tx_block(stdgui2.std_top_block): stdgui2.std_top_block.__init__ (self, frame, panel, vbox, argv) parser = OptionParser (option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-s", "--samp-rate", type="eng_float", default=400e3, @@ -116,7 +115,7 @@ class fm_tx_block(stdgui2.std_top_block): # ---------------------------------------------------------------- # Set up constants and parameters - self.u = uhd.usrp_sink(device_addr=options.address, + self.u = uhd.usrp_sink(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/fm_tx_2_daughterboards.py b/gr-uhd/examples/fm_tx_2_daughterboards.py index 36d237616..25325bd19 100755 --- a/gr-uhd/examples/fm_tx_2_daughterboards.py +++ b/gr-uhd/examples/fm_tx_2_daughterboards.py @@ -88,9 +88,8 @@ class my_top_block(gr.top_block): usage="%prog: [options] tx-freq0 tx-freq1" parser = OptionParser (option_class=eng_option, usage=usage) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-s", "--samp-rate", type="eng_float", default=320e3, @@ -109,10 +108,10 @@ class my_top_block(gr.top_block): # ---------------------------------------------------------------- # Set up USRP to transmit on both daughterboards - d = uhd.device_find(uhd.device_addr(options.address)) + d = uhd.find_devices(uhd.device_addr(options.args)) uhd_type = d[0].get('type') - self.u = uhd.usrp_sink(device_addr=options.address, + self.u = uhd.usrp_sink(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=2) diff --git a/gr-uhd/examples/max_power.py b/gr-uhd/examples/max_power.py index 44d3beeee..53e1b413c 100755 --- a/gr-uhd/examples/max_power.py +++ b/gr-uhd/examples/max_power.py @@ -39,14 +39,14 @@ n2s = eng_notation.num_to_str MAX_RATE = 1000e6 class build_block(gr.top_block): - def __init__(self, address, tx_enable, rx_enable): + def __init__(self, args, tx_enable, rx_enable): gr.top_block.__init__(self) - d = uhd.device_find(uhd.device_addr(address)) + d = uhd.find_devices(uhd.device_addr(args)) uhd_type = d[0].get('type') - print "\nFound '%s' at address '%s'" % \ - (uhd_type, address) + print "\nFound '%s' at args '%s'" % \ + (uhd_type, args) # Test the type of USRP; if it's a USRP (v1), it has # 2 channels; otherwise, it has 1 channel @@ -59,7 +59,7 @@ class build_block(gr.top_block): if tx_enable: print "\nTRANSMIT CHAIN" - self.u_tx = uhd.usrp_sink(device_addr=address, + self.u_tx = uhd.usrp_sink(device_addr=args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=tx_nchan) self.u_tx.set_samp_rate(MAX_RATE) @@ -92,7 +92,7 @@ class build_block(gr.top_block): if rx_enable: print "\nRECEIVE CHAIN" - self.u_rx = uhd.usrp_source(device_addr=address, + self.u_rx = uhd.usrp_source(device_addr=args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=rx_nchan) self.rx_dst0 = gr.null_sink (gr.sizeof_gr_complex) @@ -123,16 +123,15 @@ class build_block(gr.top_block): def main (): parser = OptionParser (option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-t", action="store_true", dest="tx_enable", default=False, help="enable Tx path") parser.add_option("-r", action="store_true", dest="rx_enable", default=False, help="enable Rx path") (options, args) = parser.parse_args () - tb = build_block (options.address, options.tx_enable, options.rx_enable) + tb = build_block (options.args, options.tx_enable, options.rx_enable) tb.start () raw_input ('Press Enter to quit: ') diff --git a/gr-uhd/examples/multi-antenna/.gitignore b/gr-uhd/examples/multi-antenna/.gitignore deleted file mode 100644 index ff40c06f3..000000000 --- a/gr-uhd/examples/multi-antenna/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -/Makefile -/Makefile.in -/.la -/.lo -/.deps -/.libs -/*.la -/*.lo -/*.pyc -/*.pyo -/*.dat diff --git a/gr-uhd/examples/multi-antenna/multi_fft.py b/gr-uhd/examples/multi-antenna/multi_fft.py deleted file mode 100755 index d4c878c84..000000000 --- a/gr-uhd/examples/multi-antenna/multi_fft.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2011 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -from gnuradio import gr, eng_notation -from gnuradio import uhd -from gnuradio.eng_option import eng_option -from gnuradio import eng_notation -from gnuradio import optfir -from optparse import OptionParser -from gnuradio.wxgui import stdgui2, fftsink2, waterfallsink2 -from gnuradio.wxgui import scopesink2, form, slider -import wx -import time -import os.path -import sys - -# required FPGA that can do 4 rx channels. - -class my_graph(stdgui2.std_top_block): - - def __init__(self, frame, panel, vbox, argv): - stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv) - - self.frame = frame - self.panel = panel - - parser = OptionParser (option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") - parser.add_option("-A", "--antenna", type="string", default=None, - help="select Rx Antenna where appropriate") - parser.add_option("-s", "--samp-rate", type="eng_float", default=1e6, - help="set sample rate (bandwidth) [default=%default]") - parser.add_option("-f", "--freq", type="eng_float", default=None, - help="set frequency to FREQ", metavar="FREQ") - parser.add_option("-g", "--gain", type="eng_float", default=None, - help="set gain in dB (default is midpoint)") - parser.add_option("-F", "--filter", action="store_true", default=True, - help="Enable channel filter") - parser.add_option("-N", "--nchans", type="int", default=1, - help="set number of channels (default=%default)") - (options, args) = parser.parse_args() - - if len(args) != 0: - parser.print_help() - raise SystemExit - - self.nchans = options.nchans - - if options.filter: - sw_decim = 4 - else: - sw_decim = 1 - - self.u = uhd.usrp_source(device_addr=options.address, - io_type=uhd.io_type.COMPLEX_FLOAT32, - num_channels=self.nchans) - self.u.set_samp_rate(options.samp_rate) - input_rate = self.u.get_samp_rate() - - if options.gain is None: - # if no gain was specified, use the mid-point in dB - g = self.u.get_gain_range() - options.gain = float(g.start()+g.stop())/2 - - if options.freq is None: - # if no freq was specified, use the mid-point - r = self.u.get_freq_range() - options.freq = float(r.start()+r.stop())/2 - - self.set_gain(options.gain) - self.set_freq(options.freq) - - #if self.u.nddcs() < nchan: - # sys.stderr.write('This code requires an FPGA build with %d DDCs. This FPGA has only %d.\n' % ( - # nchan, self.u.nddcs())) - # raise SystemExit - - #if (len (self.subdev) < 4 or - # self.u.db(0, 0).dbid() != usrp_dbid.BASIC_RX or - # self.u.db(0, 0).dbid() != usrp_dbid.BASIC_RX): - # sys.stderr.write('This code requires a Basic Rx board on Sides A & B\n') - # sys.exit(1) - - # deinterleave four channels from FPGA - di = gr.deinterleave(gr.sizeof_gr_complex) - - self.connect(self.u, di) - - # taps for channel filter - chan_filt_coeffs = optfir.low_pass (1, # gain - input_rate, # sampling rate - 80e3, # passband cutoff - 115e3, # stopband cutoff - 0.1, # passband ripple - 60) # stopband attenuation - #print len(chan_filt_coeffs) - - for i in range(self.nchans): - scope = fftsink2.fft_sink_c(panel, sample_rate=input_rate/sw_decim, - title="Input %d" % (i,), - ref_level=80, y_per_div=20) - vbox.Add(scope.win, 10, wx.EXPAND) - - if options.filter: - chan_filt = gr.fir_filter_ccf(sw_decim, chan_filt_coeffs) - self.connect((di, i), chan_filt, scope) - else: - self.connect((di, i), scope) - - def set_gain(self, gain): - for i in range(self.nchans): - self.u.set_gain(gain, i) - - - def set_freq(self, target_freq): - for i in range(self.nchans): - r = self.u.set_center_freq(target_freq, 0) - - if r: - return True - else: - print "set_freq: failed to set subdev[%d] freq to %f" % \ - (i, target_freq) - return False - -def main (): - app = stdgui2.stdapp(my_graph, "Multi Scope", nstatus=1) - app.MainLoop() - -if __name__ == '__main__': - main () diff --git a/gr-uhd/examples/multi-antenna/multi_file.py b/gr-uhd/examples/multi-antenna/multi_file.py deleted file mode 100755 index 87d9085e3..000000000 --- a/gr-uhd/examples/multi-antenna/multi_file.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python - -from gnuradio import gr, gru, eng_notation -from gnuradio import usrp -from gnuradio.eng_option import eng_option -from gnuradio import eng_notation -from gnuradio import optfir -from optparse import OptionParser -from usrpm import usrp_dbid -import time -import os.path -import sys - -# required FPGA that can do 4 rx channels. - - -class my_graph(gr.top_block): - - def __init__(self): - gr.top_block.__init__(self) - - parser = OptionParser (option_class=eng_option) - #parser.add_option("-S", "--subdev", type="subdev", default=(0, None), - # help="select USRP Rx side A or B (default=A)") - parser.add_option("-d", "--decim", type="int", default=128, - help="set fgpa decimation rate to DECIM [default=%default]") - parser.add_option("-f", "--freq", type="eng_float", default=146.585e6, - help="set frequency to FREQ [default=%default])", metavar="FREQ") - parser.add_option("-g", "--gain", type="eng_float", default=20, - help="set gain in dB [default=%default]") - parser.add_option("-F", "--filter", action="store_true", default=True, - help="Enable channel filter") - parser.add_option("-o", "--output", type="string", default=None, - help="set output basename") - (options, args) = parser.parse_args() - - if len(args) != 0: - parser.print_help() - raise SystemExit - - if options.output is None: - parser.print_help() - sys.stderr.write("You must provide an output filename base with -o OUTPUT\n") - raise SystemExit - else: - basename = options.output - - nchan = 4 - nsecs = 4.0 - - if options.filter: - sw_decim = 4 - else: - sw_decim = 1 - - self.u = usrp.source_c(0, options.decim, fpga_filename="std_4rx_0tx.rbf") - if self.u.nddcs() < nchan: - sys.stderr.write('This code requires an FPGA build with %d DDCs. This FPGA has only %d.\n' % ( - nchan, self.u.nddcs())) - raise SystemExit - - if not self.u.set_nchannels(nchan): - sys.stderr.write('set_nchannels(%d) failed\n' % (nchan,)) - raise SystemExit - - input_rate = self.u.adc_freq() / self.u.decim_rate() - print "USB data rate = %s" % (eng_notation.num_to_str(input_rate),) - sink_data_rate = input_rate/sw_decim - print "Scope data rate = %s" % (eng_notation.num_to_str(sink_data_rate),) - - self.subdev = self.u.db(0) + self.u.db(1) - - if (len(self.subdev) < 4 or - self.u.db(0, 0).dbid() != usrp_dbid.BASIC_RX or - self.u.db(1, 0).dbid() != usrp_dbid.BASIC_RX): - sys.stderr.write('This code requires a Basic Rx board on Sides A & B\n') - sys.exit(1) - - self.u.set_mux(gru.hexint(0xf3f2f1f0)) - - # collect 1 second worth of data - limit = int(nsecs * input_rate * nchan) - print "limit = ", limit - head = gr.head(gr.sizeof_gr_complex, limit) - - # deinterleave four channels from FPGA - di = gr.deinterleave(gr.sizeof_gr_complex) - - self.connect(self.u, head, di) - - # taps for channel filter - chan_filt_coeffs = optfir.low_pass (1, # gain - input_rate, # sampling rate - 80e3, # passband cutoff - 115e3, # stopband cutoff - 0.1, # passband ripple - 60) # stopband attenuation - #print len(chan_filt_coeffs) - - for i in range(nchan): - - sink = gr.file_sink(gr.sizeof_gr_complex, - basename + ("-%s-%d.dat" % (eng_notation.num_to_str(sink_data_rate), i))) - if options.filter: - chan_filt = gr.fir_filter_ccf(sw_decim, chan_filt_coeffs) - self.connect((di, i), chan_filt, sink) - else: - self.connect((di, i), sink) - - - self.set_gain(options.gain) - self.set_freq(options.freq) - - def set_gain(self, gain): - for i in range(len(self.subdev)): - self.subdev[i].set_gain(gain) - - def set_freq(self, target_freq): - ok = True - for i in range(len(self.subdev)): - r = usrp.tune(self.u, i, self.subdev[i], target_freq) - if not r: - ok = False - print "set_freq: failed to set subdev[%d] freq to %f" % ( - i, target_freq) - - return ok - - -def main (): - my_graph().run() - -if __name__ == '__main__': - main () diff --git a/gr-uhd/examples/multi-antenna/multi_scope.py b/gr-uhd/examples/multi-antenna/multi_scope.py deleted file mode 100755 index d1e28ad18..000000000 --- a/gr-uhd/examples/multi-antenna/multi_scope.py +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/env python - -from gnuradio import gr, gru, eng_notation -from gnuradio import usrp -from gnuradio.eng_option import eng_option -from gnuradio import eng_notation -from gnuradio import optfir -from optparse import OptionParser -from gnuradio.wxgui import stdgui2, fftsink2, waterfallsink2, scopesink2, form, slider -import wx -from usrpm import usrp_dbid -import time -import os.path -import sys - -# required FPGA that can do 4 rx channels. - - -class my_top_block(stdgui2.std_top_block): - - def __init__(self, frame, panel, vbox, argv): - stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv) - - self.frame = frame - self.panel = panel - - parser = OptionParser (option_class=eng_option) - #parser.add_option("-S", "--subdev", type="subdev", default=(0, None), - # help="select USRP Rx side A or B (default=A)") - parser.add_option("-d", "--decim", type="int", default=128, - help="set fgpa decimation rate to DECIM [default=%default]") - parser.add_option("-f", "--freq", type="eng_float", default=146.585e6, - help="set frequency to FREQ [default=%default])", metavar="FREQ") - parser.add_option("-g", "--gain", type="eng_float", default=20, - help="set gain in dB [default=%default]") - parser.add_option("-F", "--filter", action="store_true", default=True, - help="Enable channel filter") - (options, args) = parser.parse_args() - - if len(args) != 0: - parser.print_help() - raise SystemExit - - nchan = 4 - - if options.filter: - sw_decim = 4 - else: - sw_decim = 1 - - self.u = usrp.source_c(0, options.decim, fpga_filename="std_4rx_0tx.rbf") - if self.u.nddcs() < nchan: - sys.stderr.write('This code requires an FPGA build with %d DDCs. This FPGA has only %d.\n' % ( - nchan, self.u.nddcs())) - raise SystemExit - - if not self.u.set_nchannels(nchan): - sys.stderr.write('set_nchannels(%d) failed\n' % (nchan,)) - raise SystemExit - - input_rate = self.u.adc_freq() / self.u.decim_rate() - print "USB data rate = %s" % (eng_notation.num_to_str(input_rate),) - print "Scope data rate = %s" % (eng_notation.num_to_str(input_rate/sw_decim),) - - self.subdev = self.u.db(0) + self.u.db(1) - - if (len(self.subdev) < 4 or - self.u.db(0, 0).dbid() != usrp_dbid.BASIC_RX or - self.u.db(0, 0).dbid() != usrp_dbid.BASIC_RX): - sys.stderr.write('This code requires a Basic Rx board on Sides A & B\n') - sys.exit(1) - - self.u.set_mux(gru.hexint(0xf3f2f1f0)) - - # deinterleave four channels from FPGA - di = gr.deinterleave(gr.sizeof_gr_complex) - - self.connect(self.u, di) - - # our destination (8 float inputs) - self.scope = scopesink2.scope_sink_f(panel, sample_rate=input_rate/sw_decim, - num_inputs=2*nchan) - - # taps for channel filter - chan_filt_coeffs = optfir.low_pass (1, # gain - input_rate, # sampling rate - 80e3, # passband cutoff - 115e3, # stopband cutoff - 0.1, # passband ripple - 60) # stopband attenuation - #print len(chan_filt_coeffs) - - # bust the deinterleaved complex channels into floats - for i in range(nchan): - - if options.filter: - chan_filt = gr.fir_filter_ccf(sw_decim, chan_filt_coeffs) - c2f = gr.complex_to_float() - self.connect((di, i), chan_filt, c2f) - else: - c2f = gr.complex_to_float() - self.connect((di, i), c2f) - - self.connect((c2f, 0), (self.scope, 2*i + 0)) - self.connect((c2f, 1), (self.scope, 2*i + 1)) - - - self._build_gui(vbox) - - self.set_gain(options.gain) - self.set_freq(options.freq) - - def set_gain(self, gain): - for i in range(len(self.subdev)): - self.subdev[i].set_gain(gain) - - def set_freq(self, target_freq): - ok = True - for i in range(len(self.subdev)): - r = usrp.tune(self.u, i, self.subdev[i], target_freq) - if not r: - ok = False - print "set_freq: failed to set subdev[%d] freq to %f" % ( - i, target_freq) - - return ok - - - def _build_gui(self, vbox): - vbox.Add(self.scope.win, 10, wx.EXPAND) - - - -def main (): - app = stdgui2.stdapp(my_top_block, "Multi Scope", nstatus=1) - app.MainLoop() - -if __name__ == '__main__': - main () diff --git a/gr-uhd/examples/usrp_am_mw_rcv.py b/gr-uhd/examples/usrp_am_mw_rcv.py index 130bdcf56..a4fba9f0e 100755 --- a/gr-uhd/examples/usrp_am_mw_rcv.py +++ b/gr-uhd/examples/usrp_am_mw_rcv.py @@ -38,9 +38,8 @@ class wfm_rx_block (stdgui2.std_top_block): stdgui2.std_top_block.__init__ (self, frame, panel, vbox, argv) parser=OptionParser(option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-s", "--samp-rate", type="eng_float", default=1e6, @@ -74,7 +73,7 @@ class wfm_rx_block (stdgui2.std_top_block): self.freq = 0 # build graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_nbfm_ptt.py b/gr-uhd/examples/usrp_nbfm_ptt.py index af3b132f4..1f8a72e79 100755 --- a/gr-uhd/examples/usrp_nbfm_ptt.py +++ b/gr-uhd/examples/usrp_nbfm_ptt.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2005,2007.2011 Free Software Foundation, Inc. +# Copyright 2005,2007,2011 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -48,9 +48,8 @@ class ptt_block(stdgui2.std_top_block): self.space_bar_pressed = False parser = OptionParser (option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option ("-f", "--freq", type="eng_float", default=442.1e6, @@ -73,9 +72,9 @@ class ptt_block(stdgui2.std_top_block): if options.freq < 1e6: options.freq *= 1e6 - self.txpath = transmit_path(options.address, options.tx_gain, + self.txpath = transmit_path(options.args, options.tx_gain, options.audio_input) - self.rxpath = receive_path(options.address, options.rx_gain, + self.rxpath = receive_path(options.args, options.rx_gain, options.audio_output) self.connect(self.txpath) self.connect(self.rxpath) @@ -273,12 +272,12 @@ class ptt_block(stdgui2.std_top_block): # //////////////////////////////////////////////////////////////////////// class transmit_path(gr.hier_block2): - def __init__(self, address, gain, audio_input): + def __init__(self, args, gain, audio_input): gr.hier_block2.__init__(self, "transmit_path", gr.io_signature(0, 0, 0), # Input signature gr.io_signature(0, 0, 0)) # Output signature - self.u = uhd.usrp_sink(device_addr=address, + self.u = uhd.usrp_sink(device_addr=args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) @@ -361,12 +360,12 @@ class transmit_path(gr.hier_block2): # //////////////////////////////////////////////////////////////////////// class receive_path(gr.hier_block2): - def __init__(self, address, gain, audio_output): + def __init__(self, args, gain, audio_output): gr.hier_block2.__init__(self, "receive_path", gr.io_signature(0, 0, 0), # Input signature gr.io_signature(0, 0, 0)) # Output signature - self.u = uhd.usrp_source(device_addr=address, + self.u = uhd.usrp_source(device_addr=args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_nbfm_rcv.py b/gr-uhd/examples/usrp_nbfm_rcv.py index 2dc69423c..829381e7a 100755 --- a/gr-uhd/examples/usrp_nbfm_rcv.py +++ b/gr-uhd/examples/usrp_nbfm_rcv.py @@ -38,9 +38,8 @@ class my_top_block (stdgui2.std_top_block): stdgui2.std_top_block.__init__ (self,frame,panel,vbox,argv) parser=OptionParser(option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-f", "--freq", type="eng_float", default=146.585e6, @@ -68,7 +67,7 @@ class my_top_block (stdgui2.std_top_block): self.freq = 0 self.freq_step = 25e3 - self.rxpath = receive_path(options.address, options.antenna, + self.rxpath = receive_path(options.args, options.antenna, options.gain, options.audio_output) self.connect(self.rxpath) @@ -260,12 +259,12 @@ class my_top_block (stdgui2.std_top_block): USE_SIMPLE_SQUELCH = False class receive_path(gr.hier_block2): - def __init__(self, address, antenna, gain, audio_output): + def __init__(self, args, antenna, gain, audio_output): gr.hier_block2.__init__(self, "receive_path", gr.io_signature(0, 0, 0), # Input signature gr.io_signature(0, 0, 0)) # Output signature - self.u = uhd.usrp_source(device_addr=address, + self.u = uhd.usrp_source(device_addr=args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_spectrum_sense.py b/gr-uhd/examples/usrp_spectrum_sense.py index e89745b3b..cf41e7043 100755 --- a/gr-uhd/examples/usrp_spectrum_sense.py +++ b/gr-uhd/examples/usrp_spectrum_sense.py @@ -84,9 +84,8 @@ class my_top_block(gr.top_block): usage = "usage: %prog [options] min_freq max_freq" parser = OptionParser(option_class=eng_option, usage=usage) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-s", "--samp-rate", type="eng_float", default=1e6, @@ -130,7 +129,7 @@ class my_top_block(gr.top_block): print "Note: failed to enable realtime scheduling" # build graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_tv_rcv.py b/gr-uhd/examples/usrp_tv_rcv.py index a68867365..2ad1f2122 100755 --- a/gr-uhd/examples/usrp_tv_rcv.py +++ b/gr-uhd/examples/usrp_tv_rcv.py @@ -62,9 +62,8 @@ class tv_rx_block (stdgui2.std_top_block): usage="%prog: [options] [input_filename]. \n If you don't specify an input filename the usrp will be used as source\n " \ "Make sure your input capture file containes interleaved shorts not complex floats" parser=OptionParser(option_class=eng_option, usage=usage) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-s", "--samp-rate", type="eng_float", default=1e6, @@ -130,7 +129,7 @@ class tv_rx_block (stdgui2.std_top_block): self.gain=0.0 else: # use a UHD device - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_tv_rcv_nogui.py b/gr-uhd/examples/usrp_tv_rcv_nogui.py index a44e20d39..3fe426fbc 100755 --- a/gr-uhd/examples/usrp_tv_rcv_nogui.py +++ b/gr-uhd/examples/usrp_tv_rcv_nogui.py @@ -59,9 +59,8 @@ class my_top_block(gr.top_block): "Make sure your input capture file containes interleaved " + \ "shorts not complex floats") parser = OptionParser(option_class=eng_option, usage=usage) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-s", "--samp-rate", type="eng_float", default=1e6, @@ -130,7 +129,7 @@ class my_top_block(gr.top_block): raise SystemExit, 1 # build the graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_wfm_rcv.py b/gr-uhd/examples/usrp_wfm_rcv.py index 7b35fbbe4..138e5045b 100755 --- a/gr-uhd/examples/usrp_wfm_rcv.py +++ b/gr-uhd/examples/usrp_wfm_rcv.py @@ -34,9 +34,8 @@ class wfm_rx_block (stdgui2.std_top_block): stdgui2.std_top_block.__init__ (self,frame,panel,vbox,argv) parser=OptionParser(option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-f", "--freq", type="eng_float", default=100.1e6, @@ -68,7 +67,7 @@ class wfm_rx_block (stdgui2.std_top_block): self.fm_freq_max = options.freq_max # build graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_wfm_rcv2_nogui.py b/gr-uhd/examples/usrp_wfm_rcv2_nogui.py index 013a6864f..13f89c71c 100755 --- a/gr-uhd/examples/usrp_wfm_rcv2_nogui.py +++ b/gr-uhd/examples/usrp_wfm_rcv2_nogui.py @@ -33,9 +33,8 @@ class wfm_rx_block (gr.top_block): gr.top_block.__init__(self) parser=OptionParser(option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("", "--f1", type="eng_float", default=100.7e6, @@ -69,7 +68,7 @@ class wfm_rx_block (gr.top_block): self.fm_freq_max = options.freq_max # build graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=2) diff --git a/gr-uhd/examples/usrp_wfm_rcv_fmdet.py b/gr-uhd/examples/usrp_wfm_rcv_fmdet.py index 53ad6edbf..d13ebe829 100755 --- a/gr-uhd/examples/usrp_wfm_rcv_fmdet.py +++ b/gr-uhd/examples/usrp_wfm_rcv_fmdet.py @@ -28,18 +28,13 @@ from optparse import OptionParser import sys import wx -import os -print os.getpid() -raw_input() - class wfm_rx_block (stdgui2.std_top_block): def __init__(self,frame,panel,vbox,argv): stdgui2.std_top_block.__init__ (self,frame,panel,vbox,argv) parser=OptionParser(option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-f", "--freq", type="eng_float", default=100.1e6, @@ -74,7 +69,7 @@ class wfm_rx_block (stdgui2.std_top_block): self.fm_freq_max = options.freq_max # build graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_wfm_rcv_nogui.py b/gr-uhd/examples/usrp_wfm_rcv_nogui.py index ffeda4493..7c2c6050d 100755 --- a/gr-uhd/examples/usrp_wfm_rcv_nogui.py +++ b/gr-uhd/examples/usrp_wfm_rcv_nogui.py @@ -32,9 +32,8 @@ class wfm_rx_block (gr.top_block): gr.top_block.__init__(self) parser=OptionParser(option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-f", "--freq", type="eng_float", default=100.1e6, @@ -62,7 +61,7 @@ class wfm_rx_block (gr.top_block): self.fm_freq_max = options.freq_max # build graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_wfm_rcv_pll.py b/gr-uhd/examples/usrp_wfm_rcv_pll.py index 2cb4e4068..78c05e057 100755 --- a/gr-uhd/examples/usrp_wfm_rcv_pll.py +++ b/gr-uhd/examples/usrp_wfm_rcv_pll.py @@ -34,9 +34,8 @@ class wfm_rx_block (stdgui2.std_top_block): stdgui2.std_top_block.__init__ (self,frame,panel,vbox,argv) parser=OptionParser(option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-f", "--freq", type="eng_float", default=100.1e6, @@ -70,7 +69,7 @@ class wfm_rx_block (stdgui2.std_top_block): self.fm_freq_max = options.freq_max # build graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_wfm_rcv_sca.py b/gr-uhd/examples/usrp_wfm_rcv_sca.py index 1c6154871..f0f6aec66 100755 --- a/gr-uhd/examples/usrp_wfm_rcv_sca.py +++ b/gr-uhd/examples/usrp_wfm_rcv_sca.py @@ -64,9 +64,8 @@ class wfm_rx_sca_block (stdgui2.std_top_block): stdgui2.std_top_block.__init__ (self,frame,panel,vbox,argv) parser=OptionParser(option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-f", "--freq", type="eng_float", default=100.1e6, @@ -99,7 +98,7 @@ class wfm_rx_sca_block (stdgui2.std_top_block): # build graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/examples/usrp_wxapt_rcv.py b/gr-uhd/examples/usrp_wxapt_rcv.py index 5b44398d1..809756d96 100755 --- a/gr-uhd/examples/usrp_wxapt_rcv.py +++ b/gr-uhd/examples/usrp_wxapt_rcv.py @@ -34,9 +34,8 @@ class wxapt_rx_block (stdgui2.std_top_block): stdgui2.std_top_block.__init__ (self,frame,panel,vbox,argv) parser=OptionParser(option_class=eng_option) - parser.add_option("-a", "--address", type="string", - default="addr=192.168.10.2", - help="Address of UHD device, [default=%default]") + parser.add_option("-a", "--args", type="string", default="", + help="UHD device address args, [default=%default]") parser.add_option("-A", "--antenna", type="string", default=None, help="select Rx Antenna where appropriate") parser.add_option("-f", "--freq", type="eng_float", default=137.5e6, @@ -68,7 +67,7 @@ class wxapt_rx_block (stdgui2.std_top_block): self.freq_max = options.freq_max # build graph - self.u = uhd.usrp_source(device_addr=options.address, + self.u = uhd.usrp_source(device_addr=options.args, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) diff --git a/gr-uhd/include/gr_uhd_amsg_source.h b/gr-uhd/include/gr_uhd_amsg_source.h index bc0feb438..accf15ce2 100644 --- a/gr-uhd/include/gr_uhd_amsg_source.h +++ b/gr-uhd/include/gr_uhd_amsg_source.h @@ -28,6 +28,10 @@ class uhd_amsg_source; +/*! + * \brief Make a new USRP asynchronous message-based source block. + * \ingroup uhd_blk + */ GR_UHD_API boost::shared_ptr<uhd_amsg_source> uhd_make_amsg_source( const uhd::device_addr_t &device_addr, gr_msg_queue_sptr msgq diff --git a/gr-uhd/include/gr_uhd_usrp_sink.h b/gr-uhd/include/gr_uhd_usrp_sink.h index c1fc3b09e..f11d00063 100644 --- a/gr-uhd/include/gr_uhd_usrp_sink.h +++ b/gr-uhd/include/gr_uhd_usrp_sink.h @@ -30,6 +30,7 @@ class uhd_usrp_sink; /*! * \brief Make a new USRP sink block. + * \ingroup uhd_blk * * The USRP sink block reads a stream and transmits the samples. * The sink block also provides API calls for transmitter settings. diff --git a/gr-uhd/include/gr_uhd_usrp_source.h b/gr-uhd/include/gr_uhd_usrp_source.h index f8ac9361e..fecc6e94d 100644 --- a/gr-uhd/include/gr_uhd_usrp_source.h +++ b/gr-uhd/include/gr_uhd_usrp_source.h @@ -30,6 +30,7 @@ class uhd_usrp_source; /*! * \brief Make a new USRP source block. + * \ingroup uhd_blk * * The USRP source block receives samples and writes to a stream. * The source block also provides API calls for receiver settings. diff --git a/gr-uhd/swig/__init__.py b/gr-uhd/swig/__init__.py index 1f82b4a26..7745b4b79 100644 --- a/gr-uhd/swig/__init__.py +++ b/gr-uhd/swig/__init__.py @@ -19,6 +19,12 @@ # Boston, MA 02110-1301, USA. # +''' +This is the GNU Radio UHD package. It is the interface to the UHD +library to connect to and send and receive data between the Ettus +Research, LLC product line. +''' + ######################################################################## # Prepare uhd swig module to make it more pythonic ######################################################################## @@ -63,6 +69,15 @@ def _prepare_uhd_swig(): if hasattr(myobj, 'to_real'): myobj.__float__ = lambda o: o.to_real() if attr.endswith('_t'): setattr(uhd_swig, attr[:-2], myobj) + #make a new find devices that casts everything with the pythonized device_addr_t which has __str__ + def find_devices(*args, **kwargs): + def to_pythonized_dev_addr(dev_addr): + new_dev_addr = uhd_swig.device_addr_t() + for key in dev_addr.keys(): new_dev_addr[key] = dev_addr.get(key) + return new_dev_addr + return map(to_pythonized_dev_addr, uhd_swig.find_devices_raw(*args, **kwargs)) + setattr(uhd_swig, 'find_devices', find_devices) + #Cast constructor args (FIXME swig handle overloads?) for attr in ('usrp_source', 'usrp_sink', 'amsg_source'): def constructor_factory(old_constructor): diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i index f8381ae64..7e612907c 100644 --- a/gr-uhd/swig/uhd_swig.i +++ b/gr-uhd/swig/uhd_swig.i @@ -102,6 +102,17 @@ GR_SWIG_BLOCK_MAGIC(uhd,amsg_source) %include <gr_uhd_amsg_source.h> //////////////////////////////////////////////////////////////////////// +// device discovery (no need to %include device.hpp) +//////////////////////////////////////////////////////////////////////// +%{ +static uhd::device_addrs_t find_devices_raw(const uhd::device_addr_t &dev_addr = uhd::device_addr_t()){ + return uhd::device::find(dev_addr); +} +%} + +static uhd::device_addrs_t find_devices_raw(const uhd::device_addr_t &dev_addr = uhd::device_addr_t()); + +//////////////////////////////////////////////////////////////////////// // helpful constants //////////////////////////////////////////////////////////////////////// %{ |