aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib
diff options
context:
space:
mode:
authorAshish Chaudhari <ashish@ettus.com>2016-03-09 16:19:34 -0800
committerAshish Chaudhari <ashish@ettus.com>2016-03-21 17:46:12 -0700
commit9d6c0b7f875ac24c284e355ef54f52ed41f8137e (patch)
tree77238a91c46ff078c0b56aa543de64e3667881ed /host/lib
parent98dba897268a8c7f6e2eaf807c83502b8835f6da (diff)
downloaduhd-9d6c0b7f875ac24c284e355ef54f52ed41f8137e.tar.gz
uhd-9d6c0b7f875ac24c284e355ef54f52ed41f8137e.tar.bz2
uhd-9d6c0b7f875ac24c284e355ef54f52ed41f8137e.zip
usrp: Added fe_connection type and unit test
- Wraps a sampling mode and IF frequency - Built-in parser to deduce swap,invert,mode bits from string connection
Diffstat (limited to 'host/lib')
-rw-r--r--host/lib/usrp/CMakeLists.txt1
-rw-r--r--host/lib/usrp/fe_connection.cpp67
2 files changed, 68 insertions, 0 deletions
diff --git a/host/lib/usrp/CMakeLists.txt b/host/lib/usrp/CMakeLists.txt
index 71e40395e..dde4f02c3 100644
--- a/host/lib/usrp/CMakeLists.txt
+++ b/host/lib/usrp/CMakeLists.txt
@@ -29,6 +29,7 @@ LIBUHD_APPEND_SOURCES(
${CMAKE_CURRENT_SOURCE_DIR}/mboard_eeprom.cpp
${CMAKE_CURRENT_SOURCE_DIR}/multi_usrp.cpp
${CMAKE_CURRENT_SOURCE_DIR}/subdev_spec.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/fe_connection.cpp
)
IF(ENABLE_C_API)
diff --git a/host/lib/usrp/fe_connection.cpp b/host/lib/usrp/fe_connection.cpp
new file mode 100644
index 000000000..071f5ecf2
--- /dev/null
+++ b/host/lib/usrp/fe_connection.cpp
@@ -0,0 +1,67 @@
+//
+// Copyright 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
+// 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/usrp/fe_connection.hpp>
+#include <uhd/exception.hpp>
+#include <boost/regex.hpp>
+#include <uhd/utils/math.hpp>
+
+using namespace uhd::usrp;
+
+fe_connection_t::fe_connection_t(
+ sampling_t sampling_mode, bool iq_swapped,
+ bool i_inverted, bool q_inverted, double if_freq
+) : _sampling_mode(sampling_mode), _iq_swapped(iq_swapped),
+ _i_inverted(i_inverted), _q_inverted(q_inverted), _if_freq(if_freq)
+{
+}
+
+fe_connection_t::fe_connection_t(const std::string& conn_str, double if_freq) {
+ static const boost::regex conn_regex("([IQ])(b?)(([IQ])(b?))?");
+ boost::cmatch matches;
+ if (boost::regex_match(conn_str.c_str(), matches, conn_regex)) {
+ if (matches[3].length() == 0) {
+ //Connection in {I, Q, Ib, Qb}
+ _sampling_mode = REAL;
+ _iq_swapped = (matches[1].str() == "Q");
+ _i_inverted = (matches[2].length() != 0);
+ _q_inverted = false; //IQ is swapped after inversion
+ } else {
+ //Connection in {I(b?)Q(b?), Q(b?)I(b?), I(b?)I(b?), Q(b?)Q(b?)}
+ _sampling_mode = (matches[1].str() == matches[4].str()) ? HETERODYNE : QUADRATURE;
+ _iq_swapped = (matches[1].str() == "Q");
+ size_t i_idx = _iq_swapped ? 5 : 2, q_idx = _iq_swapped ? 2 : 5;
+ _i_inverted = (matches[i_idx].length() != 0);
+ _q_inverted = (matches[q_idx].length() != 0);
+
+ if (_sampling_mode == HETERODYNE and _i_inverted != _q_inverted) {
+ throw uhd::value_error("Invalid connection string: " + conn_str);
+ }
+ }
+ _if_freq = if_freq;
+ } else {
+ throw uhd::value_error("Invalid connection string: " + conn_str);
+ }
+}
+
+bool uhd::usrp::operator==(const fe_connection_t &lhs, const fe_connection_t &rhs){
+ return ((lhs.get_sampling_mode() == rhs.get_sampling_mode()) and
+ (lhs.is_iq_swapped() == rhs.is_iq_swapped()) and
+ (lhs.is_i_inverted() == rhs.is_i_inverted()) and
+ (lhs.is_q_inverted() == rhs.is_q_inverted()) and
+ uhd::math::frequencies_are_equal(lhs.get_if_freq(), rhs.get_if_freq()));
+}