попытки сделать crsf, не взлетела часть с пультом
This commit is contained in:
61
lib/crsf.h
Normal file
61
lib/crsf.h
Normal 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
|
||||
Reference in New Issue
Block a user