diff options
| author | Josh Blum <josh@joshknows.com> | 2010-05-03 01:20:11 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-05-03 01:20:11 -0700 | 
| commit | 4d5df2376b204afb724684d0d864ce0d93fe83fb (patch) | |
| tree | c0552615c8f51eb89c3214c8fed7105387264cae /host/lib | |
| parent | fd0d9b7dcca13b4d8a4e1912682f58eb6b6ab634 (diff) | |
| download | uhd-4d5df2376b204afb724684d0d864ce0d93fe83fb.tar.gz uhd-4d5df2376b204afb724684d0d864ce0d93fe83fb.tar.bz2 uhd-4d5df2376b204afb724684d0d864ce0d93fe83fb.zip | |
Expanded the dboard id API to create dboard id types from strings and ints.
And created utility functions to go between representations.
Created to_pp_string for pretty print strings for dboard ids and device addrs.
Minor changes to the various classes that call these utilities.
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | host/lib/device.cpp | 4 | ||||
| -rw-r--r-- | host/lib/types.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_basic_and_lf.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_rfx.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_xcvr2450.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_base.cpp | 16 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_eeprom.cpp | 13 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_id.cpp | 68 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_manager.cpp | 23 | 
10 files changed, 108 insertions, 35 deletions
| diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt index 5252eda8f..47080a4e0 100644 --- a/host/lib/CMakeLists.txt +++ b/host/lib/CMakeLists.txt @@ -57,8 +57,9 @@ SET(libuhd_sources      transport/udp_simple.cpp      usrp/dboard_base.cpp      usrp/dboard_eeprom.cpp -    usrp/simple_usrp.cpp +    usrp/dboard_id.cpp      usrp/dboard_manager.cpp +    usrp/simple_usrp.cpp      usrp/tune_helper.cpp  ) diff --git a/host/lib/device.cpp b/host/lib/device.cpp index 88bd2cff4..f139ecb20 100644 --- a/host/lib/device.cpp +++ b/host/lib/device.cpp @@ -105,14 +105,14 @@ device::sptr device::make(const device_addr_t &hint, size_t which){      //check that we found any devices      if (dev_addr_makers.size() == 0){          throw std::runtime_error(str( -            boost::format("No devices found for ----->\n%s") % hint.to_string() +            boost::format("No devices found for ----->\n%s") % hint.to_pp_string()          ));      }      //check that the which index is valid      if (dev_addr_makers.size() <= which){          throw std::runtime_error(str( -            boost::format("No device at index %d for ----->\n%s") % which % hint.to_string() +            boost::format("No device at index %d for ----->\n%s") % which % hint.to_pp_string()          ));      } diff --git a/host/lib/types.cpp b/host/lib/types.cpp index 14f7651d4..ec9c8ac01 100644 --- a/host/lib/types.cpp +++ b/host/lib/types.cpp @@ -143,7 +143,7 @@ device_addr_t::device_addr_t(const std::string &args){      }  } -std::string device_addr_t::to_string(void) const{ +std::string device_addr_t::to_pp_string(void) const{      if (this->size() == 0) return "Empty Device Address";      std::stringstream ss; @@ -153,7 +153,7 @@ std::string device_addr_t::to_string(void) const{      return ss.str();  } -std::string device_addr_t::to_args_str(void) const{ +std::string device_addr_t::to_string(void) const{      std::string args_str;      BOOST_FOREACH(const std::string &key, this->keys()){          args_str += key + pair_delim + (*this)[key] + arg_delim; diff --git a/host/lib/usrp/dboard/db_basic_and_lf.cpp b/host/lib/usrp/dboard/db_basic_and_lf.cpp index ebe3b2616..23ac98872 100644 --- a/host/lib/usrp/dboard/db_basic_and_lf.cpp +++ b/host/lib/usrp/dboard/db_basic_and_lf.cpp @@ -101,7 +101,7 @@ void basic_rx::rx_get(const wax::obj &key_, wax::obj &val){      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME:          val = std::string(str(boost::format("%s - %s") -            % dboard_id::to_string(get_rx_id()) +            % get_rx_id().to_pp_string()              % get_subdev_name()          ));          return; @@ -202,7 +202,7 @@ void basic_tx::tx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_tx_id()); +        val = get_tx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: diff --git a/host/lib/usrp/dboard/db_rfx.cpp b/host/lib/usrp/dboard/db_rfx.cpp index 07159cd09..bbc9716b1 100644 --- a/host/lib/usrp/dboard/db_rfx.cpp +++ b/host/lib/usrp/dboard/db_rfx.cpp @@ -351,7 +351,7 @@ void rfx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_rx_id()); +        val = get_rx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: @@ -448,7 +448,7 @@ void rfx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_tx_id()); +        val = get_tx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: diff --git a/host/lib/usrp/dboard/db_xcvr2450.cpp b/host/lib/usrp/dboard/db_xcvr2450.cpp index 9b0fcbc5c..3bf866fc8 100644 --- a/host/lib/usrp/dboard/db_xcvr2450.cpp +++ b/host/lib/usrp/dboard/db_xcvr2450.cpp @@ -444,7 +444,7 @@ void xcvr2450::rx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_rx_id()); +        val = get_rx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: @@ -542,7 +542,7 @@ void xcvr2450::tx_get(const wax::obj &key_, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){      case SUBDEV_PROP_NAME: -        val = dboard_id::to_string(get_tx_id()); +        val = get_tx_id().to_pp_string();          return;      case SUBDEV_PROP_OTHERS: diff --git a/host/lib/usrp/dboard_base.cpp b/host/lib/usrp/dboard_base.cpp index 523da696a..bd4b37ef3 100644 --- a/host/lib/usrp/dboard_base.cpp +++ b/host/lib/usrp/dboard_base.cpp @@ -58,15 +58,15 @@ dboard_id_t dboard_base::get_tx_id(void){   * xcvr dboard dboard_base class   **********************************************************************/  xcvr_dboard_base::xcvr_dboard_base(ctor_args_t args) : dboard_base(args){ -    if (get_rx_id() == dboard_id::NONE){ +    if (get_rx_id() == dboard_id_t::none()){          throw std::runtime_error(str(boost::format(              "cannot create xcvr board when the rx id is \"%s\"" -        ) % dboard_id::to_string(dboard_id::NONE))); +        ) % dboard_id_t::none().to_pp_string()));      } -    if (get_tx_id() == dboard_id::NONE){ +    if (get_tx_id() == dboard_id_t::none()){          throw std::runtime_error(str(boost::format(              "cannot create xcvr board when the tx id is \"%s\"" -        ) % dboard_id::to_string(dboard_id::NONE))); +        ) % dboard_id_t::none().to_pp_string()));      }  } @@ -78,11 +78,11 @@ xcvr_dboard_base::~xcvr_dboard_base(void){   * rx dboard dboard_base class   **********************************************************************/  rx_dboard_base::rx_dboard_base(ctor_args_t args) : dboard_base(args){ -    if (get_tx_id() != dboard_id::NONE){ +    if (get_tx_id() != dboard_id_t::none()){          throw std::runtime_error(str(boost::format(              "cannot create rx board when the tx id is \"%s\""              " -> expected a tx id of \"%s\"" -        ) % dboard_id::to_string(get_tx_id()) % dboard_id::to_string(dboard_id::NONE))); +        ) % get_tx_id().to_pp_string() % dboard_id_t::none().to_pp_string()));      }  } @@ -102,11 +102,11 @@ void rx_dboard_base::tx_set(const wax::obj &, const wax::obj &){   * tx dboard dboard_base class   **********************************************************************/  tx_dboard_base::tx_dboard_base(ctor_args_t args) : dboard_base(args){ -    if (get_rx_id() != dboard_id::NONE){ +    if (get_rx_id() != dboard_id_t::none()){          throw std::runtime_error(str(boost::format(              "cannot create tx board when the rx id is \"%s\""              " -> expected a rx id of \"%s\"" -        ) % dboard_id::to_string(get_rx_id()) % dboard_id::to_string(dboard_id::NONE))); +        ) % get_rx_id().to_pp_string() % dboard_id_t::none().to_pp_string()));      }  } diff --git a/host/lib/usrp/dboard_eeprom.cpp b/host/lib/usrp/dboard_eeprom.cpp index 54e7a4fd9..fa3631948 100644 --- a/host/lib/usrp/dboard_eeprom.cpp +++ b/host/lib/usrp/dboard_eeprom.cpp @@ -80,19 +80,20 @@ dboard_eeprom_t::dboard_eeprom_t(const byte_vector_t &bytes){          UHD_ASSERT_THROW(bytes.size() >= DB_EEPROM_CLEN);          UHD_ASSERT_THROW(bytes[DB_EEPROM_MAGIC] == DB_EEPROM_MAGIC_VALUE);          UHD_ASSERT_THROW(bytes[DB_EEPROM_CHKSUM] == checksum(bytes)); -        id = \ -            (boost::uint16_t(bytes[DB_EEPROM_ID_LSB]) << 0) | -            (boost::uint16_t(bytes[DB_EEPROM_ID_MSB]) << 8) ; +        id = dboard_id_t::from_uint16(0 +            | (boost::uint16_t(bytes[DB_EEPROM_ID_LSB]) << 0) +            | (boost::uint16_t(bytes[DB_EEPROM_ID_MSB]) << 8) +        );      }catch(const uhd::assert_error &){ -        id = dboard_id::NONE; +        id = dboard_id_t::none();      }  }  byte_vector_t dboard_eeprom_t::get_eeprom_bytes(void){      byte_vector_t bytes(DB_EEPROM_CLEN, 0); //defaults to all zeros      bytes[DB_EEPROM_MAGIC] = DB_EEPROM_MAGIC_VALUE; -    bytes[DB_EEPROM_ID_LSB] = boost::uint8_t(id >> 0); -    bytes[DB_EEPROM_ID_MSB] = boost::uint8_t(id >> 8); +    bytes[DB_EEPROM_ID_LSB] = boost::uint8_t(id.to_uint16() >> 0); +    bytes[DB_EEPROM_ID_MSB] = boost::uint8_t(id.to_uint16() >> 8);      bytes[DB_EEPROM_CHKSUM] = checksum(bytes);      return bytes;  } diff --git a/host/lib/usrp/dboard_id.cpp b/host/lib/usrp/dboard_id.cpp new file mode 100644 index 000000000..3028d2a3b --- /dev/null +++ b/host/lib/usrp/dboard_id.cpp @@ -0,0 +1,68 @@ +// +// Copyright 2010 Ettus Research LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#include <uhd/usrp/dboard_id.hpp> +#include <boost/lexical_cast.hpp> +#include <boost/format.hpp> +#include <sstream> +#include <iostream> + +using namespace uhd::usrp; + +dboard_id_t::dboard_id_t(boost::uint16_t id){ +    _id = id; +} + +dboard_id_t dboard_id_t::none(void){ +    return dboard_id_t(); +} + +dboard_id_t dboard_id_t::from_uint16(boost::uint16_t uint16){ +    return dboard_id_t(uint16); +} + +boost::uint16_t dboard_id_t::to_uint16(void) const{ +    return _id; +} + +//used with lexical cast to parse a hex string +template <class T> struct to_hex{ +    T value; +    operator T() const {return value;} +    friend std::istream& operator>>(std::istream& in, to_hex& out){ +        in >> std::hex >> out.value; +        return in; +    } +}; + +dboard_id_t dboard_id_t::from_string(const std::string &string){ +    if (string.substr(0, 2) == "0x"){ +        return dboard_id_t::from_uint16(boost::lexical_cast<to_hex<boost::uint16_t> >(string)); +    } +    return dboard_id_t::from_uint16(boost::lexical_cast<boost::uint16_t>(string)); +} + +std::string dboard_id_t::to_string(void) const{ +    return str(boost::format("0x%04x") % this->to_uint16()); +} + +//Note: to_pp_string is implemented in the dboard manager +//because it needs access to the dboard registration table + +bool uhd::usrp::operator==(const dboard_id_t &lhs, const dboard_id_t &rhs){ +    return lhs.to_uint16() == rhs.to_uint16(); +} diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp index 80bf2dccb..4f5d0a473 100644 --- a/host/lib/usrp/dboard_manager.cpp +++ b/host/lib/usrp/dboard_manager.cpp @@ -51,15 +51,18 @@ void dboard_manager::register_dboard(      //std::cout << "registering: " << name << std::endl;      if (get_id_to_args_map().has_key(dboard_id)){          throw std::runtime_error(str(boost::format( -            "The dboard id 0x%04x is already registered to %s." -        ) % dboard_id % dboard_id::to_string(dboard_id))); +            "The dboard id %s is already registered to %s." +        ) % dboard_id.to_string() % dboard_id.to_pp_string()));      }      get_id_to_args_map()[dboard_id] = args_t(dboard_ctor, name, subdev_names);  } -std::string dboard_id::to_string(const dboard_id_t &id){ -    std::string name = (get_id_to_args_map().has_key(id))? get_id_to_args_map()[id].get<1>() : "unknown"; -    return str(boost::format("%s (0x%04x)") % name % id); +std::string dboard_id_t::to_pp_string(void) const{ +    std::string name = "unknown"; +    if (get_id_to_args_map().has_key(*this)){ +        name = get_id_to_args_map()[*this].get<1>(); +    } +    return str(boost::format("%s (%s)") % name % this->to_string());  }  /*********************************************************************** @@ -168,11 +171,11 @@ static args_t get_dboard_args(      dboard_id_t dboard_id  ){      //special case, the none id was provided, use the following ids -    if (dboard_id == dboard_id::NONE){ +    if (dboard_id == dboard_id_t::none()){          std::cerr << boost::format(              "Warning: unregistered dboard id: %s"              " -> defaulting to a basic board" -        ) % dboard_id::to_string(dboard_id) << std::endl; +        ) % dboard_id.to_pp_string() << std::endl;          UHD_ASSERT_THROW(get_id_to_args_map().has_key(0x0001));          UHD_ASSERT_THROW(get_id_to_args_map().has_key(0x0000));          switch(unit){ @@ -184,7 +187,7 @@ static args_t get_dboard_args(      //verify that there is a registered constructor for this id      if (not get_id_to_args_map().has_key(dboard_id)){ -        return get_dboard_args(unit, dboard_id::NONE); +        return get_dboard_args(unit, dboard_id_t::none());      }      //return the dboard args for this id @@ -235,7 +238,7 @@ dboard_manager_impl::dboard_manager_impl(          //make the rx subdevs          BOOST_FOREACH(const std::string &subdev, rx_subdevs){              db_ctor_args.sd_name = subdev; -            db_ctor_args.tx_id = dboard_id::NONE; +            db_ctor_args.tx_id = dboard_id_t::none();              dboard_base::sptr rx_dboard = rx_dboard_ctor(&db_ctor_args);              //create a rx proxy for this rx board              _rx_dboards[subdev] = subdev_proxy::sptr( @@ -245,7 +248,7 @@ dboard_manager_impl::dboard_manager_impl(          //make the tx subdevs          BOOST_FOREACH(const std::string &subdev, tx_subdevs){              db_ctor_args.sd_name = subdev; -            db_ctor_args.rx_id = dboard_id::NONE; +            db_ctor_args.rx_id = dboard_id_t::none();              dboard_base::sptr tx_dboard = tx_dboard_ctor(&db_ctor_args);              //create a tx proxy for this tx board              _tx_dboards[subdev] = subdev_proxy::sptr( | 
