Skip to content

Commit

Permalink
fix(radio): multiplex setting is not valid for 1st line in a mix (#5465)
Browse files Browse the repository at this point in the history
  • Loading branch information
philmoz authored Aug 26, 2024
1 parent 262edf1 commit 2be160f
Show file tree
Hide file tree
Showing 10 changed files with 51 additions and 40 deletions.
7 changes: 6 additions & 1 deletion companion/src/modeledit/mixerdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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));
Expand Down
2 changes: 1 addition & 1 deletion companion/src/modeledit/mixerdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
2 changes: 1 addition & 1 deletion companion/src/modeledit/mixerdialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
2 changes: 1 addition & 1 deletion companion/src/modeledit/mixes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
5 changes: 1 addition & 4 deletions companion/src/modelprinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -416,10 +416,7 @@ QString ModelPrinter::printMixerLine(const MixData & mix, bool showMultiplex, in
}
str += "&nbsp;" + 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())
Expand Down
5 changes: 4 additions & 1 deletion radio/src/gui/128x64/model_mix_edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 4 additions & 1 deletion radio/src/gui/212x64/model_mix_edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 6 additions & 3 deletions radio/src/gui/colorlcd/model/mixer_edit_adv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down
11 changes: 3 additions & 8 deletions radio/src/gui/common/stdlcd/model_mixes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
43 changes: 24 additions & 19 deletions radio/src/mixer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 2be160f

Please sign in to comment.