From ba319a7bce9e2c5ec3d5800eca5d6e98ba69485e Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 26 Feb 2024 01:26:14 +0100 Subject: [PATCH] fix(trainer): allow Master/SBUS Module mode on S.Port pin (#4668) --- radio/src/gui/gui_common.cpp | 17 ++++++++++++++--- radio/src/hal/module_port.h | 10 +++++----- radio/src/trainer.cpp | 8 ++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 33dfd8ca2..c2b8a8121 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -1041,9 +1041,20 @@ bool isTrainerModeAvailable(int mode) } if (mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE) { - auto port = modulePortFind(EXTERNAL_MODULE, ETX_MOD_TYPE_SERIAL, - ETX_MOD_PORT_UART, ETX_Pol_Normal, - ETX_MOD_DIR_RX); + const etx_module_port_t *port = nullptr; + +#if defined(TRAINER_MODULE_SBUS_USART) + // check if UART with inverter on heartbeat pin is required and available for SBUS (some Taranis radios) + port = modulePortFind(EXTERNAL_MODULE, ETX_MOD_TYPE_SERIAL, + ETX_MOD_PORT_UART, ETX_Pol_Normal, + ETX_MOD_DIR_RX); +#else + //check if UART with inverter on S.Port pin is available for SBUS (e.g. TX16s, NV14) + port = modulePortFind(EXTERNAL_MODULE, ETX_MOD_TYPE_SERIAL, + ETX_MOD_PORT_SPORT, ETX_Pol_Normal, + ETX_MOD_DIR_RX); +#endif + return port != nullptr; } } diff --git a/radio/src/hal/module_port.h b/radio/src/hal/module_port.h index 39932ce60..8a5dafe34 100644 --- a/radio/src/hal/module_port.h +++ b/radio/src/hal/module_port.h @@ -40,11 +40,11 @@ #define ETX_MOD_TYPE_SERIAL (1 << 1) enum ModulePort : uint8_t { - ETX_MOD_PORT_UART, - ETX_MOD_PORT_TIMER, - ETX_MOD_PORT_SOFT_INV, - ETX_MOD_PORT_SPORT, - ETX_MOD_PORT_SPORT_INV, + ETX_MOD_PORT_UART, // UART on heartbeat pin + ETX_MOD_PORT_TIMER, // PPM or TX on CPPM pin + ETX_MOD_PORT_SOFT_INV, // TX soft-serial + ETX_MOD_PORT_SPORT, // UART on S.Port + ETX_MOD_PORT_SPORT_INV, // RX soft-serial sampled bit-by-bit via timer IRQ on S.PORT ETX_MOD_PORT_MAX }; diff --git a/radio/src/trainer.cpp b/radio/src/trainer.cpp index e5c349766..21926e3b5 100644 --- a/radio/src/trainer.cpp +++ b/radio/src/trainer.cpp @@ -180,8 +180,16 @@ static void trainer_init_module_sbus() { if (sbus_trainer_mod_st) return; +#if defined(TRAINER_MODULE_SBUS_USART) + // check if UART with inverter on heartbeat pin is required and available for SBUS (some Taranis radios) sbus_trainer_mod_st = modulePortInitSerial(EXTERNAL_MODULE, ETX_MOD_PORT_UART, &sbusTrainerParams, false); +#else + // check if UART with inverter on S.Port pin is available for SBUS (e.g. TX16s, NV14) + if(sbus_trainer_mod_st == nullptr) + sbus_trainer_mod_st = modulePortInitSerial(EXTERNAL_MODULE, ETX_MOD_PORT_SPORT, + &sbusTrainerParams, false); +#endif if (sbus_trainer_mod_st) { modulePortSetPower(EXTERNAL_MODULE,true);