diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 7aa5735ec..954c33114 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -119,11 +119,7 @@ void setupPulsesPXX(uint8_t module) void setupPulsesPXX2(uint8_t module) { - if (module == INTERNAL_MODULE) { - if (modulePulsesData[module].pxx2.setupFrame(module)) { - intmoduleSendNextPXX2Frame(); - } - } + modulePulsesData[module].pxx2.setupFrame(module); #if 0 // here we have to wait that telemetryInit() is called, hence this test @@ -281,7 +277,7 @@ void setupPulses(uint8_t module, uint8_t protocol) } } -void setupPulses(uint8_t module) +bool setupPulses(uint8_t module) { uint8_t required_protocol = getRequiredProtocol(module); @@ -291,9 +287,11 @@ void setupPulses(uint8_t module) disablePulses(module, moduleSettings[module].protocol); moduleSettings[module].protocol = required_protocol; enablePulses(module, required_protocol); + return false; } else { setupPulses(module, required_protocol); + return true; } } diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 10ab978b3..dc6021127 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -161,7 +161,7 @@ union TrainerPulsesData { extern TrainerPulsesData trainerPulsesData; -void setupPulses(uint8_t module); +bool setupPulses(uint8_t module); void setupPulsesDSM2(uint8_t module); void setupPulsesCrossfire(uint8_t module); void setupPulsesMultimodule(uint8_t module); 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 9daf81f85..a4b607191 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -94,7 +94,7 @@ extern "C" void INTMODULE_USART_IRQHandler(void) } } -void intmoduleSendNextPXX2Frame() +void intmoduleSendNextFrame() { if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { DMA_InitTypeDef DMA_InitStructure; diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index e14a75487..f186147af 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -288,6 +288,6 @@ extern "C" void EXTMODULE_TIMER_IRQHandler() { EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - setupPulses(EXTERNAL_MODULE); - extmoduleSendNextFrame(); + if (setupPulses(EXTERNAL_MODULE)) + extmoduleSendNextFrame(); } diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 64a6a4679..945b5a99e 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -183,7 +183,7 @@ void init_no_pulses(uint8_t module); void disable_no_pulses(uint8_t module); void init_ppm(uint8_t module); void disable_ppm(uint8_t module); -void intmoduleSendNextPXX2Frame(); +void intmoduleSendNextFrame(); void init_pxx2(uint8_t module); void disable_pxx2(uint8_t module); void init_pxx(uint8_t module); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 652346fba..9d27034a2 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -94,6 +94,9 @@ void extmodulePpmStart() EXTMODULE_TIMER->EGR = 1; EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2PE; // PWM mode 1 + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -126,6 +129,9 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) EXTMODULE_TIMER->EGR = 1; // Restart EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0; + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -224,6 +230,9 @@ void extmodulePxxStart() EXTMODULE_TIMER->EGR = 1; // Restart EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -315,6 +324,7 @@ extern "C" void EXTMODULE_TIMER_CC_IRQHandler() { EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - setupPulses(EXTERNAL_MODULE); - extmoduleSendNextFrame(); + if (setupPulses(EXTERNAL_MODULE)) { + extmoduleSendNextFrame(); + } } diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index e7ea2fc37..e76500d91 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -97,11 +97,6 @@ void intmodulePxx2Start() // TODO } -void intmoduleSendNextPXX2Frame() -{ - // TODO -} - void intmodulePxxStart() { INTERNAL_MODULE_ON(); @@ -186,6 +181,6 @@ extern "C" void INTMODULE_TIMER_CC_IRQHandler() { INTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - setupPulses(INTERNAL_MODULE); - intmoduleSendNextFrame(); + if (setupPulses(INTERNAL_MODULE)) + intmoduleSendNextFrame(); } diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index e01f7a9d6..8ccae5eb1 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -82,8 +82,8 @@ void sendSynchronousPulses() { for (uint8_t module = 0; module < NUM_MODULES; module++) { uint8_t protocol = moduleSettings[module].protocol; - if (isProtocolSynchronous(protocol)) { - setupPulses(module); + if (isProtocolSynchronous(protocol) && setupPulses(module)) { + intmoduleSendNextFrame(); } } }