diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index 20cc21672..d65afaefc 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -598,7 +598,7 @@ QString RawSource::toString(const ModelData * model, const GeneralSettings * con { const char * name = NULL; if (getCurrentFirmware()->getCapability(GvarsName) && model) - name = model->gvars_names[index]; + name = model->gvarData[index].name; return getElementName(QCoreApplication::translate("Global Variable", "GV"), index + 1, name); } @@ -1564,6 +1564,9 @@ void ModelData::clear() for (int i=0; i1024 && iGVAR_MAX_VALUE && i= phaseIdx) nextPhase += 1; phaseIdx = nextPhase; idx = flightModeData[phaseIdx].gvars[gvarIdx]; @@ -1785,6 +1788,11 @@ bool ModelData::isAvailable(const RawSwitch & swtch) const } } +float ModelData::getGVarFieldValuePrec(int phaseIdx, int gvarIdx) +{ + return getGVarFieldValue(phaseIdx, gvarIdx) * gvarData[gvarIdx].multiplierGet(); +} + QList eepromInterfaces; void unregisterEEpromInterfaces() @@ -1919,3 +1927,67 @@ void FlightModeData::clear(const int phase) } } } + +QString GVarData::unitToString() const +{ + switch (unit) { + case GVAR_UNIT_NUMBER: + return QObject::tr(""); + case GVAR_UNIT_PERCENT: + return QObject::tr("%"); + default: + return QObject::tr("?"); // highlight unknown value + } +} + +QString GVarData::precToString() const +{ + switch (prec) { + case GVAR_PREC_MUL10: + return QObject::tr("0._"); + case GVAR_PREC_MUL1: + return QObject::tr("0.0"); + default: + return QObject::tr("?.?"); // highlight unknown value + } +} + +int GVarData::multiplierSet() +{ + return (prec == 0 ? 1 : 10); +} + +float GVarData::multiplierGet() const +{ + return (prec == 0 ? 1 : 0.1); +} + +void GVarData::setMin(float val) +{ + min = (val * multiplierSet()) - GVAR_MIN_VALUE; +} + +void GVarData::setMax(float val) +{ + max = GVAR_MAX_VALUE - (val * multiplierSet()); +} + +int GVarData::getMin() const +{ + return GVAR_MIN_VALUE + min; +} + +int GVarData::getMax() const +{ + return GVAR_MAX_VALUE - max; +} + +float GVarData::getMinPrec() const +{ + return getMin() * multiplierGet(); +} + +float GVarData::getMaxPrec() const +{ + return getMax() * multiplierGet(); +} diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 4b9837109..d5cca3eb3 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -3226,18 +3226,18 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig if (board != BOARD_STOCK && (board != BOARD_M128 || version < 215)) { for (int i=0; i= 218) { - internalField.Append(new ZCharField<3>(this, modelData.gvars_names[i], "GVar name")); - internalField.Append(new SpareBitsField<12>(this)); // TODO min - internalField.Append(new SpareBitsField<12>(this)); // TODO max - internalField.Append(new BoolField<1>(this, modelData.gvars_popups[i])); - internalField.Append(new SpareBitsField<1>(this)); - internalField.Append(new SpareBitsField<2>(this)); + internalField.Append(new ZCharField<3>(this, modelData.gvarData[i].name, "GVar name")); + internalField.Append(new SignedField<12>(this, modelData.gvarData[i].min)); + internalField.Append(new SignedField<12>(this, modelData.gvarData[i].max)); + internalField.Append(new BoolField<1>(this, modelData.gvarData[i].popup)); + internalField.Append(new UnsignedField<1>(this, modelData.gvarData[i].prec)); + internalField.Append(new UnsignedField<2>(this, modelData.gvarData[i].unit)); internalField.Append(new SpareBitsField<4>(this)); } else { - internalField.Append(new ZCharField<6>(this, modelData.gvars_names[i], "GVar name")); + internalField.Append(new ZCharField<6>(this, modelData.gvarData[i].name, "GVar name")); if (version >= 216) { - internalField.Append(new BoolField<1>(this, modelData.gvars_popups[i])); + internalField.Append(new BoolField<1>(this, modelData.gvarData[i].popup)); internalField.Append(new SpareBitsField<7>(this)); } } diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp index f9e479c84..36cc93345 100644 --- a/companion/src/modeledit/flightmodes.cpp +++ b/companion/src/modeledit/flightmodes.cpp @@ -22,6 +22,7 @@ #include "ui_flightmode.h" #include "switchitemmodel.h" #include "helpers.h" +#include "customdebug.h" FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseIdx, GeneralSettings & generalSettings, Firmware * firmware): ModelPanel(parent, model, generalSettings, firmware), @@ -156,26 +157,53 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI // GVars if (gvCount > 0 && (firmware->getCapability(GvarsFlightModes) || phaseIdx == 0) ) { QGridLayout *gvLayout = new QGridLayout(ui->gvGB); - + // Column headers int headerCol = 1; QLabel *nameLabel = new QLabel(ui->gvGB); nameLabel->setText(tr("Name")); gvLayout->addWidget(nameLabel, 0, headerCol++, 1, 1); + if (phaseIdx > 0) { QLabel *sourceLabel = new QLabel(ui->gvGB); sourceLabel->setText(tr("Value source")); gvLayout->addWidget(sourceLabel, 0, headerCol++, 1, 1); } - QLabel *valueLabel = new QLabel(ui->gvGB); - valueLabel->setText(tr("Value")); - gvLayout->addWidget(valueLabel, 0, headerCol++, 1, 1); - + + if (IS_HORUS_OR_TARANIS(board) && phaseIdx == 0) { + QLabel *valueLabel = new QLabel(ui->gvGB); + valueLabel->setText(tr("Value")); + gvLayout->addWidget(valueLabel, 0, headerCol++, 1, 1); + + QLabel *unitLabel = new QLabel(ui->gvGB); + unitLabel->setText(tr("Unit")); + gvLayout->addWidget(unitLabel, 0, headerCol++, 1, 1); + + QLabel *precLabel = new QLabel(ui->gvGB); + precLabel->setText(tr("Prec")); + gvLayout->addWidget(precLabel, 0, headerCol++, 1, 1); + + QLabel *minLabel = new QLabel(ui->gvGB); + minLabel->setText(tr("Min")); + gvLayout->addWidget(minLabel, 0, headerCol++, 1, 1); + + QLabel *maxLabel = new QLabel(ui->gvGB); + maxLabel->setText(tr("Max")); + gvLayout->addWidget(maxLabel, 0, headerCol++, 1, 1); + + QLabel *popupLabel = new QLabel(ui->gvGB); + popupLabel->setText(tr("Popup enabled")); + gvLayout->addWidget(popupLabel, 0, headerCol++, 1, 1); + } + for (int i=0; igvGB); label->setText(tr("GVAR%1").arg(i+1)); + label->setProperty("index", i); + label->setContextMenuPolicy(Qt::CustomContextMenu); + connect(label, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(gvLabel_customContextMenuRequested(const QPoint &))); gvLayout->addWidget(label, i+1, col++, 1, 1); // GVar name int nameLen = firmware->getCapability(GvarsName); @@ -191,25 +219,49 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI gvUse[i] = new QComboBox(ui->gvGB); gvUse[i]->setProperty("index", i); Helpers::populateGvarUseCB(gvUse[i], phaseIdx); - if (phase.gvars[i] > 1024) { - gvUse[i]->setCurrentIndex(phase.gvars[i] - 1024); + if (phase.gvars[i] > GVAR_MAX_VALUE) { + gvUse[i]->setCurrentIndex(phase.gvars[i] - GVAR_MAX_VALUE); } connect(gvUse[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseGVUse_currentIndexChanged(int))); gvLayout->addWidget(gvUse[i], i+1, col++, 1, 1); } // GVar value - gvValues[i] = new QSpinBox(ui->gvGB); + gvValues[i] = new QDoubleSpinBox(ui->gvGB); gvValues[i]->setProperty("index", i); connect(gvValues[i], SIGNAL(editingFinished()), this, SLOT(phaseGVValue_editingFinished())); - gvValues[i]->setMinimum(-1024); - gvValues[i]->setMaximum(1024); gvLayout->addWidget(gvValues[i], i+1, col++, 1, 1); - // Popups - if (IS_TARANIS(board) && phaseIdx == 0) { + if (IS_HORUS_OR_TARANIS(board) && phaseIdx == 0) { + // GVar unit + gvUnit[i] = new QComboBox(ui->gvGB); + gvUnit[i]->setProperty("index", i); + populateGvarUnitCB(gvUnit[i]); + connect(gvUnit[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseGVUnit_currentIndexChanged(int))); + gvLayout->addWidget(gvUnit[i], i+1, col++, 1, 1); + + // GVar precision + gvPrec[i] = new QComboBox(ui->gvGB); + gvPrec[i]->setProperty("index", i); + populateGvarPrecCB(gvPrec[i]); + connect(gvPrec[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseGVPrec_currentIndexChanged(int))); + gvLayout->addWidget(gvPrec[i], i+1, col++, 1, 1); + + // GVar min + gvMin[i] = new QDoubleSpinBox(ui->gvGB); + gvMin[i]->setProperty("index", i); + connect(gvMin[i], SIGNAL(editingFinished()), this, SLOT(phaseGVMin_editingFinished())); + gvLayout->addWidget(gvMin[i], i+1, col++, 1, 1); + + // GVar max + gvMax[i] = new QDoubleSpinBox(ui->gvGB); + gvMax[i]->setProperty("index", i); + connect(gvMax[i], SIGNAL(editingFinished()), this, SLOT(phaseGVMax_editingFinished())); + gvLayout->addWidget(gvMax[i], i+1, col++, 1, 1); + + // Popups gvPopups[i] = new QCheckBox(ui->gvGB); gvPopups[i]->setProperty("index", i); - gvPopups[i]->setText(tr("Popup enabled")); + //gvPopups[i]->setText(tr("Popup enabled")); connect(gvPopups[i], SIGNAL(toggled(bool)), this, SLOT(phaseGVPopupToggled(bool))); gvLayout->addWidget(gvPopups[i], i+1, col++, 1, 1); } @@ -254,17 +306,8 @@ void FlightModePanel::update() trimUpdate(i); } - if (ui->gvGB->isVisible()) { - for (int i=0; igetCapability(GvarsName) > 0) { - gvNames[i]->setText(model->gvars_names[i]); - } - gvValues[i]->setDisabled(model->isGVarLinked(phaseIdx, i)); - gvValues[i]->setValue(model->getGVarFieldValue(phaseIdx, i)); - if (IS_TARANIS(getCurrentBoard()) && phaseIdx == 0) { - gvPopups[i]->setChecked(model->gvars_popups[i]); - } - } + for (int i=0; isetValue(phasere->rotaryEncoders[i]); } } +void FlightModePanel::updateGVar(int index) +{ + lock = true; + if (firmware->getCapability(GvarsName) > 0) { + gvNames[index]->setText(model->gvarData[index].name); + } + gvValues[index]->setDisabled(model->isGVarLinked(phaseIdx, index)); + setGVSB(gvValues[index], model->gvarData[index].getMin(), model->gvarData[index].getMax(), model->getGVarFieldValue(phaseIdx, index)); + if (IS_TARANIS(getCurrentBoard()) && phaseIdx == 0) { + gvUnit[index]->setCurrentIndex(model->gvarData[index].unit); + gvPrec[index]->setCurrentIndex(model->gvarData[index].prec); + setGVSB(gvMin[index], GVAR_MIN_VALUE, model->gvarData[index].getMax(), model->gvarData[index].getMin()); + setGVSB(gvMax[index], model->gvarData[index].getMin(), GVAR_MAX_VALUE, model->gvarData[index].getMax()); + gvPopups[index]->setChecked(model->gvarData[index].popup); + } + lock = false; +} + +void FlightModePanel::setGVSB(QDoubleSpinBox * sb, int min, int max, int val) +{ + int idx = sb->property("index").toInt(); + float mul = model->gvarData[idx].multiplierGet(); + sb->setDecimals(model->gvarData[idx].prec); + sb->setSingleStep(mul); + sb->setSuffix(model->gvarData[idx].unitToString()); + sb->setMinimum(min * mul); + sb->setMaximum(max * mul); + sb->setValue(val * mul); +} + +void FlightModePanel::populateGvarUnitCB(QComboBox * cb) +{ + cb->clear(); + cb->addItem(QObject::tr("")); + cb->addItem(QObject::tr("%")); +} + +void FlightModePanel::populateGvarPrecCB(QComboBox * cb) +{ + cb->clear(); + cb->addItem(QObject::tr("0._")); + cb->addItem(QObject::tr("0.0")); +} void FlightModePanel::phaseName_editingFinished() { @@ -348,9 +434,9 @@ void FlightModePanel::trimUpdate(unsigned int trim) void FlightModePanel::phaseGVValue_editingFinished() { if (!lock) { - QSpinBox *spinBox = qobject_cast(sender()); + QDoubleSpinBox *spinBox = qobject_cast(sender()); int gvar = spinBox->property("index").toInt(); - phase.gvars[gvar] = spinBox->value(); + phase.gvars[gvar] = spinBox->value() * model->gvarData[gvar].multiplierSet(); emit modified(); } } @@ -360,8 +446,8 @@ void FlightModePanel::GVName_editingFinished() if (!lock) { QLineEdit *lineedit = qobject_cast(sender()); int gvar = lineedit->property("index").toInt(); - memset(&model->gvars_names[gvar], 0, sizeof(model->gvars_names[gvar])); - strcpy(model->gvars_names[gvar], lineedit->text().toLatin1()); + memset(&model->gvarData[gvar].name, 0, sizeof(model->gvarData[gvar].name)); + strcpy(model->gvarData[gvar].name, lineedit->text().toLatin1()); emit modified(); } } @@ -376,28 +462,98 @@ void FlightModePanel::phaseGVUse_currentIndexChanged(int index) phase.gvars[gvar] = 0; } else { - phase.gvars[gvar] = 1024 + index; + phase.gvars[gvar] = GVAR_MAX_VALUE + index; } - update(); + updateGVar(gvar); emit modified(); lock = false; } } +void FlightModePanel::phaseGVUnit_currentIndexChanged(int index) +{ + if (!lock) { + QComboBox *comboBox = qobject_cast(sender()); + int gvar = comboBox->property("index").toInt(); + model->gvarData[gvar].unit = index; + emit modified(); + updateGVar(gvar); + } +} + +void FlightModePanel::phaseGVPrec_currentIndexChanged(int index) +{ + if (!lock) { + QComboBox *comboBox = qobject_cast(sender()); + int gvar = comboBox->property("index").toInt(); + model->gvarData[gvar].prec = index; + emit modified(); + updateGVar(gvar); + } +} + +void FlightModePanel::phaseGVMin_editingFinished() +{ + if (!lock) { + QDoubleSpinBox *spinBox = qobject_cast(sender()); + int gvar = spinBox->property("index").toInt(); + model->gvarData[gvar].setMin(spinBox->value()); + if (!model->isGVarLinked(phaseIdx, gvar)) { + if (model->getGVarFieldValuePrec(phaseIdx, gvar) < spinBox->value()) { + phase.gvars[gvar] = model->gvarData[gvar].getMin(); + } + } + for (int x=1; xgetCapability(FlightModes); x++) { + if (!model->isGVarLinked(x, gvar)) { + if (model->flightModeData[x].gvars[gvar] < model->gvarData[gvar].getMin()) { + model->flightModeData[x].gvars[gvar] = model->gvarData[gvar].getMin(); + } + } + } + emit modified(); + updateGVar(gvar); + } +} + +void FlightModePanel::phaseGVMax_editingFinished() +{ + if (!lock) { + QDoubleSpinBox *spinBox = qobject_cast(sender()); + int gvar = spinBox->property("index").toInt(); + model->gvarData[gvar].setMax(spinBox->value()); + if (!model->isGVarLinked(phaseIdx, gvar)) { + if (model->getGVarFieldValuePrec(phaseIdx, gvar) > spinBox->value()) { + phase.gvars[gvar] = model->gvarData[gvar].getMax(); + } + } + for (int x=1; xgetCapability(FlightModes); x++) { + if (!model->isGVarLinked(x, gvar)) { + if (model->flightModeData[x].gvars[gvar] > model->gvarData[gvar].getMax()) { + model->flightModeData[x].gvars[gvar] = model->gvarData[gvar].getMax(); + } + } + } + emit modified(); + updateGVar(gvar); + } +} + void FlightModePanel::phaseGVPopupToggled(bool checked) { - QCheckBox *cb = qobject_cast(sender()); - int gvar = cb->property("index").toInt(); - model->gvars_popups[gvar] = checked; - emit modified(); + if (!lock) { + QCheckBox *cb = qobject_cast(sender()); + int gvar = cb->property("index").toInt(); + model->gvarData[gvar].popup = checked; + emit modified(); + } } void FlightModePanel::phaseREValue_editingFinished() { if (!lock) { QSpinBox *spinBox = qobject_cast(sender()); - int gvar = spinBox->property("index").toInt(); - phase.rotaryEncoders[gvar] = spinBox->value(); + int re = spinBox->property("index").toInt(); + phase.rotaryEncoders[re] = spinBox->value(); emit modified(); } } @@ -481,11 +637,11 @@ void FlightModePanel::phaseTrimSlider_valueChanged() void FlightModePanel::name_customContextMenuRequested(const QPoint & pos) { - QLabel *label = (QLabel *)sender(); - QPoint globalPos = label->mapToGlobal(pos); - QMenu contextMenu; - contextMenu.addAction(CompanionIcon("clear.png"), tr("&Clear"),this,SLOT(fmClear()),tr("Clear")); - contextMenu.exec(globalPos); + QLabel *label = (QLabel *)sender(); + QPoint globalPos = label->mapToGlobal(pos); + QMenu contextMenu; + contextMenu.addAction(CompanionIcon("clear.png"), tr("&Clear"),this,SLOT(fmClear()),tr("Clear")); + contextMenu.exec(globalPos); } void FlightModePanel::fmClear() @@ -496,8 +652,7 @@ void FlightModePanel::fmClear() if (phaseIdx == 0) { if (IS_HORUS_OR_TARANIS(getCurrentBoard())) { for (int i=0; i < gvCount; ++i) { - memset(&model->gvars_names[i], 0, sizeof(model->gvars_names[i])); - model->gvars_popups[i] = 0; + model->gvarData[i].clear(); } } } @@ -508,11 +663,11 @@ void FlightModePanel::fmClear() pswtch->setCurrentIndex(pswtch->findText(item.toString())); if (gvCount > 0 && (firmware->getCapability(GvarsFlightModes))) { for (int i=0; isetCurrentIndex((phase.gvars[i] > 1024 ? (phase.gvars[i] - 1024) : 0)); + gvUse[i]->setCurrentIndex((phase.gvars[i] > GVAR_MAX_VALUE ? (phase.gvars[i] - GVAR_MAX_VALUE) : 0)); } } for (int i=0; isetCurrentIndex((phase.rotaryEncoders[i] > 1024 ? (phase.rotaryEncoders[i] - 1024) : 0)); + reUse[i]->setCurrentIndex((phase.rotaryEncoders[i] > GVAR_MAX_VALUE ? (phase.rotaryEncoders[i] - GVAR_MAX_VALUE) : 0)); } lock = false; } @@ -522,6 +677,36 @@ void FlightModePanel::fmClear() } } +void FlightModePanel::gvLabel_customContextMenuRequested(const QPoint & pos) +{ + QLabel *label = (QLabel *)sender(); + gvIdx = label->property("index").toInt(); + QPoint globalPos = label->mapToGlobal(pos); + QMenu contextMenu; + contextMenu.addAction(CompanionIcon("clear.png"), tr("&Clear"),this,SLOT(gvClear()),tr("Clear")); + contextMenu.exec(globalPos); +} + +void FlightModePanel::gvClear() +{ + if (phaseIdx == 0) { + if (IS_HORUS_OR_TARANIS(getCurrentBoard())) { + model->gvarData[gvIdx].clear(); + phase.gvars[gvIdx] = 0; + } + } + else { + lock = true; + if (gvCount > 0 && (firmware->getCapability(GvarsFlightModes))) { + phase.gvars[gvIdx] = GVAR_MAX_VALUE + 1; + gvUse[gvIdx]->setCurrentIndex(1); + } + lock = false; + } + update(); + emit modified(); +} + /**********************************************************/ FlightModesPanel::FlightModesPanel(QWidget * parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): diff --git a/companion/src/modeledit/flightmodes.h b/companion/src/modeledit/flightmodes.h index 3507c0f5c..0afb1bb10 100644 --- a/companion/src/modeledit/flightmodes.h +++ b/companion/src/modeledit/flightmodes.h @@ -55,10 +55,16 @@ class FlightModePanel : public ModelPanel void phaseGVValue_editingFinished(); void phaseGVUse_currentIndexChanged(int index); void phaseGVPopupToggled(bool checked); + void phaseGVUnit_currentIndexChanged(int index); + void phaseGVPrec_currentIndexChanged(int index); + void phaseGVMin_editingFinished(); + void phaseGVMax_editingFinished(); void phaseREValue_editingFinished(); void phaseREUse_currentIndexChanged(int index); void name_customContextMenuRequested(const QPoint & pos); void fmClear(); + void gvLabel_customContextMenuRequested(const QPoint & pos); + void gvClear(); private: Ui::FlightMode *ui; @@ -66,11 +72,16 @@ class FlightModePanel : public ModelPanel FlightModeData & phase; int reCount; int gvCount; + int gvIdx; QVector trimsLabel; QLineEdit * gvNames[CPN_MAX_GVARS]; - QSpinBox * gvValues[CPN_MAX_GVARS]; + QDoubleSpinBox * gvValues[CPN_MAX_GVARS]; QCheckBox * gvPopups[CPN_MAX_GVARS]; QComboBox * gvUse[CPN_MAX_GVARS]; + QComboBox * gvUnit[CPN_MAX_GVARS]; + QComboBox * gvPrec[CPN_MAX_GVARS]; + QDoubleSpinBox * gvMin[CPN_MAX_GVARS]; + QDoubleSpinBox * gvMax[CPN_MAX_GVARS]; QSpinBox * reValues[CPN_MAX_ENCODERS]; QComboBox * reUse[CPN_MAX_ENCODERS]; QVector trimsUse; @@ -79,7 +90,10 @@ class FlightModePanel : public ModelPanel RawSwitchFilterItemModel * rawSwitchItemModel; void trimUpdate(unsigned int trim); - + void updateGVar(int index); + void setGVSB(QDoubleSpinBox * spinBox, int min, int max, int val); + void populateGvarUnitCB(QComboBox * cb); + void populateGvarPrecCB(QComboBox * cb); }; class FlightModesPanel : public ModelPanel diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 9d820dccd..d1b2be58d 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -305,7 +305,8 @@ QString ModelPrinter::printGlobalVar(int flightModeIndex, int gvarIndex) const FlightModeData & fm = model.flightModeData[flightModeIndex]; if (fm.gvars[gvarIndex] <= 1024) { - return QString("%1").arg(fm.gvars[gvarIndex]); + //double val = fm.gvars[gvarIndex] * model.gvarData[gvarIndex].multiplierGet(); + return QString("%1").arg(fm.gvars[gvarIndex] * model.gvarData[gvarIndex].multiplierGet()); } else { int num = fm.gvars[gvarIndex] - 1025; @@ -685,3 +686,29 @@ QString ModelPrinter::createCurveImage(int idx, QTextDocument * document) // qDebug() << "ModelPrinter::createCurveImage()" << idx << filename; return filename; } + +QString ModelPrinter::printGlobalVarUnit(int idx) +{ + return model.gvarData[idx].unitToString().toHtmlEscaped(); +} + +QString ModelPrinter::printGlobalVarPrec(int idx) +{ + return model.gvarData[idx].precToString().toHtmlEscaped(); +} + +QString ModelPrinter::printGlobalVarMin(int idx) +{ + return QString::number(model.gvarData[idx].getMinPrec()); +} + +QString ModelPrinter::printGlobalVarMax(int idx) +{ + return QString::number(model.gvarData[idx].getMaxPrec()); +} + +QString ModelPrinter::printGlobalVarPopup(int idx) +{ + return (model.gvarData[idx].popup ? "Y" : "N" ); +} + diff --git a/companion/src/modelprinter.h b/companion/src/modelprinter.h index 2da443de7..d3d604081 100644 --- a/companion/src/modelprinter.h +++ b/companion/src/modelprinter.h @@ -82,6 +82,11 @@ class ModelPrinter: public QObject QString printCurveName(int idx); QString printCurve(int idx); QString createCurveImage(int idx, QTextDocument * document); + QString printGlobalVarUnit(int idx); + QString printGlobalVarPrec(int idx); + QString printGlobalVarMin(int idx); + QString printGlobalVarMax(int idx); + QString printGlobalVarPopup(int idx); private: Firmware * firmware; diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp index 864970418..dd60a33b7 100644 --- a/companion/src/multimodelprinter.cpp +++ b/companion/src/multimodelprinter.cpp @@ -307,18 +307,64 @@ QString MultiModelPrinter::printFlightModes() if ((gvars && firmware->getCapability(GvarsFlightModes)) || firmware->getCapability(RotaryEncoders)) { MultiColumns columns(modelPrinterMap.size()); columns.append(""); - columns.append(""); + columns.append(""); if (firmware->getCapability(GvarsFlightModes)) { for (int i=0; i" + tr("GV%1").arg(i+1) + "
"); - COMPARE(model->gvars_names[i]); - columns.append(""); + columns.append("
"); } } for (int i=0; igetCapability(RotaryEncoders); i++) { columns.append(""); } columns.append(""); + + if (firmware->getCapability(GvarsFlightModes)) { + columns.append(""); + for (int i=0; i"); + COMPARE(model->gvarData[i].name); + columns.append(""); + } + columns.append(""); + columns.append(""); + for (int i=0; i"); + COMPARE(modelPrinter->printGlobalVarUnit(i)); + columns.append(""); + } + columns.append(""); + columns.append(""); + for (int i=0; i"); + COMPARE(modelPrinter->printGlobalVarPrec(i)); + columns.append(""); + } + columns.append(""); + columns.append(""); + for (int i=0; i"); + COMPARE(modelPrinter->printGlobalVarMin(i)); + columns.append(""); + } + columns.append(""); + columns.append(""); + for (int i=0; i"); + COMPARE(modelPrinter->printGlobalVarMax(i)); + columns.append(""); + } + columns.append(""); + columns.append(""); + for (int i=0; i"); + COMPARE(modelPrinter->printGlobalVarPopup(i)); + columns.append(""); + } + columns.append(""); + } + + columns.append(""); + for (int i=0; igetCapability(FlightModes); i++) { columns.append("
" + tr("Flight mode") + "
" + tr("Global variables") + "" + tr("GV%1").arg(i+1) + "" + tr("RE%1").arg(i+1) + "
Name
Unit
Prec
Min
Max
Popup
" + tr("Flight mode") + "
" + tr("FM%1").arg(i) + " "); COMPARE(model->flightModeData[i].name); diff --git a/companion/src/radiodata.h b/companion/src/radiodata.h index c8857f2fe..9682cc92a 100644 --- a/companion/src/radiodata.h +++ b/companion/src/radiodata.h @@ -1024,6 +1024,44 @@ typedef char CustomScreenData[610+1]; typedef char TopbarData[216+1]; #endif +#define GVAR_NAME_LEN 3 +#define GVAR_MAX_VALUE 1024 +#define GVAR_MIN_VALUE -GVAR_MAX_VALUE + +class GVarData { + public: + GVarData() { clear(); } + + enum { + GVAR_UNIT_NUMBER, + GVAR_UNIT_PERCENT + }; + + enum { + GVAR_PREC_MUL10, + GVAR_PREC_MUL1 + }; + + char name[GVAR_NAME_LEN+1]; + int min; + int max; + bool popup; + unsigned int prec; // 0 0._ 1 0.0 + unsigned int unit; // 0 _ 1 % + + void clear() {memset(this, 0, sizeof(GVarData)); } + QString unitToString() const; + QString precToString() const; + int multiplierSet(); + float multiplierGet() const; + void setMin(float val); + void setMax(float val); + int getMin() const; + int getMax() const; + float getMinPrec() const; + float getMaxPrec() const; +}; + class ModelData { public: ModelData(); @@ -1078,9 +1116,7 @@ class ModelData { bool potsWarningEnabled[CPN_MAX_POTS]; int potPosition[CPN_MAX_POTS]; bool displayChecklist; - // TODO structure - char gvars_names[CPN_MAX_GVARS][6+1]; - bool gvars_popups[CPN_MAX_GVARS]; + GVarData gvarData[CPN_MAX_GVARS]; MavlinkData mavlink; unsigned int telemetryProtocol; FrSkyData frsky; @@ -1113,6 +1149,7 @@ class ModelData { bool isGVarLinked(int phaseIdx, int gvarIdx); int getGVarFieldValue(int phaseIdx, int gvarIdx); + float getGVarFieldValuePrec(int phaseIdx, int gvarIdx); ModelData removeGlobalVars();