diff options
Diffstat (limited to 'host/include')
24 files changed, 457 insertions, 435 deletions
diff --git a/host/include/config.h.in b/host/include/config.h.in index 8e72a1f00..0e8982488 100644 --- a/host/include/config.h.in +++ b/host/include/config.h.in @@ -18,10 +18,10 @@  #cmakedefine HAVE_LOG2  /* Version macros */ -#cmakedefine UHD_VERSION_MAJOR ${TRIMMED_VERSION_MAJOR} -#cmakedefine UHD_VERSION_API   ${TRIMMED_VERSION_API} -#cmakedefine UHD_VERSION_ABI   ${TRIMMED_VERSION_ABI} -#cmakedefine UHD_VERSION_PATCH ${TRIMMED_VERSION_PATCH} +#cmakedefine UHD_VERSION_MAJOR ${UHD_VERSION_MAJOR} +#cmakedefine UHD_VERSION_API   ${UHD_VERSION_API} +#cmakedefine UHD_VERSION_ABI   ${UHD_VERSION_ABI} +#cmakedefine UHD_VERSION_PATCH ${UHD_VERSION_PATCH}  #cmakedefine ENABLE_USB  #ifndef UHD_VERSION  #cmakedefine UHD_VERSION @UHD_VERSION_ADDED@ diff --git a/host/include/uhd/CMakeLists.txt b/host/include/uhd/CMakeLists.txt index e31ff80a0..805db13de 100644 --- a/host/include/uhd/CMakeLists.txt +++ b/host/include/uhd/CMakeLists.txt @@ -18,6 +18,7 @@  ADD_SUBDIRECTORY(rfnoc)  ADD_SUBDIRECTORY(transport)  ADD_SUBDIRECTORY(types) +ADD_SUBDIRECTORY(cal)  ADD_SUBDIRECTORY(usrp)  ADD_SUBDIRECTORY(usrp_clock)  ADD_SUBDIRECTORY(utils) @@ -33,7 +34,6 @@ UHD_INSTALL(FILES      convert.hpp      deprecated.hpp      device.hpp -    device_deprecated.ipp      exception.hpp      property_tree.ipp      property_tree.hpp diff --git a/host/include/uhd/cal/CMakeLists.txt b/host/include/uhd/cal/CMakeLists.txt new file mode 100644 index 000000000..14107ee53 --- /dev/null +++ b/host/include/uhd/cal/CMakeLists.txt @@ -0,0 +1,23 @@ +# +# Copyright 2016 Ettus Research +# +# 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/>. +# + +UHD_INSTALL(FILES +    container.hpp +    power_container.hpp +    DESTINATION ${INCLUDE_DIR}/uhd/cal +    COMPONENT headers +) diff --git a/host/include/uhd/cal/container.hpp b/host/include/uhd/cal/container.hpp new file mode 100644 index 000000000..e4f418311 --- /dev/null +++ b/host/include/uhd/cal/container.hpp @@ -0,0 +1,104 @@ +// +// Copyright 2016 Ettus Research +// +// 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_CAL_CONTAINER_HPP +#define INCLUDED_UHD_CAL_CONTAINER_HPP + +#include <uhd/config.hpp> +#include <boost/serialization/serialization.hpp> +#include <boost/serialization/vector.hpp> +#include <boost/serialization/string.hpp> +#include <boost/serialization/map.hpp> +#include <boost/archive/text_iarchive.hpp> +#include <boost/archive/text_oarchive.hpp> +#include <boost/shared_ptr.hpp> + +namespace uhd { +namespace cal { + +class base_container { +public: +    typedef std::map<std::string, std::string> metadata_t; +    typedef boost::shared_ptr<base_container> sptr; +}; + +/*! + * An interface for creating and managing a generic calibration + * data container. + * + * These containers are used to represent N dimensional data structures + * in order to accommodate a mapping from multi-variable input to a scalar + * value (e.g. gain, frequency, temperature -> power level [dBm]). + * + * The container only supports inputs of the same type to be mapped. + * + */ +template<typename in_type, typename out_type> +class UHD_API cal_container : public base_container { +public: +    typedef std::map<in_type, out_type> container_t; + +    /*! +     * Get the mapping from an input to an output +     * from the calibration container. +     * +     * \param args input values +     * \returns the output of the mapping (a scalar value) +     * \throws uhd::assertion_error if the dimensions of the input args +     *         are incorrect for this container +     */ +    virtual out_type get(const in_type &args) = 0; + +    /*! +     * Add a data point to the container. +     * This function records a mapping R^n -> R between an input vector +     * and output scalar. +     * +     * \param output the output of the data point mapping +     * \param args input values +     */ +    virtual void add(const out_type output, const in_type &args) = 0; + +    /*! +     * Associate some metadata with the container. +     * +     * \param data a map of metadata (string -> string). +     */ +    virtual void add_metadata(const metadata_t &data) = 0; + +    /*! +     * Retrieve metadata from the container. +     * +     * \returns map of metadata. +     */ +    virtual const metadata_t &get_metadata() = 0; + +public: +    typedef boost::archive::text_iarchive iarchive_type; +    typedef boost::archive::text_oarchive oarchive_type; + +protected: +    friend class boost::serialization::access; + +    virtual void serialize(iarchive_type & ar, const unsigned int) = 0; +    virtual void serialize(oarchive_type & ar, const unsigned int) = 0; +}; + +} // namespace cal +} // namespace uhd + +#endif /* INCLUDED_UHD_CAL_CONTAINER_HPP */ diff --git a/host/include/uhd/cal/power_container.hpp b/host/include/uhd/cal/power_container.hpp new file mode 100644 index 000000000..37f7bd8df --- /dev/null +++ b/host/include/uhd/cal/power_container.hpp @@ -0,0 +1,79 @@ +// +// Copyright 2016 Ettus Research +// +// 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_CAL_POWER_CONTAINER_HPP +#define INCLUDED_UHD_CAL_POWER_CONTAINER_HPP + +#include <uhd/config.hpp> +#include <uhd/cal/container.hpp> +#include <boost/shared_ptr.hpp> + +namespace uhd { +namespace cal { + +class UHD_API power_container : public cal_container<std::vector<double>, double> { +public: +    typedef boost::shared_ptr<power_container> sptr; + +    /*! +     * Create a container for data related to power calibration. +     * +     * \returns shared pointer to the container +     */ +    static sptr make(); + +    /*! +     * Get the mapping from an input to an output +     * from the calibration container. +     * +     * \param args input values +     * \returns the output of the mapping (a scalar value) +     * \throws uhd::assertion_error if the number of input values are incorrect +     *         for the container type +     */ +    virtual double get(const std::vector<double> &args) = 0; + +    /*! +     * Add a data point to the container. +     * This function records a mapping R^n -> R between an input vector +     * and output scalar. For example, a mapping might be +     * (power level, frequency, temperature) -> gain. +     * +     * \param output the output of the data point mapping +     * \param args input values +     */ +    virtual void add(const double output, const std::vector<double> &args) = 0; + +    /*! +     * Associate some metadata with the container. +     * +     * \param data a map of metadata (string -> string). +     */ +    virtual void add_metadata(const metadata_t &data) = 0; + +    /*! +     * Retrieve metadata from the container. +     * +     * \returns map of metadata. +     */ +    virtual const metadata_t &get_metadata() = 0; +}; + +} // namespace cal +} // namespace uhd + +#endif /* INCLUDED_UHD_CAL_POWER_CONTAINER_HPP */ diff --git a/host/include/uhd/device.hpp b/host/include/uhd/device.hpp index 894b48c47..28b81a0f6 100644 --- a/host/include/uhd/device.hpp +++ b/host/include/uhd/device.hpp @@ -105,14 +105,22 @@ public:       */      virtual tx_streamer::sptr get_tx_stream(const stream_args_t &args) = 0; +    /*! +     * Receive and asynchronous message from the device. +     * \param async_metadata the metadata to be filled in +     * \param timeout the timeout in seconds to wait for a message +     * \return true when the async_metadata is valid, false for timeout +     */ +    virtual bool recv_async_msg( +        async_metadata_t &async_metadata, double timeout = 0.1 +    ) = 0; +      //! Get access to the underlying property structure      uhd::property_tree::sptr get_tree(void) const;      //! Get device type      device_filter_t get_device_type() const; -    #include <uhd/device_deprecated.ipp> -  protected:      uhd::property_tree::sptr _tree;      device_filter_t _type; diff --git a/host/include/uhd/device_deprecated.ipp b/host/include/uhd/device_deprecated.ipp deleted file mode 100644 index 2741df4e3..000000000 --- a/host/include/uhd/device_deprecated.ipp +++ /dev/null @@ -1,201 +0,0 @@ -// -// Copyright 2010-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/>. -// - -//this file is included inside device class -//it supports the old send/recv functions -//this was replaced by the streamer API - -#define _lazymin(x, y) (((x) > (y))? (y) : (x)) - -/*! - * Send modes for the device send routine. - */ -enum send_mode_t{ -    //! Tells the send routine to send the entire buffer -    SEND_MODE_FULL_BUFF = 0, -    //! Tells the send routine to return after one packet -    SEND_MODE_ONE_PACKET = 1 -}; - -/*! - * Recv modes for the device recv routine. - */ -enum recv_mode_t{ -    //! Tells the recv routine to recv the entire buffer -    RECV_MODE_FULL_BUFF = 0, -    //! Tells the recv routine to return after one packet -    RECV_MODE_ONE_PACKET = 1 -}; - -//! Typedef for a pointer to a single, or a collection of send buffers -typedef ref_vector<const void *> send_buffs_type; - -//! Typedef for a pointer to a single, or a collection of recv buffers -typedef ref_vector<void *> recv_buffs_type; - -/*! - * Send buffers containing IF data described by the metadata. - * - * Send handles fragmentation as follows: - * If the buffer has more samples than the maximum per packet, - * the send method will fragment the samples across several packets. - * Send will respect the burst flags when fragmenting to ensure - * that start of burst can only be set on the first fragment and - * that end of burst can only be set on the final fragment. - * Fragmentation only applies in the full buffer send mode. - * - * This is a blocking call and will not return until the number - * of samples returned have been read out of each buffer. - * Under a timeout condition, the number of samples returned - * may be less than the number of samples specified. - * - * \param buffs a vector of read-only memory containing IF data - * \param nsamps_per_buff the number of samples to send, per buffer - * \param metadata data describing the buffer's contents - * \param io_type the type of data loaded in the buffer - * \param send_mode tells send how to unload the buffer - * \param timeout the timeout in seconds to wait on a packet - * \return the number of samples sent - */ -size_t send( -    const send_buffs_type &buffs, -    size_t nsamps_per_buff, -    const tx_metadata_t &metadata, -    const io_type_t &io_type, -    send_mode_t send_mode, -    double timeout = 0.1 -){ -    if (_tx_streamer.get() == NULL or _tx_streamer->get_num_channels() != buffs.size() or _send_tid != io_type.tid){ -        _send_tid = io_type.tid; -        _tx_streamer.reset(); //cleanup possible old one -        stream_args_t args; -        args.cpu_format = (_send_tid == io_type_t::COMPLEX_FLOAT32)? "fc32" : "sc16"; -        args.otw_format = "sc16"; -        args.args["noclear"] = "1"; -        for (size_t ch = 0; ch < buffs.size(); ch++) -            args.channels.push_back(ch); //linear mapping -        _tx_streamer = get_tx_stream(args); -    } -    const size_t nsamps = (send_mode == SEND_MODE_ONE_PACKET)? -        _lazymin(nsamps_per_buff, get_max_send_samps_per_packet()) : -        nsamps_per_buff; -    return _tx_streamer->send(buffs, nsamps, metadata, timeout); -} - -/*! - * Receive buffers containing IF data described by the metadata. - * - * Receive handles fragmentation as follows: - * If the buffer has insufficient space to hold all samples - * that were received in a single packet over-the-wire, - * then the buffer will be completely filled and the implementation - * will hold a pointer into the remaining portion of the packet. - * Subsequent calls will load from the remainder of the packet, - * and will flag the metadata to show that this is a fragment. - * The next call to receive, after the remainder becomes exhausted, - * will perform an over-the-wire receive as usual. - * See the rx metadata fragment flags and offset fields for details. - * - * This is a blocking call and will not return until the number - * of samples returned have been written into each buffer. - * Under a timeout condition, the number of samples returned - * may be less than the number of samples specified. - * - * When using the full buffer recv mode, the metadata only applies - * to the first packet received and written into the recv buffers. - * Use the one packet recv mode to get per packet metadata. - * - * \param buffs a vector of writable memory to fill with IF data - * \param nsamps_per_buff the size of each buffer in number of samples - * \param metadata data to fill describing the buffer - * \param io_type the type of data to fill into the buffer - * \param recv_mode tells recv how to load the buffer - * \param timeout the timeout in seconds to wait for a packet - * \return the number of samples received or 0 on error - */ -size_t recv( -    const recv_buffs_type &buffs, -    size_t nsamps_per_buff, -    rx_metadata_t &metadata, -    const io_type_t &io_type, -    recv_mode_t recv_mode, -    double timeout = 0.1 -){ -    if (_rx_streamer.get() == NULL or _rx_streamer->get_num_channels() != buffs.size() or _recv_tid != io_type.tid){ -        _recv_tid = io_type.tid; -        _rx_streamer.reset(); //cleanup possible old one -        stream_args_t args; -        args.cpu_format = (_recv_tid == io_type_t::COMPLEX_FLOAT32)? "fc32" : "sc16"; -        args.otw_format = "sc16"; -        args.args["noclear"] = "1"; -        for (size_t ch = 0; ch < buffs.size(); ch++) -            args.channels.push_back(ch); //linear mapping -        _rx_streamer = get_rx_stream(args); -    } -    const size_t nsamps = (recv_mode == RECV_MODE_ONE_PACKET)? -        _lazymin(nsamps_per_buff, get_max_recv_samps_per_packet()) : -        nsamps_per_buff; -    return _rx_streamer->recv(buffs, nsamps, metadata, timeout); -} - -/*! - * Get the maximum number of samples per packet on send. - * \return the number of samples - */ -size_t get_max_send_samps_per_packet(void){ -    if (_tx_streamer.get() == NULL){ -        stream_args_t args; -        args.cpu_format = "fc32"; -        args.otw_format = "sc16"; -        args.args["noclear"] = "1"; -        _tx_streamer = get_tx_stream(args); -        _send_tid = io_type_t::COMPLEX_FLOAT32; -    } -    return _tx_streamer->get_max_num_samps(); -} - -/*! - * Get the maximum number of samples per packet on recv. - * \return the number of samples - */ -size_t get_max_recv_samps_per_packet(void){ -    if (_rx_streamer.get() == NULL){ -        stream_args_t args; -        args.cpu_format = "fc32"; -        args.otw_format = "sc16"; -        args.args["noclear"] = "1"; -        _rx_streamer = get_rx_stream(args); -        _recv_tid = io_type_t::COMPLEX_FLOAT32; -    } -    return _rx_streamer->get_max_num_samps(); -} - -/*! - * Receive and asynchronous message from the device. - * \param async_metadata the metadata to be filled in - * \param timeout the timeout in seconds to wait for a message - * \return true when the async_metadata is valid, false for timeout - */ -virtual bool recv_async_msg( -    async_metadata_t &async_metadata, double timeout = 0.1 -) = 0; - -private: -    rx_streamer::sptr _rx_streamer; -    io_type_t::tid_t _recv_tid; -    tx_streamer::sptr _tx_streamer; -    io_type_t::tid_t _send_tid; diff --git a/host/include/uhd/image_loader.hpp b/host/include/uhd/image_loader.hpp index fd4a96781..4ebac288e 100644 --- a/host/include/uhd/image_loader.hpp +++ b/host/include/uhd/image_loader.hpp @@ -21,6 +21,7 @@  #include <string>  #include <boost/function.hpp> +#include <boost/noncopyable.hpp>  #include <uhd/config.hpp>  #include <uhd/types/device_addr.hpp> diff --git a/host/include/uhd/rfnoc/block_ctrl_base.hpp b/host/include/uhd/rfnoc/block_ctrl_base.hpp index f770cf129..778ded043 100644 --- a/host/include/uhd/rfnoc/block_ctrl_base.hpp +++ b/host/include/uhd/rfnoc/block_ctrl_base.hpp @@ -46,7 +46,6 @@ struct make_args_t  {      make_args_t(const std::string &key="") :          device_index(0), -        is_big_endian(true),          block_name(""),          block_key(key)      {} @@ -61,7 +60,6 @@ struct make_args_t      //  property tree is /mboards/0, pass a subtree starting at /mboards/0      //  to the constructor.      uhd::property_tree::sptr tree; -    bool is_big_endian;      //! The name of the block as it will be addressed      std::string block_name;      //! The key of the block, i.e. how it was registered @@ -391,9 +389,6 @@ protected:      //! Root node of this block's properties      uhd::fs_path _root_path; -    //! Endianness of underlying transport (for data transport) -    bool _transport_is_big_endian; -      //! Block definition (stores info about the block such as ports)      blockdef::sptr _block_def; diff --git a/host/include/uhd/rfnoc/node_ctrl_base.hpp b/host/include/uhd/rfnoc/node_ctrl_base.hpp index 6fd6fd288..0505556ec 100644 --- a/host/include/uhd/rfnoc/node_ctrl_base.hpp +++ b/host/include/uhd/rfnoc/node_ctrl_base.hpp @@ -32,7 +32,7 @@  namespace uhd {      namespace rfnoc { -#define UHD_RFNOC_BLOCK_TRACE() UHD_LOGV(never) << "[" << unique_id() << "] " +#define UHD_RFNOC_BLOCK_TRACE() UHD_LOGGER_TRACE("RFNOC")  /*! \brief Abstract base class for streaming nodes.   * diff --git a/host/include/uhd/rfnoc/node_ctrl_base.ipp b/host/include/uhd/rfnoc/node_ctrl_base.ipp index d300f72a7..df92e2e8b 100644 --- a/host/include/uhd/rfnoc/node_ctrl_base.ipp +++ b/host/include/uhd/rfnoc/node_ctrl_base.ipp @@ -21,7 +21,7 @@  #define INCLUDED_LIBUHD_NODE_CTRL_BASE_IPP  #include <uhd/exception.hpp> -#include <uhd/utils/msg.hpp> +  #include <boost/shared_ptr.hpp>  #include <vector> diff --git a/host/include/uhd/transport/nirio/nirio_quirks.h b/host/include/uhd/transport/nirio/nirio_quirks.h index 45ef40394..f98432d6b 100644 --- a/host/include/uhd/transport/nirio/nirio_quirks.h +++ b/host/include/uhd/transport/nirio/nirio_quirks.h @@ -44,7 +44,7 @@ public:      UHD_INLINE void add_tx_fifo(uint32_t index) {          if (_tx_stream_fifo_indices.find(index) != _tx_stream_fifo_indices.end()) {              if (_tx_stream_count == 0) { -                UHD_LOG << "NI-RIO RX FIFO Transfer Check Quirk Enabled."; +                UHD_LOGGER_DEBUG("NIRIO") << "NI-RIO RX FIFO Transfer Check Quirk Enabled.";              }              _tx_stream_count++;          } @@ -54,7 +54,7 @@ public:          if (_tx_stream_fifo_indices.find(index) != _tx_stream_fifo_indices.end()) {              _tx_stream_count--;              if (_tx_stream_count == 0) { -                UHD_LOG << "NI-RIO RX FIFO Transfer Check Quirk Disabled."; +                UHD_LOGGER_DEBUG("NIRIO") << "NI-RIO RX FIFO Transfer Check Quirk Disabled.";              }          }      } diff --git a/host/include/uhd/transport/nirio/rpc/rpc_client.hpp b/host/include/uhd/transport/nirio/rpc/rpc_client.hpp index 78761c1fc..422f57e8a 100644 --- a/host/include/uhd/transport/nirio/rpc/rpc_client.hpp +++ b/host/include/uhd/transport/nirio/rpc/rpc_client.hpp @@ -65,11 +65,11 @@ private:      inline void _stop_io_service() {          if (_io_service_thread.get()) { -            UHD_LOG << "rpc_client stopping..." << std::endl; +            UHD_LOGGER_INFO("NIRIO") << "rpc_client stopping...";              _io_service.stop();              _io_service_thread->join();              _io_service_thread.reset(); -            UHD_LOG << "rpc_client stopped." << std::endl; +            UHD_LOGGER_INFO("NIRIO") << "rpc_client stopped.";          }      } diff --git a/host/include/uhd/types/filters.hpp b/host/include/uhd/types/filters.hpp index e3756b7a5..f91f35030 100644 --- a/host/include/uhd/types/filters.hpp +++ b/host/include/uhd/types/filters.hpp @@ -20,7 +20,7 @@  #include <uhd/config.hpp>  #include <uhd/utils/log.hpp> -#include <uhd/utils/msg.hpp> +  #include <stdint.h>  #include <boost/shared_ptr.hpp>  #include <boost/scoped_array.hpp> @@ -263,7 +263,7 @@ namespace uhd{          {              std::size_t num_taps = taps.size();              if(num_taps < this->_max_num_taps){ -                UHD_MSG(warning) << "digital_filter_fir::set_taps not enough coefficients. Appending zeros"; +                UHD_LOGGER_WARNING("FILTERS") << "digital_filter_fir::set_taps not enough coefficients. Appending zeros";                  std::vector<tap_t> coeffs;                  for (size_t i = 0; i < this->_max_num_taps; i++)                  { diff --git a/host/include/uhd/types/sid.hpp b/host/include/uhd/types/sid.hpp index 5ea8e8f41..f1471549e 100644 --- a/host/include/uhd/types/sid.hpp +++ b/host/include/uhd/types/sid.hpp @@ -1,5 +1,5 @@  // -// Copyright 2014 Ettus Research LLC +// Copyright 2014-2016 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 @@ -19,9 +19,8 @@  #define INCLUDED_UHD_TYPES_SID_HPP  #include <uhd/config.hpp> -#include <stdint.h> -#include <boost/shared_ptr.hpp>  #include <iostream> +#include <stdint.h>  namespace uhd {      /*! @@ -99,47 +98,47 @@ namespace uhd {          // Getters          //          //! Alias for get_sid() -        UHD_INLINE uint32_t get() const { return get_sid(); }; +        inline uint32_t get() const { return get_sid(); };          //! Returns a 32-Bit representation of the SID if set, or zero otherwise. -        UHD_INLINE uint32_t get_sid() const { return _set ? _sid : 0; }; +        inline uint32_t get_sid() const { return _set ? _sid : 0; };          //! Return the 16-bit source address of this SID -        UHD_INLINE uint32_t get_src() const { +        inline uint32_t get_src() const {              return (_sid >> 16) & 0xFFFF;          }          //! Return the 16-bit destination address of this SID -        UHD_INLINE uint32_t get_dst() const { +        inline uint32_t get_dst() const {              return _sid & 0xFFFF;          }          //! Return 8-bit address of the source -        UHD_INLINE uint32_t get_src_addr() const { +        inline uint32_t get_src_addr() const {              return (get_src() >> 8) & 0xFF;          }          //! Return endpoint of the source -        UHD_INLINE uint32_t get_src_endpoint() const { +        inline uint32_t get_src_endpoint() const {              return get_src() & 0xFF;          }          //! Return crossbar port of the source -        UHD_INLINE uint32_t get_src_xbarport() const { +        inline uint32_t get_src_xbarport() const {              return (get_src_endpoint() >> 4) & 0xF;          }          //! Return block port of the source -        UHD_INLINE uint32_t get_src_blockport() const { +        inline uint32_t get_src_blockport() const {              return (get_src_endpoint()) & 0xF;          }          //! Return 8-bit address of the destination -        UHD_INLINE uint32_t get_dst_addr() const { +        inline uint32_t get_dst_addr() const {              return (get_dst() >> 8) & 0xFF;          }          //! Return endpoint of the destination -        UHD_INLINE uint32_t get_dst_endpoint() const { +        inline uint32_t get_dst_endpoint() const {              return get_dst() & 0xFF;          }          //! Return crossbar port of the source -        UHD_INLINE uint32_t get_dst_xbarport() const { +        inline uint32_t get_dst_xbarport() const {              return (get_dst_endpoint() >> 4) & 0xF;          }          //! Return block port of the source -        UHD_INLINE uint32_t get_dst_blockport() const { +        inline uint32_t get_dst_blockport() const {              return (get_dst_endpoint()) & 0xF;          } @@ -168,14 +167,14 @@ namespace uhd {          // Manipulators          //! Swaps dst and src address and returns the new SID. -        sid_t reversed(); +        sid_t reversed() const; -        //! Swaps dst and src in-place. +        //! Swaps dst and src in-place. This modifies the current SID.          void reverse();          // Overloaded operators -        sid_t operator = (uint32_t new_sid) { +        sid_t operator = (const uint32_t new_sid) {              set_sid(new_sid);              return *this;          } @@ -185,6 +184,11 @@ namespace uhd {              return *this;          } +        sid_t operator = (const sid_t &sid) { +            set_sid(sid.get_sid()); +            return *this; +        } +          sid_t operator = (const std::string &sid_str) {              set_from_str(sid_str);              return *this; @@ -222,7 +226,7 @@ namespace uhd {      };      //! Stream output operator. Honors std::ios::hex. -    UHD_INLINE std::ostream& operator<< (std::ostream& out, const sid_t &sid) { +    inline std::ostream& operator<< (std::ostream& out, const sid_t &sid) {          std::ios_base::fmtflags ff = out.flags();          if (ff & std::ios::hex) {              out << sid.to_pp_string_hex(); diff --git a/host/include/uhd/utils/CMakeLists.txt b/host/include/uhd/utils/CMakeLists.txt index af6d3ee47..5a6e9a48f 100644 --- a/host/include/uhd/utils/CMakeLists.txt +++ b/host/include/uhd/utils/CMakeLists.txt @@ -29,7 +29,6 @@ UHD_INSTALL(FILES      gain_group.hpp      log.hpp      math.hpp -    msg.hpp      msg_task.hpp      paths.hpp      pimpl.hpp diff --git a/host/include/uhd/utils/assert_has.ipp b/host/include/uhd/utils/assert_has.ipp index 7b3c88cb7..974eea5a5 100644 --- a/host/include/uhd/utils/assert_has.ipp +++ b/host/include/uhd/utils/assert_has.ipp @@ -21,8 +21,8 @@  #include <uhd/utils/algorithm.hpp>  #include <uhd/exception.hpp>  #include <boost/format.hpp> -#include <boost/foreach.hpp>  #include <boost/lexical_cast.hpp> +#include <boost/foreach.hpp>  namespace uhd{ diff --git a/host/include/uhd/utils/atomic.hpp b/host/include/uhd/utils/atomic.hpp index ec4d3e0a2..f37fb4395 100644 --- a/host/include/uhd/utils/atomic.hpp +++ b/host/include/uhd/utils/atomic.hpp @@ -68,76 +68,6 @@ namespace uhd{      };      /*! -     * A reusable barrier to sync multiple threads. -     * All threads spin on wait() until count is reset. -     */ -    class UHD_API reusable_barrier{ -    public: - -        reusable_barrier():_size (0) {} - -        reusable_barrier(const size_t size):_size(size) {} - -        //! Resize the barrier for N threads -        void resize(const size_t size){ -            _size = size; -        } - -        /*! -         * Force the barrier wait to throw a boost::thread_interrupted -         * The threads were not getting the interruption_point on windows. -         */ -        void interrupt(void) -        { -            _done.inc(); -        } - -        //! Wait on the barrier condition -        UHD_INLINE void wait(void) -        { -            if (_size == 1) return; - -            //entry barrier with condition variable -            _entry_counter.inc(); -            _entry_counter.cas(0, _size); -            boost::mutex::scoped_lock lock(_mutex); -            while (_entry_counter.read() != 0) -            { -                this->check_interrupt(); -                _cond.timed_wait(lock, boost::posix_time::milliseconds(1)); -            } -            lock.unlock(); //unlock before notify -            _cond.notify_one(); - -            //exit barrier to ensure known condition of entry count -            _exit_counter.inc(); -            _exit_counter.cas(0, _size); -            while (_exit_counter.read() != 0) this->check_interrupt(); -        } - -        //! Wait on the barrier condition -        UHD_INLINE void wait_others(void) -        { -            while (_entry_counter.read() != (_size-1)) this->check_interrupt(); -        } - -    private: -        size_t _size; -        atomic_uint32_t _entry_counter; -        atomic_uint32_t _exit_counter; -        atomic_uint32_t _done; -        boost::mutex _mutex; -        boost::condition_variable _cond; - -        UHD_INLINE void check_interrupt(void) -        { -            if (_done.read() != 0) throw boost::thread_interrupted(); -            boost::this_thread::interruption_point(); -            boost::this_thread::yield(); -        } -    }; - -    /*!       * Spin-wait on a condition with a timeout.       * \param cond an atomic variable to compare       * \param value compare to atomic for true/false diff --git a/host/include/uhd/utils/fp_compare_delta.ipp b/host/include/uhd/utils/fp_compare_delta.ipp index 292ef4bf6..9a03bd95b 100644 --- a/host/include/uhd/utils/fp_compare_delta.ipp +++ b/host/include/uhd/utils/fp_compare_delta.ipp @@ -15,7 +15,7 @@  // along with this program.  If not, see <http://www.gnu.org/licenses/>.  // -#include <uhd/utils/msg.hpp> +  #include <cmath>  #include <typeinfo> diff --git a/host/include/uhd/utils/fp_compare_epsilon.ipp b/host/include/uhd/utils/fp_compare_epsilon.ipp index ff2d585db..af71046ed 100644 --- a/host/include/uhd/utils/fp_compare_epsilon.ipp +++ b/host/include/uhd/utils/fp_compare_epsilon.ipp @@ -15,7 +15,7 @@  // along with this program.  If not, see <http://www.gnu.org/licenses/>.  // -#include <uhd/utils/msg.hpp> +  #include <cmath>  #include <typeinfo> diff --git a/host/include/uhd/utils/log.hpp b/host/include/uhd/utils/log.hpp index 106c0d9d5..d90fb4667 100644 --- a/host/include/uhd/utils/log.hpp +++ b/host/include/uhd/utils/log.hpp @@ -21,81 +21,219 @@  #include <uhd/config.hpp>  #include <uhd/utils/pimpl.hpp>  #include <boost/current_function.hpp> -#include <boost/format.hpp> +#include <boost/thread/thread.hpp>  #include <ostream>  #include <string>  #include <sstream> +#include <iostream>  /*! \file log.hpp - * The UHD logging facility. + * The UHD logging facility + * =========================   * - * The logger enables UHD library code to easily log events into a file. + * The logger enables UHD library code to easily log events into a file and display + * messages above a certain level in the terminal.   * Log entries are time-stamped and stored with file, line, and function. - * Each call to the UHD_LOG macros is synchronous and thread-safe. + * Each call to the UHD_LOG macros is thread-safe. Each thread will aquire the lock + * for the logger.   * - * The log file can be found in the path <temp-directory>/uhd.log, - * where <temp-directory> is the user or system's temporary directory. - * To override <temp-directory>, set the UHD_TEMP_PATH environment variable. + * To disable console logging completely at compile time specify + * `-DUHD_LOG_CONSOLE_DISABLE` during configuration with CMake. + * + * By default no file logging will occur. Set a log file path: + *  - at compile time by specifying `-DUHD_LOG_FILE=$file_path` + *  - and/or override at runtime by setting the environment variable `UHD_LOG_FILE` + * + * Log levels + * ----------   *   * All log messages with verbosity greater than or equal to the log level   * (in other words, as often or less often than the current log level) - * are recorded into the log file. All other messages are sent to null. + * are recorded to std::clog and/or the log file. + * Log levels can be specified using string or numeric values of uhd::log::severity_level.   * - * The default log level is "never", but can be overridden: - *  - at compile time by setting the pre-processor define UHD_LOG_LEVEL. - *  - at runtime by setting the environment variable UHD_LOG_LEVEL. + * The default log level is "info", but can be overridden: + *  - at compile time by setting the pre-processor define `-DUHD_LOG_MIN_LEVEL`. + *  - at runtime by setting the environment variable `UHD_LOG_LEVEL`. + *  - for console logging by setting `(-D)UHD_LOG_CONSOLE_LEVEL` at run-/compiletime + *  - for file logging by setting `(-D)UHD_LOG_FILE_LEVEL` at run-/compiletime   *   * UHD_LOG_LEVEL can be the name of a verbosity enum or integer value: - *   - Example pre-processor define: -DUHD_LOG_LEVEL=3 - *   - Example pre-processor define: -DUHD_LOG_LEVEL=regularly - *   - Example environment variable: export UHD_LOG_LEVEL=3 - *   - Example environment variable: export UHD_LOG_LEVEL=regularly + *   - Example pre-processor define: `-DUHD_LOG_MIN_LEVEL=3` + *   - Example pre-processor define: `-DUHD_LOG_MIN_LEVEL=info` + *   - Example environment variable: `export UHD_LOG_LEVEL=3` + *   - Example environment variable: `export UHD_LOG_LEVEL=info` + * + * Log formatting + * -------------- + * + * The log format for messages going into a log file is CSV. + * All log messages going into a logfile will contain following fields: + * - timestamp + * - thread-id + * - source-file + line information + * - severity level + * - component/channel information which logged the information + * - the actual log message + * + * The log format of log messages displayed on the terminal is plain text with space separated tags prepended. + * For example: + *    - `[INFO] [x300] This is a informational log message` + * + * The log format for log output on the console by using these preprocessor defines in CMake: + * - `-DUHD_LOG_CONSOLE_TIME` adds a timestamp [2017-01-01 00:00:00.000000] + * - `-DUHD_LOG_CONSOLE_THREAD` adds a thread-id `[0x001234]` + * - `-DUHD_LOG_CONSOLE_SRC` adds a sourcefile and line tag `[src_file:line]`   */ -/*! - * A UHD logger macro with configurable verbosity. - * Usage: UHD_LOGV(very_rarely) << "the log message" << std::endl; +/* + * Advanced logging macros + * UHD_LOG_MIN_LEVEL definitions + * trace: 0 + * debug: 1 + * info: 2 + * warning: 3 + * error: 4 + * fatal: 5   */ -#define UHD_LOGV(verbosity) \ -    uhd::_log::log(uhd::_log::verbosity, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) -/*! - * A UHD logger macro with default verbosity. - * Usage: UHD_LOG << "the log message" << std::endl; - */ -#define UHD_LOG \ -    UHD_LOGV(regularly) +namespace uhd { +    namespace log { +        /** logging severity levels +         * Either numeric value or string can be used to define loglevel in CMake and environment variables +         */ +        enum severity_level { +            trace   = 0, /**< displays every available log message */ +            debug   = 1, /**< displays most log messages necessary for debugging internals */ +            info    = 2, /**< informational messages about setup and what is going on*/ +            warning = 3, /**< something is not right but operation can continue */ +            error   = 4, /**< something has gone wrong */ +            fatal   = 5, /**< something has gone horribly wrong */ +            off = 6, /**< logging is turned off */ +        }; +        // The operator is used when putting the severity level to log +        template <typename CharT, typename TraitsT> +        inline std::basic_ostream<CharT, TraitsT>& +        operator<<(std::basic_ostream<CharT, TraitsT>& strm, severity_level level) +        { +            static const char* strings[] = {"TRACE",   "DEBUG", "INFO", +                                            "WARNING", "ERROR", "FATAL" +            }; -namespace uhd{ namespace _log{ +            if (static_cast<std::size_t>(level) < sizeof(strings) / sizeof(*strings)) { +                strm << strings[level]; +            } else { +                strm << static_cast<int>(level); +            } -    //! Verbosity levels for the logger -    enum verbosity_t{ -        always      = 1, -        often       = 2, -        regularly   = 3, -        rarely      = 4, -        very_rarely = 5, -        never       = 6 -    }; +            return strm; +        } + + +    } +} + + +// internal logging macro to be used in other macros +#define _UHD_LOG_INTERNAL(component, level) \ +    uhd::_log::log(level, __FILE__, __LINE__, component, boost::this_thread::get_id()) + +// macro-style logging (compile-time determined) +#if UHD_LOG_MIN_LEVEL < 1 +#define UHD_LOG_TRACE(component, message) \ +    _UHD_LOG_INTERNAL(component, uhd::log::trace) << message; +#else +#define UHD_LOG_TRACE(component, message) +#endif + +#if UHD_LOG_MIN_LEVEL < 2 +#define UHD_LOG_DEBUG(component, message) \ +    _UHD_LOG_INTERNAL(component, uhd::log::debug) << message; +#else +#define UHD_LOG_DEBUG(component, message) +#endif + +#if UHD_LOG_MIN_LEVEL < 3 +#define UHD_LOG_INFO(component, message) \ +    _UHD_LOG_INTERNAL(component, uhd::log::info) << message; +#else +#define UHD_LOG_INFO(component, message) +#endif + +#if UHD_LOG_MIN_LEVEL < 4 +#define UHD_LOG_WARNING(component, message) \ +    _UHD_LOG_INTERNAL(component, uhd::log::warning) << message; +#else +#define UHD_LOG_WARNING(component, message) +#endif + +#if UHD_LOG_MIN_LEVEL < 5 +#define UHD_LOG_ERROR(component, message) \ +    _UHD_LOG_INTERNAL(component, uhd::log::error) << message; +#else +#define UHD_LOG_ERROR(component, message) +#endif + +#if UHD_LOG_MIN_LEVEL < 6 +#define UHD_LOG_FATAL(component, message) \ +    _UHD_LOG_INTERNAL(component, uhd::log::fatal) << message; +#else +#define UHD_LOG_FATAL(component, message) +#endif + +#define UHD_LOG_FASTPATH(message)               \ +    std::cerr << message << std::flush; + +// iostream-style logging +#define UHD_LOGGER_TRACE(component) _UHD_LOG_INTERNAL(component, uhd::log::trace) +#define UHD_LOGGER_DEBUG(component) _UHD_LOG_INTERNAL(component, uhd::log::debug) +#define UHD_LOGGER_INFO(component) _UHD_LOG_INTERNAL(component, uhd::log::info) +#define UHD_LOGGER_WARNING(component) _UHD_LOG_INTERNAL(component, uhd::log::warning) +#define UHD_LOGGER_ERROR(component) _UHD_LOG_INTERNAL(component, uhd::log::error) +#define UHD_LOGGER_FATAL(component) _UHD_LOG_INTERNAL(component, uhd::log::fatal) + + +//! Helpful debug tool to print site info +#define UHD_HERE()                                              \ +    UHD_LOGGER_DEBUG("DEBUG") << __FILE__ << ":" << __LINE__; + +//! Helpful debug tool to print a variable +#define UHD_VAR(var)                                        \ +    UHD_LOGGER_DEBUG("DEBUG") << #var << " = " << var; + +//! Helpful debug tool to print a variable in hex +#define UHD_HEX(var)                                                    \ +    UHD_LOGGER_DEBUG("DEBUG") << #var << " = 0x" << std::hex << std::setfill('0') << std::setw(8) << var << std::dec; + + + +namespace uhd{ namespace _log{      //! Internal logging object (called by UHD_LOG macros)      class UHD_API log {      public:          log( -            const verbosity_t verbosity, +            const uhd::log::severity_level verbosity,              const std::string &file,              const unsigned int line, -            const std::string &function +            const std::string &component, +            const boost::thread::id id          );          ~log(void); +        static void set_log_level(uhd::log::severity_level level); +        static void set_console_level(uhd::log::severity_level level); +        static void set_file_level(uhd::log::severity_level level); +          // Macro for overloading insertion operators to avoid costly          // conversion of types if not logging.          #define INSERTION_OVERLOAD(x)   log& operator<< (x)             \                                          {                               \ -                                            if(_log_it) _ss << val;     \ +                                            if(_log_it) {               \ +                                                _ss << val ;            \ +                                            }                           \                                              return *this;               \                                          } @@ -110,9 +248,30 @@ namespace uhd{ namespace _log{      private:          std::ostringstream _ss; +        std::ostringstream _file; +        std::ostringstream _console;          bool _log_it; +        bool _log_file; +        bool _log_console;      }; -}} //namespace uhd::_log +    } //namespace uhd::_log +    namespace log{ +        inline void +        set_console_level(severity_level level){ +            ::uhd::_log::log::set_console_level(level); +        } + +        inline void +        set_log_level(severity_level level){ +            ::uhd::_log::log::set_log_level(level); +        } + +        inline void +        set_file_level(severity_level level){ +            ::uhd::_log::log::set_file_level(level); +        } +    } +}  #endif /* INCLUDED_UHD_UTILS_LOG_HPP */ diff --git a/host/include/uhd/utils/msg.hpp b/host/include/uhd/utils/msg.hpp deleted file mode 100644 index 2cc5893e7..000000000 --- a/host/include/uhd/utils/msg.hpp +++ /dev/null @@ -1,79 +0,0 @@ -// -// Copyright 2011-2013 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 <uhd/utils/pimpl.hpp> -#include <ostream> -#include <iomanip> -#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)() - -//! Helpful debug tool to print site info -#define UHD_HERE() \ -    UHD_MSG(status) << __FILE__ << ":" << __LINE__ << std::endl - -//! Helpful debug tool to print a variable -#define UHD_VAR(var) \ -    UHD_MSG(status) << #var << " = " << var << std::endl; - -//! Helpful debug tool to print a variable in hex -#define UHD_HEX(var) \ -    UHD_MSG(status) << #var << " = 0x" << std::hex << std::setfill('0') << std::setw(8) << var << std::dec << std::endl; - -namespace uhd{ namespace msg{ - -    //! Possible message types -    enum type_t{ -        status  = 's', -        warning = 'w', -        error   = 'e', -        fastpath= 'f' -    }; - -    //! 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 void register_handler(const handler_t &handler); - -    //! Internal message object (called by UHD_MSG macro) -    class UHD_API _msg{ -    public: -        _msg(const type_t type); -        ~_msg(void); -        std::ostream &operator()(void); -    private: -        UHD_PIMPL_DECL(impl) _impl; -    }; - -}} //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 ab287cc66..d04d89436 100644 --- a/host/include/uhd/utils/safe_call.hpp +++ b/host/include/uhd/utils/safe_call.hpp @@ -23,7 +23,7 @@  #include <uhd/utils/log.hpp>  //! helper macro for safe call to produce warnings -#define _UHD_SAFE_CALL_WARNING(code, what) UHD_LOGV(rarely) << \ +#define _UHD_SAFE_CALL_WARNING(code, what) UHD_LOGGER_ERROR("UHD") << \      UHD_THROW_SITE_INFO("Exception caught in safe-call.") + #code + " -> " + what \  ; diff --git a/host/include/uhd/version.hpp.in b/host/include/uhd/version.hpp.in index 8cfc7b8c6..c16739a78 100644 --- a/host/include/uhd/version.hpp.in +++ b/host/include/uhd/version.hpp.in @@ -24,7 +24,7 @@   * The format is oldest API compatible release - ABI compat number.   * The compatibility number allows pre-release ABI to be versioned.   */ -#define UHD_VERSION_ABI_STRING "@TRIMMED_VERSION_MAJOR@.@TRIMMED_VERSION_API@.@TRIMMED_VERSION_ABI@" +#define UHD_VERSION_ABI_STRING "@UHD_VERSION_MAJOR@.@UHD_VERSION_API@.@UHD_VERSION_ABI@"  /*!   * A macro to check UHD version at compile-time.  | 
