diff --git a/CMakeLists.txt b/CMakeLists.txt index 1fe4f0cec..332f34e53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2275,11 +2275,17 @@ endif() # IIO blocks for GNU Radio # https://github.com/analogdevicesinc/gr-iio ############################################## -find_package(GRIIO) -set_package_properties(GRIIO PROPERTIES - PURPOSE "Used for communication with PlutoSDR and FMCOMMS devices." - TYPE OPTIONAL -) +if(GNURADIO_IIO_FOUND) + set(GRIIO_FOUND TRUE) + set(GR_IIO_INCLUDE_HAS_GNURADIO TRUE) + set(GNURADIO_API_IIO TRUE) +else() + find_package(GRIIO) + set_package_properties(GRIIO PROPERTIES + PURPOSE "Used for communication with PlutoSDR and FMCOMMS devices." + TYPE OPTIONAL + ) +endif() if(ENABLE_PLUTOSDR OR ENABLE_FMCOMMS2) if(NOT GRIIO_FOUND) message(STATUS "gnuradio-iio not found, its installation is required.") diff --git a/cmake/Modules/FindGNURADIO.cmake b/cmake/Modules/FindGNURADIO.cmake index 5a9ef650c..25d58b451 100644 --- a/cmake/Modules/FindGNURADIO.cmake +++ b/cmake/Modules/FindGNURADIO.cmake @@ -76,7 +76,6 @@ function(GR_MODULE EXTVAR PCNAME INCFILE LIBFILE) PATHS /usr/include /usr/local/include /opt/local/include - ${GNURADIO_INSTALL_PREFIX}/include ${GNURADIO_ROOT}/include $ENV{GNURADIO_ROOT}/include $ENV{GNURADIO_RUNTIME_DIR}/include @@ -118,7 +117,6 @@ function(GR_MODULE EXTVAR PCNAME INCFILE LIBFILE) /usr/local/lib /usr/local/lib64 /opt/local/lib - ${GNURADIO_INSTALL_PREFIX}/lib ${GNURADIO_ROOT}/lib $ENV{GNURADIO_ROOT}/lib ${GNURADIO_ROOT}/lib64 @@ -277,6 +275,99 @@ else() ) endif() + +# Search for IIO component +if(GNURADIO_VERSION VERSION_GREATER 3.8.99) + pkg_check_modules(PC_GNURADIO_IIO QUIET gnuradio-iio) + # look for include files + message(STATUS "Checking for GNU Radio Module: IIO") + find_path(GNURADIO_IIO_INCLUDE_DIRS + NAMES gnuradio/iio/api.h + HINTS ${PC_GNURADIO_IIO_INCLUDEDIR} + PATHS /usr/include + /usr/local/include + /opt/local/include + ${GNURADIO_INSTALL_PREFIX}/include + ${GNURADIO_ROOT}/include + $ENV{GNURADIO_ROOT}/include + $ENV{GNURADIO_RUNTIME_DIR}/include + ${CMAKE_INSTALL_PREFIX}/include + ${GNURADIO_INSTALL_PREFIX}/include + ) + + # look for libs + find_library(GNURADIO_IIO_LIBRARIES + NAMES gnuradio-iio gnuradio-iio-${GNURADIO_VERSION} + HINTS ${PC_GNURADIO_IIO_LIBDIR} + PATHS /usr/lib + /usr/lib64 + /usr/lib/x86_64-linux-gnu + /usr/lib/i386-linux-gnu + /usr/lib/arm-linux-gnueabihf + /usr/lib/arm-linux-gnueabi + /usr/lib/aarch64-linux-gnu + /usr/lib/mipsel-linux-gnu + /usr/lib/mips-linux-gnu + /usr/lib/mips64el-linux-gnuabi64 + /usr/lib/powerpc-linux-gnu + /usr/lib/powerpc64-linux-gnu + /usr/lib/powerpc64le-linux-gnu + /usr/lib/powerpc-linux-gnuspe + /usr/lib/hppa-linux-gnu + /usr/lib/s390x-linux-gnu + /usr/lib/i386-gnu + /usr/lib/hppa-linux-gnu + /usr/lib/x86_64-kfreebsd-gnu + /usr/lib/i386-kfreebsd-gnu + /usr/lib/m68k-linux-gnu + /usr/lib/sh4-linux-gnu + /usr/lib/sparc64-linux-gnu + /usr/lib/x86_64-linux-gnux32 + /usr/lib/alpha-linux-gnu + /usr/lib/riscv64-linux-gnu + /usr/local/lib + /usr/local/lib64 + /opt/local/lib + ${GNURADIO_ROOT}/lib + $ENV{GNURADIO_ROOT}/lib + ${GNURADIO_ROOT}/lib64 + $ENV{GNURADIO_ROOT}/lib64 + $ENV{GNURADIO_RUNTIME_DIR}/lib + ${CMAKE_INSTALL_PREFIX}/lib + ${CMAKE_INSTALL_PREFIX}/lib64 + ${GNURADIO_INSTALL_PREFIX}/lib + ${GNURADIO_INSTALL_PREFIX}/lib64 + ) + + if(GNURADIO_IIO_LIBRARIES) + message(STATUS " * INCLUDES=${GNURADIO_IIO_INCLUDE_DIRS}") + message(STATUS " * LIBS=${GNURADIO_IIO_LIBRARIES}") + endif() + find_package_handle_standard_args(GNURADIO_IIO DEFAULT_MSG GNURADIO_IIO_LIBRARIES GNURADIO_IIO_INCLUDE_DIRS) + + if(GNURADIO_IIO_FOUND) + message(STATUS "GNURADIO_IIO_FOUND = ${GNURADIO_IIO_FOUND}") + # append to all includes and libs list + set(GNURADIO_ALL_INCLUDE_DIRS ${GNURADIO_ALL_INCLUDE_DIRS} ${GNURADIO_IIO_INCLUDE_DIRS}) + set(GNURADIO_ALL_LIBRARIES ${GNURADIO_ALL_LIBRARIES} ${GNURADIO_IIO_LIBRARIES}) + + # Create imported target + if(NOT TARGET Gnuradio::iio) + add_library(Gnuradio::iio SHARED IMPORTED) + set(GNURADIO_LIBRARY ${GNURADIO_IIO_LIBRARIES}) + list(GET GNURADIO_LIBRARY 0 FIRST_DIR) + get_filename_component(GNURADIO_DIR ${FIRST_DIR} ABSOLUTE) + set_target_properties(Gnuradio::iio PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${GNURADIO_DIR}" + INTERFACE_INCLUDE_DIRECTORIES "${GNURADIO_IIO_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${GNURADIO_LIBRARY}" + ) + endif() + endif() +endif() + + set_package_properties(GNURADIO PROPERTIES URL "https://www.gnuradio.org/" ) diff --git a/src/algorithms/signal_source/adapters/CMakeLists.txt b/src/algorithms/signal_source/adapters/CMakeLists.txt index fd3240b0b..c279601dd 100644 --- a/src/algorithms/signal_source/adapters/CMakeLists.txt +++ b/src/algorithms/signal_source/adapters/CMakeLists.txt @@ -217,6 +217,16 @@ if(ENABLE_PLUTOSDR OR ENABLE_FMCOMMS2) PUBLIC -DGRIIO_INCLUDE_HAS_GNURADIO=1 ) endif() + if(GNURADIO_API_IIO) + target_compile_definitions(signal_source_adapters + PUBLIC -DGNURADIO_API_IIO=1 + ) + endif() + target_link_libraries(signal_source_adapters + PUBLIC + Gnuradio::iio + Boost::chrono + ) endif() if(ENABLE_CLANG_TIDY) diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc index 144ea022f..3a94049ec 100644 --- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc +++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc @@ -64,6 +64,10 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(ConfigurationInterface* configuration rf_gain_rx2_ = configuration->property(role + ".gain_rx2", 64.0); rf_port_select_ = configuration->property(role + ".rf_port_select", std::string("A_BALANCED")); filter_file_ = configuration->property(role + ".filter_file", std::string("")); + filter_source_ = configuration->property(role + ".filter_source", std::string("Off")); + filter_filename_ = configuration->property(role + ".filter_filename", std::string("")); + Fpass_ = configuration->property(role + ".Fpass", 0.0); + Fstop_ = configuration->property(role + ".Fstop", 0.0); filter_auto_ = configuration->property(role + ".filter_auto", true); item_type_ = configuration->property(role + ".item_type", default_item_type); samples_ = configuration->property(role + ".samples", 0); @@ -94,6 +98,17 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(ConfigurationInterface* configuration } else { +#if GNURADIO_API_IIO + fmcomms2_source_f32c_ = gr::iio::fmcomms2_source_f32c::make( + uri_.c_str(), freq_, sample_rate_, + bandwidth_, + rx1_en_, rx2_en_, + buffer_size_, quadrature_, rf_dc_, + bb_dc_, gain_mode_rx1_.c_str(), rf_gain_rx1_, + gain_mode_rx2_.c_str(), rf_gain_rx2_, + rf_port_select_.c_str(), filter_source_.c_str(), + filter_filename_.c_str(), Fpass_, Fstop_); +#else fmcomms2_source_f32c_ = gr::iio::fmcomms2_source_f32c::make( uri_.c_str(), freq_, sample_rate_, bandwidth_, @@ -103,7 +118,7 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(ConfigurationInterface* configuration gain_mode_rx2_.c_str(), rf_gain_rx2_, rf_port_select_.c_str(), filter_file_.c_str(), filter_auto_); - +#endif // configure LO if (enable_dds_lo_ == true) { @@ -126,6 +141,17 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(ConfigurationInterface* configuration } else { +#if GNURADIO_API_IIO + fmcomms2_source_f32c_ = gr::iio::fmcomms2_source_f32c::make( + uri_.c_str(), freq_, sample_rate_, + bandwidth_, + rx1_en_, rx2_en_, + buffer_size_, quadrature_, rf_dc_, + bb_dc_, gain_mode_rx1_.c_str(), rf_gain_rx1_, + gain_mode_rx2_.c_str(), rf_gain_rx2_, + rf_port_select_.c_str(), filter_source_.c_str(), + filter_filename_.c_str(), Fpass_, Fstop_); +#else fmcomms2_source_f32c_ = gr::iio::fmcomms2_source_f32c::make( uri_.c_str(), freq_, sample_rate_, bandwidth_, @@ -135,6 +161,7 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(ConfigurationInterface* configuration gain_mode_rx2_.c_str(), rf_gain_rx2_, rf_port_select_.c_str(), filter_file_.c_str(), filter_auto_); +#endif // configure LO if (enable_dds_lo_ == true) { diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h index a2f008df0..b4d2c19f7 100644 --- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h +++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h @@ -102,6 +102,10 @@ private: std::string rf_port_select_; std::string filter_file_; bool filter_auto_; + std::string filter_source_; + std::string filter_filename_; + float Fpass_; + float Fstop_; // DDS configuration for LO generation for external mixer bool enable_dds_lo_; diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc index 902d6db12..c306e0acf 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc @@ -55,7 +55,10 @@ PlutosdrSignalSource::PlutosdrSignalSource(ConfigurationInterface* configuration rf_gain_ = configuration->property(role + ".gain", 50.0); filter_file_ = configuration->property(role + ".filter_file", std::string("")); filter_auto_ = configuration->property(role + ".filter_auto", true); - + filter_source_ = configuration->property(role + ".filter_source", std::string("Off")); + filter_filename_ = configuration->property(role + ".filter_filename", std::string("")); + Fpass_ = configuration->property(role + ".Fpass", 0.0); + Fstop_ = configuration->property(role + ".Fstop", 0.0); item_type_ = configuration->property(role + ".item_type", default_item_type); samples_ = configuration->property(role + ".samples", 0); dump_ = configuration->property(role + ".dump", false); @@ -75,10 +78,16 @@ PlutosdrSignalSource::PlutosdrSignalSource(ConfigurationInterface* configuration std::cout << "gain mode: " << gain_mode_ << std::endl; std::cout << "item type: " << item_type_ << std::endl; +#if GNURADIO_API_IIO + plutosdr_source_ = gr::iio::pluto_source::make(uri_, freq_, sample_rate_, + bandwidth_, buffer_size_, quadrature_, rf_dc_, bb_dc_, + gain_mode_.c_str(), rf_gain_, filter_source_.c_str(), + filter_filename_.c_str(), Fpass_, Fstop_); +#else plutosdr_source_ = gr::iio::pluto_source::make(uri_, freq_, sample_rate_, bandwidth_, buffer_size_, quadrature_, rf_dc_, bb_dc_, gain_mode_.c_str(), rf_gain_, filter_file_.c_str(), filter_auto_); - +#endif if (samples_ != 0) { DLOG(INFO) << "Send STOP signal after " << samples_ << " samples"; diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h index de89a0a08..7c0f6a89d 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h @@ -97,6 +97,10 @@ private: double rf_gain_; std::string filter_file_; bool filter_auto_; + std::string filter_source_; + std::string filter_filename_; + float Fpass_; + float Fstop_; unsigned int in_stream_; unsigned int out_stream_; diff --git a/src/algorithms/signal_source/libs/CMakeLists.txt b/src/algorithms/signal_source/libs/CMakeLists.txt index 75fd8eb7a..98fdbf7cd 100644 --- a/src/algorithms/signal_source/libs/CMakeLists.txt +++ b/src/algorithms/signal_source/libs/CMakeLists.txt @@ -63,16 +63,6 @@ target_include_directories(signal_source_libs ${CMAKE_SOURCE_DIR}/src/core/receiver ) -if(ENABLE_PLUTOSDR OR ENABLE_FMCOMMS2) - target_link_libraries(signal_source_libs - PUBLIC - Gnuradio::iio - PRIVATE - Gnuradio::analog - Iio::iio - ) -endif() - if(ENABLE_FMCOMMS2 OR ENABLE_AD9361) target_link_libraries(signal_source_libs PUBLIC