| 1 | // Compile syntax:
|
|---|
| 2 | // > g++ spectrum_console.cpp -lboost_program_options-mt -loml2 -o spectrum_console
|
|---|
| 3 |
|
|---|
| 4 | //
|
|---|
| 5 | // Copyright 2010-2011 Ettus Research LLC
|
|---|
| 6 | //
|
|---|
| 7 | // This program is free software: you can redistribute it and/or modify
|
|---|
| 8 | // it under the terms of the GNU General Public License as published by
|
|---|
| 9 | // the Free Software Foundation, either version 3 of the License, or
|
|---|
| 10 | // (at your option) any later version.
|
|---|
| 11 | //
|
|---|
| 12 | // This program is distributed in the hope that it will be useful,
|
|---|
| 13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|---|
| 14 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|---|
| 15 | // GNU General Public License for more details.
|
|---|
| 16 | //
|
|---|
| 17 | // You should have received a copy of the GNU General Public License
|
|---|
| 18 | // along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|---|
| 19 | //
|
|---|
| 20 |
|
|---|
| 21 | #include <boost/program_options.hpp>
|
|---|
| 22 | #include <boost/thread/thread.hpp> //gets time
|
|---|
| 23 | //#include <boost/lexical_cast.hpp>
|
|---|
| 24 | #include <boost/format.hpp>
|
|---|
| 25 | #include <boost/algorithm/string.hpp>
|
|---|
| 26 | #include <iostream>
|
|---|
| 27 | #include <fstream>
|
|---|
| 28 | #include "fcntl.h"
|
|---|
| 29 | #include "unistd.h"
|
|---|
| 30 | //#include <time.h>
|
|---|
| 31 |
|
|---|
| 32 | namespace po = boost::program_options;
|
|---|
| 33 |
|
|---|
| 34 |
|
|---|
| 35 |
|
|---|
| 36 | bool xml_getElement(std::string element, std::string str, std::string &element_value)
|
|---|
| 37 | {
|
|---|
| 38 |
|
|---|
| 39 | std::string tag;
|
|---|
| 40 | size_t start_pos, end_pos;
|
|---|
| 41 |
|
|---|
| 42 | tag = "<"+element+">";
|
|---|
| 43 | start_pos = str.find(tag);
|
|---|
| 44 | if (start_pos == std::string::npos)
|
|---|
| 45 | return false;
|
|---|
| 46 |
|
|---|
| 47 | start_pos += tag.length();
|
|---|
| 48 |
|
|---|
| 49 | tag = "</"+element+">";
|
|---|
| 50 | end_pos = str.find(tag);
|
|---|
| 51 |
|
|---|
| 52 | element_value.assign (str, start_pos, end_pos-start_pos);
|
|---|
| 53 | return true;
|
|---|
| 54 |
|
|---|
| 55 | }
|
|---|
| 56 |
|
|---|
| 57 | int main(int argc, char *argv[]){
|
|---|
| 58 |
|
|---|
| 59 | //variables to be set by po
|
|---|
| 60 | std::string ant, subdev, ref, wave_type, freq, rate, oml_format;
|
|---|
| 61 | std::string gain, rx_node_name, num_bins, time_duration;
|
|---|
| 62 | double bw, wave_freq;
|
|---|
| 63 |
|
|---|
| 64 | FILE *fp_txusrp, *fp_rxusrp[20];
|
|---|
| 65 | char line[8192];
|
|---|
| 66 | std::string tx_cmd, rx_cmd;
|
|---|
| 67 |
|
|---|
| 68 | //setup the program options
|
|---|
| 69 | po::options_description desc("Allowed options");
|
|---|
| 70 | desc.add_options()
|
|---|
| 71 | ("help", "help message")
|
|---|
| 72 | ("node", po::value<std::string>(&rx_node_name)->default_value("node18-18"), "specify nodex-y. Use comma-delimited list for multiple nodes (no space): ex. node13-13,node18-18")
|
|---|
| 73 | ("freq", po::value<std::string>(&freq)->default_value("5e9"), "RF center frequency (CF) in Hz. Use a single value for same CF for all nodes OR a comma-delimited list (no space) to specify unique CF per node: 2.43e9,5.2e9")
|
|---|
| 74 |
|
|---|
| 75 | ("rate", po::value<std::string>(&rate)->default_value("16e6"), "rate of incoming samples (sps)")
|
|---|
| 76 | ("gain", po::value<std::string>(&gain)->default_value("15"), "gain for RF gain in dBm")
|
|---|
| 77 | //("ant", po::value<std::string>(&ant), "daughterboard antenna selection")
|
|---|
| 78 | //("subdev", po::value<std::string>(&subdev), "daughterboard subdevice specification")
|
|---|
| 79 | //("bw", po::value<double>(&bw), "daughterboard IF filter bandwidth in Hz")
|
|---|
| 80 | ("time", po::value<std::string>(&time_duration)->default_value("9999999"), "time duration to run for in seconds")
|
|---|
| 81 | ("oml", po::value<std::string>(&oml_format)->default_value("file"), "file - record values to oml text file on the node, oml:3003 - record values to oml server")
|
|---|
| 82 | ("num-bins", po::value<std::string>(&num_bins)->default_value("64"), "the number of FFT points")
|
|---|
| 83 | ;
|
|---|
| 84 |
|
|---|
| 85 | po::variables_map vm;
|
|---|
| 86 | po::store(po::parse_command_line(argc, argv, desc), vm);
|
|---|
| 87 | po::notify(vm);
|
|---|
| 88 |
|
|---|
| 89 | //print the help message
|
|---|
| 90 | if (vm.count("help")){
|
|---|
| 91 | std::cout << boost::format("%s") % desc << std::endl;
|
|---|
| 92 | return ~0;
|
|---|
| 93 | }
|
|---|
| 94 |
|
|---|
| 95 | // Split rx node names and freq into list
|
|---|
| 96 | std::vector<std::string> node_list;
|
|---|
| 97 | std::vector<std::string> freq_list;
|
|---|
| 98 | boost::split(node_list, rx_node_name, boost::is_any_of(",") );
|
|---|
| 99 | boost::split(freq_list, freq, boost::is_any_of(",") );
|
|---|
| 100 |
|
|---|
| 101 | // Error check node and freq list
|
|---|
| 102 | if (freq_list.size() > node_list.size() )
|
|---|
| 103 | {
|
|---|
| 104 | std::cout << "ERR: frequency list is greater than node list" << std::endl;
|
|---|
| 105 | return ~0;
|
|---|
| 106 | }
|
|---|
| 107 |
|
|---|
| 108 | if (freq_list.size() == 1)
|
|---|
| 109 | {
|
|---|
| 110 | freq_list.resize( node_list.size() );
|
|---|
| 111 | for (int i = 0 ; i < freq_list.size(); freq_list.at(i) = freq , ++i );
|
|---|
| 112 | }
|
|---|
| 113 |
|
|---|
| 114 | //for (int i=0; i < node_list.size(); std::cout << node_list.at(i) << std::endl, i++)
|
|---|
| 115 |
|
|---|
| 116 | for (int i = 0 ; i < node_list.size() ; i++)
|
|---|
| 117 | {
|
|---|
| 118 | rx_node_name = node_list.at(i);
|
|---|
| 119 | freq = freq_list.at(i);
|
|---|
| 120 | rx_cmd = " ssh root@" + rx_node_name + " \"/root/uhd/host/build/examples/spectrum";
|
|---|
| 121 | rx_cmd += " --freq " + freq;
|
|---|
| 122 | rx_cmd += " --rate " + rate;
|
|---|
| 123 | rx_cmd += " --num-bins " + num_bins;
|
|---|
| 124 | rx_cmd += " --gain " + gain;
|
|---|
| 125 | rx_cmd += " --time " + time_duration;
|
|---|
| 126 | rx_cmd += " --oml " + oml_format;
|
|---|
| 127 | rx_cmd += " \"";
|
|---|
| 128 |
|
|---|
| 129 | //printf("%s\n", rx_cmd.c_str());
|
|---|
| 130 |
|
|---|
| 131 | /* Open the command for reading. */
|
|---|
| 132 | fp_rxusrp[i] = popen( rx_cmd.c_str(), "r");
|
|---|
| 133 | if (fp_rxusrp == NULL) {
|
|---|
| 134 | std::cout << "Failed to run rx_peakpower\n";
|
|---|
| 135 | exit;
|
|---|
| 136 | }
|
|---|
| 137 | //fcntl(fileno(fp_rxusrp[i]), F_SETFL, O_NONBLOCK);
|
|---|
| 138 | } // end for-loop
|
|---|
| 139 |
|
|---|
| 140 | // Give application some time to set up
|
|---|
| 141 | sleep(3);
|
|---|
| 142 |
|
|---|
| 143 | /* Read the output a line at a time - output it. */
|
|---|
| 144 | while ( fgets(line, sizeof(line)-1, fp_rxusrp[0]) != NULL ) {
|
|---|
| 145 | std::string str(line);
|
|---|
| 146 | std::cout << "["<<rx_node_name<<"]" << str;
|
|---|
| 147 | }
|
|---|
| 148 |
|
|---|
| 149 |
|
|---|
| 150 | for (int i = 0 ; i < node_list.size() ; i++)
|
|---|
| 151 | {
|
|---|
| 152 | pclose(fp_rxusrp[i]);
|
|---|
| 153 | }
|
|---|
| 154 |
|
|---|
| 155 |
|
|---|
| 156 | std::cout << std::endl << "Done!" << std::endl << std::endl;
|
|---|
| 157 |
|
|---|
| 158 | return 0;
|
|---|
| 159 | }
|
|---|
| 160 |
|
|---|
| 161 |
|
|---|