summaryrefslogtreecommitdiff
path: root/gr-uhd/lib/uhd_simple_source.cc
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-04-27 16:07:34 -0700
committerJosh Blum <josh@joshknows.com>2010-04-27 16:07:34 -0700
commit1e4bf239c1f09a0180585de62746922bcd34b639 (patch)
treeb8ef932de6cb73b3bb5c3811f18c1545b14d27f2 /gr-uhd/lib/uhd_simple_source.cc
parent999bba14d657a11fa9bfc1b9587e1341e2f28e07 (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/uhd_simple_source.cc')
-rw-r--r--gr-uhd/lib/uhd_simple_source.cc195
1 files changed, 106 insertions, 89 deletions
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)
+ );
}