From 6d71414a0a467dc37fc903b327be22f8d0ddeade Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Tue, 2 Mar 2010 14:43:20 -0800
Subject: Added the uhd simple sink lib block, swig wrapper, grc wrapper. It
 seems to work, but still getting the kinks out of tx->usrp2

---
 gr-uhd/grc/Makefile.am          |  3 +-
 gr-uhd/grc/uhd_simple_sink.xml  | 43 ++++++++++++++++++++
 gr-uhd/lib/Makefile.am          |  6 ++-
 gr-uhd/lib/uhd_simple_sink.cc   | 87 +++++++++++++++++++++++++++++++++++++++++
 gr-uhd/lib/uhd_simple_sink.h    | 52 ++++++++++++++++++++++++
 gr-uhd/lib/uhd_simple_source.cc | 21 ++--------
 gr-uhd/lib/utils.cc             | 11 ++++++
 gr-uhd/lib/utils.h              |  2 +
 gr-uhd/swig/uhd_swig.i          |  5 ++-
 9 files changed, 209 insertions(+), 21 deletions(-)
 create mode 100644 gr-uhd/grc/uhd_simple_sink.xml
 create mode 100644 gr-uhd/lib/uhd_simple_sink.cc
 create mode 100644 gr-uhd/lib/uhd_simple_sink.h

(limited to 'gr-uhd')

diff --git a/gr-uhd/grc/Makefile.am b/gr-uhd/grc/Makefile.am
index a461462728..61eb32770e 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 0000000000..1259c38c0e
--- /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 73424ae8e6..d4363406b0 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 0000000000..269487f0e0
--- /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 0000000000..76b4a26cff
--- /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 360b914346..f6a783ef9a 100644
--- a/gr-uhd/lib/uhd_simple_source.cc
+++ b/gr-uhd/lib/uhd_simple_source.cc
@@ -26,19 +26,6 @@
 #include <stdexcept>
 #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
  **********************************************************************/
@@ -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 6b2121064d..c92846dc1a 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 7530faba21..9a6dd604a8 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 e20d22a264..06a1c88ff2 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>
-- 
cgit v1.2.3