summaryrefslogtreecommitdiff
path: root/gr-uhd/lib
diff options
context:
space:
mode:
authorJosh Blum2010-03-02 14:43:20 -0800
committerJosh Blum2010-03-02 14:43:20 -0800
commit6d71414a0a467dc37fc903b327be22f8d0ddeade (patch)
treed74618b160f138e4b022ea549896c54a00eef6c8 /gr-uhd/lib
parentc85606eaaf5a73387d4423bdeb2f63483394137e (diff)
downloadgnuradio-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.am6
-rw-r--r--gr-uhd/lib/uhd_simple_sink.cc87
-rw-r--r--gr-uhd/lib/uhd_simple_sink.h52
-rw-r--r--gr-uhd/lib/uhd_simple_source.cc21
-rw-r--r--gr-uhd/lib/utils.cc11
-rw-r--r--gr-uhd/lib/utils.h2
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 */