summaryrefslogtreecommitdiff
path: root/gr-uhd/lib
diff options
context:
space:
mode:
Diffstat (limited to 'gr-uhd/lib')
-rw-r--r--gr-uhd/lib/uhd_multi_usrp_sink.cc151
-rw-r--r--gr-uhd/lib/uhd_multi_usrp_sink.h6
-rw-r--r--gr-uhd/lib/uhd_multi_usrp_source.cc154
-rw-r--r--gr-uhd/lib/uhd_multi_usrp_source.h6
-rw-r--r--gr-uhd/lib/uhd_single_usrp_sink.cc10
-rw-r--r--gr-uhd/lib/uhd_single_usrp_source.cc6
6 files changed, 323 insertions, 10 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,