summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@kit.edu>2013-11-02 16:01:46 +0100
committerMartin Braun <martin.braun@kit.edu>2013-11-03 19:20:56 +0100
commit909251e6082c83a3211369a494152199bbaef00a (patch)
treec2794ae7fe2f9280a7ce81576612daf5f03f9621
parenta4225692e6f3db974dcbda9d93ede13a561029a6 (diff)
digital: OFDM Tx hier block preserves head tag position
-rw-r--r--gr-digital/python/digital/ofdm_txrx.py27
-rwxr-xr-xgr-digital/python/digital/qa_ofdm_txrx.py28
2 files changed, 37 insertions, 18 deletions
diff --git a/gr-digital/python/digital/ofdm_txrx.py b/gr-digital/python/digital/ofdm_txrx.py
index 06e375e3d6..b04c42cbfa 100644
--- a/gr-digital/python/digital/ofdm_txrx.py
+++ b/gr-digital/python/digital/ofdm_txrx.py
@@ -194,7 +194,11 @@ class ofdm_tx(gr.hier_block2):
scramble_header=scramble_bits
)
header_gen = digital.packet_headergenerator_bb(formatter_object.base(), self.packet_length_tag_key)
- header_payload_mux = blocks.tagged_stream_mux(gr.sizeof_gr_complex*1, self.packet_length_tag_key)
+ header_payload_mux = blocks.tagged_stream_mux(
+ itemsize=gr.sizeof_gr_complex*1,
+ lengthtagname=self.packet_length_tag_key,
+ tag_preserve_head_pos=1 # Head tags on the payload stream stay on the head
+ )
self.connect(
self,
crc,
@@ -212,17 +216,18 @@ class ofdm_tx(gr.hier_block2):
self.scramble_seed,
7,
0, # Don't reset after fixed length (let the reset tag do that)
- bits_per_byte=bps_payload,
+ bits_per_byte=8, # This is before unpacking
reset_tag_key=self.packet_length_tag_key
)
+ payload_unpack = blocks.repack_bits_bb(
+ 8, # Unpack 8 bits per byte
+ bps_payload,
+ self.packet_length_tag_key
+ )
self.connect(
crc,
payload_scrambler,
- blocks.repack_bits_bb(
- 8, # Unpack 8 bits per byte
- bps_payload,
- self.packet_length_tag_key
- ),
+ payload_unpack,
payload_mod,
(header_payload_mux, 1)
)
@@ -418,10 +423,10 @@ class ofdm_rx(gr.hier_block2):
self.scramble_seed,
7,
0, # Don't reset after fixed length
- bits_per_byte=bps_payload,
+ bits_per_byte=8, # This is after packing
reset_tag_key=self.packet_length_tag_key
)
- repack = blocks.repack_bits_bb(bps_payload, 8, self.packet_length_tag_key, True)
+ payload_pack = blocks.repack_bits_bb(bps_payload, 8, self.packet_length_tag_key, True)
self.crc = digital.crc32_bb(True, self.packet_length_tag_key)
self.connect(
(hpd, 1),
@@ -429,7 +434,7 @@ class ofdm_rx(gr.hier_block2):
payload_eq,
payload_serializer,
payload_demod,
- repack,
+ payload_pack,
self.payload_descrambler,
self.crc,
self
@@ -440,7 +445,7 @@ class ofdm_rx(gr.hier_block2):
self.connect(payload_eq, blocks.file_sink(gr.sizeof_gr_complex*fft_len, 'post-payload-eq.dat'))
self.connect(payload_serializer, blocks.file_sink(gr.sizeof_gr_complex, 'post-payload-serializer.dat'))
self.connect(payload_demod, blocks.file_sink(1, 'post-payload-demod.dat'))
- self.connect(repack, blocks.file_sink(1, 'post-payload-repack.dat'))
+ self.connect(payload_pack, blocks.file_sink(1, 'post-payload-pack.dat'))
self.connect(crc, blocks.file_sink(1, 'post-payload-crc.dat'))
diff --git a/gr-digital/python/digital/qa_ofdm_txrx.py b/gr-digital/python/digital/qa_ofdm_txrx.py
index 6f5bd2ed10..ac267d2389 100755
--- a/gr-digital/python/digital/qa_ofdm_txrx.py
+++ b/gr-digital/python/digital/qa_ofdm_txrx.py
@@ -23,7 +23,11 @@
import random
import numpy
-from gnuradio import gr, gr_unittest, digital, blocks, channels
+import pmt
+from gnuradio import gr, gr_unittest
+from gnuradio import digital
+from gnuradio import blocks
+from gnuradio import channels
from gnuradio.digital.ofdm_txrx import ofdm_tx, ofdm_rx
from gnuradio.digital.utils import tagged_streams
@@ -31,10 +35,10 @@ from gnuradio.digital.utils import tagged_streams
LOG_DEBUG_INFO=False
class ofdm_tx_fg (gr.top_block):
- def __init__(self, data, len_tag_key, scramble_bits=False):
+ def __init__(self, data, len_tag_key, scramble_bits=False, additional_tags=[]):
gr.top_block.__init__(self, "ofdm_tx")
tx_data, tags = tagged_streams.packets_to_vectors((data,), len_tag_key)
- src = blocks.vector_source_b(data, False, 1, tags)
+ src = blocks.vector_source_b(data, False, 1, tags + additional_tags)
self.tx = ofdm_tx(packet_length_tag_key=len_tag_key, debug_log=LOG_DEBUG_INFO, scramble_bits=scramble_bits)
self.sink = blocks.vector_sink_c()
self.connect(src, self.tx, self.sink)
@@ -69,16 +73,26 @@ class test_ofdm_txrx (gr_unittest.TestCase):
def test_001_tx (self):
""" Just make sure the Tx works in general """
+ # This tag gets put onto the first item of the transmit data,
+ # it should be transmitted first, too
+ timing_tag = gr.tag_t()
+ timing_tag.offset = 0
+ timing_tag.key = pmt.string_to_symbol('tx_timing')
+ timing_tag.value = pmt.to_pmt('now')
len_tag_key = 'frame_len'
n_bytes = 52
n_samples_expected = (numpy.ceil(1.0 * (n_bytes + 4) / 6) + 3) * 80
test_data = [random.randint(0, 255) for x in range(n_bytes)]
- tx_data, tags = tagged_streams.packets_to_vectors((test_data,), len_tag_key)
- src = blocks.vector_source_b(test_data, False, 1, tags)
- tx = ofdm_tx(packet_length_tag_key=len_tag_key)
- tx_fg = ofdm_tx_fg(test_data, len_tag_key)
+ tx_fg = ofdm_tx_fg(test_data, len_tag_key, additional_tags=[timing_tag,])
tx_fg.run()
self.assertEqual(len(tx_fg.get_tx_samples()), n_samples_expected)
+ tags_rx = [gr.tag_to_python(x) for x in tx_fg.sink.tags()]
+ tags_rx = sorted([(x.offset, x.key, x.value) for x in tags_rx])
+ tags_expected = [
+ (0, 'frame_len', n_samples_expected),
+ (0, 'tx_timing', 'now'),
+ ]
+ self.assertEqual(tags_rx, tags_expected)
def test_002_rx_only_noise(self):
""" Run the RX with only noise, check it doesn't crash