aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bladerf/bladerf_common.cc
diff options
context:
space:
mode:
authorDaniel Gröber <dxld@darkboxed.org>2013-10-19 18:00:38 +0200
committerDimitri Stolnikov <horiz0n@gmx.net>2013-10-29 23:20:21 +0100
commit46a241624a328e7107268a0c48a7bc364e4b523e (patch)
tree804695c8446da1bd8ea585240e319948f0ebb6ed /lib/bladerf/bladerf_common.cc
parentc21b09ae4acffc69430d0da8bfc7f013fac3ec4b (diff)
bladerf: Added device caching, this enables full-duplex operation.
Diffstat (limited to 'lib/bladerf/bladerf_common.cc')
-rw-r--r--lib/bladerf/bladerf_common.cc66
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/bladerf/bladerf_common.cc b/lib/bladerf/bladerf_common.cc
index 10884dd..4f919a1 100644
--- a/lib/bladerf/bladerf_common.cc
+++ b/lib/bladerf/bladerf_common.cc
@@ -36,6 +36,7 @@
#include <boost/lexical_cast.hpp>
#include <boost/assign.hpp>
#include <boost/foreach.hpp>
+#include <boost/shared_ptr.hpp>
#include "bladerf_common.h"
@@ -43,6 +44,9 @@
using namespace boost::assign;
+boost::mutex bladerf_common::_devs_mutex;
+std::list<boost::weak_ptr<struct bladerf> > bladerf_common::_devs;
+
bladerf_common::bladerf_common() :
_is_running(false)
{
@@ -80,6 +84,68 @@ bladerf_common::~bladerf_common()
delete _fifo;
}
+bladerf_sptr bladerf_common:: get_cached_device(struct bladerf_devinfo devinfo)
+{
+ /* Lock to _devs must be aquired by caller */
+ BOOST_FOREACH( boost::weak_ptr<struct bladerf> dev, _devs )
+ {
+ struct bladerf_devinfo other_devinfo;
+
+ int rv = bladerf_get_devinfo(bladerf_sptr(dev).get(), &other_devinfo);
+ if (rv < 0)
+ throw std::runtime_error(std::string(__FUNCTION__) + " " +
+ "Failed to get devinfo for cached device.");
+
+ if (bladerf_devinfo_matches(&devinfo, &other_devinfo)) {
+ return bladerf_sptr(dev);
+ }
+ }
+
+ return bladerf_sptr();
+}
+
+void bladerf_common::close(void* dev)
+{
+ boost::unique_lock<boost::mutex> lock(_devs_mutex);
+
+ std::list<boost::weak_ptr<struct bladerf> >::iterator it;
+ for (it = _devs.begin(); it != _devs.end(); ++it)
+ if ( (*it).expired() == 0 )
+ _devs.erase(it);
+
+ bladerf_close((struct bladerf *)dev);
+}
+
+bladerf_sptr bladerf_common::open(const std::string &device_name)
+{
+ int rv;
+ struct bladerf *raw_dev;
+ struct bladerf_devinfo devinfo;
+
+ boost::unique_lock<boost::mutex> lock(_devs_mutex);
+
+ rv = bladerf_get_devinfo_from_str(device_name.c_str(), &devinfo);
+ if (rv < 0)
+ throw std::runtime_error(std::string(__FUNCTION__) + " " +
+ "Failed to get devinfo for '" + device_name + "'");
+
+ bladerf_sptr cached_dev = get_cached_device(devinfo);
+
+ if (cached_dev)
+ return cached_dev;
+
+ rv = bladerf_open_with_devinfo(&raw_dev, &devinfo);
+ if (rv < 0)
+ throw std::runtime_error(std::string(__FUNCTION__) + " " +
+ "Failed to open device for '" + device_name + "'");
+
+ bladerf_sptr dev = bladerf_sptr(raw_dev, bladerf_common::close);
+
+ _devs.push_back(boost::weak_ptr<struct bladerf>(dev));
+
+ return dev;
+}
+
osmosdr::freq_range_t bladerf_common::freq_range()
{
/* assuming the same for RX & TX */