diff options
author | Tom Rondeau <tom@trondeau.com> | 2013-10-23 16:47:54 -0400 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2013-10-29 12:10:58 -0400 |
commit | 3e2335599d7656cf2b94c81f334499221ddd922b (patch) | |
tree | 19daf2ba501434fec37af85953721be7984666ff | |
parent | ecfac74f2a7117da540eb39ac46b903431598fed (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.t | 75 | ||||
-rw-r--r-- | gr-digital/lib/chunks_to_symbols_XX_impl.h.t | 6 | ||||
-rwxr-xr-x | gr-digital/python/digital/qa_chunks_to_symbols.py | 53 |
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") |