diff --git a/src/main/config/config.c b/src/main/config/config.c index ea4534f6e2..7a8e9a7a51 100755 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -523,7 +523,6 @@ void createDefaultConfig(master_t *config) #else config->rxConfig.serialrx_provider = 0; #endif - config->rxConfig.ibus_model = 0; config->rxConfig.sbus_inversion = 1; config->rxConfig.spektrum_sat_bind = 0; config->rxConfig.spektrum_sat_bind_autoreset = 1; diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index 45355ef854..92d8b22621 100755 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -429,10 +429,6 @@ static const char * const lookupTableSerialRX[] = { }; #endif -static const char * const lookupTableIbusModel[] = { - "IA6B", "IA6" -}; - static const char * const lookupTableGyroLpf[] = { "OFF", "188HZ", @@ -550,7 +546,6 @@ typedef enum { #ifdef SERIAL_RX TABLE_SERIAL_RX, #endif - TABLE_IBUS_MODEL, TABLE_GYRO_LPF, TABLE_ACC_HARDWARE, #ifdef BARO @@ -590,7 +585,6 @@ static const lookupTableEntry_t lookupTables[] = { #ifdef SERIAL_RX { lookupTableSerialRX, sizeof(lookupTableSerialRX) / sizeof(char *) }, #endif - { lookupTableIbusModel, sizeof(lookupTableIbusModel) / sizeof(char *) }, { lookupTableGyroLpf, sizeof(lookupTableGyroLpf) / sizeof(char *) }, { lookupTableAccHardware, sizeof(lookupTableAccHardware) / sizeof(char *) }, #ifdef BARO @@ -736,7 +730,6 @@ const clivalue_t valueTable[] = { #ifdef SERIAL_RX { "serialrx_provider", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.rxConfig.serialrx_provider, .config.lookup = { TABLE_SERIAL_RX } }, #endif - { "ibus_model", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.rxConfig.ibus_model, .config.lookup = { TABLE_IBUS_MODEL } }, { "sbus_inversion", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.rxConfig.sbus_inversion, .config.lookup = { TABLE_OFF_ON } }, #ifdef SPEKTRUM_BIND { "spektrum_sat_bind", VAR_UINT8 | MASTER_VALUE, &masterConfig.rxConfig.spektrum_sat_bind, .config.minmax = { SPEKTRUM_SAT_BIND_DISABLED, SPEKTRUM_SAT_BIND_MAX} }, diff --git a/src/main/rx/ibus.c b/src/main/rx/ibus.c index 2064d40975..53a63c1511 100755 --- a/src/main/rx/ibus.c +++ b/src/main/rx/ibus.c @@ -46,15 +46,15 @@ #define IBUS_BUFFSIZE 32 #define IBUS_MODEL_IA6B 0 #define IBUS_MODEL_IA6 1 +#define IBUS_FRAME_GAP 500 #define IBUS_BAUDRATE 115200 -static uint8_t ibusModel = 0; -static uint8_t ibusSyncByte = 0x20; -static uint8_t ibusFrameSize = 32; -static uint8_t ibusChannelOffset = 2; -static uint32_t ibusInterframeGap = 3000; -static uint16_t ibusChecksum = 0xFFFF; +static uint8_t ibusModel; +static uint8_t ibusSyncByte; +static uint8_t ibusFrameSize; +static uint8_t ibusChannelOffset; +static uint16_t ibusChecksum; static bool ibusFrameDone = false; static uint32_t ibusChannelData[IBUS_MAX_CHANNEL]; @@ -64,19 +64,13 @@ static uint16_t ibusReadRawRC(rxRuntimeConfig_t *rxRuntimeConfig, uint8_t chan); bool ibusInit(rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig, rcReadRawDataPtr *callback) { - - if (rxConfig->ibus_model == IBUS_MODEL_IA6) { - ibusModel = 1; - ibusSyncByte = 0x55; - ibusFrameSize = 31; - ibusInterframeGap = 500; - ibusChecksum = 0x0000; - ibusChannelOffset = 1; - } + UNUSED(rxConfig); if (callback) *callback = ibusReadRawRC; + ibusSyncByte = 0; + rxRuntimeConfig->channelCount = IBUS_MAX_CHANNEL; serialPortConfig_t *portConfig = findSerialPortConfig(FUNCTION_RX_SERIAL); @@ -112,13 +106,32 @@ static void ibusDataReceive(uint16_t c) ibusTime = micros(); - if ((ibusTime - ibusTimeLast) > ibusInterframeGap) + if ((ibusTime - ibusTimeLast) > IBUS_FRAME_GAP) ibusFramePosition = 0; ibusTimeLast = ibusTime; - if (ibusFramePosition == 0 && c != ibusSyncByte) - return; + if (ibusFramePosition == 0) { + if (ibusSyncByte == 0) { + // detect the frame type based on the STX byte. + if (c == 0x55) { + ibusModel = IBUS_MODEL_IA6; + ibusSyncByte = 0x55; + ibusFrameSize = 31; + ibusChecksum = 0x0000; + ibusChannelOffset = 1; + } else if (c == 0x20) { + ibusModel = IBUS_MODEL_IA6B; + ibusSyncByte = 0x20; + ibusFrameSize = 32; + ibusChannelOffset = 2; + ibusChecksum = 0xFFFF; + } else + return; + } else if (ibusSyncByte != c) { + return; + } + } ibus[ibusFramePosition] = (uint8_t)c; @@ -143,20 +156,19 @@ uint8_t ibusFrameStatus(void) chksum = ibusChecksum; rxsum = ibus[ibusFrameSize - 2] + (ibus[ibusFrameSize - 1] << 8); - if (ibusModel == IBUS_MODEL_IA6) { - for (i = 0, offset = ibusChannelOffset; i < IBUS_MAX_CHANNEL; i++, offset += 2) - chksum += ibus[offset] + (ibus[offset + 1] << 8); - } else { - for (i = 0; i < 30; i++) - chksum -= ibus[i]; + for (i = 0, offset = ibusChannelOffset; i < IBUS_MAX_CHANNEL; i++, offset += 2) + chksum += ibus[offset] + (ibus[offset + 1] << 8); + } else { + for (i = 0; i < 30; i++) + chksum -= ibus[i]; } if (chksum == rxsum) { for (i = 0, offset = ibusChannelOffset; i < IBUS_MAX_CHANNEL; i++, offset += 2) { - ibusChannelData[i] = ibus[offset] + (ibus[offset + 1] << 8); - } - frameStatus = SERIAL_RX_FRAME_COMPLETE; + ibusChannelData[i] = ibus[offset] + (ibus[offset + 1] << 8); + } + frameStatus = SERIAL_RX_FRAME_COMPLETE; } return frameStatus; diff --git a/src/main/rx/rx.h b/src/main/rx/rx.h index 153d145dfc..effd1cc526 100644 --- a/src/main/rx/rx.h +++ b/src/main/rx/rx.h @@ -112,7 +112,6 @@ 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 ibus_model; 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 spektrum_sat_bind_autoreset; // whenever we will reset (exit) binding mode after hard reboot