From 59191f37c3b7bc52b48356f38b24f912e388ba73 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 25 Mar 2022 11:27:39 +0100 Subject: [PATCH 01/10] Use software timers to trigger telemetry processing --- radio/src/FreeRTOSConfig.h | 5 ++-- radio/src/io/frsky_pxx2.h | 3 +-- radio/src/pulses/pulses.cpp | 51 +++++++++++++++++++++++++++++++++++++ radio/src/pulses/pulses.h | 25 ++---------------- radio/src/tasks.cpp | 6 ----- 5 files changed, 57 insertions(+), 33 deletions(-) diff --git a/radio/src/FreeRTOSConfig.h b/radio/src/FreeRTOSConfig.h index e63e03594..b2f754f88 100644 --- a/radio/src/FreeRTOSConfig.h +++ b/radio/src/FreeRTOSConfig.h @@ -42,7 +42,7 @@ #define configUSE_APPLICATION_TASK_TAG 0 #define configUSE_COUNTING_SEMAPHORES 0 #define configGENERATE_RUN_TIME_STATS 0 -#define configUSE_TIMERS 0 +#define configUSE_TIMERS 1 #if !defined(DEBUG) #define configMAX_TASK_NAME_LEN 4 @@ -65,7 +65,7 @@ /* Software timer definitions. */ #define configTIMER_TASK_PRIORITY ( 2 ) #define configTIMER_QUEUE_LENGTH 10 -#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) +#define configTIMER_TASK_STACK_DEPTH ( 512 ) /* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */ @@ -73,6 +73,7 @@ to exclude the API function. */ #define INCLUDE_vTaskSuspend 1 #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTimerPendFunctionCall 1 #if defined(THREADSAFE_MALLOC) #define INCLUDE_xTaskGetSchedulerState 1 diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index 1ee9be85b..de13ff6ad 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -25,7 +25,7 @@ #include "../fifo.h" #include "../pulses/pxx.h" -class ModuleFifo : public Fifo { +class ModuleFifo : public Fifo { public: bool getFrame(uint8_t * frame) { @@ -74,7 +74,6 @@ class ModuleFifo : public Fifo { return ((crc >> 8) == crcLow) && ((crc & 0xFF) == crcHigh); } - uint32_t errors; }; #endif diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 2ef9b86ed..2bfec08f0 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -49,12 +49,63 @@ #include "pulses/afhds2.h" #endif +#include +#include + uint8_t s_pulses_paused = 0; ModuleState moduleState[NUM_MODULES]; InternalModulePulsesData intmodulePulsesData __DMA; ExternalModulePulsesData extmodulePulsesData __DMA; TrainerPulsesData trainerPulsesData __DMA; +static TimerHandle_t telemetryTimer = nullptr; +static StaticTimer_t telemetryTimerBuffer; + +void telemetryTimerCb(TimerHandle_t xTimer) +{ + (void)xTimer; + if (!s_pulses_paused) { + DEBUG_TIMER_START(debugTimerTelemetryWakeup); + telemetryWakeup(); + DEBUG_TIMER_STOP(debugTimerTelemetryWakeup); + } +} + +void startPulses() +{ + if (!telemetryTimer) { + telemetryTimer = + xTimerCreateStatic("Telem", 4 / RTOS_MS_PER_TICK, pdTRUE, (void*)0, + telemetryTimerCb, &telemetryTimerBuffer); + if (telemetryTimer) { + if( xTimerStart( telemetryTimer, 0 ) != pdPASS ) { + /* The timer could not be set into the Active state. */ + } + } + } + + s_pulses_paused = false; + +#if defined(HARDWARE_INTERNAL_MODULE) + setupPulsesInternalModule(); +#endif + +#if defined(HARDWARE_EXTERNAL_MODULE) + setupPulsesExternalModule(); +#endif + +#if defined(HARDWARE_EXTRA_MODULE) + extramodulePpmStart(); +#endif +} + +void stopPulses() +{ + s_pulses_paused = true; + for (uint8_t i = 0; i < NUM_MODULES; i++) + moduleState[i].protocol = PROTOCOL_CHANNELS_UNINITIALIZED; +} + void restartModule(uint8_t idx) { if (idx == INTERNAL_MODULE) { diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 8988588ac..0ad3b2848 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -260,29 +260,8 @@ uint8_t actualAfhdsRunPower(int moduleIndex); #endif void extramodulePpmStart(); -inline void startPulses() -{ - s_pulses_paused = false; - -#if defined(HARDWARE_INTERNAL_MODULE) - setupPulsesInternalModule(); -#endif - -#if defined(HARDWARE_EXTERNAL_MODULE) - setupPulsesExternalModule(); -#endif - -#if defined(HARDWARE_EXTRA_MODULE) - extramodulePpmStart(); -#endif -} - -inline void stopPulses() -{ - s_pulses_paused = true; - for (uint8_t i = 0; i < NUM_MODULES; i++) - moduleState[i].protocol = PROTOCOL_CHANNELS_UNINITIALIZED; -} +void startPulses(); +void stopPulses(); inline bool pulsesStarted() { diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 5ec392519..495a11718 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -100,12 +100,6 @@ void execMixerFrequentActions() #if defined(BLUETOOTH) bluetooth.wakeup(); #endif - - if (!s_pulses_paused) { - DEBUG_TIMER_START(debugTimerTelemetryWakeup); - telemetryWakeup(); - DEBUG_TIMER_STOP(debugTimerTelemetryWakeup); - } } TASK_FUNCTION(mixerTask) From a994fc708a0692c64d8a0d74fbdbdf790025173b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 25 Mar 2022 11:28:00 +0100 Subject: [PATCH 02/10] WiP internal module buffer --- radio/src/cli.cpp | 2 -- radio/src/hal/serial_driver.h | 2 -- radio/src/io/frsky_firmware_update.cpp | 2 -- radio/src/io/frsky_pxx2.h | 6 +++-- radio/src/io/multi_firmware_update.cpp | 2 -- radio/src/pulses/crossfire.cpp | 22 ------------------- radio/src/pulses/multi.cpp | 2 -- radio/src/pulses/pxx1.cpp | 2 -- radio/src/pulses/pxx2.cpp | 4 ---- radio/src/serial.cpp | 2 -- .../common/arm/stm32/aux_serial_driver.cpp | 2 +- .../arm/stm32/extmodule_serial_driver.cpp | 11 ++-------- .../arm/stm32/intmodule_serial_driver.cpp | 15 +++++-------- .../arm/stm32/intmodule_serial_driver.h | 4 ---- .../common/arm/stm32/timers_driver.cpp | 6 ++--- radio/src/targets/horus/board.h | 1 + radio/src/telemetry/frsky_pxx2.cpp | 2 ++ radio/src/telemetry/telemetry.cpp | 3 +++ 18 files changed, 20 insertions(+), 70 deletions(-) diff --git a/radio/src/cli.cpp b/radio/src/cli.cpp index 2824c5ed3..b7c00eb4e 100644 --- a/radio/src/cli.cpp +++ b/radio/src/cli.cpp @@ -1059,8 +1059,6 @@ static const etx_serial_init spIntmoduleSerialInitParams = { .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = true, - .on_receive = intmoduleFifoReceive, - .on_error = intmoduleFifoError, }; static void spInternalModuleSetBaudRate(uint32_t baud) diff --git a/radio/src/hal/serial_driver.h b/radio/src/hal/serial_driver.h index 2a5658aec..3ebc84b50 100644 --- a/radio/src/hal/serial_driver.h +++ b/radio/src/hal/serial_driver.h @@ -47,8 +47,6 @@ typedef struct { uint8_t word_length; // = ETX_WordLength_8; uint8_t rx_enable; // = false; - void (*on_receive)(uint8_t data); // = nullptr; - void (*on_error)(); // = nullptr; } etx_serial_init; struct etx_serial_callbacks_t { diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 1ad1e9cd2..3aa2e4274 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -316,8 +316,6 @@ static const etx_serial_init serialInitParams = { .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = true, - .on_receive = intmoduleFifoReceive, - .on_error = intmoduleFifoError, }; #endif diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index de13ff6ad..e48d99a9f 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -22,8 +22,10 @@ #ifndef _IO_PXX2_H_ #define _IO_PXX2_H_ -#include "../fifo.h" -#include "../pulses/pxx.h" +#include "fifo.h" +#include "pulses/pxx.h" + +#include "board.h" class ModuleFifo : public Fifo { public: diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index 5cff0fdd2..3366144fa 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -82,8 +82,6 @@ static const etx_serial_init serialInitParams = { .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = true, - .on_receive = intmoduleFifoReceive, - .on_error = intmoduleFifoError, }; class MultiInternalUpdateDriver: public MultiFirmwareUpdateDriver diff --git a/radio/src/pulses/crossfire.cpp b/radio/src/pulses/crossfire.cpp index ff5dbda2e..a38cfad80 100644 --- a/radio/src/pulses/crossfire.cpp +++ b/radio/src/pulses/crossfire.cpp @@ -111,31 +111,12 @@ static void crossfireSetupMixerScheduler(uint8_t module) } #if defined(INTERNAL_MODULE_CRSF) -static void intmoduleCRSF_rx(uint8_t data) -{ - intmoduleFifo.push(data); - -#if !defined(SIMU) - // wakeup mixer when rx buffer is quarter full (16 bytes) - if (intmoduleFifo.size() >= 16) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - xTaskNotifyFromISR(mixerTaskId.rtos_handle, 0, eNoAction, - &xHigherPriorityTaskWoken); - - // might effect a context switch on ISR exit - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } -#endif -} - static const etx_serial_init intmoduleCrossfireInitParams = { .baudrate = 0, .parity = ETX_Parity_None, .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = true, - .on_receive = intmoduleCRSF_rx, - .on_error = nullptr, }; static void* crossfireInitInternal(uint8_t module) @@ -146,9 +127,6 @@ static void* crossfireInitInternal(uint8_t module) etx_serial_init params(intmoduleCrossfireInitParams); params.baudrate = INT_CROSSFIRE_BAUDRATE; - // wakeup mixer when rx buffer is quarter full (16 bytes) - params.on_receive = intmoduleCRSF_rx; - intmoduleFifo.clear(); IntmoduleSerialDriver.init(¶ms); INTERNAL_MODULE_ON(); diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index fb950ccbb..38e3f0a13 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -60,8 +60,6 @@ etx_serial_init multiSerialInitParams = { .stop_bits = ETX_StopBits_Two, .word_length = ETX_WordLength_9, .rx_enable = true, - .on_receive = intmoduleFifoReceive, - .on_error = intmoduleFifoError, }; #endif diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 833cb53b2..e170a8010 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -231,8 +231,6 @@ static const etx_serial_init pxx1SerialInit = { .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = false, - .on_receive = intmoduleFifoReceive, - .on_error = intmoduleFifoError, }; static void* pxx1InitInternal(uint8_t module) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 6fe768266..a2b89778a 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -36,8 +36,6 @@ const etx_serial_init pxx2SerialInitParams = { .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = true, - .on_receive = intmoduleFifoReceive, - .on_error = intmoduleFifoError, }; #endif @@ -717,8 +715,6 @@ static const etx_serial_init pxx2ExtSerialInitParams = { .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = true, - .on_receive = extmoduleFifoReceive, - .on_error = extmoduleFifoError, }; static void* pxx2InitLowSpeed(uint8_t module) diff --git a/radio/src/serial.cpp b/radio/src/serial.cpp index 45ba48871..6006ec144 100644 --- a/radio/src/serial.cpp +++ b/radio/src/serial.cpp @@ -290,8 +290,6 @@ void serialInit(uint8_t port_nr, int mode) .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = false, - .on_receive = nullptr, - .on_error = nullptr, }; bool power_required = false; diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 7e19ef328..bc5c78ef5 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -52,7 +52,7 @@ static void* aux_serial_init(const SerialState* st, const etx_serial_init* param { stm32_usart_init(st->usart, params); - if (params->rx_enable && st->usart->rxDMA && !params->on_receive) { + if (params->rx_enable && st->usart->rxDMA) { st->rxFifo->clear(); stm32_usart_init_rx_dma(st->usart, st->rxFifo->buffer(), st->rxFifo->size()); } diff --git a/radio/src/targets/common/arm/stm32/extmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/extmodule_serial_driver.cpp index 3854367ce..dfc2947f1 100644 --- a/radio/src/targets/common/arm/stm32/extmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/extmodule_serial_driver.cpp @@ -38,19 +38,12 @@ void extmoduleFifoReceive(uint8_t data) extmoduleFifo.push(data); } -void extmoduleFifoError() -{ - extmoduleFifo.errors++; -} - static const etx_serial_init extmoduleSerialParams = { .baudrate = 0, .parity = ETX_Parity_None, .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = true, - .on_receive = extmoduleFifoReceive, - .on_error = extmoduleFifoError, }; static const LL_GPIO_InitTypeDef extmoduleUSART_PinDef = { @@ -80,8 +73,8 @@ static void* extmoduleSerialStart(const etx_serial_init* params) { if (!params) return nullptr; - extmodule_driver.on_receive = params->on_receive; - extmodule_driver.on_error = params->on_error; + extmodule_driver.on_receive = extmoduleFifoReceive; + extmodule_driver.on_error = nullptr; // UART config stm32_usart_init(&extmoduleUSART, params); diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 3f38ce167..30b381b67 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -23,9 +23,9 @@ #include "intmodule_serial_driver.h" #include "stm32_usart_driver.h" #include "board.h" +#include "fifo.h" -#include "io/frsky_pxx2.h" -ModuleFifo intmoduleFifo; +Fifo intmoduleFifo; #if !defined(INTMODULE_DMA_STREAM) static uint8_t * intmoduleTxBufferData; @@ -54,16 +54,11 @@ static etx_serial_callbacks_t intmodule_driver = { }; // TODO: move this somewhere else -void intmoduleFifoReceive(uint8_t data) +static void intmoduleFifoReceive(uint8_t data) { intmoduleFifo.push(data); } -void intmoduleFifoError() -{ - intmoduleFifo.errors++; -} - static const LL_GPIO_InitTypeDef intmoduleUSART_PinDef = { .Pin = INTMODULE_TX_GPIO_PIN | INTMODULE_RX_GPIO_PIN, .Mode = LL_GPIO_MODE_ALTERNATE, @@ -110,8 +105,8 @@ void* intmoduleSerialStart(const etx_serial_init* params) // - the UART seems to block when initialised with baudrate = 0 // init callbacks - intmodule_driver.on_receive = params->on_receive; - intmodule_driver.on_error = params->on_error; + intmodule_driver.on_receive = intmoduleFifoReceive; + intmodule_driver.on_error = nullptr; stm32_usart_init(&intmoduleUSART, params); return nullptr; diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.h b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.h index 4ae11f99a..4ee4a63f9 100644 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.h +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.h @@ -26,8 +26,4 @@ #define INTMODULE_USART_IRQ_PRIORITY 6 -// Callbacks using intmoduleFifo -void intmoduleFifoReceive(uint8_t data); -void intmoduleFifoError(); - extern const etx_serial_driver_t IntmoduleSerialDriver; diff --git a/radio/src/targets/common/arm/stm32/timers_driver.cpp b/radio/src/targets/common/arm/stm32/timers_driver.cpp index d058f51ba..1fe4644c3 100644 --- a/radio/src/targets/common/arm/stm32/timers_driver.cpp +++ b/radio/src/targets/common/arm/stm32/timers_driver.cpp @@ -67,8 +67,7 @@ static void interrupt1ms() #endif // 5ms loop - if (pre_scale == 5 || pre_scale == 10) - { + if (pre_scale == 5 || pre_scale == 10) { #if defined(HAPTIC) DEBUG_TIMER_START(debugTimerHaptic); HAPTIC_HEARTBEAT(); @@ -77,8 +76,7 @@ static void interrupt1ms() } // 10ms loop - if (pre_scale == 10) - { + if (pre_scale == 10) { pre_scale = 0; DEBUG_TIMER_START(debugTimerPer10ms); DEBUG_TIMER_SAMPLE(debugTimerPer10msPeriod); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 269134727..e5377eb18 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -615,6 +615,7 @@ int32_t getVolume(); #define VOLUME_LEVEL_DEF 12 // Telemetry driver +#define INTMODULE_FIFO_SIZE 512 #define TELEMETRY_FIFO_SIZE 512 void telemetryPortInit(uint32_t baudrate, uint8_t mode); void telemetryPortSetDirectionInput(); diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index ff52b081d..9c0fb04a7 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -29,6 +29,8 @@ #include "intmodule_serial_driver.h" #endif +static_assert(PXX2_FRAME_MAXLENGTH <= INTMODULE_FIFO_SIZE); + void processGetHardwareInfoFrame(uint8_t module, const uint8_t * frame) { if (moduleState[module].mode != MODULE_MODE_GET_HARDWARE_INFO) { diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 0c48b8283..e15ffe331 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -275,6 +275,9 @@ void telemetryWakeup() { uint8_t requiredTelemetryProtocol = modelTelemetryProtocol(); + // TODO: needs to be moved to protocol/module init + // as-is, it implies only ONE telemetry protocol + // enabled at the same time if (telemetryProtocol != requiredTelemetryProtocol) { telemetryInit(requiredTelemetryProtocol); } From 0927847adb7fe79672218b592b94891373d3e29a Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 25 Mar 2022 12:32:56 +0100 Subject: [PATCH 03/10] Stop telemetry timer when not needed --- radio/src/pulses/pulses.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 2bfec08f0..8bdbeceb5 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -101,6 +101,12 @@ void startPulses() void stopPulses() { + if (telemetryTimer) { + if( xTimerStop( telemetryTimer, 5 / RTOS_MS_PER_TICK ) != pdPASS ) { + /* The timer could not be set into the Active state. */ + } + } + s_pulses_paused = true; for (uint8_t i = 0; i < NUM_MODULES; i++) moduleState[i].protocol = PROTOCOL_CHANNELS_UNINITIALIZED; From 0613a291224ebc6e942008fa6c23cc9232101980 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 25 Mar 2022 12:59:21 +0100 Subject: [PATCH 04/10] Cleanup --- radio/src/pulses/pulses.cpp | 33 ++------------------ radio/src/targets/simu/simpgmspace.cpp | 5 ++- radio/src/telemetry/frsky.h | 8 ----- radio/src/telemetry/telemetry.cpp | 42 ++++++++++++++++++++++++++ radio/src/telemetry/telemetry.h | 11 +++++++ 5 files changed, 60 insertions(+), 39 deletions(-) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 8bdbeceb5..fc99f8a38 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -58,32 +58,9 @@ InternalModulePulsesData intmodulePulsesData __DMA; ExternalModulePulsesData extmodulePulsesData __DMA; TrainerPulsesData trainerPulsesData __DMA; -static TimerHandle_t telemetryTimer = nullptr; -static StaticTimer_t telemetryTimerBuffer; - -void telemetryTimerCb(TimerHandle_t xTimer) -{ - (void)xTimer; - if (!s_pulses_paused) { - DEBUG_TIMER_START(debugTimerTelemetryWakeup); - telemetryWakeup(); - DEBUG_TIMER_STOP(debugTimerTelemetryWakeup); - } -} - void startPulses() { - if (!telemetryTimer) { - telemetryTimer = - xTimerCreateStatic("Telem", 4 / RTOS_MS_PER_TICK, pdTRUE, (void*)0, - telemetryTimerCb, &telemetryTimerBuffer); - if (telemetryTimer) { - if( xTimerStart( telemetryTimer, 0 ) != pdPASS ) { - /* The timer could not be set into the Active state. */ - } - } - } - + telemetryStart(); s_pulses_paused = false; #if defined(HARDWARE_INTERNAL_MODULE) @@ -101,13 +78,9 @@ void startPulses() void stopPulses() { - if (telemetryTimer) { - if( xTimerStop( telemetryTimer, 5 / RTOS_MS_PER_TICK ) != pdPASS ) { - /* The timer could not be set into the Active state. */ - } - } - + telemetryStop(); s_pulses_paused = true; + for (uint8_t i = 0; i < NUM_MODULES; i++) moduleState[i].protocol = PROTOCOL_CHANNELS_UNINITIALIZED; } diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index ddd430b4c..055ce806f 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -52,7 +52,7 @@ GPIO_TypeDef gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, gpioh, gpioi, gpio USART_TypeDef Usart0, Usart1, Usart2, Usart3, Usart4; ADC_Common_TypeDef adc; RTC_TypeDef rtc; -void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) { } + void lcdCopy(void * dest, void * src); FATFS g_FATFS_Obj; @@ -802,3 +802,6 @@ struct TouchState getInternalTouchState() return simTouchState; } #endif + +void telemetryStart() {} +void telemetryStop() {} diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 14635f868..421847c25 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -283,14 +283,6 @@ void sportProcessTelemetryPacket(uint16_t id, uint8_t subId, uint8_t instance, uint32_t data, TelemetryUnit unit = UNIT_RAW); void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t *packet); -void telemetryWakeup(); -void telemetryReset(); - -extern uint8_t telemetryProtocol; -void telemetryInit(uint8_t protocol); - -void telemetryInterrupt10ms(); - bool pushFrskyTelemetryData(uint8_t data); // returns true when end of frame detected void processFrskyTelemetryData(uint8_t data); diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index e15ffe331..c6613c436 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -31,6 +31,9 @@ #include "libopenui.h" #endif +#include +#include + uint8_t telemetryStreaming = 0; uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) uint8_t telemetryRxBufferCount = 0; @@ -106,6 +109,45 @@ void telemetryMirrorSend(uint8_t data) } } +#if !defined(SIMU) +static TimerHandle_t telemetryTimer = nullptr; +static StaticTimer_t telemetryTimerBuffer; + +static void telemetryTimerCb(TimerHandle_t xTimer) +{ + (void)xTimer; + if (!s_pulses_paused) { + DEBUG_TIMER_START(debugTimerTelemetryWakeup); + telemetryWakeup(); + DEBUG_TIMER_STOP(debugTimerTelemetryWakeup); + } +} + +void telemetryStart() +{ + if (!telemetryTimer) { + telemetryTimer = + xTimerCreateStatic("Telem", 4 / RTOS_MS_PER_TICK, pdTRUE, (void*)0, + telemetryTimerCb, &telemetryTimerBuffer); + } + + if (telemetryTimer) { + if( xTimerStart( telemetryTimer, 0 ) != pdPASS ) { + /* The timer could not be set into the Active state. */ + } + } +} + +void telemetryStop() +{ + if (telemetryTimer) { + if( xTimerStop( telemetryTimer, 5 / RTOS_MS_PER_TICK ) != pdPASS ) { + /* The timer could not be set into the Active state. */ + } + } +} +#endif + void processTelemetryData(uint8_t data) { #if defined(CROSSFIRE) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index bd7c8ee47..a4e00dbd6 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -87,6 +87,17 @@ void telemetrySetMirrorCb(void* ctx, void (*fct)(void*, uint8_t)); // Mirror telemetry byte void telemetryMirrorSend(uint8_t data); +void telemetryWakeup(); +void telemetryReset(); + +extern uint8_t telemetryProtocol; +void telemetryInit(uint8_t protocol); + +void telemetryInterrupt10ms(); + +void telemetryStart(); +void telemetryStop(); + #define TELEMETRY_AVERAGE_COUNT 3 enum { From ead920bf1d5cc488227e80898f5a5065c901137a Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 27 Mar 2022 16:22:46 +0200 Subject: [PATCH 05/10] Fixed INTMODULE_FIFO_SIZE --- radio/src/targets/nv14/board.h | 1 + radio/src/targets/taranis/board.h | 2 ++ 2 files changed, 3 insertions(+) diff --git a/radio/src/targets/nv14/board.h b/radio/src/targets/nv14/board.h index a9b730e95..33bb94ebe 100644 --- a/radio/src/targets/nv14/board.h +++ b/radio/src/targets/nv14/board.h @@ -478,6 +478,7 @@ int32_t getVolume(); #define VOLUME_LEVEL_DEF 12 // Telemetry driver +#define INTMODULE_FIFO_SIZE 512 #define TELEMETRY_FIFO_SIZE 512 void telemetryPortInit(uint32_t baudrate, uint8_t mode); void telemetryPortSetDirectionOutput(); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index f9b65c20f..d2c77e8bf 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -976,6 +976,8 @@ void setTopBatteryValue(uint32_t volts); extern Fifo telemetryFifo; #endif +#define INTMODULE_FIFO_SIZE 128 + // Gyro driver #define GYRO_VALUES_COUNT 6 #define GYRO_BUFFER_LENGTH (GYRO_VALUES_COUNT * sizeof(int16_t)) From dcc8902f175180291c50a2a4f37bea3cd4d24157 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 27 Mar 2022 16:29:49 +0200 Subject: [PATCH 06/10] Fixed PXX1 serial external --- radio/src/pulses/pxx1.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index e170a8010..a8f4ebefb 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -291,8 +291,6 @@ static const etx_serial_init pxx1ExtSerialInit = { .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = false, - .on_receive = extmoduleFifoReceive, - .on_error = extmoduleFifoError, }; static void* pxx1InitExternal(uint8_t module) From 1017172350e65560ec27a97634bf883b8fa37506 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 27 Mar 2022 17:03:41 +0200 Subject: [PATCH 07/10] Fix MPM firmware update --- radio/src/io/multi_firmware_update.cpp | 14 +++----------- .../targets/common/arm/stm32/extmodule_driver.cpp | 11 +++++++++++ .../targets/common/arm/stm32/extmodule_driver.h | 1 + radio/src/targets/simu/module_drivers.cpp | 1 + 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index 3366144fa..6151031cc 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -128,6 +128,7 @@ class MultiInternalUpdateDriver: public MultiFirmwareUpdateDriver }; #endif +#if defined(HARDWARE_EXTERNAL_MODULE) class MultiExternalUpdateDriver: public MultiFirmwareUpdateDriver { public: @@ -141,15 +142,7 @@ class MultiExternalUpdateDriver: public MultiFirmwareUpdateDriver void init(bool inverted) override { -#if !defined(EXTMODULE_USART) - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(EXTMODULE_TX_GPIO, &GPIO_InitStructure); -#endif + extmoduleInitTxPin(); if (inverted) telemetryPortInvertedInit(57600); @@ -164,9 +157,7 @@ class MultiExternalUpdateDriver: public MultiFirmwareUpdateDriver void sendByte(uint8_t byte) const override { -#if defined(HARDWARE_EXTERNAL_MODULE) extmoduleSendInvertedByte(byte); -#endif } void clear() const override @@ -184,6 +175,7 @@ class MultiExternalUpdateDriver: public MultiFirmwareUpdateDriver clear(); } }; +#endif class MultiExtSportUpdateDriver: public MultiFirmwareUpdateDriver { diff --git a/radio/src/targets/common/arm/stm32/extmodule_driver.cpp b/radio/src/targets/common/arm/stm32/extmodule_driver.cpp index e877e9bdb..0e28537a4 100644 --- a/radio/src/targets/common/arm/stm32/extmodule_driver.cpp +++ b/radio/src/targets/common/arm/stm32/extmodule_driver.cpp @@ -144,6 +144,17 @@ void extmoduleSendNextFrameSoftSerial(const void* pulses, uint16_t length, bool stm32_pulse_start_dma_req(&extmoduleTimer, pulses, length, LL_TIM_OCMODE_TOGGLE, 0); } +void extmoduleInitTxPin() +{ + LL_GPIO_InitTypeDef pinInit; + LL_GPIO_StructInit(&pinInit); + pinInit.Pin = extmoduleTimer.GPIO_Pin; + pinInit.Mode = LL_GPIO_MODE_OUTPUT; + pinInit.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + pinInit.Pull = LL_GPIO_PULL_UP; + LL_GPIO_Init(extmoduleTimer.GPIOx, &pinInit); +} + // Delay based byte sending @ 57600 bps void extmoduleSendInvertedByte(uint8_t byte) { diff --git a/radio/src/targets/common/arm/stm32/extmodule_driver.h b/radio/src/targets/common/arm/stm32/extmodule_driver.h index 0146e0af1..581c8dd4e 100644 --- a/radio/src/targets/common/arm/stm32/extmodule_driver.h +++ b/radio/src/targets/common/arm/stm32/extmodule_driver.h @@ -41,4 +41,5 @@ void extmoduleSendNextFrameSoftSerial(const void* pulses, uint16_t length, bool polarity = true); // Bitbang serial +void extmoduleInitTxPin(); void extmoduleSendInvertedByte(uint8_t byte); diff --git a/radio/src/targets/simu/module_drivers.cpp b/radio/src/targets/simu/module_drivers.cpp index 39f7e9821..25e8a855d 100644 --- a/radio/src/targets/simu/module_drivers.cpp +++ b/radio/src/targets/simu/module_drivers.cpp @@ -42,6 +42,7 @@ void extmodulePpmStart(unsigned short, bool) {} void extmoduleSerialStart() {} void extmodulePxx1SerialStart() {} void extmodulePxx1PulsesStart() {} +void extmoduleInitTxPin() {} void extmoduleSendInvertedByte(uint8_t) {} void extmoduleSendNextFramePxx1(void const*, unsigned short) {} void extmoduleSendNextFrameSoftSerial(void const*, unsigned short, bool) {} From 885c0d1a2e8653e6ed08c109a3519c2dc6e85200 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 27 Mar 2022 17:09:41 +0200 Subject: [PATCH 08/10] Fix targets without trainer port --- radio/src/targets/simu/module_drivers.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/simu/module_drivers.cpp b/radio/src/targets/simu/module_drivers.cpp index 25e8a855d..f11a2f19c 100644 --- a/radio/src/targets/simu/module_drivers.cpp +++ b/radio/src/targets/simu/module_drivers.cpp @@ -48,11 +48,12 @@ void extmoduleSendNextFramePxx1(void const*, unsigned short) {} void extmoduleSendNextFrameSoftSerial(void const*, unsigned short, bool) {} void extmoduleSendNextFramePpm(void*, unsigned short, unsigned short, bool) {} +#if defined(TRAINER_GPIO) void init_trainer_ppm() {} void stop_trainer_ppm() {} - void init_trainer_capture() {} void stop_trainer_capture() {} +#endif void init_trainer_module_cppm() {} void stop_trainer_module_cppm() {} From d318f6d9bd52fe98ab9f63db4ab131f7a6b504d6 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 27 Mar 2022 17:19:05 +0200 Subject: [PATCH 09/10] MPM firmware update again... --- radio/src/io/multi_firmware_update.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index 6151031cc..f9f1faaef 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -608,14 +608,16 @@ bool MultiDeviceFirmwareUpdate::flashFirmware(const char * filename, ProgressHan } std::unique_ptr driver; - if (module == EXTERNAL_MODULE) - driver.reset(new MultiExternalUpdateDriver()); #if defined(INTERNAL_MODULE_MULTI) - else if (module == INTERNAL_MODULE) + if (type == MULTI_TYPE_MULTIMODULE && module == INTERNAL_MODULE) driver.reset(new MultiInternalUpdateDriver()); #endif - else if (type == MULTI_TYPE_ELRS) +#if defined(HARDWARE_EXTERNAL_MODULE) + if (type == MULTI_TYPE_MULTIMODULE && module == EXTERNAL_MODULE) + driver.reset(new MultiExternalUpdateDriver()); + if (type == MULTI_TYPE_ELRS && module == EXTERNAL_MODULE) driver.reset(new MultiExtSportUpdateDriver()); +#endif pausePulses(); From ee10cf9ff854572902c8519acd5818dd1f30c918 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 27 Mar 2022 17:43:14 +0200 Subject: [PATCH 10/10] Fix AFHDS2 --- radio/src/pulses/afhds2.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/radio/src/pulses/afhds2.cpp b/radio/src/pulses/afhds2.cpp index b8be70990..7429b294f 100644 --- a/radio/src/pulses/afhds2.cpp +++ b/radio/src/pulses/afhds2.cpp @@ -45,8 +45,6 @@ const etx_serial_init afhds2SerialInitParams = { .stop_bits = ETX_StopBits_One, .word_length = ETX_WordLength_8, .rx_enable = true, - .on_receive = intmoduleFifoReceive, - .on_error = intmoduleFifoError, }; static void* afhds2Init(uint8_t module)