summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rondeau <tom@trondeau.com>2013-10-23 16:47:54 -0400
committerTom Rondeau <tom@trondeau.com>2013-10-29 12:10:58 -0400
commit3e2335599d7656cf2b94c81f334499221ddd922b (patch)
tree19daf2ba501434fec37af85953721be7984666ff
parentecfac74f2a7117da540eb39ac46b903431598fed (diff)
blocks: added message handler to reset symbol map of chuncks_to_symbols.
-rw-r--r--gr-digital/lib/chunks_to_symbols_XX_impl.cc.t75
-rw-r--r--gr-digital/lib/chunks_to_symbols_XX_impl.h.t6
-rwxr-xr-xgr-digital/python/digital/qa_chunks_to_symbols.py53
3 files changed, 123 insertions, 11 deletions
diff --git a/gr-digital/lib/chunks_to_symbols_XX_impl.cc.t b/gr-digital/lib/chunks_to_symbols_XX_impl.cc.t
index 3ecb8c17e5..fd334b99d7 100644
--- a/gr-digital/lib/chunks_to_symbols_XX_impl.cc.t
+++ b/gr-digital/lib/chunks_to_symbols_XX_impl.cc.t
@@ -28,16 +28,17 @@
#include "@NAME@.h"
#include <gnuradio/io_signature.h>
+#include <gnuradio/tag_checker.h>
#include <assert.h>
namespace gr {
namespace digital {
-
+
@BASE_NAME@::sptr
@BASE_NAME@::make(const std::vector<@O_TYPE@> &symbol_table, const int D)
{
return gnuradio::get_initial_sptr
- (new @IMPL_NAME@(symbol_table, D));
+ (new @IMPL_NAME@(symbol_table, D));
}
@IMPL_NAME@::@IMPL_NAME@(const std::vector<@O_TYPE@> &symbol_table, const int D)
@@ -47,12 +48,53 @@ namespace gr {
D),
d_D(D), d_symbol_table(symbol_table)
{
+ message_port_register_in(pmt::mp("set_symbol_table"));
+ set_msg_handler(
+ pmt::mp("set_symbol_table"),
+ boost::bind(&@IMPL_NAME@::handle_set_symbol_table,
+ this, _1));
}
@IMPL_NAME@::~@IMPL_NAME@()
{
}
+
+ void
+ @IMPL_NAME@::set_vector_from_pmt(std::vector<gr_complex> &symbol_table, pmt::pmt_t &symbol_table_pmt) {
+ symbol_table.resize(0);
+ for (unsigned int i=0; i<pmt::length(symbol_table_pmt); i++) {
+ symbol_table.push_back(pmt::c32vector_ref(symbol_table_pmt, i));
+ }
+ }
+
+ void
+ @IMPL_NAME@::set_vector_from_pmt(std::vector<float> &symbol_table, pmt::pmt_t &symbol_table_pmt) {
+ symbol_table.resize(0);
+ for (unsigned int i=0; i<pmt::length(symbol_table_pmt); i++) {
+ float f = pmt::f32vector_ref(symbol_table_pmt, i);
+ symbol_table.push_back(f);
+ }
+ }
+
+ void
+ @IMPL_NAME@::handle_set_symbol_table(pmt::pmt_t symbol_table_pmt)
+ {
+ std::vector<@O_TYPE@> symbol_table;
+ set_vector_from_pmt(symbol_table, symbol_table_pmt);
+ set_symbol_table(symbol_table);
+ }
+
+
+ void
+ @IMPL_NAME@::set_symbol_table(std::vector<@O_TYPE@> &symbol_table)
+ {
+ d_symbol_table.resize(0);
+ for (unsigned int i=0; i<symbol_table.size(); i++) {
+ d_symbol_table.push_back(symbol_table[i]);
+ }
+ }
+
int
@IMPL_NAME@::work(int noutput_items,
gr_vector_const_void_star &input_items,
@@ -63,15 +105,26 @@ namespace gr {
int nstreams = input_items.size();
for(int m = 0; m < nstreams; m++) {
- const @I_TYPE@ *in = (@I_TYPE@*)input_items[m];
- @O_TYPE@ *out = (@O_TYPE@*)output_items[m];
-
- // per stream processing
- for(int i = 0; i < noutput_items / d_D; i++) {
- assert(((unsigned int)in[i]*d_D+d_D) <= d_symbol_table.size());
- memcpy(out, &d_symbol_table[(unsigned int)in[i]*d_D], d_D*sizeof(@O_TYPE@));
- out+=d_D;
- }
+ const @I_TYPE@ *in = (@I_TYPE@*)input_items[m];
+ @O_TYPE@ *out = (@O_TYPE@*)output_items[m];
+
+ std::vector<tag_t> tags;
+ get_tags_in_range(tags, m, nitems_read(m), nitems_read(m)+noutput_items/d_D);
+ tag_checker tchecker(tags);
+
+ // per stream processing
+ for(int i = 0; i < noutput_items / d_D; i++) {
+
+ std::vector<tag_t> tags_now;
+ tchecker.get_tags(tags_now, i+nitems_read(m));
+ for (unsigned int j=0; j<tags_now.size(); j++) {
+ tag_t tag = tags_now[j];
+ dispatch_msg(tag.key, tag.value);
+ }
+ assert(((unsigned int)in[i]*d_D+d_D) <= d_symbol_table.size());
+ memcpy(out, &d_symbol_table[(unsigned int)in[i]*d_D], d_D*sizeof(@O_TYPE@));
+ out+=d_D;
+ }
}
return noutput_items;
}
diff --git a/gr-digital/lib/chunks_to_symbols_XX_impl.h.t b/gr-digital/lib/chunks_to_symbols_XX_impl.h.t
index 0e80754d10..031bb6947c 100644
--- a/gr-digital/lib/chunks_to_symbols_XX_impl.h.t
+++ b/gr-digital/lib/chunks_to_symbols_XX_impl.h.t
@@ -40,6 +40,12 @@ namespace gr {
@IMPL_NAME@(const std::vector<@O_TYPE@> &symbol_table, const int D = 1);
~@IMPL_NAME@();
+
+ void set_vector_from_pmt(std::vector<float> &symbol_table, pmt::pmt_t &symbol_table_pmt);
+ void set_vector_from_pmt(std::vector<gr_complex> &symbol_table, pmt::pmt_t &symbol_table_pmt);
+
+ void handle_set_symbol_table(pmt::pmt_t symbol_table_pmt);
+ void set_symbol_table(std::vector<@O_TYPE@> &symbol_table);
int D() const { return d_D; }
std::vector<@O_TYPE@> symbol_table() const { return d_symbol_table; }
diff --git a/gr-digital/python/digital/qa_chunks_to_symbols.py b/gr-digital/python/digital/qa_chunks_to_symbols.py
index 25798f33e5..d6a9566807 100755
--- a/gr-digital/python/digital/qa_chunks_to_symbols.py
+++ b/gr-digital/python/digital/qa_chunks_to_symbols.py
@@ -20,6 +20,7 @@
# Boston, MA 02110-1301, USA.
#
+import pmt
from gnuradio import gr, gr_unittest, digital, blocks
class test_chunks_to_symbols(gr_unittest.TestCase):
@@ -135,5 +136,57 @@ class test_chunks_to_symbols(gr_unittest.TestCase):
actual_result = dst.data()
self.assertEqual(expected_result, actual_result)
+ def test_sf_tag(self):
+ constA = [-3.0, -1.0, 1.0, 3]
+ constB = [12.0, -12.0, 6.0, -6]
+ src_data = (0, 1, 2, 3, 3, 2, 1, 0)
+ expected_result = (-3, -1, 1, 3,
+ -6, 6, -12, 12)
+ first_tag = gr.tag_t()
+ first_tag.key = pmt.intern("set_symbol_table")
+ first_tag.value = pmt.init_f32vector(len(constA), constA)
+ first_tag.offset = 0
+ second_tag = gr.tag_t()
+ second_tag.key = pmt.intern("set_symbol_table")
+ second_tag.value = pmt.init_f32vector(len(constB), constB)
+ second_tag.offset = 4
+
+ src = blocks.vector_source_s(src_data, False, 1, [first_tag, second_tag])
+ op = digital.chunks_to_symbols_sf(constB)
+
+ dst = blocks.vector_sink_f()
+ self.tb.connect(src, op)
+ self.tb.connect(op, dst)
+ self.tb.run()
+
+ actual_result = dst.data()
+ self.assertEqual(expected_result, actual_result)
+
+ def test_sc_tag(self):
+ constA = [-3.0+1j, -1.0-1j, 1.0+1j, 3-1j]
+ constB = [12.0+1j, -12.0-1j, 6.0+1j, -6-1j]
+ src_data = (0, 1, 2, 3, 3, 2, 1, 0)
+ expected_result = (-3+1j, -1-1j, 1+1j, 3-1j,
+ -6-1j, 6+1j, -12-1j, 12+1j)
+ first_tag = gr.tag_t()
+ first_tag.key = pmt.intern("set_symbol_table")
+ first_tag.value = pmt.init_c32vector(len(constA), constA)
+ first_tag.offset = 0
+ second_tag = gr.tag_t()
+ second_tag.key = pmt.intern("set_symbol_table")
+ second_tag.value = pmt.init_c32vector(len(constB), constB)
+ second_tag.offset = 4
+
+ src = blocks.vector_source_s(src_data, False, 1, [first_tag, second_tag])
+ op = digital.chunks_to_symbols_sc(constB)
+
+ dst = blocks.vector_sink_c()
+ self.tb.connect(src, op)
+ self.tb.connect(op, dst)
+ self.tb.run()
+
+ actual_result = dst.data()
+ self.assertEqual(expected_result, actual_result)
+
if __name__ == '__main__':
gr_unittest.run(test_chunks_to_symbols, "test_chunks_to_symbols.xml")