fix: Quick fix to let CRSF be used with MPM wireless trainer - limiations apply (#1724)

* Let's do some dirty hack with MPM RX

Resolves #1671

* Use the right function to sync and shutdown sync on external MPM as well
This commit is contained in:
Raphael Coeffic
2022-03-25 12:04:15 +10:00
committed by GitHub
parent b359e2db71
commit 50aeb50029
6 changed files with 28 additions and 15 deletions
+16 -6
View File
@@ -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;
-7
View File
@@ -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)
-1
View File
@@ -239,7 +239,6 @@ void setupPulsesLemonDSMP();
void setupPulsesCrossfire(uint8_t idx);
void setupPulsesGhost();
void setupPulsesMultiExternalModule();
void setupPulsesMultiInternalModule();
void setupPulsesSbus();
void setupPulsesPPMInternalModule();
void setupPulsesPPMExternalModule();
+10
View File
@@ -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();
}
+1
View File
@@ -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;
+1 -1
View File
@@ -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);
}