diff options
| author | Josh Blum <josh@joshknows.com> | 2011-07-01 16:54:53 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-07-01 16:54:53 -0700 | 
| commit | 614d4901bb9dbb6866a0c5f57b1397e4b185a11f (patch) | |
| tree | d2c0308af2464ae3b15e2079a25d8f24d46f0caa /host/lib/usrp/e100 | |
| parent | 6aa4690af05559d28b5238fa153fd46ff57cf06f (diff) | |
| download | uhd-614d4901bb9dbb6866a0c5f57b1397e4b185a11f.tar.gz uhd-614d4901bb9dbb6866a0c5f57b1397e4b185a11f.tar.bz2 uhd-614d4901bb9dbb6866a0c5f57b1397e4b185a11f.zip  | |
usrp: created common code to demux an rx stream (b100, e100)
Diffstat (limited to 'host/lib/usrp/e100')
| -rw-r--r-- | host/lib/usrp/e100/io_impl.cpp | 56 | 
1 files changed, 8 insertions, 48 deletions
diff --git a/host/lib/usrp/e100/io_impl.cpp b/host/lib/usrp/e100/io_impl.cpp index 7af2515a9..14b348f96 100644 --- a/host/lib/usrp/e100/io_impl.cpp +++ b/host/lib/usrp/e100/io_impl.cpp @@ -15,6 +15,7 @@  // along with this program.  If not, see <http://www.gnu.org/licenses/>.  // +#include "recv_packet_demuxer.hpp"  #include "validate_subdev_spec.hpp"  #include "../../transport/super_recv_packet_handler.hpp"  #include "../../transport/super_send_packet_handler.hpp" @@ -46,59 +47,17 @@ using namespace uhd::transport;   * - vrt packet handler states   **********************************************************************/  struct e100_impl::io_impl{ -    io_impl(zero_copy_if::sptr data_transport, const size_t recv_width): -        false_alarm(0), -        data_transport(data_transport), -        async_msg_fifo(100/*messages deep*/) -    { -        for (size_t i = 0; i < recv_width; i++){ -            typedef bounded_buffer<managed_recv_buffer::sptr> buffs_queue_type; -            _buffs_queue.push_back(new buffs_queue_type(data_transport->get_num_recv_frames())); -        } -    } - -    ~io_impl(void){ -        recv_pirate_crew.interrupt_all(); -        recv_pirate_crew.join_all(); -        for (size_t i = 0; i < _buffs_queue.size(); i++){ -            delete _buffs_queue[i]; -        } -    } +    io_impl(void): +        false_alarm(0), async_msg_fifo(100/*messages deep*/) +    { /* NOP */ }      double tick_rate; //set by update tick rate method      e100_ctrl::sptr iface; //so handle irq can peek and poke      void handle_irq(void);      size_t false_alarm; - -    std::vector<bounded_buffer<managed_recv_buffer::sptr> *> _buffs_queue; - -    //gets buffer, determines if its the requested index, -    //and either queues the buffer or returns the buffer -    managed_recv_buffer::sptr get_recv_buff(const size_t index, const double timeout){ -        while (true){ -            managed_recv_buffer::sptr buff; - -            //attempt to pop a buffer from the queue -            if (_buffs_queue[index]->pop_with_haste(buff)) return buff; - -            //otherwise, call into the transport -            buff = data_transport->get_recv_buff(timeout); -            if (buff.get() == NULL) return buff; //timeout - -            //check the stream id to know which channel -            const boost::uint32_t *vrt_hdr = buff->cast<const boost::uint32_t *>(); -            const size_t rx_index = uhd::wtohx(vrt_hdr[1]) - E100_RX_SID_BASE; -            if (rx_index == index) return buff; //got expected message - -            //otherwise queue and try again -            if (rx_index < _buffs_queue.size()) _buffs_queue[rx_index]->push_with_pop_on_full(buff); -            else UHD_MSG(error) << "Got a data packet with known SID " << uhd::wtohx(vrt_hdr[1]) << std::endl; -        } -    } -      //The data transport is listed first so that it is deconstructed last,      //which is after the states and booty which may hold managed buffers. -    zero_copy_if::sptr data_transport; +    recv_packet_demuxer::sptr demuxer;      //state management for the vrt packet handler code      sph::recv_packet_handler recv_handler; @@ -213,7 +172,8 @@ void e100_impl::io_init(void){      _tx_otw_type.byteorder = uhd::otw_type_t::BO_LITTLE_ENDIAN;      //create new io impl -    _io_impl = UHD_PIMPL_MAKE(io_impl, (_data_transport, _rx_dsps.size())); +    _io_impl = UHD_PIMPL_MAKE(io_impl, ()); +    _io_impl->demuxer = recv_packet_demuxer::make(_data_transport, _rx_dsps.size(), E100_RX_SID_BASE);      _io_impl->iface = _fpga_ctrl;      //clear state machines @@ -280,7 +240,7 @@ void e100_impl::update_rx_subdev_spec(const uhd::usrp::subdev_spec_t &spec){      for (size_t i = 0; i < _io_impl->recv_handler.size(); i++){          _rx_dsps[i]->set_nsamps_per_packet(get_max_recv_samps_per_packet()); //seems to be a good place to set this          _io_impl->recv_handler.set_xport_chan_get_buff(i, boost::bind( -            &e100_impl::io_impl::get_recv_buff, _io_impl.get(), i, _1 +            &recv_packet_demuxer::get_recv_buff, _io_impl->demuxer, i, _1          ));          _io_impl->recv_handler.set_overflow_handler(i, boost::bind(&rx_dsp_core_200::handle_overflow, _rx_dsps[i]));      }  | 
