diff options
Diffstat (limited to 'host/lib/usrp')
| -rw-r--r-- | host/lib/usrp/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | host/lib/usrp/fe_connection.cpp | 67 | 
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())); +} | 
