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);