This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/osmocom-sdr@lists.osmocom.org/.
CT2FZI IM58kr ct2fzi at gmail.comunsubscribe Em 24/08/2016 22:55, <osmocom-sdr-request at lists.osmocom.org> escreveu: > Send osmocom-sdr mailing list submissions to > osmocom-sdr at lists.osmocom.org > > To subscribe or unsubscribe via the World Wide Web, visit > https://lists.osmocom.org/mailman/listinfo/osmocom-sdr > or, via email, send a message with subject or body 'help' to > osmocom-sdr-request at lists.osmocom.org > > You can reach the person managing the list at > osmocom-sdr-owner at lists.osmocom.org > > When replying, please edit your Subject line so it is more specific > than "Re: Contents of osmocom-sdr digest..." > > > Today's Topics: > > 1. PATCH: Fixed arbitrary resampling in rtl_fm > (f.meyer-hermann at gsg-elektronik.de) > 2. Uccess! My first librtlsdr application (Neoklis Kyriazis) > 3. Re: Uccess! My first librtlsdr application (Lucas Teske) > 4. Fwd: Development of rtl-sdr driver (Piotr Krysik) > 5. RTL-SDR and RTL-TCP drivers (Krzysztof Halasa) > 6. [PATCH] RTL-SDR: convert _lut to float[] to reduce size by a > factor of 256 (Krzysztof Halasa) > 7. [PATCH] RTL-TCP: Convert to single class model (Krzysztof Halasa) > > > ---------------------------------------------------------------------- > > Message: 1 > Date: Mon, 25 Jul 2016 13:13:13 +0200 > From: f.meyer-hermann at gsg-elektronik.de > To: osmocom-sdr at lists.osmocom.org > Subject: PATCH: Fixed arbitrary resampling in rtl_fm > Message-ID: <20160725111313.GA15278 at gsg-elektronik.de> > Content-Type: text/plain; charset=us-ascii > > As already on github, I fixed rtl_fm's arbitrary resampling by fixing the > output buffer length and allowing upsampling by copying the audio data > since > the algorithm cannot work in-place. > I have attached a patch, if you are interested to integrate it into the > official branch. > Regards, > > Ferdinand Meyer-Hermann > > > ------------------------------ > > Message: 2 > Date: Fri, 5 Aug 2016 05:09:49 +0000 (UTC) > From: Neoklis Kyriazis <nkcyham at yahoo.com> > To: "osmocom-sdr at lists.osmocom.org" <osmocom-sdr at lists.osmocom.org> > Subject: Uccess! My first librtlsdr application > Message-ID: > <1565657774.9528793.1470373789409.JavaMail.yahoo at mail.yahoo.com> > Content-Type: text/plain; charset=UTF-8 > > Hi > > > First, my thanks to everyone involved with the development and > release of librtlsdr. Well done. :-) > > I always wanted to try my hand building an SDR application and > so I installed the latest librtlsdr and started writing code > > to test the various functions in the librtlsdr library. Having > gotten familiar with this, I started work on modifying my old > Wx satellite APT image decoder app, xwxapt, to support an rtlsdr > receiver beside the linear VHF receiver it was written for. > > Its always difficult to extensively modify an existing app, but > in the end it all worked out well and xwxapt can now receive the > old APT format images from Wx sats with the rtl-sdr receiver. In > the process, I modified xwxapt to include controls for the rtl-sdr > unit, display an FFT-derived spectrum of the 2.4kHz sub-carrier > and a spectrum of the baseband O/P of the RTL2832 device. Images > are decoded in real time and displayed incrementally in xwxapt's > window. xwxapt is available under the GPL at: > > > http://www.5b4az.org/ in Weather Imaging->Image Decoders menu. > > -- > Best Regards > Neoklis - Ham Radio Call:5B4AZ > http://www.5b4az.org/ > > > ------------------------------ > > Message: 3 > Date: Fri, 5 Aug 2016 13:29:29 -0300 > From: Lucas Teske <lucas at teske.net.br> > To: osmocom-sdr at lists.osmocom.org > Subject: Re: Uccess! My first librtlsdr application > Message-ID: <fb16ab1f-4ff9-3ba5-04a0-5b1231fa72ef at teske.net.br> > Content-Type: text/plain; charset="utf-8" > > Nice Neoklis! > > > It looks good, I will give a try on the weekend :D > > > Btw, you should post the source-code at github, in this way it is easier > to submit patches and stuff. > > > Lucas > > Em 05/08/2016 02:09, Neoklis Kyriazis escreveu: > > Hi > > > > > > First, my thanks to everyone involved with the development and > > release of librtlsdr. Well done. :-) > > > > I always wanted to try my hand building an SDR application and > > so I installed the latest librtlsdr and started writing code > > > > to test the various functions in the librtlsdr library. Having > > gotten familiar with this, I started work on modifying my old > > Wx satellite APT image decoder app, xwxapt, to support an rtlsdr > > receiver beside the linear VHF receiver it was written for. > > > > Its always difficult to extensively modify an existing app, but > > in the end it all worked out well and xwxapt can now receive the > > old APT format images from Wx sats with the rtl-sdr receiver. In > > the process, I modified xwxapt to include controls for the rtl-sdr > > unit, display an FFT-derived spectrum of the 2.4kHz sub-carrier > > and a spectrum of the baseband O/P of the RTL2832 device. Images > > are decoded in real time and displayed incrementally in xwxapt's > > window. xwxapt is available under the GPL at: > > > > > > http://www.5b4az.org/ in Weather Imaging->Image Decoders menu. > > > > -- > > Best Regards > > Neoklis - Ham Radio Call:5B4AZ > > http://www.5b4az.org/ > > > -------------- next part -------------- > A non-text attachment was scrubbed... > Name: smime.p7s > Type: application/pkcs7-signature > Size: 3823 bytes > Desc: Assinatura criptogr??fica S/MIME > URL: <http://lists.osmocom.org/pipermail/osmocom-sdr/ > attachments/20160805/d6b47cd6/attachment-0001.bin> > > ------------------------------ > > Message: 4 > Date: Mon, 8 Aug 2016 13:14:30 +0200 > From: Piotr Krysik <ptrkrysik at gmail.com> > To: osmocom-sdr at lists.osmocom.org > Subject: Fwd: Development of rtl-sdr driver > Message-ID: <fd1e2ce6-eeff-1901-eca7-4eecd09a9a74 at gmail.com> > Content-Type: text/plain; charset=utf-8 > > > Hi everyone, > > I've send the e-mail to the OpenBSC list before, but as I was informed > by Harald this is the right place for such discussions. So I'm resending > it here. > > The osmocom's version of rtl-sdr driver seems to be the main one. > Osmocom's repository is used by distributions to build rtl-sdr packages > and it is source of the code for compilation with use of GNU Radio's > Pybombs. > > Is there someone in the Osmocom who is maintaining it? There were some > important developments regarding this driver and it would be great to > add these patches in the Osmocom's repo. > > For example one that interests me is turning off dithering so multiple > dongles sharing the same clock generate the same LO frequency. Currently > there is always little frequency offset that makes coherent of the > receivers operation much harder. > > Such changes of course have to be done carefully so nothing gets broken > in the process. In case of turning off dithering it results with worse > tuning granularity, so for example turning it off could be made optional. > > -- > Best Regards, > Piotr Krysik > > > ------------------------------ > > Message: 5 > Date: Wed, 24 Aug 2016 23:43:03 +0200 > From: Krzysztof Halasa <khc at pm.waw.pl> > To: osmocom-sdr at lists.osmocom.org > Subject: RTL-SDR and RTL-TCP drivers > Message-ID: <m3pooxu9lk.fsf at pm.waw.pl> > Content-Type: text/plain > > Hello, > > it's my first mail on this list, so please forgive me if I do something > wrong. > > I'm about to post a couple of patches for RTL drivers: > > 1. RTL-SDR: convert _lut to float[] to reduce size by a factor of 256. > > The _lut is being indexed by I + Q (16 bits = 65536 entries), however > both samples can be processed independently, resulting in 8-bit LUT. > Saves a bit of RAM and CPU cache. > > lib/rtl/rtl_source_c.cc | 19 ++++++------------- > lib/rtl/rtl_source_c.h | 4 ++-- > 2 files changed, 8 insertions(+), 15 deletions(-) > > > 2. RTL-TCP: Convert to single class model > > The existing RTL TCP driver is quite different from its brother RTL_SDR. > It's much more complicated, uses gr::blocks::deinterleave and > gr::blocks::float_to_complex, and generally doesn't work correctly > (e.g. https://github.com/csete/gqrx/issues/99 > Spectrum is mirrored when filter or demodulator changes (rtl_tcp) #99) > > I've converted the RTL TCP driver to the model used by RTL_SDR, > simplifying it in the process, and fixing the GQRX issue. > > lib/rtl_tcp/CMakeLists.txt | 1 - > lib/rtl_tcp/rtl_tcp_source_c.cc | 352 ++++++++++++++++++++++++++++++ > ++-------- > lib/rtl_tcp/rtl_tcp_source_c.h | 32 +++- > lib/rtl_tcp/rtl_tcp_source_f.cc | 327 ------------------------------ > ------- > lib/rtl_tcp/rtl_tcp_source_f.h | 125 -------------- > 5 files changed, 309 insertions(+), 528 deletions(-) > > > I'm also thinking about merging the code common to RTL-SDR and RTL-TCP, > but this it's done yet. > > Comments? > -- > Krzysztof Halasa > > > ------------------------------ > > Message: 6 > Date: Wed, 24 Aug 2016 23:53:39 +0200 > From: Krzysztof Halasa <khc at pm.waw.pl> > To: osmocom-sdr at lists.osmocom.org > Subject: [PATCH] RTL-SDR: convert _lut to float[] to reduce size by a > factor of 256 > Message-ID: <m3lgzlu93w.fsf at pm.waw.pl> > Content-Type: text/plain > > The _lut is being indexed by I + Q (16 bits = 65536 entries), however > both samples can be processed independently, resulting in 8-bit LUT. > Saves a bit of RAM and CPU cache. > > diff --git a/lib/rtl/rtl_source_c.cc b/lib/rtl/rtl_source_c.cc > index 93328b8..999ff9e 100644 > --- a/lib/rtl/rtl_source_c.cc > +++ b/lib/rtl/rtl_source_c.cc > @@ -172,15 +172,8 @@ rtl_source_c::rtl_source_c (const std::string &args) > _samp_avail = _buf_len / BYTES_PER_SAMPLE; > > // create a lookup table for gr_complex values > - for (unsigned int i = 0; i <= 0xffff; i++) { > -#ifdef BOOST_LITTLE_ENDIAN > - _lut.push_back( gr_complex( (float(i & 0xff) - 127.4f) * > (1.0f/128.0f), > - (float(i >> 8) - 127.4f) * (1.0f/128.0f) > ) ); > -#else // BOOST_BIG_ENDIAN > - _lut.push_back( gr_complex( (float(i >> 8) - 127.4f) * (1.0f/128.0f), > - (float(i & 0xff) - 127.4f) * > (1.0f/128.0f) ) ); > -#endif > - } > + for (unsigned int i = 0; i < 0x100; i++) > + _lut.push_back((i - 127.4f) / 128.0f); > > _dev = NULL; > ret = rtlsdr_open( &_dev, dev_index ); > @@ -230,11 +223,11 @@ rtl_source_c::rtl_source_c (const std::string &args) > > set_if_gain( 24 ); /* preset to a reasonable default (non-GRC use case) > */ > > - _buf = (unsigned short **) malloc(_buf_num * sizeof(unsigned short *)); > + _buf = (unsigned char **)malloc(_buf_num * sizeof(unsigned char *)); > > if (_buf) { > for(unsigned int i = 0; i < _buf_num; ++i) > - _buf[i] = (unsigned short *) malloc(_buf_len); > + _buf[i] = (unsigned char *)malloc(_buf_len); > } > } > > @@ -348,10 +341,10 @@ int rtl_source_c::work( int noutput_items, > > while (noutput_items && _buf_used) { > const int nout = std::min(noutput_items, _samp_avail); > - const unsigned short *buf = _buf[_buf_head] + _buf_offset; > + const unsigned char *buf = _buf[_buf_head] + _buf_offset * 2; > > for (int i = 0; i < nout; ++i) > - *out++ = _lut[ *(buf + i) ]; > + *out++ = gr_complex(_lut[buf[i * 2]], _lut[buf[i * 2 + 1]]); > > noutput_items -= nout; > _samp_avail -= nout; > diff --git a/lib/rtl/rtl_source_c.h b/lib/rtl/rtl_source_c.h > index 76de400..902b386 100644 > --- a/lib/rtl/rtl_source_c.h > +++ b/lib/rtl/rtl_source_c.h > @@ -122,11 +122,11 @@ private: > static void _rtlsdr_wait(rtl_source_c *obj); > void rtlsdr_wait(); > > - std::vector<gr_complex> _lut; > + std::vector<float> _lut; > > rtlsdr_dev_t *_dev; > gr::thread::thread _thread; > - unsigned short **_buf; > + unsigned char **_buf; > unsigned int _buf_num; > unsigned int _buf_len; > unsigned int _buf_head; > > > ------------------------------ > > Message: 7 > Date: Wed, 24 Aug 2016 23:55:40 +0200 > From: Krzysztof Halasa <khc at pm.waw.pl> > To: osmocom-sdr at lists.osmocom.org > Subject: [PATCH] RTL-TCP: Convert to single class model > Message-ID: <m3h9a9u90j.fsf at pm.waw.pl> > Content-Type: text/plain > > The existing RTL TCP driver is quite different from its brother RTL_SDR. > It's much more complicated, uses gr::blocks::deinterleave and > gr::blocks::float_to_complex, and generally doesn't work correctly > (e.g. https://github.com/csete/gqrx/issues/99 > Spectrum is mirrored when filter or demodulator changes (rtl_tcp) #99) > > I've converted the RTL TCP driver to the model used by RTL_SDR, > simplifying it in the process, and fixing the GQRX issue. > > diff --git a/lib/rtl_tcp/CMakeLists.txt b/lib/rtl_tcp/CMakeLists.txt > index 18400fd..9f7c201 100644 > --- a/lib/rtl_tcp/CMakeLists.txt > +++ b/lib/rtl_tcp/CMakeLists.txt > @@ -26,7 +26,6 @@ include_directories( > ) > > set(rtl_tcp_srcs > - ${CMAKE_CURRENT_SOURCE_DIR}/rtl_tcp_source_f.cc > ${CMAKE_CURRENT_SOURCE_DIR}/rtl_tcp_source_c.cc > ) > > diff --git a/lib/rtl_tcp/rtl_tcp_source_c.cc b/lib/rtl_tcp/rtl_tcp_source_ > c.cc > index a365688..64a3f77 100644 > --- a/lib/rtl_tcp/rtl_tcp_source_c.cc > +++ b/lib/rtl_tcp/rtl_tcp_source_c.cc > @@ -1,4 +1,4 @@ > -/* -*- c++ -*- */ > +/* -*- mode: c++; c-basic-offset: 2 -*- */ > /* > * Copyright 2012 Dimitri Stolnikov <horiz0n at gmx.net> > * > @@ -26,31 +26,114 @@ > #include <boost/algorithm/string.hpp> > > #include <gnuradio/io_signature.h> > -#include <gnuradio/blocks/deinterleave.h> > -#include <gnuradio/blocks/float_to_complex.h> > > #include "rtl_tcp_source_c.h" > - > #include "arg_helpers.h" > > +#if defined(_WIN32) > +// if not posix, assume winsock > +#pragma comment(lib, "ws2_32.lib") > +#define USING_WINSOCK > +#include <winsock2.h> > +#include <ws2tcpip.h> > +#define SHUT_RDWR 2 > +typedef char* optval_t; > +#else > +#include <netdb.h> > +#include <sys/types.h> > +#include <sys/socket.h> > +#include <netinet/in.h> > +#include <netinet/tcp.h> > +#include <arpa/inet.h> > +typedef void* optval_t; > +#endif > + > +#ifdef _MSC_VER > +#include <cstddef> > +typedef ptrdiff_t ssize_t; > +#endif //_MSC_VER > + > +#ifndef _WIN32 > +#include <netinet/in.h> > +#else > +#include <WinSock2.h> > +#endif > + > +#define BYTES_PER_SAMPLE 2 // rtl_tcp device delivers 8 bit unsigned IQ > data > + > +/* copied from rtl sdr code */ > +typedef struct { /* structure size must be multiple of 2 bytes */ > + char magic[4]; > + uint32_t tuner_type; > + uint32_t tuner_gain_count; > +} dongle_info_t; > + > +#ifdef _WIN32 > +#define __attribute__(x) > +#pragma pack(push, 1) > +#endif > +struct command { > + unsigned char cmd; > + unsigned int param; > +} __attribute__((packed)); > +#ifdef _WIN32 > +#pragma pack(pop) > +#endif > + > +#define USE_SELECT 1 // non-blocking receive on all platforms > +#define USE_RCV_TIMEO 0 // non-blocking receive on all but Cygwin > +#define SRC_VERBOSE 0 > +#define SNK_VERBOSE 0 > + > +static int is_error( int perr ) > +{ > + // Compare error to posix error code; return nonzero if match. > +#if defined(USING_WINSOCK) > +#define ENOPROTOOPT 109 > + // All codes to be checked for must be defined below > + int werr = WSAGetLastError(); > + switch( werr ) { > + case WSAETIMEDOUT: > + return( perr == EAGAIN ); > + case WSAENOPROTOOPT: > + return( perr == ENOPROTOOPT ); > + default: > + fprintf(stderr,"rtl_tcp_source_f: unknown error %d WS err %d \n", > perr, werr ); > + throw std::runtime_error("internal error"); > + } > + return 0; > +#else > + return( perr == errno ); > +#endif > +} > + > +static void report_error( const char *msg1, const char *msg2 ) > +{ > + // Deal with errors, both posix and winsock > +#if defined(USING_WINSOCK) > + int werr = WSAGetLastError(); > + fprintf(stderr, "%s: winsock error %d\n", msg1, werr ); > +#else > + perror(msg1); > +#endif > + if( msg2 != NULL ) > + throw std::runtime_error(msg2); > + return; > +} > + > using namespace boost::assign; > > -static std::string get_tuner_name( enum rtlsdr_tuner tuner_type ) > +const char * rtl_tcp_source_c::get_tuner_name(void) > { > - if ( RTLSDR_TUNER_E4000 == tuner_type ) > - return "E4000"; > - else if ( RTLSDR_TUNER_FC0012 == tuner_type ) > - return "FC0012"; > - else if ( RTLSDR_TUNER_FC0013 == tuner_type ) > - return "FC0013"; > - else if ( RTLSDR_TUNER_FC2580 == tuner_type ) > - return "FC2580"; > - else if ( RTLSDR_TUNER_R820T == tuner_type ) > - return "R820T"; > - else if ( RTLSDR_TUNER_R828D == tuner_type ) > - return "R828D"; > - else > - return "Unknown"; > + switch (d_tuner_type) { > + case RTLSDR_TUNER_E4000: return "E4000"; > + case RTLSDR_TUNER_FC0012: return "FC0012"; > + case RTLSDR_TUNER_FC0013: return "FC0013"; > + case RTLSDR_TUNER_FC2580: return "FC2580"; > + case RTLSDR_TUNER_R820T: return "R820T"; > + case RTLSDR_TUNER_R828D: return "R828D"; > + default: return "Unknown"; > + } > } > > rtl_tcp_source_c_sptr make_rtl_tcp_source_c(const std::string &args) > @@ -59,9 +142,10 @@ rtl_tcp_source_c_sptr make_rtl_tcp_source_c(const > std::string &args) > } > > rtl_tcp_source_c::rtl_tcp_source_c(const std::string &args) : > - gr::hier_block2("rtl_tcp_source_c", > + gr::sync_block("rtl_tcp_source_c", > gr::io_signature::make(0, 0, 0), > gr::io_signature::make(1, 1, sizeof (gr_complex))), > + d_socket(-1), > _no_tuner(false), > _auto_gain(false), > _if_gain(0) > @@ -107,43 +191,162 @@ rtl_tcp_source_c::rtl_tcp_source_c(const > std::string &args) : > if (payload_size <= 0) > payload_size = 16384; > > - _src = make_rtl_tcp_source_f(sizeof(float), host.c_str(), port, > payload_size); > +#if defined(USING_WINSOCK) // for Windows (with MinGW) > + // initialize winsock DLL > + WSADATA wsaData; > + int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); > + if( iResult != NO_ERROR ) { > + report_error( "rtl_tcp_source_f WSAStartup", "can't open socket" ); > + } > +#endif > > - if ( _src->get_tuner_type() != RTLSDR_TUNER_UNKNOWN ) > - { > + // Set up the address stucture for the source address and port numbers > + // Get the source IP address from the host name > + struct addrinfo *ip_src; // store the source IP address to use > + struct addrinfo hints; > + memset( (void*)&hints, 0, sizeof(hints) ); > + hints.ai_family = AF_UNSPEC; > + hints.ai_socktype = SOCK_STREAM; > + hints.ai_protocol = IPPROTO_TCP; > + hints.ai_flags = AI_PASSIVE; > + char port_str[12]; > + sprintf( port_str, "%d", port ); > + > + // FIXME leaks if report_error throws below > + int ret = getaddrinfo(host.c_str(), port_str, &hints, &ip_src); > + if (ret != 0) > + report_error("rtl_tcp_source_f/getaddrinfo", > + "can't initialize source socket" ); > + > + // FIXME leaks if report_error throws below > + d_temp_buff = new unsigned char[payload_size]; // allow it to hold up > to payload_size bytes > + d_LUT = new float[0x100]; > + for (int i = 0; i < 0x100; ++i) > + d_LUT[i] = (((float)(i & 0xff)) - 127.4f) * (1.0f / 128.0f); > + > + // create socket > + d_socket = socket(ip_src->ai_family, ip_src->ai_socktype, > + ip_src->ai_protocol); > + if (d_socket == -1) > + report_error("socket open","can't open socket"); > + > + // Turn on reuse address > + int opt_val = 1; > + if (setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, (optval_t)&opt_val, > sizeof(int)) == -1) > + report_error("SO_REUSEADDR","can't set socket option SO_REUSEADDR"); > + > + // Don't wait when shutting down > + linger lngr; > + lngr.l_onoff = 1; > + lngr.l_linger = 0; > + if (setsockopt(d_socket, SOL_SOCKET, SO_LINGER, (optval_t)&lngr, > sizeof(linger)) == -1) > + if (!is_error(ENOPROTOOPT)) // no SO_LINGER for SOCK_DGRAM on Windows > + report_error("SO_LINGER","can't set socket option SO_LINGER"); > + > +#if USE_RCV_TIMEO > + // Set a timeout on the receive function to not block indefinitely > + // This value can (and probably should) be changed > + // Ignored on Cygwin > +#if defined(USING_WINSOCK) > + DWORD timeout = 1000; // milliseconds > +#else > + timeval timeout; > + timeout.tv_sec = 1; > + timeout.tv_usec = 0; > +#endif > + if (setsockopt(d_socket, SOL_SOCKET, SO_RCVTIMEO, (optval_t)&timeout, > sizeof(timeout)) == -1) > + report_error("SO_RCVTIMEO","can't set socket option SO_RCVTIMEO"); > +#endif // USE_RCV_TIMEO > + > + while (::connect(d_socket, ip_src->ai_addr, ip_src->ai_addrlen) != 0) > + ; // FIXME handle errors? > + freeaddrinfo(ip_src); > + > + int flag = 1; > + setsockopt(d_socket, IPPROTO_TCP, TCP_NODELAY, (char > *)&flag,sizeof(flag)); > + > + dongle_info_t dongle_info; > + ret = recv(d_socket, (char*)&dongle_info, sizeof(dongle_info), 0); > + if (sizeof(dongle_info) != ret) > + fprintf(stderr,"failed to read dongle info\n"); > + > + d_tuner_type = RTLSDR_TUNER_UNKNOWN; > + d_tuner_gain_count = 0; > + d_tuner_if_gain_count = 0; > + > + if (memcmp(dongle_info.magic, "RTL0", 4) == 0) { > + d_tuner_type = rtlsdr_tuner(ntohl(dongle_info.tuner_type)); > + d_tuner_gain_count = ntohl(dongle_info.tuner_gain_count); > + if (RTLSDR_TUNER_E4000 == d_tuner_type) > + d_tuner_if_gain_count = 53; > + } > + > + if (d_tuner_type != RTLSDR_TUNER_UNKNOWN) { > std::cerr << "The RTL TCP server reports a " > - << get_tuner_name( _src->get_tuner_type() ) > + << get_tuner_name() > << " tuner with " > - << _src->get_tuner_gain_count() << " RF and " > - << _src->get_tuner_if_gain_count() << " IF gains." > + << d_tuner_gain_count << " RF and " > + << d_tuner_if_gain_count << " IF gains." > << std::endl; > } > > set_gain_mode(false); /* enable manual gain mode by default */ > > - _src->set_direct_sampling(direct_samp); > - if (direct_samp) { > + // set direct sampling > + struct command cmd = { 0x09, htonl(direct_samp) }; > + send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > + if (direct_samp) > _no_tuner = true; > - } > > - _src->set_offset_tuning(offset_tune); > - > - /* rtl tcp source provides a stream of interleaved IQ floats */ > - gr::blocks::deinterleave::sptr deinterleave = \ > - gr::blocks::deinterleave::make( sizeof(float) ); > + // set offset tuning > + cmd = { 0x0a, htonl(offset_tune) }; > + send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > +} > > - /* block to convert deinterleaved floats to a complex stream */ > - gr::blocks::float_to_complex::sptr f2c = \ > - gr::blocks::float_to_complex::make( 1 ); > +rtl_tcp_source_c::~rtl_tcp_source_c() > +{ > + delete [] d_temp_buff; > + > + if (d_socket != -1) { > + shutdown(d_socket, SHUT_RDWR); > +#if defined(USING_WINSOCK) > + closesocket(d_socket); > +#else > + ::close(d_socket); > +#endif > + d_socket = -1; > + } > > - connect(_src, 0, deinterleave, 0); > - connect(deinterleave, 0, f2c, 0); /* I */ > - connect(deinterleave, 1, f2c, 1); /* Q */ > - connect(f2c, 0, self(), 0); > +#if defined(USING_WINSOCK) // for Windows (with MinGW) > + // free winsock resources > + WSACleanup(); > +#endif > } > > -rtl_tcp_source_c::~rtl_tcp_source_c() > + > +int rtl_tcp_source_c::work(int noutput_items, > + gr_vector_const_void_star &input_items, > + gr_vector_void_star &output_items) > { > + gr_complex *out = (gr_complex *)output_items[0]; > + int bytesleft = noutput_items * BYTES_PER_SAMPLE; > + int index = 0; > + int receivedbytes = 0; > + while (bytesleft > 0) { > + receivedbytes = recv(d_socket, (char*)&d_temp_buff[index], bytesleft, > 0); > + > + if (receivedbytes == -1 && !is_error(EAGAIN)) { > + fprintf(stderr, "socket error\n"); > + return -1; > + } > + bytesleft -= receivedbytes; > + index += receivedbytes; > + } > + > + for (int i = 0; i < noutput_items; i++) > + out[i] = gr_complex(d_LUT[d_temp_buff[i * 2]], d_LUT[d_temp_buff[i * > 2 + 1]]); > + > + return noutput_items; > } > > std::string rtl_tcp_source_c::name() > @@ -193,7 +396,8 @@ osmosdr::meta_range_t rtl_tcp_source_c::get_sample_rates( > void ) > > double rtl_tcp_source_c::set_sample_rate( double rate ) > { > - _src->set_sample_rate( int(rate) ); > + struct command cmd = { 0x02, htonl(rate) }; > + send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > > _rate = rate; > > @@ -214,24 +418,26 @@ osmosdr::freq_range_t rtl_tcp_source_c::get_freq_range( > size_t chan ) > return range; > } > > - enum rtlsdr_tuner tuner = _src->get_tuner_type(); > - > - if ( tuner == RTLSDR_TUNER_E4000 ) { > - /* there is a (temperature dependent) gap between 1100 to 1250 MHz */ > - range += osmosdr::range_t( 52e6, 2.2e9 ); > - } else if ( tuner == RTLSDR_TUNER_FC0012 ) { > + switch (d_tuner_type) { > + case RTLSDR_TUNER_FC0012: > range += osmosdr::range_t( 22e6, 948e6 ); > - } else if ( tuner == RTLSDR_TUNER_FC0013 ) { > + break; > + case RTLSDR_TUNER_FC0013: > range += osmosdr::range_t( 22e6, 1.1e9 ); > - } else if ( tuner == RTLSDR_TUNER_FC2580 ) { > + break; > + case RTLSDR_TUNER_FC2580: > range += osmosdr::range_t( 146e6, 308e6 ); > range += osmosdr::range_t( 438e6, 924e6 ); > - } else if ( tuner == RTLSDR_TUNER_R820T ) { > + break; > + case RTLSDR_TUNER_R820T: > range += osmosdr::range_t( 24e6, 1766e6 ); > - } else if ( tuner == RTLSDR_TUNER_R828D ) { > + break; > + case RTLSDR_TUNER_R828D: > range += osmosdr::range_t( 24e6, 1766e6 ); > - } else { > - range += osmosdr::range_t( 52e6, 2.2e9 ); // assume E4000 tuner > + break; > + default: // assume E4000 tuner > + /* there is a (temperature dependent) gap between 1100 to 1250 MHz */ > + range += osmosdr::range_t( 52e6, 2.2e9 ); > } > > return range; > @@ -239,7 +445,8 @@ osmosdr::freq_range_t rtl_tcp_source_c::get_freq_range( > size_t chan ) > > double rtl_tcp_source_c::set_center_freq( double freq, size_t chan ) > { > - _src->set_freq( int(freq) ); > + struct command cmd = { 0x01, htonl(freq) }; > + send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > > _freq = freq; > > @@ -253,7 +460,8 @@ double rtl_tcp_source_c::get_center_freq( size_t chan > ) > > double rtl_tcp_source_c::set_freq_corr( double ppm, size_t chan ) > { > - _src->set_freq_corr( int(ppm) ); > + struct command cmd = { 0x05, htonl(ppm) }; > + send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > > _corr = ppm; > > @@ -271,9 +479,8 @@ std::vector<std::string> rtl_tcp_source_c::get_gain_names( > size_t chan ) > > names += "LNA"; > > - if ( _src->get_tuner_type() == RTLSDR_TUNER_E4000 ) { > + if (d_tuner_type == RTLSDR_TUNER_E4000) > names += "IF"; > - } > > return names; > } > @@ -301,8 +508,7 @@ osmosdr::gain_range_t rtl_tcp_source_c::get_gain_range( > size_t chan ) > const int *ptr = NULL; > int len = 0; > > - switch (_src->get_tuner_type()) > - { > + switch (d_tuner_type) { > case RTLSDR_TUNER_E4000: > ptr = e4k_gains; len = sizeof(e4k_gains); > break; > @@ -335,11 +541,10 @@ osmosdr::gain_range_t rtl_tcp_source_c::get_gain_range( > size_t chan ) > osmosdr::gain_range_t rtl_tcp_source_c::get_gain_range( const > std::string & name, size_t chan ) > { > if ( "IF" == name ) { > - if ( _src->get_tuner_type() == RTLSDR_TUNER_E4000 ) { > + if (d_tuner_type == RTLSDR_TUNER_E4000) > return osmosdr::gain_range_t(3, 56, 1); > - } else { > + else > return osmosdr::gain_range_t(); > - } > } > > return get_gain_range( chan ); > @@ -347,8 +552,13 @@ osmosdr::gain_range_t rtl_tcp_source_c::get_gain_range( > const std::string & name > > bool rtl_tcp_source_c::set_gain_mode( bool automatic, size_t chan ) > { > - _src->set_gain_mode(int(!automatic)); > - _src->set_agc_mode(automatic); > + // gain mode > + struct command cmd = { 0x03, htonl(!automatic) }; > + send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > + > + // AGC mode > + cmd = { 0x08, htonl(automatic) }; > + send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > > _auto_gain = automatic; > > @@ -364,7 +574,8 @@ double rtl_tcp_source_c::set_gain( double gain, size_t > chan ) > { > osmosdr::gain_range_t gains = rtl_tcp_source_c::get_gain_range( chan ); > > - _src->set_gain( int(gains.clip(gain) * 10.0) ); > + struct command cmd = { 0x04, htonl(int(gains.clip(gain) * 10.0)) }; > + send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > > _gain = gain; > > @@ -396,7 +607,7 @@ double rtl_tcp_source_c::get_gain( const std::string & > name, size_t chan ) > > double rtl_tcp_source_c::set_if_gain(double gain, size_t chan) > { > - if ( _src->get_tuner_type() != RTLSDR_TUNER_E4000 ) { > + if (d_tuner_type != RTLSDR_TUNER_E4000) { > _if_gain = 0; > return _if_gain; > } > @@ -448,7 +659,10 @@ double rtl_tcp_source_c::set_if_gain(double gain, > size_t chan) > std::cerr << " = " << sum << std::endl; > #endif > for (unsigned int stage = 1; stage <= gains.size(); stage++) { > - _src->set_if_gain(stage, int(gains[ stage ] * 10.0)); > + int gain_i = int(gains[stage] * 10.0); > + uint32_t params = stage << 16 | (gain_i & 0xffff); > + struct command cmd = { 0x06, htonl(params) }; > + send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > } > > _if_gain = gain; > diff --git a/lib/rtl_tcp/rtl_tcp_source_c.h b/lib/rtl_tcp/rtl_tcp_source_ > c.h > index 454d1a2..b07e5dd 100644 > --- a/lib/rtl_tcp/rtl_tcp_source_c.h > +++ b/lib/rtl_tcp/rtl_tcp_source_c.h > @@ -1,4 +1,4 @@ > -/* -*- c++ -*- */ > +/* -*- mode: c++; c-basic-offset: 2 -*- */ > /* > * Copyright 2012 Dimitri Stolnikov <horiz0n at gmx.net> > * > @@ -20,12 +20,10 @@ > #ifndef RTL_TCP_SOURCE_C_H > #define RTL_TCP_SOURCE_C_H > > -#include <gnuradio/hier_block2.h> > +#include <gnuradio/sync_block.h> > > #include "source_iface.h" > > -#include "rtl_tcp_source_f.h" > - > class rtl_tcp_source_c; > > typedef boost::shared_ptr< rtl_tcp_source_c > rtl_tcp_source_c_sptr; > @@ -33,17 +31,33 @@ typedef boost::shared_ptr< rtl_tcp_source_c > > rtl_tcp_source_c_sptr; > rtl_tcp_source_c_sptr make_rtl_tcp_source_c( const std::string & args = > "" ); > > class rtl_tcp_source_c : > - public gr::hier_block2, > + public gr::sync_block, > public source_iface > { > private: > + /* copied from rtl sdr */ > + enum rtlsdr_tuner { > + RTLSDR_TUNER_UNKNOWN = 0, > + RTLSDR_TUNER_E4000, > + RTLSDR_TUNER_FC0012, > + RTLSDR_TUNER_FC0013, > + RTLSDR_TUNER_FC2580, > + RTLSDR_TUNER_R820T, > + RTLSDR_TUNER_R828D > + }; > + > friend rtl_tcp_source_c_sptr make_rtl_tcp_source_c(const std::string > &args); > > rtl_tcp_source_c(const std::string &args); > + const char * get_tuner_name(void); > > public: > ~rtl_tcp_source_c(); > > + int work(int noutput_items, > + gr_vector_const_void_star &input_items, > + gr_vector_void_star &output_items); > + > std::string name(); > > static std::vector< std::string > get_devices( bool fake = false ); > @@ -77,11 +91,17 @@ public: > std::string get_antenna( size_t chan = 0 ); > > private: > + int d_socket; // handle to socket > double _freq, _rate, _gain, _corr; > bool _no_tuner; > bool _auto_gain; > double _if_gain; > - rtl_tcp_source_f_sptr _src; > + > + enum rtlsdr_tuner d_tuner_type; > + unsigned int d_tuner_gain_count; > + unsigned int d_tuner_if_gain_count; > + unsigned char *d_temp_buff; // hold buffer between calls > + float *d_LUT; > }; > > #endif // RTL_TCP_SOURCE_C_H > diff --git a/lib/rtl_tcp/rtl_tcp_source_f.cc b/lib/rtl_tcp/rtl_tcp_source_ > f.cc > deleted file mode 100644 > index a17594c..0000000 > --- a/lib/rtl_tcp/rtl_tcp_source_f.cc > +++ /dev/null > @@ -1,327 +0,0 @@ > -/* -*- c++ -*- */ > -/* > - * Copyright 2012 Hoernchen <la at tfc-server.de> > - * Copyright 2012 Dimitri Stolnikov <horiz0n at gmx.net> > - * > - * 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. > - */ > -//#define HAVE_WINDOWS_H > - > - > -#include <rtl_tcp_source_f.h> > -#include <gnuradio/io_signature.h> > -#include <stdexcept> > -#include <errno.h> > -#include <stdio.h> > -#include <string.h> > - > -#ifndef _WIN32 > -#include <netinet/in.h> > -#else > -#include <WinSock2.h> > -#endif > - > -/* copied from rtl sdr code */ > -typedef struct { /* structure size must be multiple of 2 bytes */ > - char magic[4]; > - uint32_t tuner_type; > - uint32_t tuner_gain_count; > -} dongle_info_t; > - > -#define USE_SELECT 1 // non-blocking receive on all platforms > -#define USE_RCV_TIMEO 0 // non-blocking receive on all but Cygwin > -#define SRC_VERBOSE 0 > -#define SNK_VERBOSE 0 > - > -static int is_error( int perr ) > -{ > - // Compare error to posix error code; return nonzero if match. > -#if defined(USING_WINSOCK) > -#define ENOPROTOOPT 109 > - // All codes to be checked for must be defined below > - int werr = WSAGetLastError(); > - switch( werr ) { > - case WSAETIMEDOUT: > - return( perr == EAGAIN ); > - case WSAENOPROTOOPT: > - return( perr == ENOPROTOOPT ); > - default: > - fprintf(stderr,"rtl_tcp_source_f: unknown error %d WS err %d \n", > perr, werr ); > - throw std::runtime_error("internal error"); > - } > - return 0; > -#else > - return( perr == errno ); > -#endif > -} > - > -static void report_error( const char *msg1, const char *msg2 ) > -{ > - // Deal with errors, both posix and winsock > -#if defined(USING_WINSOCK) > - int werr = WSAGetLastError(); > - fprintf(stderr, "%s: winsock error %d\n", msg1, werr ); > -#else > - perror(msg1); > -#endif > - if( msg2 != NULL ) > - throw std::runtime_error(msg2); > - return; > -} > - > -rtl_tcp_source_f::rtl_tcp_source_f(size_t itemsize, > - const char *host, > - unsigned short port, > - int payload_size, > - bool eof, > - bool wait) > - : gr::sync_block ("rtl_tcp_source_f", > - gr::io_signature::make(0, 0, 0), > - gr::io_signature::make(1, 1, sizeof(float))), > - d_itemsize(itemsize), > - d_payload_size(payload_size), > - d_eof(eof), > - d_wait(wait), > - d_socket(-1), > - d_temp_offset(0) > -{ > - int ret = 0; > -#if defined(USING_WINSOCK) // for Windows (with MinGW) > - // initialize winsock DLL > - WSADATA wsaData; > - int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); > - if( iResult != NO_ERROR ) { > - report_error( "rtl_tcp_source_f WSAStartup", "can't open socket" ); > - } > -#endif > - > - // Set up the address stucture for the source address and port numbers > - // Get the source IP address from the host name > - struct addrinfo *ip_src; // store the source IP address to use > - struct addrinfo hints; > - memset( (void*)&hints, 0, sizeof(hints) ); > - hints.ai_family = AF_UNSPEC; > - hints.ai_socktype = SOCK_STREAM; > - hints.ai_protocol = IPPROTO_TCP; > - hints.ai_flags = AI_PASSIVE; > - char port_str[12]; > - sprintf( port_str, "%d", port ); > - > - // FIXME leaks if report_error throws below > - ret = getaddrinfo( host, port_str, &hints, &ip_src ); > - if( ret != 0 ) > - report_error("rtl_tcp_source_f/getaddrinfo", > - "can't initialize source socket" ); > - > - // FIXME leaks if report_error throws below > - d_temp_buff = new unsigned char[d_payload_size]; // allow it to hold > up to payload_size bytes > - d_LUT= new float[0xff+1]; > - for(int i=0; i <=(0xff);++i){ > - d_LUT[i] = (((float)(i&0xff))-127.4f)*(1.0f/128.0f); > - } > - // create socket > - d_socket = socket(ip_src->ai_family, ip_src->ai_socktype, > - ip_src->ai_protocol); > - if(d_socket == -1) { > - report_error("socket open","can't open socket"); > - } > - > - // Turn on reuse address > - int opt_val = 1; > - if(setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, (optval_t)&opt_val, > sizeof(int)) == -1) { > - report_error("SO_REUSEADDR","can't set socket option SO_REUSEADDR"); > - } > - > - // Don't wait when shutting down > - linger lngr; > - lngr.l_onoff = 1; > - lngr.l_linger = 0; > - if(setsockopt(d_socket, SOL_SOCKET, SO_LINGER, (optval_t)&lngr, > sizeof(linger)) == -1) { > - if( !is_error(ENOPROTOOPT) ) { // no SO_LINGER for SOCK_DGRAM on > Windows > - report_error("SO_LINGER","can't set socket option SO_LINGER"); > - } > - } > - > -#if USE_RCV_TIMEO > - // Set a timeout on the receive function to not block indefinitely > - // This value can (and probably should) be changed > - // Ignored on Cygwin > -#if defined(USING_WINSOCK) > - DWORD timeout = 1000; // milliseconds > -#else > - timeval timeout; > - timeout.tv_sec = 1; > - timeout.tv_usec = 0; > -#endif > - if(setsockopt(d_socket, SOL_SOCKET, SO_RCVTIMEO, (optval_t)&timeout, > sizeof(timeout)) == -1) { > - report_error("SO_RCVTIMEO","can't set socket option SO_RCVTIMEO"); > - } > -#endif // USE_RCV_TIMEO > - > - while(connect(d_socket, ip_src->ai_addr, ip_src->ai_addrlen) != 0); > - freeaddrinfo(ip_src); > - > - int flag = 1; > - setsockopt(d_socket, IPPROTO_TCP, TCP_NODELAY, (char > *)&flag,sizeof(flag)); > - > - dongle_info_t dongle_info; > - ret = recv(d_socket, (char*)&dongle_info, sizeof(dongle_info), 0); > - if (sizeof(dongle_info) != ret) > - fprintf(stderr,"failed to read dongle info\n"); > - > - d_tuner_type = RTLSDR_TUNER_UNKNOWN; > - d_tuner_gain_count = 0; > - d_tuner_if_gain_count = 0; > - > - if (memcmp(dongle_info.magic, "RTL0", 4) == 0) > - { > - d_tuner_type = ntohl(dongle_info.tuner_type); > - d_tuner_gain_count = ntohl(dongle_info.tuner_gain_count); > - if ( RTLSDR_TUNER_E4000 == d_tuner_type ) > - d_tuner_if_gain_count = 53; > - } > -} > - > -rtl_tcp_source_f_sptr make_rtl_tcp_source_f (size_t itemsize, > - const char *ipaddr, > - unsigned short port, > - int payload_size, > - bool eof, > - bool wait) > -{ > - return gnuradio::get_initial_sptr(new rtl_tcp_source_f ( > - itemsize, > - ipaddr, > - port, > - payload_size, > - eof, > - wait)); > -} > - > -rtl_tcp_source_f::~rtl_tcp_source_f () > -{ > - delete [] d_temp_buff; > - > - if (d_socket != -1){ > - shutdown(d_socket, SHUT_RDWR); > -#if defined(USING_WINSOCK) > - closesocket(d_socket); > -#else > - ::close(d_socket); > -#endif > - d_socket = -1; > - } > - > -#if defined(USING_WINSOCK) // for Windows (with MinGW) > - // free winsock resources > - WSACleanup(); > -#endif > -} > - > -int rtl_tcp_source_f::work (int noutput_items, > - gr_vector_const_void_star &input_items, > - gr_vector_void_star &output_items) > -{ > - float *out = (float *) output_items[0]; > - ssize_t r = 0; > - > - int bytesleft = noutput_items; > - int index = 0; > - int receivedbytes = 0; > - while(bytesleft > 0) { > - receivedbytes = recv(d_socket, (char*)&d_temp_buff[index], bytesleft, > 0); > - > - if(receivedbytes == -1 && !is_error(EAGAIN)){ > - fprintf(stderr, "socket error\n"); > - return -1; > - } > - bytesleft -= receivedbytes; > - index += receivedbytes; > - } > - r = noutput_items; > - > - for(int i=0; i<r; ++i) > - out[i]=d_LUT[*(d_temp_buff+d_temp_offset+i)]; > - > - return r; > -} > - > -#ifdef _WIN32 > -#define __attribute__(x) > -#pragma pack(push, 1) > -#endif > -struct command{ > - unsigned char cmd; > - unsigned int param; > -}__attribute__((packed)); > -#ifdef _WIN32 > -#pragma pack(pop) > -#endif > - > -void rtl_tcp_source_f::set_freq(int freq) > -{ > - struct command cmd = { 0x01, htonl(freq) }; > - send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > -} > - > -void rtl_tcp_source_f::set_sample_rate(int sample_rate) > -{ > - struct command cmd = { 0x02, htonl(sample_rate) }; > - send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > -} > - > -void rtl_tcp_source_f::set_gain_mode(int manual) > -{ > - struct command cmd = { 0x03, htonl(manual) }; > - send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > -} > - > -void rtl_tcp_source_f::set_gain(int gain) > -{ > - struct command cmd = { 0x04, htonl(gain) }; > - send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > -} > - > -void rtl_tcp_source_f::set_freq_corr(int ppm) > -{ > - struct command cmd = { 0x05, htonl(ppm) }; > - send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > -} > - > -void rtl_tcp_source_f::set_if_gain(int stage, int gain) > -{ > - uint32_t params = stage << 16 | (gain & 0xffff); > - struct command cmd = { 0x06, htonl(params) }; > - send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > -} > - > -void rtl_tcp_source_f::set_agc_mode(int on) > -{ > - struct command cmd = { 0x08, htonl(on) }; > - send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > -} > - > -void rtl_tcp_source_f::set_direct_sampling(int on) > -{ > - struct command cmd = { 0x09, htonl(on) }; > - send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > -} > - > -void rtl_tcp_source_f::set_offset_tuning(int on) > -{ > - struct command cmd = { 0x0a, htonl(on) }; > - send(d_socket, (const char*)&cmd, sizeof(cmd), 0); > -} > diff --git a/lib/rtl_tcp/rtl_tcp_source_f.h b/lib/rtl_tcp/rtl_tcp_source_ > f.h > deleted file mode 100644 > index 84ac57a..0000000 > --- a/lib/rtl_tcp/rtl_tcp_source_f.h > +++ /dev/null > @@ -1,125 +0,0 @@ > -/* -*- c++ -*- */ > -/* > - * Copyright 2012 Hoernchen <la at tfc-server.de> > - * > - * 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 RTL_TCP_SOURCE_F_H > -#define RTL_TCP_SOURCE_F_H > - > -#include <gnuradio/sync_block.h> > -#include <gnuradio/thread/thread.h> > - > -#if defined(_WIN32) > -// if not posix, assume winsock > -#pragma comment(lib, "ws2_32.lib") > -#define USING_WINSOCK > -#include <winsock2.h> > -#include <ws2tcpip.h> > -#define SHUT_RDWR 2 > -typedef char* optval_t; > -#else > -#include <netdb.h> > -#include <sys/types.h> > -#include <sys/socket.h> > -#include <netinet/in.h> > -#include <netinet/tcp.h> > -#include <arpa/inet.h> > -typedef void* optval_t; > -#endif > - > -#ifdef _MSC_VER > -#include <cstddef> > -typedef ptrdiff_t ssize_t; > -#endif //_MSC_VER > - > -/* copied from rtl sdr */ > -enum rtlsdr_tuner { > - RTLSDR_TUNER_UNKNOWN = 0, > - RTLSDR_TUNER_E4000, > - RTLSDR_TUNER_FC0012, > - RTLSDR_TUNER_FC0013, > - RTLSDR_TUNER_FC2580, > - RTLSDR_TUNER_R820T, > - RTLSDR_TUNER_R828D > -}; > - > -class rtl_tcp_source_f; > -typedef boost::shared_ptr<rtl_tcp_source_f> rtl_tcp_source_f_sptr; > - > -rtl_tcp_source_f_sptr make_rtl_tcp_source_f ( > - size_t itemsize, > - const char *host, > - unsigned short port, > - int payload_size, > - bool eof = false, > - bool wait = false); > - > -class rtl_tcp_source_f : public gr::sync_block > -{ > -private: > - size_t d_itemsize; > - int d_payload_size; // maximum transmission unit (packet > length) > - bool d_eof; // zero-length packet is EOF > - bool d_wait; // wait if data if not immediately > available > - int d_socket; // handle to socket > - unsigned char *d_temp_buff; // hold buffer between calls > - size_t d_temp_offset; // point to temp buffer location offset > - float *d_LUT; > - > - unsigned int d_tuner_type; > - unsigned int d_tuner_gain_count; > - unsigned int d_tuner_if_gain_count; > - > -private: > - rtl_tcp_source_f(size_t itemsize, const char *host, > - unsigned short port, int payload_size, bool eof, bool > wait); > - > - // The friend declaration allows make_source_c to > - // access the private constructor. > - friend rtl_tcp_source_f_sptr make_rtl_tcp_source_f ( > - size_t itemsize, > - const char *host, > - unsigned short port, > - int payload_size, > - bool eof, > - bool wait); > - > -public: > - ~rtl_tcp_source_f(); > - > - enum rtlsdr_tuner get_tuner_type() { return (enum rtlsdr_tuner) > d_tuner_type; } > - unsigned int get_tuner_gain_count() { return d_tuner_gain_count; } > - unsigned int get_tuner_if_gain_count() { return d_tuner_if_gain_count; } > - > - int work(int noutput_items, > - gr_vector_const_void_star &input_items, > - gr_vector_void_star &output_items); > - > - void set_freq(int freq); > - void set_sample_rate(int sample_rate); > - void set_gain_mode(int manual); > - void set_gain(int gain); > - void set_freq_corr(int ppm); > - void set_if_gain(int stage, int gain); > - void set_agc_mode(int on); > - void set_direct_sampling(int on); > - void set_offset_tuning(int on); > -}; > - > - > -#endif /* RTL_TCP_SOURCE_F_H */ > > > ------------------------------ > > Subject: Digest Footer > > _______________________________________________ > osmocom-sdr mailing list > osmocom-sdr at lists.osmocom.org > https://lists.osmocom.org/mailman/listinfo/osmocom-sdr > > > ------------------------------ > > End of osmocom-sdr Digest, Vol 21, Issue 2 > ****************************************** > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/osmocom-sdr/attachments/20160824/ad35ead1/attachment.htm>