summaryrefslogtreecommitdiff
path: root/gr-digital
diff options
context:
space:
mode:
authorJohnathan Corgan <johnathan@corganlabs.com>2017-05-01 07:46:44 -0700
committerJohnathan Corgan <johnathan@corganlabs.com>2017-05-01 07:46:44 -0700
commita7e699fe51a89df96deb2b852fcf67f13b94d24f (patch)
tree16f922763e3621158147a618fa8bff889252554f /gr-digital
parent3c0d5d0eddb88ca7e1c0eee055765de9c6bc0259 (diff)
parentce64630d5ecb1186c6e857e84a51b831f5b86adf (diff)
Merge branch 'master' into next
Diffstat (limited to 'gr-digital')
-rw-r--r--gr-digital/lib/additive_scrambler_bb_impl.cc41
-rwxr-xr-xgr-digital/python/digital/qa_scrambler.py31
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")