From 35cfa5a3f1436e89d04a3ec20cdc27c21bcddf20 Mon Sep 17 00:00:00 2001 From: nathan Date: Wed, 24 Feb 2016 20:19:09 -0800 Subject: [PATCH] sbus inversion option --- src/main/config/config.c | 1 + src/main/io/serial_cli.c | 1 + src/main/rx/rx.h | 1 + src/main/rx/sbus.c | 5 +++-- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/config/config.c b/src/main/config/config.c index f5e2b62874..54ce692def 100755 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -424,6 +424,7 @@ static void resetConf(void) resetTelemetryConfig(&masterConfig.telemetryConfig); masterConfig.rxConfig.serialrx_provider = 0; + masterConfig.rxConfig.sbus_inversion = 1; masterConfig.rxConfig.spektrum_sat_bind = 0; masterConfig.rxConfig.midrc = 1500; masterConfig.rxConfig.mincheck = 1100; diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index 68a89a3eb1..17502a76b3 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -566,6 +566,7 @@ const clivalue_t valueTable[] = { #endif { "serialrx_provider", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.rxConfig.serialrx_provider, .config.lookup = { TABLE_SERIAL_RX } }, + { "sbus_inversion", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.rxConfig.sbus_inversion, .config.lookup = { TABLE_OFF_ON } }, { "spektrum_sat_bind", VAR_UINT8 | MASTER_VALUE, &masterConfig.rxConfig.spektrum_sat_bind, .config.minmax = { SPEKTRUM_SAT_BIND_DISABLED, SPEKTRUM_SAT_BIND_MAX} }, { "telemetry_switch", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.telemetryConfig.telemetry_switch, .config.lookup = { TABLE_OFF_ON } }, diff --git a/src/main/rx/rx.h b/src/main/rx/rx.h index 1911d08877..99bf4b40c2 100644 --- a/src/main/rx/rx.h +++ b/src/main/rx/rx.h @@ -112,6 +112,7 @@ typedef struct rxChannelRangeConfiguration_s { typedef struct rxConfig_s { uint8_t rcmap[MAX_MAPPABLE_RX_INPUTS]; // mapping of radio channels to internal RPYTA+ order uint8_t serialrx_provider; // type of UART-based receiver (0 = spek 10, 1 = spek 11, 2 = sbus). Must be enabled by FEATURE_RX_SERIAL first. + uint8_t sbus_inversion; // default sbus (Futaba, FrSKY) is inverted. Support for uninverted OpenLRS (and modified FrSKY) receivers. uint8_t spektrum_sat_bind; // number of bind pulses for Spektrum satellite receivers uint8_t rssi_channel; uint8_t rssi_scale; diff --git a/src/main/rx/sbus.c b/src/main/rx/sbus.c index 75e9fdd7cd..3785ecffb9 100644 --- a/src/main/rx/sbus.c +++ b/src/main/rx/sbus.c @@ -67,7 +67,7 @@ static uint16_t sbusStateFlags = 0; #define SBUS_FRAME_BEGIN_BYTE 0x0F #define SBUS_BAUDRATE 100000 -#define SBUS_PORT_OPTIONS (SERIAL_STOPBITS_2 | SERIAL_PARITY_EVEN | SERIAL_INVERTED) +#define SBUS_PORT_OPTIONS (SERIAL_STOPBITS_2 | SERIAL_PARITY_EVEN) #define SBUS_DIGITAL_CHANNEL_MIN 173 #define SBUS_DIGITAL_CHANNEL_MAX 1812 @@ -92,7 +92,8 @@ bool sbusInit(rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig, rcReadRa return false; } - serialPort_t *sBusPort = openSerialPort(portConfig->identifier, FUNCTION_RX_SERIAL, sbusDataReceive, SBUS_BAUDRATE, MODE_RX, SBUS_PORT_OPTIONS); + portOptions_t options = (rxConfig->sbus_inversion) ? (SBUS_PORT_OPTIONS | SERIAL_INVERTED) : SBUS_PORT_OPTIONS; + serialPort_t *sBusPort = openSerialPort(portConfig->identifier, FUNCTION_RX_SERIAL, sbusDataReceive, SBUS_BAUDRATE, MODE_RX, options); return sBusPort != NULL; }