diff options
author | Michael West <michael.west@ettus.com> | 2020-03-23 15:23:54 -0700 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2020-04-30 15:14:28 -0500 |
commit | 8720f42b33e89ff4df8bca69d7ddca2ba896b69a (patch) | |
tree | acfdd4709ac68b0502fc0184afcadc6e210a999c /host | |
parent | 3c2f8afcba9a1b3429242b8dbf7d1f8bacc2a73e (diff) | |
download | uhd-8720f42b33e89ff4df8bca69d7ddca2ba896b69a.tar.gz uhd-8720f42b33e89ff4df8bca69d7ddca2ba896b69a.tar.bz2 uhd-8720f42b33e89ff4df8bca69d7ddca2ba896b69a.zip |
examples: Update gpio example
The example assumed that there was always at least one TX and on RX
channel. Since that is not always true, this change checks for TX
and RX channels and only exucutes tests for what exists on the device.
Applied clang format.
Signed-off-by: Michael West <michael.west@ettus.com>
Diffstat (limited to 'host')
-rw-r--r-- | host/examples/gpio.cpp | 209 |
1 files changed, 117 insertions, 92 deletions
diff --git a/host/examples/gpio.cpp b/host/examples/gpio.cpp index 962e97450..12bcd26f7 100644 --- a/host/examples/gpio.cpp +++ b/host/examples/gpio.cpp @@ -225,7 +225,7 @@ int UHD_SAFE_MAIN(int argc, char* argv[]) % usrp->get_tx_subdev_spec(0).to_string() << std::endl; - // print out initial unconfigured state of FP GPIO + // print out initial unconfigured state of GPIO std::cout << "Initial GPIO values:" << std::endl; output_reg_values(gpio, usrp, num_bits); @@ -297,25 +297,35 @@ int UHD_SAFE_MAIN(int argc, char* argv[]) // set up streams uhd::stream_args_t rx_args(cpu, otw); uhd::stream_args_t tx_args(cpu, otw); - uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(rx_args); - uhd::tx_streamer::sptr tx_stream = usrp->get_tx_stream(tx_args); + uhd::rx_streamer::sptr rx_stream; + uhd::tx_streamer::sptr tx_stream; uhd::stream_cmd_t rx_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); rx_cmd.stream_now = true; - usrp->set_rx_rate(rx_rate); - usrp->set_tx_rate(tx_rate); + if (usrp->get_rx_num_channels()) { + rx_stream = usrp->get_rx_stream(rx_args); + usrp->set_rx_rate(rx_rate); + } + if (usrp->get_tx_num_channels()) { + tx_stream = usrp->get_tx_stream(tx_args); + usrp->set_tx_rate(tx_rate); + } // set up buffers for tx and rx - const size_t max_samps_per_packet = rx_stream->get_max_num_samps(); - const size_t nsamps_per_buff = max_samps_per_packet; - std::vector<char> rx_buff( - max_samps_per_packet * uhd::convert::get_bytes_per_item(cpu)); - std::vector<char> tx_buff( - max_samps_per_packet * uhd::convert::get_bytes_per_item(cpu)); + const size_t rx_spp = rx_stream ? rx_stream->get_max_num_samps() : 0; + const size_t tx_spp = tx_stream ? tx_stream->get_max_num_samps() : 0; + const size_t nsamps_per_buff = std::max(rx_spp, tx_spp); + std::vector<char> rx_buff(nsamps_per_buff * uhd::convert::get_bytes_per_item(cpu)); + std::vector<char> tx_buff(nsamps_per_buff * uhd::convert::get_bytes_per_item(cpu)); std::vector<void*> rx_buffs, tx_buffs; - for (size_t ch = 0; ch < rx_stream->get_num_channels(); ch++) - rx_buffs.push_back(&rx_buff.front()); // same buffer for each channel - for (size_t ch = 0; ch < tx_stream->get_num_channels(); ch++) - tx_buffs.push_back(&tx_buff.front()); // same buffer for each channel + if (rx_stream) { + for (size_t ch = 0; ch < rx_stream->get_num_channels(); ch++) { + rx_buffs.push_back(&rx_buff.front()); // same buffer for each channel + } + } + if (tx_stream) { + for (size_t ch = 0; ch < tx_stream->get_num_channels(); ch++) + tx_buffs.push_back(&tx_buff.front()); // same buffer for each channel + } uhd::rx_metadata_t rx_md; uhd::tx_metadata_t tx_md; @@ -391,104 +401,119 @@ int UHD_SAFE_MAIN(int argc, char* argv[]) if (stop_signal_called) break; - // test ATR RX by receiving for 1 second - std::cout << "\nTesting ATR RX output..." << std::flush; - rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS; - rx_stream->issue_stream_cmd(rx_cmd); - stop_time = std::chrono::steady_clock::now() + dwell_time; - while ( - not stop_signal_called and std::chrono::steady_clock::now() < stop_time) { + if (rx_stream) { + // test ATR RX by receiving for 1 second + std::cout << "\nTesting ATR RX output..." << std::flush; + rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS; + rx_stream->issue_stream_cmd(rx_cmd); + stop_time = std::chrono::steady_clock::now() + dwell_time; + while (not stop_signal_called + and std::chrono::steady_clock::now() < stop_time) { + try { + rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); + } catch (...) { + } + } + rb = usrp->get_gpio_attr(gpio, "READBACK"); + expected = GPIO_BIT(1); + if ((rb & expected) != expected) { + ++failures; + std::cout << "fail:" << std::endl; + std::cout << "Bit 1 should be set, but is not" << std::endl; + } else { + std::cout << "pass:" << std::endl; + } + output_reg_values(gpio, usrp, num_bits); + rx_stream->issue_stream_cmd( + uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); + // clear out any data left in the rx stream try { rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); } catch (...) { } } - rb = usrp->get_gpio_attr(gpio, "READBACK"); - expected = GPIO_BIT(1); - if ((rb & expected) != expected) { - ++failures; - std::cout << "fail:" << std::endl; - std::cout << "Bit 1 should be set, but is not" << std::endl; - } else { - std::cout << "pass:" << std::endl; - } - output_reg_values(gpio, usrp, num_bits); - rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); - // clear out any data left in the rx stream - try { - rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); - } catch (...) { - } if (stop_signal_called) break; - // test ATR TX by transmitting for 1 second - std::cout << "\nTesting ATR TX output..." << std::flush; - stop_time = std::chrono::steady_clock::now() + dwell_time; - tx_md.start_of_burst = true; - tx_md.end_of_burst = false; - while ( - not stop_signal_called and std::chrono::steady_clock::now() < stop_time) { + if (tx_stream) { + // test ATR TX by transmitting for 1 second + std::cout << "\nTesting ATR TX output..." << std::flush; + stop_time = std::chrono::steady_clock::now() + dwell_time; + tx_md.start_of_burst = true; + tx_md.end_of_burst = false; + while (not stop_signal_called + and std::chrono::steady_clock::now() < stop_time) { + try { + tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); + tx_md.start_of_burst = false; + } catch (...) { + } + } + rb = usrp->get_gpio_attr(gpio, "READBACK"); + expected = GPIO_BIT(2); + if ((rb & expected) != expected) { + ++failures; + std::cout << "fail:" << std::endl; + std::cout << "Bit 2 should be set, but is not" << std::endl; + } else { + std::cout << "pass:" << std::endl; + } + output_reg_values(gpio, usrp, num_bits); + tx_md.end_of_burst = true; try { tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); - tx_md.start_of_burst = false; } catch (...) { } } - rb = usrp->get_gpio_attr(gpio, "READBACK"); - expected = GPIO_BIT(2); - if ((rb & expected) != expected) { - ++failures; - std::cout << "fail:" << std::endl; - std::cout << "Bit 2 should be set, but is not" << std::endl; - } else { - std::cout << "pass:" << std::endl; - } - output_reg_values(gpio, usrp, num_bits); - tx_md.end_of_burst = true; - try { - tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); - } catch (...) { - } if (stop_signal_called) break; - // test ATR RX by transmitting and receiving for 1 second - std::cout << "\nTesting ATR full duplex output..." << std::flush; - rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS; - rx_stream->issue_stream_cmd(rx_cmd); - tx_md.start_of_burst = true; - tx_md.end_of_burst = false; - stop_time = std::chrono::steady_clock::now() + dwell_time; - while ( - not stop_signal_called and std::chrono::steady_clock::now() < stop_time) { + if (rx_stream and tx_stream) { + // test ATR full duplex by transmitting and receiving + std::cout << "\nTesting ATR full duplex output..." << std::flush; + rx_cmd.stream_mode = uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS; + rx_stream->issue_stream_cmd(rx_cmd); + tx_md.start_of_burst = true; + tx_md.end_of_burst = false; + stop_time = std::chrono::steady_clock::now() + dwell_time; + while (not stop_signal_called + and std::chrono::steady_clock::now() < stop_time) { + try { + tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); + tx_md.start_of_burst = false; + rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); + } catch (...) { + } + } + + // Read GPIO + rb = usrp->get_gpio_attr(gpio, "READBACK"); + + // Stop streaming + rx_stream->issue_stream_cmd( + uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); + tx_md.end_of_burst = true; try { tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); - tx_md.start_of_burst = false; + } catch (...) { + } + + // clear out any data left in the rx stream + try { rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); } catch (...) { } - } - rb = usrp->get_gpio_attr(gpio, "READBACK"); - expected = GPIO_BIT(3); - if ((rb & expected) != expected) { - ++failures; - std::cout << "fail:" << std::endl; - std::cout << "Bit 3 should be set, but is not" << std::endl; - } else { - std::cout << "pass:" << std::endl; - } - output_reg_values(gpio, usrp, num_bits); - rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); - tx_md.end_of_burst = true; - try { - tx_stream->send(tx_buffs, nsamps_per_buff, tx_md, timeout); - } catch (...) { - } - // clear out any data left in the rx stream - try { - rx_stream->recv(rx_buffs, nsamps_per_buff, rx_md, timeout); - } catch (...) { + + // Analyze results + expected = GPIO_BIT(3); + if ((rb & expected) != expected) { + ++failures; + std::cout << "fail:" << std::endl; + std::cout << "Bit 3 should be set, but is not" << std::endl; + } else { + std::cout << "pass:" << std::endl; + } + output_reg_values(gpio, usrp, num_bits); } std::cout << std::endl; |