123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #pragma once
- #include "AP_RCProtocol.h"
- #include "SoftSerial.h"
- #define ST24_DATA_LEN_MAX 64
- #define ST24_MAX_FRAMELEN 70
- #define ST24_STX1 0x55
- #define ST24_STX2 0x55
- #define ST24_RANGE_MIN 0.0f
- #define ST24_RANGE_MAX 4096.0f
- #define ST24_TARGET_MIN 1000.0f
- #define ST24_TARGET_MAX 2000.0f
- #define ST24_SCALE_FACTOR ((ST24_TARGET_MAX - ST24_TARGET_MIN) / (ST24_RANGE_MAX - ST24_RANGE_MIN))
- #define ST24_SCALE_OFFSET (int)(ST24_TARGET_MIN - (ST24_SCALE_FACTOR * ST24_RANGE_MIN + 0.5f))
- class AP_RCProtocol_ST24 : public AP_RCProtocol_Backend {
- public:
- AP_RCProtocol_ST24(AP_RCProtocol &_frontend) : AP_RCProtocol_Backend(_frontend) {}
- void process_pulse(uint32_t width_s0, uint32_t width_s1) override;
- void process_byte(uint8_t byte, uint32_t baudrate) override;
- private:
- void _process_byte(uint8_t byte);
- static uint8_t st24_crc8(uint8_t *ptr, uint8_t len);
- enum ST24_PACKET_TYPE {
- ST24_PACKET_TYPE_CHANNELDATA12 = 0,
- ST24_PACKET_TYPE_CHANNELDATA24,
- ST24_PACKET_TYPE_TRANSMITTERGPSDATA
- };
- #pragma pack(push, 1)
- typedef struct {
- uint8_t header1;
- uint8_t header2;
- uint8_t length;
- uint8_t type;
- uint8_t st24_data[ST24_DATA_LEN_MAX];
- uint8_t crc8;
- } ReceiverFcPacket;
-
- typedef struct {
- uint16_t t;
- uint8_t rssi;
- uint8_t packet_count;
- uint8_t channel[18];
- } ChannelData12;
-
- typedef struct {
- uint16_t t;
- uint8_t rssi;
- uint8_t packet_count;
- uint8_t channel[36];
- } ChannelData24;
-
- typedef struct {
- uint16_t t;
- int32_t lat;
- int32_t lon;
- int32_t alt;
- int16_t vx, vy, vz;
- uint8_t nsat;
- uint8_t voltage;
- uint8_t current;
- int16_t roll, pitch, yaw;
- uint8_t motorStatus;
- uint8_t imuStatus;
- uint8_t pressCompassStatus;
- } TelemetryData;
- #pragma pack(pop)
- enum ST24_DECODE_STATE {
- ST24_DECODE_STATE_UNSYNCED = 0,
- ST24_DECODE_STATE_GOT_STX1,
- ST24_DECODE_STATE_GOT_STX2,
- ST24_DECODE_STATE_GOT_LEN,
- ST24_DECODE_STATE_GOT_TYPE,
- ST24_DECODE_STATE_GOT_DATA
- };
- enum ST24_DECODE_STATE _decode_state = ST24_DECODE_STATE_UNSYNCED;
- uint8_t _rxlen;
- ReceiverFcPacket _rxpacket;
- SoftSerial ss{115200, SoftSerial::SERIAL_CONFIG_8N1};
- };
|