61 lines
1.7 KiB
C++
61 lines
1.7 KiB
C++
#ifndef SDRPI_FPV_CONTROL_PLATFORM_PORT_CRSF_H
|
||
#define SDRPI_FPV_CONTROL_PLATFORM_PORT_CRSF_H
|
||
|
||
#include <algorithm>
|
||
#include <deque>
|
||
#include <memory>
|
||
#include <span>
|
||
#include <vector>
|
||
|
||
namespace crsf {
|
||
struct CrsfFrame {
|
||
uint8_t address; // адрес получателя
|
||
uint8_t type; // тип пакета
|
||
std::vector<uint8_t> payload; // полезная нагрузка
|
||
uint8_t crc; // контрольная сумма
|
||
|
||
CrsfFrame();
|
||
CrsfFrame(uint8_t addr, uint8_t t, std::vector<uint8_t> p);
|
||
CrsfFrame(std::span<const uint8_t> rawBuffer);
|
||
|
||
bool checkCrc() const;
|
||
void setCrc();
|
||
|
||
void writeToBuffer(std::vector<uint8_t>& dest) const;
|
||
};
|
||
|
||
constexpr size_t CRSF_MAX_FRAME_SIZE = 260;
|
||
|
||
uint8_t crsfComputeCrc(std::span<const uint8_t> data);
|
||
|
||
class CrsfParser {
|
||
public:
|
||
CrsfParser() = default;
|
||
|
||
/**
|
||
* Разбирает поток байт и формирует пакеты, добавляя их во внутреннюю очередь.
|
||
* Метод может принимать чанки любых размеров (например, 512 байт с UART).
|
||
*/
|
||
void parseBytes(const std::vector<uint8_t>& data);
|
||
|
||
/**
|
||
* Отдает все готовые пакеты и очищает очередь.
|
||
*/
|
||
std::unique_ptr<CrsfFrame> pullPacket();
|
||
|
||
void reset();
|
||
|
||
private:
|
||
static constexpr uint8_t PREAMBLE = 0xC8;
|
||
|
||
uint8_t buffer[CRSF_MAX_FRAME_SIZE]{};
|
||
size_t bufferPos{0};
|
||
size_t frameSize{0};
|
||
|
||
std::deque<std::unique_ptr<CrsfFrame>> frames;
|
||
|
||
};
|
||
|
||
}
|
||
|
||
#endif //SDRPI_FPV_CONTROL_PLATFORM_PORT_CRSF_H
|