GNU Radio Manual and C++ API Reference
The Free & Open Software Radio Ecosystem
gr::digital::header_format_default Class Reference

Default header formatter for PDU formatting. More...

#include <gnuradio/digital/header_format_default.h>

Public Types

typedef std::shared_ptr< header_format_defaultsptr
- Public Types inherited from gr::digital::header_format_base
typedef std::shared_ptr< header_format_basesptr

Public Member Functions

 header_format_default (const std::string &access_code, int threshold, int bps)
 ~header_format_default () override
bool format (int nbytes_in, const unsigned char *input, pmt::pmt_t &output, pmt::pmt_t &info) override
bool parse (int nbits_in, const unsigned char *input, std::vector< pmt::pmt_t > &info, int &nbits_processed) override
size_t header_nbits () const override
bool set_access_code (const std::string &access_code)
unsigned long long access_code () const
void set_threshold (unsigned int thresh=0)
unsigned int threshold () const
- Public Member Functions inherited from gr::digital::header_format_base
 header_format_base ()
virtual ~header_format_base ()
sptr base ()
sptr formatter ()
size_t header_nbytes () const

Static Public Member Functions

static sptr make (const std::string &access_code, int threshold, int bps=1)

Protected Member Functions

void enter_have_sync () override
 Access code found, start getting the header. More...
void enter_have_header (int payload_len) override
 Header found, setup for pulling in the hard decision bits. More...
bool header_ok () override
 Verify that the header is valid. More...
int header_payload () override
- Protected Member Functions inherited from gr::digital::header_format_base
virtual void enter_search ()
 Enter Search state of the state machine to find the access code. More...

Protected Attributes

uint64_t d_access_code
 register to hold the access code More...
size_t d_access_code_len
 length in bits of the access code More...
uint16_t d_bps
 bits/sec of payload modulation More...
unsigned long long d_data_reg
 used to look for access_code More...
unsigned long long d_mask
unsigned int d_threshold
 how many bits may be wrong in sync vector More...
int d_pkt_len
 Length of the packet to put into the output buffer. More...
int d_pkt_count
 Number of bytes bits already received. More...
int d_nbits
 num bits processed since reset More...
- Protected Attributes inherited from gr::digital::header_format_base
state_t d_state
 state of the state machine More...
header_buffer d_hdr_reg
 header_buffer object to hold header bits More...
pmt::pmt_t d_info
 info captured from the header More...
gr::logger_ptr d_logger
gr::logger_ptr d_debug_logger

Additional Inherited Members

- Protected Types inherited from gr::digital::header_format_base

Detailed Description

Default header formatter for PDU formatting.

Used to handle the default packet header.

See the parent class header_format_base for details of how these classes operate.

The default header created in this base class consists of an access code and the packet length. The length is encoded as a 16-bit value repeated twice:

  | access code | hdr | payload |

Where the access code is <= 64 bits and hdr is:

  |  0 -- 15 | 16 -- 31 |
  | pkt len  | pkt len  |

The access code and header are formatted for network byte order.

This header generator does not calculate or append a CRC to the packet. Use the CRC32 Async block for that before adding the header. The header's length will then measure the payload plus the CRC length (4 bytes for a CRC32).

The default header parser produces a PMT dictionary that contains the following keys. All formatter blocks MUST produce these two values in any dictionary.

  • "payload symbols": the number of symbols in the payload. The payload decoder will have to know how this relates to the number of bits received. This block knows nothing about the payload modulation or the number of bits/symbol. Use the gr::digital::header_format_counter for that purpose.
See also

Member Typedef Documentation

◆ sptr

Constructor & Destructor Documentation

◆ header_format_default()

gr::digital::header_format_default::header_format_default ( const std::string &  access_code,
int  threshold,
int  bps 

◆ ~header_format_default()

gr::digital::header_format_default::~header_format_default ( )

Member Function Documentation

◆ access_code()

unsigned long long gr::digital::header_format_default::access_code ( ) const

Returns the formatted access code as a 64-bit register.

◆ enter_have_header()

void gr::digital::header_format_default::enter_have_header ( int  payload_len)

Header found, setup for pulling in the hard decision bits.

Reimplemented from gr::digital::header_format_base.

◆ enter_have_sync()

void gr::digital::header_format_default::enter_have_sync ( )

Access code found, start getting the header.

Reimplemented from gr::digital::header_format_base.

◆ format()

bool gr::digital::header_format_default::format ( int  nbytes_in,
const unsigned char *  input,
pmt::pmt_t output,
pmt::pmt_t info 

Creates a header from the access code and packet length and creates an output header as a PMT vector in the form:

  | access code | pkt len | pkt len |
nbytes_inThe length (in bytes) of the input payload
inputAn array of unsigned chars of the packet payload
outputA pmt::u8vector with the new header prepended onto the input data.
infoA pmt::dict containing meta data and info about the PDU (generally from the metadata portion of the input PDU). Data can be extracted from this for the header formatting or inserted.

Implements gr::digital::header_format_base.

◆ header_nbits()

size_t gr::digital::header_format_default::header_nbits ( ) const

Returns the length of the formatted header in bits.

Implements gr::digital::header_format_base.

◆ header_ok()

bool gr::digital::header_format_default::header_ok ( )

Verify that the header is valid.

Implements gr::digital::header_format_base.

◆ header_payload()

int gr::digital::header_format_default::header_payload ( )

Get info from the header; return payload length and package rest of data in d_info dictionary.

Implements gr::digital::header_format_base.

◆ make()

static sptr gr::digital::header_format_default::make ( const std::string &  access_code,
int  threshold,
int  bps = 1 

Factory to create an async packet header formatter; returns an sptr to the object.

access_codeAn access code that is used to find and synchronize the start of a packet. Used in the parser and in other blocks like a corr_est block that helps trigger the receiver. Can be up to 64-bits long.
thresholdHow many bits can be wrong in the access code and still count as correct.
bpsThe number of bits/second used in the payload's modulator.

◆ parse()

bool gr::digital::header_format_default::parse ( int  nbits_in,
const unsigned char *  input,
std::vector< pmt::pmt_t > &  info,
int &  nbits_processed 

Parses a header of the form:

  | access code | pkt len | pkt len | payload |

This is implemented as a state machine that starts off searching for the access code. Once found, the access code is used to find the start of the packet and the following header. This default header encodes the length of the payload a 16 bit integer twice. The state machine finds the header and checks that both payload length values are the same. It then goes into its final state that reads in the payload (based on the payload length) and produces a payload as a PMT u8 vector of packed bytes.

nbits_inThe number of bits in the input array.
inputThe input as hard decision bits.
infoA vector of pmt::dicts to hold any meta data or info about the PDU. When parsing the header, the formatter can add info from the header into this dict. Each packet has a single PMT dictionary of info, so the vector length is the number of packets received extracted during one call to this parser function.
nbits_processedNumber of input bits actually processed; If all goes well, this is nbits_in. A premature return after a bad header could be less than this.

Implements gr::digital::header_format_base.

◆ set_access_code()

bool gr::digital::header_format_default::set_access_code ( const std::string &  access_code)

Updates the access code. Must be a string of 1's and 0's and <= 64 bits.

◆ set_threshold()

void gr::digital::header_format_default::set_threshold ( unsigned int  thresh = 0)

Sets the threshold for number of access code bits can be in error before detection. Defaults to 0.

◆ threshold()

unsigned int gr::digital::header_format_default::threshold ( ) const

Returns threshold value for access code detection.

Member Data Documentation

◆ d_access_code

uint64_t gr::digital::header_format_default::d_access_code

register to hold the access code

◆ d_access_code_len

size_t gr::digital::header_format_default::d_access_code_len

length in bits of the access code

◆ d_bps

uint16_t gr::digital::header_format_default::d_bps

bits/sec of payload modulation

◆ d_data_reg

unsigned long long gr::digital::header_format_default::d_data_reg

used to look for access_code

◆ d_mask

unsigned long long gr::digital::header_format_default::d_mask

masks access_code bits (top N bits are set where N is the number of bits in the access code)

◆ d_nbits

int gr::digital::header_format_default::d_nbits

num bits processed since reset

◆ d_pkt_count

int gr::digital::header_format_default::d_pkt_count

Number of bytes bits already received.

◆ d_pkt_len

int gr::digital::header_format_default::d_pkt_len

Length of the packet to put into the output buffer.

◆ d_threshold

unsigned int gr::digital::header_format_default::d_threshold

how many bits may be wrong in sync vector

The documentation for this class was generated from the following file: