попытки сделать crsf, не взлетела часть с пультом

This commit is contained in:
2025-11-24 16:24:59 +03:00
parent 0f14fd0155
commit 3eaea1b966
20 changed files with 769 additions and 535 deletions

61
lib/crsf.h Normal file
View File

@@ -0,0 +1,61 @@
#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