summaryrefslogtreecommitdiffstats
path: root/host/lib
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib')
-rw-r--r--host/lib/transport/udp.cpp20
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp74
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.hpp4
3 files changed, 84 insertions, 14 deletions
diff --git a/host/lib/transport/udp.cpp b/host/lib/transport/udp.cpp
index af60760a5..fca4dd7d6 100644
--- a/host/lib/transport/udp.cpp
+++ b/host/lib/transport/udp.cpp
@@ -17,7 +17,6 @@
#include <uhd/transport/udp.hpp>
#include <boost/format.hpp>
-#include <boost/assign/list_of.hpp>
#include <iostream>
/***********************************************************************
@@ -30,8 +29,9 @@ public:
~udp_impl(void);
//send/recv
- void send(const std::vector<boost::asio::const_buffer> &buffs);
- void send(const boost::asio::const_buffer &buff);
+ size_t send(const std::vector<boost::asio::const_buffer> &buffs);
+ size_t send(const boost::asio::const_buffer &buff);
+ size_t recv(const boost::asio::mutable_buffer &buff);
uhd::shared_iovec recv(void);
private:
@@ -79,13 +79,17 @@ udp_impl::~udp_impl(void){
delete _socket;
}
-void udp_impl::send(const std::vector<boost::asio::const_buffer> &buffs){
- _socket->send_to(buffs, _receiver_endpoint);
+size_t udp_impl::send(const std::vector<boost::asio::const_buffer> &buffs){
+ return _socket->send_to(buffs, _receiver_endpoint);
}
-void udp_impl::send(const boost::asio::const_buffer &buff){
- std::vector<boost::asio::const_buffer> buffs = boost::assign::list_of(buff);
- send(buffs);
+size_t udp_impl::send(const boost::asio::const_buffer &buff){
+ return _socket->send_to(boost::asio::buffer(buff), _receiver_endpoint);
+}
+
+size_t udp_impl::recv(const boost::asio::mutable_buffer &buff){
+ if (_socket->available() == 0) return 0;
+ return _socket->receive_from(boost::asio::buffer(buff), _sender_endpoint);
}
uhd::shared_iovec udp_impl::recv(void){
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index f44964394..47bf06aff 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -130,6 +130,10 @@ usrp2_impl::usrp2_impl(
//init the tx and rx dboards (do last)
dboard_init();
+ //send a small data packet so the usrp2 knows the udp source port
+ uint32_t zero_data = 0;
+ _data_transport->send(boost::asio::buffer(&zero_data, sizeof(zero_data)));
+
}
usrp2_impl::~usrp2_impl(void){
@@ -204,10 +208,72 @@ void usrp2_impl::set(const wax::obj &, const wax::obj &){
/***********************************************************************
* IO Interface
**********************************************************************/
-void usrp2_impl::send_raw(const std::vector<boost::asio::const_buffer> &){
- return;
+static const float float_scale_factor = pow(2.0, 15);
+
+size_t usrp2_impl::send(
+ const boost::asio::const_buffer &buff,
+ const uhd::metadata_t &metadata,
+ const std::string &type
+){
+ if (type == "fc32"){
+ //extract the buffer elements
+ const float *float_buff = boost::asio::buffer_cast<const float*>(buff);
+ const size_t buff_len = boost::asio::buffer_size(buff)/sizeof(float);
+
+ //convert floats into the shorts buffer
+ int16_t *shorts_buff = new int16_t[buff_len];
+ for (size_t i = 0; i < buff_len; i++){
+ shorts_buff[i] = float_buff[i]*float_scale_factor;
+ }
+
+ //send from a buffer of shorts
+ size_t bytes_sent = send(
+ boost::asio::buffer(shorts_buff, buff_len*sizeof(int16_t)),
+ metadata, "sc16"
+ );
+
+ //cleanup
+ delete [] shorts_buff;
+ return bytes_sent;
+ }
+
+ if (type == "sc16"){
+ throw std::runtime_error("not implemented");
+ }
+
+ throw std::runtime_error(str(boost::format("usrp2 send: cannot handle type \"%s\"") % type));
}
-uhd::shared_iovec usrp2_impl::recv_raw(void){
- throw std::runtime_error("not implemented");
+size_t usrp2_impl::recv(
+ const boost::asio::mutable_buffer &buff,
+ uhd::metadata_t &metadata,
+ const std::string &type
+){
+ if (type == "fc32"){
+ //extract the buffer elements
+ float *float_buff = boost::asio::buffer_cast<float*>(buff);
+ const size_t buff_len = boost::asio::buffer_size(buff)/sizeof(float);
+
+ //receive into a buffer of shorts
+ int16_t *shorts_buff = new int16_t[buff_len];
+ size_t bytes_received = recv(
+ boost::asio::buffer(shorts_buff, buff_len*sizeof(int16_t)),
+ metadata, "sc16"
+ );
+
+ //convert floats into the shorts buffer
+ for (size_t i = 0; i < bytes_received/sizeof(int16_t); i++){
+ float_buff[i] = shorts_buff[i]/float_scale_factor;
+ }
+
+ //cleanup
+ delete [] shorts_buff;
+ return bytes_received;
+ }
+
+ if (type == "sc16"){
+ throw std::runtime_error("not implemented");
+ }
+
+ throw std::runtime_error(str(boost::format("usrp2 recv: cannot handle type \"%s\"") % type));
}
diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp
index 2545efd58..2476bcf1d 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.hpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.hpp
@@ -98,8 +98,8 @@ public:
double get_master_clock_freq(void);
//the io interface
- void send_raw(const std::vector<boost::asio::const_buffer> &);
- uhd::shared_iovec recv_raw(void);
+ size_t send(const boost::asio::const_buffer &, const uhd::metadata_t &, const std::string &);
+ size_t recv(const boost::asio::mutable_buffer &, uhd::metadata_t &, const std::string &);
private:
//udp transports for control and data