WiP internal CRSF pulses

This commit is contained in:
Raphael Coeffic
2021-11-21 11:18:35 +01:00
committed by Raphael Coeffic
parent 42508f4173
commit 5d240e4e48
5 changed files with 83 additions and 38 deletions
+23 -16
View File
@@ -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) {
+26 -17
View File
@@ -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);
}
}
+2 -2
View File
@@ -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)
+22 -1
View File
@@ -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();
+10 -2
View File
@@ -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<pulse_duration_t> ppm;
#endif
@@ -212,9 +216,13 @@ union ExternalModulePulsesData {
PpmPulsesData<pulse_duration_t> 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();