diff options
Diffstat (limited to 'host/examples/test_messages.cpp')
-rw-r--r-- | host/examples/test_messages.cpp | 352 |
1 files changed, 181 insertions, 171 deletions
diff --git a/host/examples/test_messages.cpp b/host/examples/test_messages.cpp index 2ff10049d..4d4771900 100644 --- a/host/examples/test_messages.cpp +++ b/host/examples/test_messages.cpp @@ -6,18 +6,18 @@ // #include <uhd/config.hpp> -#include <uhd/utils/thread.hpp> -#include <uhd/utils/safe_main.hpp> -#include <uhd/utils/static.hpp> #include <uhd/types/stream_cmd.hpp> #include <uhd/usrp/multi_usrp.hpp> +#include <uhd/utils/safe_main.hpp> +#include <uhd/utils/static.hpp> +#include <uhd/utils/thread.hpp> #include <boost/assign/list_of.hpp> -#include <boost/program_options.hpp> #include <boost/bind.hpp> #include <boost/format.hpp> +#include <boost/program_options.hpp> +#include <complex> #include <cstdlib> #include <ctime> -#include <complex> #include <iostream> namespace po = boost::program_options; @@ -27,45 +27,45 @@ namespace po = boost::program_options; * Issue a stream command with a time that is in the past. * We expect to get an inline late command message. */ -bool test_late_command_message(uhd::usrp::multi_usrp::sptr usrp, uhd::rx_streamer::sptr rx_stream, uhd::tx_streamer::sptr){ +bool test_late_command_message(uhd::usrp::multi_usrp::sptr usrp, + uhd::rx_streamer::sptr rx_stream, + uhd::tx_streamer::sptr) +{ std::cout << "Test late command message... " << std::flush; - usrp->set_time_now(uhd::time_spec_t(200.0)); //set time + usrp->set_time_now(uhd::time_spec_t(200.0)); // set time uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE); - stream_cmd.num_samps = rx_stream->get_max_num_samps(); + stream_cmd.num_samps = rx_stream->get_max_num_samps(); stream_cmd.stream_now = false; - stream_cmd.time_spec = uhd::time_spec_t(100.0); //time in the past + stream_cmd.time_spec = uhd::time_spec_t(100.0); // time in the past rx_stream->issue_stream_cmd(stream_cmd); - std::vector<std::complex<float> > buff(rx_stream->get_max_num_samps()); + std::vector<std::complex<float>> buff(rx_stream->get_max_num_samps()); uhd::rx_metadata_t md; - const size_t nsamps = rx_stream->recv( - &buff.front(), buff.size(), md - ); - - switch(md.error_code){ - case uhd::rx_metadata_t::ERROR_CODE_LATE_COMMAND: - std::cout << boost::format( - "success:\n" - " Got error code late command message.\n" - ) << std::endl; - return true; - - case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: - std::cout << boost::format( - "failed:\n" - " Inline message recv timed out.\n" - ) << std::endl; - return false; - - default: - std::cout << boost::format( - "failed:\n" - " Got unexpected error code 0x%x (%s), nsamps %u.\n" - ) % md.error_code % md.strerror() % nsamps << std::endl; - return false; + const size_t nsamps = rx_stream->recv(&buff.front(), buff.size(), md); + + switch (md.error_code) { + case uhd::rx_metadata_t::ERROR_CODE_LATE_COMMAND: + std::cout << boost::format("success:\n" + " Got error code late command message.\n") + << std::endl; + return true; + + case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: + std::cout << boost::format("failed:\n" + " Inline message recv timed out.\n") + << std::endl; + return false; + + default: + std::cout << boost::format( + "failed:\n" + " Got unexpected error code 0x%x (%s), nsamps %u.\n") + % md.error_code % md.strerror() % nsamps + << std::endl; + return false; } } @@ -74,46 +74,49 @@ bool test_late_command_message(uhd::usrp::multi_usrp::sptr usrp, uhd::rx_streame * Issue a stream command with num samps and more. * We expect to get an inline broken chain message. */ -bool test_broken_chain_message(UHD_UNUSED(uhd::usrp::multi_usrp::sptr usrp), uhd::rx_streamer::sptr rx_stream, uhd::tx_streamer::sptr){ +bool test_broken_chain_message(UHD_UNUSED(uhd::usrp::multi_usrp::sptr usrp), + uhd::rx_streamer::sptr rx_stream, + uhd::tx_streamer::sptr) +{ std::cout << "Test broken chain message... " << std::flush; uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE); stream_cmd.stream_now = true; - stream_cmd.num_samps = rx_stream->get_max_num_samps(); + stream_cmd.num_samps = rx_stream->get_max_num_samps(); rx_stream->issue_stream_cmd(stream_cmd); - std::vector<std::complex<float> > buff(rx_stream->get_max_num_samps()); + std::vector<std::complex<float>> buff(rx_stream->get_max_num_samps()); uhd::rx_metadata_t md; - rx_stream->recv( //once for the requested samples - &buff.front(), buff.size(), md - ); - - rx_stream->recv( //again for the inline message - &buff.front(), buff.size(), md - ); - - switch(md.error_code){ - case uhd::rx_metadata_t::ERROR_CODE_BROKEN_CHAIN: - std::cout << boost::format( - "success:\n" - " Got error code broken chain message.\n" - ) << std::endl; - return true; - - case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: - std::cout << boost::format( - "failed:\n" - " Inline message recv timed out.\n" - ) << std::endl; - return false; - - default: - std::cout << boost::format( - "failed:\n" - " Got unexpected error code 0x%x (%s).\n" - ) % md.error_code % md.strerror() << std::endl; - return false; + rx_stream->recv( // once for the requested samples + &buff.front(), + buff.size(), + md); + + rx_stream->recv( // again for the inline message + &buff.front(), + buff.size(), + md); + + switch (md.error_code) { + case uhd::rx_metadata_t::ERROR_CODE_BROKEN_CHAIN: + std::cout << boost::format("success:\n" + " Got error code broken chain message.\n") + << std::endl; + return true; + + case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: + std::cout << boost::format("failed:\n" + " Inline message recv timed out.\n") + << std::endl; + return false; + + default: + std::cout << boost::format("failed:\n" + " Got unexpected error code 0x%x (%s).\n") + % md.error_code % md.strerror() + << std::endl; + return false; } } @@ -122,7 +125,9 @@ bool test_broken_chain_message(UHD_UNUSED(uhd::usrp::multi_usrp::sptr usrp), uhd * 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){ +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; @@ -130,33 +135,31 @@ bool test_burst_ack_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, 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); + // 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; + 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; + 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; } } @@ -165,7 +168,9 @@ bool test_burst_ack_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, * 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){ +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; @@ -173,32 +178,30 @@ bool test_underflow_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, md.end_of_burst = false; md.has_time_spec = false; - std::vector< std::complex<float> > buff(tx_stream->get_max_num_samps()); + std::vector<std::complex<float>> buff(tx_stream->get_max_num_samps()); tx_stream->send(&buff.front(), buff.size(), 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; + 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; + 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; } } @@ -207,73 +210,78 @@ bool test_underflow_message(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, * 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){ +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 + 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 + usrp->set_time_now(uhd::time_spec_t(200.0)); // time at 200s - std::vector< std::complex<float> > buff(tx_stream->get_max_num_samps()); + std::vector<std::complex<float>> buff(tx_stream->get_max_num_samps()); 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; + 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; + 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){ +void flush_async(uhd::tx_streamer::sptr tx_stream) +{ uhd::async_metadata_t async_md; - while (tx_stream->recv_async_msg(async_md)){} + while (tx_stream->recv_async_msg(async_md)) { + } } -void flush_recv(uhd::rx_streamer::sptr rx_stream){ +void flush_recv(uhd::rx_streamer::sptr rx_stream) +{ uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE); - stream_cmd.num_samps = rx_stream->get_max_num_samps()*3; + stream_cmd.num_samps = rx_stream->get_max_num_samps() * 3; stream_cmd.stream_now = true; rx_stream->issue_stream_cmd(stream_cmd); - std::vector<std::complex<float> > buff(stream_cmd.num_samps); + std::vector<std::complex<float>> buff(stream_cmd.num_samps); uhd::rx_metadata_t md; - do{ + do { rx_stream->recv(&buff.front(), buff.size(), md); } while (md.error_code != uhd::rx_metadata_t::ERROR_CODE_TIMEOUT); } -int UHD_SAFE_MAIN(int argc, char *argv[]){ +int UHD_SAFE_MAIN(int argc, char* argv[]) +{ uhd::set_thread_priority_safe(); - //variables to be set by po + // variables to be set by po std::string args; size_t ntests; - //setup the program options + // setup the program options po::options_description desc("Allowed options"); // clang-format off desc.add_options() @@ -287,70 +295,72 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){ po::store(po::parse_command_line(argc, argv, desc), vm); po::notify(vm); - //print the help message - if (vm.count("help")){ + // print the help message + if (vm.count("help")) { std::cout << boost::format("UHD Test Messages %s") % desc << std::endl; return ~0; } - //create a usrp device + // create a usrp device std::cout << std::endl; - std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl; + std::cout << boost::format("Creating the usrp device with: %s...") % args + << std::endl; uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args); std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl; - //create RX and TX streamers - uhd::stream_args_t stream_args("fc32"); //complex floats + // create RX and TX streamers + uhd::stream_args_t stream_args("fc32"); // complex floats uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args); uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(stream_args); //------------------------------------------------------------------ // begin messages test //------------------------------------------------------------------ - static uhd::dict<std::string, boost::function<bool(uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr)> > - tests = boost::assign::map_list_of - ("Test Burst ACK ", &test_burst_ack_message) - ("Test Underflow ", &test_underflow_message) - ("Test Time Error", &test_time_error_message) - ("Test Late Command", &test_late_command_message) - ; + static uhd::dict<std::string, + boost::function<bool( + uhd::usrp::multi_usrp::sptr, uhd::rx_streamer::sptr, uhd::tx_streamer::sptr)>> + tests = boost::assign::map_list_of("Test Burst ACK ", &test_burst_ack_message)( + "Test Underflow ", &test_underflow_message)("Test Time Error", + &test_time_error_message)("Test Late Command", &test_late_command_message); if (vm.count("test-chain")) { tests["Test Broken Chain"] = &test_broken_chain_message; } - //init result counts + // init result counts uhd::dict<std::string, size_t> failures, successes; - for(const std::string &key: tests.keys()){ - failures[key] = 0; + for (const std::string& key : tests.keys()) { + failures[key] = 0; successes[key] = 0; } - //run the tests, pick at random - std::srand((unsigned int) time(NULL)); - for (size_t n = 0; n < ntests; n++){ + // run the tests, pick at random + std::srand((unsigned int)time(NULL)); + for (size_t n = 0; n < ntests; n++) { std::string key = tests.keys()[std::rand() % tests.size()]; - bool pass = tests[key](usrp, rx_stream, tx_stream); + bool pass = tests[key](usrp, rx_stream, tx_stream); flush_recv(rx_stream); flush_async(tx_stream); - //store result - if (pass) successes[key]++; - else failures[key]++; + // store result + if (pass) + successes[key]++; + else + failures[key]++; } - //print the result summary + // print the result summary bool any_failure = false; std::cout << std::endl << "Summary:" << std::endl << std::endl; - for(const std::string &key: tests.keys()){ - std::cout << boost::format( - "%s -> %3u successes, %3u failures" - ) % key % successes[key] % failures[key] << std::endl; + for (const std::string& key : tests.keys()) { + std::cout << boost::format("%s -> %3u successes, %3u failures") % key + % successes[key] % failures[key] + << std::endl; any_failure = any_failure or (failures[key] > 0); } - //finished + // finished std::cout << std::endl << "Done!" << std::endl << std::endl; return any_failure ? EXIT_FAILURE : EXIT_SUCCESS; |