diff options
Diffstat (limited to 'gr-digital/lib/additive_scrambler_bb_impl.cc')
-rw-r--r-- | gr-digital/lib/additive_scrambler_bb_impl.cc | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/gr-digital/lib/additive_scrambler_bb_impl.cc b/gr-digital/lib/additive_scrambler_bb_impl.cc index 8f2229e6b6..96e1fbbc25 100644 --- a/gr-digital/lib/additive_scrambler_bb_impl.cc +++ b/gr-digital/lib/additive_scrambler_bb_impl.cc @@ -31,23 +31,35 @@ namespace gr { namespace digital { additive_scrambler_bb::sptr - additive_scrambler_bb::make(int mask, int seed, int len, int count) + additive_scrambler_bb::make (int mask, int seed, + int len, int count, + int bits_per_byte, + const std::string &reset_tag_key) { return gnuradio::get_initial_sptr(new additive_scrambler_bb_impl - (mask, seed, len, count)); + (mask, seed, len, count, bits_per_byte, reset_tag_key)); } additive_scrambler_bb_impl::additive_scrambler_bb_impl(int mask, int seed, int len, - int count) + int count, + int bits_per_byte, + const std::string &reset_tag_key) : sync_block("additive_scrambler_bb", io_signature::make(1, 1, sizeof(unsigned char)), io_signature::make(1, 1, sizeof(unsigned char))), d_lfsr(mask, seed, len), - d_count(count), - d_bits(0), d_len(len), d_seed(seed) + d_count(reset_tag_key.empty() ? count : -1), + d_bytes(0), d_len(len), d_seed(seed), + d_bits_per_byte(bits_per_byte), d_reset_tag_key(pmt::string_to_symbol(reset_tag_key)) { + if (d_count < -1) { + throw std::invalid_argument("count must be non-negative!"); + } + if (d_bits_per_byte < 1 || d_bits_per_byte > 8) { + throw std::invalid_argument("bits_per_byte must be in [1, 8]"); + } } additive_scrambler_bb_impl::~additive_scrambler_bb_impl() @@ -78,6 +90,28 @@ namespace gr { return d_count; } + int additive_scrambler_bb_impl::_get_next_reset_index(int noutput_items, int last_reset_index /* = -1 */) + { + int reset_index = noutput_items; // This is a value that gets never reached in the for loop + if (d_count == -1) { + std::vector<gr::tag_t> tags; + get_tags_in_range(tags, 0, nitems_read(0), nitems_read(0)+noutput_items, d_reset_tag_key); + for (unsigned i = 0; i < tags.size(); i++) { + int reset_pos = tags[i].offset - nitems_read(0); + if (reset_pos < reset_index && reset_pos > last_reset_index) { + reset_index = reset_pos; + }; + } + } else { + if (last_reset_index == -1) { + reset_index = d_count - d_bytes; + } else { + reset_index = last_reset_index + d_count; + } + } + return reset_index; + } + int additive_scrambler_bb_impl::work(int noutput_items, gr_vector_const_void_star &input_items, @@ -85,14 +119,19 @@ namespace gr { { const unsigned char *in = (const unsigned char *)input_items[0]; 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++) { - out[i] = in[i]^d_lfsr.next_bit(); - if(d_count > 0) { - if(++d_bits == d_count) { - d_lfsr.reset(); - d_bits = 0; - } + 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); } } |