(元の文章は2015/05/13のものです)
GnuRadio companion でGUIベースで用意された信号処理ブロックを結線してラジオをはじめいろいろなものが作れます. 新しいブロックの作成は意外に簡単です.
Extending GNU Radio with own functionality and blocks
に従ってg新部さんの NeuG を信号ソースにしてみました.
neugはg新部さんの FST-01 を使った乱数発生器です. FSFでも紹介されています
作業はDebien jessieでやったのですがパッケージとして gnuradio-dev, cmake, boost, libcppunit-dev, liblog4cpp5-devなどをインストールしておくことが必要でした.
ツリーを作製:
gr_modtool newmod neug # これで gr-neugができるので
cd gr-neug
gr_modtool add -t sync neug # syncのところはgeneric,decimator,interpolator...
python/qa_neug.pyを編集: unit testをかく
python/CMakeLists.txtを編集: ここのunit testsの最後にGR_ADD_TEST行を追加
lib/neug_impl.ccを編集: テンプレートとしての.ccのあちこちを埋めます. 結果はこんな感じ:
namespace gr {
namespace neug {
static int neug_fd;
neug::sptr
neug::make()
{
return gnuradio::get_initial_sptr
(new neug_impl());
}
/*
* The private constructor
*/
neug_impl::neug_impl()
: gr::sync_block("neug",
gr::io_signature::make(0, 0, sizeof(int)),
gr::io_signature::make(1, 1, sizeof(int)))
{
neug_fd = open ("/dev/ttyACM1", O_RDONLY);
if (neug_fd < 0)
throw std::runtime_error("can't open /dev/ttyACM1");
}
/*
* Our virtual destructor.
*/
neug_impl::~neug_impl()
{
close (neug_fd);
}
int
neug_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
const int *in = (const int *) input_items[0];
int *out = (int *) output_items[0];
// Do <+signal processing+>
for(int i = 0; i < noutput_items; i++)
{
read (neug_fd, (void *)&out[i], sizeof(int));
}
// Tell runtime system how many output items we produced.
return noutput_items;
}
} /* namespace howto */
} /* namespace gr */
.
うまくいっていればgnuradio-compnionのカテゴリーにNEUGが追加されneugブロックが使えるようになっているはずです.
参考リンク