C++教程 ys_linux@computer:~$ gr_modtool nm kcd
Creating out-of-tree module in ./gr-kcd... Done.
Use 'gr_modtool add' to add a new block to this currently empty module.
ys_linux@computer:~$ cd gr-kcd/
ys_linux@computer:~/gr-kcd$ ls
apps CMakeLists.txt examples include MANIFEST.md swig
cmake docs grc lib python
ys_linux@computer:~/gr-kcd$ gr_modtool add my_qpsk_demod_cb
GNU Radio module name identified: tutorial
('sink', 'source', 'sync', 'decimator', 'interpolator', 'general', 'tagged_stream', 'hier', 'noblock')
Enter block type: general
Language (python/cpp): C++
Language (python/cpp): cpp
Language: C++
Block/code identifier: my_qpsk_demod_cb
Enter valid argument list, including default arguments: int freq ,float amp
Add Python QA code? [Y/n]
Add C++ QA code? [y/N] Y
Adding file 'lib/my_qpsk_demod_cb_impl.h'...
Adding file 'lib/my_qpsk_demod_cb_impl.cc'...
Adding file 'include/tutorial/my_qpsk_demod_cb.h'...
Adding file 'lib/qa_my_qpsk_demod_cb.cc'...
Adding file 'lib/qa_my_qpsk_demod_cb.h'...
Editing swig/tutorial_swig.i...
Adding file 'python/qa_my_qpsk_demod_cb.py'...
Editing python/CMakeLists.txt...
Adding file 'grc/tutorial_my_qpsk_demod_cb.xml'...
Editing grc/CMakeLists.txt...
然后编辑代码
/* -*- c++ -*- */
/*
* Copyright 2017 <+YOU OR YOUR COMPANY+>.
*
* This 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.
*
* This software 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 this software; 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 <gnuradio/io_signature.h>
#include "cos_source_impl.h"
#include "pmt/pmt.h"
using namespace std; namespace gr {
namespace kcd { cos_source::sptr
cos_source::make(int freq ,float amp)
{ std::cout << "my_cout"<<endl; pmt::pmt_t P = pmt::from_long();
std::cout << P << std::endl;
pmt::pmt_t P2 = pmt::from_complex(gr_complex(, )); // Alternatively: pmt::from_complex(0, 1)
std::cout << P2 << std::endl;
std::cout << pmt::is_complex(P2) << std::endl; return gnuradio::get_initial_sptr
(new cos_source_impl(freq, amp));
} /*
* The private constructor
*/
cos_source_impl::cos_source_impl(int freq ,float amp)
: gr::sync_block("cos_source",
gr::io_signature::make(, , ),
gr::io_signature::make(, , sizeof(float)))
{} /*
* Our virtual destructor.
*/
cos_source_impl::~cos_source_impl()
{
} int
cos_source_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
// const <+ITYPE+> *in = (const <+ITYPE+> *) input_items[0];
float *out = (float *) output_items[]; for (int i = ;i<noutput_items;i++ )
{
// out[i] = kcd_source_sincos(i);
if (num < ) {
num++;
}
else {
num=;
}
out[i]=cos(3.1415926535898**num/);
// out[i]=noutput_items;
}
// Do <+signal processing+> // Tell runtime system how many output items we produced.
return noutput_items;
} } /* namespace kcd */
} /* namespace gr */
头文件
/* -*- c++ -*- */
/*
* Copyright 2017 <+YOU OR YOUR COMPANY+>.
*
* This 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.
*
* This software 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 this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/ #ifndef INCLUDED_KCD_COS_SOURCE_IMPL_H
#define INCLUDED_KCD_COS_SOURCE_IMPL_H #include <kcd/cos_source.h> namespace gr {
namespace kcd { class cos_source_impl : public cos_source
{
private:
// Nothing to declare in this block. public:
cos_source_impl(int freq ,float amp);
~cos_source_impl();
int num=;
int number=;
// Where all the action really happens
int work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
}; } // namespace kcd
} // namespace gr #endif /* INCLUDED_KCD_COS_SOURCE_IMPL_H */
修改xml
<?xml version="1.0"?>
<block>
<name>cos_source</name>
<key>kcd_cos_source</key>
<category>[kcd]</category>
<import>import kcd</import>
<make>kcd.cos_source($freq, $amp)</make>
<!-- Make one 'param' node for every Parameter you want settable from the GUI.
Sub-nodes:
* name
* key (makes the value accessible as $keyname, e.g. in the make node)
* type -->
<param>
<name>freq</name>
<key>freq</key>
<type>int</type>
</param> <param>
<name>amp</name>
<key>amp</key>
<type>float</type>
</param> <!-- Make one 'sink' node per input. Sub-nodes:
* name (an identifier for the GUI)
* type
* vlen
* optional (set to 1 for optional inputs) -->
<!-- <sink>
<name>in</name>
<type> e.g. int, float, complex, byte, short, xxx_vector, ...</type>
</sink> --> <!-- Make one 'source' node per output. Sub-nodes:
* name (an identifier for the GUI)
* type
* vlen
* optional (set to 1 for optional inputs) -->
<source>
<name>out</name>
<type>float<!-- e.g. int, float, complex, byte, short, xxx_vector, ...--></type>
</source>
</block>
然后打包 ys_linux@computer:~/gr-tutorial$ cmake ../
$make $sudo make intall $sudo ldconfig 然后启动gnuradio