diff options
author | Martin Braun <martin.braun@ettus.com> | 2018-01-11 17:09:06 -0800 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2018-01-12 16:18:01 -0800 |
commit | b3e0f60a7b41359e8f7806dc77c402468bf7f444 (patch) | |
tree | 3f7563056f171db2c92612b91a72a6d58acc4fa4 /host/examples | |
parent | 1821168103e8354ecf56ed823147e712e3af32dd (diff) | |
download | uhd-b3e0f60a7b41359e8f7806dc77c402468bf7f444.tar.gz uhd-b3e0f60a7b41359e8f7806dc77c402468bf7f444.tar.bz2 uhd-b3e0f60a7b41359e8f7806dc77c402468bf7f444.zip |
examples: Add example to query and list all sensors
Reviewed-by: Brent Stapleton <brent.stapleton@ettus.com>
Diffstat (limited to 'host/examples')
-rw-r--r-- | host/examples/CMakeLists.txt | 1 | ||||
-rw-r--r-- | host/examples/usrp_list_sensors.cpp | 126 |
2 files changed, 127 insertions, 0 deletions
diff --git a/host/examples/CMakeLists.txt b/host/examples/CMakeLists.txt index ff267664d..e4e478316 100644 --- a/host/examples/CMakeLists.txt +++ b/host/examples/CMakeLists.txt @@ -23,6 +23,7 @@ SET(example_sources tx_timed_samples.cpp tx_waveforms.cpp txrx_loopback_to_file.cpp + usrp_list_sensors.cpp latency_test.cpp gpio.cpp sync_to_gps.cpp diff --git a/host/examples/usrp_list_sensors.cpp b/host/examples/usrp_list_sensors.cpp new file mode 100644 index 000000000..bd2d5368c --- /dev/null +++ b/host/examples/usrp_list_sensors.cpp @@ -0,0 +1,126 @@ +// +// Copyright 2018 Ettus Research, a National Instruments Company +// +// SPDX-License-Identifier: GPL-3.0 +// + +#include <uhd/usrp/multi_usrp.hpp> +#include <uhd/utils/safe_main.hpp> +#include <boost/program_options.hpp> +#include <boost/algorithm/string.hpp> //for split +#include <iostream> +#include <sstream> + +namespace po = boost::program_options; + +namespace { + std::string make_border(const std::string &text) + { + std::stringstream ss; + ss << " _____________________________________________________\n"; + ss << " /" << std::endl; + std::vector<std::string> lines; + boost::split(lines, text, boost::is_any_of("\n")); + while (lines.back().empty()) { + lines.pop_back(); //strip trailing newlines + } + if (not lines.empty()) { + lines[0] = " " + lines[0]; //indent the title line + } + for (const std::string& line : lines) + { + ss << "| " << line << std::endl; + } + return ss.str(); + } +} + +using namespace uhd::usrp; + +std::string db_sensors_string( + const std::string& tx_rx, + multi_usrp::sptr usrp, + const size_t mb_idx +) { + std::stringstream ss; + + ss << tx_rx << " Sensors: \n" << std::endl; + const size_t num_chans = (tx_rx == "RX") + ? usrp->get_rx_subdev_spec(mb_idx).size() + : usrp->get_tx_subdev_spec(mb_idx).size() + ; + + for (size_t chan_idx = 0; chan_idx < num_chans; chan_idx++) { + ss << "Chan " << chan_idx << ": " << std::endl; + const auto sensors = (tx_rx == "RX") + ? usrp->get_rx_sensor_names(chan_idx) + : usrp->get_tx_sensor_names(chan_idx); + for (const auto& sensor : sensors) { + const auto sensor_value = (tx_rx == "RX") + ? usrp->get_rx_sensor(sensor, chan_idx) + : usrp->get_tx_sensor(sensor, chan_idx) + ; + ss << "* " << sensor_value.to_pp_string() << std::endl; + } + ss << std::endl; + } + + return ss.str(); +} + +std::string mboard_sensors_string(multi_usrp::sptr usrp, const size_t mb_idx) +{ + std::stringstream ss; + ss << "Sensors for motherboard " << mb_idx << ": \n" << std::endl; + const auto mboard_sensors = usrp->get_mboard_sensor_names(mb_idx); + for (const auto& mboard_sensor : mboard_sensors) { + const auto sensor_value = + usrp->get_mboard_sensor(mboard_sensor, mb_idx); + ss << "* " << sensor_value.to_pp_string() << std::endl; + } + ss << make_border(db_sensors_string("RX", usrp, mb_idx)) << std::endl; + ss << make_border(db_sensors_string("TX", usrp, mb_idx)) << std::endl; + + return ss.str(); +} + +int UHD_SAFE_MAIN(int argc, char *argv[]){ + + // Variables to be set by command line options + std::string usrp_args; + + // Set up program options + po::options_description desc("Allowed options"); + desc.add_options() + ("help", "Display this help message") + ("args", po::value<std::string>(&usrp_args), "USRP device arguments") + ; + po::variables_map vm; + po::store(po::parse_command_line(argc, argv, desc), vm); + po::notify(vm); + + // Print the help message + if (vm.count("help")){ + std::cout << std::endl << "Print sensor values" + << std::endl << std::endl; + std::cout << "This example shows how to query sensors from" + << "a USRP device.\n" << std::endl; + std::cout << desc << std::endl; + return EXIT_SUCCESS; + } + + // Create a Multi-USRP device + std::cout << "\nCreating the USRP device with: " << usrp_args << std::endl; + multi_usrp::sptr usrp = multi_usrp::make(usrp_args); + + const size_t num_mboards = usrp->get_num_mboards(); + std::cout << "Device contains " << num_mboards + << " motherboard(s)." << std::endl << std::endl; + + for (size_t mboard_idx = 0; mboard_idx < num_mboards; mboard_idx++) { + std::cout << make_border(mboard_sensors_string(usrp, mboard_idx)) + << std::endl; + } + + return EXIT_SUCCESS; +} |