diff options
Diffstat (limited to 'gr-uhd')
-rw-r--r-- | gr-uhd/grc/Makefile.am | 1 | ||||
-rw-r--r-- | gr-uhd/grc/uhd_amsg_source.xml | 24 | ||||
-rw-r--r-- | gr-uhd/grc/uhd_block_tree.xml | 1 | ||||
-rw-r--r-- | gr-uhd/include/Makefile.am | 3 | ||||
-rw-r--r-- | gr-uhd/include/gr_uhd_amsg_source.h | 39 | ||||
-rw-r--r-- | gr-uhd/lib/Makefile.am | 3 | ||||
-rw-r--r-- | gr-uhd/lib/gr_uhd_amsg_source.cc | 88 | ||||
-rw-r--r-- | gr-uhd/swig/__init__.py | 3 | ||||
-rw-r--r-- | gr-uhd/swig/uhd_swig.i | 4 |
9 files changed, 162 insertions, 4 deletions
diff --git a/gr-uhd/grc/Makefile.am b/gr-uhd/grc/Makefile.am index 7e73a5b39..42a35b1c1 100644 --- a/gr-uhd/grc/Makefile.am +++ b/gr-uhd/grc/Makefile.am @@ -31,6 +31,7 @@ BUILT_SOURCES += $(generated_uhd_usrp_blocks) dist_grcblocks_DATA = \ uhd_block_tree.xml \ + uhd_amsg_source.xml \ $(BUILT_SOURCES) ######################################################################## diff --git a/gr-uhd/grc/uhd_amsg_source.xml b/gr-uhd/grc/uhd_amsg_source.xml new file mode 100644 index 000000000..78c9d7b58 --- /dev/null +++ b/gr-uhd/grc/uhd_amsg_source.xml @@ -0,0 +1,24 @@ +<?xml version="1.0"?> +<block> + <name>UHD: USRP Async Msg Source</name> + <key>uhd_amsg_source</key> + <import>from gnuradio import uhd</import> + <make>uhd.amsg_source(device_addr=$dev_addr, msgq=$(id)_msgq_out)</make> + <param> + <name>Device Addr</name> + <key>dev_addr</key> + <value></value> + <type>string</type> + <hide> + #if $dev_addr() + none + #else + part + #end if + </hide> + </param> + <source> + <name>out</name> + <type>msg</type> + </source> +</block> diff --git a/gr-uhd/grc/uhd_block_tree.xml b/gr-uhd/grc/uhd_block_tree.xml index 8a9f62f7c..5d3b49393 100644 --- a/gr-uhd/grc/uhd_block_tree.xml +++ b/gr-uhd/grc/uhd_block_tree.xml @@ -10,5 +10,6 @@ <name>UHD</name> <block>uhd_usrp_source</block> <block>uhd_usrp_sink</block> + <block>uhd_amsg_source</block> </cat> </cat> diff --git a/gr-uhd/include/Makefile.am b/gr-uhd/include/Makefile.am index 4a04c98c1..70b80681b 100644 --- a/gr-uhd/include/Makefile.am +++ b/gr-uhd/include/Makefile.am @@ -24,4 +24,5 @@ include $(top_srcdir)/Makefile.common grinclude_HEADERS = \ gr_uhd_api.h \ gr_uhd_usrp_source.h \ - gr_uhd_usrp_sink.h + gr_uhd_usrp_sink.h \ + gr_uhd_amsg_source.h diff --git a/gr-uhd/include/gr_uhd_amsg_source.h b/gr-uhd/include/gr_uhd_amsg_source.h new file mode 100644 index 000000000..bc0feb438 --- /dev/null +++ b/gr-uhd/include/gr_uhd_amsg_source.h @@ -0,0 +1,39 @@ +/* + * Copyright 2011 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. + */ + +#ifndef INCLUDED_GR_UHD_AMSG_SOURCE_H +#define INCLUDED_GR_UHD_AMSG_SOURCE_H + +#include <gr_uhd_api.h> +#include <uhd/usrp/multi_usrp.hpp> +#include <gr_msg_queue.h> + +class uhd_amsg_source; + +GR_UHD_API boost::shared_ptr<uhd_amsg_source> uhd_make_amsg_source( + const uhd::device_addr_t &device_addr, + gr_msg_queue_sptr msgq +); + +class GR_UHD_API uhd_amsg_source{ +}; + +#endif /* INCLUDED_GR_UHD_AMSG_SOURCE_H */ diff --git a/gr-uhd/lib/Makefile.am b/gr-uhd/lib/Makefile.am index c27682f7f..c322c6124 100644 --- a/gr-uhd/lib/Makefile.am +++ b/gr-uhd/lib/Makefile.am @@ -31,7 +31,8 @@ lib_LTLIBRARIES = libgnuradio-uhd.la libgnuradio_uhd_la_SOURCES = \ gr_uhd_usrp_source.cc \ - gr_uhd_usrp_sink.cc + gr_uhd_usrp_sink.cc \ + gr_uhd_amsg_source.cc libgnuradio_uhd_la_LIBADD = \ $(GNURADIO_CORE_LA) \ diff --git a/gr-uhd/lib/gr_uhd_amsg_source.cc b/gr-uhd/lib/gr_uhd_amsg_source.cc new file mode 100644 index 000000000..f2958f115 --- /dev/null +++ b/gr-uhd/lib/gr_uhd_amsg_source.cc @@ -0,0 +1,88 @@ +/* + * Copyright 2011 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. + */ + +#include <gr_uhd_amsg_source.h> +#include <boost/bind.hpp> +#include <gruel/thread.h> + +/*********************************************************************** + * UHD Asynchronous Message Source Impl + **********************************************************************/ +class uhd_amsg_source_impl : public uhd_amsg_source{ +public: + uhd_amsg_source_impl( + const uhd::device_addr_t &device_addr, + gr_msg_queue_sptr msgq + ): + _msgq(msgq), _running(true) + { + _dev = uhd::usrp::multi_usrp::make(device_addr); + _amsg_thread = + gruel::thread(boost::bind(&uhd_amsg_source_impl::recv_loop, this)); + } + + ~uhd_amsg_source_impl() + { + _running = false; + _amsg_thread.join(); + } + + void recv_loop() + { + gr_message_sptr msg; + uhd::async_metadata_t *md; + + while (_running) { + msg = gr_make_message(0, 0.0, 0.0, sizeof(uhd::async_metadata_t)); + md = (uhd::async_metadata_t *) msg->msg(); + + while (!_dev->get_device()->recv_async_msg(*md, 0.1)) { + if (!_running) + return; + } + + post(msg); + } + } + + void post(gr_message_sptr msg) + { + _msgq->insert_tail(msg); + } + +protected: + uhd::usrp::multi_usrp::sptr _dev; + gruel::thread _amsg_thread; + gr_msg_queue_sptr _msgq; + bool _running; +}; + +/*********************************************************************** + * Make UHD Asynchronous Message Source + **********************************************************************/ +boost::shared_ptr<uhd_amsg_source> uhd_make_amsg_source( + const uhd::device_addr_t &device_addr, + gr_msg_queue_sptr msgq +){ + return boost::shared_ptr<uhd_amsg_source>( + new uhd_amsg_source_impl(device_addr, msgq) + ); +} diff --git a/gr-uhd/swig/__init__.py b/gr-uhd/swig/__init__.py index 7ed689ec0..6d4ecc7f0 100644 --- a/gr-uhd/swig/__init__.py +++ b/gr-uhd/swig/__init__.py @@ -60,7 +60,7 @@ def _prepare_uhd_swig(): if attr.endswith('_t'): setattr(uhd_swig, attr[:-2], myobj) #Cast constructor args (FIXME swig handle overloads?) - for attr in ('usrp_source', 'usrp_sink'): + for attr in ('usrp_source', 'usrp_sink', 'amsg_source'): def constructor_factory(old_constructor): def constructor_interceptor(*args, **kwargs): args = list(args) @@ -77,7 +77,6 @@ def _prepare_uhd_swig(): #Aliases for deprecated constructors setattr(uhd_swig, 'single_usrp_source', uhd_swig.usrp_source) - setattr(uhd_swig, 'single_usrp_sink', uhd_swig.usrp_sink) setattr(uhd_swig, 'multi_usrp_source', uhd_swig.usrp_source) setattr(uhd_swig, 'multi_usrp_sink', uhd_swig.usrp_sink) diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i index 9bdb962c9..b58fe9e18 100644 --- a/gr-uhd/swig/uhd_swig.i +++ b/gr-uhd/swig/uhd_swig.i @@ -55,6 +55,7 @@ %{ #include <gr_uhd_usrp_source.h> #include <gr_uhd_usrp_sink.h> +#include <gr_uhd_amsg_source.h> %} //////////////////////////////////////////////////////////////////////// @@ -114,6 +115,9 @@ GR_SWIG_BLOCK_MAGIC(uhd,usrp_source) GR_SWIG_BLOCK_MAGIC(uhd,usrp_sink) %include <gr_uhd_usrp_sink.h> +GR_SWIG_BLOCK_MAGIC(uhd,amsg_source) +%include <gr_uhd_amsg_source.h> + //////////////////////////////////////////////////////////////////////// // helpful constants //////////////////////////////////////////////////////////////////////// |