Files
sdrpi-fpv-control/lib/crsf.h

61 lines
1.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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