From 125fd2ba28ff649a84c7cd117eb694ec3a873fc3 Mon Sep 17 00:00:00 2001 From: richardclli Date: Sat, 15 Apr 2023 17:04:34 +0800 Subject: [PATCH] fix: Missing configurable port code, R9M Access, support FRM303 via mod (#3442) * Fix configurable external module port * Added FRM303 support for TX16S via AUX1 mod, i.e. direct connect AUX1 TX/RX to PPM/Heartbeat pins. --------- Co-authored-by: raphaelcoeffic --- radio/src/hal/module_port.cpp | 20 ++++++++++---------- radio/src/pulses/afhds3.cpp | 12 ++++++++++-- radio/src/pulses/pulses.cpp | 2 +- radio/src/serial.cpp | 16 ++++++++++++---- radio/src/targets/horus/CMakeLists.txt | 4 ++++ 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/radio/src/hal/module_port.cpp b/radio/src/hal/module_port.cpp index c54b67746..c6df3ead5 100644 --- a/radio/src/hal/module_port.cpp +++ b/radio/src/hal/module_port.cpp @@ -31,6 +31,16 @@ extern const uint8_t _n_modules; static etx_module_state_t _module_states[MAX_MODULES]; static uint8_t _module_power; +#if defined(CONFIGURABLE_MODULE_PORT) +// supplemental configurable port +static etx_module_port_t _extra_module_port; + +void modulePortConfigExtra(const etx_module_port_t* port) +{ + memcpy(&_extra_module_port, port, sizeof(_extra_module_port)); +} +#endif + void modulePortInit() { memset(_module_states, 0, sizeof(_module_states)); @@ -42,16 +52,6 @@ void modulePortInit() #endif } -#if defined(CONFIGURABLE_MODULE_PORT) -// supplemental configurable port -static etx_module_port_t _extra_module_port; - -void modulePortConfigExtra(const etx_module_port_t* port) -{ - memcpy(&_extra_module_port, port, sizeof(_extra_module_port)); -} -#endif - static void modulePortClear(etx_module_state_t* st) { memset(st, 0, sizeof(etx_module_state_t)); diff --git a/radio/src/pulses/afhds3.cpp b/radio/src/pulses/afhds3.cpp index 607220cdf..ebdaa7615 100644 --- a/radio/src/pulses/afhds3.cpp +++ b/radio/src/pulses/afhds3.cpp @@ -992,10 +992,18 @@ static void* initModule(uint8_t module) module == INTERNAL_MODULE ? ETX_Pol_Normal : ETX_Pol_Inverted; mod_st = modulePortInitSerial(module, ETX_MOD_PORT_UART, ¶ms); - if (module == EXTERNAL_MODULE && !mod_st) { +#if defined(CONFIGURABLE_MODULE_PORT) + if (!mod_st && module == EXTERNAL_MODULE) { + // Try Connect using aux serial mod + params.polarity = ETX_Pol_Normal; + mod_st = modulePortInitSerial(module, ETX_MOD_PORT_UART, ¶ms); + } +#endif + + if (!mod_st && module == EXTERNAL_MODULE) { // soft-serial fallback params.baudrate = AFHDS3_SOFTSERIAL_BAUDRATE; - params.direction = ETX_Dir_RX; + params.direction = ETX_Dir_TX; period = AFHDS3_SOFTSERIAL_COMMAND_TIMEOUT * 1000 /* us */; mod_st = modulePortInitSerial(module, ETX_MOD_PORT_SOFT_INV, ¶ms); // TODO: telemetry RX ??? diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index c3b95db5e..641b25fb6 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -470,7 +470,7 @@ static void pulsesEnableModule(uint8_t module, uint8_t protocol) break; #endif -#if defined(INTERNAL_MODULE_AFHDS3) +#if defined(INTERNAL_MODULE_AFHDS3) || defined(AFHDS3) case PROTOCOL_CHANNELS_AFHDS3: _init_module(module, &afhds3::ProtoDriver); break; diff --git a/radio/src/serial.cpp b/radio/src/serial.cpp index e1f708075..2899ba9fb 100644 --- a/radio/src/serial.cpp +++ b/radio/src/serial.cpp @@ -29,6 +29,11 @@ #include "hal/serial_port.h" +#if defined(CONFIGURABLE_MODULE_PORT) + #include "hal/module_port.h" + #include "tasks/mixer_task.h" +#endif + #if !defined(BOOT) #include "opentx.h" #include "lua/lua_api.h" @@ -257,13 +262,14 @@ static void serialSetCallBacks(int mode, void* ctx, const etx_serial_port_t* por etx_module_port_t mod_port; memset(&mod_port, 0, sizeof(mod_port)); auto mod_st = modulePortGetState(EXTERNAL_MODULE); - if (mod_st && mod_st->tx.hw_def == port->hw_def) { + if (mod_st && mod_st->tx.port && + mod_st->tx.port->hw_def == port->hw_def) { // port is in use, let's stop it mixerTaskStop(); - pausePulses(); + pulsesStop(); pulsesStopModule(EXTERNAL_MODULE); modulePortConfigExtra(&mod_port); - resumePulses(); + pulsesStart(); mixerTaskStart(); } else { modulePortConfigExtra(&mod_port); @@ -397,10 +403,12 @@ void serialInit(uint8_t port_nr, int mode) #if defined(CONFIGURABLE_MODULE_PORT) if (mode == UART_MODE_EXT_MODULE) { etx_module_port_t mod_port = { - .port = ETX_MOD_PORT_EXTERNAL_UART, + .port = ETX_MOD_PORT_UART, .type = ETX_MOD_TYPE_SERIAL, .dir_flags = ETX_MOD_DIR_TX_RX, .drv = { .serial = port->uart }, + .hw_def = port->hw_def, + .set_inverted = nullptr, }; modulePortConfigExtra(&mod_port); state->mode = mode; diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index fa983641f..52ffddd90 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -193,6 +193,10 @@ if(IMU_LSM6DS33) set(AUX_SERIAL OFF) endif() +if(AUX_SERIAL) + add_definitions(-DCONFIGURABLE_MODULE_PORT) +endif() + if(NOT INTERNAL_MODULE_PXX1) option(ALLOW_TRAINER_MULTI "Allow multimodule to be use as trainer input" OFF) endif()