diff options
Diffstat (limited to 'gr-uhd')
31 files changed, 2440 insertions, 386 deletions
diff --git a/gr-uhd/grc/.gitignore b/gr-uhd/grc/.gitignore index c95275d8d..d8ab9bd0c 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 a19a28f03..d424ca709 100644 --- a/gr-uhd/grc/Makefile.am +++ b/gr-uhd/grc/Makefile.am @@ -23,31 +23,37 @@ 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) \ + uhd_block_tree.xml \ + $(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 7e61563cc..000000000 --- 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 000000000..112d88159 --- /dev/null +++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py @@ -0,0 +1,293 @@ +#!/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> + <import>from gnuradio import uhd</import> + <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, 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 and \$sd_spec$(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 +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 + \#if \$bw$(n)() +self.\$(id).set_bandwidth(\$bw$(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> + <callback>set_bandwidth(\$bw$(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>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>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+1) + <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 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+1) + <option> + <name>$(n)</name> + <key>$n</key> + </option> + #end for + </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>$max_mboards >= \$num_mboards</check> + <check>\$num_mboards > 0</check> + <check>\$nchan >= \$num_mboards</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 + +Num Motherboards: +Selects the number of USRP motherboards in this multi-USRP configuration. + +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: :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. \\ +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> +""" + +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> + <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): + from Cheetah import Template + return str(Template.Template(_tmpl, kwargs)) + +max_num_mboards = 4 +max_num_channels = max_num_mboards*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, + 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 5b3cb5b5a..7337c71d7 100755 --- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py +++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py @@ -24,10 +24,22 @@ 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) + <make>uhd.single_usrp_$(sourk)( + device_addr=\$dev_addr, + 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 self.\$(id).set_samp_rate(\$samp_rate) #for $n in range($max_nchan) \#if \$nchan() > $n @@ -36,6 +48,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> @@ -44,6 +59,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> @@ -95,6 +111,21 @@ self.\$(id).set_antenna(\$ant$(n), $n) </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> <value></value> @@ -115,7 +146,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> @@ -133,11 +164,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). \\ @@ -146,10 +172,26 @@ 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/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> """ @@ -184,6 +226,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/uhd_block_tree.xml b/gr-uhd/grc/uhd_block_tree.xml new file mode 100644 index 000000000..e8c4f069d --- /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 new file mode 100644 index 000000000..13865c913 --- /dev/null +++ b/gr-uhd/grc/uhd_mimo_sink.xml @@ -0,0 +1,549 @@ +<?xml version="1.0"?> +<block> + <name>UHD MIMO Sink (DEPRECATED)</name> + <key>uhd_mimo_sink</key> + <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 000000000..6167838b0 --- /dev/null +++ b/gr-uhd/grc/uhd_mimo_source.xml @@ -0,0 +1,549 @@ +<?xml version="1.0"?> +<block> + <name>UHD MIMO Source (DEPRECATED)</name> + <key>uhd_mimo_source</key> + <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> diff --git a/gr-uhd/grc/uhd_simple_sink.xml b/gr-uhd/grc/uhd_simple_sink.xml index 66dc5bf14..ee6051432 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 00c60f41d..825981d66 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) diff --git a/gr-uhd/lib/Makefile.am b/gr-uhd/lib/Makefile.am index 1260201a5..b4b1abfc6 100644 --- a/gr-uhd/lib/Makefile.am +++ b/gr-uhd/lib/Makefile.am @@ -29,13 +29,17 @@ AM_CPPFLAGS = \ lib_LTLIBRARIES = libgnuradio-uhd.la libgnuradio_uhd_la_SOURCES = \ - utils.cc \ + uhd_multi_usrp_source.cc \ + uhd_multi_usrp_sink.cc \ + uhd_single_usrp_source.cc \ + uhd_single_usrp_sink.cc + +# add the deprecated sources +libgnuradio_uhd_la_SOURCES += \ uhd_mimo_source.cc \ uhd_mimo_sink.cc \ uhd_simple_source.cc \ - uhd_simple_sink.cc \ - uhd_single_usrp_source.cc \ - uhd_single_usrp_sink.cc + uhd_simple_sink.cc libgnuradio_uhd_la_LIBADD = \ $(GNURADIO_CORE_LA) \ @@ -44,12 +48,9 @@ libgnuradio_uhd_la_LIBADD = \ libgnuradio_uhd_la_LDFLAGS = $(LTVERSIONFLAGS) grinclude_HEADERS = \ - uhd_mimo_source.h \ - uhd_mimo_sink.h \ - uhd_simple_source.h \ - uhd_simple_sink.h \ + uhd_multi_usrp_source.h \ + uhd_multi_usrp_sink.h \ uhd_single_usrp_source.h \ uhd_single_usrp_sink.h -noinst_HEADERS = \ - utils.h +noinst_HEADERS = diff --git a/gr-uhd/lib/uhd_mimo_sink.cc b/gr-uhd/lib/uhd_mimo_sink.cc index 0a2ce1b0a..03d310b1e 100644 --- a/gr-uhd/lib/uhd_mimo_sink.cc +++ b/gr-uhd/lib/uhd_mimo_sink.cc @@ -23,7 +23,7 @@ #include <uhd_mimo_sink.h> #include <gr_io_signature.h> #include <stdexcept> -#include "utils.h" +//#include "utils.h" /*********************************************************************** * UHD Sink @@ -59,7 +59,7 @@ public: void set_samp_rate_all(double rate){ _dev->set_tx_rate_all(rate); - do_samp_rate_error_message(rate, get_samp_rate_all(), "TX"); + //do_samp_rate_error_message(rate, get_samp_rate_all(), "TX"); } double get_samp_rate_all(void){ @@ -68,7 +68,7 @@ public: uhd::tune_result_t set_center_freq(size_t chan, double freq){ uhd::tune_result_t tr = _dev->set_tx_freq(chan, freq); - do_tune_freq_error_message(freq, _dev->get_tx_freq(chan), "TX"); + //do_tune_freq_error_message(freq, _dev->get_tx_freq(chan), "TX"); return tr; } diff --git a/gr-uhd/lib/uhd_mimo_sink.h b/gr-uhd/lib/uhd_mimo_sink.h index 46679d973..28a530b60 100644 --- a/gr-uhd/lib/uhd_mimo_sink.h +++ b/gr-uhd/lib/uhd_mimo_sink.h @@ -34,7 +34,10 @@ boost::shared_ptr<uhd_mimo_sink> uhd_make_mimo_sink( const uhd::io_type_t::tid_t &type ); -class uhd_mimo_sink : public gr_sync_block{ +/*********************************************************************** + * DEPRECATED + **********************************************************************/ +class UHD_DEPRECATED uhd_mimo_sink : public gr_sync_block{ public: /*! diff --git a/gr-uhd/lib/uhd_mimo_source.cc b/gr-uhd/lib/uhd_mimo_source.cc index 62157142d..abd70ba36 100644 --- a/gr-uhd/lib/uhd_mimo_source.cc +++ b/gr-uhd/lib/uhd_mimo_source.cc @@ -23,7 +23,7 @@ #include <uhd_mimo_source.h> #include <gr_io_signature.h> #include <stdexcept> -#include "utils.h" +//#include "utils.h" /*********************************************************************** * UHD Source @@ -59,7 +59,7 @@ public: void set_samp_rate_all(double rate){ _dev->set_rx_rate_all(rate); - do_samp_rate_error_message(rate, get_samp_rate_all(), "RX"); + //do_samp_rate_error_message(rate, get_samp_rate_all(), "RX"); } double get_samp_rate_all(void){ @@ -68,7 +68,7 @@ public: uhd::tune_result_t set_center_freq(size_t chan, double freq){ uhd::tune_result_t tr = _dev->set_rx_freq(chan, freq); - do_tune_freq_error_message(freq, _dev->get_rx_freq(chan), "RX"); + //do_tune_freq_error_message(freq, _dev->get_rx_freq(chan), "RX"); return tr; } diff --git a/gr-uhd/lib/uhd_mimo_source.h b/gr-uhd/lib/uhd_mimo_source.h index fbd7f2c42..dc2927598 100644 --- a/gr-uhd/lib/uhd_mimo_source.h +++ b/gr-uhd/lib/uhd_mimo_source.h @@ -34,7 +34,10 @@ boost::shared_ptr<uhd_mimo_source> uhd_make_mimo_source( const uhd::io_type_t::tid_t &type ); -class uhd_mimo_source : public gr_sync_block{ +/*********************************************************************** + * DEPRECATED + **********************************************************************/ +class UHD_DEPRECATED uhd_mimo_source : public gr_sync_block{ public: /*! diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc new file mode 100644 index 000000000..ee16e2928 --- /dev/null +++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc @@ -0,0 +1,188 @@ +/* + * Copyright 2010 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include <uhd_multi_usrp_sink.h> +#include <gr_io_signature.h> +#include <stdexcept> + +/*********************************************************************** + * UHD Multi USRP Sink + **********************************************************************/ +uhd_multi_usrp_sink::uhd_multi_usrp_sink(gr_io_signature_sptr sig) +:gr_sync_block("uhd multi usrp sink", sig, gr_make_io_signature(0, 0, 0)){ + /* NOP */ +} + +/*********************************************************************** + * UHD Multi USRP Sink Impl + **********************************************************************/ +class uhd_multi_usrp_sink_impl : public uhd_multi_usrp_sink{ +public: + uhd_multi_usrp_sink_impl( + 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, io_type.size + )), + _type(io_type), + _nchan(num_channels) + { + _dev = uhd::usrp::multi_usrp::make(device_addr); + } + + void set_subdev_spec(const std::string &spec, size_t mboard){ + return _dev->set_tx_subdev_spec(spec, mboard); + } + + void set_samp_rate(double rate){ + _dev->set_tx_rate(rate); + } + + double get_samp_rate(void){ + return _dev->get_tx_rate(); + } + + uhd::tune_result_t set_center_freq( + const uhd::tune_request_t tune_request, size_t chan + ){ + return _dev->set_tx_freq(tune_request, chan); + } + + uhd::freq_range_t get_freq_range(size_t chan){ + return _dev->get_tx_freq_range(chan); + } + + void set_gain(float gain, size_t chan){ + return _dev->set_tx_gain(gain, chan); + } + + float get_gain(size_t chan){ + return _dev->get_tx_gain(chan); + } + + uhd::gain_range_t get_gain_range(size_t chan){ + return _dev->get_tx_gain_range(chan); + } + + void set_antenna(const std::string &ant, size_t chan){ + return _dev->set_tx_antenna(ant, chan); + } + + std::string get_antenna(size_t chan){ + return _dev->get_tx_antenna(chan); + } + + std::vector<std::string> get_antennas(size_t chan){ + return _dev->get_tx_antennas(chan); + } + + void set_bandwidth(double bandwidth, size_t chan){ + return _dev->set_tx_bandwidth(bandwidth, chan); + } + + void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard){ + return _dev->set_clock_config(clock_config, mboard); + } + + uhd::time_spec_t get_time_now(void){ + return _dev->get_time_now(); + } + + void set_time_next_pps(const uhd::time_spec_t &time_spec){ + return _dev->set_time_next_pps(time_spec); + } + + void set_time_unknown_pps(const uhd::time_spec_t &time_spec){ + return _dev->set_time_unknown_pps(time_spec); + } + + uhd::usrp::multi_usrp::sptr get_device(void){ + return _dev; + } + +/*********************************************************************** + * Work + **********************************************************************/ + int work( + int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items + ){ + uhd::tx_metadata_t metadata; + metadata.start_of_burst = true; + + return _dev->get_device()->send( + input_items, noutput_items, metadata, + _type, uhd::device::SEND_MODE_FULL_BUFF, 1.0 + ); + } + + //Send an empty start-of-burst packet to begin streaming. + //Set at a time in the near future so data will be sync'd. + bool start(void){ + uhd::tx_metadata_t metadata; + metadata.start_of_burst = true; + metadata.has_time_spec = true; + //TODO: Time in the near future, must be less than source time in future + //because ethernet pause frames with throttle stream commands. + //It will be fixed with the invention of host-based flow control. + metadata.time_spec = get_time_now() + uhd::time_spec_t(0.05); + + _dev->get_device()->send( + gr_vector_const_void_star(_nchan), 0, metadata, + _type, uhd::device::SEND_MODE_ONE_PACKET, 1.0 + ); + return true; + } + + //Send an empty end-of-burst packet to end streaming. + //Ending the burst avoids an underflow error on stop. + bool stop(void){ + uhd::tx_metadata_t metadata; + metadata.end_of_burst = true; + + _dev->get_device()->send( + gr_vector_const_void_star(_nchan), 0, metadata, + _type, uhd::device::SEND_MODE_ONE_PACKET, 1.0 + ); + return true; + } + +protected: + uhd::usrp::multi_usrp::sptr _dev; + const uhd::io_type_t _type; + size_t _nchan; +}; + +/*********************************************************************** + * Make UHD Multi USRP Sink + **********************************************************************/ +boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink( + 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(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 new file mode 100644 index 000000000..370e59d0e --- /dev/null +++ b/gr-uhd/lib/uhd_multi_usrp_sink.h @@ -0,0 +1,175 @@ +/* + * Copyright 2010 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_UHD_MULTI_USRP_SINK_H +#define INCLUDED_UHD_MULTI_USRP_SINK_H + +#include <gr_sync_block.h> +#include <uhd/usrp/multi_usrp.hpp> + +class uhd_multi_usrp_sink; + +boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink( + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, + size_t num_channels +); + +class uhd_multi_usrp_sink : public gr_sync_block{ +public: + + /*! + * Set the IO signature for this block. + * \param sig the input signature + */ + uhd_multi_usrp_sink(gr_io_signature_sptr sig); + + /*! + * Set the subdevice specification. + * \param spec the subdev spec markup string + * \param mboard the motherboard index 0 to M-1 + */ + virtual void set_subdev_spec(const std::string &spec, size_t mboard) = 0; + + /*! + * Set the sample rate for the usrp device. + * \param rate a new rate in Sps + */ + virtual void set_samp_rate(double rate) = 0; + + /*! + * Get the sample rate for the usrp device. + * This is the actual sample rate and may differ from the rate set. + * \return the actual rate in Sps + */ + virtual double get_samp_rate(void) = 0; + + /*! + * Tune the usrp device to the desired center frequency. + * \param tune_request the tune request instructions + * \param chan the channel index 0 to N-1 + * \return a tune result with the actual frequencies + */ + virtual uhd::tune_result_t set_center_freq( + const uhd::tune_request_t tune_request, size_t chan + ) = 0; + + /*! + * Tune the usrp device to the desired center frequency. + * This is a wrapper around set center freq so that in this case, + * the user can pass a single frequency in the call through swig. + * \param freq the desired frequency in Hz + * \param chan the channel index 0 to N-1 + * \return a tune result with the actual frequencies + */ + uhd::tune_result_t set_center_freq(double freq, size_t chan){ + return set_center_freq(uhd::tune_request_t(freq), chan); + } + + /*! + * Get the tunable frequency range. + * \param chan the channel index 0 to N-1 + * \return the frequency range in Hz + */ + virtual uhd::freq_range_t get_freq_range(size_t chan) = 0; + + /*! + * Set the gain for the dboard. + * \param gain the gain in dB + * \param chan the channel index 0 to N-1 + */ + virtual void set_gain(float gain, size_t chan) = 0; + + /*! + * Get the actual dboard gain setting. + * \param chan the channel index 0 to N-1 + * \return the actual gain in dB + */ + virtual float get_gain(size_t chan) = 0; + + /*! + * Get the settable gain range. + * \param chan the channel index 0 to N-1 + * \return the gain range in dB + */ + virtual uhd::gain_range_t get_gain_range(size_t chan) = 0; + + /*! + * Set the antenna to use. + * \param ant the antenna string + * \param chan the channel index 0 to N-1 + */ + virtual void set_antenna(const std::string &ant, size_t chan) = 0; + + /*! + * Get the antenna in use. + * \param chan the channel index 0 to N-1 + * \return the antenna string + */ + virtual std::string get_antenna(size_t chan) = 0; + + /*! + * Get a list of possible antennas. + * \param chan the channel index 0 to N-1 + * \return a vector of antenna strings + */ + virtual std::vector<std::string> get_antennas(size_t chan) = 0; + + /*! + * Set the subdevice bandpass filter. + * \param chan the channel index 0 to N-1 + * \param bandwidth the filter bandwidth in Hz + */ + virtual void set_bandwidth(double bandwidth, size_t chan) = 0; + + /*! + * Set the clock configuration. + * \param clock_config the new configuration + * \param mboard the motherboard index 0 to M-1 + */ + virtual void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard) = 0; + + /*! + * Get the current time registers. + * \return the current usrp time + */ + virtual uhd::time_spec_t get_time_now(void) = 0; + + /*! + * Set the time registers at the next pps. + * \param time_spec the new time + */ + virtual void set_time_next_pps(const uhd::time_spec_t &time_spec) = 0; + + /*! + * Sync the time registers with an unknown pps edge. + * \param time_spec the new time + */ + virtual void set_time_unknown_pps(const uhd::time_spec_t &time_spec) = 0; + + /*! + * Get access to the underlying uhd device object. + * \return the multi usrp device object + */ + virtual uhd::usrp::multi_usrp::sptr get_device(void) = 0; +}; + +#endif /* INCLUDED_UHD_MULTI_USRP_SINK_H */ diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc new file mode 100644 index 000000000..029a763e3 --- /dev/null +++ b/gr-uhd/lib/uhd_multi_usrp_source.cc @@ -0,0 +1,187 @@ +/* + * Copyright 2010 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include <uhd_multi_usrp_source.h> +#include <gr_io_signature.h> +#include <stdexcept> +#include <iostream> +#include <boost/format.hpp> + +/*********************************************************************** + * UHD Multi USRP Source + **********************************************************************/ +uhd_multi_usrp_source::uhd_multi_usrp_source(gr_io_signature_sptr sig) +:gr_sync_block("uhd multi_usrp source", gr_make_io_signature(0, 0, 0), sig){ + /* NOP */ +} + +/*********************************************************************** + * UHD Multi USRP Source Impl + **********************************************************************/ +class uhd_multi_usrp_source_impl : public uhd_multi_usrp_source{ +public: + uhd_multi_usrp_source_impl( + 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, io_type.size + )), + _type(io_type) + { + _dev = uhd::usrp::multi_usrp::make(device_addr); + } + + void set_subdev_spec(const std::string &spec, size_t mboard){ + return _dev->set_rx_subdev_spec(spec, mboard); + } + + void set_samp_rate(double rate){ + _dev->set_rx_rate(rate); + } + + double get_samp_rate(void){ + return _dev->get_rx_rate(); + } + + uhd::tune_result_t set_center_freq( + const uhd::tune_request_t tune_request, size_t chan + ){ + return _dev->set_rx_freq(tune_request, chan); + } + + uhd::freq_range_t get_freq_range(size_t chan){ + return _dev->get_rx_freq_range(chan); + } + + void set_gain(float gain, size_t chan){ + return _dev->set_rx_gain(gain, chan); + } + + float get_gain(size_t chan){ + return _dev->get_rx_gain(chan); + } + + uhd::gain_range_t get_gain_range(size_t chan){ + return _dev->get_rx_gain_range(chan); + } + + void set_antenna(const std::string &ant, size_t chan){ + return _dev->set_rx_antenna(ant, chan); + } + + std::string get_antenna(size_t chan){ + return _dev->get_rx_antenna(chan); + } + + std::vector<std::string> get_antennas(size_t chan){ + return _dev->get_rx_antennas(chan); + } + + void set_bandwidth(double bandwidth, size_t chan){ + return _dev->set_rx_bandwidth(bandwidth, chan); + } + + void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard){ + return _dev->set_clock_config(clock_config, mboard); + } + + uhd::time_spec_t get_time_now(void){ + return _dev->get_time_now(); + } + + void set_time_next_pps(const uhd::time_spec_t &time_spec){ + return _dev->set_time_next_pps(time_spec); + } + + void set_time_unknown_pps(const uhd::time_spec_t &time_spec){ + return _dev->set_time_unknown_pps(time_spec); + } + + uhd::usrp::multi_usrp::sptr get_device(void){ + return _dev; + } + +/*********************************************************************** + * Work + **********************************************************************/ + int work( + int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items + ){ + uhd::rx_metadata_t metadata; //not passed out of this block + + size_t num_samps = _dev->get_device()->recv( + output_items, noutput_items, metadata, + _type, uhd::device::RECV_MODE_FULL_BUFF, 1.0 + ); + + switch(metadata.error_code){ + case uhd::rx_metadata_t::ERROR_CODE_NONE: + return num_samps; + + case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW: + //ignore overflows and try work again + return work(noutput_items, input_items, output_items); + + default: + std::cout << boost::format( + "UHD source block got error code 0x%x" + ) % metadata.error_code << std::endl; + return num_samps; + } + } + + bool start(void){ + //setup a stream command that starts streaming slightly in the future + static const double reasonable_delay = 0.1; //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(reasonable_delay); + _dev->issue_stream_cmd(stream_cmd); + return true; + } + + bool stop(void){ + _dev->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); + return true; + } + +private: + uhd::usrp::multi_usrp::sptr _dev; + const uhd::io_type_t _type; +}; + + +/*********************************************************************** + * Make UHD Multi USRP Source + **********************************************************************/ +boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source( + 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(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 new file mode 100644 index 000000000..b3cbdae1f --- /dev/null +++ b/gr-uhd/lib/uhd_multi_usrp_source.h @@ -0,0 +1,175 @@ +/* + * Copyright 2010 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_UHD_MULTI_USRP_SOURCE_H +#define INCLUDED_UHD_MULTI_USRP_SOURCE_H + +#include <gr_sync_block.h> +#include <uhd/usrp/multi_usrp.hpp> + +class uhd_multi_usrp_source; + +boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source( + const std::string &device_addr, + const uhd::io_type_t::tid_t &io_type, + size_t num_channels +); + +class uhd_multi_usrp_source : public gr_sync_block{ +public: + + /*! + * Set the IO signature for this block. + * \param sig the output signature + */ + uhd_multi_usrp_source(gr_io_signature_sptr sig); + + /*! + * Set the subdevice specification. + * \param spec the subdev spec markup string + * \param mboard the motherboard index 0 to M-1 + */ + virtual void set_subdev_spec(const std::string &spec, size_t mboard) = 0; + + /*! + * Set the sample rate for the usrp device. + * \param rate a new rate in Sps + */ + virtual void set_samp_rate(double rate) = 0; + + /*! + * Get the sample rate for the usrp device. + * This is the actual sample rate and may differ from the rate set. + * \return the actual rate in Sps + */ + virtual double get_samp_rate(void) = 0; + + /*! + * Tune the usrp device to the desired center frequency. + * \param tune_request the tune request instructions + * \param chan the channel index 0 to N-1 + * \return a tune result with the actual frequencies + */ + virtual uhd::tune_result_t set_center_freq( + const uhd::tune_request_t tune_request, size_t chan + ) = 0; + + /*! + * Tune the usrp device to the desired center frequency. + * This is a wrapper around set center freq so that in this case, + * the user can pass a single frequency in the call through swig. + * \param freq the desired frequency in Hz + * \param chan the channel index 0 to N-1 + * \return a tune result with the actual frequencies + */ + uhd::tune_result_t set_center_freq(double freq, size_t chan){ + return set_center_freq(uhd::tune_request_t(freq), chan); + } + + /*! + * Get the tunable frequency range. + * \param chan the channel index 0 to N-1 + * \return the frequency range in Hz + */ + virtual uhd::freq_range_t get_freq_range(size_t chan) = 0; + + /*! + * Set the gain for the dboard. + * \param gain the gain in dB + * \param chan the channel index 0 to N-1 + */ + virtual void set_gain(float gain, size_t chan) = 0; + + /*! + * Get the actual dboard gain setting. + * \param chan the channel index 0 to N-1 + * \return the actual gain in dB + */ + virtual float get_gain(size_t chan) = 0; + + /*! + * Get the settable gain range. + * \param chan the channel index 0 to N-1 + * \return the gain range in dB + */ + virtual uhd::gain_range_t get_gain_range(size_t chan) = 0; + + /*! + * Set the antenna to use. + * \param ant the antenna string + * \param chan the channel index 0 to N-1 + */ + virtual void set_antenna(const std::string &ant, size_t chan) = 0; + + /*! + * Get the antenna in use. + * \param chan the channel index 0 to N-1 + * \return the antenna string + */ + virtual std::string get_antenna(size_t chan) = 0; + + /*! + * Get a list of possible antennas. + * \param chan the channel index 0 to N-1 + * \return a vector of antenna strings + */ + virtual std::vector<std::string> get_antennas(size_t chan) = 0; + + /*! + * Set the subdevice bandpass filter. + * \param bandwidth the filter bandwidth in Hz + * \param chan the channel index 0 to N-1 + */ + virtual void set_bandwidth(double bandwidth, size_t chan) = 0; + + /*! + * Set the clock configuration. + * \param clock_config the new configuration + * \param mboard the motherboard index 0 to M-1 + */ + virtual void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard) = 0; + + /*! + * Get the current time registers. + * \return the current usrp time + */ + virtual uhd::time_spec_t get_time_now(void) = 0; + + /*! + * Set the time registers at the next pps. + * \param time_spec the new time + */ + virtual void set_time_next_pps(const uhd::time_spec_t &time_spec) = 0; + + /*! + * Sync the time registers with an unknown pps edge. + * \param time_spec the new time + */ + virtual void set_time_unknown_pps(const uhd::time_spec_t &time_spec) = 0; + + /*! + * Get access to the underlying uhd device object. + * \return the multi usrp device object + */ + virtual uhd::usrp::multi_usrp::sptr get_device(void) = 0; +}; + +#endif /* INCLUDED_UHD_MULTI_USRP_SOURCE_H */ diff --git a/gr-uhd/lib/uhd_simple_sink.cc b/gr-uhd/lib/uhd_simple_sink.cc index 7b31218db..d7b04465d 100644 --- a/gr-uhd/lib/uhd_simple_sink.cc +++ b/gr-uhd/lib/uhd_simple_sink.cc @@ -23,7 +23,7 @@ #include <uhd_simple_sink.h> #include <gr_io_signature.h> #include <stdexcept> -#include "utils.h" +//#include "utils.h" /*********************************************************************** * UHD Sink @@ -56,7 +56,7 @@ public: void set_samp_rate(double rate){ _dev->set_tx_rate(rate); - do_samp_rate_error_message(rate, get_samp_rate(), "TX"); + //do_samp_rate_error_message(rate, get_samp_rate(), "TX"); } double get_samp_rate(void){ @@ -65,7 +65,7 @@ public: uhd::tune_result_t set_center_freq(double freq){ uhd::tune_result_t tr = _dev->set_tx_freq(freq); - do_tune_freq_error_message(freq, _dev->get_tx_freq(), "TX"); + //do_tune_freq_error_message(freq, _dev->get_tx_freq(), "TX"); return tr; } diff --git a/gr-uhd/lib/uhd_simple_sink.h b/gr-uhd/lib/uhd_simple_sink.h index 0abf30681..b239e3f21 100644 --- a/gr-uhd/lib/uhd_simple_sink.h +++ b/gr-uhd/lib/uhd_simple_sink.h @@ -33,7 +33,10 @@ boost::shared_ptr<uhd_simple_sink> uhd_make_simple_sink( const uhd::io_type_t::tid_t &type ); -class uhd_simple_sink : public gr_sync_block{ +/*********************************************************************** + * DEPRECATED + **********************************************************************/ +class UHD_DEPRECATED uhd_simple_sink : public gr_sync_block{ public: /*! diff --git a/gr-uhd/lib/uhd_simple_source.cc b/gr-uhd/lib/uhd_simple_source.cc index c1e11e85d..d74c8414d 100644 --- a/gr-uhd/lib/uhd_simple_source.cc +++ b/gr-uhd/lib/uhd_simple_source.cc @@ -25,7 +25,7 @@ #include <stdexcept> #include <iostream> #include <boost/format.hpp> -#include "utils.h" +//#include "utils.h" /*********************************************************************** * UHD Source @@ -59,7 +59,7 @@ public: void set_samp_rate(double rate){ _dev->set_rx_rate(rate); - do_samp_rate_error_message(rate, get_samp_rate(), "RX"); + //do_samp_rate_error_message(rate, get_samp_rate(), "RX"); } double get_samp_rate(void){ @@ -68,7 +68,7 @@ public: uhd::tune_result_t set_center_freq(double freq){ uhd::tune_result_t tr = _dev->set_rx_freq(freq); - do_tune_freq_error_message(freq, _dev->get_rx_freq(), "RX"); + //do_tune_freq_error_message(freq, _dev->get_rx_freq(), "RX"); return tr; } diff --git a/gr-uhd/lib/uhd_simple_source.h b/gr-uhd/lib/uhd_simple_source.h index b95c0cfd9..c524a024a 100644 --- a/gr-uhd/lib/uhd_simple_source.h +++ b/gr-uhd/lib/uhd_simple_source.h @@ -33,7 +33,10 @@ boost::shared_ptr<uhd_simple_source> uhd_make_simple_source( const uhd::io_type_t::tid_t &type ); -class uhd_simple_source : public gr_sync_block{ +/*********************************************************************** + * DEPRECATED + **********************************************************************/ +class UHD_DEPRECATED uhd_simple_source : public gr_sync_block{ public: /*! diff --git a/gr-uhd/lib/uhd_single_usrp_sink.cc b/gr-uhd/lib/uhd_single_usrp_sink.cc index 96f86c8db..622f506b5 100644 --- a/gr-uhd/lib/uhd_single_usrp_sink.cc +++ b/gr-uhd/lib/uhd_single_usrp_sink.cc @@ -22,10 +22,9 @@ #include <uhd_single_usrp_sink.h> #include <gr_io_signature.h> #include <stdexcept> -#include "utils.h" /*********************************************************************** - * UHD Single USPR Sink + * UHD Single USRP Sink **********************************************************************/ uhd_single_usrp_sink::uhd_single_usrp_sink(gr_io_signature_sptr sig) :gr_sync_block("uhd single usrp sink", sig, gr_make_io_signature(0, 0, 0)){ @@ -33,21 +32,22 @@ uhd_single_usrp_sink::uhd_single_usrp_sink(gr_io_signature_sptr sig) } /*********************************************************************** - * UHD Single USPR Sink Impl + * UHD Single USRP Sink Impl **********************************************************************/ 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); - } - - ~uhd_single_usrp_sink_impl(void){ - //NOP + _dev = uhd::usrp::single_usrp::make(device_addr); } void set_subdev_spec(const std::string &spec){ @@ -56,17 +56,16 @@ public: void set_samp_rate(double rate){ _dev->set_tx_rate(rate); - do_samp_rate_error_message(rate, get_samp_rate(), "TX"); } double get_samp_rate(void){ return _dev->get_tx_rate(); } - uhd::tune_result_t set_center_freq(double freq, size_t chan){ - uhd::tune_result_t tr = _dev->set_tx_freq(freq, chan); - do_tune_freq_error_message(freq, _dev->get_tx_freq(chan), "TX"); - return tr; + uhd::tune_result_t set_center_freq( + const uhd::tune_request_t tune_request, size_t chan + ){ + return _dev->set_tx_freq(tune_request, chan); } uhd::freq_range_t get_freq_range(size_t chan){ @@ -97,6 +96,10 @@ public: return _dev->get_tx_antennas(chan); } + void set_bandwidth(double bandwidth, size_t chan){ + return _dev->set_tx_bandwidth(bandwidth, chan); + } + void set_clock_config(const uhd::clock_config_t &clock_config){ return _dev->set_clock_config(clock_config); } @@ -167,14 +170,14 @@ protected: }; /*********************************************************************** - * Make UHD Single USPR Sink + * 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 bec788193..a4c4e6452 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 ); @@ -63,13 +63,29 @@ public: /*! * Tune the usrp device to the desired center frequency. + * \param tune_request the tune request instructions + * \param chan the channel index 0 to N-1 + * \return a tune result with the actual frequencies + */ + virtual uhd::tune_result_t set_center_freq( + const uhd::tune_request_t tune_request, size_t chan + ) = 0; + + /*! + * Tune the usrp device to the desired center frequency. + * This is a wrapper around set center freq so that in this case, + * the user can pass a single frequency in the call through swig. * \param freq the desired frequency in Hz + * \param chan the channel index 0 to N-1 * \return a tune result with the actual frequencies */ - virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0; + uhd::tune_result_t set_center_freq(double freq, size_t chan){ + return set_center_freq(uhd::tune_request_t(freq), chan); + } /*! * Get the tunable frequency range. + * \param chan the channel index 0 to N-1 * \return the frequency range in Hz */ virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0; @@ -77,17 +93,20 @@ public: /*! * Set the gain for the dboard. * \param gain the gain in dB + * \param chan the channel index 0 to N-1 */ virtual void set_gain(float gain, size_t chan = 0) = 0; /*! * Get the actual dboard gain setting. + * \param chan the channel index 0 to N-1 * \return the actual gain in dB */ virtual float get_gain(size_t chan = 0) = 0; /*! * Get the settable gain range. + * \param chan the channel index 0 to N-1 * \return the gain range in dB */ virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0; @@ -95,22 +114,32 @@ public: /*! * Set the antenna to use. * \param ant the antenna string + * \param chan the channel index 0 to N-1 */ virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0; /*! * Get the antenna in use. + * \param chan the channel index 0 to N-1 * \return the antenna string */ virtual std::string get_antenna(size_t chan = 0) = 0; /*! * Get a list of possible antennas. + * \param chan the channel index 0 to N-1 * \return a vector of antenna strings */ virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0; /*! + * Set the subdevice bandpass filter. + * \param bandwidth the filter bandwidth in Hz + * \param chan the channel index 0 to N-1 + */ + virtual void set_bandwidth(double bandwidth, size_t chan = 0) = 0; + + /*! * Set the clock configuration. * \param clock_config the new configuration */ diff --git a/gr-uhd/lib/uhd_single_usrp_source.cc b/gr-uhd/lib/uhd_single_usrp_source.cc index b5e39b5a4..907e8be54 100644 --- a/gr-uhd/lib/uhd_single_usrp_source.cc +++ b/gr-uhd/lib/uhd_single_usrp_source.cc @@ -24,10 +24,9 @@ #include <stdexcept> #include <iostream> #include <boost/format.hpp> -#include "utils.h" /*********************************************************************** - * UHD Single USPR Source + * UHD Single USRP Source **********************************************************************/ uhd_single_usrp_source::uhd_single_usrp_source(gr_io_signature_sptr sig) :gr_sync_block("uhd single_usrp source", gr_make_io_signature(0, 0, 0), sig){ @@ -35,17 +34,21 @@ uhd_single_usrp_source::uhd_single_usrp_source(gr_io_signature_sptr sig) } /*********************************************************************** - * UHD Single USPR Source Impl + * UHD Single USRP Source Impl **********************************************************************/ 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){ @@ -54,17 +57,16 @@ public: void set_samp_rate(double rate){ _dev->set_rx_rate(rate); - do_samp_rate_error_message(rate, get_samp_rate(), "RX"); } double get_samp_rate(void){ return _dev->get_rx_rate(); } - uhd::tune_result_t set_center_freq(double freq, size_t chan){ - uhd::tune_result_t tr = _dev->set_rx_freq(freq, chan); - do_tune_freq_error_message(freq, _dev->get_rx_freq(chan), "RX"); - return tr; + uhd::tune_result_t set_center_freq( + const uhd::tune_request_t tune_request, size_t chan + ){ + return _dev->set_rx_freq(tune_request, chan); } uhd::freq_range_t get_freq_range(size_t chan){ @@ -95,6 +97,10 @@ public: return _dev->get_rx_antennas(chan); } + void set_bandwidth(double bandwidth, size_t chan){ + return _dev->set_rx_bandwidth(bandwidth, chan); + } + void set_clock_config(const uhd::clock_config_t &clock_config){ return _dev->set_clock_config(clock_config); } @@ -163,14 +169,14 @@ private: /*********************************************************************** - * Make UHD Single USPR Source + * 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 196b7c675..495f8c611 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 ); @@ -63,13 +63,29 @@ public: /*! * Tune the usrp device to the desired center frequency. + * \param tune_request the tune request instructions + * \param chan the channel index 0 to N-1 + * \return a tune result with the actual frequencies + */ + virtual uhd::tune_result_t set_center_freq( + const uhd::tune_request_t tune_request, size_t chan + ) = 0; + + /*! + * Tune the usrp device to the desired center frequency. + * This is a wrapper around set center freq so that in this case, + * the user can pass a single frequency in the call through swig. * \param freq the desired frequency in Hz + * \param chan the channel index 0 to N-1 * \return a tune result with the actual frequencies */ - virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0; + uhd::tune_result_t set_center_freq(double freq, size_t chan){ + return set_center_freq(uhd::tune_request_t(freq), chan); + } /*! * Get the tunable frequency range. + * \param chan the channel index 0 to N-1 * \return the frequency range in Hz */ virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0; @@ -77,17 +93,20 @@ public: /*! * Set the gain for the dboard. * \param gain the gain in dB + * \param chan the channel index 0 to N-1 */ virtual void set_gain(float gain, size_t chan = 0) = 0; /*! * Get the actual dboard gain setting. + * \param chan the channel index 0 to N-1 * \return the actual gain in dB */ virtual float get_gain(size_t chan = 0) = 0; /*! * Get the settable gain range. + * \param chan the channel index 0 to N-1 * \return the gain range in dB */ virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0; @@ -95,22 +114,32 @@ public: /*! * Set the antenna to use. * \param ant the antenna string + * \param chan the channel index 0 to N-1 */ virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0; /*! * Get the antenna in use. + * \param chan the channel index 0 to N-1 * \return the antenna string */ virtual std::string get_antenna(size_t chan = 0) = 0; /*! * Get a list of possible antennas. + * \param chan the channel index 0 to N-1 * \return a vector of antenna strings */ virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0; /*! + * Set the subdevice bandpass filter. + * \param bandwidth the filter bandwidth in Hz + * \param chan the channel index 0 to N-1 + */ + virtual void set_bandwidth(double bandwidth, size_t chan = 0) = 0; + + /*! * Set the clock configuration. * \param clock_config the new configuration */ diff --git a/gr-uhd/lib/utils.cc b/gr-uhd/lib/utils.cc deleted file mode 100644 index da8352965..000000000 --- a/gr-uhd/lib/utils.cc +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2010 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "utils.h" //local include -#include <uhd/utils/warning.hpp> -#include <boost/format.hpp> -#include <cmath> - -void do_samp_rate_error_message( - double target_rate, - double actual_rate, - const std::string &xx -){ - static const double max_allowed_error = 1.0; //Sps - if (std::abs(target_rate - actual_rate) > max_allowed_error){ - uhd::print_warning(str(boost::format( - "The hardware does not support the requested %s sample rate:\n" - "Target sample rate: %f MSps\n" - "Actual sample rate: %f MSps\n" - ) % xx % (target_rate/1e6) % (actual_rate/1e6))); - } -} - -void do_tune_freq_error_message( - double target_freq, - double actual_freq, - const std::string &xx -){ - static const double max_allowed_error = 1.0; //Hz - if (std::abs(target_freq - actual_freq) > max_allowed_error){ - uhd::print_warning(str(boost::format( - "The hardware does not support the requested %s frequency:\n" - "Target frequency: %f MHz\n" - "Actual frequency: %f MHz\n" - ) % xx % (target_freq/1e6) % (actual_freq/1e6))); - } -} diff --git a/gr-uhd/lib/utils.h b/gr-uhd/lib/utils.h deleted file mode 100644 index 4a05476bd..000000000 --- a/gr-uhd/lib/utils.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2010 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_NOINST_UTILS_H -#define INCLUDED_NOINST_UTILS_H - -#include <string> - -void do_samp_rate_error_message( - double target_rate, - double actual_rate, - const std::string &xx -); - -void do_tune_freq_error_message( - double target_freq, - double actual_freq, - const std::string &xx -); - -#endif /* INCLUDED_NOINST_UTILS_H */ diff --git a/gr-uhd/swig/__init__.py b/gr-uhd/swig/__init__.py index 2fed17e57..0fdacb796 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 diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i index d755dfeee..d332bb617 100644 --- a/gr-uhd/swig/uhd_swig.i +++ b/gr-uhd/swig/uhd_swig.i @@ -20,6 +20,27 @@ * Boston, MA 02110-1301, USA. */ +//////////////////////////////////////////////////////////////////////// +// Language independent exception handler +//////////////////////////////////////////////////////////////////////// +%include exception.i + +%exception { + try { + $action + } + catch(std::exception &e) { + SWIG_exception(SWIG_RuntimeError, e.what()); + } + catch(...) { + SWIG_exception(SWIG_RuntimeError, "Unknown exception"); + } + +} + +//////////////////////////////////////////////////////////////////////// +// standard includes +//////////////////////////////////////////////////////////////////////// %include "gnuradio.i" %include "std_string.i" %include "std_vector.i" @@ -28,36 +49,63 @@ namespace std { %template(StringVector) vector<string>; } +//////////////////////////////////////////////////////////////////////// +// block headers +//////////////////////////////////////////////////////////////////////// %{ -#include <uhd_mimo_source.h> -#include <uhd_mimo_sink.h> -#include <uhd_simple_source.h> -#include <uhd_simple_sink.h> +#include <uhd_mimo_source.h> //deprecated +#include <uhd_mimo_sink.h> //deprecated +#include <uhd_simple_source.h> //deprecated +#include <uhd_simple_sink.h> //deprecated + +#include <uhd_multi_usrp_source.h> +#include <uhd_multi_usrp_sink.h> #include <uhd_single_usrp_source.h> #include <uhd_single_usrp_sink.h> %} +//////////////////////////////////////////////////////////////////////// +// used types +//////////////////////////////////////////////////////////////////////// %include <uhd/config.hpp> %include <uhd/types/ranges.hpp> +%include <uhd/types/tune_request.hpp> %include <uhd/types/tune_result.hpp> %include <uhd/types/io_type.hpp> %include <uhd/types/time_spec.hpp> %include <uhd/types/clock_config.hpp> -GR_SWIG_BLOCK_MAGIC(uhd,mimo_source) -%include <uhd_mimo_source.h> +//////////////////////////////////////////////////////////////////////// +// block magic +//////////////////////////////////////////////////////////////////////// +GR_SWIG_BLOCK_MAGIC(uhd,mimo_source) //deprecated +%include <uhd_mimo_source.h> //deprecated -GR_SWIG_BLOCK_MAGIC(uhd,mimo_sink) -%include <uhd_mimo_sink.h> +GR_SWIG_BLOCK_MAGIC(uhd,mimo_sink) //deprecated +%include <uhd_mimo_sink.h> //deprecated -GR_SWIG_BLOCK_MAGIC(uhd,simple_source) -%include <uhd_simple_source.h> +GR_SWIG_BLOCK_MAGIC(uhd,simple_source) //deprecated +%include <uhd_simple_source.h> //deprecated -GR_SWIG_BLOCK_MAGIC(uhd,simple_sink) -%include <uhd_simple_sink.h> +GR_SWIG_BLOCK_MAGIC(uhd,simple_sink) //deprecated +%include <uhd_simple_sink.h> //deprecated + +GR_SWIG_BLOCK_MAGIC(uhd,multi_usrp_source) +%include <uhd_multi_usrp_source.h> + +GR_SWIG_BLOCK_MAGIC(uhd,multi_usrp_sink) +%include <uhd_multi_usrp_sink.h> GR_SWIG_BLOCK_MAGIC(uhd,single_usrp_source) %include <uhd_single_usrp_source.h> 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; |