summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-03-10 19:33:38 -0800
committerJosh Blum <josh@joshknows.com>2010-03-10 19:33:38 -0800
commit9c0fb5e15da3c8ccbc1c8537671703411b210fcf (patch)
treef6a516c76b2db84903a2e2e44b30af7a49997cb1
parent8e9a8464386db03a596e0b88d0714d22723d37d0 (diff)
downloaduhd-9c0fb5e15da3c8ccbc1c8537671703411b210fcf.tar.gz
uhd-9c0fb5e15da3c8ccbc1c8537671703411b210fcf.tar.bz2
uhd-9c0fb5e15da3c8ccbc1c8537671703411b210fcf.zip
Filled in dboard code for basics and lf type boards.
The dboard is now just a uint16 (dont bother with the enums). The dboard manager now registers subdevs with a name. The basic board code uses a static block to register itself.
-rw-r--r--host/include/uhd/simple_device.hpp4
-rw-r--r--host/include/uhd/usrp/dboard_base.hpp5
-rw-r--r--host/include/uhd/usrp/dboard_id.hpp9
-rw-r--r--host/include/uhd/usrp/dboard_manager.hpp2
-rw-r--r--host/include/uhd/utils.hpp5
-rw-r--r--host/lib/CMakeLists.txt1
-rw-r--r--host/lib/simple_device.cpp14
-rw-r--r--host/lib/usrp/dboard/basic.cpp282
-rw-r--r--host/lib/usrp/dboard/dboards.hpp53
-rw-r--r--host/lib/usrp/dboard_id.cpp34
-rw-r--r--host/lib/usrp/dboard_manager.cpp40
11 files changed, 307 insertions, 142 deletions
diff --git a/host/include/uhd/simple_device.hpp b/host/include/uhd/simple_device.hpp
index 64ec85a5c..69f13a8b5 100644
--- a/host/include/uhd/simple_device.hpp
+++ b/host/include/uhd/simple_device.hpp
@@ -70,7 +70,7 @@ public:
virtual double get_rx_rate(void) = 0;
virtual std::vector<double> get_rx_rates(void) = 0;
- virtual tune_result_t set_rx_freq(double target_freq, double lo_offset) = 0;
+ virtual tune_result_t set_rx_freq(double freq) = 0;
virtual double get_rx_freq_min(void) = 0;
virtual double get_rx_freq_max(void) = 0;
@@ -91,7 +91,7 @@ public:
virtual double get_tx_rate(void) = 0;
virtual std::vector<double> get_tx_rates(void) = 0;
- virtual tune_result_t set_tx_freq(double target_freq, double lo_offset) = 0;
+ virtual tune_result_t set_tx_freq(double freq) = 0;
virtual double get_tx_freq_min(void) = 0;
virtual double get_tx_freq_max(void) = 0;
diff --git a/host/include/uhd/usrp/dboard_base.hpp b/host/include/uhd/usrp/dboard_base.hpp
index b5c0d40ed..9048344ac 100644
--- a/host/include/uhd/usrp/dboard_base.hpp
+++ b/host/include/uhd/usrp/dboard_base.hpp
@@ -56,9 +56,9 @@ protected:
dboard_id_t get_tx_id(void);
private:
- std::string _subdev_name;
+ std::string _subdev_name;
dboard_interface::sptr _dboard_interface;
- dboard_id_t _rx_id, _tx_id;
+ dboard_id_t _rx_id, _tx_id;
};
/*!
@@ -71,6 +71,7 @@ public:
* Create a new xcvr dboard object, override in subclasses.
*/
xcvr_dboard_base(ctor_args_t const&);
+
virtual ~xcvr_dboard_base(void);
};
diff --git a/host/include/uhd/usrp/dboard_id.hpp b/host/include/uhd/usrp/dboard_id.hpp
index 65e3d5707..34406863d 100644
--- a/host/include/uhd/usrp/dboard_id.hpp
+++ b/host/include/uhd/usrp/dboard_id.hpp
@@ -16,17 +16,16 @@
//
#include <string>
+#include <stdint.h>
#ifndef INCLUDED_UHD_USRP_DBOARD_ID_HPP
#define INCLUDED_UHD_USRP_DBOARD_ID_HPP
namespace uhd{ namespace usrp{
-enum dboard_id_t{
- ID_NONE = 0xffff,
- ID_BASIC_TX = 0x0000,
- ID_BASIC_RX = 0x0001
-};
+typedef uint16_t dboard_id_t;
+
+static const dboard_id_t ID_NONE = 0xffff;
namespace dboard_id{
std::string to_string(const dboard_id_t &id);
diff --git a/host/include/uhd/usrp/dboard_manager.hpp b/host/include/uhd/usrp/dboard_manager.hpp
index 042947ac4..cf69675fc 100644
--- a/host/include/uhd/usrp/dboard_manager.hpp
+++ b/host/include/uhd/usrp/dboard_manager.hpp
@@ -44,11 +44,13 @@ public:
*
* \param dboard_id the dboard id (rx or tx)
* \param dboard_ctor the dboard constructor function pointer
+ * \param name the canonical name for the dboard represented
* \param subdev_names the names of the subdevs on this dboard
*/
static void register_subdevs(
dboard_id_t dboard_id,
dboard_ctor_t dboard_ctor,
+ const std::string &name,
const prop_names_t &subdev_names
);
diff --git a/host/include/uhd/utils.hpp b/host/include/uhd/utils.hpp
index 25a7b5abd..e4cfd098b 100644
--- a/host/include/uhd/utils.hpp
+++ b/host/include/uhd/utils.hpp
@@ -24,6 +24,11 @@
#include <boost/current_function.hpp>
/*!
+ * Defines a static code block that will be called before main()
+ */
+#define STATIC_BLOCK(_name, _code) struct _name{_name(void){_code}} _name
+
+/*!
* Useful templated functions and classes that I like to pretend are part of stl
*/
namespace std{
diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt
index b141d67bb..1d2c5471b 100644
--- a/host/lib/CMakeLists.txt
+++ b/host/lib/CMakeLists.txt
@@ -30,7 +30,6 @@ SET(libuhd_sources
transport/vrt.cpp
usrp/dboard/basic.cpp
usrp/dboard_base.cpp
- usrp/dboard_id.cpp
usrp/dboard_interface.cpp
usrp/dboard_manager.cpp
usrp/usrp2/dboard_impl.cpp
diff --git a/host/lib/simple_device.cpp b/host/lib/simple_device.cpp
index 63a17c52d..76f3c1262 100644
--- a/host/lib/simple_device.cpp
+++ b/host/lib/simple_device.cpp
@@ -179,7 +179,12 @@ public:
return get_xx_rates(_rx_ddc[std::string("decims")], _rx_ddc[std::string("rate")]);
}
- tune_result_t set_rx_freq(double target_freq, double lo_offset){
+ tune_result_t set_rx_freq(double target_freq){
+ double lo_offset = 0.0;
+ //if the local oscillator will be in the passband, use an offset
+ if (wax::cast<bool>(_rx_subdev[SUBDEV_PROP_LO_INTERFERES])){
+ lo_offset = get_rx_rate()*2.0;
+ }
return tune(target_freq, lo_offset, _rx_subdev, _rx_ddc, false/* not tx */);
}
@@ -242,7 +247,12 @@ public:
return get_xx_rates(_tx_duc[std::string("interps")], _tx_duc[std::string("rate")]);
}
- tune_result_t set_tx_freq(double target_freq, double lo_offset){
+ tune_result_t set_tx_freq(double target_freq){
+ double lo_offset = 0.0;
+ //if the local oscillator will be in the passband, use an offset
+ if (wax::cast<bool>(_tx_subdev[SUBDEV_PROP_LO_INTERFERES])){
+ lo_offset = get_tx_rate()*2.0;
+ }
return tune(target_freq, lo_offset, _tx_subdev, _tx_duc, true/* is tx */);
}
diff --git a/host/lib/usrp/dboard/basic.cpp b/host/lib/usrp/dboard/basic.cpp
index f39ebff2f..5e245a8cf 100644
--- a/host/lib/usrp/dboard/basic.cpp
+++ b/host/lib/usrp/dboard/basic.cpp
@@ -15,42 +15,294 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
-#include "dboards.hpp"
+#include <uhd/utils.hpp>
+#include <uhd/props.hpp>
+#include <uhd/usrp/dboard_base.hpp>
+#include <uhd/usrp/dboard_manager.hpp>
+#include <boost/assign/list_of.hpp>
+#include <boost/format.hpp>
+
+using namespace uhd;
+using namespace uhd::usrp;
+using namespace boost::assign;
/***********************************************************************
- * Basic RX dboard
+ * The basic and lf boards:
+ * They share a common class because only the frequency bounds differ.
**********************************************************************/
-basic_rx::basic_rx(ctor_args_t const& args) : rx_dboard_base(args){
- /* NOP */
+class basic_rx : public rx_dboard_base{
+public:
+ basic_rx(ctor_args_t const& args, freq_t max_freq);
+ ~basic_rx(void);
+
+ void rx_get(const wax::obj &key, wax::obj &val);
+ void rx_set(const wax::obj &key, const wax::obj &val);
+
+private:
+ freq_t _max_freq;
+};
+
+class basic_tx : public tx_dboard_base{
+public:
+ basic_tx(ctor_args_t const& args, freq_t max_freq);
+ ~basic_tx(void);
+
+ void tx_get(const wax::obj &key, wax::obj &val);
+ void tx_set(const wax::obj &key, const wax::obj &val);
+
+private:
+ freq_t _max_freq;
+};
+
+/***********************************************************************
+ * Register the basic and LF dboards
+ **********************************************************************/
+static dboard_base::sptr make_basic_rx(dboard_base::ctor_args_t const& args){
+ return dboard_base::sptr(new basic_rx(args, 90e9));
+}
+
+static dboard_base::sptr make_basic_tx(dboard_base::ctor_args_t const& args){
+ return dboard_base::sptr(new basic_tx(args, 90e9));
+}
+
+static dboard_base::sptr make_lf_rx(dboard_base::ctor_args_t const& args){
+ return dboard_base::sptr(new basic_rx(args, 32e6));
+}
+
+static dboard_base::sptr make_lf_tx(dboard_base::ctor_args_t const& args){
+ return dboard_base::sptr(new basic_tx(args, 32e6));
+}
+
+STATIC_BLOCK(reg_dboards, {
+ dboard_manager::register_subdevs(0x0000, &make_basic_tx, "Basic TX", list_of(""));
+ dboard_manager::register_subdevs(0x0001, &make_basic_rx, "Basic RX", list_of("a")("b")("ab"));
+ dboard_manager::register_subdevs(0x000e, &make_lf_tx, "LF TX", list_of(""));
+ dboard_manager::register_subdevs(0x000f, &make_lf_rx, "LF RX", list_of("a")("b")("ab"));
+});
+
+/***********************************************************************
+ * Basic and LF RX dboard
+ **********************************************************************/
+basic_rx::basic_rx(ctor_args_t const& args, freq_t max_freq) : rx_dboard_base(args){
+ _max_freq = max_freq;
+ // set the gpios to safe values (all inputs)
+ get_interface()->set_gpio_ddr(dboard_interface::GPIO_RX_BANK, 0x0000, 0xffff);
}
basic_rx::~basic_rx(void){
/* NOP */
}
-void basic_rx::rx_get(const wax::obj &, wax::obj &){
- /* TODO */
+void basic_rx::rx_get(const wax::obj &key_, wax::obj &val){
+ wax::obj key; std::string name;
+ boost::tie(key, name) = extract_named_prop(key_);
+
+ //handle the get request conditioned on the key
+ switch(wax::cast<subdev_prop_t>(key)){
+ case SUBDEV_PROP_NAME:
+ val = std::string(str(boost::format("%s:%s")
+ % dboard_id::to_string(get_rx_id())
+ % get_subdev_name()
+ ));
+ return;
+
+ case SUBDEV_PROP_OTHERS:
+ val = prop_names_t(); //empty
+ return;
+
+ case SUBDEV_PROP_GAIN:
+ case SUBDEV_PROP_GAIN_MAX:
+ case SUBDEV_PROP_GAIN_MIN:
+ case SUBDEV_PROP_GAIN_STEP:
+ val = gain_t(0);
+ return;
+
+ case SUBDEV_PROP_GAIN_NAMES:
+ val = prop_names_t(); //empty
+ return;
+
+ case SUBDEV_PROP_FREQ:
+ val = freq_t(0);
+ return;
+
+ case SUBDEV_PROP_FREQ_MAX:
+ val = +_max_freq;
+ return;
+
+ case SUBDEV_PROP_FREQ_MIN:
+ val = -_max_freq;
+ return;
+
+ case SUBDEV_PROP_ANTENNA:
+ val = std::string("");
+ return;
+
+ case SUBDEV_PROP_ANTENNA_NAMES:
+ val = prop_names_t(1, ""); //vector of 1 empty string
+ return;
+
+ case SUBDEV_PROP_ENABLED:
+ val = true; //always enabled
+ return;
+
+ case SUBDEV_PROP_QUADRATURE:
+ val = (get_subdev_name() == "ab"); //only quadrature in ab mode
+ return;
+
+ case SUBDEV_PROP_IQ_SWAPPED:
+ case SUBDEV_PROP_SPECTRUM_INVERTED:
+ case SUBDEV_PROP_LO_INTERFERES:
+ val = false;
+ return;
+ }
}
-void basic_rx::rx_set(const wax::obj &, const wax::obj &){
- /* TODO */
+void basic_rx::rx_set(const wax::obj &key_, const wax::obj &val){
+ wax::obj key; std::string name;
+ boost::tie(key, name) = extract_named_prop(key_);
+
+ //handle the get request conditioned on the key
+ switch(wax::cast<subdev_prop_t>(key)){
+
+ case SUBDEV_PROP_GAIN:
+ ASSERT_THROW(wax::cast<gain_t>(val) == gain_t(0));
+ return;
+
+ case SUBDEV_PROP_ANTENNA:
+ ASSERT_THROW(wax::cast<std::string>(val) == std::string(""));
+ return;
+
+ case SUBDEV_PROP_ENABLED:
+ return; // it wont do you much good, but you can set it
+
+ case SUBDEV_PROP_NAME:
+ case SUBDEV_PROP_OTHERS:
+ case SUBDEV_PROP_GAIN_MAX:
+ case SUBDEV_PROP_GAIN_MIN:
+ case SUBDEV_PROP_GAIN_STEP:
+ case SUBDEV_PROP_GAIN_NAMES:
+ case SUBDEV_PROP_FREQ:
+ case SUBDEV_PROP_FREQ_MAX:
+ case SUBDEV_PROP_FREQ_MIN:
+ case SUBDEV_PROP_ANTENNA_NAMES:
+ case SUBDEV_PROP_QUADRATURE:
+ case SUBDEV_PROP_IQ_SWAPPED:
+ case SUBDEV_PROP_SPECTRUM_INVERTED:
+ case SUBDEV_PROP_LO_INTERFERES:
+ throw std::runtime_error(str(boost::format(
+ "Error: trying to set read-only property on %s subdev"
+ ) % dboard_id::to_string(get_rx_id())));
+ }
}
/***********************************************************************
- * Basic TX dboard
+ * Basic and LF TX dboard
**********************************************************************/
-basic_tx::basic_tx(ctor_args_t const& args) : tx_dboard_base(args){
- /* NOP */
+basic_tx::basic_tx(ctor_args_t const& args, freq_t max_freq) : tx_dboard_base(args){
+ _max_freq = max_freq;
+ // set the gpios to safe values (all inputs)
+ get_interface()->set_gpio_ddr(dboard_interface::GPIO_TX_BANK, 0x0000, 0xffff);
}
basic_tx::~basic_tx(void){
/* NOP */
}
-void basic_tx::tx_get(const wax::obj &, wax::obj &){
- /* TODO */
+void basic_tx::tx_get(const wax::obj &key_, wax::obj &val){
+ wax::obj key; std::string name;
+ boost::tie(key, name) = extract_named_prop(key_);
+
+ //handle the get request conditioned on the key
+ switch(wax::cast<subdev_prop_t>(key)){
+ case SUBDEV_PROP_NAME:
+ val = dboard_id::to_string(get_tx_id());
+ return;
+
+ case SUBDEV_PROP_OTHERS:
+ val = prop_names_t(); //empty
+ return;
+
+ case SUBDEV_PROP_GAIN:
+ case SUBDEV_PROP_GAIN_MAX:
+ case SUBDEV_PROP_GAIN_MIN:
+ case SUBDEV_PROP_GAIN_STEP:
+ val = gain_t(0);
+ return;
+
+ case SUBDEV_PROP_GAIN_NAMES:
+ val = prop_names_t(); //empty
+ return;
+
+ case SUBDEV_PROP_FREQ:
+ val = freq_t(0);
+ return;
+
+ case SUBDEV_PROP_FREQ_MAX:
+ val = +_max_freq;
+ return;
+
+ case SUBDEV_PROP_FREQ_MIN:
+ val = -_max_freq;
+ return;
+
+ case SUBDEV_PROP_ANTENNA:
+ val = std::string("");
+ return;
+
+ case SUBDEV_PROP_ANTENNA_NAMES:
+ val = prop_names_t(1, ""); //vector of 1 empty string
+ return;
+
+ case SUBDEV_PROP_ENABLED:
+ val = true; //always enabled
+ return;
+
+ case SUBDEV_PROP_QUADRATURE:
+ val = true;
+ return;
+
+ case SUBDEV_PROP_IQ_SWAPPED:
+ case SUBDEV_PROP_SPECTRUM_INVERTED:
+ case SUBDEV_PROP_LO_INTERFERES:
+ val = false;
+ return;
+ }
}
-void basic_tx::tx_set(const wax::obj &, const wax::obj &){
- /* TODO */
+void basic_tx::tx_set(const wax::obj &key_, const wax::obj &val){
+ wax::obj key; std::string name;
+ boost::tie(key, name) = extract_named_prop(key_);
+
+ //handle the get request conditioned on the key
+ switch(wax::cast<subdev_prop_t>(key)){
+
+ case SUBDEV_PROP_GAIN:
+ ASSERT_THROW(wax::cast<gain_t>(val) == gain_t(0));
+ return;
+
+ case SUBDEV_PROP_ANTENNA:
+ ASSERT_THROW(wax::cast<std::string>(val) == std::string(""));
+ return;
+
+ case SUBDEV_PROP_ENABLED:
+ return; // it wont do you much good, but you can set it
+
+ case SUBDEV_PROP_NAME:
+ case SUBDEV_PROP_OTHERS:
+ case SUBDEV_PROP_GAIN_MAX:
+ case SUBDEV_PROP_GAIN_MIN:
+ case SUBDEV_PROP_GAIN_STEP:
+ case SUBDEV_PROP_GAIN_NAMES:
+ case SUBDEV_PROP_FREQ:
+ case SUBDEV_PROP_FREQ_MAX:
+ case SUBDEV_PROP_FREQ_MIN:
+ case SUBDEV_PROP_ANTENNA_NAMES:
+ case SUBDEV_PROP_QUADRATURE:
+ case SUBDEV_PROP_IQ_SWAPPED:
+ case SUBDEV_PROP_SPECTRUM_INVERTED:
+ case SUBDEV_PROP_LO_INTERFERES:
+ throw std::runtime_error(str(boost::format(
+ "Error: trying to set read-only property on %s subdev"
+ ) % dboard_id::to_string(get_tx_id())));
+ }
}
diff --git a/host/lib/usrp/dboard/dboards.hpp b/host/lib/usrp/dboard/dboards.hpp
deleted file mode 100644
index 79b90d593..000000000
--- a/host/lib/usrp/dboard/dboards.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// 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/>.
-//
-
-#ifndef INCLUDED_LOCAL_DBOARDS_HPP
-#define INCLUDED_LOCAL_DBOARDS_HPP
-
-#include <uhd/usrp/dboard_base.hpp>
-
-using namespace uhd::usrp;
-
-/***********************************************************************
- * The basic boards:
- **********************************************************************/
-class basic_rx : public rx_dboard_base{
-public:
- static dboard_base::sptr make(ctor_args_t const& args){
- return dboard_base::sptr(new basic_rx(args));
- }
- basic_rx(ctor_args_t const& args);
- ~basic_rx(void);
-
- void rx_get(const wax::obj &key, wax::obj &val);
- void rx_set(const wax::obj &key, const wax::obj &val);
-};
-
-class basic_tx : public tx_dboard_base{
-public:
- static dboard_base::sptr make(ctor_args_t const& args){
- return dboard_base::sptr(new basic_tx(args));
- }
- basic_tx(ctor_args_t const& args);
- ~basic_tx(void);
-
- void tx_get(const wax::obj &key, wax::obj &val);
- void tx_set(const wax::obj &key, const wax::obj &val);
-
-};
-
-#endif /* INCLUDED_LOCAL_DBOARDS_HPP */
diff --git a/host/lib/usrp/dboard_id.cpp b/host/lib/usrp/dboard_id.cpp
deleted file mode 100644
index d2ef7cd7d..000000000
--- a/host/lib/usrp/dboard_id.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// 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/format.hpp>
-#include <uhd/dict.hpp>
-
-using namespace uhd::usrp;
-
-std::string dboard_id::to_string(const dboard_id_t &id){
- //map the dboard ids to string representations
- uhd::dict<dboard_id_t, std::string> id_to_str;
- id_to_str[ID_NONE] = "none";
- id_to_str[ID_BASIC_TX] = "basic tx";
- id_to_str[ID_BASIC_RX] = "basic rx";
-
- //get the string representation
- std::string name = (id_to_str.has_key(id))? id_to_str[id] : "unknown";
- return str(boost::format("%s (0x%.4x)") % name % id);
-}
diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp
index cce239f3e..57b449175 100644
--- a/host/lib/usrp/dboard_manager.cpp
+++ b/host/lib/usrp/dboard_manager.cpp
@@ -18,36 +18,12 @@
#include <uhd/usrp/dboard_manager.hpp>
#include <uhd/utils.hpp>
#include <uhd/dict.hpp>
-#include <boost/assign/list_of.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/format.hpp>
#include <boost/foreach.hpp>
-#include "dboard/dboards.hpp"
using namespace uhd;
using namespace uhd::usrp;
-using namespace boost::assign;
-
-/***********************************************************************
- * register internal dboards
- *
- * Register internal/known dboards located in this build tree.
- * Each board should have entries below mapping an id to a constructor.
- * The xcvr type boards should register both rx and tx sides.
- *
- * This function will be called before new boards are registered.
- * This allows for internal boards to be externally overridden.
- * This function will also be called when creating a new dboard_manager
- * to ensure that the maps are filled with the entries below.
- **********************************************************************/
-static void register_internal_dboards(void){
- //ensure that this function can only be called once per instance
- static bool called = false;
- if (called) return; called = true;
- //register the known dboards (dboard id, constructor, subdev names)
- dboard_manager::register_subdevs(ID_BASIC_TX, &basic_tx::make, list_of(""));
- dboard_manager::register_subdevs(ID_BASIC_RX, &basic_rx::make, list_of("a")("b")("ab"));
-}
/***********************************************************************
* storage and registering for dboards
@@ -57,15 +33,24 @@ typedef boost::tuple<dboard_manager::dboard_ctor_t, prop_names_t> args_t;
//map a dboard id to a dboard constructor
static uhd::dict<dboard_id_t, args_t> id_to_args_map;
+//map a dboard id to a canonical name
+static uhd::dict<dboard_id_t, std::string> id_to_str;
+
void dboard_manager::register_subdevs(
dboard_id_t dboard_id,
dboard_ctor_t dboard_ctor,
+ const std::string &name,
const prop_names_t &subdev_names
){
- register_internal_dboards(); //always call first
+ id_to_str[dboard_id] = name;
id_to_args_map[dboard_id] = args_t(dboard_ctor, subdev_names);
}
+std::string dboard_id::to_string(const dboard_id_t &id){
+ std::string name = (id_to_str.has_key(id))? id_to_str[id] : "unknown";
+ return str(boost::format("%s (0x%.4x)") % name % id);
+}
+
/***********************************************************************
* dboard manager implementation class
**********************************************************************/
@@ -160,12 +145,12 @@ static args_t get_dboard_args(
){
//special case, its rx and the none id (0xffff)
if (xx_type == "rx" and dboard_id == ID_NONE){
- return args_t(&basic_rx::make, list_of("ab"));
+ return get_dboard_args(0x0001, xx_type);
}
//special case, its tx and the none id (0xffff)
if (xx_type == "tx" and dboard_id == ID_NONE){
- return args_t(&basic_tx::make, list_of(""));
+ return get_dboard_args(0x0000, xx_type);
}
//verify that there is a registered constructor for this id
@@ -185,7 +170,6 @@ dboard_manager_impl::dboard_manager_impl(
dboard_id_t tx_dboard_id,
dboard_interface::sptr interface
){
- register_internal_dboards(); //always call first
_interface = interface;
dboard_ctor_t rx_dboard_ctor; prop_names_t rx_subdevs;