diff options
author | Tom Rondeau | 2012-04-04 22:08:10 -0400 |
---|---|---|
committer | Tom Rondeau | 2012-04-04 22:08:10 -0400 |
commit | a66a650a1f39118500434bc9c91b2ade24887149 (patch) | |
tree | b90b341e42a776432053a54740ca7ce9e7e945e6 | |
parent | fd52df0f706195d937e287189024f8aa6fbeaf60 (diff) | |
parent | b711a8683c8c4578c7a4ff0f3664f1321da1dcad (diff) | |
download | gnuradio-a66a650a1f39118500434bc9c91b2ade24887149.tar.gz gnuradio-a66a650a1f39118500434bc9c91b2ade24887149.tar.bz2 gnuradio-a66a650a1f39118500434bc9c91b2ade24887149.zip |
Merge branch 'master' of gnuradio.org:gnuradio
-rw-r--r-- | config/grc_gr_fcd.m4 | 2 | ||||
-rw-r--r-- | gr-fcd/grc/fcd_source_c.xml | 15 | ||||
-rw-r--r-- | gr-fcd/include/fcd/fcd_source_c.h | 47 | ||||
-rw-r--r-- | gr-fcd/lib/CMakeLists.txt | 2 | ||||
-rw-r--r-- | gr-fcd/lib/Makefile.am | 4 | ||||
-rw-r--r-- | gr-fcd/lib/fcd_source_c.cc | 236 | ||||
-rw-r--r-- | gr-fcd/lib/fcd_source_c_impl.cc | 238 | ||||
-rw-r--r-- | gr-fcd/lib/fcd_source_c_impl.h | 50 | ||||
-rw-r--r-- | gr-fcd/swig/CMakeLists.txt | 3 | ||||
-rw-r--r-- | gr-fcd/swig/Makefile.am | 3 | ||||
-rw-r--r-- | gr-fcd/swig/fcd_source_c.i | 21 | ||||
-rw-r--r-- | gr-fcd/swig/fcd_swig.i | 10 | ||||
-rwxr-xr-x | gr-uhd/apps/uhd_fft.py | 26 | ||||
-rwxr-xr-x | gr-uhd/apps/uhd_siggen.py | 26 | ||||
-rwxr-xr-x | gr-uhd/apps/uhd_siggen_gui.py | 6 | ||||
-rw-r--r-- | gr-uhd/include/gr_uhd_usrp_sink.h | 19 | ||||
-rw-r--r-- | gr-uhd/include/gr_uhd_usrp_source.h | 16 | ||||
-rw-r--r-- | gr-uhd/lib/gr_uhd_usrp_sink.cc | 12 | ||||
-rw-r--r-- | gr-uhd/lib/gr_uhd_usrp_source.cc | 12 | ||||
-rw-r--r-- | gr-uhd/swig/__init__.py | 2 | ||||
-rw-r--r-- | gr-uhd/swig/uhd_swig.i | 10 | ||||
-rw-r--r-- | gruel/src/include/gruel/pmt.h | 19 | ||||
-rw-r--r-- | gruel/src/lib/pmt/pmt.cc | 14 | ||||
-rw-r--r-- | gruel/src/lib/pmt/pmt_int.h | 9 |
24 files changed, 500 insertions, 302 deletions
diff --git a/config/grc_gr_fcd.m4 b/config/grc_gr_fcd.m4 index 8094e1926..61727168f 100644 --- a/config/grc_gr_fcd.m4 +++ b/config/grc_gr_fcd.m4 @@ -32,7 +32,7 @@ AC_DEFUN([GRC_GR_FCD],[ AC_SUBST(USB_CPPFLAGS) AC_SUBST(USB_LIBS) - FCD_CPPFLAGS="${FCD_CPPFLAGS} -I\${abs_top_srcdir}/gr-fcd/include" + FCD_CPPFLAGS="${FCD_CPPFLAGS} -I\${abs_top_srcdir}/gr-fcd/include/fcd" AC_SUBST(FCD_CPPFLAGS) case "$target" in diff --git a/gr-fcd/grc/fcd_source_c.xml b/gr-fcd/grc/fcd_source_c.xml index 8572e6da1..7c55239aa 100644 --- a/gr-fcd/grc/fcd_source_c.xml +++ b/gr-fcd/grc/fcd_source_c.xml @@ -9,6 +9,9 @@ #if $lna() != 20.0 self.$(id).set_lna_gain($lna) #end if +#if $mixer() != +12.0 +self.$(id).set_mixer_gain($mixer) +#end if #if $ppm() != 115 self.$(id).set_freq_corr($ppm) #end if @@ -22,6 +25,7 @@ self.$(id).set_freq($freq) </make> <callback>set_freq($freq)</callback> <callback>set_lna_gain($lna)</callback> + <callback>set_mixer_gain($mixer)</callback> <callback>set_freq_corr($ppm)</callback> <callback>set_dc_corr($dci,$dcq)</callback> <callback>set_iq_corr($iq_gain,$iq_phase)</callback> @@ -45,6 +49,12 @@ self.$(id).set_freq($freq) <type>real</type> </param> <param> + <name>Mixer Gain (dB)</name> + <key>mixer</key> + <value>+12</value> + <type>real</type> + </param> + <param> <name>Frequency corr. (ppm)</name> <key>ppm</key> <value>-120</value> @@ -94,7 +104,10 @@ To find the device name on Linux type: The LNA gain is a set of discrete values between -5 to 30 dB with 2.5 dB step, but you can \ use any float value and it will be rounded to the nearest valid value. - + +The Mixer gain can be set either to +4 or +12 dB, but you can use any float value \ +and it will be rounded to the nearest valid value. + The FCD block can autmatically apply frequency correction: - For FCD v1.0 you can leave at -120 ppm - For FCD v1.1 with serial number 810 or greater use -12 ppm diff --git a/gr-fcd/include/fcd/fcd_source_c.h b/gr-fcd/include/fcd/fcd_source_c.h index 1649d0862..988925c2e 100644 --- a/gr-fcd/include/fcd/fcd_source_c.h +++ b/gr-fcd/include/fcd/fcd_source_c.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011 Free Software Foundation, Inc. + * Copyright 2011-2012 Free Software Foundation, Inc. * * 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 @@ -23,14 +23,11 @@ #include <fcd_api.h> #include <gr_hier_block2.h> -#include <gr_audio_source.h> class fcd_source_c; - typedef boost::shared_ptr<fcd_source_c> fcd_source_c_sptr; - /*! * \brief Return a shared_ptr to a new instance of fcd_source_c. * @@ -50,12 +47,9 @@ FCD_API fcd_source_c_sptr fcd_make_source_c(const std::string device_name = ""); * interface to work properly. As of early 2011, FCDs still come with firmware * 18b. You can use qthid 2.2 (not 3) to upgrade the firmware: http://qthid.sf.net */ -class FCD_API fcd_source_c : public gr_hier_block2 +class FCD_API fcd_source_c : virtual public gr_hier_block2 { - public: - ~fcd_source_c(); - /*! \brief Set frequency with Hz resolution. * \param freq The frequency in Hz * @@ -64,7 +58,7 @@ public: * * \see set_freq_khz() */ - void set_freq(int freq); + virtual void set_freq(int freq) = 0; /*! \brief Set frequency with Hz resolution. * \param freq The frequency in Hz @@ -74,7 +68,7 @@ public: * * \see set_freq_khz() */ - void set_freq(float freq); + virtual void set_freq(float freq) = 0; /*! \brief Set frequency with kHz resolution. * \param freq The frequency in kHz @@ -84,7 +78,7 @@ public: * * \see set_freq() */ - void set_freq_khz(int freq); + virtual void set_freq_khz(int freq) = 0; /*! \brief Set LNA gain. * \param gain The new gain in dB. @@ -94,10 +88,20 @@ public: * 2.5 dB steps, you can can call this method with any float value * and it will be rounded to the nearest valid value. * - * By default the FCD is set to 20 dB and this is a good value for most - * cases. In noisy areas you may try to reduce the gain. + * By default the LNA gain is set to 20 dB and this is a good value for + * most cases. In noisy areas you may try to reduce the gain. */ - void set_lna_gain(float gain); + virtual void set_lna_gain(float gain) = 0; + + /*! \brief Set mixer gain. + * \param gain The new gain in dB. + * + * Set the mixer gain in the FCD. Valid values are +4 and +12 dB. + * + * By default the mixer gain is set to +12 dB and this is a good value for + * most cases. In noisy areas you may try to reduce the gain. + */ + virtual void set_mixer_gain(float gain) = 0; /*! \brief Set new frequency correction. * \param ppm The new frequency correction in parts per million @@ -107,7 +111,7 @@ public: * * Ref: http://www.funcubedongle.com/?p=617 */ - void set_freq_corr(int ppm); + virtual void set_freq_corr(int ppm) = 0; /*! \brief Set DC offset correction. * \param _dci DC correction for I component (-1.0 to 1.0) @@ -115,7 +119,7 @@ public: * * Set DC offset correction in the device. Default is 0.0. */ - void set_dc_corr(double _dci, double _dcq); + virtual void set_dc_corr(double _dci, double _dcq) = 0; /*! \brief Set IQ phase and gain balance. * \param _gain The gain correction (-1.0 to 1.0) @@ -124,16 +128,7 @@ public: * Set IQ phase and gain balance in the device. The default values * are 0.0 for phase and 1.0 for gain. */ - void set_iq_corr(double _gain, double _phase); - -private: - fcd_source_c(const std::string device_name = ""); - friend FCD_API fcd_source_c_sptr - fcd_make_source_c(const std::string device_name); - - audio_source::sptr fcd; /*!< The audio input source */ - int d_freq_corr; /*!< The frequency correction in ppm */ - int d_freq_req; /*!< The latest requested frequency in Hz */ + virtual void set_iq_corr(double _gain, double _phase) = 0; }; #endif /* INCLUDED_FCD_SOURCE_C_H */ diff --git a/gr-fcd/lib/CMakeLists.txt b/gr-fcd/lib/CMakeLists.txt index 0e1f2aa01..cfca8b81b 100644 --- a/gr-fcd/lib/CMakeLists.txt +++ b/gr-fcd/lib/CMakeLists.txt @@ -39,7 +39,7 @@ link_directories(${Boost_LIBRARY_DIRS}) # Setup library ######################################################################## list(APPEND gr_fcd_sources - fcd_source_c.cc + fcd_source_c_impl.cc ) list(APPEND fcd_libs diff --git a/gr-fcd/lib/Makefile.am b/gr-fcd/lib/Makefile.am index 30e9f0283..a288740b4 100644 --- a/gr-fcd/lib/Makefile.am +++ b/gr-fcd/lib/Makefile.am @@ -32,7 +32,9 @@ AM_CPPFLAGS = \ lib_LTLIBRARIES = libgnuradio-fcd.la -libgnuradio_fcd_la_SOURCES = fcd_source_c.cc +libgnuradio_fcd_la_SOURCES = fcd_source_c_impl.cc + +noinst_HEADERS = fcd_source_c_impl.h libgnuradio_fcd_la_LIBADD = \ $(GNURADIO_CORE_LA) \ diff --git a/gr-fcd/lib/fcd_source_c.cc b/gr-fcd/lib/fcd_source_c.cc deleted file mode 100644 index 75bdd3162..000000000 --- a/gr-fcd/lib/fcd_source_c.cc +++ /dev/null @@ -1,236 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2011 Free Software Foundation, Inc. - * - * 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. - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - - -#include <fcd_source_c.h> -#include <fcd.h> -#include <fcdhidcmd.h> // needed for extended API -#include <gr_io_signature.h> -#include <gr_audio_source.h> -#include <gr_float_to_complex.h> -#include <gruel/attributes.h> - -//#include <iostream> -//using namespace std; - -/* - * Create a new instance of fcd_source_c and return - * a boost shared_ptr. This is effectively the public constructor. - */ -fcd_source_c_sptr fcd_make_source_c(const std::string device_name) -{ - return gnuradio::get_initial_sptr(new fcd_source_c(device_name)); -} - - -static const int MIN_IN = 0; /*!< Mininum number of input streams. */ -static const int MAX_IN = 0; /*!< Maximum number of input streams. */ -static const int MIN_OUT = 1; /*!< Minimum number of output streams. */ -static const int MAX_OUT = 1; /*!< Maximum number of output streams. */ - - -fcd_source_c::fcd_source_c(const std::string device_name) - : gr_hier_block2 ("fcd_source_c", - gr_make_io_signature (MIN_IN, MAX_IN, sizeof (gr_complex)), - gr_make_io_signature (MIN_OUT, MAX_OUT, sizeof (gr_complex))), - d_freq_corr(-120), - d_freq_req(0) -{ - gr_float_to_complex_sptr f2c; - - /* Audio source; sample rate fixed at 96kHz */ - fcd = audio_make_source(96000, device_name, true); - - /* block to convert stereo audio to a complex stream */ - f2c = gr_make_float_to_complex(1); - - connect(fcd, 0, f2c, 0); - connect(fcd, 1, f2c, 1); - connect(f2c, 0, self(), 0); - -} - - -fcd_source_c::~fcd_source_c () -{ - -} - -// Set frequency with Hz resolution -void fcd_source_c::set_freq(int freq) -{ - FCD_MODE_ENUM __GR_ATTR_UNUSED fme; - double f = (double)freq; - - /* valid range 50 MHz - 2.0 GHz */ - if ((freq < 50000000) || (freq > 2000000000)) { - return; - } - - d_freq_req = freq; - f *= 1.0 + d_freq_corr/1000000.0; - - fme = fcdAppSetFreq((int)f); - /* TODO: check fme */ -} - -// Set frequency with Hz resolution (type float) -void fcd_source_c::set_freq(float freq) -{ - FCD_MODE_ENUM __GR_ATTR_UNUSED fme; - double f = (double)freq; - - /* valid range 50 MHz - 2.0 GHz */ - if ((freq < 50.0e6) || (freq > 2.0e9)) { - return; - } - - d_freq_req = (int)freq; - f *= 1.0 + d_freq_corr/1000000.0; - - fme = fcdAppSetFreq((int)f); - /* TODO: check fme */ -} - - -// Set frequency with kHz resolution. -void fcd_source_c::set_freq_khz(int freq) -{ - FCD_MODE_ENUM __GR_ATTR_UNUSED fme; - double f = freq*1000.0; - - /* valid range 50 MHz - 2.0 GHz */ - if ((freq < 50000) || (freq > 2000000)) { - return; - } - - d_freq_req = freq*1000; - f *= 1.0 + d_freq_corr/1000000.0; - - fme = fcdAppSetFreqkHz((int)(f/1000.0)); - /* TODO: check fme */ -} - - -// Set LNA gain -void fcd_source_c::set_lna_gain(float gain) -{ - FCD_MODE_ENUM __GR_ATTR_UNUSED fme; - unsigned char g; - - /* convert to nearest discrete value */ - if (gain > 27.5) { - g = 14; // 30.0 dB - } - else if (gain > 22.5) { - g = 13; // 25.0 dB - } - else if (gain > 18.75) { - g = 12; // 20.0 dB - } - else if (gain > 16.25) { - g = 11; // 17.5 dB - } - else if (gain > 13.75) { - g = 10; // 15.0 dB - } - else if (gain > 11.25) { - g = 9; // 12.5 dB - } - else if (gain > 8.75) { - g = 8; // 10.0 dB - } - else if (gain > 6.25) { - g = 7; // 7.5 dB - } - else if (gain > 3.75) { - g = 6; // 5.0 dB - } - else if (gain > 1.25) { - g = 5; // 2.5 dB - } - else if (gain > -1.25) { - g = 4; // 0.0 dB - } - else if (gain > -3.75) { - g = 1; // -2.5 dB - } - else { - g = 0; // -5.0 dB - } - - fme = fcdAppSetParam(FCD_CMD_APP_SET_LNA_GAIN, &g, 1); - /* TODO: check fme */ -} - -// Set new frequency correction -void fcd_source_c::set_freq_corr(int ppm) -{ - d_freq_corr = ppm; - // re-tune with new correction value - set_freq(d_freq_req); -} - - -// Set DC offset correction. -void fcd_source_c::set_dc_corr(double _dci, double _dcq) -{ - union { - unsigned char auc[4]; - struct { - signed short dci; // equivalent of qint16 which should be 16 bit everywhere - signed short dcq; - }; - } dcinfo; - - if ((_dci < -1.0) || (_dci > 1.0) || (_dcq < -1.0) || (_dcq > 1.0)) - return; - - dcinfo.dci = static_cast<signed short>(_dci*32768.0); - dcinfo.dcq = static_cast<signed short>(_dcq*32768.0); - - fcdAppSetParam(FCD_CMD_APP_SET_DC_CORR, dcinfo.auc, 4); - -} - - -// Set IQ phase and gain balance. -void fcd_source_c::set_iq_corr(double _gain, double _phase) -{ - union { - unsigned char auc[4]; - struct { - signed short phase; - signed short gain; - }; - } iqinfo; - - if ((_gain < -1.0) || (_gain > 1.0) || (_phase < -1.0) || (_phase > 1.0)) - return; - - iqinfo.phase = static_cast<signed short>(_phase*32768.0); - iqinfo.gain = static_cast<signed short>(_gain*32768.0); - - fcdAppSetParam(FCD_CMD_APP_SET_IQ_CORR, iqinfo.auc, 4); - -} diff --git a/gr-fcd/lib/fcd_source_c_impl.cc b/gr-fcd/lib/fcd_source_c_impl.cc new file mode 100644 index 000000000..ca370d9f3 --- /dev/null +++ b/gr-fcd/lib/fcd_source_c_impl.cc @@ -0,0 +1,238 @@ +/* -*- c++ -*- */ +/* + * Copyright 2011-2012 Free Software Foundation, Inc. + * + * 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. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + + +#include <fcd_source_c_impl.h> +#include <fcd.h> +#include <fcdhidcmd.h> // needed for extended API +#include <gr_io_signature.h> +#include <gr_float_to_complex.h> +#include <gruel/attributes.h> + +//#include <iostream> +//using namespace std; + +/* + * Create a new instance of fcd_source_c_impl and return + * an upcasted boost shared_ptr. This is effectively the public constructor. + */ +fcd_source_c_sptr fcd_make_source_c(const std::string device_name) +{ + return gnuradio::get_initial_sptr(new fcd_source_c_impl(device_name)); +} + +static const int MIN_IN = 0; /*!< Mininum number of input streams. */ +static const int MAX_IN = 0; /*!< Maximum number of input streams. */ +static const int MIN_OUT = 1; /*!< Minimum number of output streams. */ +static const int MAX_OUT = 1; /*!< Maximum number of output streams. */ + +fcd_source_c_impl::fcd_source_c_impl(const std::string device_name) + : gr_hier_block2 ("fcd_source_c", + gr_make_io_signature (MIN_IN, MAX_IN, sizeof (gr_complex)), + gr_make_io_signature (MIN_OUT, MAX_OUT, sizeof (gr_complex))), + d_freq_corr(-120), + d_freq_req(0) +{ + gr_float_to_complex_sptr f2c; + + /* Audio source; sample rate fixed at 96kHz */ + fcd = audio_make_source(96000, device_name, true); + + /* block to convert stereo audio to a complex stream */ + f2c = gr_make_float_to_complex(1); + + connect(fcd, 0, f2c, 0); + connect(fcd, 1, f2c, 1); + connect(f2c, 0, self(), 0); +} + +// Set frequency with Hz resolution +void fcd_source_c_impl::set_freq(int freq) +{ + FCD_MODE_ENUM __GR_ATTR_UNUSED fme; + double f = (double)freq; + + /* valid range 50 MHz - 2.0 GHz */ + if ((freq < 50000000) || (freq > 2000000000)) { + return; + } + + d_freq_req = freq; + f *= 1.0 + d_freq_corr/1000000.0; + + fme = fcdAppSetFreq((int)f); + /* TODO: check fme */ +} + +// Set frequency with Hz resolution (type float) +void fcd_source_c_impl::set_freq(float freq) +{ + FCD_MODE_ENUM __GR_ATTR_UNUSED fme; + double f = (double)freq; + + /* valid range 50 MHz - 2.0 GHz */ + if ((freq < 50.0e6) || (freq > 2.0e9)) { + return; + } + + d_freq_req = (int)freq; + f *= 1.0 + d_freq_corr/1000000.0; + + fme = fcdAppSetFreq((int)f); + /* TODO: check fme */ +} + + +// Set frequency with kHz resolution. +void fcd_source_c_impl::set_freq_khz(int freq) +{ + FCD_MODE_ENUM __GR_ATTR_UNUSED fme; + double f = freq*1000.0; + + /* valid range 50 MHz - 2.0 GHz */ + if ((freq < 50000) || (freq > 2000000)) { + return; + } + + d_freq_req = freq*1000; + f *= 1.0 + d_freq_corr/1000000.0; + + fme = fcdAppSetFreqkHz((int)(f/1000.0)); + /* TODO: check fme */ +} + + +// Set LNA gain +void fcd_source_c_impl::set_lna_gain(float gain) +{ + FCD_MODE_ENUM __GR_ATTR_UNUSED fme; + unsigned char g; + + /* convert to nearest discrete value */ + if (gain > 27.5) { + g = 14; // 30.0 dB + } + else if (gain > 22.5) { + g = 13; // 25.0 dB + } + else if (gain > 18.75) { + g = 12; // 20.0 dB + } + else if (gain > 16.25) { + g = 11; // 17.5 dB + } + else if (gain > 13.75) { + g = 10; // 15.0 dB + } + else if (gain > 11.25) { + g = 9; // 12.5 dB + } + else if (gain > 8.75) { + g = 8; // 10.0 dB + } + else if (gain > 6.25) { + g = 7; // 7.5 dB + } + else if (gain > 3.75) { + g = 6; // 5.0 dB + } + else if (gain > 1.25) { + g = 5; // 2.5 dB + } + else if (gain > -1.25) { + g = 4; // 0.0 dB + } + else if (gain > -3.75) { + g = 1; // -2.5 dB + } + else { + g = 0; // -5.0 dB + } + + fme = fcdAppSetParam(FCD_CMD_APP_SET_LNA_GAIN, &g, 1); + /* TODO: check fme */ +} + +// Set mixer gain +void fcd_source_c_impl::set_mixer_gain(float gain) +{ + FCD_MODE_ENUM fme; + unsigned char g; + + if ( gain > 4.0 ) { + g = TMGE_P12_0DB; + } else { + g = TMGE_P4_0DB; + } + + fme = fcdAppSetParam(FCD_CMD_APP_SET_MIXER_GAIN, &g, 1); + /* TODO: check fme */ +} + +// Set new frequency correction +void fcd_source_c_impl::set_freq_corr(int ppm) +{ + d_freq_corr = ppm; + // re-tune with new correction value + set_freq(d_freq_req); +} + +// Set DC offset correction. +void fcd_source_c_impl::set_dc_corr(double _dci, double _dcq) +{ + union { + unsigned char auc[4]; + struct { + signed short dci; // equivalent of qint16 which should be 16 bit everywhere + signed short dcq; + }; + } dcinfo; + + if ((_dci < -1.0) || (_dci > 1.0) || (_dcq < -1.0) || (_dcq > 1.0)) + return; + + dcinfo.dci = static_cast<signed short>(_dci*32768.0); + dcinfo.dcq = static_cast<signed short>(_dcq*32768.0); + + fcdAppSetParam(FCD_CMD_APP_SET_DC_CORR, dcinfo.auc, 4); +} + +// Set IQ phase and gain balance. +void fcd_source_c_impl::set_iq_corr(double _gain, double _phase) +{ + union { + unsigned char auc[4]; + struct { + signed short phase; + signed short gain; + }; + } iqinfo; + + if ((_gain < -1.0) || (_gain > 1.0) || (_phase < -1.0) || (_phase > 1.0)) + return; + + iqinfo.phase = static_cast<signed short>(_phase*32768.0); + iqinfo.gain = static_cast<signed short>(_gain*32768.0); + + fcdAppSetParam(FCD_CMD_APP_SET_IQ_CORR, iqinfo.auc, 4); +} diff --git a/gr-fcd/lib/fcd_source_c_impl.h b/gr-fcd/lib/fcd_source_c_impl.h new file mode 100644 index 000000000..d082ecc1e --- /dev/null +++ b/gr-fcd/lib/fcd_source_c_impl.h @@ -0,0 +1,50 @@ +/* -*- c++ -*- */ +/* + * Copyright 2011-2012 Free Software Foundation, Inc. + * + * 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_FCD_SOURCE_C_IMPL_H +#define INCLUDED_FCD_SOURCE_C_IMPL_H + +#include <fcd_source_c.h> +#include <gr_audio_source.h> + +class FCD_API fcd_source_c_impl : public fcd_source_c +{ +public: + /* Public API functions documented in include/fcd_source_c.h */ + void set_freq(int freq); + void set_freq(float freq); + void set_freq_khz(int freq); + void set_lna_gain(float gain); + void set_mixer_gain(float gain); + void set_freq_corr(int ppm); + void set_dc_corr(double _dci, double _dcq); + void set_iq_corr(double _gain, double _phase); + +private: + fcd_source_c_impl(const std::string device_name = ""); + friend FCD_API fcd_source_c_sptr + fcd_make_source_c(const std::string device_name); + + audio_source::sptr fcd; /*!< The audio input source */ + int d_freq_corr; /*!< The frequency correction in ppm */ + int d_freq_req; /*!< The latest requested frequency in Hz */ +}; + +#endif /* INCLUDED_FCD_SOURCE_C_IMPL_H */ diff --git a/gr-fcd/swig/CMakeLists.txt b/gr-fcd/swig/CMakeLists.txt index 7d881c0b4..f715c4785 100644 --- a/gr-fcd/swig/CMakeLists.txt +++ b/gr-fcd/swig/CMakeLists.txt @@ -23,6 +23,8 @@ include(GrPython) include(GrSwig) +#set(GR_SWIG_FLAGS -DGR_HAVE_FCD) #needed to parse fcd_swig.i + set(GR_SWIG_INCLUDE_DIRS ${GR_FCD_INCLUDE_DIRS} ${GNURADIO_CORE_SWIG_INCLUDE_DIRS} @@ -45,7 +47,6 @@ GR_SWIG_INSTALL( install( FILES fcd_swig.i - fcd_source_c.i ${CMAKE_CURRENT_BINARY_DIR}/fcd_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig COMPONENT "fcd_swig" diff --git a/gr-fcd/swig/Makefile.am b/gr-fcd/swig/Makefile.am index cec8fa29a..225f32ae0 100644 --- a/gr-fcd/swig/Makefile.am +++ b/gr-fcd/swig/Makefile.am @@ -43,6 +43,8 @@ AM_CPPFLAGS = \ # The SWIG library # TESTS = run_tests +fcd_swig_swig_args = $(FCD_CPPFLAGS) + TOP_SWIG_DOC_IFILES = \ fcd_swig_doc.i @@ -72,7 +74,6 @@ fcd_swig_la_swig_libadd = \ # additional SWIG files to be installed fcd_swig_swiginclude_headers = \ - fcd_source_c.i \ $(TOP_SWIG_DOC_IFILES) if GUILE diff --git a/gr-fcd/swig/fcd_source_c.i b/gr-fcd/swig/fcd_source_c.i deleted file mode 100644 index 3438ab74d..000000000 --- a/gr-fcd/swig/fcd_source_c.i +++ /dev/null @@ -1,21 +0,0 @@ -/* - * First arg is the package prefix. - * Second arg is the name of the class minus the prefix. - * - * This does some behind-the-scenes magic so we can - * access fcd_source_c from python as fcd.source_c - */ -GR_SWIG_BLOCK_MAGIC(fcd,source_c); - -fcd_source_c_sptr fcd_make_source_c (const std::string device_name = ""); - -class fcd_source_c : public gr_hier_block2 -{ -public: - void set_freq(float freq); - void set_freq_khz(int freq); - void set_lna_gain(float gain); - void set_freq_corr(int ppm); - void set_dc_corr(double dci, double dcq); - void set_iq_corr(double gain, double phase); -}; diff --git a/gr-fcd/swig/fcd_swig.i b/gr-fcd/swig/fcd_swig.i index a565fb895..8fcc7d059 100644 --- a/gr-fcd/swig/fcd_swig.i +++ b/gr-fcd/swig/fcd_swig.i @@ -20,6 +20,11 @@ * Boston, MA 02110-1301, USA. */ +#define FCD_API + +//suppress 319. No access specifier given for base class name (ignored). +#pragma SWIG nowarn=319 + %include "gnuradio.i" //load generated python docstrings @@ -29,7 +34,10 @@ #include "fcd_source_c.h" %} -%include "fcd_source_c.i" +%include "fcd_source_c.h" + +GR_SWIG_BLOCK_MAGIC(fcd,source_c); +fcd_source_c_sptr fcd_make_source_c (const std::string device_name = ""); #if SWIGGUILE %scheme %{ diff --git a/gr-uhd/apps/uhd_fft.py b/gr-uhd/apps/uhd_fft.py index 18edc8f86..a3858e341 100755 --- a/gr-uhd/apps/uhd_fft.py +++ b/gr-uhd/apps/uhd_fft.py @@ -31,6 +31,7 @@ import numpy try: from gnuradio.wxgui import stdgui2, form, slider + from gnuradio.wxgui import forms from gnuradio.wxgui import fftsink2, waterfallsink2, scopesink2 import wx except ImportError: @@ -195,6 +196,26 @@ class app_top_block(stdgui2.std_top_block): min=int(glow), max=int(ghigh), callback=self.set_gain) + try: + usrp_config_val = "%s (%s), %s (%s, %s, %s)" % (self.u.get_usrp_rx_info().get("mboard_id").split(" ")[0], self.u.get_usrp_rx_info().get("mboard_serial"), + self.u.get_usrp_rx_info().get("rx_id").split(" ")[0].split(",")[0], self.u.get_usrp_rx_info().get("rx_serial"), self.u.get_subdev_spec(), self.u.get_antenna()) + except: + usrp_config_val = "Not implemented in this version." + + uhd_box = forms.static_box_sizer(parent=self.panel, + label="UHD (%s)" % (uhd.get_version_string()), + orient=wx.HORIZONTAL, + bold=True) + usrp_config_form = forms.static_text( + parent=self.panel, + sizer=uhd_box, + value=usrp_config_val, + label="USRP", + converter=forms.str_converter(), + ) + vbox.Add(uhd_box, 0, wx.EXPAND) + vbox.AddSpacer(5) + hbox.Add((5,0), 0, 0) vbox.Add(hbox, 0, wx.EXPAND) @@ -232,8 +253,10 @@ class app_top_block(stdgui2.std_top_block): myform['dspfreq'] = form.static_float_field( parent=panel, sizer=hbox, label="DSP Freq.") - hbox.Add((5,0), 0) + vbox.AddSpacer(5) + vbox.Add(hbox, 0, wx.EXPAND) + vbox.AddSpacer(5) def set_freq(self, target_freq): """ @@ -248,6 +271,7 @@ class app_top_block(stdgui2.std_top_block): self.myform['freq'].set_value(self.u.get_center_freq()) self.myform['rffreq'].set_value(r.actual_rf_freq) self.myform['dspfreq'].set_value(r.actual_dsp_freq) + if not self.options.oscilloscope: self.scope.set_baseband_freq(target_freq) return True diff --git a/gr-uhd/apps/uhd_siggen.py b/gr-uhd/apps/uhd_siggen.py index e1af586ae..ff36b4f4d 100755 --- a/gr-uhd/apps/uhd_siggen.py +++ b/gr-uhd/apps/uhd_siggen.py @@ -107,12 +107,32 @@ class top_block(gr.top_block, pubsub): if(options.antenna): self._u.set_antenna(options.antenna, 0) - self.publish(DESC_KEY, lambda: str(self._u)) + # Setup USRP Configuration value + try: + usrp_info = self._u.get_usrp_tx_info() + usrp_mb = usrp_info.get("mboard_id").split(" ")[0] + usrp_mbs = usrp_info.get("mboard_serial") + usrp_db = usrp_info.get("tx_id").split(" ")[0] + usrp_dbs = usrp_info.get("tx_serial") + usrp_sd = self._u.get_subdev_spec() + usrp_ant = self._u.get_antenna() + + desc_key_str = "Motherboard: %s [%s]\n" % (usrp_mb, usrp_mbs) + desc_key_str += "Daughterboard: %s [%s]\n" % (usrp_db, usrp_dbs) + desc_key_str += "Subdev: %s\n" % usrp_sd + desc_key_str += "Antenna: %s" % usrp_ant + except: + desc_key_str = "USRP configuration output not implemented in this version" + + self.publish(DESC_KEY, lambda: desc_key_str) self.publish(FREQ_RANGE_KEY, self._u.get_freq_range) self.publish(GAIN_RANGE_KEY, self._u.get_gain_range) self.publish(GAIN_KEY, self._u.get_gain) - if self._verbose: - print str(self._u) + + print "UHD Signal Generator" + print "Version: %s" % uhd.get_version_string() + print "\nUsing USRP configuration:" + print desc_key_str + "\n" # Direct asynchronous notifications to callback function if options.show_async_msg: diff --git a/gr-uhd/apps/uhd_siggen_gui.py b/gr-uhd/apps/uhd_siggen_gui.py index 2ef6ea40f..1f6a73c2c 100755 --- a/gr-uhd/apps/uhd_siggen_gui.py +++ b/gr-uhd/apps/uhd_siggen_gui.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2009,2011 Free Software Foundation, Inc. +# Copyright 2009,2011,2012 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -21,7 +21,7 @@ # import wx -from gnuradio import gr +from gnuradio import gr, uhd from gnuradio.gr.pubsub import pubsub from gnuradio.wxgui import gui, forms import uhd_siggen @@ -269,7 +269,7 @@ class app_gui(pubsub): # UHD status ################################################## u2_hbox = forms.static_box_sizer(parent=self.panel, - label="UHD Status", + label="UHD (%s)" % (uhd.get_version_string()), orient=wx.HORIZONTAL, bold=True) self.vbox.Add(u2_hbox, 0, wx.EXPAND) diff --git a/gr-uhd/include/gr_uhd_usrp_sink.h b/gr-uhd/include/gr_uhd_usrp_sink.h index ff4856f9b..fff567438 100644 --- a/gr-uhd/include/gr_uhd_usrp_sink.h +++ b/gr-uhd/include/gr_uhd_usrp_sink.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 Free Software Foundation, Inc. + * Copyright 2010-2012 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -131,12 +131,29 @@ public: virtual void set_start_time(const uhd::time_spec_t &time) = 0; /*! + * Returns identifying information about this USRP's configuration. + * Returns motherboard ID, name, and serial. + * Returns daughterboard TX ID, subdev name, and serial. + * \param chan channel index 0 to N-1 + * \return TX info + */ + virtual uhd::dict<std::string, std::string> get_usrp_tx_info(size_t chan = 0) = 0; + + /*! * Set the frontend specification. * \param spec the subdev spec markup string * \param mboard the motherboard index 0 to M-1 */ virtual void set_subdev_spec(const std::string &spec, size_t mboard = 0) = 0; + + /*! + * Get the TX frontend specification. + * \param mboard the motherboard index 0 to M-1 + * \return the frontend specification in use + */ + virtual std::string get_subdev_spec (size_t mboard = 0) = 0; + /*! * Set the sample rate for the usrp device. * \param rate a new rate in Sps diff --git a/gr-uhd/include/gr_uhd_usrp_source.h b/gr-uhd/include/gr_uhd_usrp_source.h index 415503bc1..0dde4b194 100644 --- a/gr-uhd/include/gr_uhd_usrp_source.h +++ b/gr-uhd/include/gr_uhd_usrp_source.h @@ -123,6 +123,15 @@ public: virtual void set_start_time(const uhd::time_spec_t &time) = 0; /*! + * Returns identifying information about this USRP's configuration. + * Returns motherboard ID, name, and serial. + * Returns daughterboard RX ID, subdev name, and serial. + * \param chan channel index 0 to N-1 + * \return RX info + */ + virtual uhd::dict<std::string, std::string> get_usrp_rx_info(size_t chan = 0) = 0; + + /*! * Set the frontend specification. * \param spec the subdev spec markup string * \param mboard the motherboard index 0 to M-1 @@ -130,6 +139,13 @@ public: virtual void set_subdev_spec(const std::string &spec, size_t mboard = 0) = 0; /*! + * Get the RX frontend specification. + * \param mboard the motherboard index 0 to M-1 + * \return the frontend specification in use + */ + virtual std::string get_subdev_spec(size_t mboard = 0) = 0; + + /*! * Set the sample rate for the usrp device. * \param rate a new rate in Sps */ diff --git a/gr-uhd/lib/gr_uhd_usrp_sink.cc b/gr-uhd/lib/gr_uhd_usrp_sink.cc index 7e7875898..d86165f65 100644 --- a/gr-uhd/lib/gr_uhd_usrp_sink.cc +++ b/gr-uhd/lib/gr_uhd_usrp_sink.cc @@ -66,10 +66,22 @@ public: _dev = uhd::usrp::multi_usrp::make(device_addr); } + uhd::dict<std::string, std::string> get_usrp_tx_info(size_t chan){ + #ifdef UHD_USRP_MULTI_USRP_GET_USRP_INFO_API + return _dev->get_usrp_tx_info(chan); + #else + throw std::runtime_error("not implemented in this version"); + #endif + } + void set_subdev_spec(const std::string &spec, size_t mboard){ return _dev->set_tx_subdev_spec(spec, mboard); } + std::string get_subdev_spec(size_t mboard){ + return _dev->get_tx_subdev_spec(mboard).to_string(); + } + void set_samp_rate(double rate){ _dev->set_tx_rate(rate); _sample_rate = this->get_samp_rate(); diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc index bd7f4e21d..49558cee6 100644 --- a/gr-uhd/lib/gr_uhd_usrp_source.cc +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -70,10 +70,22 @@ public: _dev = uhd::usrp::multi_usrp::make(device_addr); } + uhd::dict<std::string, std::string> get_usrp_rx_info(size_t chan){ + #ifdef UHD_USRP_MULTI_USRP_GET_USRP_INFO_API + return _dev->get_usrp_rx_info(chan); + #else + throw std::runtime_error("not implemented in this version"); + #endif + } + void set_subdev_spec(const std::string &spec, size_t mboard){ return _dev->set_rx_subdev_spec(spec, mboard); } + std::string get_subdev_spec(size_t mboard){ + return _dev->get_rx_subdev_spec(mboard).to_string(); + } + void set_samp_rate(double rate){ _dev->set_rx_rate(rate); } diff --git a/gr-uhd/swig/__init__.py b/gr-uhd/swig/__init__.py index 82dbdd9e7..b4045e77f 100644 --- a/gr-uhd/swig/__init__.py +++ b/gr-uhd/swig/__init__.py @@ -1,5 +1,5 @@ # -# Copyright 2010-2011 Free Software Foundation, Inc. +# Copyright 2010-2012 Free Software Foundation, Inc. # # This file is part of GNU Radio # diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i index 0b2f9febc..729719dcb 100644 --- a/gr-uhd/swig/uhd_swig.i +++ b/gr-uhd/swig/uhd_swig.i @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2010-2011 Free Software Foundation, Inc. + * Copyright 2010-2012 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -125,6 +125,14 @@ static const size_t ALL_MBOARDS = uhd::usrp::multi_usrp::ALL_MBOARDS; %} static const size_t ALL_MBOARDS; +%{ +#include <uhd/version.hpp> +std::string get_version_string(void){ + return uhd::get_version_string(); +} +%} +std::string get_version_string(void); + #if SWIGGUILE %scheme %{ (load-extension-global "libguile-gnuradio-uhd_swig" "scm_init_gnuradio_uhd_swig_module") diff --git a/gruel/src/include/gruel/pmt.h b/gruel/src/include/gruel/pmt.h index 58533e54e..f904d37e1 100644 --- a/gruel/src/include/gruel/pmt.h +++ b/gruel/src/include/gruel/pmt.h @@ -32,6 +32,7 @@ #include <stdint.h> #include <iosfwd> #include <stdexcept> +#include <boost/function.hpp> namespace gruel { class msg_accepter; @@ -805,6 +806,24 @@ GRUEL_API std::string pmt_serialize_str(pmt_t obj); */ GRUEL_API pmt_t pmt_deserialize_str(std::string str); +/* + * ------------------------------------------------------------------------ + * advanced + * ------------------------------------------------------------------------ + */ + +#define GRUEL_PMT_HAVE_PMT_SET_DELETER + +/*! + * Set a deleter function to be called when the PMT dereferences. + * User beware! This function is for extremely advanced use. + * Use boost bind to bind extra parameters into the deleter function. + * Set an empty function type to reset the PMT to the default deleter. + * \param obj the pmt object in which to set the deleter function + * \param deleter a function that gets an opaque PMT pointer type + */ +GRUEL_API void pmt_set_deleter(pmt_t obj, boost::function<void(pmt_base *)> &deleter); + } /* namespace pmt */ #include <gruel/pmt_sugar.h> diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index f9cf6b4bf..57b66b1a4 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -58,7 +58,7 @@ pmt_base::operator delete(void *p, size_t size) #endif void intrusive_ptr_add_ref(pmt_base* p) { ++(p->count_); } -void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) delete p; } +void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) p->deleter_(p); } pmt_base::~pmt_base() { @@ -1383,4 +1383,16 @@ pmt_dump_sizeof() printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector)); } +/* + * ------------------------------------------------------------------------ + * advanced + * ------------------------------------------------------------------------ + */ + +void +pmt_set_deleter(pmt_t obj, boost::function<void(pmt_base *)> &deleter) +{ + obj->deleter_ = (deleter)? deleter : &pmt_base::default_deleter; +} + } /* namespace pmt */ diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 3a5cd382b..745dbc666 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -38,8 +38,15 @@ namespace pmt { class GRUEL_API pmt_base : boost::noncopyable { mutable boost::detail::atomic_count count_; +public: + static void default_deleter(pmt_base *p){ + delete p; + } + + boost::function<void(pmt_base *)> deleter_; + protected: - pmt_base() : count_(0) {}; + pmt_base() : count_(0), deleter_(&pmt::pmt_base::default_deleter) {}; virtual ~pmt_base(); public: |