diff options
author | Josh Blum | 2011-06-11 11:03:11 -0700 |
---|---|---|
committer | Josh Blum | 2011-06-14 09:16:48 -0700 |
commit | 081497e75e89ab1343ee020013f5fd05275b6188 (patch) | |
tree | dd10abf46cc21cc4fe524a5e2d52c956c308880f | |
parent | f0143c5d557ca7e4bf05c26f410da13520df91e5 (diff) | |
download | gnuradio-081497e75e89ab1343ee020013f5fd05275b6188.tar.gz gnuradio-081497e75e89ab1343ee020013f5fd05275b6188.tar.bz2 gnuradio-081497e75e89ab1343ee020013f5fd05275b6188.zip |
uhd: simplify the work function, added TODOs for tags
-rw-r--r-- | gr-uhd/lib/gr_uhd_usrp_source.cc | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc index 9983489c3..669f890ea 100644 --- a/gr-uhd/lib/gr_uhd_usrp_source.cc +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -182,19 +182,37 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items ){ - //wait for a packet to become available + //In order to allow for low-latency: + //We receive all available packets without timeout. + //This call can timeout under regular operation... size_t num_samps = _dev->get_device()->recv( output_items, noutput_items, _metadata, - _type, uhd::device::RECV_MODE_ONE_PACKET, 1.0 + _type, uhd::device::RECV_MODE_FULL_BUFF, 0.0 ); + //If receive resulted in a timeout condition: + //We now receive a single packet with a large timeout. + if (_metadata.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT){ + num_samps = _dev->get_device()->recv( + output_items, noutput_items, _metadata, + _type, uhd::device::RECV_MODE_ONE_PACKET, 1.0 + ); + } + //handle possible errors conditions switch(_metadata.error_code){ case uhd::rx_metadata_t::ERROR_CODE_NONE: + //TODO insert tag for time stamp break; + case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: + //Assume that the user called stop() on the flow graph. + //However, a timeout can occur under error conditions. + return WORK_DONE; + case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW: //ignore overflows and try work again + //TODO insert tag for overflow return work(noutput_items, input_items, output_items); default: @@ -204,18 +222,6 @@ public: return num_samps; } - //advance the pointers and count by num_samps - noutput_items -= num_samps; - for (size_t i = 0; i < _nchan; i++){ - _tmp_buffs[i] = static_cast<char *>(output_items[i]) + num_samps*_type.size; - } - - //receive all available packets without timeout - num_samps += _dev->get_device()->recv( - _tmp_buffs, noutput_items, _metadata, - _type, uhd::device::RECV_MODE_FULL_BUFF, 0.0 - ); - return num_samps; } |