diff --git a/companion/src/firmwares/input_data.cpp b/companion/src/firmwares/input_data.cpp index 9b9ecfe20..28d290416 100644 --- a/companion/src/firmwares/input_data.cpp +++ b/companion/src/firmwares/input_data.cpp @@ -20,6 +20,8 @@ #include "input_data.h" #include "radiodataconversionstate.h" +#include "eeprominterface.h" +#include "compounditemmodels.h" void ExpoData::convert(RadioDataConversionState & cstate) { @@ -33,3 +35,44 @@ bool ExpoData::isEmpty() const { return (chn == 0 && mode == INPUT_MODE_NONE); } + +QString ExpoData::carryTrimToString() const +{ + if (carryTrim == CARRYTRIM_STICK_OFF) + return tr("OFF"); + else if (carryTrim == CARRYTRIM_DEFAULT) { + if (srcRaw.isStick()) + return tr("ON"); + else + return tr("OFF"); + } + else if (carryTrim < 0 && abs(carryTrim) <= Boards::getBoardCapability(getCurrentBoard(), Board::NumTrims)) + return RawSource(SOURCE_TYPE_TRIM, abs(carryTrim) - 1).toString(); + else + return CPN_STR_UNKNOWN_ITEM; +} + +// static +AbstractStaticItemModel * ExpoData::carryTrimItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_EXPO_CARRYTRIM); + ExpoData tmp = ExpoData(); + + tmp.srcRaw = RawSource(SOURCE_TYPE_STICK, 0); + + for (int i = -CARRYTRIM_STICK_OFF; i <= Boards::getBoardCapability(getCurrentBoard(), Board::NumTrims); i++) { + tmp.carryTrim = -i; + mdl->appendToItemList(tmp.carryTrimToString(), -i, true, 0, CarryTrimSticksGroup); + } + + tmp.srcRaw = RawSource(SOURCE_TYPE_NONE, 0); + + for (int i = CARRYTRIM_DEFAULT; i <= Boards::getBoardCapability(getCurrentBoard(), Board::NumTrims); i++) { + tmp.carryTrim = -i; + mdl->appendToItemList(tmp.carryTrimToString(), -i, true, 0, CarryTrimNotSticksGroup); + } + + mdl->loadItemList(); + return mdl; +} diff --git a/companion/src/firmwares/input_data.h b/companion/src/firmwares/input_data.h index 27b6b6282..b233a0d65 100644 --- a/companion/src/firmwares/input_data.h +++ b/companion/src/firmwares/input_data.h @@ -26,7 +26,11 @@ #include +// identiying names of static abstract item models +constexpr char AIM_EXPO_CARRYTRIM[] {"expo.carrytrim"}; + class RadioDataConversionState; +class AbstractStaticItemModel; enum InputMode { INPUT_MODE_NONE, @@ -35,6 +39,14 @@ enum InputMode { INPUT_MODE_BOTH }; +constexpr int CARRYTRIM_DEFAULT = {0}; +constexpr int CARRYTRIM_STICK_OFF = {1}; + +enum CarryTrimGroups { + CarryTrimSticksGroup = 0x001, + CarryTrimNotSticksGroup = 0x002 +}; + #define EXPODATA_NAME_LEN 10 class ExpoData { @@ -58,4 +70,7 @@ class ExpoData { void convert(RadioDataConversionState & cstate); void clear() { memset(reinterpret_cast(this), 0, sizeof(ExpoData)); } bool isEmpty() const; + QString carryTrimToString() const; + + static AbstractStaticItemModel * carryTrimItemModel(); }; diff --git a/companion/src/modeledit/expodialog.cpp b/companion/src/modeledit/expodialog.cpp index 7edebb1b1..b15d7e85b 100644 --- a/companion/src/modeledit/expodialog.cpp +++ b/companion/src/modeledit/expodialog.cpp @@ -111,10 +111,16 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G ui->trimCB->hide(); } - for(int i = 0; i < getBoardCapability(getCurrentBoard(), Board::NumTrims); i++) { - ui->trimCB->addItem(RawSource(SOURCE_TYPE_TRIM, i).toString(), i + 1); - } - ui->trimCB->setCurrentIndex(1 - ed->carryTrim); + dialogFilteredItemModels->registerItemModel(new FilteredItemModel(ExpoData::carryTrimItemModel()), AIM_EXPO_CARRYTRIM); + ui->trimCB->setModel(dialogFilteredItemModels->getItemModel(AIM_EXPO_CARRYTRIM)); + + if (ed->srcRaw.isStick()) + carryTrimFilterFlags = CarryTrimSticksGroup; + else + carryTrimFilterFlags = CarryTrimNotSticksGroup; + + dialogFilteredItemModels->getItemModel(AIM_EXPO_CARRYTRIM)->setFilterFlags(carryTrimFilterFlags); + ui->trimCB->setCurrentIndex(ui->trimCB->findData(ed->carryTrim)); int expolength = firmware->getCapability(HasExpoNames); if (!expolength) { @@ -159,9 +165,8 @@ void ExpoDialog::updateScale() { if (firmware->getCapability(VirtualInputs) && ed->srcRaw.type == SOURCE_TYPE_TELEMETRY) { RawSourceRange range = ed->srcRaw.getRange(&model, generalSettings); - ui->lblScale->show(); - ui->dsbScale->show(); - ui->lblScaleUnit->show(); + ui->dsbScale->setEnabled(true); + ui->lblScaleUnit->setEnabled(true); ui->dsbScale->setDecimals(range.decimals); ui->dsbScale->setMinimum(range.min); ui->dsbScale->setMaximum(range.max); @@ -170,9 +175,8 @@ void ExpoDialog::updateScale() ui->lblScaleUnit->setText(range.unit); } else { - ui->lblScale->hide(); - ui->dsbScale->hide(); - ui->lblScaleUnit->hide(); + ui->dsbScale->setEnabled(false); + ui->lblScaleUnit->setEnabled(false); } } @@ -183,13 +187,20 @@ void ExpoDialog::valuesChanged() RawSource srcRaw = RawSource(ui->sourceCB->itemData(ui->sourceCB->currentIndex()).toInt()); if (ed->srcRaw != srcRaw) { ed->srcRaw = srcRaw; + if (ed->srcRaw.isStick()) + carryTrimFilterFlags = CarryTrimSticksGroup; + else + carryTrimFilterFlags = CarryTrimNotSticksGroup; + ed->carryTrim = CARRYTRIM_DEFAULT; + dialogFilteredItemModels->getItemModel(AIM_EXPO_CARRYTRIM)->setFilterFlags(carryTrimFilterFlags); + ui->trimCB->setCurrentIndex(ui->trimCB->findData(-ed->carryTrim)); ed->scale= 0; updateScale(); } RawSourceRange range = srcRaw.getRange(&model, generalSettings); ed->scale = round(float(ui->dsbScale->value()) / range.step); - ed->carryTrim = 1 - ui->trimCB->currentIndex(); + ed->carryTrim = ui->trimCB->itemData(ui->trimCB->currentIndex()).toInt(); ed->swtch = RawSwitch(ui->switchesCB->itemData(ui->switchesCB->currentIndex()).toInt()); ed->mode = ui->sideCB->currentIndex() + 1; diff --git a/companion/src/modeledit/expodialog.h b/companion/src/modeledit/expodialog.h index f4980d344..4a24f0150 100644 --- a/companion/src/modeledit/expodialog.h +++ b/companion/src/modeledit/expodialog.h @@ -68,6 +68,7 @@ class ExpoDialog : public QDialog { QCheckBox * cb_fp[CPN_MAX_FLIGHT_MODES]; FilteredItemModelFactory *dialogFilteredItemModels; CurveRefFilteredFactory *curveRefFilteredItemModels; + int carryTrimFilterFlags = 0; }; #endif // _EXPODIALOG_H_ diff --git a/companion/src/modeledit/expodialog.ui b/companion/src/modeledit/expodialog.ui index acd003e68..99e45fb1a 100644 --- a/companion/src/modeledit/expodialog.ui +++ b/companion/src/modeledit/expodialog.ui @@ -202,18 +202,7 @@ - - - - No - - - - - Yes - - - + diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index f5a8b987d..e594408b0 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -394,10 +394,10 @@ QString ModelPrinter::printInputLine(const ExpoData & input) if (firmware->getCapability(VirtualInputs)) { - if (input.carryTrim > 0) - str += " " + tr("NoTrim"); - else if (input.carryTrim < 0) - str += " " + RawSource(SOURCE_TYPE_TRIM, (-(input.carryTrim) - 1)).toString(&model, &generalSettings).toHtmlEscaped(); + if ((input.srcRaw.isStick() && input.carryTrim == CARRYTRIM_STICK_OFF) || (!input.srcRaw.isStick() && input.carryTrim == CARRYTRIM_DEFAULT)) + str += " " + tr("No Trim"); + else if (input.carryTrim != CARRYTRIM_DEFAULT) + str += " " + input.carryTrimToString().toHtmlEscaped(); } if (input.offset)