WiP internal CRSF pulses
This commit is contained in:
committed by
Raphael Coeffic
parent
42508f4173
commit
5d240e4e48
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user