diff options
| -rw-r--r-- | host/examples/rx_timed_samples.cpp | 9 | ||||
| -rw-r--r-- | host/include/uhd/types/device_addr.hpp | 20 | ||||
| -rw-r--r-- | host/include/uhd/usrp/simple_usrp.hpp | 47 | ||||
| -rw-r--r-- | host/lib/types.cpp | 46 | ||||
| -rw-r--r-- | host/lib/usrp/simple_usrp.cpp | 39 | ||||
| -rw-r--r-- | host/test/addr_test.cpp | 2 | ||||
| -rw-r--r-- | host/utils/uhd_find_devices.cpp | 14 | 
7 files changed, 116 insertions, 61 deletions
| diff --git a/host/examples/rx_timed_samples.cpp b/host/examples/rx_timed_samples.cpp index d49f7d182..4b8774036 100644 --- a/host/examples/rx_timed_samples.cpp +++ b/host/examples/rx_timed_samples.cpp @@ -26,7 +26,7 @@ namespace po = boost::program_options;  int UHD_SAFE_MAIN(int argc, char *argv[]){      //variables to be set by po -    std::string transport_args; +    std::string args;      int seconds_in_future;      size_t total_num_samps;      double rx_rate; @@ -35,7 +35,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){      po::options_description desc("Allowed options");      desc.add_options()          ("help", "help message") -        ("args", po::value<std::string>(&transport_args)->default_value(""), "simple uhd transport args") +        ("args", po::value<std::string>(&args)->default_value(""), "simple uhd device address args")          ("secs", po::value<int>(&seconds_in_future)->default_value(3), "number of seconds in the future to receive")          ("nsamps", po::value<size_t>(&total_num_samps)->default_value(1000), "total number of samples to receive")          ("rxrate", po::value<double>(&rx_rate)->default_value(100e6/16), "rate of incoming samples") @@ -52,9 +52,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){      //create a usrp device      std::cout << std::endl; -    std::cout << boost::format("Creating the usrp device with: %s...") -        % transport_args << std::endl; -    uhd::usrp::simple_usrp::sptr sdev = uhd::usrp::simple_usrp::make(transport_args); +    std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl; +    uhd::usrp::simple_usrp::sptr sdev = uhd::usrp::simple_usrp::make(args);      uhd::device::sptr dev = sdev->get_device();      std::cout << boost::format("Using Device: %s") % sdev->get_name() << std::endl; diff --git a/host/include/uhd/types/device_addr.hpp b/host/include/uhd/types/device_addr.hpp index f5dd9371c..e8da2a1ab 100644 --- a/host/include/uhd/types/device_addr.hpp +++ b/host/include/uhd/types/device_addr.hpp @@ -32,13 +32,23 @@ namespace uhd{       *       * To narrow down the discovery process to a particular device,       * specify a transport key/value pair specific to your device. -     * Ex, to find a usrp2: my_dev_addr["addr"] = [resolvable_hostname_or_ip] +     * - Ex, to find a usrp2: my_dev_addr["addr"] = [resolvable_hostname_or_ip]       *       * The device address can also be used to pass arguments into       * the transport layer control to set (for example) buffer sizes. +     * +     * An arguments string, is a way to represent a device address +     * using a single string with delimiter characters. +     * - Ex: addr=192.168.10.2 +     * - Ex: addr=192.168.10.2, rx_buff_size=1e6       */      class UHD_API device_addr_t : public dict<std::string, std::string>{      public: +        /*! +         * Create a device address from an args string. +         * \param args the arguments string +         */ +        device_addr_t(const std::string &args = "");          /*!           * Convert a device address into a printable string. @@ -52,14 +62,6 @@ namespace uhd{           * \return a string with delimiter markup           */          std::string to_args_str(void) const; - -        /*! -         * Make a device address from an args string. -         * The args string contains delimiter symbols. -         * \param args_str the arguments string -         * \return the new device address -         */ -        static device_addr_t from_args_str(const std::string &args_str);      };      //handy typedef for a vector of device addresses diff --git a/host/include/uhd/usrp/simple_usrp.hpp b/host/include/uhd/usrp/simple_usrp.hpp index c4e0338f7..e3f181ec3 100644 --- a/host/include/uhd/usrp/simple_usrp.hpp +++ b/host/include/uhd/usrp/simple_usrp.hpp @@ -39,18 +39,63 @@ namespace uhd{ namespace usrp{  class UHD_API simple_usrp : boost::noncopyable{  public:      typedef boost::shared_ptr<simple_usrp> sptr; -    static sptr make(const std::string &args); +    /*! +     * Make a new simple usrp from the device address. +     * \param dev_addr the device address +     * \return a new simple usrp object +     */ +    static sptr make(const device_addr_t &dev_addr); + +    /*! +     * Get the underlying device object. +     * This is needed to get access to the streaming API and properties. +     * \return the device object within this simple usrp +     */      virtual device::sptr get_device(void) = 0; +    /*! +     * Get a printable name for this simple usrp. +     * \return a printable string +     */      virtual std::string get_name(void) = 0;      /*******************************************************************       * Misc       ******************************************************************/ +    /*! +     * Sets the time registers on the usrp immediately. +     * \param time_spec the time to latch into the usrp device +     */      virtual void set_time_now(const time_spec_t &time_spec) = 0; + +    /*! +     * Set the time registers on the usrp at the next pps tick. +     * The values will not be latched in until the pulse occurs. +     * It is recommended that the user sleep(1) after calling to ensure +     * that the time registers will be in a known state prior to use. +     * +     * Note: Because this call sets the time on the "next" pps, +     * the seconds in the time spec should be current seconds + 1. +     * +     * \param time_spec the time to latch into the usrp device +     */      virtual void set_time_next_pps(const time_spec_t &time_spec) = 0; + +    /*! +     * Issue a stream command to the usrp device. +     * This tells the usrp to send samples into the host. +     * See the documentation for stream_cmd_t for more info. +     * \param stream_cmd the stream command to issue +     */      virtual void issue_stream_cmd(const stream_cmd_t &stream_cmd) = 0; + +    /*! +     * Set the clock configuration for the usrp device. +     * This tells the usrp how to get a 10Mhz reference and PPS clock. +     * See the documentation for clock_config_t for more info. +     * \param clock_config the clock configuration to set +     */      virtual void set_clock_config(const clock_config_t &clock_config) = 0;      /******************************************************************* diff --git a/host/lib/types.cpp b/host/lib/types.cpp index 2a687f34f..91887840c 100644 --- a/host/lib/types.cpp +++ b/host/lib/types.cpp @@ -119,46 +119,44 @@ void time_spec_t::set_ticks(boost::uint32_t ticks, double tick_rate){  /***********************************************************************   * device addr   **********************************************************************/ -std::string device_addr_t::to_string(void) const{ -    std::stringstream ss; -    BOOST_FOREACH(std::string key, this->keys()){ -        ss << boost::format("%s: %s") % key % (*this)[key] << std::endl; -    } -    return ss.str(); -} - -static const std::string arg_delim = ";"; +static const std::string arg_delim = ",";  static const std::string pair_delim = "=";  static std::string trim(const std::string &in){      return boost::algorithm::trim_copy(in);  } -std::string device_addr_t::to_args_str(void) const{ -    std::string args_str; -    BOOST_FOREACH(const std::string &key, this->keys()){ -        args_str += key + pair_delim + (*this)[key] + arg_delim; -    } -    return args_str; -} - -device_addr_t device_addr_t::from_args_str(const std::string &args_str){ -    device_addr_t addr; - +device_addr_t::device_addr_t(const std::string &args){      //split the args at the semi-colons      std::vector<std::string> pairs; -    boost::split(pairs, args_str, boost::is_any_of(arg_delim)); +    boost::split(pairs, args, boost::is_any_of(arg_delim));      BOOST_FOREACH(const std::string &pair, pairs){          if (trim(pair) == "") continue;          //split the key value pairs at the equals          std::vector<std::string> key_val;          boost::split(key_val, pair, boost::is_any_of(pair_delim)); -        if (key_val.size() != 2) throw std::runtime_error("invalid args string: "+args_str); -        addr[trim(key_val[0])] = trim(key_val[1]); +        if (key_val.size() != 2) throw std::runtime_error("invalid args string: "+args); +        (*this)[trim(key_val[0])] = trim(key_val[1]);      } +} + +std::string device_addr_t::to_string(void) const{ +    if (this->size() == 0) return "Empty Device Address"; + +    std::stringstream ss; +    BOOST_FOREACH(std::string key, this->keys()){ +        ss << boost::format("%s: %s") % key % (*this)[key] << std::endl; +    } +    return ss.str(); +} -    return addr; +std::string device_addr_t::to_args_str(void) const{ +    std::string args_str; +    BOOST_FOREACH(const std::string &key, this->keys()){ +        args_str += key + pair_delim + (*this)[key] + arg_delim; +    } +    return args_str;  }  /*********************************************************************** diff --git a/host/lib/usrp/simple_usrp.cpp b/host/lib/usrp/simple_usrp.cpp index 11ee3a798..321d66a4a 100644 --- a/host/lib/usrp/simple_usrp.cpp +++ b/host/lib/usrp/simple_usrp.cpp @@ -42,14 +42,14 @@ public:          _tx_dsp = _mboard[MBOARD_PROP_TX_DSP];          //extract rx subdevice -        wax::obj rx_dboard = _mboard[MBOARD_PROP_RX_DBOARD]; -        std::string rx_subdev_in_use = rx_dboard[DBOARD_PROP_USED_SUBDEVS].as<prop_names_t>().at(0); -        _rx_subdev = rx_dboard[named_prop_t(DBOARD_PROP_SUBDEV, rx_subdev_in_use)]; +        _rx_dboard = _mboard[MBOARD_PROP_RX_DBOARD]; +        std::string rx_subdev_in_use = _rx_dboard[DBOARD_PROP_USED_SUBDEVS].as<prop_names_t>().at(0); +        _rx_subdev = _rx_dboard[named_prop_t(DBOARD_PROP_SUBDEV, rx_subdev_in_use)];          //extract tx subdevice -        wax::obj tx_dboard = _mboard[MBOARD_PROP_TX_DBOARD]; -        std::string tx_subdev_in_use = tx_dboard[DBOARD_PROP_USED_SUBDEVS].as<prop_names_t>().at(0); -        _tx_subdev = tx_dboard[named_prop_t(DBOARD_PROP_SUBDEV, tx_subdev_in_use)]; +        _tx_dboard = _mboard[MBOARD_PROP_TX_DBOARD]; +        std::string tx_subdev_in_use = _tx_dboard[DBOARD_PROP_USED_SUBDEVS].as<prop_names_t>().at(0); +        _tx_subdev = _tx_dboard[named_prop_t(DBOARD_PROP_SUBDEV, tx_subdev_in_use)];      }      ~simple_usrp_impl(void){ @@ -61,7 +61,26 @@ public:      }      std::string get_name(void){ -        return _mboard[MBOARD_PROP_NAME].as<std::string>(); +        return str(boost::format( +            "Simple USRP:\n" +            "  Device: %s\n" +            "  Mboard: %s\n" +            "  RX DSP: %s\n" +            "  RX Dboard: %s\n" +            "  RX Subdev: %s\n" +            "  TX DSP: %s\n" +            "  TX Dboard: %s\n" +            "  TX Subdev: %s\n" +        ) +            % (*_dev)[DEVICE_PROP_NAME].as<std::string>() +            % _mboard[MBOARD_PROP_NAME].as<std::string>() +            % _rx_dsp[DSP_PROP_NAME].as<std::string>() +            % _rx_dboard[DBOARD_PROP_NAME].as<std::string>() +            % _rx_subdev[SUBDEV_PROP_NAME].as<std::string>() +            % _tx_dsp[DSP_PROP_NAME].as<std::string>() +            % _tx_dboard[DBOARD_PROP_NAME].as<std::string>() +            % _tx_subdev[SUBDEV_PROP_NAME].as<std::string>() +        );      }      /******************************************************************* @@ -174,6 +193,8 @@ private:      wax::obj _mboard;      wax::obj _rx_dsp;      wax::obj _tx_dsp; +    wax::obj _rx_dboard; +    wax::obj _tx_dboard;      wax::obj _rx_subdev;      wax::obj _tx_subdev;  }; @@ -181,6 +202,6 @@ private:  /***********************************************************************   * The Make Function   **********************************************************************/ -simple_usrp::sptr simple_usrp::make(const std::string &args){ -    return sptr(new simple_usrp_impl(device_addr_t::from_args_str(args))); +simple_usrp::sptr simple_usrp::make(const device_addr_t &dev_addr){ +    return sptr(new simple_usrp_impl(dev_addr));  } diff --git a/host/test/addr_test.cpp b/host/test/addr_test.cpp index 2ec6de14b..93b7cc0df 100644 --- a/host/test/addr_test.cpp +++ b/host/test/addr_test.cpp @@ -44,7 +44,7 @@ BOOST_AUTO_TEST_CASE(test_device_addr){      std::cout << "Pretty Print: " << std::endl << dev_addr.to_string();      std::string args_str = dev_addr.to_args_str();      std::cout << "Args String: " << args_str << std::endl; -    uhd::device_addr_t new_dev_addr = uhd::device_addr_t::from_args_str(args_str); +    uhd::device_addr_t new_dev_addr(args_str);      //they should be the same size      BOOST_CHECK_EQUAL(dev_addr.size(), new_dev_addr.size()); diff --git a/host/utils/uhd_find_devices.cpp b/host/utils/uhd_find_devices.cpp index 6c945cbca..8222dc1f4 100644 --- a/host/utils/uhd_find_devices.cpp +++ b/host/utils/uhd_find_devices.cpp @@ -27,8 +27,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){      po::options_description desc("Allowed options");      desc.add_options()          ("help", "help message") -        ("addr", po::value<std::string>(), "resolvable network address") -        ("node", po::value<std::string>(), "path to linux device node") +        ("args", po::value<std::string>()->default_value(""), "device address args")      ;      po::variables_map vm; @@ -41,17 +40,8 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){          return ~0;      } -    //load the options into the address -    uhd::device_addr_t device_addr; -    if (vm.count("addr")){ -        device_addr["addr"] = vm["addr"].as<std::string>(); -    } -    if (vm.count("node")){ -        device_addr["node"] = vm["node"].as<std::string>(); -    } -      //discover the usrps and print the results -    uhd::device_addrs_t device_addrs = uhd::device::find(device_addr); +    uhd::device_addrs_t device_addrs = uhd::device::find(vm["args"].as<std::string>());      if (device_addrs.size() == 0){          std::cerr << "No UHD Devices Found" << std::endl; | 
