summaryrefslogtreecommitdiff
path: root/gr-digital/lib/additive_scrambler_bb_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/lib/additive_scrambler_bb_impl.cc')
-rw-r--r--gr-digital/lib/additive_scrambler_bb_impl.cc61
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);
}
}