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
+
+
+
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_ */