From 2fd1f575bae05e284a8a157932f5559fd27dde22 Mon Sep 17 00:00:00 2001 From: bsongis Date: Sun, 25 May 2014 09:43:54 +0200 Subject: [PATCH] Telemetry Volts and Current sources (RxBatt, A3, A4) now available in Companion. QAutoComboBox introduced to simplify code --- companion/src/CMakeLists.txt | 1 + companion/src/eeprominterface.h | 19 +++++++ .../src/firmwares/opentx/opentxeeprom.cpp | 52 +++++++++++++++--- companion/src/modeledit/modelpanel.h | 2 + companion/src/modeledit/telemetry.cpp | 50 +++++++++++------ companion/src/modeledit/telemetry.h | 7 +-- companion/src/modeledit/telemetry.ui | 53 ++++--------------- companion/src/qautocombobox.h | 53 +++++++++++++++++++ 8 files changed, 168 insertions(+), 69 deletions(-) create mode 100755 companion/src/qautocombobox.h diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 9331d3796..b161d05d4 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -187,6 +187,7 @@ set(companion_MOC_HDRS mainwindow.h taranisnotfound.h qcustomplot.h + qautocombobox.h helpers.h wizarddialog.h ) diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index f3df6471a..ad3525c06 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -856,6 +856,25 @@ class FrSkyScreenData { void clear() { memset(this, 0, sizeof(FrSkyScreenData)); } }; +enum TelemetryVoltsSources { + TELEMETRY_VOLTS_SOURCE_RXBATT, + TELEMETRY_VOLTS_SOURCE_A1, + TELEMETRY_VOLTS_SOURCE_A2, + TELEMETRY_VOLTS_SOURCE_A3, + TELEMETRY_VOLTS_SOURCE_A4, + TELEMETRY_VOLTS_SOURCE_FAS, + TELEMETRY_VOLTS_SOURCE_CELLS +}; + +enum TelemetryCurrentSources { + TELEMETRY_CURRENT_SOURCE_NONE, + TELEMETRY_CURRENT_SOURCE_A1, + TELEMETRY_CURRENT_SOURCE_A2, + TELEMETRY_CURRENT_SOURCE_A3, + TELEMETRY_CURRENT_SOURCE_A4, + TELEMETRY_CURRENT_SOURCE_FAS +}; + class FrSkyData { public: FrSkyData() { clear(); } diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index bff2c6919..641bdeab4 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -2177,6 +2177,42 @@ class RSSIConversionTable: public ConversionTable } }; +class TelemetryVoltsSourceConversionTable: public ConversionTable +{ + public: + TelemetryVoltsSourceConversionTable(BoardEnum board, unsigned int version) + { + int val = 0; + if (IS_ARM(board) && version >= 216) + addConversion(TELEMETRY_VOLTS_SOURCE_RXBATT, val++); + addConversion(TELEMETRY_VOLTS_SOURCE_A1, val++); + addConversion(TELEMETRY_VOLTS_SOURCE_A2, val++); + if (IS_ARM(board) && version >= 216) { + addConversion(TELEMETRY_VOLTS_SOURCE_A3, val++); + addConversion(TELEMETRY_VOLTS_SOURCE_A4, val++); + } + addConversion(TELEMETRY_VOLTS_SOURCE_FAS, val++); + addConversion(TELEMETRY_VOLTS_SOURCE_CELLS, val++); + } +}; + +class TelemetryCurrentSourceConversionTable: public ConversionTable +{ + public: + TelemetryCurrentSourceConversionTable(BoardEnum board, unsigned int version) + { + int val = 0; + addConversion(TELEMETRY_CURRENT_SOURCE_NONE, val++); + addConversion(TELEMETRY_CURRENT_SOURCE_A1, val++); + addConversion(TELEMETRY_CURRENT_SOURCE_A2, val++); + if (IS_ARM(board) && version >= 216) { + addConversion(TELEMETRY_CURRENT_SOURCE_A3, val++); + addConversion(TELEMETRY_CURRENT_SOURCE_A4, val++); + } + addConversion(TELEMETRY_CURRENT_SOURCE_FAS, val++); + } +}; + class VarioConversionTable: public ConversionTable { public: @@ -2191,7 +2227,9 @@ class VarioConversionTable: public ConversionTable class FrskyField: public StructField { public: FrskyField(FrSkyData & frsky, BoardEnum board, unsigned int version): - StructField("FrSky") + StructField("FrSky"), + telemetryVoltsSourceConversionTable(board, version), + telemetryCurrentSourceConversionTable(board, version) { rssiConversionTable[0] = RSSIConversionTable(0); rssiConversionTable[1] = RSSIConversionTable(1); @@ -2212,14 +2250,14 @@ class FrskyField: public StructField { } Append(new UnsignedField<8>(frsky.usrProto)); if (version >= 216) { - Append(new UnsignedField<7>(frsky.voltsSource)); + Append(new ConversionField< UnsignedField<7> >(frsky.voltsSource, &telemetryVoltsSourceConversionTable, "Volts Source")); Append(new BoolField<1>(frsky.altitudeDisplayed)); } else { - Append(new UnsignedField<8>(frsky.voltsSource)); + Append(new ConversionField< UnsignedField<8> >(frsky.voltsSource, &telemetryVoltsSourceConversionTable, "Volts Source")); } Append(new ConversionField< SignedField<8> >(frsky.blades, -2)); - Append(new UnsignedField<8>(frsky.currentSource)); + Append(new ConversionField< UnsignedField<8> >(frsky.currentSource, &telemetryCurrentSourceConversionTable, "Current Source")); Append(new UnsignedField<1>(frsky.screens[0].type)); Append(new UnsignedField<1>(frsky.screens[1].type)); @@ -2264,7 +2302,7 @@ class FrskyField: public StructField { Append(new ConversionField< UnsignedField<2> >((unsigned int &)frsky.blades, -2)); Append(new UnsignedField<1>(frsky.screens[0].type)); Append(new UnsignedField<1>(frsky.screens[1].type)); - Append(new UnsignedField<2>(frsky.voltsSource, "Volts Source")); + Append(new ConversionField< UnsignedField<2> >(frsky.voltsSource, &telemetryVoltsSourceConversionTable, "Volts Source")); Append(new SignedField<4>(frsky.varioMin, "Vario Min")); Append(new SignedField<4>(frsky.varioMax)); for (int i=0; i<2; i++) { @@ -2276,7 +2314,7 @@ class FrskyField: public StructField { } Append(new UnsignedField<3>(frsky.varioSource)); Append(new SignedField<5>(frsky.varioCenterMin)); - Append(new UnsignedField<3>(frsky.currentSource)); + Append(new ConversionField< UnsignedField<3> >(frsky.currentSource, &telemetryCurrentSourceConversionTable, "Current Source")); Append(new SignedField<8>(frsky.varioCenterMax)); if (version >= 216) { // TODO int8_t fasOffset; @@ -2288,6 +2326,8 @@ class FrskyField: public StructField { protected: RSSIConversionTable rssiConversionTable[2]; VarioConversionTable varioConversionTable; + TelemetryVoltsSourceConversionTable telemetryVoltsSourceConversionTable; + TelemetryCurrentSourceConversionTable telemetryCurrentSourceConversionTable; }; class MavlinkField: public StructField { diff --git a/companion/src/modeledit/modelpanel.h b/companion/src/modeledit/modelpanel.h index d016a326a..7ff5a3526 100644 --- a/companion/src/modeledit/modelpanel.h +++ b/companion/src/modeledit/modelpanel.h @@ -9,6 +9,8 @@ class ModelPanel : public QWidget { Q_OBJECT + friend class QUnsignedAutoComboBox; + public: ModelPanel(QWidget *parent, ModelData & model, GeneralSettings & generalSettings, FirmwareInterface * firmware); virtual ~ModelPanel(); diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index 099853bdb..9b32d0dcd 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -655,10 +655,42 @@ void TelemetryPanel::setup() ui->frskyProtoCB->setCurrentIndex(model.frsky.usrProto); ui->frskyUnitsCB->setCurrentIndex(model.frsky.imperial); ui->bladesCount->setValue(model.frsky.blades); - ui->frskyCurrentCB->setCurrentIndex(model.frsky.currentSource); - ui->frskyVoltCB->setCurrentIndex(model.frsky.voltsSource); - lock=false; + populateVoltsSource(); + populateCurrentSource(); + + lock = false; +} + +void TelemetryPanel::populateVoltsSource() +{ + QUnsignedAutoComboBox * cb = ui->frskyVoltCB; + cb->setField(&model.frsky.voltsSource, this); + if (IS_ARM(firmware->getBoard())) { + cb->addItem(tr("RxBatt"), TELEMETRY_VOLTS_SOURCE_RXBATT); + } + cb->addItem(tr("A1"), TELEMETRY_VOLTS_SOURCE_A1); + cb->addItem(tr("A2"), TELEMETRY_VOLTS_SOURCE_A2); + if (IS_ARM(firmware->getBoard())) { + cb->addItem(tr("A3"), TELEMETRY_VOLTS_SOURCE_A3); + cb->addItem(tr("A4"), TELEMETRY_VOLTS_SOURCE_A4); + } + cb->addItem(tr("FAS"), TELEMETRY_VOLTS_SOURCE_FAS); + cb->addItem(tr("Cells"), TELEMETRY_VOLTS_SOURCE_CELLS); +} + +void TelemetryPanel::populateCurrentSource() +{ + QUnsignedAutoComboBox * cb = ui->frskyCurrentCB; + cb->setField(&model.frsky.currentSource, this); + cb->addItem(tr("---"), TELEMETRY_CURRENT_SOURCE_NONE); + cb->addItem(tr("A1"), TELEMETRY_CURRENT_SOURCE_A1); + cb->addItem(tr("A2"), TELEMETRY_CURRENT_SOURCE_A2); + if (IS_ARM(firmware->getBoard())) { + cb->addItem(tr("A3"), TELEMETRY_CURRENT_SOURCE_A3); + cb->addItem(tr("A4"), TELEMETRY_CURRENT_SOURCE_A4); + } + cb->addItem(tr("FAS"), TELEMETRY_CURRENT_SOURCE_FAS); } void TelemetryPanel::onAnalogModified() @@ -678,18 +710,6 @@ void TelemetryPanel::on_bladesCount_editingFinished() emit modified(); } -void TelemetryPanel::on_frskyCurrentCB_currentIndexChanged(int index) -{ - model.frsky.currentSource=index; - emit modified(); -} - -void TelemetryPanel::on_frskyVoltCB_currentIndexChanged(int index) -{ - model.frsky.voltsSource=index; - emit modified(); -} - void TelemetryPanel::on_frskyProtoCB_currentIndexChanged(int index) { model.frsky.usrProto = index; diff --git a/companion/src/modeledit/telemetry.h b/companion/src/modeledit/telemetry.h index a0d6419c2..8c381bf99 100644 --- a/companion/src/modeledit/telemetry.h +++ b/companion/src/modeledit/telemetry.h @@ -82,16 +82,11 @@ class TelemetryPanel : public ModelPanel TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettings & generalSettings, FirmwareInterface * firmware); virtual ~TelemetryPanel(); - signals: - void modified(); - private slots: void onAnalogModified(); void on_frskyProtoCB_currentIndexChanged(int index); void on_frskyUnitsCB_currentIndexChanged(int index); void on_bladesCount_editingFinished(); - void on_frskyCurrentCB_currentIndexChanged(int index); - void on_frskyVoltCB_currentIndexChanged(int index); void on_AltitudeToolbar_ChkB_toggled(bool checked); void on_rssiAlarm1CB_currentIndexChanged(int index); void on_rssiAlarm2CB_currentIndexChanged(int index); @@ -114,6 +109,8 @@ class TelemetryPanel : public ModelPanel void setup(); void telBarUpdate(); + void populateVoltsSource(); + void populateCurrentSource(); }; #endif // TELEMETRY_H diff --git a/companion/src/modeledit/telemetry.ui b/companion/src/modeledit/telemetry.ui index 7b68fa532..a4a4b8a97 100644 --- a/companion/src/modeledit/telemetry.ui +++ b/companion/src/modeledit/telemetry.ui @@ -6,7 +6,7 @@ 0 0 - 757 + 840 457 @@ -249,33 +249,13 @@ - + 0 0 - - - NONE - - - - - A1 - - - - - A2 - - - - - FAS - - @@ -299,33 +279,13 @@ - + 0 0 - - - A1 - - - - - A2 - - - - - FAS - - - - - CELS - - @@ -1125,6 +1085,13 @@ + + + QUnsignedAutoComboBox + QComboBox +
qautocombobox.h
+
+
diff --git a/companion/src/qautocombobox.h b/companion/src/qautocombobox.h new file mode 100755 index 000000000..5d406d849 --- /dev/null +++ b/companion/src/qautocombobox.h @@ -0,0 +1,53 @@ +#ifndef QAUTOCOMBOBOX_H_ +#define QAUTOCOMBOBOX_H_ + +#include +#include "modeledit/modelpanel.h" + +class QUnsignedAutoComboBox: public QComboBox +{ + Q_OBJECT + + public: + explicit QUnsignedAutoComboBox(QWidget *parent = 0): + QComboBox(parent), + field(NULL), + panel(NULL), + lock(false) + { + connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentIndexChanged(int))); + } + + void addItem(const QString & item, unsigned int value) + { + lock = true; + QComboBox::addItem(item, value); + if (field && *field==value) + setCurrentIndex(count()-1); + lock = false; + } + + void setField(unsigned int * field, ModelPanel * panel=NULL) + { + this->field = field; + this->panel = panel; + } + + protected slots: + void onCurrentIndexChanged(int index) + { + if (field && !lock) { + *field = itemData(index).toInt(); + if (panel) { + emit panel->modified(); + } + } + } + + protected: + unsigned int * field; + ModelPanel * panel; + bool lock; +}; + +#endif /* QAUTOCOMBOBOX_H_ */