6#include "AudioTools/CoreAudio/Buffers.h"
7#include "AudioToolsConfig.h"
35 : _maxFrameSize(maxFrameSize) {
38 tx_frame_buffer.
resize(maxFrameSize);
39 rx_frame_buffer.
resize(maxFrameSize);
40 _rxBuffer.resize(maxFrameSize);
51 tx_frame_buffer.
resize(maxFrameSize);
52 rx_frame_buffer.
resize(maxFrameSize);
53 _rxBuffer.resize(maxFrameSize);
71 int read()
override {
return -1; }
80 size_t readBytes(uint8_t* buffer,
size_t length)
override {
81 size_t available_bytes = rx_frame_buffer.
available();
83 if (available_bytes == 0) {
85 available_bytes = rx_frame_buffer.
available();
89 if (length < available_bytes) {
90 LOGE(
"readBytes len too small %u instead of %u", (
unsigned)length,
91 (
unsigned)available_bytes);
96 memcpy(buffer, rx_frame_buffer.
data(), available_bytes);
97 rx_frame_buffer.
clear();
99 return available_bytes;
80 size_t readBytes(uint8_t* buffer,
size_t length)
override {
…}
107 int peek()
override {
return -1; }
112 void flush()
override { p_stream->flush(); }
120 size_t write(uint8_t b)
override {
return 0; }
129 size_t write(
const uint8_t* data,
size_t len)
override {
129 size_t write(
const uint8_t* data,
size_t len)
override {
…}
134 Stream* p_stream =
nullptr;
135 Print* p_print =
nullptr;
136 const size_t _maxFrameSize;
140 size_t _frameLen = 0;
143 bool _frameReady =
false;
145 enum RxState { IDLE, RECEIVING, ESCAPED } _rxState = IDLE;
147 static constexpr uint8_t HDLC_FLAG = 0x7E;
148 static constexpr uint8_t HDLC_ESC = 0x7D;
149 static constexpr uint8_t HDLC_ESC_XOR = 0x20;
158 uint16_t
_crc16(uint8_t data, uint16_t crc) {
159 crc ^= (uint16_t)data << 8;
160 for (
int i = 0; i < 8; i++)
161 crc = (crc & 0x8000) ? (crc << 1) ^ 0x1021 : (crc << 1);
158 uint16_t
_crc16(uint8_t data, uint16_t crc) {
…}
171 if (b == HDLC_FLAG || b == HDLC_ESC) {
172 tx_frame_buffer.
write(HDLC_ESC);
173 tx_frame_buffer.
write(b ^ HDLC_ESC_XOR);
175 tx_frame_buffer.
write(b);
187 if (!data || len == 0)
return 0;
189 uint16_t crc = 0xFFFF;
190 tx_frame_buffer.
write(HDLC_FLAG);
192 for (
size_t i = 0; i < len; ++i) {
193 crc =
_crc16(data[i], crc);
199 tx_frame_buffer.
write(HDLC_FLAG);
200 p_print->write(tx_frame_buffer.
data(), tx_frame_buffer.
available());
202 tx_frame_buffer.
clear();
211 while (!_frameReady && p_stream->available()) {
212 uint8_t b = p_stream->read();
214 if (b == HDLC_FLAG) {
217 (_rxBuffer[_rxLen - 2] << 8) | _rxBuffer[_rxLen - 1];
218 uint16_t calcCrc = 0xFFFF;
219 for (
size_t i = 0; i < _rxLen - 2; ++i)
220 calcCrc =
_crc16(_rxBuffer[i], calcCrc);
222 if (calcCrc == recvCrc) {
223 for (
int j = 0; j < _rxLen - 2; j++) {
224 rx_frame_buffer.
write(_rxBuffer[j]);
227 _frameLen = _rxLen - 2;
243 _rxState = RECEIVING;
244 if (_rxLen < _maxFrameSize) _rxBuffer[_rxLen++] = b;
251 }
else if (_rxLen < _maxFrameSize) {
252 _rxBuffer[_rxLen++] = b;
257 if (_rxLen < _maxFrameSize) {
258 _rxBuffer[_rxLen++] = b ^ HDLC_ESC_XOR;
260 _rxState = RECEIVING;
264 if (_rxLen >= _maxFrameSize) {