From b6d4442ba19e3134c869a111614e1027896deb9c Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 7 Jun 2016 07:31:35 +0200 Subject: [PATCH] Fix interrupt handler not handling multiprotocol (Pulses fix) (#3570) * Fix interrupt handler not handling multiprotocol * Use proper Macros in driver, remove wrong comment about ppm --- radio/src/pulses/pulses_arm.cpp | 2 +- radio/src/pulses/pulses_arm.h | 15 ++++++--------- radio/src/targets/horus/extmodule_driver.cpp | 2 +- radio/src/targets/taranis/extmodule_driver.cpp | 2 +- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index e5519e5dd..44087b6fd 100644 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -65,7 +65,7 @@ void setupPulses(uint8_t port) required_protocol = PROTO_PXX; break; #if defined(MULTIMODULE) - case MODULE_TYPE_MULTIMODULE: + case MODULE_TYPE_MULTIMODULE: required_protocol = PROTO_MULTIMODULE; break; #endif diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 182457d4b..26b1a5cf1 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -74,14 +74,8 @@ PACK(struct PxxUartPulsesData { /* 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 */ -#if defined(MULTIMODULE) -#define NUM_TIMER_PULSES 300 -#else -#define NUM_TIMER_PULSES 200 -#endif - PACK(struct PxxTimerPulsesData { - pulse_duration_t pulses[NUM_TIMER_PULSES]; + pulse_duration_t pulses[200]; pulse_duration_t * ptr; uint16_t rest; uint16_t pcmCrc; @@ -89,12 +83,15 @@ PACK(struct PxxTimerPulsesData { }); PACK(struct Dsm2TimerPulsesData { - pulse_duration_t pulses[NUM_TIMER_PULSES]; +#if defined(MULTIMODULE) + pulse_duration_t pulses[300]; +#else + pulse_duration_t pulses[200]; +#endif pulse_duration_t * ptr; uint16_t rest; uint8_t index; }); -#undef NUM_TIMER_PULSES #endif #define CROSSFIRE_BAUDRATE 400000 diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 0cee6b65a..586f2bb12 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -235,7 +235,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.ptr - modulePulsesData[EXTERNAL_MODULE].pxx.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] >= PROTO_DSM2_LP45 && s_current_protocol[EXTERNAL_MODULE] <= PROTO_DSM2_DSMX) { + else if (IS_DSM2_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_MULTIMODULE_PROTOCOL(s_current_protocol[EXTERNAL_MODULE])) { 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; EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 1a5be7bc4..a912a26a1 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -224,7 +224,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.ptr - modulePulsesData[EXTERNAL_MODULE].pxx.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] >= PROTO_DSM2_LP45 && s_current_protocol[EXTERNAL_MODULE] <= PROTO_DSM2_DSMX) { + else if (IS_DSM2_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_MULTIMODULE_PROTOCOL(s_current_protocol[EXTERNAL_MODULE])) { 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; EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR);