fix(radio): multiplex setting is not valid for 1st line in a mix (#5465)

This commit is contained in:
philmoz
2024-08-26 20:53:55 +10:00
committed by GitHub
parent 262edf1a6b
commit 2be160f1d2
10 changed files with 51 additions and 40 deletions
+4 -1
View File
@@ -108,7 +108,10 @@ void menuModelMixOne(event_t event)
uint8_t old_editMode = s_editMode;
SUBMENU(STR_MIXES, MIX_FIELD_COUNT,
{0, 0, 0, 0, 0, 1, CASE_FLIGHT_MODES(FM_ROW((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE)) 0, 0 /*, ...*/});
{0, 0, 0, 0, 0, 1, CASE_FLIGHT_MODES(FM_ROW((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE)) 0, 0,
(uint8_t)((s_currIdx > 0 && mixAddress(s_currIdx - 1)->destCh == md2->destCh) ? 0 : HIDDEN_ROW),
0 /*, ...*/
});
int8_t sub = menuVerticalPosition;
int8_t editMode = s_editMode;
+4 -1
View File
@@ -104,7 +104,10 @@ void menuModelMixOne(event_t event)
uint8_t old_editMode = s_editMode;
SUBMENU(STR_MIXES, MIX_FIELD_COUNT,
{0, 0, 0, 0, 0, 1, CASE_FLIGHT_MODES(FM_ROW((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE)) 0, 0 /*, ...*/});
{0, 0, 0, 0, 0, 1, CASE_FLIGHT_MODES(FM_ROW((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE)) 0, 0,
(uint8_t)((s_currIdx > 0 && mixAddress(s_currIdx - 1)->destCh == md2->destCh) ? 0 : HIDDEN_ROW),
0 /*, ...*/
});
int8_t sub = menuVerticalPosition;
int8_t editMode = s_editMode;
@@ -60,11 +60,14 @@ void MixEditAdvanced::buildBody(Window* form)
MixData* mix = mixAddress(index);
// Advanced...
FormLine* line;
// Multiplex
auto line = form->newLine(grid);
new StaticText(line, rect_t{}, STR_MULTPX);
new Choice(line, rect_t{}, STR_VMLTPX, 0, 2, GET_SET_DEFAULT(mix->mltpx));
if (index > 0 && mixAddress(index - 1)->destCh == channel) {
line = form->newLine(grid);
new StaticText(line, rect_t{}, STR_MULTPX);
new Choice(line, rect_t{}, STR_VMLTPX, 0, 2, GET_SET_DEFAULT(mix->mltpx));
}
// Flight modes
if (modelFMEnabled()) {
+3 -8
View File
@@ -333,14 +333,9 @@ void menuModelMixAll(event_t event)
drawSource(MIX_LINE_SRC_POS, y, md->srcRaw, 0);
if (mixCnt == 0 && md->mltpx == 1) {
lcdDrawText(MIX_LINE_WEIGHT_POS, y, "MULT!", RIGHT | ((isMixActive(i) ? BOLD : 0)));
}
else {
editSrcVarFieldValue(MIX_LINE_WEIGHT_POS, y, nullptr, md->weight,
MIX_WEIGHT_MIN, MIX_WEIGHT_MAX, RIGHT | ((isMixActive(i) ? BOLD : 0)),
0, 0, MIXSRC_FIRST, INPUTSRC_LAST);
}
editSrcVarFieldValue(MIX_LINE_WEIGHT_POS, y, nullptr, md->weight,
MIX_WEIGHT_MIN, MIX_WEIGHT_MAX, RIGHT | ((isMixActive(i) ? BOLD : 0)),
0, 0, MIXSRC_FIRST, INPUTSRC_LAST);
#if LCD_W >= 212
displayMixLine(y, md);
+24 -19
View File
@@ -1037,25 +1037,30 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms)
int32_t * ptr = &chans[md->destCh]; // Save calculating address several times
switch (md->mltpx) {
case MLTPX_REPL:
*ptr = dv;
if (mode == e_perout_mode_normal) {
for (int8_t m = i - 1; m >= 0 && mixAddress(m)->destCh == md->destCh; m--)
activeMixes[m] = false;
}
break;
case MLTPX_MUL:
// @@@2 we have to remove the weight factor of 256 in case of 100%; now we use the new base of 256
dv >>= 8;
dv *= *ptr;
dv >>= RESX_SHIFT; // same as dv /= RESXl;
*ptr = dv;
break;
default: // MLTPX_ADD
*ptr += dv; //Mixer output add up to the line (dv + (dv>0 ? 100/2 : -100/2))/(100);
break;
} // endswitch md->mltpx
// If first mix line for a channel - ignore Multiplex setting
if (i == 0 || mixAddress(i - 1)->destCh != md->destCh) {
*ptr = dv;
} else {
switch (md->mltpx) {
case MLTPX_REPL:
*ptr = dv;
if (mode == e_perout_mode_normal) {
for (int8_t m = i - 1; m >= 0 && mixAddress(m)->destCh == md->destCh; m--)
activeMixes[m] = false;
}
break;
case MLTPX_MUL:
// @@@2 we have to remove the weight factor of 256 in case of 100%; now we use the new base of 256
dv >>= 8;
dv *= *ptr;
dv >>= RESX_SHIFT; // same as dv /= RESXl;
*ptr = dv;
break;
default: // MLTPX_ADD
*ptr += dv; //Mixer output add up to the line (dv + (dv>0 ? 100/2 : -100/2))/(100);
break;
} // endswitch md->mltpx
}
#ifdef PREVENT_ARITHMETIC_OVERFLOW
/*
// a lot of assumptions must be true, for this kind of check; not really worth for only 4 bytes flash savings