diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 05b5527aa..21a9cbab2 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -584,6 +584,10 @@ bool isModuleUsingSport(uint8_t moduleBay, uint8_t moduleType) if (moduleBay == EXTERNAL_MODULE) return false; + case MODULE_TYPE_CROSSFIRE: + if (moduleBay == INTERNAL_MODULE) + return false; + default: return true; } @@ -606,27 +610,30 @@ bool isInternalModuleAvailable(int moduleType) #if defined(INTERNAL_MODULE_MULTI) if (moduleType == MODULE_TYPE_MULTIMODULE) return true; - else - return false; #endif - if (moduleType == MODULE_TYPE_XJT_PXX1) { -#if defined(PXX1) && defined(INTERNAL_MODULE_PXX1) - return !isModuleUsingSport(EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].type); -#endif - } - - if (moduleType == MODULE_TYPE_ISRM_PXX2) { -#if defined(PXX2) && defined(INTERNAL_MODULE_PXX2) - return !areModulesConflicting(moduleType, g_model.moduleData[EXTERNAL_MODULE].type); -#endif - } - - if (moduleType == MODULE_TYPE_PPM) { -#if defined(PPM) && defined(INTERNAL_MODULE_PPM) +#if defined(INTERNAL_MODULE_CRSF) + if (moduleType == MODULE_TYPE_CROSSFIRE) return true; #endif + +#if defined(PXX1) && defined(INTERNAL_MODULE_PXX1) + if (moduleType == MODULE_TYPE_XJT_PXX1) { + return !isModuleUsingSport(EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].type); } +#endif + +#if defined(PXX2) && defined(INTERNAL_MODULE_PXX2) + if (moduleType == MODULE_TYPE_ISRM_PXX2) { + return !areModulesConflicting(moduleType, g_model.moduleData[EXTERNAL_MODULE].type); + } +#endif + +#if defined(PPM) && defined(INTERNAL_MODULE_PPM) + if (moduleType == MODULE_TYPE_PPM) { + return true; + } +#endif #if (defined(AFHDS3) || defined(AFHDS2)) && (defined(INTERNAL_MODULE_AFHDS2A) || defined(INTERNAL_MODULE_AFHDS3)) if (moduleType == MODULE_TYPE_FLYSKY) { diff --git a/radio/src/pulses/crossfire.cpp b/radio/src/pulses/crossfire.cpp index 2647bf84f..985c821f0 100644 --- a/radio/src/pulses/crossfire.cpp +++ b/radio/src/pulses/crossfire.cpp @@ -70,26 +70,35 @@ uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses) return buf - frame; } -void setupPulsesCrossfire() +static void setupPulsesCrossfire(uint8_t idx, CrossfirePulsesData* p_data) { - if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { - uint8_t * pulses = extmodulePulsesData.crossfire.pulses; #if defined(LUA) - if (outputTelemetryBuffer.destination == TELEMETRY_ENDPOINT_SPORT) { - memcpy(pulses, outputTelemetryBuffer.data, outputTelemetryBuffer.size); - extmodulePulsesData.crossfire.length = outputTelemetryBuffer.size; - outputTelemetryBuffer.reset(); - } - else + if (outputTelemetryBuffer.destination == TELEMETRY_ENDPOINT_SPORT) { + memcpy(p_data->pulses, outputTelemetryBuffer.data, + outputTelemetryBuffer.size); + p_data->length = outputTelemetryBuffer.size; + outputTelemetryBuffer.reset(); + } else #endif - { - if (moduleState[EXTERNAL_MODULE].counter == CRSF_FRAME_MODELID) { - extmodulePulsesData.crossfire.length = createCrossfireModelIDFrame(pulses); - moduleState[EXTERNAL_MODULE].counter = CRSF_FRAME_MODELID_SENT; - } - else { - extmodulePulsesData.crossfire.length = createCrossfireChannelsFrame(pulses, &channelOutputs[g_model.moduleData[EXTERNAL_MODULE].channelsStart]); - } + { + if (moduleState[idx].counter == CRSF_FRAME_MODELID) { + p_data->length = createCrossfireModelIDFrame(p_data->pulses); + moduleState[idx].counter = CRSF_FRAME_MODELID_SENT; + } else { + p_data->length = createCrossfireChannelsFrame( + p_data->pulses, + &channelOutputs[g_model.moduleData[idx].channelsStart]); } } } + +void setupPulsesCrossfire(uint8_t idx) +{ + if (idx == INTERNAL_MODULE) { + auto* p_data = &intmodulePulsesData.crossfire; + setupPulsesCrossfire(idx, p_data); + } else if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { + auto* p_data = &extmodulePulsesData.crossfire; + setupPulsesCrossfire(idx, p_data); + } +} diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 438308ec8..61a761105 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -223,7 +223,7 @@ inline bool isModuleISRMAccess(uint8_t idx) #if defined(CROSSFIRE) inline bool isModuleCrossfire(uint8_t idx) { - return idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE; + return g_model.moduleData[idx].type == MODULE_TYPE_CROSSFIRE; } #else inline bool isModuleCrossfire(uint8_t idx) @@ -235,7 +235,7 @@ inline bool isModuleCrossfire(uint8_t idx) #if defined(GHOST) inline bool isModuleGhost(uint8_t idx) { - return idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_GHOST; + return g_model.moduleData[idx].type == MODULE_TYPE_GHOST; } #else inline bool isModuleGhost(uint8_t idx) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 83bea0623..4b0bd347f 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -420,7 +420,7 @@ bool setupPulsesExternalModule(uint8_t protocol) mixerSchedulerSetPeriod(EXTERNAL_MODULE, status.getAdjustedRefreshRate()); else mixerSchedulerSetPeriod(EXTERNAL_MODULE, CROSSFIRE_PERIOD); - setupPulsesCrossfire(); + setupPulsesCrossfire(EXTERNAL_MODULE); return true; } #endif @@ -523,6 +523,14 @@ static void enablePulsesInternalModule(uint8_t protocol) break; #endif +#if defined(INTERNAL_MODULE_CRSF) + case PROTOCOL_CHANNELS_CROSSFIRE: + intmoduleSerialStart(CROSSFIRE_BAUDRATE, true, USART_Parity_No, + USART_StopBits_1, USART_WordLength_8b); + mixerSchedulerSetPeriod(INTERNAL_MODULE, CROSSFIRE_PERIOD); + break; +#endif + #if defined(INTERNAL_MODULE_PPM) case PROTOCOL_CHANNELS_PPM: intmodulePpmStart(); @@ -582,6 +590,19 @@ bool setupPulsesInternalModule(uint8_t protocol) return true; #endif +#if defined(INTERNAL_MODULE_CRSF) + case PROTOCOL_CHANNELS_CROSSFIRE: + { + ModuleSyncStatus& status = getModuleSyncStatus(INTERNAL_MODULE); + if (status.isValid()) + mixerSchedulerSetPeriod(INTERNAL_MODULE, status.getAdjustedRefreshRate()); + else + mixerSchedulerSetPeriod(INTERNAL_MODULE, CROSSFIRE_PERIOD); + setupPulsesCrossfire(INTERNAL_MODULE); + return true; + } +#endif + #if defined(INTERNAL_MODULE_MULTI) case PROTOCOL_CHANNELS_MULTIMODULE: setupPulsesMultiInternalModule(); diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index e23a41c87..50e5b85d2 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -176,10 +176,14 @@ union InternalModulePulsesData { FlySkySerialPulsesData flysky; #endif -#if defined(MULTIMODULE) //&& defined(INTMODULE_USART) +#if defined(MULTIMODULE) UartMultiPulses multi; #endif +#if defined(CROSSFIRE) + CrossfirePulsesData crossfire; +#endif + #if defined(INTERNAL_MODULE_PPM) PpmPulsesData ppm; #endif @@ -212,9 +216,13 @@ union ExternalModulePulsesData { PpmPulsesData ppm; +#if defined(CROSSFIRE) CrossfirePulsesData crossfire; +#endif +#if defined(GHOST) GhostPulsesData ghost; +#endif } __ALIGNED(4); /* The __ALIGNED keyword is required to align the struct inside the modulePulsesData below, @@ -242,7 +250,7 @@ bool setupPulsesExternalModule(); void stopPulsesExternalModule(); #endif void setupPulsesDSM2(); -void setupPulsesCrossfire(); +void setupPulsesCrossfire(uint8_t idx); void setupPulsesGhost(); void setupPulsesMultiExternalModule(); void setupPulsesMultiInternalModule();