fix(radio): multiplex setting is not valid for 1st line in a mix (#5465)
This commit is contained in:
@@ -27,7 +27,7 @@
|
||||
#include "namevalidator.h"
|
||||
#include "sourcenumref.h"
|
||||
|
||||
MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata, GeneralSettings & generalSettings, Firmware * firmware,
|
||||
MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata, int index, GeneralSettings & generalSettings, Firmware * firmware,
|
||||
CompoundItemModelFactory * sharedItemModels) :
|
||||
QDialog(parent),
|
||||
ui(new Ui::MixerDialog),
|
||||
@@ -94,6 +94,11 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata,
|
||||
ui->label_MixDR->hide();
|
||||
}
|
||||
|
||||
if (index == 0 || model.mixData[index - 1].destCh != mixdata->destCh) {
|
||||
ui->mltpxCB->hide();
|
||||
ui->mltpxLbl->hide();
|
||||
}
|
||||
|
||||
if (!firmware->getCapability(VirtualInputs)) {
|
||||
for(int i = 0; i < CPN_MAX_STICKS; i++) {
|
||||
ui->trimCB->addItem(Boards::getInputName(i, board));
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace Ui {
|
||||
class MixerDialog : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
MixerDialog(QWidget *parent, ModelData & model, MixData *mixdata, GeneralSettings & generalSettings, Firmware * firmware,
|
||||
MixerDialog(QWidget *parent, ModelData & model, MixData *mixdata, int index, GeneralSettings & generalSettings, Firmware * firmware,
|
||||
CompoundItemModelFactory * sharedItemModels);
|
||||
~MixerDialog();
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="10" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<widget class="QLabel" name="mltpxLbl">
|
||||
<property name="text">
|
||||
<string>Multiplex</string>
|
||||
</property>
|
||||
|
||||
@@ -184,7 +184,7 @@ void MixesPanel::gm_openMix(int index)
|
||||
|
||||
MixData mixd(model->mixData[index]);
|
||||
|
||||
MixerDialog *dlg = new MixerDialog(this, *model, &mixd, generalSettings, firmware, sharedItemModels);
|
||||
MixerDialog *dlg = new MixerDialog(this, *model, &mixd, index, generalSettings, firmware, sharedItemModels);
|
||||
if(dlg->exec()) {
|
||||
model->mixData[index] = mixd;
|
||||
emit modified();
|
||||
|
||||
@@ -416,10 +416,7 @@ QString ModelPrinter::printMixerLine(const MixData & mix, bool showMultiplex, in
|
||||
}
|
||||
str += " " + source;
|
||||
|
||||
if (mix.mltpx == MLTPX_MUL && !showMultiplex)
|
||||
str += " " + tr("MULT!").toHtmlEscaped();
|
||||
else
|
||||
str += " " + tr("Weight(%1)").arg(SourceNumRef(mix.weight).toString(&model, &generalSettings)).toHtmlEscaped();
|
||||
str += " " + tr("Weight(%1)").arg(SourceNumRef(mix.weight).toString(&model, &generalSettings)).toHtmlEscaped();
|
||||
|
||||
QString flightModesStr = printFlightModes(mix.flightModes);
|
||||
if (!flightModesStr.isEmpty())
|
||||
|
||||
@@ -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