From b62ab2bd6263d714d45333a7d2e0e3561715ac58 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 09:57:11 +0100 Subject: [PATCH] Missing initialization on module type change XJT / R9M should not reboot (still not tested) --- radio/src/gui/128x64/model_setup.cpp | 37 ++++++++++++------- radio/src/io/frsky_pxx2.h | 4 -- radio/src/pulses/modules.h | 2 +- radio/src/pulses/pulses.cpp | 4 +- radio/src/pulses/pxx.h | 20 ++++++---- radio/src/pulses/pxx1.cpp | 16 +++++--- radio/src/pulses/pxx1.h | 6 +-- .../src/targets/taranis/extmodule_driver.cpp | 4 +- radio/src/telemetry/telemetry.cpp | 2 +- 9 files changed, 55 insertions(+), 40 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index aebb0836f..c441f5da8 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -910,7 +910,13 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_MODE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, attr); if (attr) { - g_model.moduleData[INTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); + uint8_t moduleType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); + if (checkIncDec_Ret) { + // TODO this code should be common, in module.h (X10_new_UI branch) + memclear(&g_model.moduleData[INTERNAL_MODULE], sizeof(ModuleData)); + g_model.moduleData[INTERNAL_MODULE].type = moduleType; + g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); + } } break; #endif @@ -951,19 +957,22 @@ void menuModelSetup(event_t event) if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: - g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, - MODULE_TYPE_NONE, - IS_TRAINER_EXTERNAL_MODULE() ? MODULE_TYPE_NONE : - MODULE_TYPE_COUNT - 1, EE_MODEL, - isExternalModuleAvailable); - if (checkIncDec_Ret) { - g_model.moduleData[EXTERNAL_MODULE].rfProtocol = 0; - g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; - g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); - if (isModuleSBUS(EXTERNAL_MODULE)) - g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate = -31; - if (isModulePPM(EXTERNAL_MODULE)) - SET_DEFAULT_PPM_FRAME_LENGTH(EXTERNAL_MODULE); + { + uint8_t moduleType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, + MODULE_TYPE_NONE, + IS_TRAINER_EXTERNAL_MODULE() ? MODULE_TYPE_NONE : + MODULE_TYPE_COUNT - 1, EE_MODEL, + isExternalModuleAvailable); + if (checkIncDec_Ret) { + // TODO this code should be common, in module.h (X10_new_UI branch) + memclear(&g_model.moduleData[EXTERNAL_MODULE], sizeof(ModuleData)); + g_model.moduleData[EXTERNAL_MODULE].type = moduleType; + g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); + if (isModuleSBUS(EXTERNAL_MODULE)) + g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate = -31; + if (isModulePPM(EXTERNAL_MODULE)) + SET_DEFAULT_PPM_FRAME_LENGTH(EXTERNAL_MODULE); + } } break; case 1: diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index 9149c9891..01e50fdc3 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -23,10 +23,6 @@ #include "../fifo.h" -#define PXX2_BAUDRATE 230400 -#define PXX2_PERIOD 4 // 4ms -#define PXX2_FRAME_MAXLENGTH 64 - class ModuleFifo : public Fifo { public: bool getFrame(uint8_t * frame) diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index a2ee9e3b0..abfd47783 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -200,7 +200,7 @@ inline bool isModuleDSM2(uint8_t idx) #endif // order is the same as in enum Protocols in myeeprom.h (none, ppm, pxx, pxx2, dsm, crossfire, multi, r9m, r9m2, sbus) -static const int8_t maxChannelsModules[] = { 0, 8, 8, 16, -2, 8, 4, 8, 16, 8}; // relative to 8! +static const int8_t maxChannelsModules[] = { 0, 8, 8, 8, -2, 8, 4, 8, 16, 8}; // relative to 8! static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 846161850..a2afa462d 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -219,7 +219,7 @@ void setupPulsesInternalModule(uint8_t protocol) #if defined(PXX1) case PROTOCOL_CHANNELS_PXX1: setupPulsesPXXInternalModule(); - scheduleNextMixerCalculation(INTERNAL_MODULE, PXX_PERIOD); + scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX_PERIOD); break; #endif @@ -248,7 +248,7 @@ void setupPulsesExternalModule(uint8_t protocol) #if defined(PXX1) case PROTOCOL_CHANNELS_PXX1: setupPulsesPXXExternalModule(); - scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX_PERIOD); + scheduleNextMixerCalculation(EXTERNAL_MODULE, EXTMODULE_PXX_PERIOD); break; #endif diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 89993a8c4..ec9d1dad8 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -27,16 +27,22 @@ #define PXX_SEND_FAILSAFE (1 << 4) #define PXX_SEND_RANGECHECK (1 << 5) +#define PXX2_ON_SPORT_BAUDRATE 230400 +#define PXX2_PERIOD 4 // 4ms +#define PXX2_FRAME_MAXLENGTH 64 + +#define EXTMODULE_PXX_PERIOD 9/*ms*/ + #if defined(PXX_FREQUENCY_HIGH) - #define EXTMODULE_USART_PXX_BAUDRATE 450000 #define INTMODULE_USART_PXX_BAUDRATE 450000 - #define PXX_PERIOD 4/*ms*/ + #define INTMODULE_PXX_PERIOD 4/*ms*/ #else - #define EXTMODULE_USART_PXX_BAUDRATE 115200 #define INTMODULE_USART_PXX_BAUDRATE 115200 - #define PXX_PERIOD 9/*ms*/ + #define INTMODULE_PXX_PERIOD 9/*ms*/ #endif +#define EXTMODULE_USART_PXX2_BAUDRATE 450000 + #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 */ @@ -56,7 +62,7 @@ class SerialPxxBitTransport: public DataBuffer { uint8_t byte; uint8_t bits_count; - void initFrame() + void initFrame(uint32_t period) { initBuffer(); byte = 0; @@ -97,10 +103,10 @@ class PwmPxxBitTransport: public PulsesBuffer { protected: uint16_t rest; - void initFrame() + void initFrame(uint32_t period) { initBuffer(); - rest = PXX_PERIOD_HALF_US; + rest = period * 2000; // 0.5uS (2Mhz) } void addPart(uint8_t value) diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 37d53e771..86e05a615 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -216,20 +216,24 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t module, uint8_t sendUpp template void Pxx1Pulses::setupFrame(uint8_t module) { - PxxTransport::initFrame(); + PxxTransport::initFrame(module == INTERNAL_MODULE ? INTMODULE_PXX_PERIOD : EXTMODULE_PXX_PERIOD); #if defined(PXX_FREQUENCY_HIGH) - add8ChannelsFrame(module, 0); - if (sentModuleChannels(module) > 8) { - add8ChannelsFrame(module, 8); + if (module == INTERNAL_MODULE) { + add8ChannelsFrame(module, 0); + if (sentModuleChannels(module) > 8) { + add8ChannelsFrame(module, 8); + } + return; } -#else +#endif + uint8_t sendUpperChannels = 0; if (moduleSettings[module].counter & 0x01) { sendUpperChannels = g_model.moduleData[module].channelsCount; } + add8ChannelsFrame(module, sendUpperChannels); -#endif } template class Pxx1Pulses >; diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 99480efe6..600a1cb4d 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -44,9 +44,9 @@ class StandardPxx1Transport: public BitTransport, public Pxx1CrcMixin { protected: uint8_t ones_count; - void initFrame() + void initFrame(uint32_t period) { - BitTransport::initFrame(); + BitTransport::initFrame(period); ones_count = 0; } @@ -93,7 +93,7 @@ class StandardPxx1Transport: public BitTransport, public Pxx1CrcMixin { class UartPxx1Transport: public DataBuffer, public Pxx1CrcMixin { protected: - void initFrame() + void initFrame(uint32_t period) { initBuffer(); } diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 31fb234de..b3f0fd6a2 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -197,7 +197,7 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) void extmodulePxx2Start() { - extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE); + extmoduleInvertedSerialStart(EXTMODULE_USART_PXX2_BAUDRATE); } #else void extmodulePxx2Start() @@ -223,7 +223,7 @@ void extmodulePxxStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = PXX_PERIOD_HALF_US; + EXTMODULE_TIMER->ARR = EXTMODULE_PXX_PERIOD * 2000; // 0.5uS (2Mhz) EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | EXTMODULE_TIMER_OUTPUT_POLARITY; // polarity, default low EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs EXTMODULE_TIMER->CCR1 = 18; diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 56f0a3178..6d4f97eb8 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -288,7 +288,7 @@ void telemetryInit(uint8_t protocol) #endif else if (protocol == PROTOCOL_TELEMETRY_PXX2) { - telemetryPortInit(PXX2_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); + telemetryPortInit(PXX2_ON_SPORT_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); #if defined(LUA) outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E;