summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gr-uhd/grc/Makefile.am3
-rw-r--r--gr-uhd/grc/uhd_simple_sink.xml43
-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
-rw-r--r--gr-uhd/swig/uhd_swig.i5
9 files changed, 209 insertions, 21 deletions
diff --git a/gr-uhd/grc/Makefile.am b/gr-uhd/grc/Makefile.am
index a46146272..61eb32770 100644
--- a/gr-uhd/grc/Makefile.am
+++ b/gr-uhd/grc/Makefile.am
@@ -24,4 +24,5 @@ include $(top_srcdir)/Makefile.common
grcblocksdir = $(grc_blocksdir)
dist_grcblocks_DATA = \
- uhd_simple_source.xml
+ uhd_simple_source.xml \
+ uhd_simple_sink.xml
diff --git a/gr-uhd/grc/uhd_simple_sink.xml b/gr-uhd/grc/uhd_simple_sink.xml
new file mode 100644
index 000000000..1259c38c0
--- /dev/null
+++ b/gr-uhd/grc/uhd_simple_sink.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## UHD Simple Sink
+###################################################
+ -->
+<block>
+ <name>UHD Simple Sink</name>
+ <key>uhd_simple_sink</key>
+ <category>UHD</category>
+ <import>from gnuradio import uhd</import>
+ <make>uhd.simple_sink($args, "$type.type")</make>
+ <param>
+ <name>Input Type</name>
+ <key>type</key>
+ <type>enum</type>
+ <option>
+ <name>Complex</name>
+ <key>complex</key>
+ <opt>type:32fc</opt>
+ <opt>vlen:1</opt>
+ </option>
+ <option>
+ <name>Short</name>
+ <key>short</key>
+ <opt>type:16sc</opt>
+ <opt>vlen:2</opt>
+ </option>
+ </param>
+ <param>
+ <name>Args</name>
+ <key>args</key>
+ <value></value>
+ <type>string</type>
+ </param>
+ <sink>
+ <name>out</name>
+ <type>$type</type>
+ <vlen>$type.vlen</vlen>
+ </sink>
+ <doc>
+ </doc>
+</block>
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 */
diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i
index e20d22a26..06a1c88ff 100644
--- a/gr-uhd/swig/uhd_swig.i
+++ b/gr-uhd/swig/uhd_swig.i
@@ -24,8 +24,11 @@
%{
#include <uhd_simple_source.h>
+#include <uhd_simple_sink.h>
%}
GR_SWIG_BLOCK_MAGIC(uhd,simple_source)
-
%include <uhd_simple_source.h>
+
+GR_SWIG_BLOCK_MAGIC(uhd,simple_sink)
+%include <uhd_simple_sink.h>