commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] [gnuradio] 01/04: blocks: tagged_stream_to_pdu now use


From: git
Subject: [Commit-gnuradio] [gnuradio] 01/04: blocks: tagged_stream_to_pdu now uses logic from tagged_stream_block, also more QA
Date: Sat, 22 Feb 2014 22:27:32 +0000 (UTC)

This is an automated email from the git hooks/post-receive script.

jcorgan pushed a commit to branch master
in repository gnuradio.

commit 6b579fa2ee60fd820ba0fe356c1a281fd7ee59e7
Author: Martin Braun <address@hidden>
Date:   Mon Feb 17 09:19:13 2014 +0100

    blocks: tagged_stream_to_pdu now uses logic from tagged_stream_block, also 
more QA
---
 .../include/gnuradio/blocks/tagged_stream_to_pdu.h | 12 +--
 gr-blocks/lib/tagged_stream_to_pdu_impl.cc         | 99 +++++-----------------
 gr-blocks/lib/tagged_stream_to_pdu_impl.h          | 13 +--
 gr-blocks/python/blocks/qa_pdu.py                  | 43 ++++++++--
 4 files changed, 68 insertions(+), 99 deletions(-)

diff --git a/gr-blocks/include/gnuradio/blocks/tagged_stream_to_pdu.h 
b/gr-blocks/include/gnuradio/blocks/tagged_stream_to_pdu.h
index 9d5f509..15ed50f 100644
--- a/gr-blocks/include/gnuradio/blocks/tagged_stream_to_pdu.h
+++ b/gr-blocks/include/gnuradio/blocks/tagged_stream_to_pdu.h
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2013 Free Software Foundation, Inc.
+ * Copyright 2013,2014 Free Software Foundation, Inc.
  *
  * This file is part of GNU Radio
  *
@@ -25,16 +25,19 @@
 
 #include <gnuradio/blocks/api.h>
 #include <gnuradio/blocks/pdu.h>
-#include <gnuradio/sync_block.h>
+#include <gnuradio/tagged_stream_block.h>
 
 namespace gr {
   namespace blocks {
 
     /*!
-     * \brief Turns received stream data and tags into PDUs
+     * \brief Turns received stream data and tags into PDUs and sends them 
through a message port.
      * \ingroup message_tools_blk
+     *
+     * The sent message is a PMT-pair (created by pmt::cons()). The first 
element is a dictionary
+     * containing all the tags. The second is a vector containing the actual 
data.
      */
-    class BLOCKS_API tagged_stream_to_pdu : virtual public sync_block
+    class BLOCKS_API tagged_stream_to_pdu : virtual public tagged_stream_block
     {
     public:
       // gr::blocks::tagged_stream_to_pdu::sptr
@@ -44,7 +47,6 @@ namespace gr {
        * \brief Construct a tagged_stream_to_pdu block
        * \param type PDU type of pdu::vector_type
        * \param lengthtagname The name of the tag that specifies how long the 
packet is.
-       *                      Defaults to 'packet_len'.
        */
       static sptr make(pdu::vector_type type,
                        const std::string& lengthtagname="packet_len");
diff --git a/gr-blocks/lib/tagged_stream_to_pdu_impl.cc 
b/gr-blocks/lib/tagged_stream_to_pdu_impl.cc
index da89403..04871ae 100644
--- a/gr-blocks/lib/tagged_stream_to_pdu_impl.cc
+++ b/gr-blocks/lib/tagged_stream_to_pdu_impl.cc
@@ -38,100 +38,43 @@ namespace gr {
     }
 
     tagged_stream_to_pdu_impl::tagged_stream_to_pdu_impl(pdu::vector_type 
type, const std::string& lengthtagname)
-      : sync_block("tagged_stream_to_pdu",
+      : tagged_stream_block("tagged_stream_to_pdu",
                      io_signature::make(1, 1, pdu::itemsize(type)),
-                     io_signature::make(0, 0, 0)),
-       d_itemsize(pdu::itemsize(type)),
-       d_inpdu(false),
+                     io_signature::make(0, 0, 0), lengthtagname),
        d_type(type),
        d_pdu_meta(pmt::PMT_NIL),
-       d_pdu_vector(pmt::PMT_NIL),
-       d_tag(pmt::mp(lengthtagname))
+       d_pdu_vector(pmt::PMT_NIL)
     {
       message_port_register_out(PDU_PORT_ID);
     }
 
     int
-    tagged_stream_to_pdu_impl::work(int noutput_items,
-                                   gr_vector_const_void_star &input_items,
-                                   gr_vector_void_star &output_items)
+    tagged_stream_to_pdu_impl::work (int noutput_items,
+                       gr_vector_int &ninput_items,
+                       gr_vector_const_void_star &input_items,
+                       gr_vector_void_star &output_items)
     {
       const uint8_t *in = (const uint8_t*) input_items[0];
-      uint64_t abs_N = nitems_read(0);
 
-      // if we are not in a pdu already, start a new one 
-      if (!d_inpdu) {
-       bool found_length_tag(false);
-
-       get_tags_in_range(d_tags, 0, abs_N, abs_N+1);
-
-       for (d_tags_itr = d_tags.begin(); (d_tags_itr != d_tags.end()) && 
(!found_length_tag); d_tags_itr++) {
-         if (pmt::eq((*d_tags_itr).key, d_tag)) {
-
-          if ((*d_tags_itr).offset != abs_N )
-           throw std::runtime_error("expected next pdu length tag on a 
different item...");
-
-         found_length_tag = true;
-         d_pdu_length = pmt::to_long((*d_tags_itr).value);
-         d_pdu_remain = d_pdu_length;
-         d_pdu_meta = pmt::make_dict();
-              break;
-          } // if have length tag
-       } // iter over tags
-
-       if (!found_length_tag)
-         throw std::runtime_error("tagged stream does not contain a pdu_length 
tag");
+      // Grab tags, throw them into dict
+      get_tags_in_range(d_tags, 0,
+         nitems_read(0),
+         nitems_read(0) + ninput_items[0]
+      );
+      d_pdu_meta = pmt::make_dict();
+      for (d_tags_itr = d_tags.begin(); d_tags_itr != d_tags.end(); 
d_tags_itr++) {
+         d_pdu_meta = dict_add(d_pdu_meta, (*d_tags_itr).key, 
(*d_tags_itr).value);
       }
 
-      size_t ncopy = std::min((size_t)noutput_items, d_pdu_remain);
-
-      // copy any tags in this range into our meta object
-      get_tags_in_range(d_tags, 0, abs_N, abs_N+ncopy);
-      for (d_tags_itr = d_tags.begin(); d_tags_itr != d_tags.end(); 
d_tags_itr++)
-        if(!pmt::eq((*d_tags_itr).key, d_tag ))
-            d_pdu_meta = dict_add(d_pdu_meta, (*d_tags_itr).key, 
(*d_tags_itr).value);
+      // Grab data, throw into vector
+      d_pdu_vector = pdu::make_pdu_vector(d_type, in, ninput_items[0]);
 
-      // copy samples for this vector into either a pmt or our save buffer
-      if (ncopy == d_pdu_remain) { // we will send this pdu
-        if (d_save.size() == 0) {
-            d_pdu_vector = pdu::make_pdu_vector(d_type, in, ncopy);
-            send_message();
-        } 
-        else {
-            size_t oldsize = d_save.size()/d_itemsize;
-            d_save.resize((oldsize + ncopy)*d_itemsize, 0);
-            memcpy(&d_save[oldsize*d_itemsize], in, ncopy*d_itemsize);
-            d_pdu_vector = pdu::make_pdu_vector(d_type, &d_save[0], 
d_pdu_length);
-            send_message();
-            d_save.clear();
-        }
-      } 
-      else {
-        size_t oldsize = d_save.size()/d_itemsize;
-        d_inpdu = true;
-        d_save.resize((oldsize+ncopy)*d_itemsize);
-        memcpy(&d_save[oldsize*d_itemsize], in, ncopy*d_itemsize);
-        d_pdu_remain -= ncopy;
-      }
-
-      return ncopy;
-    }
-
-    void
-    tagged_stream_to_pdu_impl::send_message()
-    {
-      if (pmt::length(d_pdu_vector) != d_pdu_length)
-        throw std::runtime_error("msg length not correct");
-      
+      // Send msg
       pmt::pmt_t msg = pmt::cons(d_pdu_meta, d_pdu_vector);
       message_port_pub(PDU_PORT_ID, msg);
-      
-      d_pdu_meta = pmt::PMT_NIL;
-      d_pdu_vector = pmt::PMT_NIL;
-      d_pdu_length = 0;
-      d_pdu_remain = 0;
-      d_inpdu = false;
+
+      return ninput_items[0];
     }
-    
+
   } /* namespace blocks */
 } /* namespace gr */
diff --git a/gr-blocks/lib/tagged_stream_to_pdu_impl.h 
b/gr-blocks/lib/tagged_stream_to_pdu_impl.h
index 9620778..0a83a87 100644
--- a/gr-blocks/lib/tagged_stream_to_pdu_impl.h
+++ b/gr-blocks/lib/tagged_stream_to_pdu_impl.h
@@ -30,27 +30,20 @@ namespace gr {
 
     class BLOCKS_API tagged_stream_to_pdu_impl : public tagged_stream_to_pdu
     {
-      size_t               d_itemsize;
-      size_t               d_pdu_length;
-      size_t               d_pdu_remain;
-      bool                 d_inpdu;
       pdu::vector_type     d_type;
-      std::vector<uint8_t> d_save;
       pmt::pmt_t           d_pdu_meta;
       pmt::pmt_t           d_pdu_vector;
-
-      pmt::pmt_t           d_tag;
       std::vector<tag_t>::iterator d_tags_itr;
-      std::vector<tag_t> d_tags;
-      
+      std::vector<tag_t>   d_tags;
+
     public:
       tagged_stream_to_pdu_impl(pdu::vector_type type, const std::string& 
lengthtagname);
 
       int work(int noutput_items,
+               gr_vector_int &ninput_items,
               gr_vector_const_void_star &input_items,
               gr_vector_void_star &output_items);
 
-      void send_message();
     };
 
   } /* namespace blocks */
diff --git a/gr-blocks/python/blocks/qa_pdu.py 
b/gr-blocks/python/blocks/qa_pdu.py
index 0bd838b..81cd8cf 100755
--- a/gr-blocks/python/blocks/qa_pdu.py
+++ b/gr-blocks/python/blocks/qa_pdu.py
@@ -86,27 +86,58 @@ class test_pdu(gr_unittest.TestCase):
         actual_data = 16*[0xFF,]
         self.assertEqual(actual_data, list(result_data))
         self.assertEqual(actual_data, msg_data)
-        
+
     def test_001(self):
         #Test the overflow buffer in pdu_to_tagged_stream
         src_data = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
         src = blocks.pdu_to_tagged_stream(blocks.float_t)
         snk = blocks.vector_sink_f()
- 
+
         self.tb.connect(src, snk)
         port = pmt.intern("pdus")
- 
+
         msg = pmt.cons( pmt.PMT_NIL, pmt.init_f32vector(10, src_data))
         src.to_basic_block()._post(port, msg)
- 
+
         src.set_max_noutput_items(5)
- 
+
         self.tb.start()
         #ideally, would wait until we get ten samples
         time.sleep(0.2)
         self.tb.stop()
- 
+
         self.assertEqual(src_data, list(snk.data()) )
 
+
+    def test_002_tags_plus_data(self):
+        packet_len = 16
+        src_data = range(packet_len)
+        tag1 = gr.tag_t()
+        tag1.offset = 0
+        tag1.key = pmt.string_to_symbol('spam')
+        tag1.value = pmt.from_long(23)
+        tag2 = gr.tag_t()
+        tag2.offset = 10 # Must be < packet_len
+        tag2.key = pmt.string_to_symbol('eggs')
+        tag2.value = pmt.from_long(42)
+        src = blocks.vector_source_f(src_data, tags=(tag1, tag2))
+        s2ts = blocks.stream_to_tagged_stream(gr.sizeof_float, vlen=1, 
packet_len=packet_len, len_tag_key="packet_len")
+        ts2pdu = blocks.tagged_stream_to_pdu(blocks.float_t, "packet_len")
+        dbg = blocks.message_debug()
+        self.tb.connect(src, s2ts, ts2pdu)
+        self.tb.msg_connect(ts2pdu, "pdus", dbg, "store")
+        self.tb.start()
+        while dbg.num_messages() < 1:
+            time.sleep(0.1)
+        self.tb.stop()
+        self.tb.wait()
+        result_msg = dbg.get_message(0)
+        metadata = pmt.to_python(pmt.car(result_msg))
+        vector   = pmt.f32vector_elements(pmt.cdr(result_msg))
+        self.assertEqual(metadata, {'eggs': 42, 'spam': 23})
+        self.assertFloatTuplesAlmostEqual(tuple(vector), src_data)
+
+
 if __name__ == '__main__':
     gr_unittest.run(test_pdu, "test_pdu.xml")
+



reply via email to

[Prev in Thread] Current Thread [Next in Thread]