arduino-audio-tools
Loading...
Searching...
No Matches
HDLCStream Class Reference

High-Level Data Link Control (HDLC) is a bit-oriented code-transparent synchronous data link layer protocol for reliable, framed, and error-checked communication. More...

#include <HDLCStream.h>

Inheritance diagram for HDLCStream:
Stream Print Print

Public Member Functions

 HDLCStream ()=default
 HDLCStream (int maxFrameSize)
 HDLCStream (Print &stream, size_t maxFrameSize)
 Construct a new HDLCStream object using a Print for output only.
 HDLCStream (Stream &stream, size_t maxFrameSize)
 Construct a new HDLCStream object using a Stream for input and output.
int available () override
 Get the number of bytes available to read from the frame buffer.
virtual int availableForWrite ()
virtual int availableForWrite ()
void flush () override
 Flush the output buffer of the underlying stream.
 operator bool ()
 operator bool ()
int peek () override
 Not supported.
int read () override
 Not supported.
size_t readBytes (uint8_t *buffer, size_t length)
 Read a full frame from the stream into a buffer.
bool resize (size_t size)
void setPrint (Print &stream)
void setStream (Stream &stream)
size_t write (const uint8_t *data, size_t len) override
 Write multiple bytes to the stream.
size_t write (uint8_t b) override
 Not supported.

Protected Types

enum  RxState { IDLE , RECEIVING , ESCAPED }

Protected Member Functions

uint16_t _crc16 (uint8_t data, uint16_t crc)
 Calculate CRC-CCITT (16-bit).
void _processInput ()
 Process incoming bytes, detect frames, validate CRC and prepare data for reading.
void _writeEscaped (uint8_t b)
 Write a byte with proper HDLC byte stuffing if needed.
size_t writeFrame (const uint8_t *data, size_t len)
 Write a complete HDLC frame with proper framing and CRC.

Protected Attributes

size_t _frameLen = 0
bool _frameReady = false
size_t _maxFrameSize = 0
Vector< uint8_t > _rxBuffer
size_t _rxLen = 0
size_t _rxPos = 0
enum audio_tools::HDLCStream::RxState _rxState = IDLE
int _timeout = 10
Print * p_print = nullptr
Stream * p_stream = nullptr
SingleBuffer< uint8_t > rx_frame_buffer
SingleBuffer< uint8_t > tx_frame_buffer

Static Protected Attributes

static constexpr uint8_t HDLC_ESC = 0x7D
static constexpr uint8_t HDLC_ESC_XOR = 0x20
static constexpr uint8_t HDLC_FLAG = 0x7E

Detailed Description

High-Level Data Link Control (HDLC) is a bit-oriented code-transparent synchronous data link layer protocol for reliable, framed, and error-checked communication.

This class implements HDLC framing with:

  • Frame delimiter (0x7E) for marking frame boundaries
  • Byte stuffing to escape special characters in the data
  • 16-bit CRC-CCITT for error detection
  • Transparent Stream interface for easy integration
Author
Phil Schatzmann

Member Enumeration Documentation

◆ RxState

enum RxState
protected
Enumerator
IDLE 
RECEIVING 
ESCAPED 

Constructor & Destructor Documentation

◆ HDLCStream() [1/4]

HDLCStream ( )
default

◆ HDLCStream() [2/4]

HDLCStream ( int maxFrameSize)
inline

◆ HDLCStream() [3/4]

HDLCStream ( Stream & stream,
size_t maxFrameSize )
inline

Construct a new HDLCStream object using a Stream for input and output.

Parameters
streamThe underlying Stream for both reading and writing
maxFrameSizeMaximum size of a single HDLC frame

◆ HDLCStream() [4/4]

HDLCStream ( Print & stream,
size_t maxFrameSize )
inline

Construct a new HDLCStream object using a Print for output only.

Parameters
streamThe underlying Print for writing
maxFrameSizeMaximum size of a single HDLC frame

Member Function Documentation

◆ _crc16()

uint16_t _crc16 ( uint8_t data,
uint16_t crc )
inlineprotected

Calculate CRC-CCITT (16-bit).

Parameters
dataByte to include in CRC calculation
crcCurrent CRC value
Returns
uint16_t Updated CRC value

◆ _processInput()

void _processInput ( )
inlineprotected

Process incoming bytes, detect frames, validate CRC and prepare data for reading.

◆ _writeEscaped()

void _writeEscaped ( uint8_t b)
inlineprotected

Write a byte with proper HDLC byte stuffing if needed.

Parameters
bByte to write

◆ available()

int available ( )
inlineoverridevirtual

Get the number of bytes available to read from the frame buffer.

Returns
int Number of bytes available

Reimplemented from Stream.

◆ availableForWrite() [1/2]

virtual int availableForWrite ( )
inlinevirtualinherited

Reimplemented in A2DPStream, AbstractURLStream, AdapterAudioStreamToAudioOutput, AnalogAudioStream, AdapterAudioStreamToAudioOutput, AudioOutput, AudioOutput, AudioStreamWrapper, AudioStreamWrapper, BaseStream, BaseStream, ConverterStream< T >, ConverterStream< T >, CsvOutput< T >, CsvOutput< T >, DynamicMemoryStream, DynamicMemoryStream, EncodedAudioOutput, EncodedAudioStream, FilteredStream< T, TF >, FilteredStream< T, TF >, FilteredStream< int16_t, int16_t >, MemoryOutput, MemoryOutput, MemoryStream, MemoryStream, OutputMixer< T >, OutputMixer< T >, ProgressStream, ProgressStream, QueueStream< T >, QueueStream< T >, QueueStream< uint8_t >, ReformatBaseStream, RingBufferStream, RingBufferStream, Throttle, Throttle, TimedStream, AudioBLEClient, AudioBLEClient, AudioBLEServer, AudioBLEServer, AudioEffectStream, AudioEffectStreamT< T >, AudioESP32ULP, AudioFFTBase, AudioLoRa, AudioOutput, AudioServerEx, AudioStreamWrapper, AudioSyncWriter, AutomaticGainControlStream, BaseStream, ChannelFormatConverterStream, ChannelFormatConverterStreamT< T >, ConverterStream< T >, CsvOutput< T >, DynamicMemoryStream, EncodedAudioOutput, EncodedAudioStream, Equalizer3BandsPerChannelT< T >, Equalizer3BandsPerChannelT< float >, Equalizer3BandsT< T >, Equalizer3BandsT< float >, ESPNowStream, FadeStream, FaustStream< DSP >, FileOutput, FilteredStream< T, TF >, FrequencyDetectorAutoCorrelation, FrequencyDetectorZeroCrossing, HammingFEC< bytecount, block_t >, I2SCodecStream, I2SStream, MeasuringStream, MemoryOutput, MemoryStream, MiniAudioStream, NRF24Stream, NumberFormatConverterStream, NumberFormatConverterStreamT< TFrom, TTo >, OutputMixer< T >, Pipeline, ProgressStream, PWMAudioOutput< PWMDriverT >, QualityAnalysisStream, QueueStream< T >, ReadioHeadStream, ReedSolomonFEC< bytecount, additional_bytes >, ReformatBaseStream, RingBufferStream, RTSPOutput< Platform >, SPIAudioMaster, SPIAudioSlave, StdioStream, SupportedRatesStream, SynchronizedStream, Throttle, TimedStream, UDPStream, URLStreamESP32, USBAudioStreamBase, VBANStream, and VolumeStream.

◆ availableForWrite() [2/2]

virtual int availableForWrite ( )
inlinevirtualinherited

Reimplemented in A2DPStream, AbstractURLStream, AdapterAudioStreamToAudioOutput, AnalogAudioStream, AdapterAudioStreamToAudioOutput, AudioOutput, AudioOutput, AudioStreamWrapper, AudioStreamWrapper, BaseStream, BaseStream, ConverterStream< T >, ConverterStream< T >, CsvOutput< T >, CsvOutput< T >, DynamicMemoryStream, DynamicMemoryStream, EncodedAudioOutput, EncodedAudioStream, FilteredStream< T, TF >, FilteredStream< T, TF >, FilteredStream< int16_t, int16_t >, MemoryOutput, MemoryOutput, MemoryStream, MemoryStream, OutputMixer< T >, OutputMixer< T >, ProgressStream, ProgressStream, QueueStream< T >, QueueStream< T >, QueueStream< uint8_t >, ReformatBaseStream, RingBufferStream, RingBufferStream, Throttle, Throttle, TimedStream, AudioBLEClient, AudioBLEClient, AudioBLEServer, AudioBLEServer, AudioEffectStream, AudioEffectStreamT< T >, AudioESP32ULP, AudioFFTBase, AudioLoRa, AudioOutput, AudioServerEx, AudioStreamWrapper, AudioSyncWriter, AutomaticGainControlStream, BaseStream, ChannelFormatConverterStream, ChannelFormatConverterStreamT< T >, ConverterStream< T >, CsvOutput< T >, DynamicMemoryStream, EncodedAudioOutput, EncodedAudioStream, Equalizer3BandsPerChannelT< T >, Equalizer3BandsPerChannelT< float >, Equalizer3BandsT< T >, Equalizer3BandsT< float >, ESPNowStream, FadeStream, FaustStream< DSP >, FileOutput, FilteredStream< T, TF >, FrequencyDetectorAutoCorrelation, FrequencyDetectorZeroCrossing, HammingFEC< bytecount, block_t >, I2SCodecStream, I2SStream, MeasuringStream, MemoryOutput, MemoryStream, MiniAudioStream, NRF24Stream, NumberFormatConverterStream, NumberFormatConverterStreamT< TFrom, TTo >, OutputMixer< T >, Pipeline, ProgressStream, PWMAudioOutput< PWMDriverT >, QualityAnalysisStream, QueueStream< T >, ReadioHeadStream, ReedSolomonFEC< bytecount, additional_bytes >, ReformatBaseStream, RingBufferStream, RTSPOutput< Platform >, SPIAudioMaster, SPIAudioSlave, StdioStream, SupportedRatesStream, SynchronizedStream, Throttle, TimedStream, UDPStream, URLStreamESP32, USBAudioStreamBase, VBANStream, and VolumeStream.

◆ flush()

void flush ( )
inlineoverridevirtual

Flush the output buffer of the underlying stream.

Reimplemented from Print.

◆ operator bool() [1/2]

operator bool ( )
inlineinherited

◆ operator bool() [2/2]

operator bool ( )
inlineinherited

◆ peek()

int peek ( )
inlineoverride

Not supported.

Returns
-1

◆ read()

int read ( )
inlineoverride

Not supported.

Returns
-1

◆ readBytes()

size_t readBytes ( uint8_t * buffer,
size_t length )
inlinevirtual

Read a full frame from the stream into a buffer.

Parameters
bufferDestination buffer to hold the data
lengthMaximum number of bytes to read
Returns
size_t Actual number of bytes read

Reimplemented from Stream.

◆ resize()

bool resize ( size_t size)
inline

◆ setPrint()

void setPrint ( Print & stream)
inline

◆ setStream()

void setStream ( Stream & stream)
inline

◆ write() [1/2]

size_t write ( const uint8_t * data,
size_t len )
inlineoverridevirtual

Write multiple bytes to the stream.

Parameters
dataPointer to the data buffer
lenNumber of bytes to write
Returns
size_t Number of bytes written

Reimplemented from Print.

◆ write() [2/2]

size_t write ( uint8_t b)
inlineoverride

Not supported.

Parameters
bThe byte to write
Returns
0

◆ writeFrame()

size_t writeFrame ( const uint8_t * data,
size_t len )
inlineprotected

Write a complete HDLC frame with proper framing and CRC.

Parameters
dataData to be framed
lenLength of data
Returns
size_t Number of bytes in the original data

Member Data Documentation

◆ _frameLen

size_t _frameLen = 0
protected

◆ _frameReady

bool _frameReady = false
protected

◆ _maxFrameSize

size_t _maxFrameSize = 0
protected

◆ _rxBuffer

Vector<uint8_t> _rxBuffer
protected

◆ _rxLen

size_t _rxLen = 0
protected

◆ _rxPos

size_t _rxPos = 0
protected

◆ _rxState

enum audio_tools::HDLCStream::RxState _rxState = IDLE
protected

◆ _timeout

int _timeout = 10
protectedinherited

◆ HDLC_ESC

uint8_t HDLC_ESC = 0x7D
staticconstexprprotected

◆ HDLC_ESC_XOR

uint8_t HDLC_ESC_XOR = 0x20
staticconstexprprotected

◆ HDLC_FLAG

uint8_t HDLC_FLAG = 0x7E
staticconstexprprotected

◆ p_print

Print* p_print = nullptr
protected

◆ p_stream

Stream* p_stream = nullptr
protected

◆ rx_frame_buffer

SingleBuffer<uint8_t> rx_frame_buffer
protected

◆ tx_frame_buffer

SingleBuffer<uint8_t> tx_frame_buffer
protected

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