diff --git a/companion/src/firmwares/edgetx/yaml_modeldata.cpp b/companion/src/firmwares/edgetx/yaml_modeldata.cpp index 3a8d70f4b..e177b7631 100644 --- a/companion/src/firmwares/edgetx/yaml_modeldata.cpp +++ b/companion/src/firmwares/edgetx/yaml_modeldata.cpp @@ -312,7 +312,7 @@ bool convert::decode(const Node& node, TimerData& rhs) node["showElapsed"] >> rhs.showElapsed; node["extraHaptic"] >> rhs.extraHaptic; - if (rhs.extraHaptic) + if (rhs.extraHaptic) rhs.countdownBeep += TimerData::COUNTDOWNBEEP_VOICE + 1; return true; @@ -577,7 +577,7 @@ struct RFAlarms { int critical = 0; RFAlarms() {} - + RFAlarms(const RSSIAlarmData& rhs) : warning(rhs.warning), critical(rhs.critical) {} @@ -1206,6 +1206,10 @@ bool convert::decode(const Node& node, ModelData& rhs) } } + // perform integrity checks and fix-ups + + rhs.sortMixes(); // critical for Companion and radio that mix lines are in sequence + return true; } diff --git a/companion/src/firmwares/modeldata.h b/companion/src/firmwares/modeldata.h index d13090677..7e8971809 100644 --- a/companion/src/firmwares/modeldata.h +++ b/companion/src/firmwares/modeldata.h @@ -230,6 +230,7 @@ class ModelData { int linkedFlightModeValueToIndex(const int phaseIdx, const int val, const int maxOwnValue); void clearMixes(); + void sortMixes(); void clearInputs(); int getChannelsMax(bool forceExtendedLimits=false) const; @@ -363,6 +364,5 @@ class ModelData { if (value != swtch.toValue()) value = swtch.toValue(); } - void sortMixes(); void updateResetParam(CustomFunctionData * cfd); }; diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index 9523cb80e..b67d776bb 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -95,6 +95,37 @@ void postRadioSettingsLoad() #endif } +static void sortMixerLines() +{ + // simple bubble sort + unsigned passes = 0; + unsigned swaps; + MixData tmp; + + do { + swaps = 0; + for (int i = 0; i < MAX_MIXERS - 1; i++) { + auto a = mixAddress(i); + auto b = mixAddress(i + 1); + + if (b->destCh < a->destCh) { + if (is_memclear(b, sizeof(MixData))) + break; + + memcpy(&tmp, a, sizeof(MixData)); + memcpy(a, b, sizeof(MixData)); + memcpy(b, &tmp, sizeof(MixData)); + ++swaps; + } + } + ++passes; + } while(swaps > 0); + + if (passes > 1) { + storageDirty(EE_MODEL); + } +} + void postModelLoad(bool alarms) { #if defined(PXX2) @@ -126,6 +157,7 @@ void postModelLoad(bool alarms) } loadCurves(); + sortMixerLines(); #if defined(GUI) if (alarms) {