diff options
Diffstat (limited to 'host')
-rw-r--r-- | host/include/uhd/device.hpp | 10 | ||||
-rw-r--r-- | host/include/uhd/device.ipp | 5 | ||||
-rw-r--r-- | host/lib/transport/vrt_packet_handler.hpp | 14 | ||||
-rw-r--r-- | host/lib/usrp/usrp2/io_impl.cpp | 18 | ||||
-rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.hpp | 8 |
5 files changed, 28 insertions, 27 deletions
diff --git a/host/include/uhd/device.hpp b/host/include/uhd/device.hpp index a19d22880..ee297ec8a 100644 --- a/host/include/uhd/device.hpp +++ b/host/include/uhd/device.hpp @@ -42,6 +42,9 @@ public: typedef boost::function<device_addrs_t(const device_addr_t &)> find_t; typedef boost::function<sptr(const device_addr_t &)> make_t; + //! A reasonable default timeout for receive + static const size_t default_recv_timeout_ms = 100; + /*! * Register a device into the discovery and factory system. * @@ -174,6 +177,7 @@ public: * \param metadata data to fill describing the buffer * \param io_type the type of data to fill into the buffer * \param recv_mode tells recv how to load the buffer + * \param timeout_ms the timeout in milliseconds to wait for a packet * \return the number of samples received or 0 on error */ virtual size_t recv( @@ -181,7 +185,8 @@ public: size_t nsamps_per_buff, rx_metadata_t &metadata, const io_type_t &io_type, - recv_mode_t recv_mode + recv_mode_t recv_mode, + size_t timeout_ms = default_recv_timeout_ms ) = 0; /*! @@ -192,7 +197,8 @@ public: size_t nsamps_per_buff, rx_metadata_t &metadata, const io_type_t &io_type, - recv_mode_t recv_mode + recv_mode_t recv_mode, + size_t timeout_ms = default_recv_timeout_ms ); //! Deprecated diff --git a/host/include/uhd/device.ipp b/host/include/uhd/device.ipp index c38a2e43e..603c52859 100644 --- a/host/include/uhd/device.ipp +++ b/host/include/uhd/device.ipp @@ -52,12 +52,13 @@ namespace uhd{ size_t nsamps_per_buff, rx_metadata_t &metadata, const io_type_t &io_type, - recv_mode_t recv_mode + recv_mode_t recv_mode, + size_t timeout_ms ){ return this->recv( std::vector<void *>(1, buff), nsamps_per_buff, metadata, - io_type, recv_mode + io_type, recv_mode, timeout_ms ); } diff --git a/host/lib/transport/vrt_packet_handler.hpp b/host/lib/transport/vrt_packet_handler.hpp index bd76cbb8f..07ad9115c 100644 --- a/host/lib/transport/vrt_packet_handler.hpp +++ b/host/lib/transport/vrt_packet_handler.hpp @@ -41,6 +41,7 @@ namespace vrt_packet_handler{ typedef std::vector<uhd::transport::managed_recv_buffer::sptr> managed_recv_buffs_t; typedef boost::function<bool(managed_recv_buffs_t &)> get_recv_buffs_t; typedef boost::function<void(size_t /*which channel*/)> handle_overrun_t; + typedef boost::function<void(const boost::uint32_t *, uhd::transport::vrt::if_packet_info_t &)> vrt_unpacker_t; static inline void handle_overrun_nop(size_t){} @@ -69,12 +70,11 @@ namespace vrt_packet_handler{ * Unpack a received vrt header and set the copy buffer. * - helper function for vrt_packet_handler::_recv1 ******************************************************************/ - template<typename vrt_unpacker_type> static UHD_INLINE void _recv1_helper( recv_state &state, uhd::rx_metadata_t &metadata, double tick_rate, - vrt_unpacker_type vrt_unpacker, + const vrt_unpacker_t &vrt_unpacker, const handle_overrun_t &handle_overrun, size_t vrt_header_offset_words32 ){ @@ -131,7 +131,6 @@ namespace vrt_packet_handler{ * Recv data, unpack a vrt header, and copy-convert the data. * - helper function for vrt_packet_handler::recv ******************************************************************/ - template<typename vrt_unpacker_type> static UHD_INLINE size_t _recv1( recv_state &state, const std::vector<void *> &buffs, @@ -141,7 +140,7 @@ namespace vrt_packet_handler{ const uhd::io_type_t &io_type, const uhd::otw_type_t &otw_type, double tick_rate, - vrt_unpacker_type vrt_unpacker, + const vrt_unpacker_t &vrt_unpacker, const get_recv_buffs_t &get_recv_buffs, const handle_overrun_t &handle_overrun, size_t vrt_header_offset_words32 @@ -206,7 +205,6 @@ namespace vrt_packet_handler{ /******************************************************************* * Recv vrt packets and copy convert the samples into the buffer. ******************************************************************/ - template<typename vrt_unpacker_type> static UHD_INLINE size_t recv( recv_state &state, const std::vector<void *> &buffs, @@ -216,7 +214,7 @@ namespace vrt_packet_handler{ const uhd::io_type_t &io_type, const uhd::otw_type_t &otw_type, double tick_rate, - vrt_unpacker_type vrt_unpacker, + const vrt_unpacker_t &vrt_unpacker, const get_recv_buffs_t &get_recv_buffs, const handle_overrun_t &handle_overrun = &handle_overrun_nop, size_t vrt_header_offset_words32 = 0 @@ -273,6 +271,7 @@ namespace vrt_packet_handler{ **********************************************************************/ typedef std::vector<uhd::transport::managed_send_buffer::sptr> managed_send_buffs_t; typedef boost::function<bool(managed_send_buffs_t &)> get_send_buffs_t; + typedef boost::function<void(boost::uint32_t *, uhd::transport::vrt::if_packet_info_t &)> vrt_packer_t; struct send_state{ //init the expected seq number @@ -334,7 +333,6 @@ namespace vrt_packet_handler{ /******************************************************************* * Send vrt packets and copy convert the samples into the buffer. ******************************************************************/ - template<typename vrt_packer_type> static UHD_INLINE size_t send( send_state &state, const std::vector<const void *> &buffs, @@ -344,7 +342,7 @@ namespace vrt_packet_handler{ const uhd::io_type_t &io_type, const uhd::otw_type_t &otw_type, double tick_rate, - vrt_packer_type vrt_packer, + const vrt_packer_t &vrt_packer, const get_send_buffs_t &get_send_buffs, size_t max_samples_per_packet, size_t vrt_header_offset_words32 = 0 diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp index e4a49184e..1947fdf00 100644 --- a/host/lib/usrp/usrp2/io_impl.cpp +++ b/host/lib/usrp/usrp2/io_impl.cpp @@ -57,7 +57,7 @@ struct usrp2_impl::io_impl{ bool get_recv_buffs(vrt_packet_handler::managed_recv_buffs_t &buffs){ boost::this_thread::disable_interruption di; //disable because the wait can throw - return recv_pirate_booty->pop_elems_with_timed_wait(buffs, boost::posix_time::milliseconds(100)); + return recv_pirate_booty->pop_elems_with_timed_wait(buffs, boost::posix_time::milliseconds(recv_timeout_ms)); } //state management for the vrt packet handler code @@ -69,6 +69,7 @@ struct usrp2_impl::io_impl{ boost::thread_group recv_pirate_crew; bool recv_pirate_crew_raiding; alignment_buffer_type::sptr recv_pirate_booty; + size_t recv_timeout_ms; }; /*********************************************************************** @@ -170,10 +171,8 @@ bool get_send_buffs( } size_t usrp2_impl::send( - const std::vector<const void *> &buffs, - size_t num_samps, - const tx_metadata_t &metadata, - const io_type_t &io_type, + const std::vector<const void *> &buffs, size_t num_samps, + const tx_metadata_t &metadata, const io_type_t &io_type, send_mode_t send_mode ){ return vrt_packet_handler::send( @@ -192,12 +191,11 @@ size_t usrp2_impl::send( * Receive Data **********************************************************************/ size_t usrp2_impl::recv( - const std::vector<void *> &buffs, - size_t num_samps, - rx_metadata_t &metadata, - const io_type_t &io_type, - recv_mode_t recv_mode + const std::vector<void *> &buffs, size_t num_samps, + rx_metadata_t &metadata, const io_type_t &io_type, + recv_mode_t recv_mode, size_t timeout_ms ){ + _io_impl->recv_timeout_ms = timeout_ms; return vrt_packet_handler::recv( _io_impl->packet_handler_recv_state, //last state of the recv handler buffs, num_samps, //buffer to fill diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp index ab23830c0..cae1b21d6 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.hpp +++ b/host/lib/usrp/usrp2/usrp2_impl.hpp @@ -224,8 +224,7 @@ public: } size_t send( const std::vector<const void *> &, size_t, - const uhd::tx_metadata_t &, - const uhd::io_type_t &, + const uhd::tx_metadata_t &, const uhd::io_type_t &, uhd::device::send_mode_t ); size_t get_max_recv_samps_per_packet(void) const{ @@ -233,9 +232,8 @@ public: } size_t recv( const std::vector<void *> &, size_t, - uhd::rx_metadata_t &, - const uhd::io_type_t &, - uhd::device::recv_mode_t + uhd::rx_metadata_t &, const uhd::io_type_t &, + uhd::device::recv_mode_t, size_t ); private: |