From d029af43c3367a4611185ade70639cc6b7cc5e3d Mon Sep 17 00:00:00 2001 From: Josh Blum <josh@joshknows.com> Date: Mon, 18 Oct 2010 14:09:23 -0700 Subject: uhd: created multi usrp grc wrapper generator, removed mimo gen and checked in its generated files --- gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py | 211 ++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100755 gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py (limited to 'gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py') diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py new file mode 100755 index 0000000000..a4da53a188 --- /dev/null +++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python +""" +Copyright 2010 Free Software Foundation, Inc. + +This file is part of GNU Radio + +GNU Radio Companion 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 2 +of the License, or (at your option) any later version. + +GNU Radio Companion 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 this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +""" + +MAIN_TMPL = """\ +<?xml version="1.0"?> +<block> + <name>UHD: Multi USRP $sourk.title()</name> + <key>uhd_multi_usrp_$(sourk)</key> + <category>UHD</category> + <import>from gnuradio import uhd</import> + <make>uhd.multi_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan) +self.\$(id).set_subdev_spec(\$sd_spec) +self.\$(id).set_samp_rate(\$samp_rate) +#for $n in range($max_nchan) +\#if \$nchan() > $n +self.\$(id).set_center_freq(\$center_freq$(n), $n) +self.\$(id).set_gain(\$gain$(n), $n) + \#if \$ant$(n)() +self.\$(id).set_antenna(\$ant$(n), $n) + \#end if +\#end if +#end for +</make> + <callback>set_samp_rate(\$samp_rate)</callback> + #for $n in range($max_nchan) + <callback>set_center_freq(\$center_freq$(n), $n)</callback> + <callback>set_gain(\$gain$(n), $n)</callback> + <callback>set_antenna(\$ant$(n), $n)</callback> + #end for + <param> + <name>Input Type</name> + <key>type</key> + <type>enum</type> + <option> + <name>Complex</name> + <key>complex</key> + <opt>type:COMPLEX_FLOAT32</opt> + <opt>vlen:1</opt> + </option> + <option> + <name>Short</name> + <key>short</key> + <opt>type:COMPLEX_INT16</opt> + <opt>vlen:2</opt> + </option> + </param> + <param> + <name>Num Channels</name> + <key>nchan</key> + <value>1</value> + <type>int</type> + <hide>part</hide> + <option> + <name>Multi Channel</name> + <key>1</key> + </option> + <option> + <name>Dual Channel</name> + <key>2</key> + </option> + <option> + <name>Quad Channel</name> + <key>4</key> + </option> + </param> + <param> + <name>Device Addr</name> + <key>dev_addr</key> + <value>addr=192.168.10.2</value> + <type>string</type> + <hide> + \#if \$dev_addr() + none + \#else + part + \#end if + </hide> + </param> + <param> + <name>Subdev Spec</name> + <key>sd_spec</key> + <value></value> + <type>string</type> + <hide> + \#if \$sd_spec() + none + \#else + part + \#end if + </hide> + </param> + <param> + <name>Samp Rate (Sps)</name> + <key>samp_rate</key> + <value>samp_rate</value> + <type>real</type> + </param> + $params + <check>$max_nchan >= \$nchan</check> + <check>\$nchan >= 0</check> + <check>(len((\$sd_spec).split()) or 1) == \$nchan</check> + <$sourk> + <name>$direction</name> + <type>\$type</type> + <vlen>\$type.vlen</vlen> + <nports>\$nchan</nports> + </$sourk> + <doc> +The UHD Multi USRP $sourk.title() Block: + +Device Address: +The device address is a delimited string used to locate UHD devices on your system. \\ +If left blank, the first UHD device found will be used. \\ +Used args to specify a specfic device. +USRP2 Example: addr=192.168.10.2 192.168.10.3 + +Sample rate: +The sample rate is the number of samples per second input by this block. \\ +The UHD device driver will try its best to match the requested sample rate. \\ +If the requested rate is not possible, the UHD block will print an error at runtime. + +Subdevice specification: +Select the subdevice or subdevices for each channel using a markup string. \\ +The markup string consists of a list of dboard_slot:subdev_name pairs (one pair per channel). \\ +If left blank, the UHD will try to select the first subdevice on your system. \\ +See the application notes for further details. +Single channel example: A:AB +Dual channel example: A:AB B:0 + +Antenna: +For subdevices/daughterboards with only one antenna, this may be left blank. \\ +Otherwise, the user should specify one of the possible antenna choices. \\ +See the daughterboard application notes for the possible antenna choices. + </doc> +</block> +""" + +PARAMS_TMPL = """ + <param> + <name>Ch$(n): Center Freq (Hz)</name> + <key>center_freq$(n)</key> + <value>0</value> + <type>real</type> + <hide>\#if \$nchan() > $n then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch$(n): Gain (dB)</name> + <key>gain$(n)</key> + <value>0</value> + <type>real</type> + <hide>\#if \$nchan() > $n then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch$(n): Antenna</name> + <key>ant$(n)</key> + <value></value> + <type>string</type> + <hide> + \#if not \$nchan() > $n + all + \#elif \$ant$(n)() + none + \#else + part + \#end if + </hide> + </param> +""" + +def parse_tmpl(_tmpl, **kwargs): + from Cheetah import Template + return str(Template.Template(_tmpl, kwargs)) + +max_num_channels = 4 + +if __name__ == '__main__': + import sys + for file in sys.argv[1:]: + if 'source' in file: + sourk = 'source' + direction = 'out' + elif 'sink' in file: + sourk = 'sink' + direction = 'in' + else: raise Exception, 'is %s a source or sink?'%file + + params = ''.join([parse_tmpl(PARAMS_TMPL, n=n) for n in range(max_num_channels)]) + open(file, 'w').write(parse_tmpl(MAIN_TMPL, + max_nchan=max_num_channels, + params=params, + sourk=sourk, + direction=direction, + )) -- cgit v1.2.3 From 1e5db4248e2488e0f1b44ac1405d78e16c2408d8 Mon Sep 17 00:00:00 2001 From: Josh Blum <josh@joshknows.com> Date: Mon, 18 Oct 2010 16:13:10 -0700 Subject: uhd: work on multi usrp blocks, use block tree to categorize blocks, deprecate mimo blocks --- gr-uhd/grc/Makefile.am | 1 + gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py | 101 +++++++++++++++++++-------- gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 3 +- gr-uhd/grc/uhd_block_tree.xml | 23 ++++++ gr-uhd/grc/uhd_mimo_sink.xml | 3 +- gr-uhd/grc/uhd_mimo_source.xml | 3 +- gr-uhd/grc/uhd_simple_sink.xml | 1 - gr-uhd/grc/uhd_simple_source.xml | 1 - 8 files changed, 99 insertions(+), 37 deletions(-) create mode 100644 gr-uhd/grc/uhd_block_tree.xml (limited to 'gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py') diff --git a/gr-uhd/grc/Makefile.am b/gr-uhd/grc/Makefile.am index 04b7dca365..d424ca7096 100644 --- a/gr-uhd/grc/Makefile.am +++ b/gr-uhd/grc/Makefile.am @@ -36,6 +36,7 @@ BUILT_SOURCES = \ $(generated_uhd_single_usrp_blocks) dist_grcblocks_DATA = \ + uhd_block_tree.xml \ $(BUILT_SOURCES) # add the deprecated files diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py index a4da53a188..8de4408d5a 100755 --- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py @@ -24,10 +24,16 @@ MAIN_TMPL = """\ <block> <name>UHD: Multi USRP $sourk.title()</name> <key>uhd_multi_usrp_$(sourk)</key> - <category>UHD</category> <import>from gnuradio import uhd</import> <make>uhd.multi_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan) -self.\$(id).set_subdev_spec(\$sd_spec) +\#if \$sync() +self.\$(id).set_time_unknown_pps(uhd.time_spec_t()) +\#end if +#for $m in range($max_mboards) +\#if \$num_mboards() > $m +self.\$(id).set_subdev_spec(\$sd_spec$(m), $m) +\#end if +#end for self.\$(id).set_samp_rate(\$samp_rate) #for $n in range($max_nchan) \#if \$nchan() > $n @@ -62,25 +68,6 @@ self.\$(id).set_antenna(\$ant$(n), $n) <opt>vlen:2</opt> </option> </param> - <param> - <name>Num Channels</name> - <key>nchan</key> - <value>1</value> - <type>int</type> - <hide>part</hide> - <option> - <name>Multi Channel</name> - <key>1</key> - </option> - <option> - <name>Dual Channel</name> - <key>2</key> - </option> - <option> - <name>Quad Channel</name> - <key>4</key> - </option> - </param> <param> <name>Device Addr</name> <key>dev_addr</key> @@ -95,18 +82,61 @@ self.\$(id).set_antenna(\$ant$(n), $n) </hide> </param> <param> - <name>Subdev Spec</name> - <key>sd_spec</key> + <name>Sync</name> + <key>sync</key> + <value>sync</value> + <type>enum</type> + <hide>\#if \$sync() then 'none' else 'part'#</hide> + <option> + <name>unknown PPS</name> + <key>sync</key> + </option> + <option> + <name>don't sync</name> + <key></key> + </option> + </param> + <param> + <name>Num Mboards</name> + <key>num_mboards</key> + <value>2</value> + <type>int</type> + #for $m in range(1, $max_mboards) + <option> + <name>$(m)</name> + <key>$m</key> + </option> + #end for + </param> + #for $m in range($max_mboards) + <param> + <name>Mb$(m): Subdev Spec</name> + <key>sd_spec$(m)</key> <value></value> <type>string</type> <hide> - \#if \$sd_spec() + \#if not \$num_mboards() > $m + all + \#elif \$sd_spec$(m)() none \#else part \#end if </hide> </param> + #end for + <param> + <name>Num Channels</name> + <key>nchan</key> + <value>2</value> + <type>int</type> + #for $n in range(1, $max_nchan) + <option> + <name>$(n)</name> + <key>$n</key> + </option> + #end for + </param> <param> <name>Samp Rate (Sps)</name> <key>samp_rate</key> @@ -115,8 +145,10 @@ self.\$(id).set_antenna(\$ant$(n), $n) </param> $params <check>$max_nchan >= \$nchan</check> - <check>\$nchan >= 0</check> - <check>(len((\$sd_spec).split()) or 1) == \$nchan</check> + <check>\$nchan > 0</check> + <check>$max_mboards >= \$num_mboards</check> + <check>\$num_mboards > 0</check> + <check>\$nchan >= \$num_mboards</check> <$sourk> <name>$direction</name> <type>\$type</type> @@ -132,18 +164,27 @@ If left blank, the first UHD device found will be used. \\ Used args to specify a specfic device. USRP2 Example: addr=192.168.10.2 192.168.10.3 +Num Motherboards: +Selects the number of USRP motherboards in this multi-USRP configuration. + +Num Channels: +Selects the total number of channels in this multi-USRP configuration. +Ex: 4 motherboards with 2 channels per board = 8 channels total + Sample rate: The sample rate is the number of samples per second input by this block. \\ The UHD device driver will try its best to match the requested sample rate. \\ If the requested rate is not possible, the UHD block will print an error at runtime. Subdevice specification: +Each motherboard should have its own subdevice specification \\ +and all subdevice specifications should be the same length. \\ Select the subdevice or subdevices for each channel using a markup string. \\ The markup string consists of a list of dboard_slot:subdev_name pairs (one pair per channel). \\ If left blank, the UHD will try to select the first subdevice on your system. \\ See the application notes for further details. -Single channel example: A:AB -Dual channel example: A:AB B:0 +Single channel example: :AB +Dual channel example: :A :B Antenna: For subdevices/daughterboards with only one antenna, this may be left blank. \\ @@ -189,7 +230,8 @@ def parse_tmpl(_tmpl, **kwargs): from Cheetah import Template return str(Template.Template(_tmpl, kwargs)) -max_num_channels = 4 +max_num_mboards = 4 +max_num_channels = max_num_mboards*4 if __name__ == '__main__': import sys @@ -205,6 +247,7 @@ if __name__ == '__main__': params = ''.join([parse_tmpl(PARAMS_TMPL, n=n) for n in range(max_num_channels)]) open(file, 'w').write(parse_tmpl(MAIN_TMPL, max_nchan=max_num_channels, + max_mboards=max_num_mboards, params=params, sourk=sourk, direction=direction, diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py index 5b3cb5b5aa..5b87719e5e 100755 --- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py @@ -24,7 +24,6 @@ MAIN_TMPL = """\ <block> <name>UHD: Single USRP $sourk.title()</name> <key>uhd_single_usrp_$(sourk)</key> - <category>UHD</category> <import>from gnuradio import uhd</import> <make>uhd.single_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan) self.\$(id).set_subdev_spec(\$sd_spec) @@ -115,7 +114,7 @@ self.\$(id).set_antenna(\$ant$(n), $n) </param> $params <check>$max_nchan >= \$nchan</check> - <check>\$nchan >= 0</check> + <check>\$nchan > 0</check> <check>(len((\$sd_spec).split()) or 1) == \$nchan</check> <$sourk> <name>$direction</name> diff --git a/gr-uhd/grc/uhd_block_tree.xml b/gr-uhd/grc/uhd_block_tree.xml new file mode 100644 index 0000000000..e8c4f069d9 --- /dev/null +++ b/gr-uhd/grc/uhd_block_tree.xml @@ -0,0 +1,23 @@ +<?xml version="1.0"?> +<!-- +################################################### +##Block Tree for uhd blocks. +################################################### + --> +<cat> + <name></name> <!-- Blank for Root Name --> + <cat> + <name>UHD</name> + <block>uhd_single_usrp_source</block> + <block>uhd_single_usrp_sink</block> + <block>uhd_multi_usrp_source</block> + <block>uhd_multi_usrp_sink</block> + </cat> + <cat> + <name>UHD (DEPRECATED)</name> + <block>uhd_simple_source</block> + <block>uhd_simple_sink</block> + <block>uhd_mimo_source</block> + <block>uhd_mimo_sink</block> + </cat> +</cat> diff --git a/gr-uhd/grc/uhd_mimo_sink.xml b/gr-uhd/grc/uhd_mimo_sink.xml index 2f5f2011f1..13865c913a 100644 --- a/gr-uhd/grc/uhd_mimo_sink.xml +++ b/gr-uhd/grc/uhd_mimo_sink.xml @@ -1,8 +1,7 @@ <?xml version="1.0"?> <block> - <name>UHD MIMO Sink</name> + <name>UHD MIMO Sink (DEPRECATED)</name> <key>uhd_mimo_sink</key> - <category>UHD</category> <import>from gnuradio import uhd</import> <make>uhd.mimo_sink($nchan, $args, uhd.io_type_t.$type.type) self.$(id).set_samp_rate_all($samp_rate) diff --git a/gr-uhd/grc/uhd_mimo_source.xml b/gr-uhd/grc/uhd_mimo_source.xml index d8f4e6d667..6167838b0b 100644 --- a/gr-uhd/grc/uhd_mimo_source.xml +++ b/gr-uhd/grc/uhd_mimo_source.xml @@ -1,8 +1,7 @@ <?xml version="1.0"?> <block> - <name>UHD MIMO Source</name> + <name>UHD MIMO Source (DEPRECATED)</name> <key>uhd_mimo_source</key> - <category>UHD</category> <import>from gnuradio import uhd</import> <make>uhd.mimo_source($nchan, $args, uhd.io_type_t.$type.type) self.$(id).set_samp_rate_all($samp_rate) diff --git a/gr-uhd/grc/uhd_simple_sink.xml b/gr-uhd/grc/uhd_simple_sink.xml index 66dc5bf145..ee6051432a 100644 --- a/gr-uhd/grc/uhd_simple_sink.xml +++ b/gr-uhd/grc/uhd_simple_sink.xml @@ -7,7 +7,6 @@ <block> <name>UHD Simple Sink (DEPRECATED)</name> <key>uhd_simple_sink</key> - <category>UHD</category> <import>from gnuradio import uhd</import> <make>uhd.simple_sink($args, uhd.io_type_t.$type.type) self.$(id).set_subdev_spec($sd_spec) diff --git a/gr-uhd/grc/uhd_simple_source.xml b/gr-uhd/grc/uhd_simple_source.xml index 00c60f41d9..825981d66f 100644 --- a/gr-uhd/grc/uhd_simple_source.xml +++ b/gr-uhd/grc/uhd_simple_source.xml @@ -7,7 +7,6 @@ <block> <name>UHD Simple Source (DEPRECATED)</name> <key>uhd_simple_source</key> - <category>UHD</category> <import>from gnuradio import uhd</import> <make>uhd.simple_source($args, uhd.io_type_t.$type.type) self.$(id).set_subdev_spec($sd_spec) -- cgit v1.2.3 From 7f46efca9cb0c87e9130c117ac41650f6e0c25cc Mon Sep 17 00:00:00 2001 From: Josh Blum <josh@joshknows.com> Date: Mon, 18 Oct 2010 16:49:08 -0700 Subject: uhd: renamed make function params, cleanup, clock config for multi usrp --- gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py | 11 ++++++++++- gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 6 +++++- gr-uhd/lib/uhd_multi_usrp_sink.cc | 19 ++++++++++++------- gr-uhd/lib/uhd_multi_usrp_sink.h | 4 ++-- gr-uhd/lib/uhd_multi_usrp_source.cc | 18 +++++++++++------- gr-uhd/lib/uhd_multi_usrp_source.h | 4 ++-- gr-uhd/lib/uhd_single_usrp_sink.cc | 19 ++++++++++++------- gr-uhd/lib/uhd_single_usrp_sink.h | 4 ++-- gr-uhd/lib/uhd_single_usrp_source.cc | 18 +++++++++++------- gr-uhd/lib/uhd_single_usrp_source.h | 4 ++-- 10 files changed, 69 insertions(+), 38 deletions(-) (limited to 'gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py') diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py index 8de4408d5a..aa550157d2 100755 --- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py @@ -25,8 +25,17 @@ MAIN_TMPL = """\ <name>UHD: Multi USRP $sourk.title()</name> <key>uhd_multi_usrp_$(sourk)</key> <import>from gnuradio import uhd</import> - <make>uhd.multi_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan) + <make>uhd.multi_usrp_$(sourk)( + device_addr=\$dev_addr, + io_type=uhd.io_type_t.\$type.type, + num_channels=\$nchan, +) \#if \$sync() +clk_cfg = uhd.clock_config_t() +clk_cfg.ref_source = uhd.clock_config_t.REF_SMA +clk_cfg.pps_source = uhd.clock_config_t.PPS_SMA +clk_cfg.pps_polarity = uhd.clock_config_t.PPS_POS +self.\$(id).set_clock_config(clk_cfg, ~0); self.\$(id).set_time_unknown_pps(uhd.time_spec_t()) \#end if #for $m in range($max_mboards) diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py index 5b87719e5e..4d645afe15 100755 --- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py @@ -25,7 +25,11 @@ MAIN_TMPL = """\ <name>UHD: Single USRP $sourk.title()</name> <key>uhd_single_usrp_$(sourk)</key> <import>from gnuradio import uhd</import> - <make>uhd.single_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan) + <make>uhd.single_usrp_$(sourk)( + device_addr=\$dev_addr, + io_type=uhd.io_type_t.\$type.type, + num_channels\$nchan, +) self.\$(id).set_subdev_spec(\$sd_spec) self.\$(id).set_samp_rate(\$samp_rate) #for $n in range($max_nchan) diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc index 202f128406..31dbac44f4 100644 --- a/gr-uhd/lib/uhd_multi_usrp_sink.cc +++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc @@ -37,12 +37,17 @@ uhd_multi_usrp_sink::uhd_multi_usrp_sink(gr_io_signature_sptr sig) class uhd_multi_usrp_sink_impl : public uhd_multi_usrp_sink{ public: uhd_multi_usrp_sink_impl( - const std::string &args, - const uhd::io_type_t &type, + const std::string &device_addr, + const uhd::io_type_t &io_type, size_t num_channels - ) : uhd_multi_usrp_sink(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type), _nchan(num_channels) + ): + uhd_multi_usrp_sink(gr_make_io_signature( + num_channels, num_channels, io_type.size + )), + _type(io_type), + _nchan(num_channels) { - _dev = uhd::usrp::multi_usrp::make(args); + _dev = uhd::usrp::multi_usrp::make(device_addr); } void set_subdev_spec(const std::string &spec, size_t mboard){ @@ -165,11 +170,11 @@ protected: * Make UHD Multi USRP Sink **********************************************************************/ boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink( - const std::string &args, - const uhd::io_type_t::tid_t &type, + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, size_t num_channels ){ return boost::shared_ptr<uhd_multi_usrp_sink>( - new uhd_multi_usrp_sink_impl(args, type, num_channels) + new uhd_multi_usrp_sink_impl(device_addr, io_type, num_channels) ); } diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.h b/gr-uhd/lib/uhd_multi_usrp_sink.h index 13bba20fb6..5dacc1fac7 100644 --- a/gr-uhd/lib/uhd_multi_usrp_sink.h +++ b/gr-uhd/lib/uhd_multi_usrp_sink.h @@ -28,8 +28,8 @@ class uhd_multi_usrp_sink; boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink( - const std::string &args, - const uhd::io_type_t::tid_t &type, + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, size_t num_channels ); diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc index c10c08c500..1fcb576501 100644 --- a/gr-uhd/lib/uhd_multi_usrp_source.cc +++ b/gr-uhd/lib/uhd_multi_usrp_source.cc @@ -39,12 +39,16 @@ uhd_multi_usrp_source::uhd_multi_usrp_source(gr_io_signature_sptr sig) class uhd_multi_usrp_source_impl : public uhd_multi_usrp_source{ public: uhd_multi_usrp_source_impl( - const std::string &args, - const uhd::io_type_t &type, + const std::string &device_addr, + const uhd::io_type_t &io_type, size_t num_channels - ) : uhd_multi_usrp_source(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type) + ): + uhd_multi_usrp_source(gr_make_io_signature( + num_channels, num_channels, io_type.size + )), + _type(io_type) { - _dev = uhd::usrp::multi_usrp::make(args); + _dev = uhd::usrp::multi_usrp::make(device_addr); } void set_subdev_spec(const std::string &spec, size_t mboard){ @@ -168,11 +172,11 @@ private: * Make UHD Multi USRP Source **********************************************************************/ boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source( - const std::string &args, - const uhd::io_type_t::tid_t &type, + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, size_t num_channels ){ return boost::shared_ptr<uhd_multi_usrp_source>( - new uhd_multi_usrp_source_impl(args, type, num_channels) + new uhd_multi_usrp_source_impl(device_addr, io_type, num_channels) ); } diff --git a/gr-uhd/lib/uhd_multi_usrp_source.h b/gr-uhd/lib/uhd_multi_usrp_source.h index b94e53f01b..36c4b6fdcc 100644 --- a/gr-uhd/lib/uhd_multi_usrp_source.h +++ b/gr-uhd/lib/uhd_multi_usrp_source.h @@ -28,8 +28,8 @@ class uhd_multi_usrp_source; boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source( - const std::string &args, - const uhd::io_type_t::tid_t &type, + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, size_t num_channels ); diff --git a/gr-uhd/lib/uhd_single_usrp_sink.cc b/gr-uhd/lib/uhd_single_usrp_sink.cc index 96c1dbdf49..4297a83ffa 100644 --- a/gr-uhd/lib/uhd_single_usrp_sink.cc +++ b/gr-uhd/lib/uhd_single_usrp_sink.cc @@ -37,12 +37,17 @@ uhd_single_usrp_sink::uhd_single_usrp_sink(gr_io_signature_sptr sig) class uhd_single_usrp_sink_impl : public uhd_single_usrp_sink{ public: uhd_single_usrp_sink_impl( - const std::string &args, - const uhd::io_type_t &type, + const std::string &device_addr, + const uhd::io_type_t &io_type, size_t num_channels - ) : uhd_single_usrp_sink(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type), _nchan(num_channels) + ): + uhd_single_usrp_sink(gr_make_io_signature( + num_channels, num_channels, io_type.size + )), + _type(io_type), + _nchan(num_channels) { - _dev = uhd::usrp::single_usrp::make(args); + _dev = uhd::usrp::single_usrp::make(device_addr); } void set_subdev_spec(const std::string &spec){ @@ -163,11 +168,11 @@ protected: * Make UHD Single USRP Sink **********************************************************************/ boost::shared_ptr<uhd_single_usrp_sink> uhd_make_single_usrp_sink( - const std::string &args, - const uhd::io_type_t::tid_t &type, + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, size_t num_channels ){ return boost::shared_ptr<uhd_single_usrp_sink>( - new uhd_single_usrp_sink_impl(args, type, num_channels) + new uhd_single_usrp_sink_impl(device_addr, io_type, num_channels) ); } diff --git a/gr-uhd/lib/uhd_single_usrp_sink.h b/gr-uhd/lib/uhd_single_usrp_sink.h index bec788193b..e83bb6ded8 100644 --- a/gr-uhd/lib/uhd_single_usrp_sink.h +++ b/gr-uhd/lib/uhd_single_usrp_sink.h @@ -28,8 +28,8 @@ class uhd_single_usrp_sink; boost::shared_ptr<uhd_single_usrp_sink> uhd_make_single_usrp_sink( - const std::string &args, - const uhd::io_type_t::tid_t &type, + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, size_t num_channels = 1 ); diff --git a/gr-uhd/lib/uhd_single_usrp_source.cc b/gr-uhd/lib/uhd_single_usrp_source.cc index 7c3694a99d..27a788d960 100644 --- a/gr-uhd/lib/uhd_single_usrp_source.cc +++ b/gr-uhd/lib/uhd_single_usrp_source.cc @@ -39,12 +39,16 @@ uhd_single_usrp_source::uhd_single_usrp_source(gr_io_signature_sptr sig) class uhd_single_usrp_source_impl : public uhd_single_usrp_source{ public: uhd_single_usrp_source_impl( - const std::string &args, - const uhd::io_type_t &type, + const std::string &device_addr, + const uhd::io_type_t &io_type, size_t num_channels - ) : uhd_single_usrp_source(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type) + ): + uhd_single_usrp_source(gr_make_io_signature( + num_channels, num_channels, io_type.size + )), + _type(io_type) { - _dev = uhd::usrp::single_usrp::make(args); + _dev = uhd::usrp::single_usrp::make(device_addr); } void set_subdev_spec(const std::string &spec){ @@ -163,11 +167,11 @@ private: * Make UHD Single USRP Source **********************************************************************/ boost::shared_ptr<uhd_single_usrp_source> uhd_make_single_usrp_source( - const std::string &args, - const uhd::io_type_t::tid_t &type, + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, size_t num_channels ){ return boost::shared_ptr<uhd_single_usrp_source>( - new uhd_single_usrp_source_impl(args, type, num_channels) + new uhd_single_usrp_source_impl(device_addr, io_type, num_channels) ); } diff --git a/gr-uhd/lib/uhd_single_usrp_source.h b/gr-uhd/lib/uhd_single_usrp_source.h index 196b7c6759..c323fbd7ed 100644 --- a/gr-uhd/lib/uhd_single_usrp_source.h +++ b/gr-uhd/lib/uhd_single_usrp_source.h @@ -28,8 +28,8 @@ class uhd_single_usrp_source; boost::shared_ptr<uhd_single_usrp_source> uhd_make_single_usrp_source( - const std::string &args, - const uhd::io_type_t::tid_t &type, + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, size_t num_channels = 1 ); -- cgit v1.2.3 From 343cba5663d0eefdd3ee3918bef812dc1bd75508 Mon Sep 17 00:00:00 2001 From: Josh Blum <josh@joshknows.com> Date: Mon, 18 Oct 2010 18:29:20 -0700 Subject: uhd: tweaked and tested multi usrp with a single channel --- gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py | 16 ++++++++-------- gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 2 ++ gr-uhd/lib/uhd_multi_usrp_source.cc | 4 ++-- gr-uhd/swig/uhd_swig.i | 20 ++++++++++++++++++++ 4 files changed, 32 insertions(+), 10 deletions(-) (limited to 'gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py') diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py index aa550157d2..2297167320 100755 --- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py @@ -31,15 +31,15 @@ MAIN_TMPL = """\ num_channels=\$nchan, ) \#if \$sync() -clk_cfg = uhd.clock_config_t() -clk_cfg.ref_source = uhd.clock_config_t.REF_SMA -clk_cfg.pps_source = uhd.clock_config_t.PPS_SMA -clk_cfg.pps_polarity = uhd.clock_config_t.PPS_POS -self.\$(id).set_clock_config(clk_cfg, ~0); +_clk_cfg = uhd.clock_config_t() +_clk_cfg.ref_source = uhd.clock_config_t.REF_SMA +_clk_cfg.pps_source = uhd.clock_config_t.PPS_SMA +_clk_cfg.pps_polarity = uhd.clock_config_t.PPS_POS +self.\$(id).set_clock_config(_clk_cfg, uhd.ALL_MBOARDS); self.\$(id).set_time_unknown_pps(uhd.time_spec_t()) \#end if #for $m in range($max_mboards) -\#if \$num_mboards() > $m +\#if \$num_mboards() > $m and \$sd_spec$(m)() self.\$(id).set_subdev_spec(\$sd_spec$(m), $m) \#end if #end for @@ -110,7 +110,7 @@ self.\$(id).set_antenna(\$ant$(n), $n) <key>num_mboards</key> <value>2</value> <type>int</type> - #for $m in range(1, $max_mboards) + #for $m in range(1, $max_mboards+1) <option> <name>$(m)</name> <key>$m</key> @@ -139,7 +139,7 @@ self.\$(id).set_antenna(\$ant$(n), $n) <key>nchan</key> <value>2</value> <type>int</type> - #for $n in range(1, $max_nchan) + #for $n in range(1, $max_nchan+1) <option> <name>$(n)</name> <key>$n</key> diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py index 7bc2425ee8..02cdf64cc2 100755 --- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py @@ -30,7 +30,9 @@ MAIN_TMPL = """\ io_type=uhd.io_type_t.\$type.type, num_channels=\$nchan, ) +\#if \$sd_spec() self.\$(id).set_subdev_spec(\$sd_spec) +\#end if self.\$(id).set_samp_rate(\$samp_rate) #for $n in range($max_nchan) \#if \$nchan() > $n diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc index 1fcb576501..0ac686c795 100644 --- a/gr-uhd/lib/uhd_multi_usrp_source.cc +++ b/gr-uhd/lib/uhd_multi_usrp_source.cc @@ -149,10 +149,10 @@ public: bool start(void){ //setup a stream command that starts streaming slightly in the future - static const double reasonable_delay = 0.01; //10 ms (order of magnitude >> RTT) + static const double reasonable_delay = 0.05; //order of magnitude over RTT uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); stream_cmd.stream_now = false; - stream_cmd.time_spec = get_time_now() + uhd::time_spec_t(_dev->get_num_mboards() * reasonable_delay); + stream_cmd.time_spec = get_time_now() + uhd::time_spec_t(reasonable_delay); _dev->issue_stream_cmd(stream_cmd); return true; } diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i index 1631a768a7..6f29f706d7 100644 --- a/gr-uhd/swig/uhd_swig.i +++ b/gr-uhd/swig/uhd_swig.i @@ -20,6 +20,9 @@ * Boston, MA 02110-1301, USA. */ +//////////////////////////////////////////////////////////////////////// +// standard includes +//////////////////////////////////////////////////////////////////////// %include "gnuradio.i" %include "std_string.i" %include "std_vector.i" @@ -28,6 +31,9 @@ namespace std { %template(StringVector) vector<string>; } +//////////////////////////////////////////////////////////////////////// +// block headers +//////////////////////////////////////////////////////////////////////// %{ #include <uhd_mimo_source.h> //deprecated #include <uhd_mimo_sink.h> //deprecated @@ -40,6 +46,9 @@ namespace std { #include <uhd_single_usrp_sink.h> %} +//////////////////////////////////////////////////////////////////////// +// used types +//////////////////////////////////////////////////////////////////////// %include <uhd/config.hpp> %include <uhd/types/ranges.hpp> %include <uhd/types/tune_result.hpp> @@ -47,6 +56,9 @@ namespace std { %include <uhd/types/time_spec.hpp> %include <uhd/types/clock_config.hpp> +//////////////////////////////////////////////////////////////////////// +// block magic +//////////////////////////////////////////////////////////////////////// GR_SWIG_BLOCK_MAGIC(uhd,mimo_source) //deprecated %include <uhd_mimo_source.h> //deprecated @@ -70,3 +82,11 @@ GR_SWIG_BLOCK_MAGIC(uhd,single_usrp_source) GR_SWIG_BLOCK_MAGIC(uhd,single_usrp_sink) %include <uhd_single_usrp_sink.h> + +//////////////////////////////////////////////////////////////////////// +// helpful constants +//////////////////////////////////////////////////////////////////////// +%{ +static const size_t ALL_MBOARDS = uhd::usrp::multi_usrp::ALL_MBOARDS; +%} +static const size_t ALL_MBOARDS; -- cgit v1.2.3 From df9a3f3bad0942fe0d6ec45dd02eec62544d02be Mon Sep 17 00:00:00 2001 From: Josh Blum <josh@joshknows.com> Date: Thu, 21 Oct 2010 15:48:52 -0700 Subject: uhd: added support for setting bw filters through grc --- gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py | 26 +++++++++++++++++++++++++- gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 26 +++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) (limited to 'gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py') diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py index 2297167320..ae40e551ad 100755 --- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py @@ -51,6 +51,9 @@ self.\$(id).set_gain(\$gain$(n), $n) \#if \$ant$(n)() self.\$(id).set_antenna(\$ant$(n), $n) \#end if + \#if \$bw$(n)() +self.\$(id).set_bandwidth(\$bw$(n), $n) + \#end if \#end if #end for </make> @@ -59,6 +62,7 @@ self.\$(id).set_antenna(\$ant$(n), $n) <callback>set_center_freq(\$center_freq$(n), $n)</callback> <callback>set_gain(\$gain$(n), $n)</callback> <callback>set_antenna(\$ant$(n), $n)</callback> + <callback>set_bandwidth(\$bw$(n), $n)</callback> #end for <param> <name>Input Type</name> @@ -196,9 +200,14 @@ Single channel example: :AB Dual channel example: :A :B Antenna: -For subdevices/daughterboards with only one antenna, this may be left blank. \\ +For subdevices with only one antenna, this may be left blank. \\ Otherwise, the user should specify one of the possible antenna choices. \\ See the daughterboard application notes for the possible antenna choices. + +Bandwidth: +To use the default bandwidth filter setting, this should be zero. \\ +Only certain subdevices have configurable bandwidth filters. \\ +See the daughterboard application notes for possible configurations. </doc> </block> """ @@ -233,6 +242,21 @@ PARAMS_TMPL = """ \#end if </hide> </param> + <param> + <name>Ch$(n): Bandwidth (Hz)</name> + <key>bw$(n)</key> + <value>0</value> + <type>real</type> + <hide> + \#if not \$nchan() > $n + all + \#elif \$bw$(n)() + none + \#else + part + \#end if + </hide> + </param> """ def parse_tmpl(_tmpl, **kwargs): diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py index 02cdf64cc2..cb2143f8f9 100755 --- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py @@ -41,6 +41,9 @@ self.\$(id).set_gain(\$gain$(n), $n) \#if \$ant$(n)() self.\$(id).set_antenna(\$ant$(n), $n) \#end if + \#if \$bw$(n)() +self.\$(id).set_bandwidth(\$bw$(n), $n) + \#end if \#end if #end for </make> @@ -49,6 +52,7 @@ self.\$(id).set_antenna(\$ant$(n), $n) <callback>set_center_freq(\$center_freq$(n), $n)</callback> <callback>set_gain(\$gain$(n), $n)</callback> <callback>set_antenna(\$ant$(n), $n)</callback> + <callback>set_bandwidth(\$bw$(n), $n)</callback> #end for <param> <name>Input Type</name> @@ -152,9 +156,14 @@ Single channel example: A:AB Dual channel example: A:AB B:0 Antenna: -For subdevices/daughterboards with only one antenna, this may be left blank. \\ +For subdevices with only one antenna, this may be left blank. \\ Otherwise, the user should specify one of the possible antenna choices. \\ See the daughterboard application notes for the possible antenna choices. + +Bandwidth: +To use the default bandwidth filter setting, this should be zero. \\ +Only certain subdevices have configurable bandwidth filters. \\ +See the daughterboard application notes for possible configurations. </doc> </block> """ @@ -189,6 +198,21 @@ PARAMS_TMPL = """ \#end if </hide> </param> + <param> + <name>Ch$(n): Bandwidth (Hz)</name> + <key>bw$(n)</key> + <value>0</value> + <type>real</type> + <hide> + \#if not \$nchan() > $n + all + \#elif \$bw$(n)() + none + \#else + part + \#end if + </hide> + </param> """ def parse_tmpl(_tmpl, **kwargs): -- cgit v1.2.3 From 3dab5d93a45928baa4fb23878d644751e06943a0 Mon Sep 17 00:00:00 2001 From: Josh Blum <josh@joshknows.com> Date: Thu, 28 Oct 2010 13:24:23 -0700 Subject: uhd: make a tune_request_t that inherits from float for GRC, added docs --- gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py | 24 +++++++++++++++--------- gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 16 +++++++++++----- gr-uhd/swig/__init__.py | 12 ++++++++++++ 3 files changed, 38 insertions(+), 14 deletions(-) (limited to 'gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py') diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py index ae40e551ad..112d881599 100755 --- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py @@ -180,15 +180,6 @@ USRP2 Example: addr=192.168.10.2 192.168.10.3 Num Motherboards: Selects the number of USRP motherboards in this multi-USRP configuration. -Num Channels: -Selects the total number of channels in this multi-USRP configuration. -Ex: 4 motherboards with 2 channels per board = 8 channels total - -Sample rate: -The sample rate is the number of samples per second input by this block. \\ -The UHD device driver will try its best to match the requested sample rate. \\ -If the requested rate is not possible, the UHD block will print an error at runtime. - Subdevice specification: Each motherboard should have its own subdevice specification \\ and all subdevice specifications should be the same length. \\ @@ -199,6 +190,21 @@ See the application notes for further details. Single channel example: :AB Dual channel example: :A :B +Num Channels: +Selects the total number of channels in this multi-USRP configuration. +Ex: 4 motherboards with 2 channels per board = 8 channels total + +Sample rate: +The sample rate is the number of samples per second input by this block. \\ +The UHD device driver will try its best to match the requested sample rate. \\ +If the requested rate is not possible, the UHD block will print an error at runtime. + +Center frequency: +The center frequency is the overall frequency of the RF chain. \\ +For greater control of how the UHD tunes elements in the RF chain, \\ +pass a tune_request_t object rather than a simple target frequency. +Tuning with an LO offset example: uhd.tune_request_t(freq, lo_off) + Antenna: For subdevices with only one antenna, this may be left blank. \\ Otherwise, the user should specify one of the possible antenna choices. \\ diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py index cb2143f8f9..9b6422f7a2 100755 --- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py @@ -142,11 +142,6 @@ Used args to specify a specfic device. USRP2 Example: addr=192.168.10.2 USRP1 Example: serial=12345678 -Sample rate: -The sample rate is the number of samples per second input by this block. \\ -The UHD device driver will try its best to match the requested sample rate. \\ -If the requested rate is not possible, the UHD block will print an error at runtime. - Subdevice specification: Select the subdevice or subdevices for each channel using a markup string. \\ The markup string consists of a list of dboard_slot:subdev_name pairs (one pair per channel). \\ @@ -155,6 +150,17 @@ See the application notes for further details. Single channel example: A:AB Dual channel example: A:AB B:0 +Sample rate: +The sample rate is the number of samples per second input by this block. \\ +The UHD device driver will try its best to match the requested sample rate. \\ +If the requested rate is not possible, the UHD block will print an error at runtime. + +Center frequency: +The center frequency is the overall frequency of the RF chain. \\ +For greater control of how the UHD tunes elements in the RF chain, \\ +pass a tune_request_t object rather than a simple target frequency. +Tuning with an LO offset example: uhd.tune_request_t(freq, lo_off) + Antenna: For subdevices with only one antenna, this may be left blank. \\ Otherwise, the user should specify one of the possible antenna choices. \\ diff --git a/gr-uhd/swig/__init__.py b/gr-uhd/swig/__init__.py index 2fed17e578..0fdacb796c 100644 --- a/gr-uhd/swig/__init__.py +++ b/gr-uhd/swig/__init__.py @@ -21,8 +21,20 @@ # The presence of this file turns this directory into a Python package +######################################################################## # Add SWIG generated code to this namespace +######################################################################## from uhd_swig import * +######################################################################## # Add other content from pure-Python modules here +######################################################################## +class tune_request_t(tune_request_t, float): + """ + Make the python tune request object inherit from float + so that it can be passed in GRC as a frequency parameter. + The type checking in GRC will accept the tune request. + """ + def __new__(self, *args): return float.__new__(self) + def __float__(self): return self.target_freq -- cgit v1.2.3