fix(radio): multiplex setting is not valid for 1st line in a mix (#5465)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user