diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index f88bf37ab..0b226ce20 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -122,6 +122,20 @@ uint8_t getRequiredProtocol(uint8_t port) return required_protocol; } +void setupPulsesPXX(uint8_t port) +{ +#if defined(INTMODULE_USART) && defined(EXTMODULE_USART) + modulePulsesData[port].pxx_uart.setupFrame(port); +#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART) + modulePulsesData[port].pxx.setupFrame(port); +#else + if (IS_UART_MODULE(port)) + modulePulsesData[port].pxx_uart.setupFrame(port); + else + modulePulsesData[port].pxx.setupFrame(port); +#endif +} + void setupPulses(uint8_t port) { bool init_needed = false; @@ -177,7 +191,7 @@ void setupPulses(uint8_t port) // Set up output data here switch (required_protocol) { case PROTO_PXX: - modulePulsesData[port].pxx.setupFrame(port); + setupPulsesPXX(port); scheduleNextMixerCalculation(port, PXX_PERIOD); break; diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 5fd2619a8..744abb07b 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -21,20 +21,15 @@ #ifndef _PULSES_ARM_H_ #define _PULSES_ARM_H_ +#include "pulses/pxx2.h" +#include "pulses/pxx1.h" + #if NUM_MODULES == 2 #define MODULES_INIT(...) __VA_ARGS__, __VA_ARGS__ #else #define MODULES_INIT(...) __VA_ARGS__ #endif -#if defined(PCBX12S) && PCBREV < 13 - #define pulse_duration_t uint32_t - #define trainer_pulse_duration_t uint16_t -#else - #define pulse_duration_t uint16_t - #define trainer_pulse_duration_t uint16_t -#endif - extern uint8_t s_current_protocol[NUM_MODULES]; extern uint8_t s_pulses_paused; extern uint16_t failsafeCounter[NUM_MODULES]; @@ -44,18 +39,6 @@ template struct PpmPulsesData { T * ptr; }; -#if defined(PPM_PIN_SERIAL) -PACK(struct PxxSerialPulsesData { - uint8_t pulses[64]; - uint8_t * ptr; - uint16_t pcmValue; - uint16_t pcmCrc; - uint32_t pcmOnesCount; - uint16_t serialByte; - uint16_t serialBitCount; -}); -#endif - #if defined(PPM_PIN_SERIAL) PACK(struct Dsm2SerialPulsesData { uint8_t pulses[64]; @@ -74,15 +57,6 @@ PACK(struct Dsm2TimerPulsesData { }); #endif -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) || defined(PXX2) -PACK(struct PxxUartPulsesData { - uint8_t pulses[64]; - uint8_t * ptr; - uint16_t pcmCrc; - uint16_t _alignment; -}); -#endif - #define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/ #define PPM_PERIOD(module) (PPM_PERIOD_HALF_US(module) / 2000) /*ms*/ #define DSM2_BAUDRATE 125000 @@ -93,48 +67,22 @@ PACK(struct PxxUartPulsesData { #define MULTIMODULE_BAUDRATE 100000 #define MULTIMODULE_PERIOD 7 /*ms*/ -#if !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) -/* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ -/* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */ -/* Multimodule uses 3 bytes header + 22 channel bytes with max 11 changes per byte (8e2) + 16 bits trailer ~= 291 max pulses */ -/* Multimodule reuses some of the DSM2 function and structs since the protocols are similar enough */ -/* sbus is 1 byte header, 22 channel bytes (11bit * 16ch) + 1 byte flags */ - -#if defined(PXX_FREQUENCY_HIGH) -#error "Pulses array needs to be increased (PXX_FREQUENCY=HIGH)" -#endif - -PACK(struct PxxTimerPulsesData { - pulse_duration_t pulses[200]; - pulse_duration_t * ptr; - uint16_t rest; - uint16_t pcmCrc; - uint32_t pcmOnesCount; -}); -#endif - -#if !defined(BOOT) -#include "pulses/pxx2.h" -#include "pulses/pxx1.h" -#endif - #define CROSSFIRE_FRAME_MAXLEN 64 PACK(struct CrossfirePulsesData { uint8_t pulses[CROSSFIRE_FRAME_MAXLEN]; }); union ModulePulsesData { -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) && !defined(BOOT) +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) UartPxxPulses pxx_uart; #endif -#if defined(BOOT) -#elif defined(PPM_PIN_SERIAL) +#if defined(PPM_PIN_SERIAL) SerialPxxPulses pxx; #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) PwmPxxPulses pxx; #endif -#if defined(PXX2) && !defined(BOOT) +#if defined(PXX2) Pxx2Pulses pxx2; #endif diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index 69257831a..19a547ac7 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -178,4 +178,6 @@ void PxxPulses::addExtraFlags(uint8_t port) } template class PxxPulses >; +template class PxxPulses >; template class PxxPulses; +template class PxxPulses; diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index ce96cf5d6..c9c0a3fca 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -37,6 +37,17 @@ #define PXX_PERIOD 9/*ms*/ #endif +#if defined(PXX_FREQUENCY_HIGH) && (!defined(INTMODULE_USART) || !defined(EXTMODULE_USART)) +/* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ +/* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */ +/* Multimodule uses 3 bytes header + 22 channel bytes with max 11 changes per byte (8e2) + 16 bits trailer ~= 291 max pulses */ +/* Multimodule reuses some of the DSM2 function and structs since the protocols are similar enough */ +/* sbus is 1 byte header, 22 channel bytes (11bit * 16ch) + 1 byte flags */ + +#error "Pulses array needs to be increased (PXX_FREQUENCY=HIGH)" +#endif + + #define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) class PxxCrcMixin { @@ -60,7 +71,6 @@ class SerialPxxBitTransport: public DataBuffer { protected: uint8_t byte; uint8_t bits_count; - uint8_t padding[2]; void initFrame() { @@ -102,7 +112,6 @@ class SerialPxxBitTransport: public DataBuffer { class PwmPxxBitTransport: public PulsesBuffer { protected: uint16_t rest; - uint8_t padding[2]; void initFrame() { @@ -125,10 +134,9 @@ class PwmPxxBitTransport: public PulsesBuffer { }; template -class StandardPxxTransport: public PxxCrcMixin, public BitTransport { +class StandardPxxTransport: public BitTransport, public PxxCrcMixin { protected: uint8_t ones_count; - uint8_t padding[3]; void initFrame() { @@ -174,6 +182,11 @@ class UartPxxTransport: public DataBuffer, public PxxCrcMixin { addWithByteStuffing(byte); } + void addByteWithoutCrc(uint8_t byte) + { + *ptr++ = byte; + } + void addWithByteStuffing(uint8_t byte) { if (0x7E == byte) { diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 7dbebe84f..0981184f3 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -57,7 +57,7 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpper template void Pxx1Pulses::setupFrame(uint8_t port) { - PxxPulses::initFrame(); + PxxTransport::initBuffer(); #if defined(PXX_FREQUENCY_HIGH) add8ChannelsFrame(port, 0); @@ -75,3 +75,5 @@ void Pxx1Pulses::setupFrame(uint8_t port) } template class Pxx1Pulses >; +template class Pxx1Pulses >; +template class Pxx1Pulses; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index bef2eea98..1f1384a62 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -47,7 +47,7 @@ class Pxx2Pulses: public PxxPulses { void initFrame() { - ptr = data; + Pxx2Transport::initBuffer(); } }; diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 0d552c781..51110e88b 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -125,11 +125,20 @@ set(FIRMWARE_SRC ${COOS_DIR}/portable/GCC/port.c ${COOS_DIR}/portable/arch.c ) + set(PULSES_SRC ${PULSES_SRC} pulses_arm.cpp ppm_arm.cpp pxx.cpp + pxx1.cpp dsm2_arm.cpp sbus_arm.cpp - ) \ No newline at end of file + ) + +if(PXX2) + set(PULSES_SRC + ${PULSES_SRC} + pxx2.cpp + ) +endif() diff --git a/radio/src/targets/common/arm/stm32/CMakeLists.txt b/radio/src/targets/common/arm/stm32/CMakeLists.txt index 9dbabfc41..0398e2f74 100644 --- a/radio/src/targets/common/arm/stm32/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/CMakeLists.txt @@ -102,16 +102,3 @@ set(PULSES_SRC ${PULSES_SRC} crossfire.cpp ) - -set(PULSES_SRC - ${PULSES_SRC} - pxx1.cpp - ) - - -if(PXX2) - set(PULSES_SRC - ${PULSES_SRC} - pxx2.cpp - ) -endif() 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 dbefcf170..a930fd227 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -130,8 +130,8 @@ void intmoduleSendNextFrame() DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&INTMODULE_USART->DR); DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx_uart.pulses); - DMA_InitStructure.DMA_BufferSize = modulePulsesData[INTERNAL_MODULE].pxx_uart.ptr - modulePulsesData[INTERNAL_MODULE].pxx_uart.pulses; + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx_uart.getData()); + DMA_InitStructure.DMA_BufferSize = modulePulsesData[INTERNAL_MODULE].pxx_uart.getSize(); DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index cc513c449..b793280cf 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -197,6 +197,7 @@ void init_serial(uint32_t module_index, uint32_t baudrate, uint32_t period_half_ void disable_serial(uint32_t module_index); void init_crossfire(uint32_t module_index); void disable_crossfire(uint32_t module_index); +void disable_pxx2(uint32_t module_index); // Trainer driver void init_trainer_ppm(void); diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 10e86cf58..4b0240763 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -259,7 +259,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } else if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PXX) { - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].pxx.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_DMA_STREAM->CR |= EXTMODULE_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; @@ -267,8 +267,8 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; #endif EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.pulses); - EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.ptr - modulePulsesData[EXTERNAL_MODULE].pxx.pulses; + EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData()); + EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } else if (IS_DSM2_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_MULTIMODULE_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_SBUS_PROTOCOL(s_current_protocol[EXTERNAL_MODULE])) { diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index be46b31b8..f3e8e7a66 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -107,3 +107,11 @@ void disable_crossfire(uint32_t port) extmoduleStop(); } } + + +void disable_pxx2(uint32_t port) +{ + if (port == EXTERNAL_MODULE) { + extmoduleStop(); + } +} diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 299684489..02f8d5cf5 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -278,8 +278,8 @@ extern "C" void PWM_IRQHandler(void) else { // Kick off serial output here Ssc * sscptr = SSC; - sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.pulses); - sscptr->SSC_TCR = (uint8_t *)modulePulsesData[EXTERNAL_MODULE].pxx.ptr - (uint8_t *)modulePulsesData[EXTERNAL_MODULE].pxx.pulses; + sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData()); + sscptr->SSC_TCR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers } break; diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 6cf69c54d..4d1799ce6 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -283,8 +283,8 @@ void extmoduleSendNextFrame() 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(modulePulsesData[EXTERNAL_MODULE].pxx_uart.pulses); - DMA_InitStructure.DMA_BufferSize = modulePulsesData[EXTERNAL_MODULE].pxx_uart.ptr - modulePulsesData[EXTERNAL_MODULE].pxx_uart.pulses; + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx_uart.getData()); + DMA_InitStructure.DMA_BufferSize = modulePulsesData[EXTERNAL_MODULE].pxx_uart.getSize(); DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;