diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h
index f5badb00a..46a6214ba 100644
--- a/companion/src/eeprominterface.h
+++ b/companion/src/eeprominterface.h
@@ -1028,6 +1028,7 @@ class ModelData {
uint8_t bt_telemetry;
uint8_t numVoice;
MavlinkData mavlink;
+ unsigned int telemetryProtocol;
FrSkyData frsky;
char bitmap[10+1];
diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp
index 1b03f5e52..c76c9307a 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.cpp
+++ b/companion/src/firmwares/opentx/opentxeeprom.cpp
@@ -2412,8 +2412,8 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
}
}
- if (IS_TARANIS(board))
- internalField.Append(new SpareBitsField<3>());
+ if (IS_ARM(board))
+ internalField.Append(new UnsignedField<3>(modelData.telemetryProtocol));
else
internalField.Append(new ConversionField< SignedField<3> >(modelData.moduleData[0].protocol, &protocolsConversionTable, "Protocol", ::QObject::tr("OpenTX doesn't accept this protocol")));
diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp
index 5a21e01e5..655776f3e 100644
--- a/companion/src/modeledit/telemetry.cpp
+++ b/companion/src/modeledit/telemetry.cpp
@@ -476,6 +476,14 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin
model.frsky.usrProto = 1;
}
+ if (IS_ARM(firmware->getBoard())) {
+ ui->telemetryProtocol->setCurrentIndex(model.telemetryProtocol);
+ }
+ else {
+ ui->telemetryProtocolLabel->hide();
+ ui->telemetryProtocol->hide();
+ }
+
analogs[0] = new TelemetryAnalog(this, model.frsky.channels[0], model, generalSettings, firmware);
ui->A1Layout->addWidget(analogs[0]);
connect(analogs[0], SIGNAL(modified()), this, SLOT(onAnalogModified()));
@@ -711,6 +719,12 @@ void TelemetryPanel::populateCurrentSource()
cb->addItem(tr("FAS"), TELEMETRY_CURRENT_SOURCE_FAS);
}
+void TelemetryPanel::on_telemetryProtocol_currentIndexChanged(int index)
+{
+ model.telemetryProtocol = index;
+ emit modified();
+}
+
void TelemetryPanel::onAnalogModified()
{
emit modified();
@@ -718,14 +732,14 @@ void TelemetryPanel::onAnalogModified()
void TelemetryPanel::on_frskyUnitsCB_currentIndexChanged(int index)
{
- model.frsky.imperial = index;
- emit modified();
+ model.frsky.imperial = index;
+ emit modified();
}
void TelemetryPanel::on_bladesCount_editingFinished()
{
- model.frsky.blades = ui->bladesCount->value();
- emit modified();
+ model.frsky.blades = ui->bladesCount->value();
+ emit modified();
}
void TelemetryPanel::on_frskyProtoCB_currentIndexChanged(int index)
diff --git a/companion/src/modeledit/telemetry.h b/companion/src/modeledit/telemetry.h
index ffc9c28c1..631f6d785 100644
--- a/companion/src/modeledit/telemetry.h
+++ b/companion/src/modeledit/telemetry.h
@@ -83,6 +83,7 @@ class TelemetryPanel : public ModelPanel
virtual ~TelemetryPanel();
private slots:
+ void on_telemetryProtocol_currentIndexChanged(int index);
void onAnalogModified();
void on_frskyProtoCB_currentIndexChanged(int index);
void on_frskyUnitsCB_currentIndexChanged(int index);
diff --git a/companion/src/modeledit/telemetry.ui b/companion/src/modeledit/telemetry.ui
index 4a4626901..df30da3fc 100644
--- a/companion/src/modeledit/telemetry.ui
+++ b/companion/src/modeledit/telemetry.ui
@@ -13,10 +13,53 @@
-
+
0
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 100
+ 0
+
+
+
+ Protocol
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
-
+
+ FrSky S.PORT
+
+
+ -
+
+ FrSky D
+
+
+
+
+
+
-
-
diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp
index 8363eb82f..62decfe86 100644
--- a/radio/src/gui/menu_model.cpp
+++ b/radio/src/gui/menu_model.cpp
@@ -5360,6 +5360,7 @@ void menuModelCustomScripts(uint8_t event)
#endif
enum menuModelTelemetryItems {
+ CASE_CPUARM(ITEM_TELEMETRY_PROTOCOL_TYPE)
#if defined(CPUARM)
ITEM_TELEMETRY_RXBATT_LABEL,
ITEM_TELEMETRY_RXBATT_ALARM1,
@@ -5496,7 +5497,7 @@ enum menuModelTelemetryItems {
void menuModelTelemetry(uint8_t event)
{
- MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, RXBATT_ROWS CHANNEL_ROWS, CHANNEL_ROWS, CASE_CPUARM(CHANNEL_ROWS) CASE_CPUARM(CHANNEL_ROWS) RSSI_ROWS, USRDATA_LINES 0, 0, IF_FAS_OFFSET(0) CASE_CPUARM(0) CASE_VARIO(LABEL(Vario)) CASE_VARIO(0) CASE_VARIO(VARIO_RANGE_ROWS) CASE_PCBTARANIS(LABEL(TopBar)) CASE_PCBTARANIS(0) SCREEN_TYPE_ROWS, 2, 2, 2, 2, SCREEN_TYPE_ROWS, 2, 2, 2, 2, CASE_CPUARM(SCREEN_TYPE_ROWS) CASE_CPUARM(2) CASE_CPUARM(2) CASE_CPUARM(2) CASE_CPUARM(2) });
+ MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, CASE_CPUARM(0) RXBATT_ROWS CHANNEL_ROWS, CHANNEL_ROWS, CASE_CPUARM(CHANNEL_ROWS) CASE_CPUARM(CHANNEL_ROWS) RSSI_ROWS, USRDATA_LINES 0, 0, IF_FAS_OFFSET(0) CASE_CPUARM(0) CASE_VARIO(LABEL(Vario)) CASE_VARIO(0) CASE_VARIO(VARIO_RANGE_ROWS) CASE_PCBTARANIS(LABEL(TopBar)) CASE_PCBTARANIS(0) SCREEN_TYPE_ROWS, 2, 2, 2, 2, SCREEN_TYPE_ROWS, 2, 2, 2, 2, CASE_CPUARM(SCREEN_TYPE_ROWS) CASE_CPUARM(2) CASE_CPUARM(2) CASE_CPUARM(2) CASE_CPUARM(2)});
uint8_t sub = m_posVert - 1;
@@ -5530,7 +5531,15 @@ void menuModelTelemetry(uint8_t event)
#endif
FrSkyChannelData & channel = g_model.frsky.channels[ch];
uint8_t dest = TELEM_A1-1+ch;
+
switch (k) {
+
+#if defined(CPUARM)
+ case ITEM_TELEMETRY_PROTOCOL_TYPE:
+ g_model.telemetryProtocol = selectMenuItem(TELEM_COL2, y, "Telemetry Type", "\006S.PORTD\0 ", g_model.telemetryProtocol, PROTOCOL_FRSKY_SPORT, PROTOCOL_FRSKY_D, attr, event);
+ break;
+#endif
+
#if defined(CPUARM)
case ITEM_TELEMETRY_RXBATT_LABEL:
lcd_putsLeft(y, "RxBatt");
diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h
index 43b1d8e25..8912fce73 100644
--- a/radio/src/myeeprom.h
+++ b/radio/src/myeeprom.h
@@ -1693,11 +1693,17 @@ enum ThrottleSources {
THROTTLE_SOURCE_CH1,
};
+enum TelemetryProtocol
+{
+ PROTOCOL_FRSKY_SPORT,
+ PROTOCOL_FRSKY_D,
+};
+
PACK(typedef struct t_ModelData {
ModelHeader header;
TimerData timers[MAX_TIMERS];
AVR_FIELD(uint8_t protocol:3);
- ARM_FIELD(uint8_t spare:3);
+ ARM_FIELD(uint8_t telemetryProtocol:3);
uint8_t thrTrim:1; // Enable Throttle Trim
AVR_FIELD(int8_t ppmNCH:4)
ARM_FIELD(int8_t spare2:4)
diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp
index 8611a7a96..0fde8a422 100644
--- a/radio/src/telemetry/frsky.cpp
+++ b/radio/src/telemetry/frsky.cpp
@@ -68,30 +68,9 @@ uint8_t frskyRxBufferCount = 0;
FrskyData frskyData;
#if defined(CPUARM)
-enum TelemetryProtocol
-{
- PROTOCOL_NONE,
- PROTOCOL_FRSKY_D,
- PROTOCOL_FRSKY_SPORT,
-};
-
+uint8_t telemetryProtocol = 255;
#define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D)
#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT)
-
-TelemetryProtocol telemetryProtocol = PROTOCOL_NONE;
-
-TelemetryProtocol getTelemetryProtocol()
-{
- if (IS_MODULE_XJT(EXTERNAL_MODULE))
- return PROTOCOL_FRSKY_SPORT;
-
-#if defined(PCBTARANIS)
- if (IS_MODULE_XJT(INTERNAL_MODULE))
- return PROTOCOL_FRSKY_SPORT;
-#endif
-
- return PROTOCOL_FRSKY_D;
-}
#else
#define IS_FRSKY_D_PROTOCOL() (true)
#define IS_FRSKY_SPORT_PROTOCOL() (false)
@@ -301,9 +280,8 @@ enum AlarmsCheckSteps {
void telemetryWakeup()
{
#if defined(CPUARM)
- TelemetryProtocol currentProtocol = getTelemetryProtocol();
- if (telemetryProtocol != currentProtocol) {
- telemetryProtocol = currentProtocol;
+ if (telemetryProtocol != g_model.telemetryProtocol) {
+ telemetryProtocol = g_model.telemetryProtocol;
telemetryInit();
}
#endif
@@ -600,13 +578,8 @@ void telemetryReset()
void telemetryInit(void)
{
-#if defined(PCBTARANIS)
- if (IS_MODULE_XJT(INTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE))
- telemetryPortInit(FRSKY_SPORT_BAUDRATE);
- else
- telemetryPortInit(FRSKY_D_BAUDRATE);
-#elif defined(PCBSKY9X)
- if (IS_MODULE_XJT(EXTERNAL_MODULE))
+#if defined(CPUARM)
+ if (telemetryProtocol == PROTOCOL_FRSKY_SPORT)
telemetryPortInit(FRSKY_SPORT_BAUDRATE);
else
telemetryPortInit(FRSKY_D_BAUDRATE);