/*! * Test the underflow message: * Send a start of burst packet with no following end of burst. * We expect to get an underflow(within a burst) async message. */ bool test_underflow_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr tx_stream){ std::cout << "Test underflow message... " << std::flush; uhd::tx_metadata_t md; md.start_of_burst = true; md.end_of_burst = false; md.has_time_spec = false; tx_stream->send("", 0, md); uhd::async_metadata_t async_md; if (not tx_stream->recv_async_msg(async_md, 1)){ std::cout << boost::format( "failed:\n" " Async message recv timed out.\n" ) << std::endl; return false; } switch(async_md.event_code){ case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW: std::cout << boost::format( "success:\n" " Got event code underflow message.\n" ) << std::endl; return true; default: std::cout << boost::format( "failed:\n" " Got unexpected event code 0x%x.\n" ) % async_md.event_code << std::endl; return false; } }
void tx_hammer_async_helper(uhd::tx_streamer::sptr tx_stream){ //setup variables and allocate buffer uhd::async_metadata_t async_md; while (not boost::this_thread::interruption_requested()){ if (not tx_stream->recv_async_msg(async_md)) continue; //handle the error codes switch(async_md.event_code){ case uhd::async_metadata_t::EVENT_CODE_BURST_ACK: return; case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW: case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET: num_underflows++; break; case uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR: case uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR_IN_BURST: num_seq_errors++; break; default: std::cerr << "Event code: " << async_md.event_code << std::endl; std::cerr << "Unexpected event on async recv, continuing..." << std::endl; break; } } }
/*! Returns true if any error on the TX stream has occured */ bool has_tx_error(uhd::tx_streamer::sptr tx_stream) { uhd::async_metadata_t async_md; if (!tx_stream->recv_async_msg(async_md, 0.0)) { return false; } return async_md.event_code & (0 // Any of these errors are considered a problematic TX error: | uhd::async_metadata_t::EVENT_CODE_UNDERFLOW | uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR | uhd::async_metadata_t::EVENT_CODE_TIME_ERROR | uhd::async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET | uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR_IN_BURST ); }
void benchmark_tx_rate_async_helper( uhd::tx_streamer::sptr tx_stream, const boost::posix_time::ptime &start_time, std::atomic<bool>& burst_timer_elapsed ) { //setup variables and allocate buffer uhd::async_metadata_t async_md; bool exit_flag = false; while (true) { if (burst_timer_elapsed) { exit_flag = true; } if (not tx_stream->recv_async_msg(async_md)) { if (exit_flag == true) return; continue; } //handle the error codes switch(async_md.event_code){ case uhd::async_metadata_t::EVENT_CODE_BURST_ACK: return; case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW: case uhd::async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET: num_underruns++; break; case uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR: case uhd::async_metadata_t::EVENT_CODE_SEQ_ERROR_IN_BURST: num_seq_errors++; break; default: std::cerr << "[" << NOW() << "] Event code: " << async_md.event_code << std::endl; std::cerr << "Unexpected event on async recv, continuing..." << std::endl; break; } } }
/*! * Test the burst ack message: * Send a burst of many samples that will fragment internally. * We expect to get an burst ack async message. */ bool test_burst_ack_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr tx_stream){ std::cout << "Test burst ack message... " << std::flush; uhd::tx_metadata_t md; md.start_of_burst = true; md.end_of_burst = true; md.has_time_spec = false; //3 times max-sps guarantees a SOB, no burst, and EOB packet std::vector<std::complex<float> > buff(tx_stream->get_max_num_samps()*3); tx_stream->send( &buff.front(), buff.size(), md ); uhd::async_metadata_t async_md; if (not tx_stream->recv_async_msg(async_md)){ std::cout << boost::format( "failed:\n" " Async message recv timed out.\n" ) << std::endl; return false; } switch(async_md.event_code){ case uhd::async_metadata_t::EVENT_CODE_BURST_ACK: std::cout << boost::format( "success:\n" " Got event code burst ack message.\n" ) << std::endl; return true; default: std::cout << boost::format( "failed:\n" " Got unexpected event code 0x%x.\n" ) % async_md.event_code << std::endl; return false; } }
/*! * Test the time error message: * Send a burst packet that occurs at a time in the past. * We expect to get a time error async message. */ bool test_time_error_message(uhd::usrp::multi_usrp::sptr usrp, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr tx_stream){ std::cout << "Test time error message... " << std::flush; uhd::tx_metadata_t md; md.start_of_burst = true; md.end_of_burst = true; md.has_time_spec = true; md.time_spec = uhd::time_spec_t(100.0); //send at 100s usrp->set_time_now(uhd::time_spec_t(200.0)); //time at 200s tx_stream->send("", 0, md); uhd::async_metadata_t async_md; if (not tx_stream->recv_async_msg(async_md)){ std::cout << boost::format( "failed:\n" " Async message recv timed out.\n" ) << std::endl; return false; } switch(async_md.event_code){ case uhd::async_metadata_t::EVENT_CODE_TIME_ERROR: std::cout << boost::format( "success:\n" " Got event code time error message.\n" ) << std::endl; return true; default: std::cout << boost::format( "failed:\n" " Got unexpected event code 0x%x.\n" ) % async_md.event_code << std::endl; return false; } }
void flush_async(uhd::tx_streamer::sptr tx_stream){ uhd::async_metadata_t async_md; while (tx_stream->recv_async_msg(async_md)){} }