aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fcd
diff options
context:
space:
mode:
authorDimitri Stolnikov <horiz0n@gmx.net>2012-04-26 19:18:21 +0200
committerDimitri Stolnikov <horiz0n@gmx.net>2012-04-26 19:18:21 +0200
commit414b1b1331bd803bc0ced680220f6ff3d22e666c (patch)
tree874ffc11333d78e20da0ae2f429f659bf280ba13 /lib/fcd
parentd5589e8e1d5bca6960f5385830698a5b05210ce8 (diff)
fcd: add initial component files
Diffstat (limited to 'lib/fcd')
-rw-r--r--lib/fcd/CMakeLists.txt35
-rw-r--r--lib/fcd/fcd_source.cc226
-rw-r--r--lib/fcd/fcd_source.h82
3 files changed, 343 insertions, 0 deletions
diff --git a/lib/fcd/CMakeLists.txt b/lib/fcd/CMakeLists.txt
new file mode 100644
index 0000000..5d7d0c9
--- /dev/null
+++ b/lib/fcd/CMakeLists.txt
@@ -0,0 +1,35 @@
+# 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(APPEND ${CMAKE_CURRENT_SOURCE_DIR})
+
+set(fcd_srcs
+ ${CMAKE_CURRENT_SOURCE_DIR}/fcd_source.cc
+)
+
+########################################################################
+# Append gnuradio-osmosdr library sources
+########################################################################
+list(APPEND gr_osmosdr_srcs ${fcd_srcs})
+list(APPEND gr_osmosdr_libs ${GNURADIO_FCD_LIBRARIES})
+
diff --git a/lib/fcd/fcd_source.cc b/lib/fcd/fcd_source.cc
new file mode 100644
index 0000000..b7b268b
--- /dev/null
+++ b/lib/fcd/fcd_source.cc
@@ -0,0 +1,226 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Dimitri Stolnikov <horiz0n@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.
+ */
+
+#include <fstream>
+#include <string>
+#include <sstream>
+
+#include <boost/assign.hpp>
+
+#include <gr_io_signature.h>
+
+#include <fcd_source.h>
+
+using namespace boost::assign;
+
+fcd_source_sptr make_fcd_source(const std::string &args)
+{
+ return gnuradio::get_initial_sptr(new fcd_source(args));
+}
+
+fcd_source::fcd_source(const std::string &args) :
+ gr_hier_block2("fcd_source",
+ gr_make_io_signature (0, 0, 0),
+ gr_make_io_signature (1, 1, sizeof (gr_complex)))
+{
+ std::string device_name = args;
+
+ if ( device_name.empty() )
+ {
+ std::vector< std::string > devices = fcd_source::get_devices();
+
+ if ( devices.size() )
+ device_name = devices.front(); // pick first available device
+ else
+ throw std::runtime_error("no FUNcube Dongle device found");
+ }
+
+ _src = fcd_make_source_c( device_name );
+
+ connect( _src, 0, self(), 0 );
+}
+
+fcd_source::~fcd_source()
+{
+}
+
+std::vector< std::string > fcd_source::get_devices()
+{
+ std::vector< std::string > devices;
+
+ std::string line;
+ std::ifstream cards( "/proc/asound/cards" );
+ if ( cards.is_open() )
+ {
+ while ( cards.good() )
+ {
+ getline (cards, line);
+
+ if ( line.find( "USB-Audio - FUNcube Dongle" ) != std::string::npos )
+ {
+ int id;
+ std::istringstream( line ) >> id;
+
+ std::ostringstream hw_id;
+ hw_id << "hw:" << id; // build alsa identifier
+
+ devices += hw_id.str();
+ }
+ }
+
+ cards.close();
+ }
+
+ return devices;
+}
+
+gr_basic_block_sptr fcd_source::self()
+{
+ return gr_hier_block2::self();
+}
+
+std::string fcd_source::name()
+{
+ return "FUNcube Dongle";
+}
+
+size_t fcd_source::get_num_channels( void )
+{
+ return 1;
+}
+
+osmosdr::meta_range_t fcd_source::get_sample_rates( void )
+{
+ osmosdr::meta_range_t range;
+
+ range += osmosdr::range_t( get_sample_rate() );
+
+ return range;
+}
+
+double fcd_source::set_sample_rate( double rate )
+{
+ return get_sample_rate();
+}
+
+double fcd_source::get_sample_rate( void )
+{
+ return 96e3;
+}
+
+osmosdr::freq_range_t fcd_source::get_freq_range( size_t chan )
+{
+ osmosdr::freq_range_t range(50e6, 2.2e9);
+
+ return range;
+}
+
+double fcd_source::set_center_freq( double freq, size_t chan )
+{
+ _src->set_freq(float(freq));
+
+ _freq = freq;
+
+ return get_center_freq(chan);
+}
+
+double fcd_source::get_center_freq( size_t chan )
+{
+ return _freq;
+}
+
+double fcd_source::set_freq_corr( double ppm, size_t chan )
+{
+ _src->set_freq_corr( ppm );
+
+ _correct = ppm;
+
+ return get_freq_corr( chan );
+}
+
+double fcd_source::get_freq_corr( size_t chan )
+{
+ return _correct;
+}
+
+std::vector<std::string> fcd_source::get_gain_names( size_t chan )
+{
+ std::vector< std::string > names;
+
+ names += "LNA", "MIXER";
+
+ return names;
+}
+
+osmosdr::gain_range_t fcd_source::get_gain_range( size_t chan )
+{
+ osmosdr::gain_range_t range(-5, 30, 2.5);
+
+ return range;
+}
+
+osmosdr::gain_range_t fcd_source::get_gain_range( const std::string & name, size_t chan )
+{
+ return get_gain_range( chan );
+}
+
+double fcd_source::set_gain( double gain, size_t chan )
+{
+ _src->set_lna_gain(gain);
+
+ _gain = gain;
+
+ return get_gain(chan);
+}
+
+double fcd_source::set_gain( double gain, const std::string & name, size_t chan )
+{
+ return set_gain(chan);
+}
+
+double fcd_source::get_gain( size_t chan )
+{
+ return _gain;
+}
+
+double fcd_source::get_gain( const std::string & name, size_t chan )
+{
+ return get_gain(chan);
+}
+
+std::vector< std::string > fcd_source::get_antennas( size_t chan )
+{
+ std::vector< std::string > antennas;
+
+ antennas += get_antenna(chan);
+
+ return antennas;
+}
+
+std::string fcd_source::set_antenna( const std::string & antenna, size_t chan )
+{
+ return get_antenna(chan);
+}
+
+std::string fcd_source::get_antenna( size_t chan )
+{
+ return "ANT";
+}
+
diff --git a/lib/fcd/fcd_source.h b/lib/fcd/fcd_source.h
new file mode 100644
index 0000000..1cd34b3
--- /dev/null
+++ b/lib/fcd/fcd_source.h
@@ -0,0 +1,82 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Dimitri Stolnikov <horiz0n@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.
+ */
+#ifndef FCD_SOURCE_H
+#define FCD_SOURCE_H
+
+#include <gr_hier_block2.h>
+
+#include <fcd_source_c.h>
+
+#include "osmosdr_src_iface.h"
+
+class fcd_source;
+
+typedef boost::shared_ptr< fcd_source > fcd_source_sptr;
+
+fcd_source_sptr make_fcd_source( const std::string & args = "" );
+
+class fcd_source : public gr_hier_block2,
+ public osmosdr_src_iface
+{
+private:
+ friend fcd_source_sptr make_fcd_source(const std::string &args);
+
+ fcd_source(const std::string &args);
+
+public:
+ ~fcd_source();
+
+ static std::vector< std::string > get_devices();
+
+ gr_basic_block_sptr self();
+
+ std::string name();
+
+ 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<std::string> 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:
+ fcd_source_c_sptr _src;
+ double _gain, _freq;
+ int32_t _correct;
+};
+
+#endif // FCD_SOURCE_H