#ifndef SDRPI_FPV_CONTROL_PLATFORM_PORT_CRSF_H #define SDRPI_FPV_CONTROL_PLATFORM_PORT_CRSF_H #include #include #include #include #include namespace crsf { struct CrsfFrame { uint8_t address; // адрес получателя uint8_t type; // тип пакета std::vector payload; // полезная нагрузка uint8_t crc; // контрольная сумма CrsfFrame(); CrsfFrame(uint8_t addr, uint8_t t, std::vector p); CrsfFrame(std::span rawBuffer); bool checkCrc() const; void setCrc(); void writeToBuffer(std::vector& dest) const; }; constexpr size_t CRSF_MAX_FRAME_SIZE = 260; uint8_t crsfComputeCrc(std::span data); class CrsfParser { public: CrsfParser() = default; /** * Разбирает поток байт и формирует пакеты, добавляя их во внутреннюю очередь. * Метод может принимать чанки любых размеров (например, 512 байт с UART). */ void parseBytes(const std::vector& data); /** * Отдает все готовые пакеты и очищает очередь. */ std::unique_ptr 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> frames; }; } #endif //SDRPI_FPV_CONTROL_PLATFORM_PORT_CRSF_H