diff options
author | Johnathan Corgan <johnathan@corganlabs.com> | 2016-05-01 21:29:03 -0700 |
---|---|---|
committer | Johnathan Corgan <johnathan@corganlabs.com> | 2016-05-01 21:29:03 -0700 |
commit | 75b6e340f82e59d00badeba70263e755075b49c0 (patch) | |
tree | a4423bf2b452e8a68550646f93090b8a02ef2a1f | |
parent | 2568e9d09d587ba9e210cafbdeaf3c0406a59d05 (diff) | |
parent | 729a30046691496680f5f3602ff355dece8f59e0 (diff) |
Merge remote-tracking branch 'mbr0wn/digital/fix_ofdm_parser' into maint
-rw-r--r-- | gr-digital/include/gnuradio/digital/packet_header_ofdm.h | 1 | ||||
-rw-r--r-- | gr-digital/lib/packet_header_default.cc | 8 | ||||
-rw-r--r-- | gr-digital/lib/packet_header_ofdm.cc | 55 | ||||
-rw-r--r-- | gr-digital/lib/packet_headergenerator_bb_impl.cc | 3 | ||||
-rwxr-xr-x | gr-digital/python/digital/qa_packet_headerparser_b.py | 7 |
5 files changed, 37 insertions, 37 deletions
diff --git a/gr-digital/include/gnuradio/digital/packet_header_ofdm.h b/gr-digital/include/gnuradio/digital/packet_header_ofdm.h index 40255daf6d..9703f2e352 100644 --- a/gr-digital/include/gnuradio/digital/packet_header_ofdm.h +++ b/gr-digital/include/gnuradio/digital/packet_header_ofdm.h @@ -109,7 +109,6 @@ namespace gr { protected: pmt::pmt_t d_frame_len_tag_key; //!< Tag key of the additional frame length tag const std::vector<std::vector<int> > d_occupied_carriers; //!< Which carriers/symbols carry data - int d_syms_per_set; //!< Helper variable: Total number of elements in d_occupied_carriers int d_bits_per_payload_sym; std::vector<unsigned char> d_scramble_mask; //!< Bits are xor'd with this before tx'ing }; diff --git a/gr-digital/lib/packet_header_default.cc b/gr-digital/lib/packet_header_default.cc index 12b8613b6d..4d0c8df8b1 100644 --- a/gr-digital/lib/packet_header_default.cc +++ b/gr-digital/lib/packet_header_default.cc @@ -62,12 +62,10 @@ namespace gr { } bool packet_header_default::header_formatter( - long packet_len, + long packet_len, unsigned char *out, - - const std::vector<tag_t> &tags - ) - { + const std::vector<tag_t> &tags + ) { packet_len &= 0x0FFF; d_crc_impl.reset(); d_crc_impl.process_bytes((void const *) &packet_len, 2); diff --git a/gr-digital/lib/packet_header_ofdm.cc b/gr-digital/lib/packet_header_ofdm.cc index 4893b866e2..7a9558640e 100644 --- a/gr-digital/lib/packet_header_ofdm.cc +++ b/gr-digital/lib/packet_header_ofdm.cc @@ -74,14 +74,9 @@ namespace gr { bits_per_header_sym), d_frame_len_tag_key(pmt::string_to_symbol(frame_len_tag_key)), d_occupied_carriers(occupied_carriers), - d_syms_per_set(0), d_bits_per_payload_sym(bits_per_payload_sym), d_scramble_mask(d_header_len, 0) { - for (unsigned i = 0; i < d_occupied_carriers.size(); i++) { - d_syms_per_set += d_occupied_carriers[i].size(); - } - // Init scrambler mask if (scramble_header) { // These are just random values which already have OK PAPR: @@ -108,36 +103,40 @@ namespace gr { } bool packet_header_ofdm::header_parser( - const unsigned char *in, - std::vector<tag_t> &tags) - { + const unsigned char *in, + std::vector<tag_t> &tags + ) { std::vector<unsigned char> in_descrambled(d_header_len, 0); for (int i = 0; i < d_header_len; i++) { - in_descrambled[i] = in[i] ^ d_scramble_mask[i]; + in_descrambled[i] = in[i] ^ d_scramble_mask[i]; } if (!packet_header_default::header_parser(&in_descrambled[0], tags)) { - return false; + return false; } - int packet_len = 0; // # of bytes in this frame - for (unsigned i = 0; i < tags.size(); i++) { - if (pmt::equal(tags[i].key, d_len_tag_key)) { - // Convert bytes to complex symbols: - packet_len = pmt::to_long(tags[i].value) * 8 / d_bits_per_payload_sym; - if (pmt::to_long(tags[i].value) * 8 % d_bits_per_payload_sym) { - packet_len++; - } - tags[i].value = pmt::from_long(packet_len); - break; - } + int packet_len = 0; // # of complex symbols in this frame + for (size_t i = 0; i < tags.size(); i++) { + if (pmt::equal(tags[i].key, d_len_tag_key)) { + // Convert bytes to complex symbols: + packet_len = pmt::to_long(tags[i].value) * 8 / d_bits_per_payload_sym; + if (pmt::to_long(tags[i].value) * 8 % d_bits_per_payload_sym) { + packet_len++; + } + tags[i].value = pmt::from_long(packet_len); + break; + } } - // frame_len == # of OFDM symbols in this frame - int frame_len = packet_len / d_syms_per_set; - int k = 0; - int i = frame_len * d_syms_per_set; - while (i < packet_len) { - frame_len++; - i += d_occupied_carriers[k].size(); + // To figure out how many payload OFDM symbols there are in this frame, + // we need to go through the carrier allocation and count the number of + // allocated carriers per OFDM symbol. + // frame_len == # of payload OFDM symbols in this frame + int frame_len = 0; + size_t k = 0; // position in the carrier allocation map + int symbols_accounted_for = 0; + while (symbols_accounted_for < packet_len) { + frame_len++; + symbols_accounted_for += d_occupied_carriers[k].size(); + k = (k + 1) % d_occupied_carriers.size(); } tag_t tag; tag.key = d_frame_len_tag_key; diff --git a/gr-digital/lib/packet_headergenerator_bb_impl.cc b/gr-digital/lib/packet_headergenerator_bb_impl.cc index 27f3b004de..3dd2e0469b 100644 --- a/gr-digital/lib/packet_headergenerator_bb_impl.cc +++ b/gr-digital/lib/packet_headergenerator_bb_impl.cc @@ -68,7 +68,8 @@ namespace gr { set_relative_rate(d_formatter->header_len()); set_tag_propagation_policy(TPP_DONT); } -void + + void packet_headergenerator_bb_impl::set_header_formatter(packet_header_default::sptr header_formatter) { gr::thread::scoped_lock guard(d_setlock); diff --git a/gr-digital/python/digital/qa_packet_headerparser_b.py b/gr-digital/python/digital/qa_packet_headerparser_b.py index 1844991bc0..fb4226d6fd 100755 --- a/gr-digital/python/digital/qa_packet_headerparser_b.py +++ b/gr-digital/python/digital/qa_packet_headerparser_b.py @@ -97,6 +97,9 @@ class qa_packet_headerparser_b (gr_unittest.TestCase): """ Header 1: 193 bytes Header 2: 8 bytes 2 bits per complex symbol, 32 carriers => 64 bits = 8 bytes per OFDM symbol + 4 carriers => 8 bits = 1 byte per OFDM symbol + 8 carriers => 16 bits = 2 bytes per OFDM symbol + Means we need 52 carriers to store the 193 bytes. """ encoded_headers = ( # | Number of bytes | Packet number | CRC @@ -107,7 +110,7 @@ class qa_packet_headerparser_b (gr_unittest.TestCase): frame_len_tagname = "frame_len" src = blocks.vector_source_b(encoded_headers) header_formatter = digital.packet_header_ofdm( - (range(32),), # 32 carriers are occupied (which doesn't matter here) + (range(32),range(4),range(8)), # 32/4/8 carriers are occupied (which doesn't matter here) 1, # 1 OFDM symbol per header (= 32 bits) packet_len_tagname, frame_len_tagname, @@ -127,7 +130,7 @@ class qa_packet_headerparser_b (gr_unittest.TestCase): msg1 = pmt.to_python(sink.get_message(0)) msg2 = pmt.to_python(sink.get_message(1)) # Multiply with 4 because unpacked bytes have only two bits - self.assertEqual(msg1, {'packet_len': 193*4, 'frame_len': 25, 'packet_num': 0}) + self.assertEqual(msg1, {'packet_len': 193*4, 'frame_len': 52, 'packet_num': 0}) self.assertEqual(msg2, {'packet_len': 8*4, 'frame_len': 1, 'packet_num': 1}) def test_004_ofdm_scramble(self): |