TinyModem
Header-only software audio modem library
Loading...
Searching...
No Matches
tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES > Class Template Reference

Splits the written data into packets with a CRC-16 and Reed-Solomon forward error correction, which are framed with HDLC-style flags (0x7E) and byte stuffing, and writes them to the output (e.g. a ModemStream). More...

#include <PacketStream.h>

Inheritance diagram for tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >:
Collaboration diagram for tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >:

Public Member Functions

 PacketEncoder ()=default
 PacketEncoder (Print &out)
void setOutput (Print &out)
size_t write (uint8_t ch) override
size_t write (const uint8_t *data, size_t len) override
void flush () override
 Sends the buffered data as packet.
int pending () const
 Number of buffered bytes which were not sent yet.

Protected Member Functions

void writePacket ()
void writeEscaped (uint8_t b)

Protected Attributes

Print * p_out = nullptr
uint8_t payload [MAX_PAYLOAD]
int payload_len = 0
RS::ReedSolomon< MSG_LEN, ECC_BYTES > rs

Static Protected Attributes

static constexpr int MSG_LEN = MAX_PAYLOAD + PacketFormat::CRC_BYTES

Detailed Description

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
class tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >

Splits the written data into packets with a CRC-16 and Reed-Solomon forward error correction, which are framed with HDLC-style flags (0x7E) and byte stuffing, and writes them to the output (e.g. a ModemStream).

A packet is sent when MAX_PAYLOAD bytes were written or when you call flush(). The packet is transmitted as payload + CRC + ECC_BYTES parity bytes: shorter packets use a shortened Reed-Solomon code, so they don't need any padding. The receiver (PacketDecoder) corrects up to ECC_BYTES / 2 wrong bytes per packet.

Template Parameters
MAX_PAYLOADmaximum number of data bytes per packet
ECC_BYTESnumber of Reed-Solomon parity bytes per packet

Constructor & Destructor Documentation

◆ PacketEncoder() [1/2]

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::PacketEncoder ( )
default

◆ PacketEncoder() [2/2]

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::PacketEncoder ( Print & out)
inline

Member Function Documentation

◆ flush()

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
void tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::flush ( )
inlineoverride

Sends the buffered data as packet.

◆ pending()

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
int tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::pending ( ) const
inline

Number of buffered bytes which were not sent yet.

◆ setOutput()

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
void tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::setOutput ( Print & out)
inline

◆ write() [1/2]

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
size_t tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::write ( const uint8_t * data,
size_t len )
inlineoverride

◆ write() [2/2]

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
size_t tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::write ( uint8_t ch)
inlineoverride

◆ writeEscaped()

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
void tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::writeEscaped ( uint8_t b)
inlineprotected

◆ writePacket()

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
void tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::writePacket ( )
inlineprotected

Member Data Documentation

◆ MSG_LEN

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
int tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::MSG_LEN = MAX_PAYLOAD + PacketFormat::CRC_BYTES
staticconstexprprotected

◆ p_out

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
Print* tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::p_out = nullptr
protected

◆ payload

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
uint8_t tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::payload[MAX_PAYLOAD]
protected

◆ payload_len

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
int tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::payload_len = 0
protected

◆ rs

template<uint8_t MAX_PAYLOAD = 64, uint8_t ECC_BYTES = 16>
RS::ReedSolomon<MSG_LEN, ECC_BYTES> tinymodem::PacketEncoder< MAX_PAYLOAD, ECC_BYTES >::rs
protected

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