diff options
author | Josh Blum <josh@joshknows.com> | 2010-04-27 16:07:34 -0700 |
---|---|---|
committer | Josh Blum <josh@joshknows.com> | 2010-04-27 16:07:34 -0700 |
commit | 1e4bf239c1f09a0180585de62746922bcd34b639 (patch) | |
tree | b8ef932de6cb73b3bb5c3811f18c1545b14d27f2 /gr-uhd/lib | |
parent | 999bba14d657a11fa9bfc1b9587e1341e2f28e07 (diff) |
Added call to get access to the underlying uhd simple usrp object.
Made the simple uhd source and sink into mostly virtual classes
with the implementation within the cc files.
Diffstat (limited to 'gr-uhd/lib')
-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 bf2b02d312..889371e910 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 0229e38cab..9ecf51aea0 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 e63fe9647a..8c3fdeef81 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 7d286f09ce..480bb4d3f2 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 */ |