[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] [gnuradio] 01/02: blocks: added endianness toggle to r
From: |
git |
Subject: |
[Commit-gnuradio] [gnuradio] 01/02: blocks: added endianness toggle to repack bits. |
Date: |
Mon, 29 Dec 2014 18:30:12 +0000 (UTC) |
This is an automated email from the git hooks/post-receive script.
trondeau pushed a commit to branch master
in repository gnuradio.
commit ccebbe0a028158df250aae02c1dd893dd1551dda
Author: Tom Rondeau <address@hidden>
Date: Mon Dec 29 13:07:03 2014 -0500
blocks: added endianness toggle to repack bits.
---
gr-blocks/grc/blocks_repack_bits_bb.xml | 27 ++++-
gr-blocks/include/gnuradio/blocks/repack_bits_bb.h | 6 +-
gr-blocks/lib/repack_bits_bb_impl.cc | 115 ++++++++++++++-------
gr-blocks/lib/repack_bits_bb_impl.h | 5 +-
gr-blocks/python/blocks/qa_repack_bits_bb.py | 53 +++++++++-
5 files changed, 164 insertions(+), 42 deletions(-)
diff --git a/gr-blocks/grc/blocks_repack_bits_bb.xml
b/gr-blocks/grc/blocks_repack_bits_bb.xml
index 4ad5ec6..7931132 100644
--- a/gr-blocks/grc/blocks_repack_bits_bb.xml
+++ b/gr-blocks/grc/blocks_repack_bits_bb.xml
@@ -2,30 +2,36 @@
<name>Repack Bits</name>
<key>blocks_repack_bits_bb</key>
<import>from gnuradio import blocks</import>
- <make>blocks.repack_bits_bb($k, $l, $len_tag_key, $align_output)</make>
+ <make>blocks.repack_bits_bb($k, $l, $len_tag_key, $align_output,
$endianness)</make>
+
<param>
<name>Bits per input byte</name>
<key>k</key>
<value>1</value>
<type>int</type>
</param>
+
<param>
<name>Bits per output byte</name>
<key>l</key>
<value>8</value>
<type>int</type>
</param>
+
<param>
<name>Length Tag Key</name>
<key>len_tag_key</key>
<value>""</value>
<type>string</type>
+ <hide>part</hide>
</param>
+
<param>
<name>Packet Alignment</name>
<key>align_output</key>
<value>False</value>
<type>enum</type>
+ <hide>part</hide>
<option>
<name>Output</name>
<key>True</key>
@@ -35,10 +41,29 @@
<key>False</key>
</option>
</param>
+
+
+ <param>
+ <name>Endianness</name>
+ <key>endianness</key>
+ <value>gr.GR_LSB_FIRST</value>
+ <type>int</type>
+ <hide>part</hide>
+ <option>
+ <name>MSB</name>
+ <key>gr.GR_MSB_FIRST</key>
+ </option>
+ <option>
+ <name>LSB</name>
+ <key>gr.GR_LSB_FIRST</key>
+ </option>
+ </param>
+
<sink>
<name>in</name>
<type>byte</type>
</sink>
+
<source>
<name>out</name>
<type>byte</type>
diff --git a/gr-blocks/include/gnuradio/blocks/repack_bits_bb.h
b/gr-blocks/include/gnuradio/blocks/repack_bits_bb.h
index e094e68..83bd771 100644
--- a/gr-blocks/include/gnuradio/blocks/repack_bits_bb.h
+++ b/gr-blocks/include/gnuradio/blocks/repack_bits_bb.h
@@ -25,6 +25,7 @@
#include <gnuradio/blocks/api.h>
#include <gnuradio/tagged_stream_block.h>
+#include <gnuradio/endianness.h>
namespace gr {
namespace blocks {
@@ -75,12 +76,13 @@ namespace gr {
* \param tsb_tag_key If not empty, this is the key for the length tag.
* \param align_output If tsb_tag_key is given, this controls if the
input
* or the output is aligned.
+ * \param endianness The endianness of the output data stream (LSB or
MSB).
*/
- static sptr make(int k, int l=8, const std::string &tsb_tag_key="", bool
align_output=false);
+ static sptr make(int k, int l=8, const std::string &tsb_tag_key="",
+ bool align_output=false, endianness_t
endianness=GR_LSB_FIRST);
};
} // namespace blocks
} // namespace gr
#endif /* INCLUDED_BLOCKS_REPACK_BITS_BB_H */
-
diff --git a/gr-blocks/lib/repack_bits_bb_impl.cc
b/gr-blocks/lib/repack_bits_bb_impl.cc
index af83187..de61bf4 100644
--- a/gr-blocks/lib/repack_bits_bb_impl.cc
+++ b/gr-blocks/lib/repack_bits_bb_impl.cc
@@ -31,20 +31,25 @@ namespace gr {
namespace blocks {
repack_bits_bb::sptr
- repack_bits_bb::make(int k, int l, const std::string &len_tag_key, bool
align_output)
+ repack_bits_bb::make(int k, int l, const std::string &len_tag_key,
+ bool align_output, endianness_t endianness)
{
- return gnuradio::get_initial_sptr (new repack_bits_bb_impl(k, l,
len_tag_key, align_output));
+ return gnuradio::get_initial_sptr
+ (new repack_bits_bb_impl(k, l, len_tag_key,
+ align_output, endianness));
}
- repack_bits_bb_impl::repack_bits_bb_impl(int k, int l, const std::string
&len_tag_key, bool align_output)
+ repack_bits_bb_impl::repack_bits_bb_impl(int k, int l, const std::string
&len_tag_key,
+ bool align_output, endianness_t
endianness)
: tagged_stream_block("repack_bits_bb",
- io_signature::make(1, 1, sizeof (char)),
- io_signature::make(1, 1, sizeof (char)),
- len_tag_key),
- d_k(k), d_l(l),
- d_packet_mode(!len_tag_key.empty()),
- d_in_index(0), d_out_index(0),
- d_align_output(align_output)
+ io_signature::make(1, 1, sizeof(char)),
+ io_signature::make(1, 1, sizeof(char)),
+ len_tag_key),
+ d_k(k), d_l(l),
+ d_packet_mode(!len_tag_key.empty()),
+ d_in_index(0), d_out_index(0),
+ d_align_output(align_output),
+ d_endianness(endianness)
{
if (d_k > 8 || d_k < 1 || d_l > 8 || d_l < 1) {
throw std::invalid_argument("k and l must be in [1, 8]");
@@ -88,31 +93,70 @@ namespace gr {
int n_read = 0;
int n_written = 0;
- while(n_written < bytes_to_write && n_read < ninput_items[0]) {
- if (d_out_index == 0) { // Starting a fresh byte
- out[n_written] = 0;
- }
- out[n_written] |= ((in[n_read] >> d_in_index) & 0x01) << d_out_index;
-
- d_in_index = (d_in_index + 1) % d_k;
- d_out_index = (d_out_index + 1) % d_l;
- if (d_in_index == 0) {
- n_read++;
- d_in_index = 0;
- }
- if (d_out_index == 0) {
- n_written++;
- d_out_index = 0;
- }
- }
-
- if (d_packet_mode) {
- if (d_out_index) {
- n_written++;
- d_out_index = 0;
- }
- } else {
- consume_each(n_read);
+ switch(d_endianness) {
+ case GR_LSB_FIRST:
+ while(n_written < bytes_to_write && n_read < ninput_items[0]) {
+ if(d_out_index == 0) { // Starting a fresh byte
+ out[n_written] = 0;
+ }
+ out[n_written] |= ((in[n_read] >> d_in_index) & 0x01) << d_out_index;
+
+ d_in_index = (d_in_index + 1) % d_k;
+ d_out_index = (d_out_index + 1) % d_l;
+ if(d_in_index == 0) {
+ n_read++;
+ d_in_index = 0;
+ }
+ if(d_out_index == 0) {
+ n_written++;
+ d_out_index = 0;
+ }
+ }
+
+ if(d_packet_mode) {
+ if(d_out_index) {
+ n_written++;
+ d_out_index = 0;
+ }
+ }
+ else {
+ consume_each(n_read);
+ }
+ break;
+
+
+ case GR_MSB_FIRST:
+ while(n_written < bytes_to_write && n_read < ninput_items[0]) {
+ if(d_out_index == 0) { // Starting a fresh byte
+ out[n_written] = 0;
+ }
+ out[n_written] |= ((in[n_read] >> (d_k - 1 - d_in_index)) & 0x01) <<
(d_l - 1 - d_out_index);
+
+ d_in_index = (d_in_index + 1) % d_k;
+ d_out_index = (d_out_index + 1) % d_l;
+ if(d_in_index == 0) {
+ n_read++;
+ d_in_index = 0;
+ }
+ if(d_out_index == 0) {
+ n_written++;
+ d_out_index = 0;
+ }
+ }
+
+ if(d_packet_mode) {
+ if(d_out_index) {
+ n_written++;
+ d_out_index = 0;
+ }
+ }
+ else {
+ consume_each(n_read);
+ }
+ break;
+
+ default:
+ throw std::runtime_error("repack_bits_bb: unrecognized endianness
value.");
}
return n_written;
@@ -120,4 +164,3 @@ namespace gr {
} /* namespace blocks */
} /* namespace gr */
-
diff --git a/gr-blocks/lib/repack_bits_bb_impl.h
b/gr-blocks/lib/repack_bits_bb_impl.h
index ffb8349..8c57c74 100644
--- a/gr-blocks/lib/repack_bits_bb_impl.h
+++ b/gr-blocks/lib/repack_bits_bb_impl.h
@@ -37,12 +37,14 @@ namespace gr {
int d_in_index; // Current bit of input byte
int d_out_index; // Current bit of output byte
bool d_align_output; //! true if the output shall be aligned, false if
the input shall be aligned
+ endianness_t d_endianness;
protected:
int calculate_output_stream_length(const gr_vector_int &ninput_items);
public:
- repack_bits_bb_impl(int k, int l, const std::string &len_tag_key, bool
align_output);
+ repack_bits_bb_impl(int k, int l, const std::string &len_tag_key,
+ bool align_output, endianness_t
endianness=GR_LSB_FIRST);
~repack_bits_bb_impl();
int work(int noutput_items,
@@ -55,4 +57,3 @@ namespace gr {
} // namespace gr
#endif /* INCLUDED_BLOCKS_REPACK_BITS_BB_IMPL_H */
-
diff --git a/gr-blocks/python/blocks/qa_repack_bits_bb.py
b/gr-blocks/python/blocks/qa_repack_bits_bb.py
index 10880b1..50e1506 100755
--- a/gr-blocks/python/blocks/qa_repack_bits_bb.py
+++ b/gr-blocks/python/blocks/qa_repack_bits_bb.py
@@ -46,6 +46,19 @@ class qa_repack_bits_bb (gr_unittest.TestCase):
self.tb.run ()
self.assertEqual(sink.data(), expected_data)
+ def test_001_simple_msb (self):
+ """ Very simple test, 2 bits -> 1 with MSB set """
+ src_data = (0b11, 0b01, 0b10)
+ expected_data = (0b1, 0b1, 0b0, 0b1, 0b1, 0b0)
+ k = 2
+ l = 1
+ src = blocks.vector_source_b(src_data, False, 1)
+ repack = blocks.repack_bits_bb(k, l, "", False, gr.GR_MSB_FIRST)
+ sink = blocks.vector_sink_b()
+ self.tb.connect(src, repack, sink)
+ self.tb.run ()
+ self.assertEqual(sink.data(), expected_data)
+
def test_002_three (self):
""" 8 -> 3 """
src_data = (0b11111101, 0b11111111, 0b11111111)
@@ -59,6 +72,32 @@ class qa_repack_bits_bb (gr_unittest.TestCase):
self.tb.run ()
self.assertEqual(sink.data(), expected_data)
+ def test_002_three (self):
+ """ 8 -> 3 """
+ src_data = (0b11111101, 0b11111111, 0b11111111)
+ expected_data = (0b101,) + (0b111,) * 7
+ k = 8
+ l = 3
+ src = blocks.vector_source_b(src_data, False, 1)
+ repack = blocks.repack_bits_bb(k, l)
+ sink = blocks.vector_sink_b()
+ self.tb.connect(src, repack, sink)
+ self.tb.run ()
+ self.assertEqual(sink.data(), expected_data)
+
+ def test_002_three_msb (self):
+ """ 8 -> 3 """
+ src_data = (0b11111101, 0b11111111, 0b11111111)
+ expected_data = (0b111,) + (0b111,) + (0b011,) + (0b111,) * 5
+ k = 8
+ l = 3
+ src = blocks.vector_source_b(src_data, False, 1)
+ repack = blocks.repack_bits_bb(k, l, "", False, gr.GR_MSB_FIRST)
+ sink = blocks.vector_sink_b()
+ self.tb.connect(src, repack, sink)
+ self.tb.run ()
+ self.assertEqual(sink.data(), expected_data)
+
def test_003_lots_of_bytes (self):
""" Lots and lots of bytes, multiple packer stages """
src_data = tuple([random.randint(0, 255) for x in range(3*5*7*8 * 10)])
@@ -72,6 +111,19 @@ class qa_repack_bits_bb (gr_unittest.TestCase):
self.tb.run ()
self.assertEqual(sink.data(), src_data)
+ def test_003_lots_of_bytes_msb (self):
+ """ Lots and lots of bytes, multiple packer stages """
+ src_data = tuple([random.randint(0, 255) for x in range(3*5*7*8 * 10)])
+ src = blocks.vector_source_b(src_data, False, 1)
+ repack1 = blocks.repack_bits_bb(8, 3, "", False, gr.GR_MSB_FIRST)
+ repack2 = blocks.repack_bits_bb(3, 5, "", False, gr.GR_MSB_FIRST)
+ repack3 = blocks.repack_bits_bb(5, 7, "", False, gr.GR_MSB_FIRST)
+ repack4 = blocks.repack_bits_bb(7, 8, "", False, gr.GR_MSB_FIRST)
+ sink = blocks.vector_sink_b()
+ self.tb.connect(src, repack1, repack2, repack3, repack4, sink)
+ self.tb.run ()
+ self.assertEqual(sink.data(), src_data)
+
def test_004_three_with_tags (self):
""" 8 -> 3 """
src_data = (0b11111101, 0b11111111)
@@ -112,4 +164,3 @@ class qa_repack_bits_bb (gr_unittest.TestCase):
if __name__ == '__main__':
gr_unittest.run(qa_repack_bits_bb, "qa_repack_bits_bb.xml")
-