From 6b7c53985c09a8d74e9bfd9c6b37948d458b2c44 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 22 Feb 2010 18:47:05 -0800
Subject: 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).

---
 host/include/uhd/CMakeLists.txt    |  1 +
 host/include/uhd/device.hpp        | 33 ++++++++++++++++++++++----
 host/include/uhd/metadata.hpp      | 47 ++++++++++++++++++++++++++++++++++++++
 host/include/uhd/transport/udp.hpp | 17 ++++++++++++--
 4 files changed, 91 insertions(+), 7 deletions(-)
 create mode 100644 host/include/uhd/metadata.hpp

(limited to 'host/include')

diff --git a/host/include/uhd/CMakeLists.txt b/host/include/uhd/CMakeLists.txt
index 006c54f22..e87f74291 100644
--- a/host/include/uhd/CMakeLists.txt
+++ b/host/include/uhd/CMakeLists.txt
@@ -24,6 +24,7 @@ INSTALL(FILES
     device_addr.hpp
     dict.hpp
     gain_handler.hpp
+    metadata.hpp
     props.hpp
     shared_iovec.hpp
     time_spec.hpp
diff --git a/host/include/uhd/device.hpp b/host/include/uhd/device.hpp
index dfbfbd7c0..da58d4f85 100644
--- a/host/include/uhd/device.hpp
+++ b/host/include/uhd/device.hpp
@@ -20,13 +20,12 @@
 
 #include <uhd/device_addr.hpp>
 #include <uhd/props.hpp>
+#include <uhd/metadata.hpp>
 #include <uhd/wax.hpp>
 #include <boost/utility.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/function.hpp>
 #include <boost/asio/buffer.hpp>
-#include <uhd/shared_iovec.hpp>
-#include <vector>
 
 namespace uhd{
 
@@ -72,9 +71,33 @@ public:
      */
     device_addr_t get_device_addr(void);
 
-    //the io interface
-    virtual void send_raw(const std::vector<boost::asio::const_buffer> &) = 0;
-    virtual uhd::shared_iovec recv_raw(void) = 0;
+    /*!
+     * Send a buffer containing IF data with its metadata.
+     *
+     * \param buff a buffer pointing to some read-only memory
+     * \param metadata data describing the buffer's contents
+     * \param the type of data loaded in the buffer (32fc, 16sc)
+     * \return the number of bytes sent
+     */
+    virtual size_t send(
+        const boost::asio::const_buffer &buff,
+        const metadata_t &metadata,
+        const std::string &type = "32fc"
+    ) = 0;
+
+    /*!
+     * Receive a buffer containing IF data and its metadata.
+     *
+     * \param buff the buffer to fill with IF data
+     * \param metadata data to fill describing the buffer
+     * \param the type of data to fill into the buffer (32fc, 16sc)
+     * \return the number of bytes received
+     */
+    virtual size_t recv(
+        const boost::asio::mutable_buffer &buff,
+        metadata_t &metadata,
+        const std::string &type = "32fc"
+    ) = 0;
 };
 
 } //namespace uhd
diff --git a/host/include/uhd/metadata.hpp b/host/include/uhd/metadata.hpp
new file mode 100644
index 000000000..43b91d1b0
--- /dev/null
+++ b/host/include/uhd/metadata.hpp
@@ -0,0 +1,47 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+
+#ifndef INCLUDED_UHD_METADATA_HPP
+#define INCLUDED_UHD_METADATA_HPP
+
+#include <uhd/time_spec.hpp>
+
+namespace uhd{
+
+/*!
+ * Metadata structure for describing the IF data.
+ * Includes stream ID, time specification, and burst flags.
+ * The receive routines will convert IF data headers into metadata.
+ * The send routines will convert the metadata to IF data headers.
+ */
+struct metadata_t{
+    uint32_t stream_id;
+    time_spec_t time_spec;
+    bool start_of_burst;
+    bool end_of_burst;
+
+    metadata_t(void){
+        stream_id = 0;
+        time_spec = time_spec_t();
+        start_of_burst = false;
+        end_of_burst = false;
+    }
+};
+
+} //namespace uhd
+
+#endif /* INCLUDED_UHD_METADATA_HPP */
diff --git a/host/include/uhd/transport/udp.hpp b/host/include/uhd/transport/udp.hpp
index 554234b43..07d84e62a 100644
--- a/host/include/uhd/transport/udp.hpp
+++ b/host/include/uhd/transport/udp.hpp
@@ -41,18 +41,31 @@ public:
 
     /*!
      * Send a vector of buffer (like send_msg).
+     * Blocks until the data is sent.
      * \param buffs a vector of asio buffers
+     * \return the number of bytes sent
      */
-    virtual void send(const std::vector<boost::asio::const_buffer> &buffs) = 0;
+    virtual size_t send(const std::vector<boost::asio::const_buffer> &buffs) = 0;
 
     /*!
      * Send a single buffer.
+     * Blocks until the data is sent.
      * \param buff single asio buffer
+     * \return the number of bytes sent
      */
-    virtual void send(const boost::asio::const_buffer &buff) = 0;
+    virtual size_t send(const boost::asio::const_buffer &buff) = 0;
+
+    /*!
+     * Receive a buffer. Write into the memory provided.
+     * Returns empty when data is not available.
+     * \param buff a mutable buffer to receive into
+     * \return the number of bytes received.
+     */
+    virtual size_t recv(const boost::asio::mutable_buffer &buff) = 0;
 
     /*!
      * Receive a buffer. The memory is managed internally.
+     * Returns zero when data is not available.
      * Calling recv will invalidate the buffer of the previous recv.
      * \return a shared iovec with allocated memory
      */
-- 
cgit v1.2.3