diff options
-rw-r--r-- | gr-uhd/lib/uhd_multi_usrp_sink.cc | 151 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_multi_usrp_sink.h | 6 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_multi_usrp_source.cc | 154 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_multi_usrp_source.h | 6 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_single_usrp_sink.cc | 10 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_single_usrp_source.cc | 6 | ||||
-rw-r--r-- | gr-uhd/swig/uhd_swig.i | 33 |
7 files changed, 344 insertions, 22 deletions
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc index 6854649c3..202f12840 100644 --- a/gr-uhd/lib/uhd_multi_usrp_sink.cc +++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc @@ -22,3 +22,154 @@ #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 &args, + const uhd::io_type_t &type, + size_t num_channels + ) : uhd_multi_usrp_sink(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type), _nchan(num_channels) + { + _dev = uhd::usrp::multi_usrp::make(args); + } + + 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(double freq, size_t chan){ + uhd::tune_result_t tr = _dev->set_tx_freq(freq, chan); + return tr; + } + + 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_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 + ); + } + + //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; + metadata.time_spec = get_time_now() + uhd::time_spec_t(0.01); //10ms offset in future + + _dev->get_device()->send( + gr_vector_const_void_star(_nchan), 0, metadata, + _type, uhd::device::SEND_MODE_ONE_PACKET + ); + 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 + ); + 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 &args, + const uhd::io_type_t::tid_t &type, + size_t num_channels +){ + return boost::shared_ptr<uhd_multi_usrp_sink>( + new uhd_multi_usrp_sink_impl(args, type, num_channels) + ); +} diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.h b/gr-uhd/lib/uhd_multi_usrp_sink.h index b29657e94..13bba20fb 100644 --- a/gr-uhd/lib/uhd_multi_usrp_sink.h +++ b/gr-uhd/lib/uhd_multi_usrp_sink.h @@ -129,6 +129,12 @@ public: 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 */ diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc index 27caffbfc..c10c08c50 100644 --- a/gr-uhd/lib/uhd_multi_usrp_source.cc +++ b/gr-uhd/lib/uhd_multi_usrp_source.cc @@ -22,3 +22,157 @@ #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 &args, + const uhd::io_type_t &type, + size_t num_channels + ) : uhd_multi_usrp_source(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type) + { + _dev = uhd::usrp::multi_usrp::make(args); + } + + 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(double freq, size_t chan){ + uhd::tune_result_t tr = _dev->set_rx_freq(freq, chan); + return tr; + } + + 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_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 + ); + + 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.01; //10 ms (order of magnitude >> RTT) + uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); + stream_cmd.stream_now = false; + stream_cmd.time_spec = get_time_now() + uhd::time_spec_t(_dev->get_num_mboards() * reasonable_delay); + _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 &args, + const uhd::io_type_t::tid_t &type, + size_t num_channels +){ + return boost::shared_ptr<uhd_multi_usrp_source>( + new uhd_multi_usrp_source_impl(args, type, num_channels) + ); +} diff --git a/gr-uhd/lib/uhd_multi_usrp_source.h b/gr-uhd/lib/uhd_multi_usrp_source.h index b2c4a3ac1..b94e53f01 100644 --- a/gr-uhd/lib/uhd_multi_usrp_source.h +++ b/gr-uhd/lib/uhd_multi_usrp_source.h @@ -129,6 +129,12 @@ public: 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 */ diff --git a/gr-uhd/lib/uhd_single_usrp_sink.cc b/gr-uhd/lib/uhd_single_usrp_sink.cc index cd7d7a618..96c1dbdf4 100644 --- a/gr-uhd/lib/uhd_single_usrp_sink.cc +++ b/gr-uhd/lib/uhd_single_usrp_sink.cc @@ -24,7 +24,7 @@ #include <stdexcept> /*********************************************************************** - * 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)){ @@ -32,7 +32,7 @@ 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: @@ -45,10 +45,6 @@ public: _dev = uhd::usrp::single_usrp::make(args); } - ~uhd_single_usrp_sink_impl(void){ - //NOP - } - void set_subdev_spec(const std::string &spec){ return _dev->set_tx_subdev_spec(spec); } @@ -164,7 +160,7 @@ 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, diff --git a/gr-uhd/lib/uhd_single_usrp_source.cc b/gr-uhd/lib/uhd_single_usrp_source.cc index fc2c453eb..7c3694a99 100644 --- a/gr-uhd/lib/uhd_single_usrp_source.cc +++ b/gr-uhd/lib/uhd_single_usrp_source.cc @@ -26,7 +26,7 @@ #include <boost/format.hpp> /*********************************************************************** - * 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){ @@ -34,7 +34,7 @@ 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: @@ -160,7 +160,7 @@ 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, diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i index d755dfeee..1631a768a 100644 --- a/gr-uhd/swig/uhd_swig.i +++ b/gr-uhd/swig/uhd_swig.i @@ -29,10 +29,13 @@ namespace std { } %{ -#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> %} @@ -44,17 +47,23 @@ namespace std { %include <uhd/types/time_spec.hpp> %include <uhd/types/clock_config.hpp> -GR_SWIG_BLOCK_MAGIC(uhd,mimo_source) -%include <uhd_mimo_source.h> +GR_SWIG_BLOCK_MAGIC(uhd,mimo_source) //deprecated +%include <uhd_mimo_source.h> //deprecated + +GR_SWIG_BLOCK_MAGIC(uhd,mimo_sink) //deprecated +%include <uhd_mimo_sink.h> //deprecated + +GR_SWIG_BLOCK_MAGIC(uhd,simple_source) //deprecated +%include <uhd_simple_source.h> //deprecated -GR_SWIG_BLOCK_MAGIC(uhd,mimo_sink) -%include <uhd_mimo_sink.h> +GR_SWIG_BLOCK_MAGIC(uhd,simple_sink) //deprecated +%include <uhd_simple_sink.h> //deprecated -GR_SWIG_BLOCK_MAGIC(uhd,simple_source) -%include <uhd_simple_source.h> +GR_SWIG_BLOCK_MAGIC(uhd,multi_usrp_source) +%include <uhd_multi_usrp_source.h> -GR_SWIG_BLOCK_MAGIC(uhd,simple_sink) -%include <uhd_simple_sink.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> |