diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index ca6c86485..1b56e3ef5 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -624,17 +624,57 @@ void ModelData::setDefault(uint8_t id) sprintf(name, "MODEL%02d", id+1); } -unsigned int ModelData::getTrimFlightPhase(uint8_t idx, int8_t phase) +int ModelData::getTrimValue(int phaseIdx, int trimIdx) { - // if (phase == -1) phase = getFlightPhase(); - - for (uint8_t i=0; i 500) + trim = 500; + break; + } + } +} + void ModelData::removeGlobalVar(int & var) { if (var >= 126 && var <= 130) diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index 91da15e51..1e345bc60 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -655,7 +655,8 @@ class FuncSwData { // Function Switches data class PhaseData { public: PhaseData() { clear(); } - int trimRef[NUM_STICKS]; // + int trimMode[NUM_STICKS]; + int trimRef[NUM_STICKS]; int trim[NUM_STICKS]; RawSwitch swtch; char name[10+1]; @@ -663,7 +664,7 @@ class PhaseData { unsigned int fadeOut; int rotaryEncoders[2]; int gvars[C9X_MAX_GVARS]; - void clear() { memset(this, 0, sizeof(PhaseData)); for (int i=0; i(trimExt[i])); } + else if (board == BOARD_TARANIS && version >= 216) { + for (int i=0; i(phase.trim[i])); + internalField.Append(new UnsignedField<5>(trimMode[i])); + } + } else { for (int i=0; i(trimBase[i])); @@ -459,19 +465,27 @@ class PhaseField: public TransformedField { virtual void beforeExport() { for (int i=0; i= 0) { - trim = 501 + phase.trimRef[i] - (phase.trimRef[i] >= index ? 1 : 0); + if (board == BOARD_TARANIS && version >= 216) { + if (phase.trimMode[i] < 0) + trimMode[i] = 0b11111; + else + trimMode[i] = 2*phase.trimRef[i] + phase.trimMode[i]; } else { - trim = std::max(-500, std::min(500, phase.trim[i])); - } - if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) { - trimBase[i] = trim >> 2; - trimExt[i] = (trim & 0x03); - } - else { - trimBase[i] = trim; + int trim; + if (phase.trimMode[i] < 0) + trim = 0; + else if (phase.trimRef[i] != index) + trim = 501 + phase.trimRef[i] - (phase.trimRef[i] > index ? 1 : 0); + else + trim = std::max(-500, std::min(500, phase.trim[i])); + if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) { + trimBase[i] = trim >> 2; + trimExt[i] = (trim & 0x03); + } + else { + trimBase[i] = trim; + } } } } @@ -479,21 +493,31 @@ class PhaseField: public TransformedField { virtual void afterImport() { for (int i=0; i= 215)) - trim = ((trimBase[i]) << 2) + (trimExt[i] & 0x03); - else - trim = trimBase[i]; - if (trim > 500) { - phase.trimRef[i] = trim - 501; - if (phase.trimRef[i] >= index) - phase.trimRef[i] += 1; - phase.trim[i] = 0; + if (board == BOARD_TARANIS && version >= 216) { + if (trimMode[i] == 0b11111) { + phase.trimMode[i] = -1; + } + else { + phase.trimMode[i] = trimMode[i] % 2; + phase.trimRef[i] = trimMode[i] / 2; + } } else { - phase.trim[i] = trim; + int trim; + if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) + trim = ((trimBase[i]) << 2) + (trimExt[i] & 0x03); + else + trim = trimBase[i]; + if (trim > 500) { + phase.trimRef[i] = trim - 501; + if (phase.trimRef[i] >= index) + phase.trimRef[i] += 1; + phase.trim[i] = 0; + } + else { + phase.trim[i] = trim; + } } - } } @@ -506,6 +530,7 @@ class PhaseField: public TransformedField { int rotencCount; int trimBase[NUM_STICKS]; int trimExt[NUM_STICKS]; + unsigned int trimMode[NUM_STICKS]; }; diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index b150b0821..c997a3a03 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -682,19 +682,6 @@ void CurveGroup::valuesChanged() } } -void populateTrimUseCB(QComboBox *b, unsigned int phase) -{ - b->addItem(QObject::tr("Own trim")); - unsigned int num_phases = GetEepromInterface()->getCapability(FlightPhases); - if (num_phases>0) { - for (unsigned int i = 0; i < num_phases; i++) { - if (i != phase) { - b->addItem(QObject::tr("Flight mode %1 trim").arg(i)); - } - } - } -} - void populateGvarUseCB(QComboBox *b, unsigned int phase) { b->addItem(QObject::tr("Own value")); diff --git a/companion/src/helpers.h b/companion/src/helpers.h index d3141083d..b1c2e1726 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -89,7 +89,6 @@ QString FuncParam(uint function, int value, QString paramT="",unsigned int adjus void populateFuncParamCB(QComboBox *b, const ModelData & model, uint function, unsigned int value, unsigned int adjustmode=0); void populateFuncParamArmTCB(QComboBox *b, ModelData * g_model, char * value, QStringList & paramsList); void populatePhasesCB(QComboBox *b, int value); -void populateTrimUseCB(QComboBox *b, unsigned int phase); void populateGvarUseCB(QComboBox *b, unsigned int phase); void populateCustomScreenFieldCB(QComboBox *b, unsigned int value, bool last, int hubproto); void populateTimerSwitchCB(QComboBox *b, int value); diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp index 4a4e5e651..a5cd400a0 100644 --- a/companion/src/modeledit/flightmodes.cpp +++ b/companion/src/modeledit/flightmodes.cpp @@ -17,9 +17,11 @@ FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, Genera { ui->setupUi(this); + int modesCount = GetEepromInterface()->getCapability(FlightPhases); + // Phase name QRegExp rx(CHAR_FOR_NAMES_REGEX); - if (GetEepromInterface()->getCapability(FlightPhases)) { + if (modesCount) { ui->name->setValidator(new QRegExpValidator(rx, this)); ui->name->setMaxLength(GetEepromInterface()->getCapability(FlightModesName)); connect(ui->name, SIGNAL(editingFinished()), this, SLOT(phaseName_editingFinished())); @@ -66,14 +68,19 @@ FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, Genera for (int i=0; i<4; i++) { trimsLabel[i]->setText(labels[CONVERT_MODE(i+1)-1]); - if (phaseIdx > 0) { - trimsUse[i]->setProperty("index", i); - populateTrimUseCB(trimsUse[i], phaseIdx); - connect(trimsUse[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseTrimUse_currentIndexChanged(int))); - } - else { - trimsUse[i]->hide(); + QComboBox * cb = trimsUse[i]; + cb->setProperty("index", i); + cb->addItem(QObject::tr("Trim disabled"), -1); + for (int m=0; maddItem(QObject::tr("Own Trim"), m*2); + } + else if (phaseIdx > 0) { + cb->addItem(QObject::tr("Use Trim from Flight mode %1").arg(m), m*2); + cb->addItem(QObject::tr("Use Trim from Flight mode %1 + Own Trim as an offset").arg(m), m*2+1); + } } + connect(cb, SIGNAL(currentIndexChanged(int)), this, SLOT(phaseTrimUse_currentIndexChanged(int))); trimsValue[i]->setProperty("index", i); connect(trimsValue[i], SIGNAL(valueChanged(int)), this, SLOT(phaseTrim_valueChanged())); @@ -123,17 +130,6 @@ FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, Genera QLabel *label = new QLabel(ui->gvGB); label->setText(tr("GVAR%1").arg(i+1)); gvLayout->addWidget(label, i, col++, 1, 1); -#if 0 - // TODO remove this capability? - // GVar source (er9x/ersky9x) - if (GetEepromInterface()->getCapability(GvarsHaveSources)) { - QComboBox *source = new QComboBox(ui->gvGB); - source->setProperty("index", i); - populateGvSourceCB(source, model.gvsource[i]); - // connect(source, SIGNAL(currentIndexChanged(int)), this, SLOT(phaseGVSource_currentIndexChanged(int))); - gvLayout->addWidget(source, i, col++, 1, 1); - } -#endif // GVar name int nameLen = GetEepromInterface()->getCapability(GvarsName); if (nameLen > 0) { @@ -193,7 +189,6 @@ void FlightMode::update() int chn = CONVERT_MODE(i+1)-1; if (chn == 2/*TODO constant*/ && model.throttleReversed) trimsSlider[i]->setInvertedAppearance(true); - trimUpdate(i); } @@ -262,23 +257,22 @@ void FlightMode::phaseFadeOut_editingFinished() void FlightMode::trimUpdate(unsigned int trim) { - lock = true; - int chn = CONVERT_MODE(trim+1)-1; - int value = phase.trim[chn]; - if (phaseIdx > 0 && phase.trimRef[chn] >= 0) { - trimsUse[trim]->setCurrentIndex(1 + phase.trimRef[chn] - (phase.trimRef[chn] >= phaseIdx ? 1 : 0)); - value = model.phaseData[model.getTrimFlightPhase(chn, phaseIdx)].trim[chn]; - trimsValue[trim]->setEnabled(false); - trimsSlider[trim]->setEnabled(false); - } - else { - if (phaseIdx > 0) trimsUse[trim]->setCurrentIndex(0); - trimsValue[trim]->setEnabled(true); - trimsSlider[trim]->setEnabled(true); - } - trimsSlider[trim]->setValue(value); - trimsValue[trim]->setValue(value); - lock = false; + lock = true; + int chn = CONVERT_MODE(trim+1)-1; + int value = model.getTrimValue(phaseIdx, chn); + trimsSlider[trim]->setValue(value); + trimsValue[trim]->setValue(value); + if (phase.trimMode[chn] < 0) { + trimsUse[trim]->setCurrentIndex(0); + trimsValue[trim]->setEnabled(false); + trimsSlider[trim]->setEnabled(false); + } + else { + trimsUse[trim]->setCurrentIndex(1 + 2*phase.trimRef[chn] + phase.trimMode[chn] - (phase.trimRef[chn] > phaseIdx ? 1 : 0)); + trimsValue[trim]->setEnabled(true); + trimsSlider[trim]->setEnabled(true); + } + lock = false; } void FlightMode::phaseGVValue_editingFinished() @@ -380,15 +374,17 @@ void FlightMode::phaseTrimUse_currentIndexChanged(int index) QComboBox *comboBox = qobject_cast(sender()); int trim = comboBox->property("index").toInt(); int chn = CONVERT_MODE(trim+1)-1; - if (index == 0) { - phase.trim[chn] = model.phaseData[model.getTrimFlightPhase(chn, phaseIdx)].trim[chn]; - phase.trimRef[chn] = -1; + int data = comboBox->itemData(index).toInt(); + if (data < 0) { + phase.trimMode[chn] = -1; + phase.trimRef[chn] = 0; + phase.trim[chn] = 0; } else { + phase.trimMode[chn] = data % 2; + phase.trimRef[chn] = data / 2; phase.trim[chn] = 0; - phase.trimRef[chn] = index - 1 + (index > (int)phaseIdx ? 1 : 0); } - trimUpdate(trim); emit modified(); } @@ -401,7 +397,7 @@ void FlightMode::phaseTrim_valueChanged() int trim = spinBox->property("index").toInt(); int chn = CONVERT_MODE(trim+1)-1; int value = spinBox->value(); - phase.trim[chn] = value; + model.setTrimValue(phaseIdx, chn, value); lock = true; trimsSlider[trim]->setValue(value); lock = false; @@ -416,7 +412,7 @@ void FlightMode::phaseTrimSlider_valueChanged() int trim = slider->property("index").toInt(); int chn = CONVERT_MODE(trim+1)-1; int value = slider->value(); - phase.trim[chn] = value; + model.setTrimValue(phaseIdx, chn, value); lock = true; trimsValue[trim]->setValue(value); lock = false;