Skip to content

Commit

Permalink
Added Spektrum SRXL2 serial protocol for new receivers (Currently onl…
Browse files Browse the repository at this point in the history
…y SPM4650 released)
  • Loading branch information
DieHertz authored and MiguelFAlvarez committed Aug 7, 2019
1 parent a01cb0c commit 8a279e6
Show file tree
Hide file tree
Showing 14 changed files with 845 additions and 38 deletions.
2 changes: 2 additions & 0 deletions make/source.mk
Expand Up @@ -110,6 +110,7 @@ COMMON_SRC = \
rx/sbus.c \
rx/sbus_channels.c \
rx/spektrum.c \
rx/srxl2.c \
io/spektrum_vtx_control.c \
io/spektrum_rssi.c \
rx/sumd.c \
Expand Down Expand Up @@ -253,6 +254,7 @@ SPEED_OPTIMISED_SRC := $(SPEED_OPTIMISED_SRC) \
rx/sbus.c \
rx/sbus_channels.c \
rx/spektrum.c \
rx/srxl2.c \
rx/sumd.c \
rx/xbus.c \
rx/fport.c \
Expand Down
55 changes: 37 additions & 18 deletions src/main/cli/cli.c
Expand Up @@ -151,6 +151,7 @@ uint8_t cliMode = 0;
#include "rx/rx.h"
#include "rx/spektrum.h"
#include "rx/rx_spi_common.h"
#include "rx/srxl2.h"

#include "scheduler/scheduler.h"

Expand Down Expand Up @@ -3251,38 +3252,56 @@ static void cliBeeper(char *cmdline)
}
#endif

#ifdef USE_RX_SPI
void cliRxSpiBind(char *cmdline){
#if defined(USE_RX_SPI) || defined (USE_SERIALRX_SRXL2)
void cliRxBind(char *cmdline){
UNUSED(cmdline);
switch (rxSpiConfig()->rx_spi_protocol) {
default:
cliPrint("Not supported.");
break;
if (featureIsEnabled(FEATURE_RX_SERIAL)) {
switch (rxConfig()->serialrx_provider) {
default:
cliPrint("Not supported.");
break;
#if defined(USE_SERIALRX_SRXL2)
case SERIALRX_SRXL2:
srxl2Bind();
cliPrint("Binding SRXL2 receiver...");
break;
#endif
}
}
#if defined(USE_RX_SPI)
else if (featureIsEnabled(FEATURE_RX_SPI)) {
switch (rxSpiConfig()->rx_spi_protocol) {
default:
cliPrint("Not supported.");
break;
#if defined(USE_RX_FRSKY_SPI)
#if defined(USE_RX_FRSKY_SPI_D)
case RX_SPI_FRSKY_D:
case RX_SPI_FRSKY_D:
#endif
#if defined(USE_RX_FRSKY_SPI_X)
case RX_SPI_FRSKY_X:
case RX_SPI_FRSKY_X_LBT:
case RX_SPI_FRSKY_X:
case RX_SPI_FRSKY_X_LBT:
#endif
#endif // USE_RX_FRSKY_SPI
#ifdef USE_RX_SFHSS_SPI
case RX_SPI_SFHSS:
case RX_SPI_SFHSS:
#endif
#ifdef USE_RX_FLYSKY
case RX_SPI_A7105_FLYSKY:
case RX_SPI_A7105_FLYSKY_2A:
case RX_SPI_A7105_FLYSKY:
case RX_SPI_A7105_FLYSKY_2A:
#endif
#ifdef USE_RX_SPEKTRUM
case RX_SPI_CYRF6936_DSM:
case RX_SPI_CYRF6936_DSM:
#endif
#if defined(USE_RX_FRSKY_SPI) || defined(USE_RX_SFHSS_SPI) || defined(USE_RX_FLYSKY) || defined(USE_RX_SPEKTRUM)
rxSpiBind();
cliPrint("Binding...");
break;
rxSpiBind();
cliPrint("Binding...");
break;
#endif
}

}
#endif
}
#endif

Expand Down Expand Up @@ -5982,8 +6001,8 @@ const clicmd_t cmdTable[] = {
CLI_COMMAND_DEF("beeper", "enable/disable beeper for a condition", "list\r\n"
"\t<->[name]", cliBeeper),
#endif // USE_BEEPER
#ifdef USE_RX_SPI
CLI_COMMAND_DEF("bind_rx_spi", "initiate binding for RX SPI", NULL, cliRxSpiBind),
#if defined(USE_RX_SPI) || defined (USE_SERIALRX_SRXL2)
CLI_COMMAND_DEF("bind_rx", "initiate binding for RX SPI or SRXL2", NULL, cliRxBind),
#endif
#if defined(USE_FLASH_BOOT_LOADER)
CLI_COMMAND_DEF("bl", "reboot into bootloader", "[flash|rom]", cliBootloader),
Expand Down
5 changes: 5 additions & 0 deletions src/main/cli/settings.c
Expand Up @@ -224,6 +224,7 @@ static const char * const lookupTableSerialRX[] = {
"CUSTOM",
"FPORT",
"DJI_HDL",
"SRXL2",
};
#endif

Expand Down Expand Up @@ -703,6 +704,10 @@ const clivalue_t valueTable[] = {
#ifdef USE_SPEKTRUM_BIND
{ "spektrum_sat_bind", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { SPEKTRUM_SAT_BIND_DISABLED, SPEKTRUM_SAT_BIND_MAX}, PG_RX_CONFIG, offsetof(rxConfig_t, spektrum_sat_bind) },
{ "spektrum_sat_bind_autoreset",VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_RX_CONFIG, offsetof(rxConfig_t, spektrum_sat_bind_autoreset) },
#endif
#ifdef USE_SERIALRX_SRXL2
{ "srxl2_unit_id", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 0xf }, PG_RX_CONFIG, offsetof(rxConfig_t, srxl2_unit_id) },
{ "srxl2_baud_fast", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_RX_CONFIG, offsetof(rxConfig_t, srxl2_baud_fast) },
#endif
{ "airmode_start_throttle_percent", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 100 }, PG_RX_CONFIG, offsetof(rxConfig_t, airModeActivateThreshold) },
{ "rx_min_usec", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { PWM_PULSE_MIN, PWM_PULSE_MAX }, PG_RX_CONFIG, offsetof(rxConfig_t, rx_min_usec) },
Expand Down
14 changes: 7 additions & 7 deletions src/main/io/displayport_srxl.c
Expand Up @@ -55,24 +55,24 @@ static int srxlWriteChar(displayPort_t *displayPort, uint8_t col, uint8_t row, u
static int srxlWriteString(displayPort_t *displayPort, uint8_t col, uint8_t row, const char *s)
{
while (*s) {
srxlWriteChar(displayPort, col++, row, *(s++));
srxlWriteChar(displayPort, col++, row, *(s++));
}
return 0;
}

static int srxlClearScreen(displayPort_t *displayPort)
{
for (int row = 0; row < SPEKTRUM_SRXL_TEXTGEN_BUFFER_ROWS; row++) {
for (int row = 0; row < SPEKTRUM_SRXL_TEXTGEN_BUFFER_ROWS; row++) {
for (int col= 0; col < SPEKTRUM_SRXL_TEXTGEN_BUFFER_COLS; col++) {
srxlWriteChar(displayPort, col, row, ' ');
}
}
srxlWriteString(displayPort, 1, 0, "BETAFLIGHT");
srxlWriteString(displayPort, 1, 0, "BETAFLIGHT");

if ( displayPort->grabCount == 0 ) {
srxlWriteString(displayPort, 0, 2, CMS_STARTUP_HELP_TEXT1);
srxlWriteString(displayPort, 2, 3, CMS_STARTUP_HELP_TEXT2);
srxlWriteString(displayPort, 2, 4, CMS_STARTUP_HELP_TEXT3);
if (displayPort->grabCount == 0) {
srxlWriteString(displayPort, 0, 2, CMS_STARTUP_HELP_TEXT1);
srxlWriteString(displayPort, 2, 3, CMS_STARTUP_HELP_TEXT2);
srxlWriteString(displayPort, 2, 4, CMS_STARTUP_HELP_TEXT3);
}
return 0;
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/pg/rx.c
Expand Up @@ -69,6 +69,8 @@ void pgResetFn_rxConfig(rxConfig_t *rxConfig)
.rc_smoothing_input_type = RC_SMOOTHING_INPUT_BIQUAD,
.rc_smoothing_derivative_type = RC_SMOOTHING_DERIVATIVE_BIQUAD,
.rc_smoothing_auto_factor = 10,
.srxl2_unit_id = 1,
.srxl2_baud_fast = 1,
);

#ifdef RX_CHANNELS_TAER
Expand Down
3 changes: 3 additions & 0 deletions src/main/pg/rx.h
Expand Up @@ -61,6 +61,9 @@ typedef struct rxConfig_s {
uint8_t rc_smoothing_derivative_type; // Derivative filter type (0 = OFF, 1 = PT1, 2 = BIQUAD)
uint8_t rc_smoothing_auto_factor; // Used to adjust the "smoothness" determined by the auto cutoff calculations
uint8_t rssi_src_frame_lpf_period; // Period of the cutoff frequency for the source frame RSSI filter (in 0.1 s)

uint8_t srxl2_unit_id;
uint8_t srxl2_baud_fast;
} rxConfig_t;

PG_DECLARE(rxConfig_t, rxConfig);
6 changes: 6 additions & 0 deletions src/main/rx/rx.c
Expand Up @@ -58,6 +58,7 @@
#include "rx/fport.h"
#include "rx/sbus.h"
#include "rx/spektrum.h"
#include "rx/srxl2.h"
#include "rx/sumd.h"
#include "rx/sumh.h"
#include "rx/msp.h"
Expand Down Expand Up @@ -183,6 +184,11 @@ bool serialRxInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig
{
bool enabled = false;
switch (rxConfig->serialrx_provider) {
#ifdef USE_SERIALRX_SRXL2
case SERIALRX_SRXL2:
enabled = srxl2RxInit(rxConfig, rxRuntimeConfig);
break;
#endif
#ifdef USE_SERIALRX_SPEKTRUM
case SERIALRX_SRXL:
case SERIALRX_SPEKTRUM1024:
Expand Down
1 change: 1 addition & 0 deletions src/main/rx/rx.h
Expand Up @@ -67,6 +67,7 @@ typedef enum {
SERIALRX_TARGET_CUSTOM = 11,
SERIALRX_FPORT = 12,
SERIALRX_DJI_HDL_7MS = 13,
SERIALRX_SRXL2 = 14,
} SerialRXType;

#define MAX_SUPPORTED_RC_PPM_CHANNEL_COUNT 12
Expand Down
6 changes: 5 additions & 1 deletion src/main/rx/spektrum.c
Expand Up @@ -33,6 +33,8 @@
#include "drivers/light_led.h"
#include "drivers/system.h"
#include "drivers/time.h"
#include "drivers/serial.h"
#include "drivers/serial_uart.h"

#include "io/serial.h"

Expand Down Expand Up @@ -393,8 +395,10 @@ bool spektrumInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig
NULL,
SPEKTRUM_BAUDRATE,
portShared || srxlEnabled ? MODE_RXTX : MODE_RX,
(rxConfig->serialrx_inverted ? SERIAL_INVERTED : 0) | ((srxlEnabled || rxConfig->halfDuplex) ? SERIAL_BIDIR : 0)
(rxConfig->serialrx_inverted ? SERIAL_INVERTED : 0) |
((srxlEnabled || rxConfig->halfDuplex) ? SERIAL_BIDIR : 0)
);

#if defined(USE_TELEMETRY_SRXL)
if (portShared) {
telemetrySharedPort = serialPort;
Expand Down

0 comments on commit 8a279e6

Please sign in to comment.