diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index d4bd099d6..d11194c78 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -289,24 +289,6 @@ enum SwashType { #define TIMER_COUNTDOWN_START(x) 10 #endif -enum ChannelsProtocols { - PROTOCOL_CHANNELS_UNINITIALIZED, - PROTOCOL_CHANNELS_NONE, - PROTOCOL_CHANNELS_PPM, -#if defined(PXX) || defined(DSM2) - PROTOCOL_CHANNELS_PXX, -#endif -#if defined(DSM2) - PROTOCOL_CHANNELS_DSM2_LP45, - PROTOCOL_CHANNELS_DSM2_DSM2, - PROTOCOL_CHANNELS_DSM2_DSMX, -#endif - PROTOCOL_CHANNELS_CROSSFIRE, - PROTOCOL_CHANNELS_MULTIMODULE, - PROTOCOL_CHANNELS_SBUS, - PROTOCOL_CHANNELS_PXX2 -}; - enum XJTRFProtocols { RF_PROTO_OFF = -1, RF_PROTO_X16, diff --git a/radio/src/pulses/crossfire.cpp b/radio/src/pulses/crossfire.cpp index 348bf2c92..889bc9140 100644 --- a/radio/src/pulses/crossfire.cpp +++ b/radio/src/pulses/crossfire.cpp @@ -47,21 +47,21 @@ uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses) return buf - frame; } -void setupPulsesCrossfire(uint8_t module) +void setupPulsesCrossfire() { if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { - uint8_t * pulses = modulePulsesData[module].crossfire.pulses; + uint8_t * pulses = extmodulePulsesData.crossfire.pulses; #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { memcpy(pulses, outputTelemetryBuffer, outputTelemetryBufferSize); - modulePulsesData[module].crossfire.length = outputTelemetryBufferSize; + extmodulePulsesData.crossfire.length = outputTelemetryBufferSize; outputTelemetryBufferTrigger = 0x00; outputTelemetryBufferSize = 0; } else #endif { - modulePulsesData[module].crossfire.length = createCrossfireChannelsFrame(pulses, &channelOutputs[g_model.moduleData[module].channelsStart]); + extmodulePulsesData.crossfire.length = createCrossfireChannelsFrame(pulses, &channelOutputs[g_model.moduleData[EXTERNAL_MODULE].channelsStart]); } } } diff --git a/radio/src/pulses/dsm2.cpp b/radio/src/pulses/dsm2.cpp index 4fafc78c4..bdc37bfce 100644 --- a/radio/src/pulses/dsm2.cpp +++ b/radio/src/pulses/dsm2.cpp @@ -38,13 +38,13 @@ uint8_t dsm2BindTimer = DSM2_BIND_TIMEOUT; #if defined(PPM_PIN_SERIAL) void putDsm2SerialBit(uint8_t bit) { - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte >>= 1; + extmodulePulsesData.dsm2.serialByte >>= 1; if (bit & 1) { - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte |= 0x80; + extmodulePulsesData.dsm2.serialByte |= 0x80; } - if (++modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount >= 8) { - *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte; - modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0; + if (++extmodulePulsesData.dsm2.serialBitCount >= 8) { + *extmodulePulsesData.dsm2.ptr++ = extmodulePulsesData.dsm2.serialByte; + extmodulePulsesData.dsm2.serialBitCount = 0; } } @@ -69,14 +69,14 @@ void putDsm2Flush() #else void _send_1(uint8_t v) { - if (modulePulsesData[EXTERNAL_MODULE].dsm2.index & 1) + if (extmodulePulsesData.dsm2.index & 1) v += 2; else v -= 2; - *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = v - 1; - modulePulsesData[EXTERNAL_MODULE].dsm2.index += 1; - modulePulsesData[EXTERNAL_MODULE].dsm2.rest -= v; + *extmodulePulsesData.dsm2.ptr++ = v - 1; + extmodulePulsesData.dsm2.index += 1; + extmodulePulsesData.dsm2.rest -= v; } void sendByteDsm2(uint8_t b) // max 10 changes 0 10 10 10 10 1 @@ -100,31 +100,31 @@ void sendByteDsm2(uint8_t b) // max 10 changes 0 10 10 10 10 1 void putDsm2Flush() { - if (modulePulsesData[EXTERNAL_MODULE].dsm2.index & 1) - *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = modulePulsesData[EXTERNAL_MODULE].dsm2.rest; + if (extmodulePulsesData.dsm2.index & 1) + *extmodulePulsesData.dsm2.ptr++ = extmodulePulsesData.dsm2.rest; else - *(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) = modulePulsesData[EXTERNAL_MODULE].dsm2.rest; + *(extmodulePulsesData.dsm2.ptr - 1) = extmodulePulsesData.dsm2.rest; } #endif // This is the data stream to send, prepare after 19.5 mS // Send after 22.5 mS -void setupPulsesDSM2(uint8_t module) +void setupPulsesDSM2() { uint8_t dsmDat[14]; #if defined(PPM_PIN_SERIAL) - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0 ; - modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0 ; + extmodulePulsesData.dsm2.serialByte = 0 ; + extmodulePulsesData.dsm2.serialBitCount = 0 ; #else - modulePulsesData[EXTERNAL_MODULE].dsm2.index = 0; - modulePulsesData[EXTERNAL_MODULE].dsm2.rest = DSM2_PERIOD * 2000; + extmodulePulsesData.dsm2.index = 0; + extmodulePulsesData.dsm2.rest = DSM2_PERIOD * 2000; #endif - modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses; - switch (moduleSettings[module].protocol) { + switch (moduleSettings[EXTERNAL_MODULE].protocol) { case PROTOCOL_CHANNELS_DSM2_LP45: dsmDat[0] = 0x00; break; @@ -140,29 +140,29 @@ void setupPulsesDSM2(uint8_t module) if (dsm2BindTimer > 0) { dsm2BindTimer--; if (switchState(SW_DSM2_BIND)) { - moduleSettings[port].mode = MODULE_MODE_BIND; + moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_BIND; dsmDat[0] |= DSM2_SEND_BIND; } } - else if (moduleSettings[port].mode == MODULE_MODE_RANGECHECK) { + else if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_RANGECHECK) { dsmDat[0] |= DSM2_SEND_RANGECHECK; } else { moduleSettings[port].mode = 0; } #else - if (moduleSettings[module].mode == MODULE_MODE_BIND) { + if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) { dsmDat[0] |= DSM2_SEND_BIND; } - else if (moduleSettings[module].mode == MODULE_MODE_RANGECHECK) { + else if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_RANGECHECK) { dsmDat[0] |= DSM2_SEND_RANGECHECK; } #endif - dsmDat[1] = g_model.header.modelId[module]; // DSM2 Header second byte for model match + dsmDat[1] = g_model.header.modelId[EXTERNAL_MODULE]; // DSM2 Header second byte for model match for (int i=0; i>5)+512, 1023); dsmDat[2+2*i] = (i<<2) | ((pulse>>8)&0x03); diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index f148ef3cc..d75085b40 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -86,31 +86,31 @@ static void sendFailsafeChannels(uint8_t port) } } -void setupPulsesMultimodule(uint8_t port) +void setupPulsesMultimodule() { static int counter = 0; #if defined(PPM_PIN_SERIAL) - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0 ; - modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0 ; + extmodulePulsesData.dsm2.serialByte = 0 ; + extmodulePulsesData.dsm2.serialBitCount = 0 ; #else - modulePulsesData[EXTERNAL_MODULE].dsm2.rest = multiSyncStatus.getAdjustedRefreshRate(); - modulePulsesData[EXTERNAL_MODULE].dsm2.index = 0; + extmodulePulsesData.dsm2.rest = multiSyncStatus.getAdjustedRefreshRate(); + extmodulePulsesData.dsm2.index = 0; #endif - modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses; // Every 1000 cycles (=9s) send a config packet that configures the multimodule (inversion, telemetry type) counter++; if (counter % 1000== 500) { sendSetupFrame(); - } else if (counter % 1000 == 0 && g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) { - sendFrameProtocolHeader(port, true); + } else if (counter % 1000 == 0 && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_RECEIVER) { + sendFrameProtocolHeader(EXTERNAL_MODULE, true); sendFailsafeChannels(port); } else { // Normal Frame - sendFrameProtocolHeader(port, false); - sendChannels(port); + sendFrameProtocolHeader(EXTERNAL_MODULE, false); + sendChannels(EXTERNAL_MODULE); } putDsm2Flush(); diff --git a/radio/src/pulses/ppm.cpp b/radio/src/pulses/ppm.cpp index cb47c1ada..98099d340 100644 --- a/radio/src/pulses/ppm.cpp +++ b/radio/src/pulses/ppm.cpp @@ -59,12 +59,21 @@ void setupPulsesPPM(PpmPulsesData * ppmPulsesData, uint8_t channelsStart, int #endif } -void setupPulsesPPMModule(uint8_t port) -{ - setupPulsesPPM(&modulePulsesData[port].ppm, g_model.moduleData[port].channelsStart, g_model.moduleData[port].channelsCount, g_model.moduleData[port].ppm.frameLength); -} - void setupPulsesPPMTrainer() { setupPulsesPPM(&trainerPulsesData.ppm, g_model.trainerData.channelsStart, g_model.trainerData.channelsCount, g_model.trainerData.frameLength); } + +#if defined(PCBSKY9X) || defined(TARANIS_INTERNAL_PPM) +void setupPulsesPPMInternalModule() +{ + setupPulsesPPM(&intmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength); +} +#endif + +void setupPulsesPPMExternalModule() +{ + setupPulsesPPM(&extmodulePulsesData.ppm, g_model.moduleData[EXTERNAL_MODULE].channelsStart, g_model.moduleData[EXTERNAL_MODULE].channelsCount, g_model.moduleData[EXTERNAL_MODULE].ppm.frameLength); +} + + diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index feb8347fa..0c7474757 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -24,7 +24,8 @@ uint8_t s_pulses_paused = 0; ModuleSettings moduleSettings[NUM_MODULES]; -ModulePulsesData modulePulsesData[NUM_MODULES] __DMA; +InternalModulePulsesData intmodulePulsesData __DMA; +ExternalModulePulsesData extmodulePulsesData __DMA; TrainerPulsesData trainerPulsesData __DMA; uint8_t getModuleType(uint8_t module) @@ -49,7 +50,7 @@ uint8_t getRequiredProtocol(uint8_t module) break; case MODULE_TYPE_XJT: - protocol = PROTOCOL_CHANNELS_PXX; + protocol = PROTOCOL_CHANNELS_PXX1; break; case MODULE_TYPE_XJT2: @@ -112,31 +113,12 @@ uint8_t getRequiredProtocol(uint8_t module) return protocol; } -void setupPulsesPXX(uint8_t module) -{ -#if defined(INTMODULE_USART) && defined(EXTMODULE_USART) - modulePulsesData[module].pxx_uart.setupFrame(module); -#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART) - modulePulsesData[module].pxx.setupFrame(module); -#else - if (IS_UART_MODULE(module)) - modulePulsesData[module].pxx_uart.setupFrame(module); - else - modulePulsesData[module].pxx.setupFrame(module); -#endif -} - -void setupPulsesPXX2(uint8_t module) -{ - modulePulsesData[module].pxx2.setupFrame(module); -} - void disablePulses(uint8_t module, uint8_t protocol) { // stop existing protocol hardware switch (protocol) { - case PROTOCOL_CHANNELS_PXX: + case PROTOCOL_CHANNELS_PXX1: disable_pxx(module); break; @@ -176,7 +158,7 @@ void enablePulses(uint8_t module, uint8_t protocol) // start new protocol hardware here switch (protocol) { - case PROTOCOL_CHANNELS_PXX: + case PROTOCOL_CHANNELS_PXX1: init_pxx(module); break; @@ -214,53 +196,103 @@ void enablePulses(uint8_t module, uint8_t protocol) } } -void setupPulses(uint8_t module, uint8_t protocol) +#if defined(PXX1) +void setupPulsesPXXInternalModule() +{ +#if defined(INTMODULE_USART) + intmodulePulsesData.pxx_uart.setupFrame(INTERNAL_MODULE); +#else + intmodulePulsesData.pxx.setupFrame(INTERNAL_MODULE); +#endif +} + +void setupPulsesPXXExternalModule() +{ +#if defined(EXTMODULE_USART) + extmodulePulsesData.pxx_uart.setupFrame(EXTERNAL_MODULE); +#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART) + extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE); +#endif +} +#endif + +void setupPulsesInternalModule(uint8_t protocol) { switch (protocol) { - case PROTOCOL_CHANNELS_PXX: - setupPulsesPXX(module); - scheduleNextMixerCalculation(module, PXX_PERIOD); +#if defined(PXX1) + case PROTOCOL_CHANNELS_PXX1: + setupPulsesPXXInternalModule(); + scheduleNextMixerCalculation(INTERNAL_MODULE, PXX_PERIOD); break; +#endif + +#if defined(PXX2) + case PROTOCOL_CHANNELS_PXX2: + intmodulePulsesData.pxx2.setupFrame(INTERNAL_MODULE); + scheduleNextMixerCalculation(INTERNAL_MODULE, moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER ? 1 : PXX2_PERIOD); + break; +#endif + +#if defined(PCBSKY9X) || defined(TARANIS_INTERNAL_PPM) + case PROTOCOL_CHANNELS_PPM: + setupPulsesPPM(&extmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength); + scheduleNextMixerCalculation(INTERNAL_MODULE, PPM_PERIOD(INTERNAL_MODULE)); + break; +#endif + + default: + break; + } +} + +void setupPulsesExternalModule(uint8_t protocol) +{ + switch (protocol) { +#if defined(PXX1) + case PROTOCOL_CHANNELS_PXX1: + setupPulsesPXXExternalModule(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX_PERIOD); + break; +#endif + +#if defined(PXX2) + case PROTOCOL_CHANNELS_PXX2: + extmodulePulsesData.pxx2.setupFrame(EXTERNAL_MODULE); + scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX2_PERIOD); + break; +#endif case PROTOCOL_CHANNELS_SBUS: - setupPulsesSbus(module); - scheduleNextMixerCalculation(module, SBUS_PERIOD); + setupPulsesSbus(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, SBUS_PERIOD); break; #if defined(DSM2) case PROTOCOL_CHANNELS_DSM2_LP45: case PROTOCOL_CHANNELS_DSM2_DSM2: case PROTOCOL_CHANNELS_DSM2_DSMX: - setupPulsesDSM2(module); - scheduleNextMixerCalculation(module, DSM2_PERIOD); + setupPulsesDSM2(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, DSM2_PERIOD); break; #endif #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - setupPulsesCrossfire(module); - scheduleNextMixerCalculation(module, CROSSFIRE_PERIOD); + setupPulsesCrossfire(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, CROSSFIRE_PERIOD); break; #endif - case PROTOCOL_CHANNELS_PXX2: - setupPulsesPXX2(module); - scheduleNextMixerCalculation(module, moduleSettings[module].mode == MODULE_MODE_SPECTRUM_ANALYSER ? 1 : PXX2_PERIOD); - break; - #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: - setupPulsesMultimodule(module); - scheduleNextMixerCalculation(module, MULTIMODULE_PERIOD); + setupPulsesMultimodule(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, MULTIMODULE_PERIOD); break; #endif case PROTOCOL_CHANNELS_PPM: -#if defined(PCBSKY9X) - case PROTOCOL_CHANNELS_NONE: -#endif - setupPulsesPPMModule(module); - scheduleNextMixerCalculation(module, PPM_PERIOD(module)); + setupPulsesPPMExternalModule(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, PPM_PERIOD(EXTERNAL_MODULE)); break; default: @@ -268,6 +300,19 @@ void setupPulses(uint8_t module, uint8_t protocol) } } +void setupPulses(uint8_t module, uint8_t protocol) +{ + switch (module) { + case INTERNAL_MODULE: + setupPulsesInternalModule(protocol); + break; + + case EXTERNAL_MODULE: + setupPulsesExternalModule(protocol); + break; + } +} + bool setupPulses(uint8_t module) { uint8_t protocol = getRequiredProtocol(module); diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index f35d0afa6..668ca071b 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -23,8 +23,14 @@ #include "definitions.h" #include "dataconstants.h" + +#if defined(PXX2) #include "pulses/pxx2.h" +#endif + +#if defined(PXX1) #include "pulses/pxx1.h" +#endif #if NUM_MODULES > 1 #define IS_RANGECHECK_ENABLE() (moduleSettings[0].mode == MODULE_MODE_RANGECHECK || moduleSettings[1].mode == MODULE_MODE_RANGECHECK) @@ -99,6 +105,7 @@ PACK(struct Dsm2SerialPulsesData { uint8_t serialBitCount; uint16_t _alignment; }); +typedef Dsm2SerialPulsesData Dsm2PulsesData; #else #define MAX_PULSES_TRANSITIONS 300 PACK(struct Dsm2TimerPulsesData { @@ -107,6 +114,7 @@ PACK(struct Dsm2TimerPulsesData { uint16_t rest; uint8_t index; }); +typedef Dsm2TimerPulsesData Dsm2PulsesData; #endif #define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/ @@ -125,25 +133,49 @@ PACK(struct CrossfirePulsesData { uint8_t length; }); -union ModulePulsesData { -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - UartPxxPulses pxx_uart; -#endif -#if defined(PPM_PIN_SERIAL) - SerialPxxPulses pxx; -#elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) - PwmPxxPulses pxx; +union InternalModulePulsesData { +#if defined(PXX1) + #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) + UartPxx1Pulses pxx_uart; + #endif + #if defined(PPM_PIN_SERIAL) + SerialPxx1Pulses pxx; + #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) + PwmPxx1Pulses pxx; + #endif #endif +#if defined(PXX2) Pxx2Pulses pxx2; +#endif -#if defined(PPM_PIN_SERIAL) - Dsm2SerialPulsesData dsm2; -#else - Dsm2TimerPulsesData dsm2; +#if defined(TARANIS_INTERNAL_PPM) + PpmPulsesData ppm; +#endif +} __ALIGNED(4); + +union ExternalModulePulsesData { +#if defined(PXX1) + #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) + UartPxx1Pulses pxx_uart; + #endif + #if defined(PPM_PIN_SERIAL) + SerialPxx1Pulses pxx; + #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) + PwmPxx1Pulses pxx; + #endif +#endif + +#if defined(PXX2) + Pxx2Pulses pxx2; +#endif + +#if defined(DSM2) || defined(MULTIMODULE) || defined(SBUS) + Dsm2PulsesData dsm2; #endif PpmPulsesData ppm; + CrossfirePulsesData crossfire; } __ALIGNED(4); @@ -153,8 +185,9 @@ union ModulePulsesData { * sizeof(ModulePulsesData). __ALIGNED is required for sizeof(ModulePulsesData) to be a multiple of the alignment. */ -/* TODO: internal pulsedata only needs 200 bytes vs 300 bytes for external, both use 300 byte since we have a common struct */ -extern ModulePulsesData modulePulsesData[NUM_MODULES]; + +extern InternalModulePulsesData intmodulePulsesData; +extern ExternalModulePulsesData extmodulePulsesData; union TrainerPulsesData { PpmPulsesData ppm; @@ -163,12 +196,12 @@ union TrainerPulsesData { extern TrainerPulsesData trainerPulsesData; bool setupPulses(uint8_t module); -void setupPulsesDSM2(uint8_t module); -void setupPulsesCrossfire(uint8_t module); -void setupPulsesMultimodule(uint8_t module); -void setupPulsesSbus(uint8_t module); -void setupPulsesPXX(uint8_t module); -void setupPulsesPPMModule(uint8_t module); +void setupPulsesDSM2(); +void setupPulsesCrossfire(); +void setupPulsesMultimodule(); +void setupPulsesSbus(); +void setupPulsesPPMInternalModule(); +void setupPulsesPPMExternalModule(); void setupPulsesPPMTrainer(); void sendByteDsm2(uint8_t b); void putDsm2Flush(); @@ -194,6 +227,24 @@ inline void startPulses() #endif } +enum ChannelsProtocols { + PROTOCOL_CHANNELS_UNINITIALIZED, + PROTOCOL_CHANNELS_NONE, + PROTOCOL_CHANNELS_PPM, +#if defined(PXX) || defined(DSM2) + PROTOCOL_CHANNELS_PXX1, +#endif +#if defined(DSM2) + PROTOCOL_CHANNELS_DSM2_LP45, + PROTOCOL_CHANNELS_DSM2_DSM2, + PROTOCOL_CHANNELS_DSM2_DSMX, +#endif + PROTOCOL_CHANNELS_CROSSFIRE, + PROTOCOL_CHANNELS_MULTIMODULE, + PROTOCOL_CHANNELS_SBUS, + PROTOCOL_CHANNELS_PXX2 +}; + inline bool pulsesStarted() { return moduleSettings[0].protocol != PROTOCOL_CHANNELS_UNINITIALIZED; } inline void pausePulses() { s_pulses_paused = true; } inline void resumePulses() { s_pulses_paused = false; } diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index efaf8b886..fc1167b80 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -90,7 +90,12 @@ void PxxPulses::addChannels(uint8_t port, uint8_t sendFailsafe, ui } } +#if defined(PXX1) template class PxxPulses >; template class PxxPulses >; template class PxxPulses; +#endif + +#if defined(PXX2) template class PxxPulses; +#endif diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 7c42b7740..33c374a3a 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -160,8 +160,8 @@ class Pxx1Pulses: public PxxPulses void add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); }; -typedef Pxx1Pulses UartPxxPulses; -typedef Pxx1Pulses> PwmPxxPulses; -typedef Pxx1Pulses> SerialPxxPulses; +typedef Pxx1Pulses UartPxx1Pulses; +typedef Pxx1Pulses> PwmPxx1Pulses; +typedef Pxx1Pulses> SerialPxx1Pulses; #endif diff --git a/radio/src/pulses/sbus.cpp b/radio/src/pulses/sbus.cpp index 5824f17fe..26d4367b1 100644 --- a/radio/src/pulses/sbus.cpp +++ b/radio/src/pulses/sbus.cpp @@ -48,17 +48,17 @@ static void _send_level(uint8_t v) { /* Copied over from DSM, this looks doubious and in my logic analyzer output the low->high is about 2 ns late */ - if (modulePulsesData[EXTERNAL_MODULE].dsm2.index & 1) + if (extmodulePulsesData.dsm2.index & 1) v += 2; else v -= 2; - *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = v - 1; - modulePulsesData[EXTERNAL_MODULE].dsm2.index+=1; - modulePulsesData[EXTERNAL_MODULE].dsm2.rest -=v; + *extmodulePulsesData.dsm2.ptr++ = v - 1; + extmodulePulsesData.dsm2.index+=1; + extmodulePulsesData.dsm2.rest -=v; } -void sendByteSbus(uint8_t b) //max 11 changes 0 10 10 10 10 P 1 +void sendByteSbus(uint8_t b) // max 11 changes 0 10 10 10 10 P 1 { bool lev = 0; uint8_t parity = 1; @@ -107,17 +107,17 @@ inline int getChannelValue(uint8_t port, int channel) return channelOutputs[ch] + 2 * PPM_CH_CENTER(ch) - 2*PPM_CENTER; } -void setupPulsesSbus(uint8_t port) +void setupPulsesSbus() { #if defined(PPM_PIN_SERIAL) - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0; - modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0; + extmodulePulsesData.dsm2.serialByte = 0; + extmodulePulsesData.dsm2.serialBitCount = 0; #else - modulePulsesData[EXTERNAL_MODULE].dsm2.rest = SBUS_PERIOD_HALF_US; - modulePulsesData[EXTERNAL_MODULE].dsm2.index = 0; + extmodulePulsesData.dsm2.rest = SBUS_PERIOD_HALF_US; + extmodulePulsesData.dsm2.index = 0; #endif - modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses; // Sync Byte sendByteSbus(SBUS_FRAME_BEGIN_BYTE); @@ -127,7 +127,7 @@ void setupPulsesSbus(uint8_t port) // byte 1-22, channels 0..2047, limits not really clear (B for (int i=0; i 0) + if (getChannelValue(EXTERNAL_MODULE, 16) > 0) flags |=SBUS_FLAG_CHANNEL_17; - if (getChannelValue(port, 17) > 0) + if (getChannelValue(EXTERNAL_MODULE, 17) > 0) flags |=SBUS_FLAG_CHANNEL_18; sendByteSbus(flags); diff --git a/radio/src/sbus.cpp b/radio/src/sbus.cpp index 6817fa0f1..e9b975144 100644 --- a/radio/src/sbus.cpp +++ b/radio/src/sbus.cpp @@ -30,11 +30,10 @@ #define SBUS_FAILSAFE_BIT 3 #define SBUS_CH_BITS 11 -#define SBUS_CH_MASK ((1<DR); DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx2.getData()); - DMA_InitStructure.DMA_BufferSize = modulePulsesData[INTERNAL_MODULE].pxx2.getSize(); + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(intmodulePulsesData.pxx2.getData()); + DMA_InitStructure.DMA_BufferSize = intmodulePulsesData.pxx2.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 e7b793ad2..71bc6f246 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -185,7 +185,6 @@ void SDRAM_Init(void); #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) -#define IS_UART_MODULE(port) (port == INTERNAL_MODULE) void init_ppm(uint32_t module_index); void disable_ppm(uint32_t module_index); diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index f186147af..77b14b950 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -223,23 +223,23 @@ void extmoduleSendNextFrame() #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA 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; #else EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA 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].ppm.pulses); - EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; + EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses); + EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { - EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { + EXTMODULE_TIMER->CCR2 = extmodulePulsesData.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; @@ -247,12 +247,12 @@ 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.getData()); - EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); + EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); + EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 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; @@ -264,8 +264,8 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); // reverse polarity for Sbus if needed #endif EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses); - EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); + EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } else { diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index ef1fd28ae..b1c3a7cb9 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -63,8 +63,6 @@ void init_main_ppm(uint32_t period, uint32_t out_enable) { Pwm * pwmptr; - setupPulsesPPMModule(EXTERNAL_MODULE); - if (out_enable) { module_output_active(); } @@ -294,8 +292,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.getData()); - sscptr->SSC_TCR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); + sscptr->SSC_TPR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); + sscptr->SSC_TCR = extmodulePulsesData.pxx.getSize(); sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers } break; @@ -318,8 +316,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].dsm2.pulses); - sscptr->SSC_TCR = (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + sscptr->SSC_TPR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); + sscptr->SSC_TCR = (uint8_t *)extmodulePulsesData.dsm2.ptr - (uint8_t *)extmodulePulsesData.dsm2.pulses; sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers } break; @@ -344,15 +342,15 @@ extern "C" void PWM_IRQHandler(void) else { // Kick off serial output here Ssc * sscptr = SSC; - sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses); - sscptr->SSC_TCR = (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + sscptr->SSC_TPR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); + sscptr->SSC_TCR = (uint8_t *)extmodulePulsesData.dsm2.ptr - (uint8_t *)extmodulePulsesData.dsm2.pulses; sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers } break; default: - pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = *modulePulsesData[EXTERNAL_MODULE].ppm.ptr++; - if (*modulePulsesData[EXTERNAL_MODULE].ppm.ptr == 0) { + pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = *extmodulePulsesData.ppm.ptr++; + if (*extmodulePulsesData.ppm.ptr == 0) { setExternalModulePolarity(); setupPulses(EXTERNAL_MODULE); } @@ -365,7 +363,7 @@ extern "C" void PWM_IRQHandler(void) if (reason & PWM_ISR1_CHID1) { pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = *modulePulsesData[EXTRA_MODULE].ppm.ptr++; if (*modulePulsesData[EXTRA_MODULE].ppm.ptr == 0) { - setupPulsesPPMModule(EXTRA_MODULE); + setupPulses(EXTRA_MODULE); setExtraModulePolarity(); } } diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 66e8e5d6c..ddc6dffac 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -137,7 +137,6 @@ else() intmodule_pulses_driver.cpp trainer_driver.cpp ) - add_definitions(-DSBUS) set(PULSES_SRC ${PULSES_SRC} ../sbus.cpp diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index e6af772bd..d525d0fbb 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -172,13 +172,6 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) -#if defined(INTMODULE_USART) && defined(EXTMODULE_USART) - #define IS_UART_MODULE(port) (true) -#elif defined(INTMODULE_USART) - #define IS_UART_MODULE(port) (port == INTERNAL_MODULE) -#else - #define IS_UART_MODULE(port) (false) -#endif void init_ppm(uint8_t module); void disable_ppm(uint8_t module); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index c7aa5fcce..5d0549ba6 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -221,23 +221,24 @@ void extmoduleSendNextFrame() if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { 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->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 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].ppm.pulses); - EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].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->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { +#if defined(PXX1) + else if (moduleSettings[EXTERNAL_MODULE].protocol == 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(modulePulsesData[EXTERNAL_MODULE].pxx_uart.getData()); - DMA_InitStructure.DMA_BufferSize = modulePulsesData[EXTERNAL_MODULE].pxx_uart.getSize(); + 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; @@ -253,33 +254,38 @@ void extmoduleSendNextFrame() USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; #else - EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].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 |= 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.getData()); - EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA #endif } +#endif + +#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)) { 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->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].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 |= 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].dsm2.pulses); - EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - modulePulsesData[EXTERNAL_MODULE].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->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } +#endif + #if defined(CROSSFIRE) else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_CROSSFIRE) { - sportSendBuffer(modulePulsesData[EXTERNAL_MODULE].crossfire.pulses, modulePulsesData[EXTERNAL_MODULE].crossfire.length); + sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length); } #endif else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { - sportSendBuffer(modulePulsesData[EXTERNAL_MODULE].pxx2.getData(), modulePulsesData[EXTERNAL_MODULE].pxx2.getSize()); + sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); } else { EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 6d5bea5ed..7da20145f 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -34,25 +34,25 @@ void intmoduleStop() void intmoduleSendNextFrame() { - if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { - INTMODULE_TIMER->CCR2 = modulePulsesData[INTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance + if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { + INTMODULE_TIMER->CCR2 = intmodulePulsesData.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.getData()); - INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].pxx.getSize(); + 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 } #if defined(TARANIS_INTERNAL_PPM) else if (moduleSettings[INTERNAL_MODULE].protocol == 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 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance + 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(modulePulsesData[INTERNAL_MODULE].ppm.pulses); - INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].ppm.ptr - modulePulsesData[INTERNAL_MODULE].ppm.pulses; + 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 } #endif diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 51bc2e977..2dd205c7d 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -100,7 +100,7 @@ TASK_FUNCTION(mixerTask) while(1) { -#if defined(SBUS) +#if !defined(PCBXLITE) processSbusInput(); #endif diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 35ccbe517..377f092b2 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -90,7 +90,7 @@ static void processMultiSyncPacket(const uint8_t *data) multiSyncStatus.calcAdjustedRefreshRate(data[0] << 8 | data[1], data[2] << 8 | data[3]); #if !defined(PPM_PIN_SERIAL) - TRACE("MP ADJ: rest: %d, lag %04d, diff: %04d target: %d, interval: %d, Refresh: %d, intAdjRefresh: %d, adjRefresh %d\r\n", modulePulsesData[EXTERNAL_MODULE].dsm2.rest, + TRACE("MP ADJ: rest: %d, lag %04d, diff: %04d target: %d, interval: %d, Refresh: %d, intAdjRefresh: %d, adjRefresh %d\r\n", extmodulePulsesData.dsm2.rest, multiSyncStatus.inputLag, oldlag-multiSyncStatus.inputLag, multiSyncStatus.target, multiSyncStatus.interval, multiSyncStatus.refreshRate, multiSyncStatus.adjustedRefreshRate/50, multiSyncStatus.getAdjustedRefreshRate()); #endif