From 7787d1fc1aecc7b59e476c31865b4f32348cb729 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Thu, 10 Feb 2011 00:56:55 -0800 Subject: uhd: replaced multi/single usrp stuff with just one usrp wrapper --- gr-uhd/lib/gr_uhd_usrp_source.cc | 199 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 gr-uhd/lib/gr_uhd_usrp_source.cc (limited to 'gr-uhd/lib/gr_uhd_usrp_source.cc') diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc new file mode 100644 index 000000000..17877d04c --- /dev/null +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -0,0 +1,199 @@ +/* + * Copyright 2010-2011 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include + +/*********************************************************************** + * UHD Multi USRP Source + **********************************************************************/ +uhd_usrp_source::uhd_usrp_source(gr_io_signature_sptr sig) +:gr_sync_block("gr uhd usrp source", gr_make_io_signature(0, 0, 0), sig){ + /* NOP */ +} + +/*********************************************************************** + * UHD Multi USRP Source Impl + **********************************************************************/ +class uhd_usrp_source_impl : public uhd_usrp_source{ +public: + uhd_usrp_source_impl( + const uhd::device_addr_t &device_addr, + const uhd::io_type_t &io_type, + size_t num_channels + ): + uhd_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); + } + + double get_center_freq(size_t chan){ + return _dev->get_rx_freq(chan); + } + + uhd::freq_range_t get_freq_range(size_t chan){ + return _dev->get_rx_freq_range(chan); + } + + void set_gain(double gain, size_t chan){ + return _dev->set_rx_gain(gain, chan); + } + + double 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 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_now(const uhd::time_spec_t &time_spec, size_t mboard){ + return _dev->set_time_now(time_spec, mboard); + } + + 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::dboard_iface::sptr get_dboard_iface(size_t chan){ + return _dev->get_rx_dboard_iface(chan); + } + + 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_make_usrp_source( + const uhd::device_addr_t &device_addr, + const uhd::io_type_t &io_type, + size_t num_channels +){ + return boost::shared_ptr( + new uhd_usrp_source_impl(device_addr, io_type, num_channels) + ); +} -- cgit From 8c1ff29bf925728b323f7036ca4ab09fec5e18df Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Thu, 10 Feb 2011 12:34:49 -0800 Subject: uhd: added set and get clock rates to gr-uhd blocks and grc wrappers --- gr-uhd/lib/gr_uhd_usrp_source.cc | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'gr-uhd/lib/gr_uhd_usrp_source.cc') diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc index 17877d04c..6c8e7f40f 100644 --- a/gr-uhd/lib/gr_uhd_usrp_source.cc +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -109,6 +109,14 @@ public: return _dev->set_clock_config(clock_config, mboard); } + double get_clock_rate(size_t mboard){ + return _dev->get_master_clock_rate(mboard); + } + + void set_clock_rate(double rate, size_t mboard){ + return _dev->set_master_clock_rate(rate, mboard); + } + uhd::time_spec_t get_time_now(void){ return _dev->get_time_now(); } -- cgit From 59396c1cd15c275b1fb8453b69219863bc5c788f Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 11 Feb 2011 10:29:35 -0800 Subject: uhd: added mboard param to get time now and added get time last pps --- gr-uhd/lib/gr_uhd_usrp_source.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'gr-uhd/lib/gr_uhd_usrp_source.cc') diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc index 6c8e7f40f..4ae446332 100644 --- a/gr-uhd/lib/gr_uhd_usrp_source.cc +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -117,8 +117,12 @@ public: return _dev->set_master_clock_rate(rate, mboard); } - uhd::time_spec_t get_time_now(void){ - return _dev->get_time_now(); + uhd::time_spec_t get_time_now(size_t mboard = 0){ + return _dev->get_time_now(mboard); + } + + uhd::time_spec_t get_time_last_pps(size_t mboard){ + return _dev->get_time_last_pps(mboard); } void set_time_now(const uhd::time_spec_t &time_spec, size_t mboard){ -- cgit From 5bb8acf24e4913d2a969db70476af65c498b032f Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 25 Feb 2011 15:34:04 -0800 Subject: uhd: added sensors api to gr-uhd blocks and swig support --- gr-uhd/lib/gr_uhd_usrp_source.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'gr-uhd/lib/gr_uhd_usrp_source.cc') diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc index 4ae446332..09cced567 100644 --- a/gr-uhd/lib/gr_uhd_usrp_source.cc +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -105,6 +105,22 @@ public: return _dev->set_rx_bandwidth(bandwidth, chan); } + uhd::sensor_value_t get_dboard_sensor(const std::string &name, size_t chan){ + return _dev->get_rx_sensor(name, chan); + } + + std::vector get_dboard_sensor_names(size_t chan){ + return _dev->get_rx_sensor_names(chan); + } + + uhd::sensor_value_t get_mboard_sensor(const std::string &name, size_t mboard){ + return _dev->get_mboard_sensor(name, mboard); + } + + std::vector get_mboard_sensor_names(size_t mboard){ + return _dev->get_mboard_sensor_names(mboard); + } + void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard){ return _dev->set_clock_config(clock_config, mboard); } -- cgit From 75538e12300cb0d593792a986841ba2df9997c54 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Tue, 1 Mar 2011 16:31:14 -0800 Subject: uhd: work on gr_uhd_source work() function to reduce latency Wait on a single packet to become ready, then receive available packets without timeout. --- gr-uhd/lib/gr_uhd_usrp_source.cc | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'gr-uhd/lib/gr_uhd_usrp_source.cc') diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc index 09cced567..1234ed7fe 100644 --- a/gr-uhd/lib/gr_uhd_usrp_source.cc +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -46,7 +46,10 @@ public: uhd_usrp_source(gr_make_io_signature( num_channels, num_channels, io_type.size )), - _type(io_type) + _type(io_type), + _nchan(num_channels), + _stream_now(_nchan == 1), + _tmp_buffs(_nchan) { _dev = uhd::usrp::multi_usrp::make(device_addr); } @@ -169,16 +172,16 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items ){ - uhd::rx_metadata_t metadata; //not passed out of this block - + //wait for a packet to become available size_t num_samps = _dev->get_device()->recv( - output_items, noutput_items, metadata, - _type, uhd::device::RECV_MODE_FULL_BUFF, 1.0 + output_items, noutput_items, _metadata, + _type, uhd::device::RECV_MODE_ONE_PACKET, 1.0 ); - switch(metadata.error_code){ + //handle possible errors conditions + switch(_metadata.error_code){ case uhd::rx_metadata_t::ERROR_CODE_NONE: - return num_samps; + break; case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW: //ignore overflows and try work again @@ -187,16 +190,30 @@ public: default: std::cout << boost::format( "UHD source block got error code 0x%x" - ) % metadata.error_code << std::endl; + ) % _metadata.error_code << std::endl; return num_samps; } + + //advance the pointers and count by num_samps + noutput_items -= num_samps; + for (size_t i = 0; i < _nchan; i++){ + _tmp_buffs[i] = static_cast(output_items[i]) + num_samps*_type.size; + } + + //receive all available packets without timeout + num_samps += _dev->get_device()->recv( + _tmp_buffs, noutput_items, _metadata, + _type, uhd::device::RECV_MODE_FULL_BUFF, 0.0 + ); + + 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.stream_now = _stream_now; stream_cmd.time_spec = get_time_now() + uhd::time_spec_t(reasonable_delay); _dev->issue_stream_cmd(stream_cmd); return true; @@ -210,6 +227,10 @@ public: private: uhd::usrp::multi_usrp::sptr _dev; const uhd::io_type_t _type; + size_t _nchan; + bool _stream_now; + gr_vector_void_star _tmp_buffs; + uhd::rx_metadata_t _metadata; }; -- cgit From 25ee0ce936a3088bfef694810ea6322f19dac3f2 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 16 Mar 2011 15:20:44 -0700 Subject: uhd: cleanup uhd usrp source/sink with virtual inheritance The uhd block implementations now inherit from sync block. And the redundant constructor in source/sink has been removed. --- gr-uhd/lib/gr_uhd_usrp_source.cc | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) (limited to 'gr-uhd/lib/gr_uhd_usrp_source.cc') diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc index 1234ed7fe..fed8e6624 100644 --- a/gr-uhd/lib/gr_uhd_usrp_source.cc +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -25,14 +25,6 @@ #include #include -/*********************************************************************** - * UHD Multi USRP Source - **********************************************************************/ -uhd_usrp_source::uhd_usrp_source(gr_io_signature_sptr sig) -:gr_sync_block("gr uhd usrp source", gr_make_io_signature(0, 0, 0), sig){ - /* NOP */ -} - /*********************************************************************** * UHD Multi USRP Source Impl **********************************************************************/ @@ -43,9 +35,11 @@ public: const uhd::io_type_t &io_type, size_t num_channels ): - uhd_usrp_source(gr_make_io_signature( - num_channels, num_channels, io_type.size - )), + gr_sync_block( + "gr uhd usrp source", + gr_make_io_signature(0, 0, 0), + gr_make_io_signature(num_channels, num_channels, io_type.size) + ), _type(io_type), _nchan(num_channels), _stream_now(_nchan == 1), -- cgit