diff options
| author | Josh Blum <josh@joshknows.com> | 2010-06-30 12:08:45 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-07-05 13:45:13 -0700 | 
| commit | a38a0943490d10da733a529156a7650c056028e6 (patch) | |
| tree | 62a8c36add4282ee648f34f4dca8601b8878722e /host/lib/transport/vrt_packet_handler.hpp | |
| parent | 9183ca62eb8fba96cf527d3cefa0a48f67397a57 (diff) | |
| download | uhd-a38a0943490d10da733a529156a7650c056028e6.tar.gz uhd-a38a0943490d10da733a529156a7650c056028e6.tar.bz2 uhd-a38a0943490d10da733a529156a7650c056028e6.zip  | |
uhd: vrt packet handler fix and tweaks
Diffstat (limited to 'host/lib/transport/vrt_packet_handler.hpp')
| -rw-r--r-- | host/lib/transport/vrt_packet_handler.hpp | 66 | 
1 files changed, 30 insertions, 36 deletions
diff --git a/host/lib/transport/vrt_packet_handler.hpp b/host/lib/transport/vrt_packet_handler.hpp index 63bf95204..8cbc71008 100644 --- a/host/lib/transport/vrt_packet_handler.hpp +++ b/host/lib/transport/vrt_packet_handler.hpp @@ -39,6 +39,7 @@ namespace vrt_packet_handler{   * vrt packet handler for recv   **********************************************************************/      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;      struct recv_state{          //width of the receiver in channels @@ -65,10 +66,6 @@ namespace vrt_packet_handler{          }      }; -    typedef boost::function<bool(managed_recv_buffs_t &)> get_recv_buffs_t; - -    typedef boost::function<void(managed_recv_buffs_t &)> recv_cb_t; -      /*******************************************************************       * Unpack a received vrt header and set the copy buffer.       *  - helper function for vrt_packet_handler::_recv1 @@ -136,6 +133,8 @@ namespace vrt_packet_handler{          //use these two params to handle a layer above vrt          size_t vrt_header_offset_words32      ){ +        metadata.has_time_spec = false; //false unless set in the helper +          //perform a receive if no rx data is waiting to be copied          if (state.size_of_copy_buffs == 0){              state.fragment_offset_in_samps = 0; @@ -196,8 +195,6 @@ namespace vrt_packet_handler{          //use these two params to handle a layer above vrt          size_t vrt_header_offset_words32 = 0      ){ -        metadata = uhd::rx_metadata_t(); //init the metadata -          switch(recv_mode){          //////////////////////////////////////////////////////////////// @@ -247,20 +244,17 @@ namespace vrt_packet_handler{   * vrt packet handler for send   **********************************************************************/      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;      struct send_state{          //init the expected seq number          size_t next_packet_seq; -        send_state(void){ -            next_packet_seq = 0; +        send_state(void) : next_packet_seq(0){ +            /* NOP */          }      }; -    typedef boost::function<bool(managed_send_buffs_t &)> get_send_buffs_t; - -    typedef boost::function<void(managed_send_buffs_t &)> send_cb_t; -      /*******************************************************************       * Pack a vrt header, copy-convert the data, and send it.       *  - helper function for vrt_packet_handler::send @@ -271,27 +265,16 @@ namespace vrt_packet_handler{          const std::vector<const void *> &buffs,          size_t offset_bytes,          size_t num_samps, -        const uhd::tx_metadata_t &metadata, +        uhd::transport::vrt::if_packet_info_t &if_packet_info,          const uhd::io_type_t &io_type,          const uhd::otw_type_t &otw_type, -        double tick_rate,          vrt_packer_type vrt_packer,          const get_send_buffs_t &get_send_buffs,          size_t vrt_header_offset_words32      ){ -        //translate the metadata to vrt if packet info -        uhd::transport::vrt::if_packet_info_t if_packet_info; -        if_packet_info.has_sid = false; -        if_packet_info.has_cid = false; -        if_packet_info.has_tsi = metadata.has_time_spec; -        if_packet_info.tsi = boost::uint32_t(metadata.time_spec.get_full_secs()); -        if_packet_info.has_tsf = metadata.has_time_spec; -        if_packet_info.tsf = boost::uint64_t(metadata.time_spec.get_tick_count(tick_rate)); -        if_packet_info.has_tlr = false; -        if_packet_info.num_payload_words32 = (num_samps*io_type.size)/sizeof(boost::uint32_t); +        //load the rest of the if_packet_info in here +        if_packet_info.num_payload_words32 = (num_samps*otw_type.get_sample_size())/sizeof(boost::uint32_t);          if_packet_info.packet_count = state.next_packet_seq++; -        if_packet_info.sob = metadata.start_of_burst; -        if_packet_info.eob = metadata.end_of_burst;          //get send buffers for each channel          managed_send_buffs_t send_buffs(buffs.size()); @@ -336,6 +319,14 @@ namespace vrt_packet_handler{          //use these two params to handle a layer above vrt          size_t vrt_header_offset_words32 = 0      ){ +        //translate the metadata to vrt if packet info +        uhd::transport::vrt::if_packet_info_t if_packet_info; +        if_packet_info.has_sid = false; +        if_packet_info.has_cid = false; +        if_packet_info.has_tlr = false; +        if_packet_info.tsi = boost::uint32_t(metadata.time_spec.get_full_secs()); +        if_packet_info.tsf = boost::uint64_t(metadata.time_spec.get_tick_count(tick_rate)); +          if (total_num_samps <= max_samples_per_packet) send_mode = uhd::device::SEND_MODE_ONE_PACKET;          switch(send_mode){ @@ -343,13 +334,19 @@ namespace vrt_packet_handler{          case uhd::device::SEND_MODE_ONE_PACKET:{          ////////////////////////////////////////////////////////////////              size_t num_samps = std::min(total_num_samps, max_samples_per_packet); + +            //fill in parts of the packet info overwrote in full buff mode +            if_packet_info.has_tsi = metadata.has_time_spec; +            if_packet_info.has_tsf = metadata.has_time_spec; +            if_packet_info.sob = metadata.start_of_burst; +            if_packet_info.eob = metadata.end_of_burst; +              _send1(                  state,                  buffs, 0,                  num_samps, -                metadata, +                if_packet_info,                  io_type, otw_type, -                tick_rate,                  vrt_packer,                  get_send_buffs,                  vrt_header_offset_words32 @@ -365,25 +362,22 @@ namespace vrt_packet_handler{              static const size_t first_fragment_index = 0;              const size_t final_fragment_index = num_fragments-1; -            //make a rw copy of the metadata to re-flag below -            uhd::tx_metadata_t md(metadata); -              //loop through the following fragment indexes              for (size_t n = first_fragment_index; n <= final_fragment_index; n++){                  //calculate new flags for the fragments -                md.has_time_spec  = metadata.has_time_spec  and (n == first_fragment_index); -                md.start_of_burst = metadata.start_of_burst and (n == first_fragment_index); -                md.end_of_burst   = metadata.end_of_burst   and (n == final_fragment_index); +                if_packet_info.has_tsi = metadata.has_time_spec  and (n == first_fragment_index); +                if_packet_info.has_tsf = metadata.has_time_spec  and (n == first_fragment_index); +                if_packet_info.sob     = metadata.start_of_burst and (n == first_fragment_index); +                if_packet_info.eob     = metadata.end_of_burst   and (n == final_fragment_index);                  //send the fragment with the helper function                  _send1(                      state,                      buffs, n*max_samples_per_packet*io_type.size,                      (n == final_fragment_index)?(total_num_samps%max_samples_per_packet):max_samples_per_packet, -                    md, +                    if_packet_info,                      io_type, otw_type, -                    tick_rate,                      vrt_packer,                      get_send_buffs,                      vrt_header_offset_words32  | 
