commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] [gnuradio] 03/04: runtime: adds a gr.tag_utils.python_


From: git
Subject: [Commit-gnuradio] [gnuradio] 03/04: runtime: adds a gr.tag_utils.python_to_tag to convert formatted dicts/lists/tuples to tag_t objects.
Date: Sun, 23 Feb 2014 22:19:45 +0000 (UTC)

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

trondeau pushed a commit to branch master
in repository gnuradio.

commit ed7d84afba825aaabe7d940b135286c801234538
Author: Tom Rondeau <address@hidden>
Date:   Sun Feb 23 13:58:46 2014 -0500

    runtime: adds a gr.tag_utils.python_to_tag to convert formatted 
dicts/lists/tuples to tag_t objects.
    
    blocks: adds documentation to vector_source block on how to use the 
python_to_tag to emit tags with the data stream.
---
 .../python/gnuradio/gr/qa_tag_utils.py             | 30 ++++++++++
 gnuradio-runtime/python/gnuradio/gr/tag_utils.py   | 66 ++++++++++++++++++++++
 .../include/gnuradio/blocks/vector_source_X.h.t    | 19 ++++++-
 3 files changed, 114 insertions(+), 1 deletion(-)

diff --git a/gnuradio-runtime/python/gnuradio/gr/qa_tag_utils.py 
b/gnuradio-runtime/python/gnuradio/gr/qa_tag_utils.py
index 56797a4..1a08ac5 100755
--- a/gnuradio-runtime/python/gnuradio/gr/qa_tag_utils.py
+++ b/gnuradio-runtime/python/gnuradio/gr/qa_tag_utils.py
@@ -47,6 +47,36 @@ class test_tag_utils (gr_unittest.TestCase):
         self.assertEqual(pt.value, 23)
         self.assertEqual(pt.offset, 10)
 
+    def test_002(self):
+        offset = 10
+        key = pmt.string_to_symbol('key')
+        value = pmt.from_long(23)
+        srcid = pmt.from_bool(False)
+
+        format_dict = {'offset': offset,
+                       'key': key,
+                       'value': value,
+                       'srcid': srcid}
+        format_list = [offset, key, value, srcid]
+        format_tuple = (offset, key, value, srcid)
+
+        t_dict = gr.python_to_tag(format_dict)
+        t_list = gr.python_to_tag(format_list)
+        t_tuple = gr.python_to_tag(format_tuple)
+
+        self.assertTrue(pmt.equal(t_dict.key, key))
+        self.assertTrue(pmt.equal(t_dict.value, value))
+        self.assertEqual(t_dict.offset, offset)
+
+        self.assertTrue(pmt.equal(t_list.key, key))
+        self.assertTrue(pmt.equal(t_list.value, value))
+        self.assertEqual(t_list.offset, offset)
+
+        self.assertTrue(pmt.equal(t_tuple.key, key))
+        self.assertTrue(pmt.equal(t_tuple.value, value))
+        self.assertEqual(t_tuple.offset, offset)
+
+
 
 if __name__ == '__main__':
     print 'hi'
diff --git a/gnuradio-runtime/python/gnuradio/gr/tag_utils.py 
b/gnuradio-runtime/python/gnuradio/gr/tag_utils.py
index ad80bff..cbca9d4 100644
--- a/gnuradio-runtime/python/gnuradio/gr/tag_utils.py
+++ b/gnuradio-runtime/python/gnuradio/gr/tag_utils.py
@@ -28,4 +28,70 @@ def tag_to_pmt(tag):
     newtag.srcid = pmt.from_python(tag.srcid)
     return newtag
 
+def python_to_tag(tag_struct):
+    """
+    Convert a Python list/tuple/dictionary to a stream tag.
+
+    When using a list or tuple format, this function expects the format:
+      tag_struct[0] --> tag's offset (as an integer)
+      tag_struct[1] --> tag's key (as a PMT)
+      tag_struct[2] --> tag's value (as a PMT)
+      tag_struct[3] --> tag's srcid (as a PMT)
+
+    When using a dictionary, we specify the dictionary keys using:
+      tag_struct['offset'] --> tag's offset (as an integer)
+      tag_struct['key'] --> tag's key (as a PMT)
+      tag_struct['value'] --> tag's value (as a PMT)
+      tag_struct['srcid'] --> tag's srcid (as a PMT)
+
+    If the function can take the Python object and successfully
+    construct a tag, it will return the tag. Otherwise, it will return
+    None.
+    """
+    good = False
+    tag = gr.tag_t()
+    if(type(tag_struct) == dict):
+        if(tag_struct.has_key('offset')):
+            if(isinstance(tag_struct['offset'], (int,long))):
+                tag.offset = tag_struct['offset']
+                good = True
+
+        if(tag_struct.has_key('key')):
+            if(isinstance(tag_struct['key'], pmt.pmt_swig.swig_int_ptr)):
+                tag.key = tag_struct['key']
+                good = True
+
+        if(tag_struct.has_key('value')):
+            if(isinstance(tag_struct['value'], pmt.pmt_swig.swig_int_ptr)):
+                tag.value = tag_struct['value']
+                good = True
+
+        if(tag_struct.has_key('srcid')):
+            if(isinstance(tag_struct['srcid'], pmt.pmt_swig.swig_int_ptr)):
+                tag.srcid = tag_struct['srcid']
+                good = True
+
+    elif(type(tag_struct) == list or type(tag_struct) == tuple):
+        if(len(tag_struct) == 4):
+            if(isinstance(tag_struct[0], (int,long))):
+                tag.offset = tag_struct[0]
+                good = True
+
+            if(isinstance(tag_struct[1], pmt.pmt_swig.swig_int_ptr)):
+                tag.key = tag_struct[1]
+                good = True
+
+            if(isinstance(tag_struct[2], pmt.pmt_swig.swig_int_ptr)):
+                tag.value = tag_struct[2]
+                good = True
+
+            if(isinstance(tag_struct[3], pmt.pmt_swig.swig_int_ptr)):
+                tag.srcid = tag_struct[3]
+                good = True
+
+    if(good):
+        return tag
+    else:
+        return None
+
 
diff --git a/gr-blocks/include/gnuradio/blocks/vector_source_X.h.t 
b/gr-blocks/include/gnuradio/blocks/vector_source_X.h.t
index 9751514..d5298e8 100644
--- a/gr-blocks/include/gnuradio/blocks/vector_source_X.h.t
+++ b/gr-blocks/include/gnuradio/blocks/vector_source_X.h.t
@@ -32,7 +32,7 @@ namespace gr {
   namespace blocks {
 
     /*!
-     * \brief Source that streams @TYPE@ items based on the input \data vector.
+     * \brief Source that streams @TYPE@ items based on the input \p data 
vector.
      * \ingroup misc_blk
      *
      * \details
@@ -45,6 +45,23 @@ namespace gr {
      * The vector source can also produce stream tags with the
      * data. Pass in a vector of gr::tag_t objects and they will be
      * emitted based on the specified offset of the tag.
+     *
+     * GNU Radio provides a utility Python module in gr.tag_utils to
+     * convert between tags and Python objects:
+     * gr.tag_utils.python_to_tag.
+     *
+     * We can create tags as Python lists (or tuples) using the list
+     * structure [int offset, pmt key, pmt value, pmt srcid]. It is
+     * important to define the list/tuple with the values in the
+     * correct order and with the correct data type. A python
+     * dictionary can also be used using the keys: "offset", "key",
+     * "value", and "srcid" with the same data types as for the lists.
+     *
+     * When given a list of tags, the vector source will emit the tags
+     * repeatedly by updating the offset relative to the vector stream
+     * length. That is, if the vector has 500 items and a tag has an
+     * offset of 0, that tag will be placed on item 0, 500, 1000,
+     * 1500, etc.
      */
     class BLOCKS_API @NAME@ : virtual public sync_block
     {



reply via email to

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