diff options
-rw-r--r-- | gr-uhd/lib/uhd_simple_sink.cc | 161 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_simple_sink.h | 48 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_simple_source.cc | 195 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_simple_source.h | 52 |
4 files changed, 245 insertions, 211 deletions
diff --git a/gr-uhd/lib/uhd_simple_sink.cc b/gr-uhd/lib/uhd_simple_sink.cc index bf2b02d31..889371e91 100644 --- a/gr-uhd/lib/uhd_simple_sink.cc +++ b/gr-uhd/lib/uhd_simple_sink.cc @@ -22,103 +22,118 @@ #include <uhd_simple_sink.h> #include <gr_io_signature.h> -#include <boost/thread.hpp> #include <stdexcept> #include "utils.h" /*********************************************************************** - * Make UHD Sink + * UHD Sink **********************************************************************/ -boost::shared_ptr<uhd_simple_sink> uhd_make_simple_sink( - const std::string &args, - const uhd::io_type_t::tid_t &type -){ - return boost::shared_ptr<uhd_simple_sink>( - new uhd_simple_sink(args, type) - ); +uhd_simple_sink::uhd_simple_sink(gr_io_signature_sptr sig) +:gr_sync_block("uhd sink", sig, gr_make_io_signature(0, 0, 0)){ + /* NOP */ } /*********************************************************************** - * UHD Sink + * UHD Sink Impl **********************************************************************/ -uhd_simple_sink::uhd_simple_sink( - const std::string &args, - const uhd::io_type_t &type -) : gr_sync_block( - "uhd sink", - gr_make_io_signature(1, 1, type.size), - gr_make_io_signature(0, 0, 0) -), _type(type){ - _dev = uhd::usrp::simple_usrp::make(args); -} +class uhd_simple_sink_impl : public uhd_simple_sink{ +public: + uhd_simple_sink_impl( + const std::string &args, + const uhd::io_type_t &type + ) : uhd_simple_sink(gr_make_io_signature(1, 1, type.size)), _type(type) + { + _dev = uhd::usrp::simple_usrp::make(args); + } -uhd_simple_sink::~uhd_simple_sink(void){ - //NOP -} + ~uhd_simple_sink_impl(void){ + //NOP + } -void uhd_simple_sink::set_samp_rate(double rate){ - _dev->set_tx_rate(rate); - do_samp_rate_error_message(rate, get_samp_rate()); -} + void set_samp_rate(double rate){ + _dev->set_tx_rate(rate); + do_samp_rate_error_message(rate, get_samp_rate()); + } -double uhd_simple_sink::get_samp_rate(void){ - return _dev->get_tx_rate(); -} + double get_samp_rate(void){ + return _dev->get_tx_rate(); + } -uhd::tune_result_t uhd_simple_sink::set_center_freq(double freq){ - return _dev->set_tx_freq(freq); -} + uhd::tune_result_t set_center_freq(double freq){ + return _dev->set_tx_freq(freq); + } -uhd::freq_range_t uhd_simple_sink::get_freq_range(void){ - return _dev->get_tx_freq_range(); -} + uhd::freq_range_t get_freq_range(void){ + return _dev->get_tx_freq_range(); + } -void uhd_simple_sink::set_gain(float gain){ - return _dev->set_tx_gain(gain); -} + void set_gain(float gain){ + return _dev->set_tx_gain(gain); + } -float uhd_simple_sink::get_gain(void){ - return _dev->get_tx_gain(); -} + float get_gain(void){ + return _dev->get_tx_gain(); + } -uhd::gain_range_t uhd_simple_sink::get_gain_range(void){ - return _dev->get_tx_gain_range(); -} + uhd::gain_range_t get_gain_range(void){ + return _dev->get_tx_gain_range(); + } -void uhd_simple_sink::set_antenna(const std::string &ant){ - return _dev->set_tx_antenna(ant); -} + void set_antenna(const std::string &ant){ + return _dev->set_tx_antenna(ant); + } -std::string uhd_simple_sink::get_antenna(void){ - return _dev->get_tx_antenna(); -} + std::string get_antenna(void){ + return _dev->get_tx_antenna(); + } -std::vector<std::string> uhd_simple_sink::get_antennas(void){ - return _dev->get_tx_antennas(); -} + std::vector<std::string> get_antennas(void){ + return _dev->get_tx_antennas(); + } /*********************************************************************** * Work **********************************************************************/ -int uhd_simple_sink::work( - int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items -){ - size_t total_items_sent = 0; - uhd::tx_metadata_t metadata; - metadata.start_of_burst = true; - - //call until the input items are all sent - while(total_items_sent < size_t(noutput_items)){ - size_t items_sent = _dev->get_device()->send( - boost::asio::buffer( - (uint8_t *)input_items[0]+(total_items_sent*_type.size), - (noutput_items-total_items_sent)*_type.size - ), metadata, _type - ); - total_items_sent += items_sent; + int work( + int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items + ){ + size_t total_items_sent = 0; + uhd::tx_metadata_t metadata; + metadata.start_of_burst = true; + + //call until the input items are all sent + while(total_items_sent < size_t(noutput_items)){ + size_t items_sent = _dev->get_device()->send( + boost::asio::buffer( + (uint8_t *)input_items[0]+(total_items_sent*_type.size), + (noutput_items-total_items_sent)*_type.size + ), metadata, _type + ); + total_items_sent += items_sent; + } + + return noutput_items; } - return noutput_items; + uhd::usrp::simple_usrp::sptr get_device(void){ + return _dev; + } + +protected: + uhd::usrp::simple_usrp::sptr _dev; + const uhd::io_type_t _type; +}; + +/*********************************************************************** + * Make UHD Sink + **********************************************************************/ +boost::shared_ptr<uhd_simple_sink> uhd_make_simple_sink( + const std::string &args, + const uhd::io_type_t::tid_t &type +){ + return boost::shared_ptr<uhd_simple_sink>( + new uhd_simple_sink_impl(args, type) + ); } diff --git a/gr-uhd/lib/uhd_simple_sink.h b/gr-uhd/lib/uhd_simple_sink.h index 0229e38ca..9ecf51aea 100644 --- a/gr-uhd/lib/uhd_simple_sink.h +++ b/gr-uhd/lib/uhd_simple_sink.h @@ -28,85 +28,87 @@ class uhd_simple_sink; -boost::shared_ptr<uhd_simple_sink> -uhd_make_simple_sink(const std::string &args, const uhd::io_type_t::tid_t &type); +boost::shared_ptr<uhd_simple_sink> uhd_make_simple_sink( + const std::string &args, + const uhd::io_type_t::tid_t &type +); class uhd_simple_sink : public gr_sync_block{ public: - uhd_simple_sink(const std::string &args, const uhd::io_type_t &type); - ~uhd_simple_sink(void); + + /*! + * Set the IO signature for this block. + * \param sig the input signature + */ + uhd_simple_sink(gr_io_signature_sptr sig); /*! * Set the sample rate for the usrp device. * \param rate a new rate in Sps */ - void set_samp_rate(double rate); + 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 */ - double get_samp_rate(void); + virtual double get_samp_rate(void) = 0; /*! * Tune the usrp device to the desired center frequency. * \param freq the desired frequency in Hz * \return a tune result with the actual frequencies */ - uhd::tune_result_t set_center_freq(double freq); + virtual uhd::tune_result_t set_center_freq(double freq) = 0; /*! * Get the tunable frequency range. * \return the frequency range in Hz */ - uhd::freq_range_t get_freq_range(void); + virtual uhd::freq_range_t get_freq_range(void) = 0; /*! * Set the gain for the dboard. * \param gain the gain in dB */ - void set_gain(float gain); + virtual void set_gain(float gain) = 0; /*! * Get the actual dboard gain setting. * \return the actual gain in dB */ - float get_gain(void); + virtual float get_gain(void) = 0; /*! * Get the settable gain range. * \return the gain range in dB */ - uhd::gain_range_t get_gain_range(void); + virtual uhd::gain_range_t get_gain_range(void) = 0; /*! * Set the antenna to use. * \param ant the antenna string */ - void set_antenna(const std::string &ant); + virtual void set_antenna(const std::string &ant) = 0; /*! * Get the antenna in use. * \return the antenna string */ - std::string get_antenna(void); + virtual std::string get_antenna(void) = 0; /*! * Get a list of possible antennas. * \return a vector of antenna strings */ - std::vector<std::string> get_antennas(void); + virtual std::vector<std::string> get_antennas(void) = 0; - int work( - int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items - ); - -protected: - uhd::usrp::simple_usrp::sptr _dev; - const uhd::io_type_t _type; + /*! + * Get access to the underlying uhd device object. + * \return the simple usrp device object + */ + virtual uhd::usrp::simple_usrp::sptr get_device(void) = 0; }; #endif /* INCLUDED_UHD_SIMPLE_SINK_H */ diff --git a/gr-uhd/lib/uhd_simple_source.cc b/gr-uhd/lib/uhd_simple_source.cc index e63fe9647..8c3fdeef8 100644 --- a/gr-uhd/lib/uhd_simple_source.cc +++ b/gr-uhd/lib/uhd_simple_source.cc @@ -26,115 +26,132 @@ #include "utils.h" /*********************************************************************** - * Make UHD Source + * UHD Source **********************************************************************/ -boost::shared_ptr<uhd_simple_source> uhd_make_simple_source( - const std::string &args, - const uhd::io_type_t::tid_t &type -){ - return boost::shared_ptr<uhd_simple_source>( - new uhd_simple_source(args, type) - ); +uhd_simple_source::uhd_simple_source(gr_io_signature_sptr sig) +:gr_sync_block("uhd source", gr_make_io_signature(0, 0, 0), sig){ + /* NOP */ } /*********************************************************************** - * UHD Source + * UHD Source Impl **********************************************************************/ -uhd_simple_source::uhd_simple_source( - const std::string &args, - const uhd::io_type_t &type -) : gr_sync_block( - "uhd source", - gr_make_io_signature(0, 0, 0), - gr_make_io_signature(1, 1, type.size) -), _type(type){ - _dev = uhd::usrp::simple_usrp::make(args); - - set_streaming(false); -} - -uhd_simple_source::~uhd_simple_source(void){ - set_streaming(false); -} +class uhd_simple_source_impl : public uhd_simple_source{ +public: + uhd_simple_source_impl( + const std::string &args, + const uhd::io_type_t &type + ) : uhd_simple_source(gr_make_io_signature(1, 1, type.size)), _type(type) + { + _dev = uhd::usrp::simple_usrp::make(args); + set_streaming(false); + } -void uhd_simple_source::set_streaming(bool enb){ - if (enb) - _dev->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); - else - _dev->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); - _is_streaming = enb; -} + ~uhd_simple_source_impl(void){ + set_streaming(false); + } -void uhd_simple_source::set_samp_rate(double rate){ - _dev->set_rx_rate(rate); - do_samp_rate_error_message(rate, get_samp_rate()); -} + void set_samp_rate(double rate){ + _dev->set_rx_rate(rate); + do_samp_rate_error_message(rate, get_samp_rate()); + } -double uhd_simple_source::get_samp_rate(void){ - return _dev->get_rx_rate(); -} + double get_samp_rate(void){ + return _dev->get_rx_rate(); + } -uhd::tune_result_t uhd_simple_source::set_center_freq(double freq){ - return _dev->set_rx_freq(freq); -} + uhd::tune_result_t set_center_freq(double freq){ + return _dev->set_rx_freq(freq); + } -uhd::freq_range_t uhd_simple_source::get_freq_range(void){ - return _dev->get_rx_freq_range(); -} + uhd::freq_range_t get_freq_range(void){ + return _dev->get_rx_freq_range(); + } -void uhd_simple_source::set_gain(float gain){ - return _dev->set_rx_gain(gain); -} + void set_gain(float gain){ + return _dev->set_rx_gain(gain); + } -float uhd_simple_source::get_gain(void){ - return _dev->get_rx_gain(); -} + float get_gain(void){ + return _dev->get_rx_gain(); + } -uhd::gain_range_t uhd_simple_source::get_gain_range(void){ - return _dev->get_rx_gain_range(); -} + uhd::gain_range_t get_gain_range(void){ + return _dev->get_rx_gain_range(); + } -void uhd_simple_source::set_antenna(const std::string &ant){ - return _dev->set_rx_antenna(ant); -} + void set_antenna(const std::string &ant){ + return _dev->set_rx_antenna(ant); + } -std::string uhd_simple_source::get_antenna(void){ - return _dev->get_rx_antenna(); -} + std::string get_antenna(void){ + return _dev->get_rx_antenna(); + } -std::vector<std::string> uhd_simple_source::get_antennas(void){ - return _dev->get_rx_antennas(); -} + std::vector<std::string> get_antennas(void){ + return _dev->get_rx_antennas(); + } /*********************************************************************** * Work **********************************************************************/ -int uhd_simple_source::work( - int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items -){ - //conditionally start streaming in the work call - //this prevents streaming before the runtime is ready - if (not _is_streaming) set_streaming(true); - - size_t total_items_read = 0; - uhd::rx_metadata_t metadata; - - //call until the output items are all filled - //or an exit condition below is encountered - while(total_items_read < size_t(noutput_items)){ - size_t items_read = _dev->get_device()->recv( - boost::asio::buffer( - (uint8_t *)output_items[0]+(total_items_read*_type.size), - (noutput_items-total_items_read)*_type.size - ), metadata, _type - ); - total_items_read += items_read; - - //we timed out, get out of here - if (items_read == 0) break; + int work( + int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items + ){ + //conditionally start streaming in the work call + //this prevents streaming before the runtime is ready + if (not _is_streaming) set_streaming(true); + + size_t total_items_read = 0; + uhd::rx_metadata_t metadata; + + //call until the output items are all filled + //or an exit condition below is encountered + while(total_items_read < size_t(noutput_items)){ + size_t items_read = _dev->get_device()->recv( + boost::asio::buffer( + (uint8_t *)output_items[0]+(total_items_read*_type.size), + (noutput_items-total_items_read)*_type.size + ), metadata, _type + ); + total_items_read += items_read; + + //we timed out, get out of here + if (items_read == 0) break; + } + + return total_items_read; + } + + uhd::usrp::simple_usrp::sptr get_device(void){ + return _dev; } - return total_items_read; +private: + uhd::usrp::simple_usrp::sptr _dev; + const uhd::io_type_t _type; + bool _is_streaming; + + void set_streaming(bool enb){ + if (enb) + _dev->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); + else + _dev->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); + _is_streaming = enb; + } +}; + + +/*********************************************************************** + * Make UHD Source + **********************************************************************/ +boost::shared_ptr<uhd_simple_source> uhd_make_simple_source( + const std::string &args, + const uhd::io_type_t::tid_t &type +){ + return boost::shared_ptr<uhd_simple_source>( + new uhd_simple_source_impl(args, type) + ); } diff --git a/gr-uhd/lib/uhd_simple_source.h b/gr-uhd/lib/uhd_simple_source.h index 7d286f09c..480bb4d3f 100644 --- a/gr-uhd/lib/uhd_simple_source.h +++ b/gr-uhd/lib/uhd_simple_source.h @@ -28,87 +28,87 @@ class uhd_simple_source; -boost::shared_ptr<uhd_simple_source> -uhd_make_simple_source(const std::string &args, const uhd::io_type_t::tid_t &type); +boost::shared_ptr<uhd_simple_source> uhd_make_simple_source( + const std::string &args, + const uhd::io_type_t::tid_t &type +); class uhd_simple_source : public gr_sync_block{ public: - uhd_simple_source(const std::string &args, const uhd::io_type_t &type); - ~uhd_simple_source(void); + + /*! + * Set the IO signature for this block. + * \param sig the output signature + */ + uhd_simple_source(gr_io_signature_sptr sig); /*! * Set the sample rate for the usrp device. * \param rate a new rate in Sps */ - void set_samp_rate(double rate); + 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 */ - double get_samp_rate(void); + virtual double get_samp_rate(void) = 0; /*! * Tune the usrp device to the desired center frequency. * \param freq the desired frequency in Hz * \return a tune result with the actual frequencies */ - uhd::tune_result_t set_center_freq(double freq); + virtual uhd::tune_result_t set_center_freq(double freq) = 0; /*! * Get the tunable frequency range. * \return the frequency range in Hz */ - uhd::freq_range_t get_freq_range(void); + virtual uhd::freq_range_t get_freq_range(void) = 0; /*! * Set the gain for the dboard. * \param gain the gain in dB */ - void set_gain(float gain); + virtual void set_gain(float gain) = 0; /*! * Get the actual dboard gain setting. * \return the actual gain in dB */ - float get_gain(void); + virtual float get_gain(void) = 0; /*! * Get the settable gain range. * \return the gain range in dB */ - uhd::gain_range_t get_gain_range(void); + virtual uhd::gain_range_t get_gain_range(void) = 0; /*! * Set the antenna to use. * \param ant the antenna string */ - void set_antenna(const std::string &ant); + virtual void set_antenna(const std::string &ant) = 0; /*! * Get the antenna in use. * \return the antenna string */ - std::string get_antenna(void); + virtual std::string get_antenna(void) = 0; /*! * Get a list of possible antennas. * \return a vector of antenna strings */ - std::vector<std::string> get_antennas(void); - - int work( - int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items - ); - -protected: - uhd::usrp::simple_usrp::sptr _dev; - const uhd::io_type_t _type; - bool _is_streaming; - void set_streaming(bool enb); + virtual std::vector<std::string> get_antennas(void) = 0; + + /*! + * Get access to the underlying uhd device object. + * \return the simple usrp device object + */ + virtual uhd::usrp::simple_usrp::sptr get_device(void) = 0; }; #endif /* INCLUDED_UHD_SIMPLE_SOURCE_H */ |