diff --git a/src/lib/rc/CMakeLists.txt b/src/lib/rc/CMakeLists.txt index bb39f92c3f..21059b9ac4 100644 --- a/src/lib/rc/CMakeLists.txt +++ b/src/lib/rc/CMakeLists.txt @@ -35,10 +35,11 @@ px4_add_module( COMPILE_FLAGS -Wno-unused-result SRCS - st24.c - sumd.c - sbus.c - dsm.c + st24.cpp + sumd.cpp + sbus.cpp + dsm.cpp + common_rc.cpp DEPENDS platforms__common ) diff --git a/src/lib/rc/common_rc.cpp b/src/lib/rc/common_rc.cpp new file mode 100644 index 0000000000..2a271c8d0e --- /dev/null +++ b/src/lib/rc/common_rc.cpp @@ -0,0 +1,4 @@ + +#include "common_rc.h" + +__EXPORT rc_decode_buf_t rc_decode_buf; diff --git a/src/lib/rc/common_rc.h b/src/lib/rc/common_rc.h new file mode 100644 index 0000000000..d564144f25 --- /dev/null +++ b/src/lib/rc/common_rc.h @@ -0,0 +1,33 @@ + +#pragma once + +#include + +#include "dsm.h" +#include "sbus.h" +#include "st24.h" +#include "sumd.h" +#include "dsm.h" + +#pragma pack(push, 1) +typedef uint8_t dsm_frame_t[DSM_BUFFER_SIZE]; /**< DSM dsm frame receive buffer */ +typedef uint8_t dsm_buf_t[DSM_FRAME_SIZE * 2]; // Define working buffer + +typedef struct dsm_decode_t { + dsm_frame_t frame; + dsm_buf_t buf; +} dsm_decode_t; + +typedef uint8_t sbus_frame_t[SBUS_FRAME_SIZE + (SBUS_FRAME_SIZE / 2)]; + +typedef struct rc_decode_buf_ { + union { + dsm_decode_t dsm; + sbus_frame_t sbus_frame; + ReceiverFcPacket _strxpacket; + ReceiverFcPacketHoTT _hottrxpacket; + }; +} rc_decode_buf_t; +#pragma pack(pop) + +extern rc_decode_buf_t rc_decode_buf; diff --git a/src/lib/rc/dsm.c b/src/lib/rc/dsm.cpp similarity index 98% rename from src/lib/rc/dsm.c rename to src/lib/rc/dsm.cpp index d87711184f..383d588290 100644 --- a/src/lib/rc/dsm.c +++ b/src/lib/rc/dsm.cpp @@ -32,7 +32,7 @@ ****************************************************************************/ /** - * @file dsm.c + * @file dsm.cpp * * Serial protocol decoder for the Spektrum DSM* family of protocols. * @@ -49,6 +49,7 @@ #include #include "dsm.h" +#include "common_rc.h" #include #if defined (__PX4_LINUX) || defined (__PX4_DARWIN) || defined(__PX4_QURT) @@ -68,8 +69,9 @@ static enum DSM_DECODE_STATE { static int dsm_fd = -1; /**< File handle to the DSM UART */ static hrt_abstime dsm_last_rx_time; /**< Timestamp when we last received data */ static hrt_abstime dsm_last_frame_time; /**< Timestamp for start of last valid dsm frame */ -static uint8_t dsm_frame[DSM_BUFFER_SIZE]; /**< DSM dsm frame receive buffer */ -static uint8_t dsm_buf[DSM_FRAME_SIZE * 2]; +static dsm_frame_t &dsm_frame = rc_decode_buf.dsm.frame; /**< DSM_BUFFER_SIZE DSM dsm frame receive buffer */ +static dsm_buf_t &dsm_buf = rc_decode_buf.dsm.buf; /**< DSM_BUFFER_SIZE DSM dsm frame receive buffer */ + static uint16_t dsm_chan_buf[DSM_MAX_CHANNEL_COUNT]; static unsigned dsm_partial_frame_count; /**< Count of bytes received for current dsm frame */ static unsigned dsm_channel_shift = 0; /**< Channel resolution, 0=unknown, 1=10 bit, 2=11 bit */ diff --git a/src/lib/rc/sbus.c b/src/lib/rc/sbus.cpp similarity index 99% rename from src/lib/rc/sbus.c rename to src/lib/rc/sbus.cpp index 4f0475165c..dfcf2f4dd8 100644 --- a/src/lib/rc/sbus.c +++ b/src/lib/rc/sbus.cpp @@ -49,6 +49,7 @@ #endif #include "sbus.h" +#include "common_rc.h" #include #define SBUS_DEBUG_LEVEL 0 /* Set debug output level */ @@ -116,7 +117,7 @@ static enum SBUS2_DECODE_STATE { SBUS2_DECODE_STATE_SBUS2_DATA2 = 0x34 } sbus_decode_state = SBUS2_DECODE_STATE_DESYNC; -static uint8_t sbus_frame[SBUS_FRAME_SIZE + (SBUS_FRAME_SIZE / 2)]; +static sbus_frame_t &sbus_frame = rc_decode_buf.sbus_frame; static unsigned partial_frame_count; static unsigned sbus1_frame_delay = (1000U * 1000U) / SBUS1_DEFAULT_RATE_HZ; diff --git a/src/lib/rc/st24.c b/src/lib/rc/st24.cpp similarity index 98% rename from src/lib/rc/st24.c rename to src/lib/rc/st24.cpp index d1f74e04de..ae04cd948b 100644 --- a/src/lib/rc/st24.c +++ b/src/lib/rc/st24.cpp @@ -42,6 +42,7 @@ #include #include #include "st24.h" +#include "common_rc.h" enum ST24_DECODE_STATE { ST24_DECODE_STATE_UNSYNCED = 0, @@ -74,7 +75,7 @@ const char *decode_states[] = {"UNSYNCED", static enum ST24_DECODE_STATE _decode_state = ST24_DECODE_STATE_UNSYNCED; static uint8_t _rxlen; -static ReceiverFcPacket _rxpacket; +static ReceiverFcPacket &_rxpacket = rc_decode_buf._strxpacket; uint8_t st24_common_crc8(uint8_t *ptr, uint8_t len) { diff --git a/src/lib/rc/sumd.c b/src/lib/rc/sumd.cpp similarity index 98% rename from src/lib/rc/sumd.c rename to src/lib/rc/sumd.cpp index 0c829cee2c..db02227c82 100644 --- a/src/lib/rc/sumd.c +++ b/src/lib/rc/sumd.cpp @@ -42,7 +42,7 @@ #include #include #include "sumd.h" - +#include "common_rc.h" enum SUMD_DECODE_STATE { SUMD_DECODE_STATE_UNSYNCED = 0, @@ -88,8 +88,7 @@ bool _debug = false; static enum SUMD_DECODE_STATE _decode_state = SUMD_DECODE_STATE_UNSYNCED; static uint8_t _rxlen; -static ReceiverFcPacketHoTT _rxpacket; - +static ReceiverFcPacketHoTT &_rxpacket = rc_decode_buf._hottrxpacket; uint16_t sumd_crc16(uint16_t crc, uint8_t value) {