From 3afcb7e04f6c48d70b8bb2f2c3ab7723d3fcf026 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 15 Feb 2015 17:57:12 -0800 Subject: [PATCH] soapy: began work on soapy sdr support --- CMakeLists.txt | 1 + lib/CMakeLists.txt | 8 + lib/config.h.in | 1 + lib/sink_impl.cc | 18 +++ lib/soapy/CMakeLists.txt | 38 +++++ lib/soapy/soapy_sink_c.cc | 293 ++++++++++++++++++++++++++++++++++++ lib/soapy/soapy_sink_c.h | 125 +++++++++++++++ lib/soapy/soapy_source_c.cc | 259 +++++++++++++++++++++++++++++++ lib/soapy/soapy_source_c.h | 127 ++++++++++++++++ lib/source_impl.cc | 18 +++ 10 files changed, 888 insertions(+) create mode 100644 lib/soapy/CMakeLists.txt create mode 100644 lib/soapy/soapy_sink_c.cc create mode 100644 lib/soapy/soapy_sink_c.h create mode 100644 lib/soapy/soapy_source_c.cc create mode 100644 lib/soapy/soapy_source_c.h diff --git a/CMakeLists.txt b/CMakeLists.txt index abaddd4..234b297 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -160,6 +160,7 @@ find_package(LibMiriSDR) find_package(LibHackRF) find_package(LibAIRSPY) find_package(LibbladeRF) +find_package(SoapySDR CONFIG) find_package(Doxygen) if(NOT GNURADIO_RUNTIME_FOUND) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index cd06ca8..e22f850 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -214,6 +214,14 @@ if(ENABLE_AIRSPY) GR_INCLUDE_SUBDIRECTORY(airspy) endif(ENABLE_AIRSPY) +######################################################################## +# Setup SoapySDR component +######################################################################## +GR_REGISTER_COMPONENT("SoapySDR support" ENABLE_SOAPY SoapySDR_FOUND) +if(ENABLE_SOAPY) +GR_INCLUDE_SUBDIRECTORY(soapy) +endif(ENABLE_SOAPY) + ######################################################################## # Setup configuration file ######################################################################## diff --git a/lib/config.h.in b/lib/config.h.in index fe9c2bf..f7d960d 100644 --- a/lib/config.h.in +++ b/lib/config.h.in @@ -15,5 +15,6 @@ #cmakedefine ENABLE_BLADERF #cmakedefine ENABLE_RFSPACE #cmakedefine ENABLE_AIRSPY +#cmakedefine ENABLE_SOAPY #endif // CONFIG_H_IN diff --git a/lib/sink_impl.cc b/lib/sink_impl.cc index e17e9dc..d8c9a5b 100644 --- a/lib/sink_impl.cc +++ b/lib/sink_impl.cc @@ -42,6 +42,10 @@ #include "bladerf_sink_c.h" #endif +#ifdef ENABLE_SOAPY +#include +#endif + #include "arg_helpers.h" #include "sink_impl.h" @@ -83,6 +87,9 @@ sink_impl::sink_impl( const std::string &args ) #endif #ifdef ENABLE_BLADERF dev_types.push_back("bladerf"); +#endif +#ifdef ENABLE_SOAPY + dev_types.push_back("soapy"); #endif std::cerr << "gr-osmosdr " << GR_OSMOSDR_VERSION << " (" << GR_OSMOSDR_LIBVER << ") " @@ -118,6 +125,10 @@ sink_impl::sink_impl( const std::string &args ) BOOST_FOREACH( std::string dev, hackrf_sink_c::get_devices() ) dev_list.push_back( dev ); #endif +#ifdef ENABLE_SOAPY + BOOST_FOREACH( std::string dev, soapy_sink_c::get_devices() ) + dev_list.push_back( dev ); +#endif // std::cerr << std::endl; // BOOST_FOREACH( std::string dev, dev_list ) @@ -159,6 +170,13 @@ sink_impl::sink_impl( const std::string &args ) } #endif +#ifdef ENABLE_SOAPY + if ( dict.count("soapy") ) { + soapy_sink_c_sptr src = make_soapy_sink_c( arg ); + block = src; iface = src.get(); + } +#endif + if ( iface != NULL && long(block.get()) != 0 ) { _devs.push_back( iface ); diff --git a/lib/soapy/CMakeLists.txt b/lib/soapy/CMakeLists.txt new file mode 100644 index 0000000..6ada023 --- /dev/null +++ b/lib/soapy/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright 2015 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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, or (at your option) +# any later version. +# +# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. + +######################################################################## +# This file included, use CMake directory variables +######################################################################## + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${SoapySDR_INCLUDE_DIRS} +) + +set(soapy_srcs + ${CMAKE_CURRENT_SOURCE_DIR}/soapy_source_c.cc + ${CMAKE_CURRENT_SOURCE_DIR}/soapy_sink_c.cc +) + +######################################################################## +# Append gnuradio-osmosdr library sources +######################################################################## +list(APPEND gr_osmosdr_srcs ${soapy_srcs}) +list(APPEND gr_osmosdr_libs ${SoapySDR_LIBRARIES}) diff --git a/lib/soapy/soapy_sink_c.cc b/lib/soapy/soapy_sink_c.cc new file mode 100644 index 0000000..871ee37 --- /dev/null +++ b/lib/soapy/soapy_sink_c.cc @@ -0,0 +1,293 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 Josh Blum + * Copyright 2013 Dimitri Stolnikov + * + * GNU Radio 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, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +/* + * config.h is generated by configure. It contains the results + * of probing for features, options etc. It should be the first + * file included in your .cc file. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include +#include + +#include + +#include "arg_helpers.h" +#include "soapy_sink_c.h" + +using namespace boost::assign; + +/* + * Create a new instance of soapy_sink_c and return + * a boost shared_ptr. This is effectively the public constructor. + */ +soapy_sink_c_sptr make_soapy_sink_c (const std::string &args) +{ + return gnuradio::get_initial_sptr(new soapy_sink_c (args)); +} + +/* + * The private constructor + */ +soapy_sink_c::soapy_sink_c (const std::string &args) + : gr::sync_block ("soapy_sink_c", + gr::io_signature::make (1, 8, sizeof (gr_complex)), + gr::io_signature::make (0, 0, sizeof (gr_complex))) +{ + +} + +bool soapy_sink_c::start() +{ +} + +bool soapy_sink_c::stop() +{ +} + +int soapy_sink_c::work( int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items ) +{ +} + +std::vector soapy_sink_c::get_devices() +{ +} + +size_t soapy_sink_c::get_num_channels( void ) +{ + +} + +osmosdr::meta_range_t soapy_sink_c::get_sample_rates( void ) +{ + +} + +double soapy_sink_c::set_sample_rate( double rate ) +{ + +} + +double soapy_sink_c::get_sample_rate( void ) +{ + +} + +osmosdr::freq_range_t soapy_sink_c::get_freq_range( size_t chan) +{ + +} + +double soapy_sink_c::set_center_freq( double freq, size_t chan) +{ + +} + +double soapy_sink_c::get_center_freq( size_t chan) +{ + +} + +double soapy_sink_c::set_freq_corr( double ppm, size_t chan) +{ + +} + +double soapy_sink_c::get_freq_corr( size_t chan) +{ + +} + +std::vector soapy_sink_c::get_gain_names( size_t chan) +{ + +} + +osmosdr::gain_range_t soapy_sink_c::get_gain_range( size_t chan) +{ + +} + +osmosdr::gain_range_t soapy_sink_c::get_gain_range( const std::string & name, + size_t chan) +{ + +} + +bool soapy_sink_c::set_gain_mode( bool automatic, size_t chan) +{ + +} + +bool soapy_sink_c::get_gain_mode( size_t chan) +{ + +} + +double soapy_sink_c::set_gain( double gain, size_t chan) +{ + +} + +double soapy_sink_c::set_gain( double gain, + const std::string & name, + size_t chan) +{ + +} + +double soapy_sink_c::get_gain( size_t chan) +{ + +} + +double soapy_sink_c::get_gain( const std::string & name, size_t chan) +{ + +} + +double soapy_sink_c::set_if_gain( double gain, size_t chan) +{ + +} + +double soapy_sink_c::set_bb_gain( double gain, size_t chan) +{ + +} + +std::vector< std::string > soapy_sink_c::get_antennas( size_t chan) +{ + +} + +std::string soapy_sink_c::set_antenna( const std::string & antenna, + size_t chan) +{ + +} + +std::string soapy_sink_c::get_antenna( size_t chan) +{ + +} + +void soapy_sink_c::set_dc_offset( const std::complex &offset, size_t chan) +{ + +} + +void soapy_sink_c::set_iq_balance( const std::complex &balance, size_t chan) +{ + +} + +double soapy_sink_c::set_bandwidth( double bandwidth, size_t chan) +{ + +} + +double soapy_sink_c::get_bandwidth( size_t chan) +{ + +} + +osmosdr::freq_range_t soapy_sink_c::get_bandwidth_range( size_t chan) +{ + +} + +void soapy_sink_c::set_time_source(const std::string &source, + const size_t mboard) +{ + +} + +std::string soapy_sink_c::get_time_source(const size_t mboard) +{ + +} + +std::vector soapy_sink_c::get_time_sources(const size_t mboard) +{ + +} + +void soapy_sink_c::set_clock_source(const std::string &source, + const size_t mboard) +{ + +} + +std::string soapy_sink_c::get_clock_source(const size_t mboard) +{ + +} + +std::vector soapy_sink_c::get_clock_sources(const size_t mboard) +{ + +} + +double soapy_sink_c::get_clock_rate(size_t mboard) +{ + +} + +void soapy_sink_c::set_clock_rate(double rate, size_t mboard) +{ + +} + +::osmosdr::time_spec_t soapy_sink_c::get_time_now(size_t mboard) +{ + +} + +::osmosdr::time_spec_t soapy_sink_c::get_time_last_pps(size_t mboard) +{ + +} + +void soapy_sink_c::set_time_now(const ::osmosdr::time_spec_t &time_spec, + size_t mboard) +{ + +} + +void soapy_sink_c::set_time_next_pps(const ::osmosdr::time_spec_t &time_spec) +{ + +} + +void soapy_sink_c::set_time_unknown_pps(const ::osmosdr::time_spec_t &time_spec) +{ + +} + diff --git a/lib/soapy/soapy_sink_c.h b/lib/soapy/soapy_sink_c.h new file mode 100644 index 0000000..f3f5753 --- /dev/null +++ b/lib/soapy/soapy_sink_c.h @@ -0,0 +1,125 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 Josh Blum + * Copyright 2013 Dimitri Stolnikov + * + * GNU Radio 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, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#ifndef INCLUDED_SOAPY_SINK_C_H +#define INCLUDED_SOAPY_SINK_C_H + +#include +#include + +#include "osmosdr/ranges.h" +#include "sink_iface.h" + +class soapy_sink_c; + +/* + * We use boost::shared_ptr's instead of raw pointers for all access + * to gr_blocks (and many other data structures). The shared_ptr gets + * us transparent reference counting, which greatly simplifies storage + * management issues. This is especially helpful in our hybrid + * C++ / Python system. + * + * See http://www.boost.org/libs/smart_ptr/smart_ptr.htm + * + * As a convention, the _sptr suffix indicates a boost::shared_ptr + */ +typedef boost::shared_ptr soapy_sink_c_sptr; + +/*! + * \brief Return a shared_ptr to a new instance of soapy_sink_c. + * + * To avoid accidental use of raw pointers, soapy_sink_c's + * constructor is private. make_soapy_sink_c is the public + * interface for creating new instances. + */ +soapy_sink_c_sptr make_soapy_sink_c (const std::string & args = ""); + +class soapy_sink_c : + public gr::sync_block, + public sink_iface +{ +private: + // The friend declaration allows soapy_make_sink_c to + // access the private constructor. + friend soapy_sink_c_sptr make_soapy_sink_c (const std::string & args); + + soapy_sink_c (const std::string & args); // private constructor + +public: + bool start(); + bool stop(); + + int work( int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items ); + + static std::vector< std::string > get_devices(); + +size_t get_num_channels( void ); +osmosdr::meta_range_t get_sample_rates( void ); +double set_sample_rate( double rate ); +double get_sample_rate( void ); +osmosdr::freq_range_t get_freq_range( size_t chan); +double set_center_freq( double freq, size_t chan); +double get_center_freq( size_t chan); +double set_freq_corr( double ppm, size_t chan); +double get_freq_corr( size_t chan); +std::vector get_gain_names( size_t chan); +osmosdr::gain_range_t get_gain_range( size_t chan); +osmosdr::gain_range_t get_gain_range( const std::string & name, + size_t chan); +bool set_gain_mode( bool automatic, size_t chan); +bool get_gain_mode( size_t chan); +double set_gain( double gain, size_t chan); +double set_gain( double gain, + const std::string & name, + size_t chan); +double get_gain( size_t chan); +double get_gain( const std::string & name, size_t chan); +double set_if_gain( double gain, size_t chan); +double set_bb_gain( double gain, size_t chan); +std::vector< std::string > get_antennas( size_t chan); +std::string set_antenna( const std::string & antenna, + size_t chan); +std::string get_antenna( size_t chan); +void set_dc_offset( const std::complex &offset, size_t chan); +void set_iq_balance( const std::complex &balance, size_t chan); +double set_bandwidth( double bandwidth, size_t chan); +double get_bandwidth( size_t chan); +osmosdr::freq_range_t get_bandwidth_range( size_t chan); +void set_time_source(const std::string &source, + const size_t mboard); +std::string get_time_source(const size_t mboard); +std::vector get_time_sources(const size_t mboard); +void set_clock_source(const std::string &source, + const size_t mboard); +std::string get_clock_source(const size_t mboard); +std::vector get_clock_sources(const size_t mboard); +double get_clock_rate(size_t mboard); +void set_clock_rate(double rate, size_t mboard); +::osmosdr::time_spec_t get_time_now(size_t mboard); +::osmosdr::time_spec_t get_time_last_pps(size_t mboard); +void set_time_now(const ::osmosdr::time_spec_t &time_spec, + size_t mboard); +void set_time_next_pps(const ::osmosdr::time_spec_t &time_spec); +void set_time_unknown_pps(const ::osmosdr::time_spec_t &time_spec); +}; + +#endif /* INCLUDED_SOAPY_SINK_C_H */ diff --git a/lib/soapy/soapy_source_c.cc b/lib/soapy/soapy_source_c.cc new file mode 100644 index 0000000..a223bac --- /dev/null +++ b/lib/soapy/soapy_source_c.cc @@ -0,0 +1,259 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 Josh Blum + * Copyright 2013 Dimitri Stolnikov + * + * GNU Radio 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, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +/* + * config.h is generated by configure. It contains the results + * of probing for features, options etc. It should be the first + * file included in your .cc file. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include +#include + +#include + +#include "arg_helpers.h" +#include "soapy_source_c.h" + +using namespace boost::assign; + +/* + * Create a new instance of soapy_source_c and return + * a boost shared_ptr. This is effectively the public constructor. + */ +soapy_source_c_sptr make_soapy_source_c (const std::string &args) +{ + return gnuradio::get_initial_sptr(new soapy_source_c (args)); +} + +/* + * The private constructor + */ +soapy_source_c::soapy_source_c (const std::string &args) + : gr::sync_block ("soapy_source_c", + gr::io_signature::make (0, 0, sizeof (gr_complex)), + gr::io_signature::make (1, 8, sizeof (gr_complex))) +{ + +} + +bool soapy_source_c::start() +{ +} + +bool soapy_source_c::stop() +{ +} + +int soapy_source_c::work( int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items ) +{ +} + +std::vector soapy_source_c::get_devices() +{ +} + +size_t soapy_source_c::get_num_channels( void ) +{ +} + +osmosdr::meta_range_t soapy_source_c::get_sample_rates( void ) +{ +} + +double soapy_source_c::set_sample_rate( double rate ) +{ +} + +double soapy_source_c::get_sample_rate( void ) +{ +} + +osmosdr::freq_range_t soapy_source_c::get_freq_range( size_t chan ) +{ +} + +double soapy_source_c::set_center_freq( double freq, size_t chan ) +{ +} + +double soapy_source_c::get_center_freq( size_t chan ) +{ +} + +double soapy_source_c::set_freq_corr( double ppm, size_t chan ) +{ +} + +double soapy_source_c::get_freq_corr( size_t chan ) +{ +} + +std::vector soapy_source_c::get_gain_names( size_t chan ) +{ +} + +osmosdr::gain_range_t soapy_source_c::get_gain_range( size_t chan ) +{ +} + +osmosdr::gain_range_t soapy_source_c::get_gain_range( const std::string & name, + size_t chan ) +{ +} + +bool soapy_source_c::set_gain_mode( bool automatic, size_t chan ) +{ +} + +bool soapy_source_c::get_gain_mode( size_t chan ) +{ +} + +double soapy_source_c::set_gain( double gain, size_t chan ) +{ +} + +double soapy_source_c::set_gain( double gain, + const std::string & name, + size_t chan ) +{ +} + +double soapy_source_c::get_gain( size_t chan ) +{ +} + +double soapy_source_c::soapy_source_c::get_gain( const std::string & name, size_t chan ) +{ +} + +double soapy_source_c::set_if_gain( double gain, size_t chan ) +{ +} + +double soapy_source_c::set_bb_gain( double gain, size_t chan ) +{ +} + +std::vector< std::string > soapy_source_c::get_antennas( size_t chan ) +{ +} + +std::string soapy_source_c::set_antenna( const std::string & antenna, + size_t chan ) +{ +} + +std::string soapy_source_c::get_antenna( size_t chan ) +{ +} + +void soapy_source_c::set_dc_offset_mode( int mode, size_t chan ) +{ +} + +void soapy_source_c::set_dc_offset( const std::complex &offset, size_t chan ) +{ +} + +void soapy_source_c::set_iq_balance_mode( int mode, size_t chan ) +{ +} + +void soapy_source_c::set_iq_balance( const std::complex &balance, size_t chan ) +{ +} + +double soapy_source_c::set_bandwidth( double bandwidth, size_t chan ) +{ +} + +double soapy_source_c::get_bandwidth( size_t chan ) +{ +} + +osmosdr::freq_range_t soapy_source_c::get_bandwidth_range( size_t chan ) +{ +} + +void soapy_source_c::set_time_source(const std::string &source, + const size_t mboard) +{ +} + +std::string soapy_source_c::get_time_source(const size_t mboard) +{ +} + +std::vector soapy_source_c::get_time_sources(const size_t mboard) +{ +} + +void soapy_source_c::set_clock_source(const std::string &source, + const size_t mboard) +{ +} + +std::string soapy_source_c::get_clock_source(const size_t mboard) +{ +} + +std::vector soapy_source_c::get_clock_sources(const size_t mboard) +{ +} + +double soapy_source_c::get_clock_rate(size_t mboard) +{ +} + +void soapy_source_c::set_clock_rate(double rate, size_t mboard) +{ +} + +::osmosdr::time_spec_t soapy_source_c::get_time_now(size_t mboard) +{ +} + +::osmosdr::time_spec_t soapy_source_c::get_time_last_pps(size_t mboard) +{ +} + +void soapy_source_c::set_time_now(const ::osmosdr::time_spec_t &time_spec, + size_t mboard) +{ +} + +void soapy_source_c::set_time_next_pps(const ::osmosdr::time_spec_t &time_spec) +{ +} + +void soapy_source_c::set_time_unknown_pps(const ::osmosdr::time_spec_t &time_spec) +{ +} diff --git a/lib/soapy/soapy_source_c.h b/lib/soapy/soapy_source_c.h new file mode 100644 index 0000000..145bd1d --- /dev/null +++ b/lib/soapy/soapy_source_c.h @@ -0,0 +1,127 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 Josh Blum + * Copyright 2013 Dimitri Stolnikov + * + * GNU Radio 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, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#ifndef INCLUDED_SOAPY_SOURCE_C_H +#define INCLUDED_SOAPY_SOURCE_C_H + +#include +#include + +#include "osmosdr/ranges.h" +#include "source_iface.h" + +class soapy_source_c; + +/* + * We use boost::shared_ptr's instead of raw pointers for all access + * to gr_blocks (and many other data structures). The shared_ptr gets + * us transparent reference counting, which greatly simplifies storage + * management issues. This is especially helpful in our hybrid + * C++ / Python system. + * + * See http://www.boost.org/libs/smart_ptr/smart_ptr.htm + * + * As a convention, the _sptr suffix indicates a boost::shared_ptr + */ +typedef boost::shared_ptr soapy_source_c_sptr; + +/*! + * \brief Return a shared_ptr to a new instance of soapy_source_c. + * + * To avoid accidental use of raw pointers, soapy_source_c's + * constructor is private. soapy_make_source_c is the public + * interface for creating new instances. + */ +soapy_source_c_sptr make_soapy_source_c (const std::string & args = ""); + +class soapy_source_c : + public gr::sync_block, + public source_iface +{ +private: + // The friend declaration allows soapy_make_source_c to + // access the private constructor. + friend soapy_source_c_sptr make_soapy_source_c (const std::string & args); + + soapy_source_c (const std::string & args); // private constructor + +public: + bool start(); + bool stop(); + + int work( int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items ); + + static std::vector< std::string > get_devices(); + +size_t get_num_channels( void ); +osmosdr::meta_range_t get_sample_rates( void ); +double set_sample_rate( double rate ); +double get_sample_rate( void ); +osmosdr::freq_range_t get_freq_range( size_t chan ); +double set_center_freq( double freq, size_t chan ); +double get_center_freq( size_t chan ); +double set_freq_corr( double ppm, size_t chan ); +double get_freq_corr( size_t chan ); +std::vector get_gain_names( size_t chan ); +osmosdr::gain_range_t get_gain_range( size_t chan ); +osmosdr::gain_range_t get_gain_range( const std::string & name, + size_t chan ); +bool set_gain_mode( bool automatic, size_t chan ); +bool get_gain_mode( size_t chan ); +double set_gain( double gain, size_t chan ); +double set_gain( double gain, + const std::string & name, + size_t chan ); +double get_gain( size_t chan ); +double get_gain( const std::string & name, size_t chan ); +double set_if_gain( double gain, size_t chan ); +double set_bb_gain( double gain, size_t chan ); +std::vector< std::string > get_antennas( size_t chan ); +std::string set_antenna( const std::string & antenna, + size_t chan ); +std::string get_antenna( size_t chan ); +void set_dc_offset_mode( int mode, size_t chan ); +void set_dc_offset( const std::complex &offset, size_t chan ); +void set_iq_balance_mode( int mode, size_t chan ); +void set_iq_balance( const std::complex &balance, size_t chan ); +double set_bandwidth( double bandwidth, size_t chan ); +double get_bandwidth( size_t chan ) ; +osmosdr::freq_range_t get_bandwidth_range( size_t chan ); +void set_time_source(const std::string &source, + const size_t mboard); +std::string get_time_source(const size_t mboard); +std::vector get_time_sources(const size_t mboard); +void set_clock_source(const std::string &source, + const size_t mboard); +std::string get_clock_source(const size_t mboard); +std::vector get_clock_sources(const size_t mboard); +double get_clock_rate(size_t mboard); +void set_clock_rate(double rate, size_t mboard); +::osmosdr::time_spec_t get_time_now(size_t mboard); +::osmosdr::time_spec_t get_time_last_pps(size_t mboard); +void set_time_now(const ::osmosdr::time_spec_t &time_spec, + size_t mboard); +void set_time_next_pps(const ::osmosdr::time_spec_t &time_spec); +void set_time_unknown_pps(const ::osmosdr::time_spec_t &time_spec); +}; + +#endif /* INCLUDED_SOAPY_SOURCE_C_H */ diff --git a/lib/source_impl.cc b/lib/source_impl.cc index e4c9be6..b9fead3 100644 --- a/lib/source_impl.cc +++ b/lib/source_impl.cc @@ -76,6 +76,10 @@ #include #endif +#ifdef ENABLE_SOAPY +#include +#endif + #include "arg_helpers.h" #include "source_impl.h" @@ -141,6 +145,9 @@ source_impl::source_impl( const std::string &args ) #endif #ifdef ENABLE_AIRSPY dev_types.push_back("airspy"); +#endif +#ifdef ENABLE_SOAPY + dev_types.push_back("soapy"); #endif std::cerr << "gr-osmosdr " << GR_OSMOSDR_VERSION << " (" << GR_OSMOSDR_LIBVER << ") " @@ -206,6 +213,10 @@ source_impl::source_impl( const std::string &args ) BOOST_FOREACH( std::string dev, airspy_source_c::get_devices() ) dev_list.push_back( dev ); #endif +#ifdef ENABLE_SOAPY + BOOST_FOREACH( std::string dev, soapy_source_c::get_devices() ) + dev_list.push_back( dev ); +#endif // std::cerr << std::endl; // BOOST_FOREACH( std::string dev, dev_list ) @@ -308,6 +319,13 @@ source_impl::source_impl( const std::string &args ) } #endif +#ifdef ENABLE_SOAPY + if ( dict.count("soapy") ) { + soapy_source_c_sptr src = make_soapy_source_c( arg ); + block = src; iface = src.get(); + } +#endif + if ( iface != NULL && long(block.get()) != 0 ) { _devs.push_back( iface );