From 62dcd6ac5e2e56fc14e736d28bb61a3ea3eaa831 Mon Sep 17 00:00:00 2001 From: bsongis Date: Tue, 9 Oct 2018 12:47:22 +0200 Subject: [PATCH] Refactoring continued --- radio/src/pulses/pulses_arm.cpp | 2 +- radio/src/pulses/pulses_arm.h | 22 ++--- radio/src/pulses/pulses_common.h | 65 ++++++++++++++ radio/src/pulses/pxx.cpp | 57 +----------- radio/src/pulses/pxx.h | 90 ++++++------------- radio/src/pulses/pxx1.cpp | 77 ++++++++++++++++ radio/src/pulses/pxx1.h | 52 +++++++++++ radio/src/pulses/pxx2.h | 23 +---- .../targets/common/arm/stm32/CMakeLists.txt | 6 ++ .../src/targets/taranis/extmodule_driver.cpp | 6 +- .../taranis/intmodule_pulses_driver.cpp | 6 +- 11 files changed, 246 insertions(+), 160 deletions(-) create mode 100644 radio/src/pulses/pulses_common.h create mode 100644 radio/src/pulses/pxx1.cpp create mode 100644 radio/src/pulses/pxx1.h diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index 6ade90621..f88bf37ab 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -177,7 +177,7 @@ void setupPulses(uint8_t port) // Set up output data here switch (required_protocol) { case PROTO_PXX: - setupPulsesPXX(port); + modulePulsesData[port].pxx.setupFrame(port); scheduleNextMixerCalculation(port, PXX_PERIOD); break; diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index aab6832bb..5fd2619a8 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -44,16 +44,6 @@ template struct PpmPulsesData { T * ptr; }; -#if defined(PXX_FREQUENCY_HIGH) -#define EXTMODULE_USART_PXX_BAUDRATE 420000 -#define INTMODULE_USART_PXX_BAUDRATE 450000 -#define PXX_PERIOD 4/*ms*/ -#else -#define EXTMODULE_USART_PXX_BAUDRATE 115200 -#define INTMODULE_USART_PXX_BAUDRATE 115200 -#define PXX_PERIOD 9/*ms*/ -#endif - #if defined(PPM_PIN_SERIAL) PACK(struct PxxSerialPulsesData { uint8_t pulses[64]; @@ -125,6 +115,7 @@ PACK(struct PxxTimerPulsesData { #if !defined(BOOT) #include "pulses/pxx2.h" +#include "pulses/pxx1.h" #endif #define CROSSFIRE_FRAME_MAXLEN 64 @@ -133,13 +124,14 @@ PACK(struct CrossfirePulsesData { }); union ModulePulsesData { -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - PxxUartPulsesData pxx_uart; +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) && !defined(BOOT) + UartPxxPulses pxx_uart; #endif -#if defined(PPM_PIN_SERIAL) - PxxSerialPulsesData pxx; +#if defined(BOOT) +#elif defined(PPM_PIN_SERIAL) + SerialPxxPulses pxx; #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) - PxxTimerPulsesData pxx; + PwmPxxPulses pxx; #endif #if defined(PXX2) && !defined(BOOT) diff --git a/radio/src/pulses/pulses_common.h b/radio/src/pulses/pulses_common.h new file mode 100644 index 000000000..da70a13c0 --- /dev/null +++ b/radio/src/pulses/pulses_common.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + +#ifndef _PULSES_COMMON_H_ +#define _PULSES_COMMON_H_ + +#include + +#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 + +template +class DataBuffer { + public: + const T * getData() + { + return data; + } + + uint8_t getSize() + { + return ptr - data; + } + + protected: + T data[SIZE]; + T * ptr; + + void initBuffer() + { + ptr = data; + } +}; + +template +class PulsesBuffer: public DataBuffer { + public: + T getLast() { + return *(DataBuffer::ptr - 1); + }; +}; + +#endif diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index 5d491c5dd..69257831a 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -19,7 +19,8 @@ */ #include "opentx.h" -#include "pulses/pxx.h" +#include "pulses/pxx1.h" +#include "pulses/pxx2.h" const uint16_t PxxCrcMixin::CRCTable[] = { 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, @@ -56,39 +57,6 @@ const uint16_t PxxCrcMixin::CRCTable[] = { 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 }; -template -void StandardPxxPulses::setup8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels) -{ - PxxTransport::initCrc(); - - // Sync - addHead(); - - // RX Number - PxxTransport::addByte(g_model.header.modelId[port]); - - // Flag1 - uint8_t flag1 = PxxPulses::addFlag1(port); - - // Flag2 - PxxTransport::addByte(0); - - // Channels - PxxPulses::addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); - - // Extra flags - PxxPulses::addExtraFlags(); - - // CRC - addCrc(); - - // Sync = HEAD - addHead(); - - // Tail - PxxTransport::addTail(); -} - template void PxxPulses::addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels) { @@ -209,22 +177,5 @@ void PxxPulses::addExtraFlags(uint8_t port) PxxTransport::addByte(extra_flags); } -template -void StandardPxxPulses::setupFrame(uint8_t port) -{ - PxxPulses::initFrame(); - -#if defined(PXX_FREQUENCY_HIGH) - setup8ChannelsFrame(port, 0); - if (sentModuleChannels(port) > 8) { - setup8ChannelsFrame(port, 8); - } -#else - static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; - uint8_t sendUpperChannels = 0; - if (pass[port]++ & 0x01) { - sendUpperChannels = g_model.moduleData[port].channelsCount; - } - setup8ChannelsFrame(port, sendUpperChannels); -#endif -} +template class PxxPulses >; +template class PxxPulses; diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 5f6362e2d..ce96cf5d6 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -21,12 +21,24 @@ #ifndef _PULSES_PXX_H_ #define _PULSES_PXX_H_ -#include +#include "pulses_common.h" #define PXX_SEND_BIND 0x01 #define PXX_SEND_FAILSAFE (1 << 4) #define PXX_SEND_RANGECHECK (1 << 5) +#if defined(PXX_FREQUENCY_HIGH) + #define EXTMODULE_USART_PXX_BAUDRATE 420000 + #define INTMODULE_USART_PXX_BAUDRATE 450000 + #define PXX_PERIOD 4/*ms*/ +#else + #define EXTMODULE_USART_PXX_BAUDRATE 115200 + #define INTMODULE_USART_PXX_BAUDRATE 115200 + #define PXX_PERIOD 9/*ms*/ +#endif + +#define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) + class PxxCrcMixin { protected: void initCrc() @@ -43,18 +55,16 @@ class PxxCrcMixin { static const uint16_t CRCTable[]; }; - -class SerialPxxBitTransport { +// Used by the Sky9x family boards +class SerialPxxBitTransport: public DataBuffer { protected: - uint8_t data[64]; - uint8_t * ptr; uint8_t byte; uint8_t bits_count; uint8_t padding[2]; void initFrame() { - ptr = data; + initBuffer(); byte = 0; bits_count = 0; } @@ -89,28 +99,14 @@ class SerialPxxBitTransport { } }; -// TODO elsewhere !!! - -#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 - -#define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) - -class PwmPxxBitTransport { +class PwmPxxBitTransport: public PulsesBuffer { protected: - pulse_duration_t pulses[200]; - pulse_duration_t * ptr; uint16_t rest; uint8_t padding[2]; void initFrame() { - ptr = pulses; + initBuffer(); rest = PXX_PERIOD_HALF_US; } @@ -121,7 +117,7 @@ class PwmPxxBitTransport { rest -= duration + 1; } - void addTail(uint8_t port) + void addTail() { // rest min value is 18000 - 200 * 48 = 8400 (4.2ms) *(ptr - 1) += rest; @@ -134,6 +130,12 @@ class StandardPxxTransport: public PxxCrcMixin, public BitTransport { uint8_t ones_count; uint8_t padding[3]; + void initFrame() + { + BitTransport::initBuffer(); + ones_count = 0; + } + void addByte(uint8_t byte) { PxxCrcMixin::addToCrc(byte); @@ -162,23 +164,10 @@ class StandardPxxTransport: public PxxCrcMixin, public BitTransport { ones_count = 0; } } - - void initFrame() - { - ones_count = 0; - } }; -class UartPxxTransport: public PxxCrcMixin { +class UartPxxTransport: public DataBuffer, public PxxCrcMixin { protected: - uint8_t data[64]; - uint8_t * ptr; - - void initFrame() - { - ptr = data; - } - void addByte(uint8_t byte) { PxxCrcMixin::addToCrc(byte); @@ -214,31 +203,4 @@ class PxxPulses: public PxxTransport { void addExtraFlags(uint8_t port); }; -typedef PxxPulses UartPxxPulses; - -template -class StandardPxxPulses: public PxxPulses -{ - public: - void setupFrame(uint8_t port); - - protected: - void addHead() - { - // send 7E, do not CRC - PxxTransport::addByteWithoutCrc(0x7E); - } - - void addCrc() - { - addByteWithoutCrc(PxxCrcMixin::crc >> 8); - addByteWithoutCrc(PxxCrcMixin::crc); - } - - void setup8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); -}; - -typedef StandardPxxPulses> PwmPxxPxxPulses; - - #endif diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp new file mode 100644 index 000000000..7dbebe84f --- /dev/null +++ b/radio/src/pulses/pxx1.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + +#include "opentx.h" +#include "pulses/pxx1.h" + +template +void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels) +{ + PxxTransport::initCrc(); + + // Sync + addHead(); + + // RX Number + PxxTransport::addByte(g_model.header.modelId[port]); + + // Flag1 + uint8_t flag1 = PxxPulses::addFlag1(port); + + // Flag2 + PxxTransport::addByte(0); + + // Channels + PxxPulses::addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); + + // Extra flags + PxxPulses::addExtraFlags(port); + + // CRC + addCrc(); + + // Sync = HEAD + addHead(); + + // Tail + PxxTransport::addTail(); +} + +template +void Pxx1Pulses::setupFrame(uint8_t port) +{ + PxxPulses::initFrame(); + +#if defined(PXX_FREQUENCY_HIGH) + add8ChannelsFrame(port, 0); + if (sentModuleChannels(port) > 8) { + add8ChannelsFrame(port, 8); + } +#else + static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; + uint8_t sendUpperChannels = 0; + if (pass[port]++ & 0x01) { + sendUpperChannels = g_model.moduleData[port].channelsCount; + } + add8ChannelsFrame(port, sendUpperChannels); +#endif +} + +template class Pxx1Pulses >; diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h new file mode 100644 index 000000000..444202d26 --- /dev/null +++ b/radio/src/pulses/pxx1.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + +#ifndef _PULSES_PXX1_H_ +#define _PULSES_PXX1_H_ + +#include "pxx.h" + +template +class Pxx1Pulses: public PxxPulses +{ + public: + void setupFrame(uint8_t port); + + protected: + void addHead() + { + // send 7E, do not CRC + PxxTransport::addByteWithoutCrc(0x7E); + } + + void addCrc() + { + PxxTransport::addByteWithoutCrc(PxxCrcMixin::crc >> 8); + PxxTransport::addByteWithoutCrc(PxxCrcMixin::crc); + } + + void add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); +}; + +typedef Pxx1Pulses UartPxxPulses; +typedef Pxx1Pulses> PwmPxxPulses; +typedef Pxx1Pulses> SerialPxxPulses; + +#endif diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index ce2a83f2e..bef2eea98 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -21,18 +21,10 @@ #ifndef _PULSES_PXX2_H_ #define _PULSES_PXX2_H_ -#include "pulses/pxx.h" +#include "./pxx.h" -class Pxx2Transport: public PxxCrcMixin { +class Pxx2Transport: public DataBuffer, public PxxCrcMixin { protected: - uint8_t data[64]; - uint8_t * ptr; - - void initFrame() - { - ptr = data; - } - void addByte(uint8_t byte) { PxxCrcMixin::addToCrc(byte); @@ -45,21 +37,10 @@ class Pxx2Transport: public PxxCrcMixin { } }; - class Pxx2Pulses: public PxxPulses { public: void setupFrame(uint8_t port); - const uint8_t * getData() - { - return data; - } - - uint8_t getSize() - { - return ptr - data; - } - protected: uint8_t data[64]; uint8_t * ptr; diff --git a/radio/src/targets/common/arm/stm32/CMakeLists.txt b/radio/src/targets/common/arm/stm32/CMakeLists.txt index feedb073f..9dbabfc41 100644 --- a/radio/src/targets/common/arm/stm32/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/CMakeLists.txt @@ -103,6 +103,12 @@ set(PULSES_SRC crossfire.cpp ) +set(PULSES_SRC + ${PULSES_SRC} + pxx1.cpp + ) + + if(PXX2) set(PULSES_SRC ${PULSES_SRC} diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index c18b86e12..6cf69c54d 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -300,12 +300,12 @@ void extmoduleSendNextFrame() USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; #else - 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_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->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.pulses); - EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.ptr - modulePulsesData[EXTERNAL_MODULE].pxx.pulses; + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData()); + EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA #endif } diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 0f8cf3e43..1999dc796 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -61,12 +61,12 @@ void intmoduleNoneStart() void intmoduleSendNextFrame() { if (s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { - INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].pxx.ptr - 1) - 4000; // 2mS in advance + INTMODULE_TIMER->CCR2 = modulePulsesData[INTERNAL_MODULE].pxx.getLast() - 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(modulePulsesData[INTERNAL_MODULE].pxx.pulses); - INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].pxx.ptr - modulePulsesData[INTERNAL_MODULE].pxx.pulses; + INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx.getData()); + INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].pxx.getSize(); INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #if defined(TARANIS_INTERNAL_PPM)