aboutsummaryrefslogtreecommitdiffstats
path: root/host/include
diff options
context:
space:
mode:
Diffstat (limited to 'host/include')
-rw-r--r--host/include/uhd/convert.hpp8
-rw-r--r--host/include/uhd/stream.hpp2
-rw-r--r--host/include/uhd/transport/zero_copy.hpp106
-rw-r--r--host/include/uhd/types/ranges.hpp5
-rw-r--r--host/include/uhd/usrp/mboard_eeprom.hpp18
-rw-r--r--host/include/uhd/usrp/multi_usrp.hpp35
-rw-r--r--host/include/uhd/utils/CMakeLists.txt3
-rw-r--r--host/include/uhd/utils/atomic.hpp161
-rw-r--r--host/include/uhd/utils/images.hpp17
-rw-r--r--host/include/uhd/utils/paths.hpp5
-rw-r--r--host/include/uhd/version.hpp2
11 files changed, 275 insertions, 87 deletions
diff --git a/host/include/uhd/convert.hpp b/host/include/uhd/convert.hpp
index f906ff0e9..c6b005867 100644
--- a/host/include/uhd/convert.hpp
+++ b/host/include/uhd/convert.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 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
@@ -80,9 +80,13 @@ namespace uhd{ namespace convert{
/*!
* Get a converter factory function.
* \param id identify the conversion
+ * \param prio the desired prio or -1 for best
* \return the converter factory function
*/
- UHD_API function_type get_converter(const id_type &id);
+ UHD_API function_type get_converter(
+ const id_type &id,
+ const priority_type prio = -1
+ );
/*!
* Register the size of a particular item.
diff --git a/host/include/uhd/stream.hpp b/host/include/uhd/stream.hpp
index 1fb846955..c8ab303ad 100644
--- a/host/include/uhd/stream.hpp
+++ b/host/include/uhd/stream.hpp
@@ -53,9 +53,9 @@ struct UHD_API stream_args_t{
* - fc64 - complex<double>
* - fc32 - complex<float>
* - sc16 - complex<int16_t>
+ * - sc8 - complex<int8_t>
*
* The following are not implemented, but are listed to demonstrate naming convention:
- * - sc8 - complex<int8_t>
* - f32 - float
* - f64 - double
* - s16 - int16_t
diff --git a/host/include/uhd/transport/zero_copy.hpp b/host/include/uhd/transport/zero_copy.hpp
index f80c738aa..1dc0e8e26 100644
--- a/host/include/uhd/transport/zero_copy.hpp
+++ b/host/include/uhd/transport/zero_copy.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010-2011 Ettus Research LLC
+// Copyright 2010-2012 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
@@ -22,23 +22,14 @@
#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/intrusive_ptr.hpp>
+#include <boost/detail/atomic_count.hpp>
namespace uhd{ namespace transport{
- //! Create smart pointer to a reusable managed buffer
- template <typename T> UHD_INLINE boost::intrusive_ptr<T> make_managed_buffer(T *p){
- p->_ref_count = 1; //reset the count to 1 reference
- return boost::intrusive_ptr<T>(p, false);
- }
-
- /*!
- * A managed receive buffer:
- * Contains a reference to transport-managed memory,
- * and a method to release the memory after reading.
- */
- class UHD_API managed_recv_buffer{
+ //! Simple managed buffer with release interface
+ class UHD_API managed_buffer{
public:
- typedef boost::intrusive_ptr<managed_recv_buffer> sptr;
+ managed_buffer(void):_ref_count(0){}
/*!
* Signal to the transport that we are done with the buffer.
@@ -48,84 +39,73 @@ namespace uhd{ namespace transport{
virtual void release(void) = 0;
/*!
+ * Use commit() to re-write the length (for use with send buffers).
+ * \param num_bytes the number of bytes written into the buffer
+ */
+ UHD_INLINE void commit(size_t num_bytes){
+ _length = num_bytes;
+ }
+
+ /*!
* Get a pointer to the underlying buffer.
* \return a pointer into memory
*/
- template <class T> inline T cast(void) const{
- return static_cast<T>(this->get_buff());
+ template <class T> UHD_INLINE T cast(void) const{
+ return static_cast<T>(_buffer);
}
/*!
* Get the size of the underlying buffer.
* \return the number of bytes
*/
- inline size_t size(void) const{
- return this->get_size();
+ UHD_INLINE size_t size(void) const{
+ return _length;
}
- private:
- virtual const void *get_buff(void) const = 0;
- virtual size_t get_size(void) const = 0;
+ //! Create smart pointer to a reusable managed buffer
+ template <typename T> UHD_INLINE boost::intrusive_ptr<T> make(
+ T *p, void *buffer, size_t length
+ ){
+ _buffer = buffer;
+ _length = length;
+ return boost::intrusive_ptr<T>(p);
+ }
+
+ boost::detail::atomic_count _ref_count;
- public: int _ref_count;
+ protected:
+ void *_buffer;
+ size_t _length;
};
- UHD_INLINE void intrusive_ptr_add_ref(managed_recv_buffer *p){
+ UHD_INLINE void intrusive_ptr_add_ref(managed_buffer *p){
++(p->_ref_count);
}
- UHD_INLINE void intrusive_ptr_release(managed_recv_buffer *p){
+ UHD_INLINE void intrusive_ptr_release(managed_buffer *p){
if (--(p->_ref_count) == 0) p->release();
}
/*!
+ * A managed receive buffer:
+ * Contains a reference to transport-managed memory,
+ * and a method to release the memory after reading.
+ */
+ class UHD_API managed_recv_buffer : public managed_buffer{
+ public:
+ typedef boost::intrusive_ptr<managed_recv_buffer> sptr;
+ };
+
+ /*!
* A managed send buffer:
* Contains a reference to transport-managed memory,
* and a method to commit the memory after writing.
*/
- class UHD_API managed_send_buffer{
+ class UHD_API managed_send_buffer : public managed_buffer{
public:
typedef boost::intrusive_ptr<managed_send_buffer> sptr;
-
- /*!
- * Signal to the transport that we are done with the buffer.
- * This should be called to commit the write to the transport object.
- * After calling, the referenced memory should be considered invalid.
- * \param num_bytes the number of bytes written into the buffer
- */
- virtual void commit(size_t num_bytes) = 0;
-
- /*!
- * Get a pointer to the underlying buffer.
- * \return a pointer into memory
- */
- template <class T> inline T cast(void) const{
- return static_cast<T>(this->get_buff());
- }
-
- /*!
- * Get the size of the underlying buffer.
- * \return the number of bytes
- */
- inline size_t size(void) const{
- return this->get_size();
- }
-
- private:
- virtual void *get_buff(void) const = 0;
- virtual size_t get_size(void) const = 0;
-
- public: int _ref_count;
};
- UHD_INLINE void intrusive_ptr_add_ref(managed_send_buffer *p){
- ++(p->_ref_count);
- }
-
- UHD_INLINE void intrusive_ptr_release(managed_send_buffer *p){
- if (--(p->_ref_count) == 0) p->commit(0);
- }
-
/*!
* A zero-copy interface for transport objects.
* Provides a way to get send and receive buffers
diff --git a/host/include/uhd/types/ranges.hpp b/host/include/uhd/types/ranges.hpp
index f0d0e1c0b..ac632df93 100644
--- a/host/include/uhd/types/ranges.hpp
+++ b/host/include/uhd/types/ranges.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010-2011 Ettus Research LLC
+// Copyright 2010-2012 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,7 +19,6 @@
#define INCLUDED_UHD_TYPES_RANGES_HPP
#include <uhd/config.hpp>
-#include <uhd/utils/pimpl.hpp>
#include <string>
#include <vector>
@@ -60,7 +59,7 @@ namespace uhd{
//! Convert this range to a printable string
const std::string to_pp_string(void) const;
- private: UHD_PIMPL_DECL(impl) _impl;
+ private: double _start, _stop, _step;
};
/*!
diff --git a/host/include/uhd/usrp/mboard_eeprom.hpp b/host/include/uhd/usrp/mboard_eeprom.hpp
index c47f894be..f064e9956 100644
--- a/host/include/uhd/usrp/mboard_eeprom.hpp
+++ b/host/include/uhd/usrp/mboard_eeprom.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010 Ettus Research LLC
+// Copyright 2010-2012 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
@@ -34,30 +34,22 @@ namespace uhd{ namespace usrp{
*/
struct UHD_API mboard_eeprom_t : uhd::dict<std::string, std::string>{
- //! Possible EEPROM maps types
- enum map_type{
- MAP_N100,
- MAP_B000,
- MAP_B100,
- MAP_E100
- };
-
//! Make a new empty mboard eeprom
mboard_eeprom_t(void);
/*!
* Make a new mboard EEPROM handler.
* \param iface the interface to i2c
- * \param map the map type enum
+ * \param which which EEPROM map to use
*/
- mboard_eeprom_t(i2c_iface &iface, map_type map);
+ mboard_eeprom_t(i2c_iface &iface, const std::string &which);
/*!
* Write the contents of this object to the EEPROM.
* \param iface the interface to i2c
- * \param map the map type enum
+ * \param which which EEPROM map to use
*/
- void commit(i2c_iface &iface, map_type map) const;
+ void commit(i2c_iface &iface, const std::string &which) const;
};
diff --git a/host/include/uhd/usrp/multi_usrp.hpp b/host/include/uhd/usrp/multi_usrp.hpp
index 88affa40c..2e83823ba 100644
--- a/host/include/uhd/usrp/multi_usrp.hpp
+++ b/host/include/uhd/usrp/multi_usrp.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010-2011 Ettus Research LLC
+// Copyright 2010-2012 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
@@ -25,6 +25,7 @@
#define UHD_USRP_MULTI_USRP_COMMAND_TIME_API
#define UHD_USRP_MULTI_USRP_BW_RANGE_API
#define UHD_USRP_MULTI_USRP_USER_REGS_API
+#define UHD_USRP_MULTI_USRP_GET_USRP_INFO_API
#include <uhd/config.hpp>
#include <uhd/device.hpp>
@@ -127,6 +128,24 @@ public:
return this->get_device()->get_tx_stream(args);
}
+ /*!
+ * Returns identifying information about this USRP's configuration.
+ * Returns motherboard ID, name, and serial.
+ * Returns daughterboard RX ID, subdev name and spec, serial, and antenna.
+ * \param chan channel index 0 to N-1
+ * \return RX info
+ */
+ virtual dict<std::string, std::string> get_usrp_rx_info(size_t chan = 0) = 0;
+
+ /*!
+ * Returns identifying information about this USRP's configuration.
+ * Returns motherboard ID, name, and serial.
+ * Returns daughterboard TX ID, subdev name and spec, serial, and antenna.
+ * \param chan channel index 0 to N-1
+ * \return TX info
+ */
+ virtual dict<std::string, std::string> get_usrp_tx_info(size_t chan = 0) = 0;
+
/*******************************************************************
* Mboard methods
******************************************************************/
@@ -428,6 +447,13 @@ public:
virtual freq_range_t get_rx_freq_range(size_t chan = 0) = 0;
/*!
+ * Get the center frequency range of the RF frontend.
+ * \param chan the channel index 0 to N-1
+ * \return a frequency range object
+ */
+ virtual freq_range_t get_fe_rx_freq_range(size_t chan = 0) = 0;
+
+ /*!
* Set the RX gain value for the specified gain element.
* For an empty name, distribute across all gain elements.
* \param gain the gain in dB
@@ -674,6 +700,13 @@ public:
virtual freq_range_t get_tx_freq_range(size_t chan = 0) = 0;
/*!
+ * Get the center frequency range of the TX frontend.
+ * \param chan the channel index 0 to N-1
+ * \return a frequency range object
+ */
+ virtual freq_range_t get_fe_tx_freq_range(size_t chan = 0) = 0;
+
+ /*!
* Set the TX gain value for the specified gain element.
* For an empty name, distribute across all gain elements.
* \param gain the gain in dB
diff --git a/host/include/uhd/utils/CMakeLists.txt b/host/include/uhd/utils/CMakeLists.txt
index 5a434fd9a..de91993fe 100644
--- a/host/include/uhd/utils/CMakeLists.txt
+++ b/host/include/uhd/utils/CMakeLists.txt
@@ -1,5 +1,5 @@
#
-# Copyright 2010-2011 Ettus Research LLC
+# Copyright 2010-2012 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,6 +19,7 @@ INSTALL(FILES
algorithm.hpp
assert_has.hpp
assert_has.ipp
+ atomic.hpp
byteswap.hpp
byteswap.ipp
csv.hpp
diff --git a/host/include/uhd/utils/atomic.hpp b/host/include/uhd/utils/atomic.hpp
new file mode 100644
index 000000000..7a81d8d5e
--- /dev/null
+++ b/host/include/uhd/utils/atomic.hpp
@@ -0,0 +1,161 @@
+//
+// Copyright 2012 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_ATOMIC_HPP
+#define INCLUDED_UHD_UTILS_ATOMIC_HPP
+
+#include <uhd/config.hpp>
+#include <uhd/types/time_spec.hpp>
+#include <boost/thread/thread.hpp>
+#include <boost/interprocess/detail/atomic.hpp>
+
+#include <boost/version.hpp>
+#if BOOST_VERSION >= 104800
+# define BOOST_IPC_DETAIL boost::interprocess::ipcdetail
+#else
+# define BOOST_IPC_DETAIL boost::interprocess::detail
+#endif
+
+namespace uhd{
+
+ //! A 32-bit integer that can be atomically accessed
+ class UHD_API atomic_uint32_t{
+ public:
+
+ //! Create a new atomic 32-bit integer, initialized to zero
+ UHD_INLINE atomic_uint32_t(void){
+ this->write(0);
+ }
+
+ //! Compare with cmp, swap with newval if same, return old value
+ UHD_INLINE boost::uint32_t cas(boost::uint32_t newval, boost::uint32_t cmp){
+ return BOOST_IPC_DETAIL::atomic_cas32(&_num, newval, cmp);
+ }
+
+ //! Sets the atomic integer to a new value
+ UHD_INLINE void write(const boost::uint32_t newval){
+ BOOST_IPC_DETAIL::atomic_write32(&_num, newval);
+ }
+
+ //! Gets the current value of the atomic integer
+ UHD_INLINE boost::uint32_t read(void){
+ return BOOST_IPC_DETAIL::atomic_read32(&_num);
+ }
+
+ //! Increment by 1 and return the old value
+ UHD_INLINE boost::uint32_t inc(void){
+ return BOOST_IPC_DETAIL::atomic_inc32(&_num);
+ }
+
+ //! Decrement by 1 and return the old value
+ UHD_INLINE boost::uint32_t dec(void){
+ return BOOST_IPC_DETAIL::atomic_dec32(&_num);
+ }
+
+ private: volatile boost::uint32_t _num;
+ };
+
+ /*!
+ * A reusable barrier to sync multiple threads.
+ * All threads spin on wait() until count is reset.
+ */
+ class UHD_API reusable_barrier{
+ public:
+
+ //! Resize the barrier for N threads
+ void resize(const size_t size){
+ _size = size;
+ _count.write(size);
+ }
+
+ /*!
+ * Force the barrier wait to throw a boost::thread_interrupted
+ * The threads were not getting the interruption_point on windows.
+ */
+ void interrupt(void)
+ {
+ _count.write(boost::uint32_t(~0));
+ }
+
+ //! Wait on the barrier condition
+ UHD_INLINE void wait(void){
+ _count.dec();
+ _count.cas(_size, 0);
+ while (_count.read() != _size){
+ boost::this_thread::interruption_point();
+ if (_count.read() == boost::uint32_t(~0))
+ throw boost::thread_interrupted();
+ boost::this_thread::yield();
+ }
+ }
+
+ private:
+ size_t _size;
+ atomic_uint32_t _count;
+ };
+
+ /*!
+ * Spin-wait on a condition with a timeout.
+ * \param cond an atomic variable to compare
+ * \param value compare to atomic for true/false
+ * \param timeout the timeout in seconds
+ * \return true for cond == value, false for timeout
+ */
+ UHD_INLINE bool spin_wait_with_timeout(
+ atomic_uint32_t &cond,
+ boost::uint32_t value,
+ const double timeout
+ ){
+ if (cond.read() == value) return true;
+ const time_spec_t exit_time = time_spec_t::get_system_time() + time_spec_t(timeout);
+ while (cond.read() != value){
+ if (time_spec_t::get_system_time() > exit_time) return false;
+ boost::this_thread::interruption_point();
+ boost::this_thread::yield();
+ }
+ return true;
+ }
+
+ /*!
+ * Claimer class to provide synchronization for multi-thread access.
+ * Claiming enables buffer classes to be used with a buffer queue.
+ */
+ class simple_claimer{
+ public:
+ simple_claimer(void){
+ this->release();
+ }
+
+ UHD_INLINE void release(void){
+ _locked.write(0);
+ }
+
+ UHD_INLINE bool claim_with_wait(const double timeout){
+ if (spin_wait_with_timeout(_locked, 0, timeout)){
+ _locked.write(1);
+ return true;
+ }
+ return false;
+ }
+
+ private:
+ atomic_uint32_t _locked;
+ };
+
+} //namespace uhd
+
+#endif /* INCLUDED_UHD_UTILS_ATOMIC_HPP */
diff --git a/host/include/uhd/utils/images.hpp b/host/include/uhd/utils/images.hpp
index 8b5a1eedd..a0934fb08 100644
--- a/host/include/uhd/utils/images.hpp
+++ b/host/include/uhd/utils/images.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010 Ettus Research LLC
+// Copyright 2010,2012 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
@@ -33,6 +33,21 @@ namespace uhd{
*/
UHD_API std::string find_image_path(const std::string &image_name);
+ /*!
+ * Search for the location of the UHD Images Downloader script.
+ * \return the full system path to uhd_images_downloader.py
+ */
+
+ UHD_API std::string find_images_downloader(void);
+
+ /*!
+ * Return the error string for recommending using the UHD Images Downloader.
+ * String depends on OS.
+ * \return the message suggesting the use of uhd_images_downloader.py
+ */
+
+ UHD_API std::string print_images_error(void);
+
} //namespace uhd
#endif /* INCLUDED_UHD_UTILS_IMAGES_HPP */
diff --git a/host/include/uhd/utils/paths.hpp b/host/include/uhd/utils/paths.hpp
index 2261f1b77..f5a40b2c9 100644
--- a/host/include/uhd/utils/paths.hpp
+++ b/host/include/uhd/utils/paths.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2011 Ettus Research LLC
+// Copyright 2011-2012 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
@@ -29,6 +29,9 @@ namespace uhd{
//! Get a string representing the system's appdata directory
UHD_API std::string get_app_path(void);
+ //! Get a string representing the system's pkg data directory
+ UHD_API std::string get_pkg_data_path(void);
+
} //namespace uhd
#endif /* INCLUDED_UHD_UTILS_PATHS_HPP */
diff --git a/host/include/uhd/version.hpp b/host/include/uhd/version.hpp
index 9a7226323..ab693f2b0 100644
--- a/host/include/uhd/version.hpp
+++ b/host/include/uhd/version.hpp
@@ -27,7 +27,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 "3.4.0-0"
+#define UHD_VERSION_ABI_STRING "3.4.0-3"
namespace uhd{