Default header formatter for PDU formatting. More...
#include <gnuradio/digital/header_format_default.h>
Public Types | |
typedef std::shared_ptr< header_format_default > | sptr |
Public Types inherited from gr::digital::header_format_base | |
typedef std::shared_ptr< header_format_base > | sptr |
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 | |
enum | state_t { STATE_SYNC_SEARCH , STATE_HAVE_SYNC } |
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.
typedef std::shared_ptr<header_format_default> gr::digital::header_format_default::sptr |
gr::digital::header_format_default::header_format_default | ( | const std::string & | access_code, |
int | threshold, | ||
int | bps | ||
) |
|
override |
unsigned long long gr::digital::header_format_default::access_code | ( | ) | const |
Returns the formatted access code as a 64-bit register.
|
overrideprotectedvirtual |
Header found, setup for pulling in the hard decision bits.
Reimplemented from gr::digital::header_format_base.
|
overrideprotectedvirtual |
Access code found, start getting the header.
Reimplemented from gr::digital::header_format_base.
|
overridevirtual |
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_in | The length (in bytes) of the input payload |
input | An array of unsigned chars of the packet payload |
output | A pmt::u8vector with the new header prepended onto the input data. |
info | A 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.
|
overridevirtual |
Returns the length of the formatted header in bits.
Implements gr::digital::header_format_base.
|
overrideprotectedvirtual |
Verify that the header is valid.
Implements gr::digital::header_format_base.
|
overrideprotectedvirtual |
Get info from the header; return payload length and package rest of data in d_info dictionary.
Implements gr::digital::header_format_base.
|
static |
Factory to create an async packet header formatter; returns an sptr to the object.
access_code | An 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. |
threshold | How many bits can be wrong in the access code and still count as correct. |
bps | The number of bits/second used in the payload's modulator. |
|
overridevirtual |
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_in | The number of bits in the input array. |
input | The input as hard decision bits. |
info | A 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_processed | Number 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.
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.
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.
unsigned int gr::digital::header_format_default::threshold | ( | ) | const |
Returns threshold value for access code detection.
|
protected |
register to hold the access code
|
protected |
length in bits of the access code
|
protected |
bits/sec of payload modulation
|
protected |
used to look for access_code
|
protected |
masks access_code bits (top N bits are set where N is the number of bits in the access code)
|
protected |
num bits processed since reset
|
protected |
Number of bytes bits already received.
|
protected |
Length of the packet to put into the output buffer.
|
protected |
how many bits may be wrong in sync vector