diff options
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  } | 
