diff options
-rw-r--r-- | host/include/uhd/device.hpp | 21 | ||||
-rw-r--r-- | host/include/uhd/metadata.hpp | 31 | ||||
-rw-r--r-- | host/include/uhd/transport/vrt.hpp | 14 | ||||
-rw-r--r-- | host/lib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | host/lib/metadata.cpp | 37 | ||||
-rw-r--r-- | host/lib/transport/vrt.cpp | 16 | ||||
-rw-r--r-- | host/lib/usrp/usrp2/io_impl.cpp | 20 | ||||
-rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.hpp | 6 | ||||
-rw-r--r-- | host/test/vrt_test.cpp | 12 |
9 files changed, 114 insertions, 44 deletions
diff --git a/host/include/uhd/device.hpp b/host/include/uhd/device.hpp index ba5337d33..1a52867c9 100644 --- a/host/include/uhd/device.hpp +++ b/host/include/uhd/device.hpp @@ -70,6 +70,13 @@ public: /*! * Send a buffer containing IF data with its metadata. * + * Send handles fragmentation as follows: + * If the buffer has more samples than the maximum supported, + * the send method will send the maximum number of samples + * as supported by the transport and return the number sent. + * It is up to the caller to call send again on the un-sent + * portions of the buffer, until the buffer is exhausted. + * * \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) @@ -77,13 +84,23 @@ public: */ virtual size_t send( const boost::asio::const_buffer &buff, - const metadata_t &metadata, + const tx_metadata_t &metadata, const std::string &type = "32fc" ) = 0; /*! * Receive a buffer containing IF data and its metadata. * + * Receive handles fragmentation as follows: + * If the buffer has insufficient space to hold all samples + * that were received in a single packet over-the-wire, + * then the buffer will be completely filled and the implementation + * will hold a pointer into the remaining portion of the packet. + * Subsequent calls will load from the remainder of the packet, + * and will flag the metadata to show that this is a fragment. + * The next call to receive, after the remainder becomes exahausted, + * will perform an over-the-wire receive as usual. + * * \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) @@ -91,7 +108,7 @@ public: */ virtual size_t recv( const boost::asio::mutable_buffer &buff, - metadata_t &metadata, + rx_metadata_t &metadata, const std::string &type = "32fc" ) = 0; }; diff --git a/host/include/uhd/metadata.hpp b/host/include/uhd/metadata.hpp index 70842e7bc..0588ef0ed 100644 --- a/host/include/uhd/metadata.hpp +++ b/host/include/uhd/metadata.hpp @@ -23,12 +23,27 @@ namespace uhd{ /*! - * Metadata structure for describing the IF data. - * Includes stream ID, time specification, and burst flags. + * RX metadata structure for describing sent IF data. + * Includes stream ID, time specification, and fragmentation flags. * The receive routines will convert IF data headers into metadata. + */ +struct rx_metadata_t{ + uint32_t stream_id; + bool has_stream_id; + time_spec_t time_spec; + bool has_time_spec; + bool is_fragment; + + //default constructor + rx_metadata_t(void); +}; + +/*! + * TX metadata structure for describing received IF data. + * Includes stream ID, time specification, and burst flags. * The send routines will convert the metadata to IF data headers. */ -struct metadata_t{ +struct tx_metadata_t{ uint32_t stream_id; bool has_stream_id; time_spec_t time_spec; @@ -36,14 +51,8 @@ struct metadata_t{ bool start_of_burst; bool end_of_burst; - metadata_t(void){ - stream_id = 0; - has_stream_id = false; - time_spec = time_spec_t(); - has_time_spec = false; - start_of_burst = false; - end_of_burst = false; - } + //default constructor + tx_metadata_t(void); }; } //namespace uhd diff --git a/host/include/uhd/transport/vrt.hpp b/host/include/uhd/transport/vrt.hpp index 2fb90a497..1700d2785 100644 --- a/host/include/uhd/transport/vrt.hpp +++ b/host/include/uhd/transport/vrt.hpp @@ -37,12 +37,12 @@ namespace vrt{ * \param packet_count the packet count sequence number */ void pack( - const metadata_t &metadata, //input - uint32_t *header_buff, //output - size_t &num_header_words32, //output - size_t num_payload_words32, //input - size_t &num_packet_words32, //output - size_t packet_count //input + const tx_metadata_t &metadata, //input + uint32_t *header_buff, //output + size_t &num_header_words32, //output + size_t num_payload_words32, //input + size_t &num_packet_words32, //output + size_t packet_count //input ); /*! @@ -55,7 +55,7 @@ namespace vrt{ * \param packet_count the packet count sequence number */ void unpack( - metadata_t &metadata, //output + rx_metadata_t &metadata, //output const uint32_t *header_buff, //input size_t &num_header_words32, //output size_t &num_payload_words32, //output diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt index 390349906..b1daf22d1 100644 --- a/host/lib/CMakeLists.txt +++ b/host/lib/CMakeLists.txt @@ -22,6 +22,7 @@ SET(libuhd_sources device.cpp device_addr.cpp gain_handler.cpp + metadata.cpp wax.cpp transport/udp_simple.cpp transport/vrt.cpp diff --git a/host/lib/metadata.cpp b/host/lib/metadata.cpp new file mode 100644 index 000000000..40fdb7c73 --- /dev/null +++ b/host/lib/metadata.cpp @@ -0,0 +1,37 @@ +// +// 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/>. +// + +#include <uhd/metadata.hpp> + +using namespace uhd; + +rx_metadata_t::rx_metadata_t(void){ + stream_id = 0; + has_stream_id = false; + time_spec = time_spec_t(); + has_time_spec = false; + is_fragment = false; +} + +tx_metadata_t::tx_metadata_t(void){ + stream_id = 0; + has_stream_id = false; + time_spec = time_spec_t(); + has_time_spec = false; + start_of_burst = false; + end_of_burst = false; +} diff --git a/host/lib/transport/vrt.cpp b/host/lib/transport/vrt.cpp index 19bfc1d19..5029df217 100644 --- a/host/lib/transport/vrt.cpp +++ b/host/lib/transport/vrt.cpp @@ -22,12 +22,12 @@ using namespace uhd::transport; void vrt::pack( - const metadata_t &metadata, //input - uint32_t *header_buff, //output - size_t &num_header_words32, //output - size_t num_payload_words32, //input - size_t &num_packet_words32, //output - size_t packet_count //input + const tx_metadata_t &metadata, //input + uint32_t *header_buff, //output + size_t &num_header_words32, //output + size_t num_payload_words32, //input + size_t &num_packet_words32, //output + size_t packet_count //input ){ uint32_t vrt_hdr_flags = 0; num_header_words32 = 1; @@ -58,7 +58,7 @@ void vrt::pack( } void vrt::unpack( - metadata_t &metadata, //output + rx_metadata_t &metadata, //output const uint32_t *header_buff, //input size_t &num_header_words32, //output size_t &num_payload_words32, //output @@ -66,7 +66,7 @@ void vrt::unpack( size_t &packet_count //output ){ //clear the metadata - metadata = metadata_t(); + metadata = rx_metadata_t(); //extract vrt header uint32_t vrt_hdr_word = ntohl(header_buff[0]); diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp index 642b6b08b..5529cfe57 100644 --- a/host/lib/usrp/usrp2/io_impl.cpp +++ b/host/lib/usrp/usrp2/io_impl.cpp @@ -119,7 +119,7 @@ static inline void usrp2_items_to_host_items( /*********************************************************************** * Receive Raw Data **********************************************************************/ -void usrp2_impl::recv_raw(uhd::metadata_t &metadata){ +void usrp2_impl::recv_raw(rx_metadata_t &metadata){ //do a receive _rx_smart_buff = _data_transport->recv(); @@ -161,8 +161,8 @@ void usrp2_impl::recv_raw(uhd::metadata_t &metadata){ * Send Data **********************************************************************/ size_t usrp2_impl::send( - const boost::asio::const_buffer &buff, - const uhd::metadata_t &metadata, + const asio::const_buffer &buff, + const tx_metadata_t &metadata, const std::string &type ){ uint32_t tx_mem[_mtu/sizeof(uint32_t)]; @@ -210,13 +210,19 @@ size_t usrp2_impl::send( * Receive Data **********************************************************************/ size_t usrp2_impl::recv( - const boost::asio::mutable_buffer &buff, - uhd::metadata_t &metadata, + const asio::mutable_buffer &buff, + rx_metadata_t &metadata, const std::string &type ){ //perform a receive if no rx data is waiting to be copied - if (asio::buffer_size(_rx_copy_buff) == 0) recv_raw(metadata); - //TODO otherwise flag the metadata to show that is is a fragment + if (asio::buffer_size(_rx_copy_buff) == 0){ + recv_raw(metadata); + } + //otherwise flag the metadata to show that is is a fragment + else{ + metadata = rx_metadata_t(); + metadata.is_fragment = true; + } //extract the number of samples available to copy //and a pointer into the usrp2 received items memory diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp index 083ad7096..f4e6054bd 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.hpp +++ b/host/lib/usrp/usrp2/usrp2_impl.hpp @@ -100,12 +100,12 @@ public: double get_master_clock_freq(void); //the io interface - 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 &); + size_t send(const boost::asio::const_buffer &, const uhd::tx_metadata_t &, const std::string &); + size_t recv(const boost::asio::mutable_buffer &, uhd::rx_metadata_t &, const std::string &); private: //the raw io interface (samples are in the usrp2 native format) - void recv_raw(uhd::metadata_t &); + void recv_raw(uhd::rx_metadata_t &); uhd::dict<uint32_t, size_t> _tx_stream_id_to_packet_seq; uhd::dict<uint32_t, size_t> _rx_stream_id_to_packet_seq; static const size_t _mtu = 1500; //FIXME we have no idea diff --git a/host/test/vrt_test.cpp b/host/test/vrt_test.cpp index a4fad78fc..d80908c74 100644 --- a/host/test/vrt_test.cpp +++ b/host/test/vrt_test.cpp @@ -21,7 +21,7 @@ using namespace uhd::transport; static void pack_and_unpack( - const uhd::metadata_t &metadata, + const uhd::tx_metadata_t &metadata, size_t num_payload_words32, size_t packet_count ){ @@ -39,7 +39,7 @@ static void pack_and_unpack( packet_count //input ); - uhd::metadata_t metadata_out; + uhd::rx_metadata_t metadata_out; size_t num_header_words32_out; size_t num_payload_words32_out; size_t packet_count_out; @@ -70,19 +70,19 @@ static void pack_and_unpack( } BOOST_AUTO_TEST_CASE(test_with_none){ - uhd::metadata_t metadata; + uhd::tx_metadata_t metadata; pack_and_unpack(metadata, 300, 1); } BOOST_AUTO_TEST_CASE(test_with_sid){ - uhd::metadata_t metadata; + uhd::tx_metadata_t metadata; metadata.has_stream_id = true; metadata.stream_id = 6; pack_and_unpack(metadata, 400, 2); } BOOST_AUTO_TEST_CASE(test_with_time_spec){ - uhd::metadata_t metadata; + uhd::tx_metadata_t metadata; metadata.has_time_spec = true; metadata.time_spec.secs = 7; metadata.time_spec.ticks = 2000; @@ -90,7 +90,7 @@ BOOST_AUTO_TEST_CASE(test_with_time_spec){ } BOOST_AUTO_TEST_CASE(test_with_sid_and_time_spec){ - uhd::metadata_t metadata; + uhd::tx_metadata_t metadata; metadata.has_stream_id = true; metadata.stream_id = 2; metadata.has_time_spec = true; |