fix: Sort mixer lines after loading model (#3172)

* fix: sort mixer lines after loading model

Fixes #2806

* fix(cpn): sort mixer lines after loading model

* More efficient swap

---------

Co-authored-by: elecpower <neilh713@tpg.com.au>
This commit is contained in:
Raphael Coeffic
2023-02-15 15:11:13 +10:00
committed by GitHub
co-authored by elecpower
parent d57afea89e
commit 3695930242
3 changed files with 39 additions and 3 deletions
@@ -312,7 +312,7 @@ bool convert<TimerData>::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<ModelData>::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;
}
+1 -1
View File
@@ -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);
};
+32
View File
@@ -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) {