diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 66bc01999..406dd39f0 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -29,6 +29,8 @@ #if defined(INTMODULE_USART) #include "intmodule_serial_driver.h" +#else +#include "intmodule_pulses_driver.h" #endif uint8_t s_pulses_paused = 0; @@ -381,6 +383,7 @@ void enablePulsesExternalModule(uint8_t protocol) bool setupPulsesExternalModule(uint8_t protocol) { switch (protocol) { + #if defined(PXX1) case PROTOCOL_CHANNELS_PXX1_PULSES: extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE); @@ -702,19 +705,37 @@ void intmoduleSendNextFrame() switch (moduleState[INTERNAL_MODULE].protocol) { #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: - intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize()); + intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), + intmodulePulsesData.pxx2.getSize()); + break; +#endif + +#if defined(INTERNAL_MODULE_PPM) + case PROTOCOL_CHANNELS_PPM: + intmoduleSendNextFramePPM( + intmodulePulsesData.ppm.pulses, + intmodulePulsesData.ppm.ptr - intmodulePulsesData.ppm.pulses); break; #endif #if defined(PXX1) +#if defined(INTMODULE_USART) case PROTOCOL_CHANNELS_PXX1_SERIAL: - intmoduleSendBuffer(intmodulePulsesData.pxx_uart.getData(), intmodulePulsesData.pxx_uart.getSize()); + intmoduleSendBuffer(intmodulePulsesData.pxx_uart.getData(), + intmodulePulsesData.pxx_uart.getSize()); break; +#else + case PROTOCOL_CHANNELS_PXX1_PULSES: + intmoduleSendNextFramePxx1(intmodulePulsesData.pxx.getData(), + intmodulePulsesData.pxx.getSize()); + break; +#endif #endif #if defined(INTERNAL_MODULE_MULTI) case PROTOCOL_CHANNELS_MULTIMODULE: - intmoduleSendBuffer(intmodulePulsesData.multi.getData(), intmodulePulsesData.multi.getSize()); + intmoduleSendBuffer(intmodulePulsesData.multi.getData(), + intmodulePulsesData.multi.getSize()); break; #endif diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 39fccf151..4a5ee98f9 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -37,53 +37,7 @@ void intmoduleStop() // #define HEARBEAT_OFFSET unsigned(6000 + g_model.flightModeData[0].gvars[0] * 100) constexpr unsigned HEARBEAT_OFFSET = 6000; -void intmoduleSendNextFrame() -{ - switch (moduleState[INTERNAL_MODULE].protocol) { #if defined(PXX1) - case PROTOCOL_CHANNELS_PXX1_PULSES: - { - if (INTMODULE_DMA_STREAM->CR & DMA_SxCR_EN) - return; - - //disable timer - INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - - //INTMODULE_TIMER->CCR2 = last - 4000; // 2mS in advance - INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); - INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.pxx.getData()); - INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.pxx.getSize(); - INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA - - // re-init timer - INTMODULE_TIMER->EGR = 1; - INTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - break; - } -#endif - -#if defined(INTERNAL_MODULE_PPM) - case PROTOCOL_CHANNELS_PPM: - INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2; - INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); - INTMODULE_TIMER->CCR2 = *(intmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance - INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); - INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.ppm.pulses); - INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.ppm.ptr - intmodulePulsesData.ppm.pulses; - INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA - break; -#endif - - default: - INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; - break; - } -} - void intmodulePxx1PulsesStart() { INTERNAL_MODULE_ON(); @@ -118,6 +72,29 @@ void intmodulePxx1PulsesStart() NVIC_SetPriority(INTMODULE_TIMER_CC_IRQn, 7); } +void intmoduleSendNextFramePxx1(const uint16_t* data, uint8_t size) +{ + if (INTMODULE_DMA_STREAM->CR & DMA_SxCR_EN) return; + + // disable timer + INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; + + // INTMODULE_TIMER->CCR2 = last - 4000; // 2mS in advance + INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | + DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | + DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); + INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(data); + INTMODULE_DMA_STREAM->NDTR = size; + INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA + + // re-init timer + INTMODULE_TIMER->EGR = 1; + INTMODULE_TIMER->CR1 |= TIM_CR1_CEN; +} +#endif + #if defined(INTERNAL_MODULE_PPM) void intmodulePpmStart() { @@ -150,6 +127,24 @@ void intmodulePpmStart() NVIC_EnableIRQ(INTMODULE_TIMER_CC_IRQn); NVIC_SetPriority(INTMODULE_TIMER_CC_IRQn, 7); } + +void intmoduleSendNextFramePPM(const uint8_t* data, uint8_t size) +{ + INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2; + INTMODULE_TIMER->CCER = + TIM_CCER_CC3E | + (GET_MODULE_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); + INTMODULE_TIMER->CCR2 = + *(intmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance + INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | + DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | + DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); + INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(data); + INTMODULE_DMA_STREAM->NDTR = size; + INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA +} #endif // defined(INTERNAL_MODULE_PPM) extern "C" void INTMODULE_DMA_STREAM_IRQHandler() diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.h b/radio/src/targets/taranis/intmodule_pulses_driver.h new file mode 100644 index 000000000..40c531c6d --- /dev/null +++ b/radio/src/targets/taranis/intmodule_pulses_driver.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#pragma once + +#if defined(PXX1) +void intmodulePxx1PulsesStart(); +void intmoduleSendNextFramePxx1(const uint16_t* data, uint8_t size); +#endif + +#if defined(INTERNAL_MODULE_PPM) +void intmodulePpmStart(); +void intmoduleSendNextFramePPM(const uint8_t* data, uint8_t size); +#endif + +void intmoduleStop();