50 #define SUMD_MAX_CHANNELS 32 51 #define SUMD_HEADER_LENGTH 3 52 #define SUMD_HEADER_ID 0xA8 53 #define SUMD_ID_SUMH 0x00 54 #define SUMD_ID_SUMD 0x01 55 #define SUMD_ID_FAILSAFE 0x81 103 #define SUMD_RANGE_MIN 0.0f 104 #define SUMD_RANGE_MAX 4096.0f 106 #define SUMD_TARGET_MIN 1000.0f 107 #define SUMD_TARGET_MAX 2000.0f 110 #define SUMD_SCALE_FACTOR ((SUMD_TARGET_MAX - SUMD_TARGET_MIN) / (SUMD_RANGE_MAX - SUMD_RANGE_MIN)) 111 #define SUMD_SCALE_OFFSET (int)(SUMD_TARGET_MIN - (SUMD_SCALE_FACTOR * SUMD_RANGE_MIN + 0.5f)) 122 crc ^= (uint16_t)value << 8;
124 for (i = 0; i < 8; i++) {
125 crc = (crc & 0x8000) ? (crc << 1) ^ 0x1021 : (crc << 1);
138 uint16_t max_chan_count)
146 printf(
" SUMD_DECODE_STATE_UNSYNCED \n") ;
161 printf(
" SUMD_DECODE_STATE_GOT_HEADER: %x \n", byte) ;
188 printf(
" SUMD_DECODE_STATE_GOT_STATE: %x \n", byte) ;
212 printf(
" SUMD_DECODE_STATE_GOT_LEN: %x (%d) \n", byte, byte) ;
235 printf(
" SUMD_DECODE_STATE_GOT_DATA[%d]: %x\n",
_rxlen - 2, byte) ;
242 printf(
" SUMD_DECODE_STATE_GOT_DATA -- finish --\n") ;
253 printf(
" SUMD_DECODE_STATE_GOT_CRC16[1]: %x [%x]\n", byte, ((
_crc16 >> 8) & 0xff)) ;
269 printf(
" SUMD_DECODE_STATE_GOT_CRC16[2]: %x [%x]\n", byte, (
_crc16 & 0xff)) ;
280 printf(
" SUMD_DECODE_STATE_GOT_SUMH_TELEMETRY: %x\n", byte) ;
292 printf(
" SUMD_DECODE_STATE_GOT_CRC[2]: %x [%x]\n\n", byte, (
_crc16 & 0xff)) ;
303 printf(
" SUMD_DECODE_STATE_GOT_CRC8_SUMH: %x [%x]\n\n", byte,
_crc8) ;
318 printf(
" Got valid SUMD Packet\n") ;
323 printf(
" Got valid SUMH Packet\n") ;
334 uint8_t _cnt = *rx_count + 1;
340 if ((uint16_t)_rxpacket.
length > max_chan_count) {
341 _rxpacket.
length = (uint8_t) max_chan_count;
344 *channel_count = (uint16_t)_rxpacket.
length;
350 channels[0] = (uint16_t)((_rxpacket.
sumd_data[1 * 2 + 1] << 8) | _rxpacket.
sumd_data[1 * 2 + 2]) >> 3;
352 channels[1] = (uint16_t)((_rxpacket.
sumd_data[2 * 2 + 1] << 8) | _rxpacket.
sumd_data[2 * 2 + 2]) >> 3;
354 channels[2] = (uint16_t)((_rxpacket.
sumd_data[0 * 2 + 1] << 8) | _rxpacket.
sumd_data[0 * 2 + 2]) >> 3;
356 channels[3] = (uint16_t)((_rxpacket.
sumd_data[3 * 2 + 1] << 8) | _rxpacket.
sumd_data[3 * 2 + 2]) >> 3;
359 unsigned chan_index = 4;
361 for (i = 4; i < _rxpacket.
length; i++) {
368 channels[chan_index] = (uint16_t)((_rxpacket.
sumd_data[i * 2 + 1] << 8) | _rxpacket.
sumd_data[i * 2 + 2]) >> 3;
380 printf(
" CRC - fail \n") ;
int printf(const char *fmt,...)
uint8_t header
0xA8 for a valid packet
uint8_t status
0x01 valid and live SUMD data frame / 0x00 = SUMH / 0x81 = Failsafe
uint8_t telemetry
Telemetry request.
int sumd_decode(uint8_t byte, uint8_t *rssi, uint8_t *rx_count, uint16_t *channel_count, uint16_t *channels, uint16_t max_chan_count)
static uint16_t channels[SRXL_MAX_CHANNELS]
uint8_t sumd_data[SUMD_MAX_CHANNELS *2]
ChannelData (High Byte/ Low Byte)
uint8_t crc16_low
Low Byte of 16 Bit CRC.
static enum SUMD_DECODE_STATE _decode_state
static ReceiverFcPacketHoTT _rxpacket
uint8_t crc16_high
High Byte of 16 Bit CRC.
static uint8_t sumd_crc8(uint8_t crc, uint8_t value)
#define SUMD_MAX_CHANNELS
static uint16_t sumd_crc16(uint16_t crc, uint8_t value)