1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-24 00:35:18 +03:00

[Pulses] Refactoring

This commit is contained in:
Bertrand Songis 2019-03-12 17:46:27 +01:00
parent 9deaa04a71
commit fd012a52c7
14 changed files with 132 additions and 138 deletions

View file

@ -1670,6 +1670,7 @@ void menuModelSetup(event_t event)
} }
break; break;
#if !defined(PCBXLITE) #if !defined(PCBXLITE)
case ITEM_MODEL_EXTERNAL_MODULE_FREQ: case ITEM_MODEL_EXTERNAL_MODULE_FREQ:
{ {

View file

@ -73,7 +73,7 @@ void DeviceFirmwareUpdate::startup()
switch(module) { switch(module) {
case INTERNAL_MODULE: case INTERNAL_MODULE:
#if defined(INTMODULE_USART) #if defined(INTMODULE_USART)
intmoduleSerialStart(57600); intmoduleSerialStart(57600, true);
break; break;
#endif #endif

View file

@ -209,11 +209,7 @@ void setupPulsesPXXInternalModule()
void setupPulsesPXXExternalModule() void setupPulsesPXXExternalModule()
{ {
#if defined(EXTMODULE_USART)
extmodulePulsesData.pxx_uart.setupFrame(EXTERNAL_MODULE);
#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART)
extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE); extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE);
#endif
} }
#endif #endif

View file

@ -152,12 +152,9 @@ union InternalModulePulsesData {
union ExternalModulePulsesData { union ExternalModulePulsesData {
#if defined(PXX1) #if defined(PXX1)
#if defined(INTMODULE_USART) || defined(EXTMODULE_USART)
UartPxx1Pulses pxx_uart;
#endif
#if defined(PPM_PIN_SERIAL) #if defined(PPM_PIN_SERIAL)
SerialPxx1Pulses pxx; SerialPxx1Pulses pxx;
#elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) #else
PwmPxx1Pulses pxx; PwmPxx1Pulses pxx;
#endif #endif
#endif #endif

View file

@ -30,10 +30,10 @@ void intmoduleStop()
void intmodulePxxStart() void intmodulePxxStart()
{ {
// shouldn't be used anymore intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE, false);
} }
void intmoduleSerialStart(uint32_t baudrate) void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable)
{ {
INTERNAL_MODULE_ON(); INTERNAL_MODULE_ON();
@ -66,12 +66,13 @@ void intmoduleSerialStart(uint32_t baudrate)
USART_Init(INTMODULE_USART, &USART_InitStructure); USART_Init(INTMODULE_USART, &USART_InitStructure);
USART_Cmd(INTMODULE_USART, ENABLE); USART_Cmd(INTMODULE_USART, ENABLE);
if (rxEnable) {
intmoduleFifo.clear(); intmoduleFifo.clear();
USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE); USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE);
NVIC_SetPriority(INTMODULE_USART_IRQn, 6); NVIC_SetPriority(INTMODULE_USART_IRQn, 6);
NVIC_EnableIRQ(INTMODULE_USART_IRQn); NVIC_EnableIRQ(INTMODULE_USART_IRQn);
} }
}
#define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE)
extern "C" void INTMODULE_USART_IRQHandler(void) extern "C" void INTMODULE_USART_IRQHandler(void)
@ -119,10 +120,17 @@ void intmoduleSendBuffer(const uint8_t * data, uint8_t size)
void intmoduleSendNextFrame() void intmoduleSendNextFrame()
{ {
switch(moduleSettings[INTERNAL_MODULE].protocol) {
#if defined(PXX2) #if defined(PXX2)
if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { case PROTOCOL_CHANNELS_PXX2:
intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize()); intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize());
} break;
#endif
#if defined(PXX1)
case PROTOCOL_CHANNELS_PXX1:
intmoduleSendBuffer(intmodulePulsesData.pxx_uart.getData(), intmodulePulsesData.pxx_uart.getSize());
break;
#endif #endif
} }
}

View file

@ -212,6 +212,7 @@ void disable_pxx(uint8_t module);
void init_pxx2(uint8_t module); void init_pxx2(uint8_t module);
void disable_pxx2(uint8_t module); void disable_pxx2(uint8_t module);
void init_serial(uint8_t module, uint32_t baudrate, uint32_t period_half_us); void init_serial(uint8_t module, uint32_t baudrate, uint32_t period_half_us);
void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable);
void disable_serial(uint8_t module); void disable_serial(uint8_t module);
void intmoduleSendNextFrame(); void intmoduleSendNextFrame();
void extmoduleSendNextFrame(); void extmoduleSendNextFrame();

View file

@ -22,7 +22,7 @@
void intmoduleStop(); void intmoduleStop();
void intmodulePxxStart(); void intmodulePxxStart();
void intmoduleSerialStart(uint32_t baudrate); void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable);
void extmoduleStop(); void extmoduleStop();
void extmodulePpmStart(); void extmodulePpmStart();
@ -48,7 +48,7 @@ void disable_ppm(uint8_t module)
void init_pxx2(uint8_t module) void init_pxx2(uint8_t module)
{ {
if (module == INTERNAL_MODULE) if (module == INTERNAL_MODULE)
intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE); intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE, true);
else else
extmodulePxx2Start(); extmodulePxx2Start();
} }

View file

@ -122,7 +122,7 @@ elseif(PCB STREQUAL XLITE)
set(GVAR_SCREEN model_gvars.cpp) set(GVAR_SCREEN model_gvars.cpp)
set(STATUS_LEDS YES) set(STATUS_LEDS YES)
elseif(PCB STREQUAL XLITES) elseif(PCB STREQUAL XLITES)
set(PXX_FREQUENCY "HIGH" CACHE STRING "PXX frequency (LOW / HIGH)") set(PXX_FREQUENCY "HIGH")
set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)")
set(CPU_TYPE STM32F2) set(CPU_TYPE STM32F2)
set(CPU_TYPE_FULL STM32F205xE) # for size report set(CPU_TYPE_FULL STM32F205xE) # for size report

View file

@ -21,6 +21,7 @@
#ifndef _BOARD_H_ #ifndef _BOARD_H_
#define _BOARD_H_ #define _BOARD_H_
#include <inttypes.h>
#include "../definitions.h" #include "../definitions.h"
#include "cpu_id.h" #include "cpu_id.h"
@ -180,7 +181,7 @@ void init_serial(uint8_t module, uint32_t baudrate, uint32_t period);
void disable_serial(uint8_t module); void disable_serial(uint8_t module);
void intmoduleStop(); void intmoduleStop();
void intmodulePxxStart(); void intmodulePxxStart();
void intmoduleSerialStart(uint32_t baudrate); void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable);
#if defined(TARANIS_INTERNAL_PPM) #if defined(TARANIS_INTERNAL_PPM)
void intmodulePpmStart(void); void intmodulePpmStart(void);
#endif #endif

View file

@ -195,16 +195,18 @@ extern "C" void EXTMODULE_USART_IRQHandler(void)
} }
} }
void extmodulePxxStart()
{
extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE);
}
void extmodulePxx2Start() void extmodulePxx2Start()
{ {
extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE); extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE);
} }
#else #else
void extmodulePxx2Start()
{
// TODO just enable the S.PORT line (or let telemetry init do it)
}
#endif
#if defined(PXX1)
void extmodulePxxStart() void extmodulePxxStart()
{ {
EXTERNAL_MODULE_ON(); EXTERNAL_MODULE_ON();
@ -239,16 +241,12 @@ void extmodulePxxStart()
NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn);
NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7); NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7);
} }
void extmodulePxx2Start()
{
// TODO just enable the S.PORT line (or let telemetry init do it)
}
#endif #endif
void extmoduleSendNextFrame() void extmoduleSendNextFrame()
{ {
if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { switch(moduleSettings[EXTERNAL_MODULE].protocol) {
case PROTOCOL_CHANNELS_PPM:
EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2;
EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here
EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance
@ -258,32 +256,10 @@ void extmoduleSendNextFrame()
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses); EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses);
EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses; EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses;
EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
} break;
#if defined(PXX1) #if defined(PXX1)
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { case PROTOCOL_CHANNELS_PXX1:
#if defined(EXTMODULE_USART)
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(EXTMODULE_USART_DMA_STREAM);
DMA_InitStructure.DMA_Channel = EXTMODULE_USART_DMA_CHANNEL;
DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&EXTMODULE_USART->DR);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(extmodulePulsesData.pxx_uart.getData());
DMA_InitStructure.DMA_BufferSize = extmodulePulsesData.pxx_uart.getSize();
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(EXTMODULE_USART_DMA_STREAM, &DMA_InitStructure);
DMA_Cmd(EXTMODULE_USART_DMA_STREAM, ENABLE);
USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE);
EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE;
#else
EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance
EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_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; EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_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;
@ -291,22 +267,27 @@ void extmoduleSendNextFrame()
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData());
EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize();
EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
break;
#endif #endif
}
#endif
#if defined(PXX2) #if defined(PXX2)
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { case PROTOCOL_CHANNELS_PXX2:
#if defined(EXTMODULE_USART) #if defined(EXTMODULE_USART)
extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize());
#else #else
sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize());
#endif #endif
} break;
#endif #endif
#if defined(DSM2) #if defined(DSM2)
else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { case PROTOCOL_CHANNELS_SBUS:
if (IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol))
EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // reverse polarity for Sbus if needed EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // reverse polarity for Sbus if needed
// no break
case PROTOCOL_CHANNELS_DSM2_LP45:
case PROTOCOL_CHANNELS_DSM2_DSM2:
case PROTOCOL_CHANNELS_DSM2_DSMX:
case PROTOCOL_CHANNELS_MULTIMODULE:
EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_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; EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_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;
@ -314,15 +295,18 @@ void extmoduleSendNextFrame()
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses);
EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses; EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses;
EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
} break;
#endif #endif
#if defined(CROSSFIRE) #if defined(CROSSFIRE)
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_CROSSFIRE) { case PROTOCOL_CHANNELS_CROSSFIRE:
sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length); sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length);
} break;
#endif #endif
else {
default:
EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE;
break;
} }
} }

View file

@ -65,7 +65,7 @@ void intmoduleSendNextFrame()
} }
} }
void intmoduleSerialStart(uint32_t baudrate) void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable)
{ {
// nothing, the pulses will be sent through telemetry port // nothing, the pulses will be sent through telemetry port
} }

View file

@ -39,7 +39,7 @@ void disable_pxx(uint8_t module)
void init_pxx2(uint8_t module) void init_pxx2(uint8_t module)
{ {
if (module == INTERNAL_MODULE) if (module == INTERNAL_MODULE)
intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE); intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE, true);
else else
extmodulePxx2Start(); extmodulePxx2Start();
} }

View file

@ -73,16 +73,22 @@ bool isForcePowerOffRequested()
return false; return false;
} }
bool isProtocolSynchronous(uint8_t protocol) bool isModuleSynchronous(uint8_t module)
{ {
return (protocol == PROTOCOL_CHANNELS_PXX2 || protocol == PROTOCOL_CHANNELS_CROSSFIRE || protocol == PROTOCOL_CHANNELS_NONE); uint8_t protocol = moduleSettings[module].protocol;
if (protocol == PROTOCOL_CHANNELS_PXX2 || protocol == PROTOCOL_CHANNELS_CROSSFIRE || protocol == PROTOCOL_CHANNELS_NONE)
return true;
#if defined(INTMODULE_USART)
if (protocol == PROTOCOL_CHANNELS_PXX1 && module == INTERNAL_MODULE)
return true;
#endif
return false;
} }
void sendSynchronousPulses() void sendSynchronousPulses()
{ {
for (uint8_t module = 0; module < NUM_MODULES; module++) { for (uint8_t module = 0; module < NUM_MODULES; module++) {
uint8_t protocol = moduleSettings[module].protocol; if (isModuleSynchronous(module) && setupPulses(module)) {
if (isProtocolSynchronous(protocol) && setupPulses(module)) {
if (module == INTERNAL_MODULE) if (module == INTERNAL_MODULE)
intmoduleSendNextFrame(); intmoduleSendNextFrame();
else else
@ -184,7 +190,7 @@ void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms)
{ {
// Schedule next mixer calculation time, // Schedule next mixer calculation time,
if (isProtocolSynchronous(moduleSettings[module].protocol)) { if (isModuleSynchronous(module)) {
nextMixerTime[module] += period_ms / RTOS_MS_PER_TICK; nextMixerTime[module] += period_ms / RTOS_MS_PER_TICK;
if (nextMixerTime[module] < RTOS_GET_TIME()) { if (nextMixerTime[module] < RTOS_GET_TIME()) {
// we are late ... let's add some small delay // we are late ... let's add some small delay