Path: blob/master/libraries/AP_Frsky_Telem/AP_Frsky_SPortParser.h
9812 views
#pragma once12#include "AP_Frsky_SPort.h"34#if AP_FRSKY_SPORT_TELEM_ENABLED56#include <stdint.h>78// for SPort X protocol9#define FRAME_HEAD 0x7E10#define FRAME_DLE 0x7D11#define FRAME_XOR 0x2012// for SPort D protocol13#define START_STOP_D 0x5E14#define BYTESTUFF_D 0x5D15// for SPort packet parser16#define TELEMETRY_RX_BUFFER_SIZE 19U // 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1)17#define SPORT_PACKET_SIZE 9U18#define STUFF_MASK 0x2019#define SPORT_DATA_FRAME 0x1020#define SPORT_UPLINK_FRAME 0x3021#define SPORT_UPLINK_FRAME_RW 0x3122#define SPORT_DOWNLINK_FRAME 0x322324class AP_Frsky_SPortParser25{26public:2728// packet parser helpers29bool process_byte(AP_Frsky_SPort::sport_packet_t &sport_packet, const uint8_t data);3031private:32enum class ParseState : uint8_t {33IDLE,34START,35IN_FRAME,36XOR,37};3839struct {40uint8_t rx_buffer_count;41uint8_t rx_buffer[TELEMETRY_RX_BUFFER_SIZE];42uint8_t last_packet[SPORT_PACKET_SIZE];43ParseState state;44} _parse_state;4546bool should_process_packet(const uint8_t *packet, bool discard_duplicates);47bool get_packet(AP_Frsky_SPort::sport_packet_t &sport_packet, bool discard_duplicates);48};4950#endif // AP_FRSKY_SPORT_TELEM_ENABLED515253