diff options
author | Johnathan Corgan <johnathan@corganlabs.com> | 2017-05-01 07:46:44 -0700 |
---|---|---|
committer | Johnathan Corgan <johnathan@corganlabs.com> | 2017-05-01 07:46:44 -0700 |
commit | a7e699fe51a89df96deb2b852fcf67f13b94d24f (patch) | |
tree | 16f922763e3621158147a618fa8bff889252554f /gr-digital | |
parent | 3c0d5d0eddb88ca7e1c0eee055765de9c6bc0259 (diff) | |
parent | ce64630d5ecb1186c6e857e84a51b831f5b86adf (diff) |
Merge branch 'master' into next
Diffstat (limited to 'gr-digital')
-rw-r--r-- | gr-digital/lib/additive_scrambler_bb_impl.cc | 41 | ||||
-rwxr-xr-x | gr-digital/python/digital/qa_scrambler.py | 31 |
2 files changed, 60 insertions, 12 deletions
diff --git a/gr-digital/lib/additive_scrambler_bb_impl.cc b/gr-digital/lib/additive_scrambler_bb_impl.cc index 58a2455aa5..d1112ee5f4 100644 --- a/gr-digital/lib/additive_scrambler_bb_impl.cc +++ b/gr-digital/lib/additive_scrambler_bb_impl.cc @@ -121,18 +121,35 @@ namespace gr { unsigned char *out = (unsigned char *)output_items[0]; int reset_index = _get_next_reset_index(noutput_items); - for(int i = 0; i < noutput_items; i++) { - unsigned char scramble_byte = 0x00; - for (int k = 0; k < d_bits_per_byte; k++) { - scramble_byte ^= (d_lfsr.next_bit() << k); - } - out[i] = in[i] ^ scramble_byte; - d_bytes++; - if (i == reset_index) { - d_lfsr.reset(); - d_bytes = 0; - reset_index = _get_next_reset_index(noutput_items, reset_index); - } + if (d_count >= 0) { + for(int i = 0; i < noutput_items; i++) { + unsigned char scramble_byte = 0x00; + for (int k = 0; k < d_bits_per_byte; k++) { + scramble_byte ^= (d_lfsr.next_bit() << k); + } + out[i] = in[i] ^ scramble_byte; + d_bytes++; + if (i == reset_index) { + d_lfsr.reset(); + d_bytes = 0; + reset_index = _get_next_reset_index(noutput_items, reset_index); + } + } + } else { + for(int i = 0; i < noutput_items; i++) { + // Reset should occur at/before the item associated with the tag. + if (i == reset_index) { + d_lfsr.reset(); + d_bytes = 0; + reset_index = _get_next_reset_index(noutput_items, reset_index); + } + unsigned char scramble_byte = 0x00; + for (int k = 0; k < d_bits_per_byte; k++) { + scramble_byte ^= (d_lfsr.next_bit() << k); + } + out[i] = in[i] ^ scramble_byte; + d_bytes++; + } } return noutput_items; diff --git a/gr-digital/python/digital/qa_scrambler.py b/gr-digital/python/digital/qa_scrambler.py index 4d35879b1f..522b23245f 100755 --- a/gr-digital/python/digital/qa_scrambler.py +++ b/gr-digital/python/digital/qa_scrambler.py @@ -23,6 +23,17 @@ from gnuradio import gr, gr_unittest, digital, blocks import pmt +# See gr-digital/lib/additive_scrambler_bb_impl.cc for reference. +def additive_scramble_lfsr(mask, seed, reglen, bpb, data): + l = digital.lfsr(mask, seed, reglen) + out = [] + for d in data: + scramble_word = 0 + for i in xrange(0,bpb): + scramble_word ^= l.next_bit() << i + out.append(d ^ scramble_word) + return tuple(out) + class test_scrambler(gr_unittest.TestCase): def setUp(self): @@ -98,5 +109,25 @@ class test_scrambler(gr_unittest.TestCase): self.tb.run() self.assertEqual(src_data, dst.data()) + def test_additive_scrambler_tags_oneway(self): + src_data = range(0, 10) + reset_tag_key = 'reset_lfsr' + reset_tag1 = gr.tag_t() + reset_tag1.key = pmt.string_to_symbol(reset_tag_key) + reset_tag1.offset = 0 + reset_tag2 = gr.tag_t() + reset_tag2.key = pmt.string_to_symbol(reset_tag_key) + reset_tag2.offset = 10 + reset_tag3 = gr.tag_t() + reset_tag3.key = pmt.string_to_symbol(reset_tag_key) + reset_tag3.offset = 20 + src = blocks.vector_source_b(src_data * 3, False, 1, (reset_tag1, reset_tag2, reset_tag3)) + scrambler = digital.additive_scrambler_bb(0x8a, 0x7f, 7, 0, 8, reset_tag_key) + dst = blocks.vector_sink_b() + self.tb.connect(src, scrambler, dst) + self.tb.run() + expected_data = additive_scramble_lfsr(0x8a, 0x7f, 7, 8, src_data) + self.assertEqual(expected_data * 3, dst.data()) + if __name__ == '__main__': gr_unittest.run(test_scrambler, "test_scrambler.xml") |