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:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -239,7 +239,6 @@ void setupPulsesLemonDSMP();
|
||||
void setupPulsesCrossfire(uint8_t idx);
|
||||
void setupPulsesGhost();
|
||||
void setupPulsesMultiExternalModule();
|
||||
void setupPulsesMultiInternalModule();
|
||||
void setupPulsesSbus();
|
||||
void setupPulsesPPMInternalModule();
|
||||
void setupPulsesPPMExternalModule();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user