aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-02-22 18:47:05 -0800
committerJosh Blum <josh@joshknows.com>2010-02-22 18:47:05 -0800
commit6b7c53985c09a8d74e9bfd9c6b37948d458b2c44 (patch)
treeb2a5fda7c44229ba210e95424e813b63c2545f85 /host/lib
parent5200303517f4941fa60e2db713411f36116634a7 (diff)
downloaduhd-6b7c53985c09a8d74e9bfd9c6b37948d458b2c44.tar.gz
uhd-6b7c53985c09a8d74e9bfd9c6b37948d458b2c44.tar.bz2
uhd-6b7c53985c09a8d74e9bfd9c6b37948d458b2c44.zip
Work on the io interface for a device (and some implementation work in usrp2).
Modified the udp transport to reflect some of these changes. Got the fw compiling again, and it will not set data to true for small payloads (configuration ones).
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