aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/include/uhd/config.hpp7
-rw-r--r--host/include/uhd/utils/CMakeLists.txt1
-rw-r--r--host/include/uhd/utils/log.hpp2
-rw-r--r--host/include/uhd/utils/msg.hpp67
-rw-r--r--host/include/uhd/utils/safe_call.hpp6
-rw-r--r--host/include/uhd/utils/warning.hpp12
-rw-r--r--host/lib/transport/udp_zero_copy.cpp6
-rw-r--r--host/lib/types/device_addr.cpp6
-rw-r--r--host/lib/usrp/dboard/db_basic_and_lf.cpp18
-rw-r--r--host/lib/usrp/dboard/db_dbsrx.cpp26
-rw-r--r--host/lib/usrp/dboard/db_rfx.cpp10
-rw-r--r--host/lib/usrp/dboard/db_sbx.cpp10
-rw-r--r--host/lib/usrp/dboard/db_tvrx.cpp6
-rw-r--r--host/lib/usrp/dboard/db_unknown.cpp14
-rw-r--r--host/lib/usrp/dboard/db_wbx_common.cpp10
-rw-r--r--host/lib/usrp/dboard/db_xcvr2450.cpp1
-rw-r--r--host/lib/usrp/dboard_manager.cpp8
-rw-r--r--host/lib/usrp/multi_usrp.cpp14
-rw-r--r--host/lib/usrp/usrp1/mboard_impl.cpp4
-rw-r--r--host/lib/usrp/usrp1/usrp1_impl.cpp4
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp1
-rw-r--r--host/lib/usrp/usrp_e100/usrp_e100_impl.cpp19
-rw-r--r--host/lib/utils/CMakeLists.txt1
-rw-r--r--host/lib/utils/log.cpp2
-rw-r--r--host/lib/utils/msg.cpp109
-rw-r--r--host/lib/utils/thread_priority.cpp6
-rw-r--r--host/lib/utils/warning.cpp8
-rw-r--r--host/tests/CMakeLists.txt2
-rw-r--r--host/tests/msg_test.cpp (renamed from host/tests/warning_test.cpp)18
29 files changed, 281 insertions, 117 deletions
diff --git a/host/include/uhd/config.hpp b/host/include/uhd/config.hpp
index 6fd2932cf..96dfe8ed0 100644
--- a/host/include/uhd/config.hpp
+++ b/host/include/uhd/config.hpp
@@ -76,6 +76,13 @@ typedef ptrdiff_t ssize_t;
#define UHD_API UHD_IMPORT
#endif // UHD_DLL_EXPORTS
+// The user can enable this with -DUHD_FUTURE
+#ifdef UHD_FUTURE
+ #define UHD_API_FUTURE UHD_API
+#else
+ #define UHD_API_FUTURE
+#endif
+
// Platform defines for conditional parts of headers:
// Taken from boost/config/select_platform_config.hpp,
// however, we define macros, not strings for platforms.
diff --git a/host/include/uhd/utils/CMakeLists.txt b/host/include/uhd/utils/CMakeLists.txt
index 6c507dcde..875c4731f 100644
--- a/host/include/uhd/utils/CMakeLists.txt
+++ b/host/include/uhd/utils/CMakeLists.txt
@@ -24,6 +24,7 @@ INSTALL(FILES
gain_group.hpp
images.hpp
log.hpp
+ msg.hpp
pimpl.hpp
props.hpp
safe_call.hpp
diff --git a/host/include/uhd/utils/log.hpp b/host/include/uhd/utils/log.hpp
index 9dceea982..503c468f1 100644
--- a/host/include/uhd/utils/log.hpp
+++ b/host/include/uhd/utils/log.hpp
@@ -76,7 +76,7 @@ namespace uhd{ namespace _log{
};
//! Internal logging object (called by UHD_LOG macros)
- struct /*UHD_API*/ log{
+ struct UHD_API_FUTURE log{
log(
const verbosity_t verbosity,
const std::string &file,
diff --git a/host/include/uhd/utils/msg.hpp b/host/include/uhd/utils/msg.hpp
new file mode 100644
index 000000000..a78e04ad3
--- /dev/null
+++ b/host/include/uhd/utils/msg.hpp
@@ -0,0 +1,67 @@
+//
+// Copyright 2011 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_UHD_UTILS_MSG_HPP
+#define INCLUDED_UHD_UTILS_MSG_HPP
+
+#include <uhd/config.hpp>
+#include <ostream>
+#include <string>
+
+/*!
+ * A UHD message macro with configurable type.
+ * Usage: UHD_MSG(warning) << "some warning message" << std::endl;
+ */
+#define UHD_MSG(type) \
+ uhd::msg::_msg(uhd::msg::type)
+
+
+namespace uhd{ namespace msg{
+
+ //! Possible message types
+ enum type_t{
+ status = 's',
+ warning = 'w',
+ error = 'e',
+ };
+
+ //! Typedef for a user-registered message handler
+ typedef void (*handler_t)(type_t, const std::string &);
+
+ /*!
+ * Register the handler for uhd system messages.
+ * Only one handler can be registered at once.
+ * This replaces the default std::cout/cerr handler.
+ * \param handler a new handler callback function
+ */
+ UHD_API_FUTURE void register_handler(const handler_t &handler);
+
+ //! Internal message object (called by UHD_MSG macro)
+ struct UHD_API_FUTURE _msg{
+ _msg(const type_t type);
+ ~_msg(void);
+
+ std::ostream &get(void);
+
+ template <typename T> std::ostream &operator<<(const T &x){
+ return get() << x;
+ }
+ };
+
+}} //namespace uhd::msg
+
+#endif /* INCLUDED_UHD_UTILS_MSG_HPP */
diff --git a/host/include/uhd/utils/safe_call.hpp b/host/include/uhd/utils/safe_call.hpp
index 6b2c210af..b9f545b23 100644
--- a/host/include/uhd/utils/safe_call.hpp
+++ b/host/include/uhd/utils/safe_call.hpp
@@ -20,12 +20,12 @@
#include <uhd/config.hpp>
#include <uhd/exception.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
//! helper macro for safe call to produce warnings
-#define _UHD_SAFE_CALL_WARNING(code, what) uhd::warning::post( \
+#define _UHD_SAFE_CALL_WARNING(code, what) UHD_MSG(warning) << \
UHD_THROW_SITE_INFO("Exception caught in safe-call.") + #code + " -> " + what \
-);
+;
/*!
* A safe-call catches all exceptions thrown by code,
diff --git a/host/include/uhd/utils/warning.hpp b/host/include/uhd/utils/warning.hpp
index a1e3f0d1e..ae614d59e 100644
--- a/host/include/uhd/utils/warning.hpp
+++ b/host/include/uhd/utils/warning.hpp
@@ -23,6 +23,10 @@
#include <vector>
#include <string>
+/*! \file warning.hpp
+ * EVERYTHING IN THIS FILE IS TOTALLY DEPRECATED! DO NOT USE IT!
+ */
+
namespace uhd{ namespace warning{
//! Callback function type for a message handler
@@ -32,7 +36,7 @@ namespace uhd{ namespace warning{
* Post a warning message to all registered handlers.
* \param msg the multiline warning message
*/
- UHD_API void post(const std::string &msg);
+ UHD_API UHD_DEPRECATED void post(const std::string &msg);
/*!
* Register a new handler with this name.
@@ -41,7 +45,7 @@ namespace uhd{ namespace warning{
* \param name a unique name for this handler
* \param handler the callback handler function
*/
- UHD_API void register_handler(const std::string &name, const handler_t &handler);
+ UHD_API UHD_DEPRECATED void register_handler(const std::string &name, const handler_t &handler);
/*!
* Unregister a handler for this name.
@@ -49,13 +53,13 @@ namespace uhd{ namespace warning{
* \return the handler that was registered
* \throw error when the name was not found in the registry
*/
- UHD_API handler_t unregister_handler(const std::string &name);
+ UHD_API UHD_DEPRECATED handler_t unregister_handler(const std::string &name);
/*!
* Get a list of registered handler names.
* \return a vector of unique string names
*/
- UHD_API const std::vector<std::string> registry_names(void);
+ UHD_API UHD_DEPRECATED const std::vector<std::string> registry_names(void);
}} //namespace uhd::warning
diff --git a/host/lib/transport/udp_zero_copy.cpp b/host/lib/transport/udp_zero_copy.cpp
index 15d882676..c3ba085bf 100644
--- a/host/lib/transport/udp_zero_copy.cpp
+++ b/host/lib/transport/udp_zero_copy.cpp
@@ -20,7 +20,7 @@
#include <uhd/transport/udp_simple.hpp> //mtu
#include <uhd/transport/bounded_buffer.hpp>
#include <uhd/transport/buffer_pool.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/utils/log.hpp>
#include <boost/format.hpp>
#include <list>
@@ -279,12 +279,12 @@ template<typename Opt> static void resize_buff_helper(
"Target %s sock buff size: %d bytes\n"
"Actual %s sock buff size: %d bytes"
) % name % target_size % name % actual_size << std::endl;
- if (actual_size < target_size) uhd::warning::post(str(boost::format(
+ if (actual_size < target_size) UHD_MSG(warning) << boost::format(
"The %s buffer could not be resized sufficiently.\n"
"Target sock buff size: %d bytes.\n"
"Actual sock buff size: %d bytes.\n"
"See the transport application notes on buffer resizing.\n%s"
- ) % name % target_size % actual_size % help_message));
+ ) % name % target_size % actual_size % help_message;
}
}
diff --git a/host/lib/types/device_addr.cpp b/host/lib/types/device_addr.cpp
index 193f76f8c..45d885adc 100644
--- a/host/lib/types/device_addr.cpp
+++ b/host/lib/types/device_addr.cpp
@@ -73,7 +73,7 @@ std::string device_addr_t::to_string(void) const{
return args_str;
}
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
device_addrs_t uhd::separate_device_addr(const device_addr_t &dev_addr){
//------------ support old deprecated way and print warning --------
@@ -85,13 +85,13 @@ device_addrs_t uhd::separate_device_addr(const device_addr_t &dev_addr){
for (size_t i = 0; i < addrs.size(); i++){
fixed_dev_addr[str(boost::format("addr%d") % i)] = addrs[i];
}
- uhd::warning::post(
+ UHD_MSG(warning) <<
"addr = <space separated list of ip addresses> is deprecated.\n"
"To address a multi-device, use multiple <key><index> = <val>.\n"
"See the USRP-NXXX application notes. Two device example:\n"
" addr0 = 192.168.10.2\n"
" addr1 = 192.168.10.3\n"
- );
+ ;
return separate_device_addr(fixed_dev_addr);
}
}
diff --git a/host/lib/usrp/dboard/db_basic_and_lf.cpp b/host/lib/usrp/dboard/db_basic_and_lf.cpp
index 3fffeab0c..6f8de9a7b 100644
--- a/host/lib/usrp/dboard/db_basic_and_lf.cpp
+++ b/host/lib/usrp/dboard/db_basic_and_lf.cpp
@@ -20,7 +20,7 @@
#include <uhd/types/ranges.hpp>
#include <uhd/utils/assert_has.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <uhd/usrp/dboard_manager.hpp>
#include <boost/assign/list_of.hpp>
@@ -202,11 +202,9 @@ void basic_rx::rx_set(const wax::obj &key_, const wax::obj &val){
return; //always enabled
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("%s: No tunable bandwidth, fixed filtered to %0.2fMHz")
- % get_rx_id().to_pp_string() % _max_freq
- )
- );
+ UHD_MSG(warning) << boost::format(
+ "%s: No tunable bandwidth, fixed filtered to %0.2fMHz"
+ ) % get_rx_id().to_pp_string() % _max_freq;
return;
default: UHD_THROW_PROP_SET_ERROR();
@@ -309,11 +307,9 @@ void basic_tx::tx_set(const wax::obj &key_, const wax::obj &val){
return; //always enabled
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("%s: No tunable bandwidth, fixed filtered to %0.2fMHz")
- % get_tx_id().to_pp_string() % _max_freq
- )
- );
+ UHD_MSG(warning) << boost::format(
+ "%s: No tunable bandwidth, fixed filtered to %0.2fMHz"
+ ) % get_tx_id().to_pp_string() % _max_freq;
return;
default: UHD_THROW_PROP_SET_ERROR();
diff --git a/host/lib/usrp/dboard/db_dbsrx.cpp b/host/lib/usrp/dboard/db_dbsrx.cpp
index dbe2f6370..cfe06db29 100644
--- a/host/lib/usrp/dboard/db_dbsrx.cpp
+++ b/host/lib/usrp/dboard/db_dbsrx.cpp
@@ -24,7 +24,7 @@
#include <uhd/utils/static.hpp>
#include <uhd/utils/assert_has.hpp>
#include <uhd/utils/algorithm.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/types/ranges.hpp>
#include <uhd/types/sensors.hpp>
#include <uhd/types/dict.hpp>
@@ -175,25 +175,21 @@ UHD_STATIC_BLOCK(reg_dbsrx_dboard){
dbsrx::dbsrx(ctor_args_t args) : rx_dboard_base(args){
//warn user about incorrect DBID on USRP1, requires R193 populated
if (this->get_iface()->get_special_props().soft_clock_divider and this->get_rx_id() == 0x000D)
- uhd::warning::post(
- str(boost::format(
+ UHD_MSG(warning) << boost::format(
"DBSRX: incorrect dbid\n"
"Expected dbid 0x0002 and R193\n"
"found dbid == %d\n"
"Please see the daughterboard app notes"
- ) % this->get_rx_id().to_pp_string())
- );
+ ) % this->get_rx_id().to_pp_string();
//warn user about incorrect DBID on non-USRP1, requires R194 populated
if (not this->get_iface()->get_special_props().soft_clock_divider and this->get_rx_id() == 0x0002)
- uhd::warning::post(
- str(boost::format(
+ UHD_MSG(warning) << boost::format(
"DBSRX: incorrect dbid\n"
"Expected dbid 0x000D and R194\n"
"found dbid == %d\n"
"Please see the daughterboard app notes"
- ) % this->get_rx_id().to_pp_string())
- );
+ ) % this->get_rx_id().to_pp_string();
//enable only the clocks we need
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
@@ -342,11 +338,9 @@ void dbsrx::set_lo_freq(double target_freq){
//vtune is too low, try lower frequency vco
if (_max2118_read_regs.adc == 0){
if (_max2118_write_regs.osc_band == 0){
- uhd::warning::post(
- str(boost::format(
+ UHD_MSG(warning) << boost::format(
"DBSRX: Tuning exceeded vco range, _max2118_write_regs.osc_band == %d\n"
- ) % int(_max2118_write_regs.osc_band))
- );
+ ) % int(_max2118_write_regs.osc_band);
UHD_ASSERT_THROW(_max2118_read_regs.adc != 0); //just to cause a throw
}
if (_max2118_write_regs.osc_band <= 0) break;
@@ -356,11 +350,9 @@ void dbsrx::set_lo_freq(double target_freq){
//vtune is too high, try higher frequency vco
if (_max2118_read_regs.adc == 7){
if (_max2118_write_regs.osc_band == 7){
- uhd::warning::post(
- str(boost::format(
+ UHD_MSG(warning) << boost::format(
"DBSRX: Tuning exceeded vco range, _max2118_write_regs.osc_band == %d\n"
- ) % int(_max2118_write_regs.osc_band))
- );
+ ) % int(_max2118_write_regs.osc_band);
UHD_ASSERT_THROW(_max2118_read_regs.adc != 7); //just to cause a throw
}
if (_max2118_write_regs.osc_band >= 7) break;
diff --git a/host/lib/usrp/dboard/db_rfx.cpp b/host/lib/usrp/dboard/db_rfx.cpp
index 1f0290179..61f9130d4 100644
--- a/host/lib/usrp/dboard/db_rfx.cpp
+++ b/host/lib/usrp/dboard/db_rfx.cpp
@@ -41,7 +41,7 @@
#include <uhd/utils/log.hpp>
#include <uhd/utils/static.hpp>
#include <uhd/utils/algorithm.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/usrp/dboard_id.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <uhd/usrp/dboard_manager.hpp>
@@ -514,9 +514,7 @@ void rfx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){
return; //always enabled
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("RFX: No tunable bandwidth, fixed filtered to 40MHz"))
- );
+ UHD_MSG(warning) << "RFX: No tunable bandwidth, fixed filtered to 40MHz";
return;
default: UHD_THROW_PROP_SET_ERROR();
@@ -616,9 +614,7 @@ void rfx_xcvr::tx_set(const wax::obj &key_, const wax::obj &val){
return; //always enabled
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("RFX: No tunable bandwidth, fixed filtered to 40MHz"))
- );
+ UHD_MSG(warning) << "RFX: No tunable bandwidth, fixed filtered to 40MHz";
return;
default: UHD_THROW_PROP_SET_ERROR();
diff --git a/host/lib/usrp/dboard/db_sbx.cpp b/host/lib/usrp/dboard/db_sbx.cpp
index 4d8753fab..6ca89b81a 100644
--- a/host/lib/usrp/dboard/db_sbx.cpp
+++ b/host/lib/usrp/dboard/db_sbx.cpp
@@ -81,7 +81,7 @@
#include <uhd/utils/log.hpp>
#include <uhd/utils/static.hpp>
#include <uhd/utils/algorithm.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <uhd/usrp/dboard_manager.hpp>
#include <boost/assign/list_of.hpp>
@@ -674,9 +674,7 @@ void sbx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){
return; //always enabled
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("SBX: No tunable bandwidth, fixed filtered to 40MHz"))
- );
+ UHD_MSG(warning) << "SBX: No tunable bandwidth, fixed filtered to 40MHz";
return;
default: UHD_THROW_PROP_SET_ERROR();
@@ -780,9 +778,7 @@ void sbx_xcvr::tx_set(const wax::obj &key_, const wax::obj &val){
return; //always enabled
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("SBX: No tunable bandwidth, fixed filtered to 40MHz"))
- );
+ UHD_MSG(warning) << "SBX: No tunable bandwidth, fixed filtered to 40MHz";
return;
default: UHD_THROW_PROP_SET_ERROR();
diff --git a/host/lib/usrp/dboard/db_tvrx.cpp b/host/lib/usrp/dboard/db_tvrx.cpp
index cd7216c22..1ff0fb785 100644
--- a/host/lib/usrp/dboard/db_tvrx.cpp
+++ b/host/lib/usrp/dboard/db_tvrx.cpp
@@ -31,7 +31,7 @@
#include <uhd/utils/static.hpp>
#include <uhd/utils/assert_has.hpp>
#include <uhd/utils/algorithm.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/types/ranges.hpp>
#include <uhd/types/sensors.hpp>
#include <uhd/types/dict.hpp>
@@ -485,9 +485,7 @@ void tvrx::rx_set(const wax::obj &key_, const wax::obj &val){
return; //always enabled
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("TVRX: No tunable bandwidth, fixed filtered to 6MHz"))
- );
+ UHD_MSG(warning) << "TVRX: No tunable bandwidth, fixed filtered to 6MHz";
return;
default: UHD_THROW_PROP_SET_ERROR();
diff --git a/host/lib/usrp/dboard/db_unknown.cpp b/host/lib/usrp/dboard/db_unknown.cpp
index cef4bee4a..6cacab231 100644
--- a/host/lib/usrp/dboard/db_unknown.cpp
+++ b/host/lib/usrp/dboard/db_unknown.cpp
@@ -19,7 +19,7 @@
#include <uhd/types/ranges.hpp>
#include <uhd/utils/assert_has.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <uhd/usrp/dboard_manager.hpp>
#include <boost/assign/list_of.hpp>
@@ -50,11 +50,11 @@ static void warn_if_old_rfx(const dboard_id_t &dboard_id, const std::string &xx)
if (
(xx == "RX" and rx_id == dboard_id) or
(xx == "TX" and tx_id == dboard_id)
- ) uhd::warning::post(str(boost::format(
+ ) UHD_MSG(warning) << boost::format(
"Detected %s daughterboard %s\n"
"This board requires modification to use.\n"
"See the daughterboard application notes.\n"
- ) % xx % name));
+ ) % xx % name;
}
}
@@ -183,9 +183,7 @@ void unknown_rx::rx_set(const wax::obj &key_, const wax::obj &val){
return; //always enabled
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("Unknown Daughterboard: No tunable bandwidth, fixed filtered to 0.0MHz"))
- );
+ UHD_MSG(warning) << "Unknown Daughterboard: No tunable bandwidth, fixed filtered to 0.0MHz";
return;
default: UHD_THROW_PROP_SET_ERROR();
@@ -281,9 +279,7 @@ void unknown_tx::tx_set(const wax::obj &key_, const wax::obj &val){
return; //always enabled
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("Unknown Daughterboard: No tunable bandwidth, fixed filtered to 0.0MHz"))
- );
+ UHD_MSG(warning) << "Unknown Daughterboard: No tunable bandwidth, fixed filtered to 0.0MHz";
return;
default: UHD_THROW_PROP_SET_ERROR();
diff --git a/host/lib/usrp/dboard/db_wbx_common.cpp b/host/lib/usrp/dboard/db_wbx_common.cpp
index fdee14607..131729f42 100644
--- a/host/lib/usrp/dboard/db_wbx_common.cpp
+++ b/host/lib/usrp/dboard/db_wbx_common.cpp
@@ -58,7 +58,7 @@
#include <uhd/types/sensors.hpp>
#include <uhd/utils/assert_has.hpp>
#include <uhd/utils/algorithm.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
@@ -472,9 +472,7 @@ void wbx_base::rx_set(const wax::obj &key_, const wax::obj &val){
return;
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("WBX: No tunable bandwidth, fixed filtered to 40MHz"))
- );
+ UHD_MSG(warning) << "WBX: No tunable bandwidth, fixed filtered to 40MHz";
return;
default: UHD_THROW_PROP_SET_ERROR();
@@ -572,9 +570,7 @@ void wbx_base::tx_set(const wax::obj &key_, const wax::obj &val){
return;
case SUBDEV_PROP_BANDWIDTH:
- uhd::warning::post(
- str(boost::format("WBX: No tunable bandwidth, fixed filtered to 40MHz"))
- );
+ UHD_MSG(warning) << "WBX: No tunable bandwidth, fixed filtered to 40MHz";
return;
default: UHD_THROW_PROP_SET_ERROR();
diff --git a/host/lib/usrp/dboard/db_xcvr2450.cpp b/host/lib/usrp/dboard/db_xcvr2450.cpp
index 4bda43251..c775eae38 100644
--- a/host/lib/usrp/dboard/db_xcvr2450.cpp
+++ b/host/lib/usrp/dboard/db_xcvr2450.cpp
@@ -52,7 +52,6 @@
#include <uhd/utils/static.hpp>
#include <uhd/utils/assert_has.hpp>
#include <uhd/utils/algorithm.hpp>
-#include <uhd/utils/warning.hpp>
#include <uhd/types/ranges.hpp>
#include <uhd/types/sensors.hpp>
#include <uhd/types/dict.hpp>
diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp
index cd934dd0d..11b72b9fa 100644
--- a/host/lib/usrp/dboard_manager.cpp
+++ b/host/lib/usrp/dboard_manager.cpp
@@ -18,7 +18,7 @@
#include "dboard_ctor_args.hpp"
#include <uhd/usrp/dboard_manager.hpp>
#include <uhd/usrp/subdev_props.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/static.hpp>
#include <uhd/exception.hpp>
@@ -240,7 +240,7 @@ dboard_manager_impl::dboard_manager_impl(
this->init(rx_dboard_id, tx_dboard_id);
}
catch(const std::exception &e){
- uhd::warning::post(e.what());
+ UHD_MSG(error) << "The daughterboard manager encountered a recoverable error in init" << std::endl << e.what();
this->init(dboard_id_t::none(), dboard_id_t::none());
}
}
@@ -264,12 +264,12 @@ void dboard_manager_impl::init(
//warn for invalid dboard id xcvr combinations
if (not xcvr_dboard_key.is_xcvr() and (rx_dboard_key.is_xcvr() or tx_dboard_key.is_xcvr())){
- uhd::warning::post(str(boost::format(
+ UHD_MSG(warning) << boost::format(
"Unknown transceiver board ID combination.\n"
"Is your daughter-board mounted properly?\n"
"RX dboard ID: %s\n"
"TX dboard ID: %s\n"
- ) % rx_dboard_id.to_pp_string() % tx_dboard_id.to_pp_string()));
+ ) % rx_dboard_id.to_pp_string() % tx_dboard_id.to_pp_string();
}
//initialize the gpio pins before creating subdevs
diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp
index 83cbf339b..2b32602da 100644
--- a/host/lib/usrp/multi_usrp.cpp
+++ b/host/lib/usrp/multi_usrp.cpp
@@ -19,7 +19,7 @@
#include <uhd/usrp/tune_helper.hpp>
#include <uhd/usrp/mboard_iface.hpp>
#include <uhd/exception.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/utils/gain_group.hpp>
#include <uhd/usrp/subdev_props.hpp>
#include <uhd/usrp/mboard_props.hpp>
@@ -55,11 +55,11 @@ static inline void do_samp_rate_warning_message(
){
static const double max_allowed_error = 1.0; //Sps
if (std::abs(target_rate - actual_rate) > max_allowed_error){
- uhd::warning::post(str(boost::format(
+ UHD_MSG(warning) << boost::format(
"The hardware does not support the requested %s sample rate:\n"
"Target sample rate: %f MSps\n"
"Actual sample rate: %f MSps\n"
- ) % xx % (target_rate/1e6) % (actual_rate/1e6)));
+ ) % xx % (target_rate/1e6) % (actual_rate/1e6);
}
}
@@ -70,11 +70,11 @@ static inline void do_tune_freq_warning_message(
){
static const double max_allowed_error = 1.0; //Hz
if (std::abs(target_freq - actual_freq) > max_allowed_error){
- uhd::warning::post(str(boost::format(
+ UHD_MSG(warning) << boost::format(
"The hardware does not support the requested %s frequency:\n"
"Target frequency: %f MHz\n"
"Actual frequency: %f MHz\n"
- ) % xx % (target_freq/1e6) % (actual_freq/1e6)));
+ ) % xx % (target_freq/1e6) % (actual_freq/1e6);
}
}
@@ -211,11 +211,11 @@ public:
time_spec_t time_0 = _mboard(0)[MBOARD_PROP_TIME_NOW].as<time_spec_t>();
time_spec_t time_i = _mboard(m)[MBOARD_PROP_TIME_NOW].as<time_spec_t>();
if (time_i < time_0 or (time_i - time_0) > time_spec_t(0.01)){ //10 ms: greater than RTT but not too big
- uhd::warning::post(str(boost::format(
+ UHD_MSG(warning) << boost::format(
"Detected time deviation between board %d and board 0.\n"
"Board 0 time is %f seconds.\n"
"Board %d time is %f seconds.\n"
- ) % m % time_0.get_real_secs() % m % time_i.get_real_secs()));
+ ) % m % time_0.get_real_secs() % m % time_i.get_real_secs();
}
}
}
diff --git a/host/lib/usrp/usrp1/mboard_impl.cpp b/host/lib/usrp/usrp1/mboard_impl.cpp
index eecae3fa7..aa9ce244b 100644
--- a/host/lib/usrp/usrp1/mboard_impl.cpp
+++ b/host/lib/usrp/usrp1/mboard_impl.cpp
@@ -24,7 +24,7 @@
#include <uhd/usrp/mboard_props.hpp>
#include <uhd/usrp/dboard_props.hpp>
#include <uhd/usrp/subdev_props.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/utils/assert_has.hpp>
#include <uhd/utils/images.hpp>
#include <boost/assign/list_of.hpp>
@@ -98,7 +98,7 @@ static boost::uint32_t calc_rx_mux(
// for all quadrature sources: Z = 0
// for mixed sources: warning + Z = 0
int Z = (num_quads > 0)? 0 : 1;
- if (num_quads != 0 and num_reals != 0) uhd::warning::post(
+ if (num_quads != 0 and num_reals != 0) UHD_MSG(warning) << boost::format(
"Mixing real and quadrature rx subdevices is not supported.\n"
"The Q input to the real source(s) will be non-zero.\n"
);
diff --git a/host/lib/usrp/usrp1/usrp1_impl.cpp b/host/lib/usrp/usrp1/usrp1_impl.cpp
index a99777775..b7cd95a82 100644
--- a/host/lib/usrp/usrp1/usrp1_impl.cpp
+++ b/host/lib/usrp/usrp1/usrp1_impl.cpp
@@ -23,7 +23,7 @@
#include <uhd/transport/usb_control.hpp>
#include <uhd/usrp/device_props.hpp>
#include <uhd/usrp/mboard_props.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/exception.hpp>
#include <uhd/utils/static.hpp>
#include <uhd/utils/images.hpp>
@@ -78,7 +78,7 @@ static device_addrs_t usrp1_find(const device_addr_t &hint)
usrp1_fw_image = find_image_path(hint.get("fw", "usrp1_fw.ihx"));
}
catch(...){
- uhd::warning::post(
+ UHD_MSG(warning) << boost::format(
"Could not locate USRP1 firmware.\n"
"Please install the images package.\n"
);
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index 77370a7fd..558bcab2a 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -23,7 +23,6 @@
#include <uhd/usrp/device_props.hpp>
#include <uhd/exception.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/utils/warning.hpp>
#include <uhd/utils/byteswap.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
diff --git a/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp b/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp
index fe839c409..3fa60232e 100644
--- a/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp
+++ b/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp
@@ -22,7 +22,6 @@
#include <uhd/exception.hpp>
#include <uhd/utils/static.hpp>
#include <uhd/utils/images.hpp>
-#include <uhd/utils/warning.hpp>
#include <boost/format.hpp>
#include <boost/filesystem.hpp>
#include <boost/functional/hash.hpp>
@@ -58,18 +57,16 @@ static device_addrs_t usrp_e100_find(const device_addr_t &hint){
usrp_e100_iface::sptr iface = usrp_e100_iface::make(new_addr["node"]);
new_addr["name"] = iface->mb_eeprom["name"];
new_addr["serial"] = iface->mb_eeprom["serial"];
- if (
- (not hint.has_key("name") or hint["name"] == new_addr["name"]) and
- (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
- ){
- usrp_e100_addrs.push_back(new_addr);
- }
}
catch(const std::exception &e){
- uhd::warning::post(
- std::string("Ignoring discovered device\n")
- + e.what()
- );
+ new_addr["name"] = "";
+ new_addr["serial"] = "";
+ }
+ if (
+ (not hint.has_key("name") or hint["name"] == new_addr["name"]) and
+ (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
+ ){
+ usrp_e100_addrs.push_back(new_addr);
}
}
diff --git a/host/lib/utils/CMakeLists.txt b/host/lib/utils/CMakeLists.txt
index ae18bde9d..0e0d51c78 100644
--- a/host/lib/utils/CMakeLists.txt
+++ b/host/lib/utils/CMakeLists.txt
@@ -132,6 +132,7 @@ LIBUHD_APPEND_SOURCES(
${CMAKE_CURRENT_SOURCE_DIR}/images.cpp
${CMAKE_CURRENT_SOURCE_DIR}/load_modules.cpp
${CMAKE_CURRENT_SOURCE_DIR}/log.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/msg.cpp
${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp
${CMAKE_CURRENT_SOURCE_DIR}/props.cpp
${CMAKE_CURRENT_SOURCE_DIR}/static.cpp
diff --git a/host/lib/utils/log.cpp b/host/lib/utils/log.cpp
index 0a2861cbd..d99ce01c4 100644
--- a/host/lib/utils/log.cpp
+++ b/host/lib/utils/log.cpp
@@ -167,7 +167,7 @@ private:
UHD_SINGLETON_FCN(uhd_logger_stream_resource_class, uhd_logger_stream_resource);
/***********************************************************************
- * The logger function implementation
+ * The logger object implementation
**********************************************************************/
//! get the relative file path from the host directory
static std::string get_rel_file_path(const fs::path &file){
diff --git a/host/lib/utils/msg.cpp b/host/lib/utils/msg.cpp
new file mode 100644
index 000000000..de6d4c8fa
--- /dev/null
+++ b/host/lib/utils/msg.cpp
@@ -0,0 +1,109 @@
+//
+// Copyright 2011 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/utils/msg.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/static.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/foreach.hpp>
+#include <boost/tokenizer.hpp>
+#include <sstream>
+#include <iostream>
+
+/***********************************************************************
+ * Helper functions
+ **********************************************************************/
+#define tokenizer(inp, sep) \
+ boost::tokenizer<boost::char_separator<char> > \
+ (inp, boost::char_separator<char>(sep))
+
+static void msg_to_cout(const std::string &msg){
+ std::stringstream ss;
+
+ BOOST_FOREACH(const std::string &line, tokenizer(msg, "\n")){
+ ss << "-- " << line << std::endl;
+ }
+
+ std::cout << ss.str();
+}
+
+static void msg_to_cerr(const std::string &title, const std::string &msg){
+ std::stringstream ss;
+
+ ss << std::endl << title << ":" << std::endl;
+ BOOST_FOREACH(const std::string &line, tokenizer(msg, "\n")){
+ ss << " " << line << std::endl;
+ }
+
+ std::cerr << ss.str();
+}
+
+/***********************************************************************
+ * Global settings for the messenger
+ **********************************************************************/
+static boost::mutex msg_mutex;
+static std::ostringstream msg_ss;
+static uhd::msg::type_t msg_type;
+static uhd::msg::handler_t msg_handler;
+
+/***********************************************************************
+ * Setup the message handlers
+ **********************************************************************/
+void uhd::msg::register_handler(const handler_t &handler){
+ msg_mutex.lock();
+ msg_handler = handler;
+ msg_mutex.unlock();
+}
+
+static void default_msg_handler(uhd::msg::type_t type, const std::string &msg){
+ switch(type){
+ case uhd::msg::status:
+ msg_to_cout(msg);
+ break;
+
+ case uhd::msg::warning:
+ msg_to_cerr("UHD Warning", msg);
+ break;
+
+ case uhd::msg::error:
+ msg_to_cerr("UHD Error", msg);
+ break;
+ }
+}
+
+UHD_STATIC_BLOCK(msg_register_default_handler){
+ uhd::msg::register_handler(&default_msg_handler);
+}
+
+/***********************************************************************
+ * The message object implementation
+ **********************************************************************/
+uhd::msg::_msg::_msg(const type_t type){
+ msg_mutex.lock();
+ msg_type = type;
+}
+
+uhd::msg::_msg::~_msg(void){
+ msg_handler(msg_type, msg_ss.str());
+ UHD_LOG << "Message " << char(msg_type) << std::endl << msg_ss.str();
+ msg_ss.str(""); //clear for next call
+ msg_mutex.unlock();
+}
+
+std::ostream & uhd::msg::_msg::get(void){
+ return msg_ss;
+}
diff --git a/host/lib/utils/thread_priority.cpp b/host/lib/utils/thread_priority.cpp
index a63bdf5ce..6d6ca5630 100644
--- a/host/lib/utils/thread_priority.cpp
+++ b/host/lib/utils/thread_priority.cpp
@@ -16,7 +16,7 @@
//
#include <uhd/utils/thread_priority.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/exception.hpp>
#include <boost/format.hpp>
#include <iostream>
@@ -26,11 +26,11 @@ bool uhd::set_thread_priority_safe(float priority, bool realtime){
set_thread_priority(priority, realtime);
return true;
}catch(const std::exception &e){
- uhd::warning::post(str(boost::format(
+ UHD_MSG(warning) << boost::format(
"Unable to set the thread priority. Performance may be negatively affected.\n"
"Please see the general application notes in the manual for instructions.\n"
"%s\n"
- ) % e.what()));
+ ) % e.what();
return false;
}
}
diff --git a/host/lib/utils/warning.cpp b/host/lib/utils/warning.cpp
index 6a94a0a2c..87b6b24f5 100644
--- a/host/lib/utils/warning.cpp
+++ b/host/lib/utils/warning.cpp
@@ -39,13 +39,13 @@ typedef uhd::dict<std::string, warning::handler_t> registry_t;
UHD_SINGLETON_FCN(registry_t, get_registry)
//the default warning handler
-static void stderr_warning(const std::string &msg){
- std::cerr << msg;
-}
+//static void stderr_warning(const std::string &msg){
+// std::cerr << msg;
+//}
//register a default handler
UHD_STATIC_BLOCK(warning_register_default){
- warning::register_handler("default", &stderr_warning);
+ //warning::register_handler("default", &stderr_warning);
}
/***********************************************************************
diff --git a/host/tests/CMakeLists.txt b/host/tests/CMakeLists.txt
index f08fe669b..b38afccf0 100644
--- a/host/tests/CMakeLists.txt
+++ b/host/tests/CMakeLists.txt
@@ -26,12 +26,12 @@ SET(test_sources
dict_test.cpp
error_test.cpp
gain_group_test.cpp
+ msg_test.cpp
ranges_test.cpp
subdev_spec_test.cpp
time_spec_test.cpp
tune_helper_test.cpp
vrt_test.cpp
- warning_test.cpp
wax_test.cpp
)
diff --git a/host/tests/warning_test.cpp b/host/tests/msg_test.cpp
index 3394f84d4..495907504 100644
--- a/host/tests/warning_test.cpp
+++ b/host/tests/msg_test.cpp
@@ -16,14 +16,24 @@
//
#include <boost/test/unit_test.hpp>
-#include <uhd/utils/warning.hpp>
+#include <uhd/utils/msg.hpp>
#include <iostream>
-BOOST_AUTO_TEST_CASE(test_warning_post){
+BOOST_AUTO_TEST_CASE(test_messages){
+ #ifdef UHD_FUTURE
std::cerr << "---begin print test ---" << std::endl;
- uhd::warning::post(
+ UHD_MSG(status) <<
+ "This is a test print for a status message.\n"
+ "And this is the second line of the test print.\n"
+ ;
+ UHD_MSG(warning) <<
"This is a test print for a warning message.\n"
"And this is the second line of the test print.\n"
- );
+ ;
+ UHD_MSG(error) <<
+ "This is a test print for an error message.\n"
+ "And this is the second line of the test print.\n"
+ ;
std::cerr << "---end print test ---" << std::endl;
+ #endif
}