diff options
author | Josh Blum | 2010-03-02 14:43:20 -0800 |
---|---|---|
committer | Josh Blum | 2010-03-02 14:43:20 -0800 |
commit | 6d71414a0a467dc37fc903b327be22f8d0ddeade (patch) | |
tree | d74618b160f138e4b022ea549896c54a00eef6c8 /gr-uhd/lib | |
parent | c85606eaaf5a73387d4423bdeb2f63483394137e (diff) | |
download | gnuradio-6d71414a0a467dc37fc903b327be22f8d0ddeade.tar.gz gnuradio-6d71414a0a467dc37fc903b327be22f8d0ddeade.tar.bz2 gnuradio-6d71414a0a467dc37fc903b327be22f8d0ddeade.zip |
Added the uhd simple sink lib block, swig wrapper, grc wrapper.
It seems to work, but still getting the kinks out of tx->usrp2
Diffstat (limited to 'gr-uhd/lib')
-rw-r--r-- | gr-uhd/lib/Makefile.am | 6 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_simple_sink.cc | 87 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_simple_sink.h | 52 | ||||
-rw-r--r-- | gr-uhd/lib/uhd_simple_source.cc | 21 | ||||
-rw-r--r-- | gr-uhd/lib/utils.cc | 11 | ||||
-rw-r--r-- | gr-uhd/lib/utils.h | 2 |
6 files changed, 160 insertions, 19 deletions
diff --git a/gr-uhd/lib/Makefile.am b/gr-uhd/lib/Makefile.am index 73424ae8e..d4363406b 100644 --- a/gr-uhd/lib/Makefile.am +++ b/gr-uhd/lib/Makefile.am @@ -30,14 +30,16 @@ lib_LTLIBRARIES = libgnuradio-uhd.la libgnuradio_uhd_la_SOURCES = \ utils.cc \ - uhd_simple_source.cc + uhd_simple_source.cc \ + uhd_simple_sink.cc libgnuradio_uhd_la_LIBADD = \ $(GNURADIO_CORE_LA) \ $(UHD_LIBS) grinclude_HEADERS = \ - uhd_simple_source.h + uhd_simple_source.h \ + uhd_simple_sink.h noinst_HEADERS = \ utils.h diff --git a/gr-uhd/lib/uhd_simple_sink.cc b/gr-uhd/lib/uhd_simple_sink.cc new file mode 100644 index 000000000..269487f0e --- /dev/null +++ b/gr-uhd/lib/uhd_simple_sink.cc @@ -0,0 +1,87 @@ +/* -*- c++ -*- */ +/* + * Copyright 2010 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 <uhd_simple_sink.h> +#include <gr_io_signature.h> +#include <boost/thread.hpp> +#include <stdexcept> +#include "utils.h" + +/*********************************************************************** + * Make UHD Sink + **********************************************************************/ +boost::shared_ptr<uhd_simple_sink> uhd_make_simple_sink( + const std::string &args, + const std::string &type +){ + return boost::shared_ptr<uhd_simple_sink>( + new uhd_simple_sink(args_to_device_addr(args), type) + ); +} + +/*********************************************************************** + * UHD Sink + **********************************************************************/ +uhd_simple_sink::uhd_simple_sink( + const uhd::device_addr_t &addr, + const std::string &type +) : gr_sync_block( + "uhd sink", + gr_make_io_signature(1, 1, get_size(type)), + gr_make_io_signature(0, 0, 0) +){ + _type = type; + _dev = uhd::device::make(addr); + _sizeof_samp = get_size(type); +} + +uhd_simple_sink::~uhd_simple_sink(void){ + //NOP +} + +/*********************************************************************** + * Work + **********************************************************************/ +int uhd_simple_sink::work( + int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items +){ + + const size_t max_samples = wax::cast<size_t>((*_dev)[uhd::DEVICE_PROP_MAX_TX_SAMPLES]); + size_t total_items_sent = 0; + uhd::metadata_t metadata; + metadata.start_of_burst = true; + + //handles fragmentation + while(total_items_sent < size_t(noutput_items)){ + size_t items_sent = _dev->send( + boost::asio::buffer( + (uint8_t *)input_items[0]+(total_items_sent*_sizeof_samp), + std::min(max_samples, noutput_items-total_items_sent)*_sizeof_samp + ), metadata, _type + ); + total_items_sent += items_sent; + } + + return noutput_items; +} diff --git a/gr-uhd/lib/uhd_simple_sink.h b/gr-uhd/lib/uhd_simple_sink.h new file mode 100644 index 000000000..76b4a26cf --- /dev/null +++ b/gr-uhd/lib/uhd_simple_sink.h @@ -0,0 +1,52 @@ +/* -*- c++ -*- */ +/* + * Copyright 2010 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_UHD_SIMPLE_SINK_H +#define INCLUDED_UHD_SIMPLE_SINK_H + +#include <gr_sync_block.h> +#include <uhd/device.hpp> + +class uhd_simple_sink; + +boost::shared_ptr<uhd_simple_sink> +uhd_make_simple_sink(const std::string &args, const std::string &type); + +class uhd_simple_sink : public gr_sync_block{ +public: + uhd_simple_sink(const uhd::device_addr_t &addr, const std::string &type); + ~uhd_simple_sink(void); + + int work( + int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items + ); + +protected: + + uhd::device::sptr _dev; + std::string _type; + size_t _sizeof_samp; +}; + +#endif /* INCLUDED_UHD_SIMPLE_SINK_H */ diff --git a/gr-uhd/lib/uhd_simple_source.cc b/gr-uhd/lib/uhd_simple_source.cc index 360b91434..f6a783ef9 100644 --- a/gr-uhd/lib/uhd_simple_source.cc +++ b/gr-uhd/lib/uhd_simple_source.cc @@ -27,19 +27,6 @@ #include "utils.h" /*********************************************************************** - * Helper Functions - **********************************************************************/ -static size_t get_size(const std::string &type){ - if(type == "32fc"){ - return sizeof(std::complex<float>); - } - if(type == "16sc"){ - return sizeof(std::complex<short>); - } - throw std::runtime_error("unknown type"); -} - -/*********************************************************************** * Make UHD Source **********************************************************************/ boost::shared_ptr<uhd_simple_source> uhd_make_simple_source( @@ -95,9 +82,9 @@ int uhd_simple_source::work( const size_t max_samples = wax::cast<size_t>((*_dev)[uhd::DEVICE_PROP_MAX_RX_SAMPLES]); size_t total_items_read = 0; - size_t count = 0; + size_t count = 50; uhd::metadata_t metadata; - while(total_items_read == 0 or total_items_read + max_samples < size_t(noutput_items)){ + while(total_items_read < size_t(noutput_items)){ size_t items_read = _dev->recv( boost::asio::buffer( (uint8_t *)output_items[0]+(total_items_read*_sizeof_samp), @@ -116,8 +103,8 @@ int uhd_simple_source::work( //the timeout part boost::this_thread::sleep(boost::posix_time::milliseconds(1)); - if (++count > 50) break; + if (--count == 0) break; } - + return total_items_read; } diff --git a/gr-uhd/lib/utils.cc b/gr-uhd/lib/utils.cc index 6b2121064..c92846dc1 100644 --- a/gr-uhd/lib/utils.cc +++ b/gr-uhd/lib/utils.cc @@ -24,6 +24,7 @@ #include <boost/algorithm/string.hpp> #include <boost/algorithm/string/trim.hpp> #include <boost/foreach.hpp> +#include <complex> static std::string trim(const std::string &in){ return boost::algorithm::trim_copy(in); @@ -47,3 +48,13 @@ uhd::device_addr_t args_to_device_addr(const std::string &args){ return addr; } + +size_t get_size(const std::string &type){ + if(type == "32fc"){ + return sizeof(std::complex<float>); + } + if(type == "16sc"){ + return sizeof(std::complex<short>); + } + throw std::runtime_error("unknown type"); +} diff --git a/gr-uhd/lib/utils.h b/gr-uhd/lib/utils.h index 7530faba2..9a6dd604a 100644 --- a/gr-uhd/lib/utils.h +++ b/gr-uhd/lib/utils.h @@ -27,4 +27,6 @@ uhd::device_addr_t args_to_device_addr(const std::string &args); +size_t get_size(const std::string &type); + #endif /* INCLUDED_NOINST_UTILS_H */ |