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/.gitignore | 2 +- gr-uhd/grc/Makefile.am | 21 +- gr-uhd/grc/gen_uhd_mimo_blocks_xml.py | 190 ---------- gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py | 211 +++++++++++ gr-uhd/grc/uhd_mimo_sink.xml | 550 ++++++++++++++++++++++++++++ gr-uhd/grc/uhd_mimo_source.xml | 550 ++++++++++++++++++++++++++++ 6 files changed, 1325 insertions(+), 199 deletions(-) delete mode 100755 gr-uhd/grc/gen_uhd_mimo_blocks_xml.py create mode 100755 gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py create mode 100644 gr-uhd/grc/uhd_mimo_sink.xml create mode 100644 gr-uhd/grc/uhd_mimo_source.xml (limited to 'gr-uhd/grc') diff --git a/gr-uhd/grc/.gitignore b/gr-uhd/grc/.gitignore index c95275d8d4..d8ab9bd0c3 100644 --- a/gr-uhd/grc/.gitignore +++ b/gr-uhd/grc/.gitignore @@ -1,4 +1,4 @@ -/uhd_mimo*.xml +/uhd_multi*.xml /uhd_single*.xml /Makefile /Makefile.in diff --git a/gr-uhd/grc/Makefile.am b/gr-uhd/grc/Makefile.am index a19a28f033..04b7dca365 100644 --- a/gr-uhd/grc/Makefile.am +++ b/gr-uhd/grc/Makefile.am @@ -23,31 +23,36 @@ include $(top_srcdir)/Makefile.common grcblocksdir = $(grc_blocksdir) -generated_uhd_mimo_blocks = \ - uhd_mimo_source.xml \ - uhd_mimo_sink.xml +generated_uhd_multi_usrp_blocks = \ + uhd_multi_usrp_source.xml \ + uhd_multi_usrp_sink.xml generated_uhd_single_usrp_blocks = \ uhd_single_usrp_source.xml \ uhd_single_usrp_sink.xml BUILT_SOURCES = \ - $(generated_uhd_mimo_blocks) \ + $(generated_uhd_multi_usrp_blocks) \ $(generated_uhd_single_usrp_blocks) dist_grcblocks_DATA = \ - $(BUILT_SOURCES) \ + $(BUILT_SOURCES) + +# add the deprecated files +dist_grcblocks_DATA += \ + uhd_mimo_source.xml \ + uhd_mimo_sink.xml \ uhd_simple_source.xml \ uhd_simple_sink.xml ######################################################################## -# Rules for generating the mimo source and sink blocks +# Rules for generating the source and sink xml wrappers ######################################################################## EXTRA_DIST = \ - $(srcdir)/gen_uhd_mimo_blocks_xml.py \ + $(srcdir)/gen_uhd_multi_usrp_blocks_xml.py \ $(srcdir)/gen_uhd_single_usrp_blocks_xml.py -$(generated_uhd_mimo_blocks): $(srcdir)/gen_uhd_mimo_blocks_xml.py +$(generated_uhd_multi_usrp_blocks): $(srcdir)/gen_uhd_multi_usrp_blocks_xml.py @echo "generating $@..." $(PYTHON) $< $@ diff --git a/gr-uhd/grc/gen_uhd_mimo_blocks_xml.py b/gr-uhd/grc/gen_uhd_mimo_blocks_xml.py deleted file mode 100755 index 7e61563cc8..0000000000 --- a/gr-uhd/grc/gen_uhd_mimo_blocks_xml.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/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 MIMO $sourk.title()</name> - <key>uhd_mimo_$(sourk)</key> - <category>UHD</category> - <import>from gnuradio import uhd</import> - <make>uhd.mimo_$(sourk)(\$nchan, \$args, uhd.io_type_t.\$type.type) -self.\$(id).set_samp_rate_all(\$samp_rate) -#for $n in range($max_nchan) -\#if \$nchan() > $n -self.\$(id).set_subdev_spec($n, \$sd_spec$(n)) -self.\$(id).set_center_freq($n, \$center_freq$(n)) -self.\$(id).set_gain($n, \$gain$(n)) - \#if \$ant$(n)() -self.\$(id).set_antenna($n, \$ant$(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($n, \$center_freq$(n))</callback> - <callback>set_gain($n, \$gain$(n))</callback> - <callback>set_antenna($n, \$ant$(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>2</value> - <type>int</type> - #for $n in range(2, $max_nchan+1) - <option> - <name>$n Channels</name> - <key>$n</key> - </option> - #end for - </param> - <param> - <name>Args</name> - <key>args</key> - <value>addr=192.168.10.2 192.168.20.2</value> - <type>string</type> - </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> - <$sourk> - <name>$direction</name> - <type>\$type</type> - <vlen>\$type.vlen</vlen> - <nports>\$nchan</nports> - </$sourk> - <doc> -The UHD $sourk.title() Block: - -Args: -Args 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 - -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. - -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): Subdev Spec</name> - <key>sd_spec$(n)</key> - <value></value> - <type>string</type> - <hide> - \#if not \$nchan() > $n - all - \#elif \$sd_spec$(n)() - none - \#else - part - \#end if - </hide> - </param> - <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 = 8 - -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, - )) 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, + )) diff --git a/gr-uhd/grc/uhd_mimo_sink.xml b/gr-uhd/grc/uhd_mimo_sink.xml new file mode 100644 index 0000000000..2f5f2011f1 --- /dev/null +++ b/gr-uhd/grc/uhd_mimo_sink.xml @@ -0,0 +1,550 @@ +<?xml version="1.0"?> +<block> + <name>UHD MIMO Sink</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) +#if $nchan() > 0 +self.$(id).set_subdev_spec(0, $sd_spec0) +self.$(id).set_center_freq(0, $center_freq0) +self.$(id).set_gain(0, $gain0) + #if $ant0() +self.$(id).set_antenna(0, $ant0) + #end if +#end if +#if $nchan() > 1 +self.$(id).set_subdev_spec(1, $sd_spec1) +self.$(id).set_center_freq(1, $center_freq1) +self.$(id).set_gain(1, $gain1) + #if $ant1() +self.$(id).set_antenna(1, $ant1) + #end if +#end if +#if $nchan() > 2 +self.$(id).set_subdev_spec(2, $sd_spec2) +self.$(id).set_center_freq(2, $center_freq2) +self.$(id).set_gain(2, $gain2) + #if $ant2() +self.$(id).set_antenna(2, $ant2) + #end if +#end if +#if $nchan() > 3 +self.$(id).set_subdev_spec(3, $sd_spec3) +self.$(id).set_center_freq(3, $center_freq3) +self.$(id).set_gain(3, $gain3) + #if $ant3() +self.$(id).set_antenna(3, $ant3) + #end if +#end if +#if $nchan() > 4 +self.$(id).set_subdev_spec(4, $sd_spec4) +self.$(id).set_center_freq(4, $center_freq4) +self.$(id).set_gain(4, $gain4) + #if $ant4() +self.$(id).set_antenna(4, $ant4) + #end if +#end if +#if $nchan() > 5 +self.$(id).set_subdev_spec(5, $sd_spec5) +self.$(id).set_center_freq(5, $center_freq5) +self.$(id).set_gain(5, $gain5) + #if $ant5() +self.$(id).set_antenna(5, $ant5) + #end if +#end if +#if $nchan() > 6 +self.$(id).set_subdev_spec(6, $sd_spec6) +self.$(id).set_center_freq(6, $center_freq6) +self.$(id).set_gain(6, $gain6) + #if $ant6() +self.$(id).set_antenna(6, $ant6) + #end if +#end if +#if $nchan() > 7 +self.$(id).set_subdev_spec(7, $sd_spec7) +self.$(id).set_center_freq(7, $center_freq7) +self.$(id).set_gain(7, $gain7) + #if $ant7() +self.$(id).set_antenna(7, $ant7) + #end if +#end if +</make> + <callback>set_samp_rate($samp_rate)</callback> + <callback>set_center_freq(0, $center_freq0)</callback> + <callback>set_gain(0, $gain0)</callback> + <callback>set_antenna(0, $ant0)</callback> + <callback>set_center_freq(1, $center_freq1)</callback> + <callback>set_gain(1, $gain1)</callback> + <callback>set_antenna(1, $ant1)</callback> + <callback>set_center_freq(2, $center_freq2)</callback> + <callback>set_gain(2, $gain2)</callback> + <callback>set_antenna(2, $ant2)</callback> + <callback>set_center_freq(3, $center_freq3)</callback> + <callback>set_gain(3, $gain3)</callback> + <callback>set_antenna(3, $ant3)</callback> + <callback>set_center_freq(4, $center_freq4)</callback> + <callback>set_gain(4, $gain4)</callback> + <callback>set_antenna(4, $ant4)</callback> + <callback>set_center_freq(5, $center_freq5)</callback> + <callback>set_gain(5, $gain5)</callback> + <callback>set_antenna(5, $ant5)</callback> + <callback>set_center_freq(6, $center_freq6)</callback> + <callback>set_gain(6, $gain6)</callback> + <callback>set_antenna(6, $ant6)</callback> + <callback>set_center_freq(7, $center_freq7)</callback> + <callback>set_gain(7, $gain7)</callback> + <callback>set_antenna(7, $ant7)</callback> + <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>2</value> + <type>int</type> + <option> + <name>2 Channels</name> + <key>2</key> + </option> + <option> + <name>3 Channels</name> + <key>3</key> + </option> + <option> + <name>4 Channels</name> + <key>4</key> + </option> + <option> + <name>5 Channels</name> + <key>5</key> + </option> + <option> + <name>6 Channels</name> + <key>6</key> + </option> + <option> + <name>7 Channels</name> + <key>7</key> + </option> + <option> + <name>8 Channels</name> + <key>8</key> + </option> + </param> + <param> + <name>Args</name> + <key>args</key> + <value>addr=192.168.10.2 192.168.20.2</value> + <type>string</type> + </param> + <param> + <name>Samp Rate (Sps)</name> + <key>samp_rate</key> + <value>samp_rate</value> + <type>real</type> + </param> + + <param> + <name>Ch0: Subdev Spec</name> + <key>sd_spec0</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 0 + all + #elif $sd_spec0() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch0: Center Freq (Hz)</name> + <key>center_freq0</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 0 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch0: Gain (dB)</name> + <key>gain0</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 0 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch0: Antenna</name> + <key>ant0</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 0 + all + #elif $ant0() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch1: Subdev Spec</name> + <key>sd_spec1</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 1 + all + #elif $sd_spec1() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch1: Center Freq (Hz)</name> + <key>center_freq1</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 1 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch1: Gain (dB)</name> + <key>gain1</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 1 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch1: Antenna</name> + <key>ant1</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 1 + all + #elif $ant1() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch2: Subdev Spec</name> + <key>sd_spec2</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 2 + all + #elif $sd_spec2() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch2: Center Freq (Hz)</name> + <key>center_freq2</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 2 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch2: Gain (dB)</name> + <key>gain2</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 2 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch2: Antenna</name> + <key>ant2</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 2 + all + #elif $ant2() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch3: Subdev Spec</name> + <key>sd_spec3</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 3 + all + #elif $sd_spec3() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch3: Center Freq (Hz)</name> + <key>center_freq3</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 3 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch3: Gain (dB)</name> + <key>gain3</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 3 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch3: Antenna</name> + <key>ant3</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 3 + all + #elif $ant3() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch4: Subdev Spec</name> + <key>sd_spec4</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 4 + all + #elif $sd_spec4() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch4: Center Freq (Hz)</name> + <key>center_freq4</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 4 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch4: Gain (dB)</name> + <key>gain4</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 4 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch4: Antenna</name> + <key>ant4</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 4 + all + #elif $ant4() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch5: Subdev Spec</name> + <key>sd_spec5</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 5 + all + #elif $sd_spec5() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch5: Center Freq (Hz)</name> + <key>center_freq5</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 5 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch5: Gain (dB)</name> + <key>gain5</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 5 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch5: Antenna</name> + <key>ant5</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 5 + all + #elif $ant5() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch6: Subdev Spec</name> + <key>sd_spec6</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 6 + all + #elif $sd_spec6() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch6: Center Freq (Hz)</name> + <key>center_freq6</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 6 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch6: Gain (dB)</name> + <key>gain6</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 6 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch6: Antenna</name> + <key>ant6</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 6 + all + #elif $ant6() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch7: Subdev Spec</name> + <key>sd_spec7</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 7 + all + #elif $sd_spec7() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch7: Center Freq (Hz)</name> + <key>center_freq7</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 7 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch7: Gain (dB)</name> + <key>gain7</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 7 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch7: Antenna</name> + <key>ant7</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 7 + all + #elif $ant7() + none + #else + part + #end if + </hide> + </param> + + <check>8 >= $nchan</check> + <check>$nchan >= 0</check> + <sink> + <name>in</name> + <type>$type</type> + <vlen>$type.vlen</vlen> + <nports>$nchan</nports> + </sink> + <doc> +The UHD Sink Block: + +Args: +Args 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 + +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. + +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> diff --git a/gr-uhd/grc/uhd_mimo_source.xml b/gr-uhd/grc/uhd_mimo_source.xml new file mode 100644 index 0000000000..d8f4e6d667 --- /dev/null +++ b/gr-uhd/grc/uhd_mimo_source.xml @@ -0,0 +1,550 @@ +<?xml version="1.0"?> +<block> + <name>UHD MIMO Source</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) +#if $nchan() > 0 +self.$(id).set_subdev_spec(0, $sd_spec0) +self.$(id).set_center_freq(0, $center_freq0) +self.$(id).set_gain(0, $gain0) + #if $ant0() +self.$(id).set_antenna(0, $ant0) + #end if +#end if +#if $nchan() > 1 +self.$(id).set_subdev_spec(1, $sd_spec1) +self.$(id).set_center_freq(1, $center_freq1) +self.$(id).set_gain(1, $gain1) + #if $ant1() +self.$(id).set_antenna(1, $ant1) + #end if +#end if +#if $nchan() > 2 +self.$(id).set_subdev_spec(2, $sd_spec2) +self.$(id).set_center_freq(2, $center_freq2) +self.$(id).set_gain(2, $gain2) + #if $ant2() +self.$(id).set_antenna(2, $ant2) + #end if +#end if +#if $nchan() > 3 +self.$(id).set_subdev_spec(3, $sd_spec3) +self.$(id).set_center_freq(3, $center_freq3) +self.$(id).set_gain(3, $gain3) + #if $ant3() +self.$(id).set_antenna(3, $ant3) + #end if +#end if +#if $nchan() > 4 +self.$(id).set_subdev_spec(4, $sd_spec4) +self.$(id).set_center_freq(4, $center_freq4) +self.$(id).set_gain(4, $gain4) + #if $ant4() +self.$(id).set_antenna(4, $ant4) + #end if +#end if +#if $nchan() > 5 +self.$(id).set_subdev_spec(5, $sd_spec5) +self.$(id).set_center_freq(5, $center_freq5) +self.$(id).set_gain(5, $gain5) + #if $ant5() +self.$(id).set_antenna(5, $ant5) + #end if +#end if +#if $nchan() > 6 +self.$(id).set_subdev_spec(6, $sd_spec6) +self.$(id).set_center_freq(6, $center_freq6) +self.$(id).set_gain(6, $gain6) + #if $ant6() +self.$(id).set_antenna(6, $ant6) + #end if +#end if +#if $nchan() > 7 +self.$(id).set_subdev_spec(7, $sd_spec7) +self.$(id).set_center_freq(7, $center_freq7) +self.$(id).set_gain(7, $gain7) + #if $ant7() +self.$(id).set_antenna(7, $ant7) + #end if +#end if +</make> + <callback>set_samp_rate($samp_rate)</callback> + <callback>set_center_freq(0, $center_freq0)</callback> + <callback>set_gain(0, $gain0)</callback> + <callback>set_antenna(0, $ant0)</callback> + <callback>set_center_freq(1, $center_freq1)</callback> + <callback>set_gain(1, $gain1)</callback> + <callback>set_antenna(1, $ant1)</callback> + <callback>set_center_freq(2, $center_freq2)</callback> + <callback>set_gain(2, $gain2)</callback> + <callback>set_antenna(2, $ant2)</callback> + <callback>set_center_freq(3, $center_freq3)</callback> + <callback>set_gain(3, $gain3)</callback> + <callback>set_antenna(3, $ant3)</callback> + <callback>set_center_freq(4, $center_freq4)</callback> + <callback>set_gain(4, $gain4)</callback> + <callback>set_antenna(4, $ant4)</callback> + <callback>set_center_freq(5, $center_freq5)</callback> + <callback>set_gain(5, $gain5)</callback> + <callback>set_antenna(5, $ant5)</callback> + <callback>set_center_freq(6, $center_freq6)</callback> + <callback>set_gain(6, $gain6)</callback> + <callback>set_antenna(6, $ant6)</callback> + <callback>set_center_freq(7, $center_freq7)</callback> + <callback>set_gain(7, $gain7)</callback> + <callback>set_antenna(7, $ant7)</callback> + <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>2</value> + <type>int</type> + <option> + <name>2 Channels</name> + <key>2</key> + </option> + <option> + <name>3 Channels</name> + <key>3</key> + </option> + <option> + <name>4 Channels</name> + <key>4</key> + </option> + <option> + <name>5 Channels</name> + <key>5</key> + </option> + <option> + <name>6 Channels</name> + <key>6</key> + </option> + <option> + <name>7 Channels</name> + <key>7</key> + </option> + <option> + <name>8 Channels</name> + <key>8</key> + </option> + </param> + <param> + <name>Args</name> + <key>args</key> + <value>addr=192.168.10.2 192.168.20.2</value> + <type>string</type> + </param> + <param> + <name>Samp Rate (Sps)</name> + <key>samp_rate</key> + <value>samp_rate</value> + <type>real</type> + </param> + + <param> + <name>Ch0: Subdev Spec</name> + <key>sd_spec0</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 0 + all + #elif $sd_spec0() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch0: Center Freq (Hz)</name> + <key>center_freq0</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 0 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch0: Gain (dB)</name> + <key>gain0</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 0 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch0: Antenna</name> + <key>ant0</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 0 + all + #elif $ant0() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch1: Subdev Spec</name> + <key>sd_spec1</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 1 + all + #elif $sd_spec1() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch1: Center Freq (Hz)</name> + <key>center_freq1</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 1 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch1: Gain (dB)</name> + <key>gain1</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 1 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch1: Antenna</name> + <key>ant1</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 1 + all + #elif $ant1() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch2: Subdev Spec</name> + <key>sd_spec2</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 2 + all + #elif $sd_spec2() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch2: Center Freq (Hz)</name> + <key>center_freq2</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 2 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch2: Gain (dB)</name> + <key>gain2</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 2 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch2: Antenna</name> + <key>ant2</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 2 + all + #elif $ant2() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch3: Subdev Spec</name> + <key>sd_spec3</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 3 + all + #elif $sd_spec3() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch3: Center Freq (Hz)</name> + <key>center_freq3</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 3 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch3: Gain (dB)</name> + <key>gain3</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 3 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch3: Antenna</name> + <key>ant3</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 3 + all + #elif $ant3() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch4: Subdev Spec</name> + <key>sd_spec4</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 4 + all + #elif $sd_spec4() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch4: Center Freq (Hz)</name> + <key>center_freq4</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 4 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch4: Gain (dB)</name> + <key>gain4</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 4 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch4: Antenna</name> + <key>ant4</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 4 + all + #elif $ant4() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch5: Subdev Spec</name> + <key>sd_spec5</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 5 + all + #elif $sd_spec5() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch5: Center Freq (Hz)</name> + <key>center_freq5</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 5 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch5: Gain (dB)</name> + <key>gain5</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 5 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch5: Antenna</name> + <key>ant5</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 5 + all + #elif $ant5() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch6: Subdev Spec</name> + <key>sd_spec6</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 6 + all + #elif $sd_spec6() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch6: Center Freq (Hz)</name> + <key>center_freq6</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 6 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch6: Gain (dB)</name> + <key>gain6</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 6 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch6: Antenna</name> + <key>ant6</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 6 + all + #elif $ant6() + none + #else + part + #end if + </hide> + </param> + + <param> + <name>Ch7: Subdev Spec</name> + <key>sd_spec7</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 7 + all + #elif $sd_spec7() + none + #else + part + #end if + </hide> + </param> + <param> + <name>Ch7: Center Freq (Hz)</name> + <key>center_freq7</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 7 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch7: Gain (dB)</name> + <key>gain7</key> + <value>0</value> + <type>real</type> + <hide>#if $nchan() > 7 then 'none' else 'all'#</hide> + </param> + <param> + <name>Ch7: Antenna</name> + <key>ant7</key> + <value></value> + <type>string</type> + <hide> + #if not $nchan() > 7 + all + #elif $ant7() + none + #else + part + #end if + </hide> + </param> + + <check>8 >= $nchan</check> + <check>$nchan >= 0</check> + <source> + <name>out</name> + <type>$type</type> + <vlen>$type.vlen</vlen> + <nports>$nchan</nports> + </source> + <doc> +The UHD Source Block: + +Args: +Args 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 + +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. + +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> -- 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') 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') 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 8c6445cb3dd2a8db361203fedf55f3efb6953635 Mon Sep 17 00:00:00 2001 From: Josh Blum <josh@joshknows.com> Date: Mon, 18 Oct 2010 17:31:48 -0700 Subject: uhd: typo fix for single usrp grc file generator --- gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gr-uhd/grc') 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 4d645afe15..7bc2425ee8 100755 --- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py @@ -28,7 +28,7 @@ MAIN_TMPL = """\ <make>uhd.single_usrp_$(sourk)( device_addr=\$dev_addr, io_type=uhd.io_type_t.\$type.type, - num_channels\$nchan, + num_channels=\$nchan, ) self.\$(id).set_subdev_spec(\$sd_spec) self.\$(id).set_samp_rate(\$samp_rate) -- 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') 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') 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') 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 From 2aef04843d248d0584b4865c62d7ca0772113dc9 Mon Sep 17 00:00:00 2001 From: Josh Blum <josh@joshknows.com> Date: Thu, 28 Oct 2010 17:22:25 -0700 Subject: uhd: added ref clock option to single usrp blocks, minor grc fix on empty option keys --- gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 22 ++++++++++++++++++++++ grc/base/Param.py | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'gr-uhd/grc') 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 9b6422f7a2..7337c71d7b 100755 --- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py @@ -30,6 +30,13 @@ MAIN_TMPL = """\ io_type=uhd.io_type_t.\$type.type, num_channels=\$nchan, ) +\#if \$ref_clk() +_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); +\#end if \#if \$sd_spec() self.\$(id).set_subdev_spec(\$sd_spec) \#end if @@ -103,6 +110,21 @@ self.\$(id).set_bandwidth(\$bw$(n), $n) \#end if </hide> </param> + <param> + <name>Ref Clock</name> + <key>ref_clk</key> + <value></value> + <type>enum</type> + <hide>\#if \$ref_clk() then 'none' else 'part'#</hide> + <option> + <name>External</name> + <key>ext</key> + </option> + <option> + <name>Internal</name> + <key></key> + </option> + </param> <param> <name>Subdev Spec</name> <key>sd_spec</key> diff --git a/grc/base/Param.py b/grc/base/Param.py index e56eac36e1..5cd0f9d6d8 100644 --- a/grc/base/Param.py +++ b/grc/base/Param.py @@ -94,7 +94,7 @@ class Param(Element): try: assert set(opt_keys) == set(option.get_opt_keys()) except AssertionError: raise Exception, 'Opt keys "%s" are not identical across all options.'%opt_keys #if a value is specified, it must be in the options keys - self._value = value or self.get_option_keys()[0] + self._value = value if value or value in self.get_option_keys() else self.get_option_keys()[0] try: assert self.get_value() in self.get_option_keys() except AssertionError: raise Exception, 'The value "%s" is not in the possible values of "%s".'%(self.get_value(), self.get_option_keys()) else: self._value = value or '' -- cgit v1.2.3