diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index 364a69a42..fb950ccbb 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -76,6 +76,20 @@ static void sendMulti(uint8_t moduleIdx, uint8_t b) sendByteSbus(b); } +static void updateMultiSync(uint8_t module) +{ + const auto& status = getMultiModuleStatus(module); + if (status.isValid() && status.isRXProto) { + mixerSchedulerSetPeriod(module, 0); + } else { + auto& sync = getModuleSyncStatus(module); + if (sync.isValid()) + mixerSchedulerSetPeriod(module, sync.getAdjustedRefreshRate()); + else + mixerSchedulerSetPeriod(module, MULTIMODULE_PERIOD); + } +} + static void sendFailsafeChannels(uint8_t moduleIdx) { uint32_t bits = 0; @@ -118,6 +132,8 @@ void setupPulsesMulti(uint8_t moduleIdx) }; uint8_t type=MULTI_NORMAL; + updateMultiSync(moduleIdx); + // not scanning protos && not spectrum analyser if (getModuleMode(moduleIdx) == MODULE_MODE_NORMAL) { // Failsafe packets @@ -202,12 +218,6 @@ void setupPulsesMultiExternalModule() } #if defined(INTERNAL_MODULE_MULTI) -void setupPulsesMultiInternalModule() -{ - intmodulePulsesData.multi.initFrame(); - setupPulsesMulti(INTERNAL_MODULE); -} - static void* multiInit(uint8_t module) { (void)module; diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 37a23b593..2ef9b86ed 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -649,15 +649,8 @@ bool setupPulsesExternalModule(uint8_t protocol) #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: - { - ModuleSyncStatus& status = getModuleSyncStatus(EXTERNAL_MODULE); - if (status.isValid()) - mixerSchedulerSetPeriod(EXTERNAL_MODULE, status.getAdjustedRefreshRate()); - else - mixerSchedulerSetPeriod(EXTERNAL_MODULE, MULTIMODULE_PERIOD); setupPulsesMultiExternalModule(); return true; - } #endif #if defined(PPM) diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 4211f1aa4..8988588ac 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -239,7 +239,6 @@ void setupPulsesLemonDSMP(); void setupPulsesCrossfire(uint8_t idx); void setupPulsesGhost(); void setupPulsesMultiExternalModule(); -void setupPulsesMultiInternalModule(); void setupPulsesSbus(); void setupPulsesPPMInternalModule(); void setupPulsesPPMExternalModule(); diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index a2c126228..553ad448d 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -244,6 +244,16 @@ static void processMultiStatusPacket(const uint8_t * data, uint8_t module, uint8 if (wasBinding && !status.isBinding() && getMultiBindStatus(module) == MULTI_BIND_INITIATED) setMultiBindStatus(module, MULTI_BIND_FINISHED); + // Dirty RX protocol detection + size_t proto_len = strnlen(status.protocolName, 8); + if (proto_len >= 2 && + status.protocolName[proto_len - 2] == 'R' && + status.protocolName[proto_len - 1] == 'X') { + status.isRXProto = true; + } else { + status.isRXProto = false; + } + // update timestamp last to avoid race conditions status.lastUpdate = get_tmr10ms(); } diff --git a/radio/src/telemetry/multi.h b/radio/src/telemetry/multi.h index 1f7fbf07d..ff454d9e9 100644 --- a/radio/src/telemetry/multi.h +++ b/radio/src/telemetry/multi.h @@ -108,6 +108,7 @@ struct MultiModuleStatus { uint8_t flags; uint8_t requiresFailsafeCheck; uint8_t failsafeChecked; + uint8_t isRXProto; tmr10ms_t lastUpdate; uint8_t protocolPrev = 0; diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 53d1522c9..bd7c8ee47 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -318,7 +318,7 @@ struct ModuleSyncStatus tmr10ms_t lastUpdate; // in 10ms int16_t currentLag; // in us - inline bool isValid() { + inline bool isValid() const { // 2 seconds return (get_tmr10ms() - lastUpdate < 200); }