From pavel.demin at uclouvain.be Thu Oct 1 20:32:21 2015 From: pavel.demin at uclouvain.be (Pavel Demin) Date: Thu, 1 Oct 2015 22:32:21 +0200 Subject: [PATCH] gr-osmosdr blocks for the Red Pitaya SDR transceiver Message-ID: <560D9855.704@uclouvain.be> Hello Dimitri, I've put together two simple gr-osmosdr blocks for the Red Pitaya SDR transceiver. They are based on the file block with some pieces borrowed from the rtl_tcp block. Would it be possible to add these blocks to the gr-osmosdr code repository? The patch is in the attachment. Some information about the Red Pitaya SDR transceiver can be found at: http://pavel-demin.github.io/red-pitaya-notes/sdr-transceiver Best regards, Pavel -------------- next part -------------- diff -rupN old/gr-osmosdr/lib/CMakeLists.txt gr-osmosdr/lib/CMakeLists.txt --- old/gr-osmosdr/lib/CMakeLists.txt 2015-10-01 22:07:37.161254861 +0200 +++ gr-osmosdr/lib/CMakeLists.txt 2015-10-01 22:08:22.992678682 +0200 @@ -233,6 +233,14 @@ GR_INCLUDE_SUBDIRECTORY(soapy) endif(ENABLE_SOAPY) ######################################################################## +# Setup Red Pitaya component +######################################################################## +GR_REGISTER_COMPONENT("Red Pitaya support" ENABLE_RED_PITAYA) +if(ENABLE_RED_PITAYA) +GR_INCLUDE_SUBDIRECTORY(red_pitaya) +endif(ENABLE_RED_PITAYA) + +######################################################################## # Setup configuration file ######################################################################## ADD_DEFINITIONS(-DHAVE_CONFIG_H=1) diff -rupN old/gr-osmosdr/lib/config.h.in gr-osmosdr/lib/config.h.in --- old/gr-osmosdr/lib/config.h.in 2015-10-01 22:07:37.165254811 +0200 +++ gr-osmosdr/lib/config.h.in 2015-10-01 22:08:22.996678632 +0200 @@ -17,5 +17,6 @@ #cmakedefine ENABLE_RFSPACE #cmakedefine ENABLE_AIRSPY #cmakedefine ENABLE_SOAPY +#cmakedefine ENABLE_RED_PITAYA #endif // CONFIG_H_IN diff -rupN old/gr-osmosdr/lib/red_pitaya/CMakeLists.txt gr-osmosdr/lib/red_pitaya/CMakeLists.txt --- old/gr-osmosdr/lib/red_pitaya/CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100 +++ gr-osmosdr/lib/red_pitaya/CMakeLists.txt 2015-10-01 22:08:23.000678582 +0200 @@ -0,0 +1,37 @@ +# Copyright 2012 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} +) + +set(red_pitaya_srcs + ${CMAKE_CURRENT_SOURCE_DIR}/red_pitaya_source_c.cc + ${CMAKE_CURRENT_SOURCE_DIR}/red_pitaya_sink_c.cc +) + +######################################################################## +# Append gnuradio-osmosdr library sources +######################################################################## +list(APPEND gr_osmosdr_srcs ${red_pitaya_srcs}) +#list(APPEND gr_osmosdr_libs ${GNURADIO_BLOCKS_LIBRARIES}) diff -rupN old/gr-osmosdr/lib/red_pitaya/red_pitaya_sink_c.cc gr-osmosdr/lib/red_pitaya/red_pitaya_sink_c.cc --- old/gr-osmosdr/lib/red_pitaya/red_pitaya_sink_c.cc 1970-01-01 01:00:00.000000000 +0100 +++ gr-osmosdr/lib/red_pitaya/red_pitaya_sink_c.cc 2015-10-01 22:08:23.000678582 +0200 @@ -0,0 +1,281 @@ +/* -*- c++ -*- */ +/* + * Copyright 2012 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. + */ + +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#include +#else +#include +#include +#include +#include +#endif + +#include +#include +#include + +#include + +#include "red_pitaya_sink_c.h" + +#include "arg_helpers.h" + +using namespace boost::assign; + +red_pitaya_sink_c_sptr make_red_pitaya_sink_c(const std::string &args) +{ + return gnuradio::get_initial_sptr(new red_pitaya_sink_c(args)); +} + +red_pitaya_sink_c::red_pitaya_sink_c(const std::string &args) : + gr::hier_block2("red_pitaya_sink_c", + gr::io_signature::make(1, 1, sizeof(gr_complex)), + gr::io_signature::make(0, 0, 0)) +{ + std::string host = "192.168.1.100"; + std::stringstream message; + unsigned short ptt = 0, port = 1001; + struct sockaddr_in addr; + uint32_t command; + +#ifdef _WIN32 + WSADATA wsaData; + WSAStartup( MAKEWORD(2, 2), &wsaData ); +#endif + + _freq = 6.0e5; + _rate = 1.0e5; + _corr = 0.0; + + dict_t dict = params_to_dict( args ); + + if ( dict.count( "red_pitaya" ) ) { + std::vector< std::string > tokens; + boost::algorithm::split( tokens, dict["red_pitaya"], boost::is_any_of( ":" ) ); + + if ( tokens[0].length() && ( tokens.size() == 1 || tokens.size() == 2 ) ) + host = tokens[0]; + + if ( tokens.size() == 2 ) + port = boost::lexical_cast< unsigned short >( tokens[1] ); + } + + if ( dict.count("ptt") ) + ptt = boost::lexical_cast< unsigned short >( dict["ptt"] ); + + if ( !host.length() ) + host = "192.168.1.100"; + + if ( 0 == port ) + port = 1001; + + for ( size_t i = 0; i < 2; ++i ) + { + if ( ( _sockets[i] = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) + { + throw std::runtime_error( "Could not create TCP socket." ); + } + + memset( &addr, 0, sizeof(addr) ); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = inet_addr( host.c_str() ); + addr.sin_port = htons( port ); + + if ( ::connect( _sockets[i], (struct sockaddr *)&addr, sizeof(addr) ) < 0 ) + { + message << "Could not connect to " << host << ":" << port << "."; + throw std::runtime_error( message.str() ); + } + + command = i + 2; + send( _sockets[i], &command, 4, MSG_NOSIGNAL ); + } + + command = ptt ? 2<<28 : 3<<28; + send( _sockets[0], &command, 4, MSG_NOSIGNAL ); + + _sink = gr::blocks::file_descriptor_sink::make( sizeof(gr_complex), _sockets[1] ); + + connect( self(), 0, _sink, 0 ); +} + +red_pitaya_sink_c::~red_pitaya_sink_c() +{ + close( _sockets[1] ); + close( _sockets[0] ); + +#ifdef _WIN32 + WSACleanup(); +#endif +} + +std::string red_pitaya_sink_c::name() +{ + return "Red Pitaya Sink"; +} + +std::vector red_pitaya_sink_c::get_devices( bool fake ) +{ + std::vector devices; + + if ( fake ) + { + std::string args = "red_pitaya=192.168.1.100:1001"; + args += ",label='Red Pitaya Transceiver Server'"; + devices.push_back( args ); + } + + return devices; +} + +size_t red_pitaya_sink_c::get_num_channels( void ) +{ + return 1; +} + +osmosdr::meta_range_t red_pitaya_sink_c::get_sample_rates( void ) +{ + osmosdr::meta_range_t range; + + range += osmosdr::range_t( 20000 ); + range += osmosdr::range_t( 50000 ); + range += osmosdr::range_t( 100000 ); + range += osmosdr::range_t( 250000 ); + range += osmosdr::range_t( 500000 ); + + return range; +} + +double red_pitaya_sink_c::set_sample_rate( double rate ) +{ + uint32_t command = 0; + + if ( 20000 == rate ) command = 0; + else if ( 50000 == rate ) command = 1; + else if ( 100000 == rate ) command = 2; + else if ( 250000 == rate ) command = 3; + else if ( 500000 == rate ) command = 4; + else return get_sample_rate(); + + command |= 1<<28; + send( _sockets[0], &command, 4, MSG_NOSIGNAL ); + + _rate = rate; + + return get_sample_rate(); +} + +double red_pitaya_sink_c::get_sample_rate( void ) +{ + return _rate; +} + +osmosdr::freq_range_t red_pitaya_sink_c::get_freq_range( size_t chan ) +{ + return osmosdr::freq_range_t( _rate / 2.0, 6.0e7 ); +} + +double red_pitaya_sink_c::set_center_freq( double freq, size_t chan ) +{ + uint32_t command = 0; + + if ( freq < _rate / 2.0 || freq > 6.0e7 ) return get_center_freq( chan ); + + command = (uint32_t)floor( freq * (1.0 + _corr * 1.0e-6 ) + 0.5 ); + + send( _sockets[0], &command, 4, MSG_NOSIGNAL ); + + _freq = freq; + + return get_center_freq( chan ); +} + +double red_pitaya_sink_c::get_center_freq( size_t chan ) +{ + return _freq; +} + +double red_pitaya_sink_c::set_freq_corr( double ppm, size_t chan ) +{ + _corr = ppm; + + return get_freq_corr( chan ); +} + +double red_pitaya_sink_c::get_freq_corr( size_t chan ) +{ + return _corr; +} + +std::vector red_pitaya_sink_c::get_gain_names( size_t chan ) +{ + return std::vector< std::string >(); +} + +osmosdr::gain_range_t red_pitaya_sink_c::get_gain_range( size_t chan ) +{ + return osmosdr::gain_range_t(); +} + +osmosdr::gain_range_t red_pitaya_sink_c::get_gain_range( const std::string & name, size_t chan ) +{ + return get_gain_range( chan ); +} + +double red_pitaya_sink_c::set_gain( double gain, size_t chan ) +{ + return get_gain( chan ); +} + +double red_pitaya_sink_c::set_gain( double gain, const std::string & name, size_t chan ) +{ + return set_gain( chan ); +} + +double red_pitaya_sink_c::get_gain( size_t chan ) +{ + return 0; +} + +double red_pitaya_sink_c::get_gain( const std::string & name, size_t chan ) +{ + return get_gain( chan ); +} + +std::vector< std::string > red_pitaya_sink_c::get_antennas( size_t chan ) +{ + return std::vector< std::string >(); +} + +std::string red_pitaya_sink_c::set_antenna( const std::string & antenna, size_t chan ) +{ + return get_antenna( chan ); +} + +std::string red_pitaya_sink_c::get_antenna( size_t chan ) +{ + return "TX"; +} diff -rupN old/gr-osmosdr/lib/red_pitaya/red_pitaya_sink_c.h gr-osmosdr/lib/red_pitaya/red_pitaya_sink_c.h --- old/gr-osmosdr/lib/red_pitaya/red_pitaya_sink_c.h 1970-01-01 01:00:00.000000000 +0100 +++ gr-osmosdr/lib/red_pitaya/red_pitaya_sink_c.h 2015-10-01 22:08:23.000678582 +0200 @@ -0,0 +1,80 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 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 RED_PITAYA_SINK_C_H +#define RED_PITAYA_SINK_C_H + +#include +#include + +#include "sink_iface.h" + +class red_pitaya_sink_c; + +typedef boost::shared_ptr< red_pitaya_sink_c > red_pitaya_sink_c_sptr; + +red_pitaya_sink_c_sptr make_red_pitaya_sink_c( const std::string & args = "" ); + +class red_pitaya_sink_c : + public gr::hier_block2, + public sink_iface +{ +private: + friend red_pitaya_sink_c_sptr make_red_pitaya_sink_c(const std::string &args); + + red_pitaya_sink_c(const std::string &args); + +public: + ~red_pitaya_sink_c(); + + std::string name(); + + static std::vector< std::string > get_devices( bool fake = false ); + + 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 = 0 ); + double set_center_freq( double freq, size_t chan = 0 ); + double get_center_freq( size_t chan = 0 ); + double set_freq_corr( double ppm, size_t chan = 0 ); + double get_freq_corr( size_t chan = 0 ); + + std::vector get_gain_names( size_t chan = 0 ); + osmosdr::gain_range_t get_gain_range( size_t chan = 0 ); + osmosdr::gain_range_t get_gain_range( const std::string & name, size_t chan = 0 ); + double set_gain( double gain, size_t chan = 0 ); + double set_gain( double gain, const std::string & name, size_t chan = 0 ); + double get_gain( size_t chan = 0 ); + double get_gain( const std::string & name, size_t chan = 0 ); + + std::vector< std::string > get_antennas( size_t chan = 0 ); + std::string set_antenna( const std::string & antenna, size_t chan = 0 ); + std::string get_antenna( size_t chan = 0 ); + +private: + gr::blocks::file_descriptor_sink::sptr _sink; + double _freq, _rate, _corr; + int _sockets[2]; +}; + +#endif // RED_PITAYA_SINK_C_H diff -rupN old/gr-osmosdr/lib/red_pitaya/red_pitaya_source_c.cc gr-osmosdr/lib/red_pitaya/red_pitaya_source_c.cc --- old/gr-osmosdr/lib/red_pitaya/red_pitaya_source_c.cc 1970-01-01 01:00:00.000000000 +0100 +++ gr-osmosdr/lib/red_pitaya/red_pitaya_source_c.cc 2015-10-01 22:08:23.000678582 +0200 @@ -0,0 +1,275 @@ +/* -*- c++ -*- */ +/* + * Copyright 2012 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. + */ + +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#include +#else +#include +#include +#include +#include +#endif + +#include +#include +#include + +#include + +#include "red_pitaya_source_c.h" + +#include "arg_helpers.h" + +using namespace boost::assign; + +red_pitaya_source_c_sptr make_red_pitaya_source_c(const std::string &args) +{ + return gnuradio::get_initial_sptr(new red_pitaya_source_c(args)); +} + +red_pitaya_source_c::red_pitaya_source_c(const std::string &args) : + gr::hier_block2("red_pitaya_source_c", + gr::io_signature::make(0, 0, 0), + gr::io_signature::make(1, 1, sizeof(gr_complex))) +{ + std::string host = "192.168.1.100"; + std::stringstream message; + unsigned short port = 1001; + struct sockaddr_in addr; + uint32_t command; + +#ifdef _WIN32 + WSADATA wsaData; + WSAStartup( MAKEWORD(2, 2), &wsaData ); +#endif + + _freq = 6.0e5; + _rate = 1.0e5; + _corr = 0.0; + + dict_t dict = params_to_dict( args ); + + if ( dict.count( "red_pitaya" ) ) { + std::vector< std::string > tokens; + boost::algorithm::split( tokens, dict["red_pitaya"], boost::is_any_of( ":" ) ); + + if ( tokens[0].length() && ( tokens.size() == 1 || tokens.size() == 2 ) ) + host = tokens[0]; + + if ( tokens.size() == 2 ) + port = boost::lexical_cast< unsigned short >( tokens[1] ); + } + + if ( !host.length() ) + host = "192.168.1.100"; + + if ( 0 == port ) + port = 1001; + + for ( size_t i = 0; i < 2; ++i ) + { + if ( ( _sockets[i] = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) + { + throw std::runtime_error( "Could not create TCP socket." ); + } + + memset( &addr, 0, sizeof(addr) ); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = inet_addr( host.c_str() ); + addr.sin_port = htons( port ); + + if ( ::connect( _sockets[i], (struct sockaddr *)&addr, sizeof(addr) ) < 0 ) + { + message << "Could not connect to " << host << ":" << port << "."; + throw std::runtime_error( message.str() ); + } + + command = i; + send( _sockets[i], &command, 4, MSG_NOSIGNAL ); + } + + _source = gr::blocks::file_descriptor_source::make( sizeof(gr_complex), _sockets[1] ); + + connect( _source, 0, self(), 0 ); +} + +red_pitaya_source_c::~red_pitaya_source_c() +{ + close( _sockets[1] ); + close( _sockets[0] ); + +#ifdef _WIN32 + WSACleanup(); +#endif +} + +std::string red_pitaya_source_c::name() +{ + return "Red Pitaya Source"; +} + +std::vector red_pitaya_source_c::get_devices( bool fake ) +{ + std::vector devices; + + if ( fake ) + { + std::string args = "red_pitaya=192.168.1.100:1001"; + args += ",label='Red Pitaya Transceiver Server'"; + devices.push_back( args ); + } + + return devices; +} + +size_t red_pitaya_source_c::get_num_channels( void ) +{ + return 1; +} + +osmosdr::meta_range_t red_pitaya_source_c::get_sample_rates( void ) +{ + osmosdr::meta_range_t range; + + range += osmosdr::range_t( 20000 ); + range += osmosdr::range_t( 50000 ); + range += osmosdr::range_t( 100000 ); + range += osmosdr::range_t( 250000 ); + range += osmosdr::range_t( 500000 ); + + return range; +} + +double red_pitaya_source_c::set_sample_rate( double rate ) +{ + uint32_t command = 0; + + if ( 20000 == rate ) command = 0; + else if ( 50000 == rate ) command = 1; + else if ( 100000 == rate ) command = 2; + else if ( 250000 == rate ) command = 3; + else if ( 500000 == rate ) command = 4; + else return get_sample_rate(); + + command |= 1<<28; + send( _sockets[0], &command, 4, MSG_NOSIGNAL ); + + _rate = rate; + + return get_sample_rate(); +} + +double red_pitaya_source_c::get_sample_rate( void ) +{ + return _rate; +} + +osmosdr::freq_range_t red_pitaya_source_c::get_freq_range( size_t chan ) +{ + return osmosdr::freq_range_t( _rate / 2.0, 6.0e7 ); +} + +double red_pitaya_source_c::set_center_freq( double freq, size_t chan ) +{ + uint32_t command = 0; + + if ( freq < _rate / 2.0 || freq > 6.0e7 ) return get_center_freq( chan ); + + command = (uint32_t)floor( freq * (1.0 + _corr * 1.0e-6 ) + 0.5 ); + + send( _sockets[0], &command, 4, MSG_NOSIGNAL ); + + _freq = freq; + + return get_center_freq( chan ); +} + +double red_pitaya_source_c::get_center_freq( size_t chan ) +{ + return _freq; +} + +double red_pitaya_source_c::set_freq_corr( double ppm, size_t chan ) +{ + _corr = ppm; + + return get_freq_corr( chan ); +} + +double red_pitaya_source_c::get_freq_corr( size_t chan ) +{ + return _corr; +} + +std::vector red_pitaya_source_c::get_gain_names( size_t chan ) +{ + return std::vector< std::string >(); +} + +osmosdr::gain_range_t red_pitaya_source_c::get_gain_range( size_t chan ) +{ + return osmosdr::gain_range_t(); +} + +osmosdr::gain_range_t red_pitaya_source_c::get_gain_range( const std::string & name, size_t chan ) +{ + return get_gain_range( chan ); +} + +double red_pitaya_source_c::set_gain( double gain, size_t chan ) +{ + return get_gain( chan ); +} + +double red_pitaya_source_c::set_gain( double gain, const std::string & name, size_t chan ) +{ + return set_gain( chan ); +} + +double red_pitaya_source_c::get_gain( size_t chan ) +{ + return 0; +} + +double red_pitaya_source_c::get_gain( const std::string & name, size_t chan ) +{ + return get_gain( chan ); +} + +std::vector< std::string > red_pitaya_source_c::get_antennas( size_t chan ) +{ + return std::vector< std::string >(); +} + +std::string red_pitaya_source_c::set_antenna( const std::string & antenna, size_t chan ) +{ + return get_antenna( chan ); +} + +std::string red_pitaya_source_c::get_antenna( size_t chan ) +{ + return "RX"; +} diff -rupN old/gr-osmosdr/lib/red_pitaya/red_pitaya_source_c.h gr-osmosdr/lib/red_pitaya/red_pitaya_source_c.h --- old/gr-osmosdr/lib/red_pitaya/red_pitaya_source_c.h 1970-01-01 01:00:00.000000000 +0100 +++ gr-osmosdr/lib/red_pitaya/red_pitaya_source_c.h 2015-10-01 22:08:23.000678582 +0200 @@ -0,0 +1,80 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 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 RED_PITAYA_SOURCE_C_H +#define RED_PITAYA_SOURCE_C_H + +#include +#include + +#include "source_iface.h" + +class red_pitaya_source_c; + +typedef boost::shared_ptr< red_pitaya_source_c > red_pitaya_source_c_sptr; + +red_pitaya_source_c_sptr make_red_pitaya_source_c( const std::string & args = "" ); + +class red_pitaya_source_c : + public gr::hier_block2, + public source_iface +{ +private: + friend red_pitaya_source_c_sptr make_red_pitaya_source_c(const std::string &args); + + red_pitaya_source_c(const std::string &args); + +public: + ~red_pitaya_source_c(); + + std::string name(); + + static std::vector< std::string > get_devices( bool fake = false ); + + 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 = 0 ); + double set_center_freq( double freq, size_t chan = 0 ); + double get_center_freq( size_t chan = 0 ); + double set_freq_corr( double ppm, size_t chan = 0 ); + double get_freq_corr( size_t chan = 0 ); + + std::vector get_gain_names( size_t chan = 0 ); + osmosdr::gain_range_t get_gain_range( size_t chan = 0 ); + osmosdr::gain_range_t get_gain_range( const std::string & name, size_t chan = 0 ); + double set_gain( double gain, size_t chan = 0 ); + double set_gain( double gain, const std::string & name, size_t chan = 0 ); + double get_gain( size_t chan = 0 ); + double get_gain( const std::string & name, size_t chan = 0 ); + + std::vector< std::string > get_antennas( size_t chan = 0 ); + std::string set_antenna( const std::string & antenna, size_t chan = 0 ); + std::string get_antenna( size_t chan = 0 ); + +private: + gr::blocks::file_descriptor_source::sptr _source; + double _freq, _rate, _corr; + int _sockets[2]; +}; + +#endif // RED_PITAYA_SOURCE_C_H diff -rupN old/gr-osmosdr/lib/sink_impl.cc gr-osmosdr/lib/sink_impl.cc --- old/gr-osmosdr/lib/sink_impl.cc 2015-10-01 22:07:37.169254761 +0200 +++ gr-osmosdr/lib/sink_impl.cc 2015-10-01 22:08:23.000678582 +0200 @@ -46,6 +46,10 @@ #include #endif +#ifdef ENABLE_RED_PITAYA +#include +#endif + #include "arg_helpers.h" #include "sink_impl.h" @@ -91,6 +95,9 @@ sink_impl::sink_impl( const std::string #ifdef ENABLE_SOAPY dev_types.push_back("soapy"); #endif +#ifdef ENABLE_RED_PITAYA + dev_types.push_back("red_pitaya"); +#endif std::cerr << "gr-osmosdr " << GR_OSMOSDR_VERSION << " (" << GR_OSMOSDR_LIBVER << ") " << "gnuradio " << gr::version() << std::endl; @@ -129,6 +136,10 @@ sink_impl::sink_impl( const std::string BOOST_FOREACH( std::string dev, soapy_sink_c::get_devices() ) dev_list.push_back( dev ); #endif +#ifdef ENABLE_RED_PITAYA + BOOST_FOREACH( std::string dev, red_pitaya_sink_c::get_devices() ) + dev_list.push_back( dev ); +#endif // std::cerr << std::endl; // BOOST_FOREACH( std::string dev, dev_list ) @@ -176,6 +187,13 @@ sink_impl::sink_impl( const std::string block = sink; iface = sink.get(); } #endif + +#ifdef ENABLE_RED_PITAYA + if ( dict.count("red_pitaya") ) { + red_pitaya_sink_c_sptr sink = make_red_pitaya_sink_c( arg ); + block = sink; iface = sink.get(); + } +#endif if ( iface != NULL && long(block.get()) != 0 ) { _devs.push_back( iface ); diff -rupN old/gr-osmosdr/lib/source_impl.cc gr-osmosdr/lib/source_impl.cc --- old/gr-osmosdr/lib/source_impl.cc 2015-10-01 22:07:37.169254761 +0200 +++ gr-osmosdr/lib/source_impl.cc 2015-10-01 22:08:23.004678531 +0200 @@ -84,6 +84,10 @@ #include #endif +#ifdef ENABLE_RED_PITAYA +#include +#endif + #include "arg_helpers.h" #include "source_impl.h" @@ -156,6 +160,9 @@ source_impl::source_impl( const std::str #ifdef ENABLE_SOAPY dev_types.push_back("soapy"); #endif +#ifdef ENABLE_RED_PITAYA + dev_types.push_back("red_pitaya"); +#endif std::cerr << "gr-osmosdr " << GR_OSMOSDR_VERSION << " (" << GR_OSMOSDR_LIBVER << ") " << "gnuradio " << gr::version() << std::endl; @@ -228,6 +235,10 @@ source_impl::source_impl( const std::str BOOST_FOREACH( std::string dev, soapy_source_c::get_devices() ) dev_list.push_back( dev ); #endif +#ifdef ENABLE_RED_PITAYA + BOOST_FOREACH( std::string dev, red_pitaya_source_c::get_devices() ) + dev_list.push_back( dev ); +#endif // std::cerr << std::endl; // BOOST_FOREACH( std::string dev, dev_list ) @@ -343,6 +354,13 @@ source_impl::source_impl( const std::str block = src; iface = src.get(); } #endif + +#ifdef ENABLE_RED_PITAYA + if ( dict.count("red_pitaya") ) { + red_pitaya_source_c_sptr src = make_red_pitaya_source_c( arg ); + block = src; iface = src.get(); + } +#endif if ( iface != NULL && long(block.get()) != 0 ) { _devs.push_back( iface ); From josh at joshknows.com Thu Oct 1 23:55:38 2015 From: josh at joshknows.com (Josh Blum) Date: Thu, 1 Oct 2015 16:55:38 -0700 Subject: SoapyRemote: Turn any SDR into a network peripheral Message-ID: <560DC7FA.2070201@joshknows.com> Hey list, I recently put together SoapyRemote, which is a plugin and server app for SoapySDR that lets any supported hardware operate as a network device over a local link: https://github.com/pothosware/SoapyRemote/wiki GrOsmoSDR users should be able to use the Osmo source and sink blocks to work transparently with a remote device. Just make sure that GrOsmoSDR was configured with the support for SoapySDR. I have documented how the device args should be set to use a remote device: https://github.com/pothosware/SoapyRemote/wiki#grosmosdr-remote-devices Extra note: Everything works better with large socket buffers. On linux, users will want to run the sysctl commands here: https://github.com/pothosware/SoapyRemote/wiki#remote-window I had a lot of fun making SoapyRemote, and we have already seen that working with embedded devices has been a big use case. I hope that GrOsmoSDR users will find utility with SoapyRemote as well. Thanks, and happy hacking! -josh From j-pi at seznam.cz Sun Oct 4 13:08:00 2015 From: j-pi at seznam.cz (P) Date: Sun, 4 Oct 2015 15:08:00 +0200 Subject: [PATCH] clear warnings about compare signed-unsigned values Message-ID: <561124B0.7060809@seznam.cz> This just removes few annoying warnings. About the conversion of string to signed int. - dev_index = boost::lexical_cast< unsigned int >( hackrf_serial ); + dev_index = boost::lexical_cast< int >( hackrf_serial ); hackrf_device_list_open checks if value of dev_index is out of range (eg negative) and returns proper error. In future negative value can be used for something so this check is not necessary nor wanted. P -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-clear-warnings-about-compare-signed-unsigned-values.patch Type: text/x-patch Size: 2080 bytes Desc: not available URL: From j-pi at seznam.cz Sun Oct 4 13:02:48 2015 From: j-pi at seznam.cz (P) Date: Sun, 4 Oct 2015 15:02:48 +0200 Subject: [PATCH] do not check for NULL before calling free Message-ID: <56112378.6040005@seznam.cz> Checking if variable is not NULL before calling free() is not effective, because free() already does this. - waste instruction and/or compiler time - more lines of code than necessary This patch removes those checks. -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-do-not-check-for-NULL-before-calling-free.patch Type: text/x-patch Size: 3793 bytes Desc: not available URL: From j-pi at seznam.cz Sun Oct 4 13:58:53 2015 From: j-pi at seznam.cz (P) Date: Sun, 4 Oct 2015 15:58:53 +0200 Subject: gr-osmosdr setting value in destructor Message-ID: <5611309D.4010503@seznam.cz> Hi, there is in gr-osmosdr a lot of code like: hackrf_source_c::~hackrf_source_c () { ... free(_buf); _buf = NULL; } } Setting value in destructor have sense in two case: - they are used in some way in destructor of parent class - You set then to something like 0xDEADBEEF and when pointer from already destroyed class is used it will cause segfault. Setting value to NULL is contraproductive because there is a lot of checks if value is not NULL, this actually can hide some troubles of calling something using already freed pointer. I'm suggesting to remove this kind of code. I will prepare patch but now I'm waiting if those two pending patches I have send before would be accepter or not. Is there any opinion which oppose previous claim? With best regards, JP. From j-pi at seznam.cz Sun Oct 4 17:33:54 2015 From: j-pi at seznam.cz (P) Date: Sun, 4 Oct 2015 19:33:54 +0200 Subject: [PATCH] librtlsdr: conditional USB transfer resubmit Message-ID: <56116302.6010907@seznam.cz> This patch implements zero-copy overhead for buffers used for sample transfer. This improves a bit performance for applications where low overhead is required and can save a bit of memory. Two changes are made: * add return value for callback function * add function for buffer release when it is free for reuse This change breaks ABI (callback returns int instead of void), but I cannot find way not to do so. Proper change of library version in CMaleList.txt would be required. Please comment on it and let my now if it is interesting enough to be merged upstream. JP -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-librtlsdr-conditional-USB-transfer-resubmit.patch Type: text/x-patch Size: 5985 bytes Desc: not available URL: