From a6044a684d253edc1bca18abd6cc402c27e68940 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Dec 2017 11:26:46 +0100 Subject: [PATCH] Bsongis/r9 m fixes (#5406) R9M support --- companion/src/firmwares/opentx/opentxeeprom.cpp | 4 +- companion/src/modeledit/setup.cpp | 73 ++--- companion/src/modeledit/setup.h | 2 +- companion/src/modeledit/setup_module.ui | 337 ++++++++++++------------ companion/src/modelprinter.cpp | 49 +++- companion/src/modelprinter.h | 5 +- radio/src/CMakeLists.txt | 2 +- radio/src/datastructs.h | 14 +- radio/src/gui/128x64/model_setup.cpp | 181 ++++++++----- radio/src/gui/212x64/model_setup.cpp | 137 ++++++---- radio/src/gui/480x272/model_setup.cpp | 154 +++++++---- radio/src/gui/gui_common.h | 5 +- radio/src/gui/gui_common_arm.cpp | 15 -- radio/src/myeeprom.h | 6 + radio/src/opentx.h | 4 +- radio/src/pulses/pulses_arm.h | 24 ++ radio/src/pulses/pxx_arm.cpp | 15 +- radio/src/telemetry/telemetry.h | 4 +- radio/src/translations.cpp | 19 +- radio/src/translations.h | 36 ++- radio/src/translations/cz.h.txt | 14 +- radio/src/translations/de.h.txt | 14 +- radio/src/translations/en.h.txt | 14 +- radio/src/translations/es.h.txt | 16 +- radio/src/translations/fi.h.txt | 14 +- radio/src/translations/fr.h.txt | 14 +- radio/src/translations/it.h.txt | 14 +- radio/src/translations/nl.h.txt | 14 +- radio/src/translations/pl.h.txt | 14 +- radio/src/translations/pt.h.txt | 14 +- radio/src/translations/se.h.txt | 14 +- 31 files changed, 759 insertions(+), 483 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 9a8a13ac6..4974ec493 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -3523,8 +3523,8 @@ void OpenTxModelData::afterImport() modelData.moduleData[module].pxx.power = pxxByte & 0x03; modelData.moduleData[module].pxx.receiver_telem_off = static_cast(pxxByte & (1 << 4)); modelData.moduleData[module].pxx.receiver_channel_9_16 = static_cast(pxxByte & (1 << 5)); - modelData.moduleData[module].pxx.external_antenna = modelData.moduleData[module].ppm.outputType; - modelData.moduleData[module].pxx.sport_out = modelData.moduleData[module].ppm.pulsePol; + modelData.moduleData[module].pxx.sport_out = modelData.moduleData[module].ppm.outputType; + modelData.moduleData[module].pxx.external_antenna = modelData.moduleData[module].ppm.pulsePol; } } diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 27788a841..7d5b664f4 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -172,6 +172,7 @@ void TimerPanel::on_name_editingFinished() #define MASK_MULTIOPTION 512 #define MASK_R9M 1024 #define MASK_SBUSPPM_FIELDS 2048 +#define MASK_SUBTYPES 4096 quint8 ModulePanel::failsafesValueDisplayType = ModulePanel::FAILSAFE_DISPLAY_PERCENT; @@ -369,7 +370,7 @@ void ModulePanel::update() mask |= MASK_PROTOCOL; switch (protocol) { case PULSES_PXX_R9M: - mask |= MASK_R9M; + mask |= MASK_R9M | MASK_SUBTYPES; case PULSES_PXX_XJT_X16: case PULSES_PXX_XJT_D8: case PULSES_PXX_XJT_LR12: @@ -402,7 +403,7 @@ void ModulePanel::update() mask |= MASK_SBUSPPM_FIELDS| MASK_CHANNELS_RANGE; break; case PULSES_MULTIMODULE: - mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_MULTIMODULE; + mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_MULTIMODULE | MASK_SUBTYPES; max_rx_num = 15; if (module.multi.rfProtocol == MM_RF_PROTO_DSM2) mask |= MASK_CHANNELS_COUNT; @@ -468,37 +469,49 @@ void ModulePanel::update() ui->antennaMode->setVisible(mask & MASK_ANTENNA); ui->antennaMode->setCurrentIndex(module.pxx.external_antenna); - // R9M S.port output + // R9M options ui->sportOut->setVisible(mask & MASK_R9M); - ui->label_sportOut->setVisible(mask & MASK_R9M); - ui->sportOut->setCurrentIndex(module.pxx.sport_out); + ui->r9mPower->setVisible((mask & MASK_R9M) && module.subType == 0); + ui->label_r9mPower->setVisible((mask & MASK_R9M) && module.subType == 0); + if (mask & MASK_R9M) { + if (model->moduleData[0].protocol >= PULSES_PXX_XJT_X16 && model->moduleData[0].protocol <= PULSES_PXX_XJT_LR12) { + module.pxx.sport_out = false; + ui->sportOut->setDisabled(true); + } + else { + ui->sportOut->setEnabled(true); + } + ui->sportOut->setChecked(module.pxx.sport_out); + ui->r9mPower->setCurrentIndex(module.pxx.power); + } - ui->r9mPower->setVisible(mask & MASK_R9M); - ui->label_r9mPower->setVisible(mask & MASK_R9M); - ui->r9mPower->setCurrentIndex(module.pxx.power); + // module subtype + ui->label_multiSubType->setVisible(mask & MASK_SUBTYPES); + ui->multiSubType->setVisible(mask & MASK_SUBTYPES); + if (mask & MASK_SUBTYPES) { + unsigned numEntries = 2; // R9M FCC/EU + if (mask & MASK_MULTIMODULE) + numEntries = (module.multi.customProto ? 8 : multiProtocols.getProtocol(module.multi.rfProtocol).numSubytes()); + const QSignalBlocker blocker(ui->multiSubType); + ui->multiSubType->clear(); + for (unsigned i=0; i < numEntries; i++) + ui->multiSubType->addItem(ModelPrinter::printModuleSubType(protocol, i, module.multi.rfProtocol, module.multi.customProto), i); + ui->multiSubType->setCurrentIndex(module.subType); + } // Multi settings fields ui->label_multiProtocol->setVisible(mask & MASK_MULTIMODULE); ui->multiProtocol->setVisible(mask & MASK_MULTIMODULE); - ui->multiProtocol->setCurrentIndex(module.multi.rfProtocol); - ui->label_multiSubType->setVisible(mask & MASK_MULTIMODULE); - ui->multiSubType->setVisible(mask & MASK_MULTIMODULE); ui->label_option->setVisible(mask & MASK_MULTIOPTION); ui->optionValue->setVisible(mask & MASK_MULTIOPTION); + ui->autoBind->setVisible(mask & MASK_MULTIMODULE); + ui->lowPower->setVisible(mask & MASK_MULTIMODULE); if (mask & MASK_MULTIMODULE) { - int numEntries = multiProtocols.getProtocol(module.multi.rfProtocol).numSubytes(); - if (module.multi.customProto) - numEntries=8; - // Removes extra items - ui->multiSubType->setMaxCount(numEntries); - for (int i=0; i < numEntries; i++) { - if (i < ui->multiSubType->count()) - ui->multiSubType->setItemText(i, ModelPrinter::printMultiSubType(module.multi.rfProtocol, module.multi.customProto, i)); - else - ui->multiSubType->addItem(ModelPrinter::printMultiSubType(module.multi.rfProtocol, module.multi.customProto, i), (QVariant) i); - } + ui->multiProtocol->setCurrentIndex(module.multi.rfProtocol); + ui->autoBind->setChecked(module.multi.autoBindMode ? Qt::Checked : Qt::Unchecked); + ui->lowPower->setChecked(module.multi.lowPowerMode ? Qt::Checked : Qt::Unchecked); } if (mask & MASK_MULTIOPTION) { @@ -508,14 +521,8 @@ void ModulePanel::update() ui->optionValue->setValue(module.multi.optionValue); ui->label_option->setText(qApp->translate("Multiprotocols", qPrintable(pdef.optionsstr))); } - ui->multiSubType->setCurrentIndex(module.subType); - - ui->autoBind->setVisible(mask & MASK_MULTIMODULE); - ui->autoBind->setChecked(module.multi.autoBindMode ? Qt::Checked : Qt::Unchecked); - ui->lowPower->setVisible(mask & MASK_MULTIMODULE); - ui->lowPower->setChecked(module.multi.lowPowerMode ? Qt::Checked : Qt::Unchecked); - + // Failsafes ui->label_failsafeMode->setVisible(mask & MASK_FAILSAFES); ui->failsafeMode->setVisible(mask & MASK_FAILSAFES); @@ -584,10 +591,12 @@ void ModulePanel::on_antennaMode_currentIndexChanged(int index) emit modified(); } -void ModulePanel::on_sportOut_currentIndexChanged(int index) +void ModulePanel::on_sportOut_toggled(bool checked) { - module.pxx.sport_out = index; - emit modified(); + if (module.pxx.sport_out != checked) { + module.pxx.sport_out = checked; + emit modified(); + } } void ModulePanel::on_r9mPower_currentIndexChanged(int index) diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index e59f7a2ba..4aff7a3d7 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -88,7 +88,7 @@ class ModulePanel : public ModelPanel void on_multiSubType_currentIndexChanged(int index); void on_autoBind_stateChanged(int state); void on_lowPower_stateChanged(int state); - void on_sportOut_currentIndexChanged(int index); + void on_sportOut_toggled(bool checked); void on_r9mPower_currentIndexChanged(int index); void setChannelFailsafeValue(const int channel, const int value, quint8 updtSb = 0); void onFailsafeComboIndexChanged(int index); diff --git a/companion/src/modeledit/setup_module.ui b/companion/src/modeledit/setup_module.ui index e78686143..f5bcb7afe 100644 --- a/companion/src/modeledit/setup_module.ui +++ b/companion/src/modeledit/setup_module.ui @@ -6,13 +6,16 @@ 0 0 - 674 - 229 + 708 + 259 + + + 6 @@ -147,22 +150,43 @@ - + + + + 16777215 + 16777215 + + - SubType + Receiver No. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + 0 0 - - QComboBox::AdjustToContents + + + + + 0 + + + 63 + + + 1 + + + 0 @@ -206,87 +230,53 @@ - - - - 16777215 - 16777215 - - + - Antenna - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + RF Output Power - - - - 0 - 0 - - - - QComboBox::AdjustToContents - + - Internal + 10 mW - Ext. + Int. + 100 mW - - - - - - Output type - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - Open Drain + 500 mW - Push Pull + 1000 mW - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Option value - - + + + + + + Bind on startup + + + + + + + Low Power + + + + @@ -352,7 +342,7 @@ - + 16777215 @@ -360,7 +350,7 @@ - Receiver No. + PPM delay Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -368,46 +358,35 @@ - + 0 0 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + - + us - 0 + 100 - 63 + 800 - 1 + 50 - 0 + 300 - - - Bind on startup - - - - - - - Low Power - - - - - + 16777215 @@ -415,43 +394,43 @@ - PPM delay + PPM Frame Length Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + 0 0 - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - us + ms + + + 1 - 100 + 12.500000000000000 - 800 + 32.500000000000000 - 50 + 0.500000000000000 - 300 + 22.500000000000000 - - + + 16777215 @@ -459,38 +438,77 @@ - PPM Frame Length + Antenna Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + 0 0 - - ms + + QComboBox::AdjustToContents - - 1 + + + Internal + + + + + Ext. + Int. + + + + + + + + Output type - - 12.500000000000000 + + + + + + + 0 + 0 + - - 32.500000000000000 + + QComboBox::AdjustToContents - - 0.500000000000000 + + + Open Drain + + + + + Push Pull + + + + + + + + Option value - - 22.500000000000000 + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -560,6 +578,26 @@ + + + Sub Type + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + @@ -575,7 +613,7 @@ - + @@ -613,7 +651,7 @@ - + @@ -629,7 +667,7 @@ - + @@ -667,64 +705,19 @@ - - - - S.port output - - - - - - - Disable - - - QComboBox::AdjustToContents + + + + + 0 + 0 + - - - Disable - - - - - Enable - - - - - - - RF Output Power + Module Telemetry - - - - - 10 mW - - - - - 100 mW - - - - - 500 mW - - - - - 1000 mW - - - - diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index dca0221c7..8917738a3 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -45,6 +45,14 @@ ModelPrinter::~ModelPrinter() { } +QString ModelPrinter::printBoolean(bool val) +{ + if (val) + return tr("Y"); + else + return tr("N"); +} + void debugHtml(const QString & html) { QFile file("foo.html"); @@ -140,7 +148,7 @@ QString ModelPrinter::printMultiRfProtocol(int rfProtocol, bool custom) return CHECK_IN_ARRAY(strings, rfProtocol); } -QString ModelPrinter::printMultiSubType(int rfProtocol, bool custom, unsigned int subType) { +QString ModelPrinter::printMultiSubType(unsigned rfProtocol, bool custom, unsigned int subType) { /* custom protocols */ if (custom) @@ -154,6 +162,39 @@ QString ModelPrinter::printMultiSubType(int rfProtocol, bool custom, unsigned in return "???"; } +QString ModelPrinter::printR9MPowerValue(unsigned subType, unsigned val, bool telem) +{ + static const QStringList strFTC = QStringList() << tr("10mW") << tr("100mW") << tr("500mW") << tr("1W"); + static const QStringList strLBT = QStringList() << tr("25mW") << tr("500mW"); + + + if (subType == 0 && (int)val < strFTC.size()) + return strFTC.at(val); + else if (subType == 1) + return (telem ? strLBT.at(0) : strLBT.at(1)); + else + return "???"; +} + +QString ModelPrinter::printModuleSubType(unsigned protocol, unsigned subType, unsigned rfProtocol, bool custom) +{ + static const char * strings[] = { + "FCC", + "LBT(EU)" + }; + + switch (protocol) { + case PULSES_MULTIMODULE: + return printMultiSubType(rfProtocol, custom, subType); + + case PULSES_PXX_R9M: + return CHECK_IN_ARRAY(strings, subType); + + default: + return "???"; + } +} + QString ModelPrinter::printModule(int idx) { const ModuleData &module = model.moduleData[idx]; if (module.protocol == PULSES_OFF) @@ -167,6 +208,8 @@ QString ModelPrinter::printModule(int idx) { } if (module.protocol == PULSES_MULTIMODULE) result += " " + tr("radio Protocol %1, subType %2, option value %3").arg(printMultiRfProtocol(module.multi.rfProtocol, module.multi.customProto)).arg(printMultiSubType(module.multi.rfProtocol, module.multi.customProto, module.subType)).arg(module.multi.optionValue); + else if (module.protocol == PULSES_PXX_R9M) + result += " " + tr("Module Type: %1, Power: %2, Telemetry Enabled: %3").arg(printModuleSubType(module.protocol, module.subType)).arg(printR9MPowerValue(module.subType, module.pxx.power, module.pxx.sport_out)).arg(printBoolean(module.pxx.sport_out)); return result; } } @@ -709,7 +752,7 @@ QString ModelPrinter::printGlobalVarMax(int idx) QString ModelPrinter::printGlobalVarPopup(int idx) { - return (model.gvarData[idx].popup ? "Y" : "N" ); + return printBoolean(model.gvarData[idx].popup); } QString ModelPrinter::printOutputValueGVar(int val) @@ -760,6 +803,6 @@ QString ModelPrinter::printOutputCurve(int idx) QString ModelPrinter::printOutputSymetrical(int idx) { - return (model.limitData[idx].symetrical ? "Y": "N"); + return printBoolean(model.limitData[idx].symetrical); } diff --git a/companion/src/modelprinter.h b/companion/src/modelprinter.h index 861a05445..2286b15af 100644 --- a/companion/src/modelprinter.h +++ b/companion/src/modelprinter.h @@ -54,12 +54,15 @@ class ModelPrinter: public QObject ModelPrinter(Firmware * firmware, const GeneralSettings & generalSettings, const ModelData & model); virtual ~ModelPrinter(); + QString printBoolean(bool val); QString printEEpromSize(); QString printTrimIncrementMode(); QString printThrottleTrimMode(); static QString printModuleProtocol(unsigned int protocol); static QString printMultiRfProtocol(int rfProtocol, bool custom); - static QString printMultiSubType(int rfProtocol, bool custom, unsigned int subType); + static QString printR9MPowerValue(unsigned subType, unsigned val, bool telem); + static QString printMultiSubType(unsigned rfProtocol, bool custom, unsigned int subType); + static QString printModuleSubType(unsigned protocol, unsigned subType, unsigned rfProtocol = 0, bool custom = false); QString printFlightModeSwitch(const RawSwitch & swtch); QString printFlightModeName(int index); QString printFlightModes(unsigned int flightModes); diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 97b9a2208..a1867535e 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -41,7 +41,7 @@ option(FAS_PROTOTYPE "Support of old FAS prototypes (different resistors)" OFF) option(TEMPLATES "Model templates menu" OFF) option(TRACE_SIMPGMSPACE "Turn on traces in simpgmspace.cpp" ON) option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF) -option(BINDING_OPTIONS "Allow advanced frsky bindings" OFF) +option(BINDING_OPTIONS "Allow advanced FrSky bindings" OFF) option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF) option(NANO "Use nano newlib and binalloc") option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 55aa3dbbd..060e948d9 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -654,7 +654,7 @@ PACK(struct ModuleData { int8_t rfProtocol:4; uint8_t channelsStart; int8_t channelsCount; // 0=8 channels - uint8_t failsafeMode:4; //only 3 bits used + uint8_t failsafeMode:4; // only 3 bits used uint8_t subType:3; uint8_t invertedSerial:1; // telemetry serial inverted from standard int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; @@ -667,23 +667,23 @@ PACK(struct ModuleData { } ppm; NOBACKUP(struct { uint8_t rfProtocolExtra:2; - uint8_t spare:3; + uint8_t spare1:3; uint8_t customProto:1; uint8_t autoBindMode:1; uint8_t lowPowerMode:1; int8_t optionValue; } multi); NOBACKUP(struct { - uint8_t power:2; // 0 10 mW, 1 100 mW, 2 500 mW, 3 1W - uint8_t spare:2; + uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W + uint8_t spare1:2; uint8_t receiver_telem_off:1; // false = receiver telem enabled uint8_t receiver_channel_9_16:1; // false = pwm out 1-8, true 9-16 - uint8_t external_antenna:1; // false = internal antenna, true = external antenna + uint8_t external_antenna:1; // false = internal antenna, true = external antenna uint8_t sport_out:1; - uint8_t spare3; + uint8_t spare2; } pxx); NOBACKUP(struct { - uint8_t spare:6; + uint8_t spare1:6; uint8_t noninverted:1; uint8_t spare2:1; int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index bcff62b17..201163a3f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -143,7 +143,7 @@ enum MenuModelSetupItems { #endif #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) - #define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 + #define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 #define CURSOR_ON_CELL (true) #define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX) @@ -181,27 +181,49 @@ enum MenuModelSetupItems { #if defined(BINDING_OPTIONS) void onBindMenu(const char * result) { - if (result == STR_BINDING_1_8_TELEM_ON) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false; + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); + + if (result == STR_BINDING_25MW_CH1_8_TELEM_OFF) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + } + else if (result == STR_BINDING_25MW_CH1_8_TELEM_ON) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + } + else if (result == STR_BINDING_500MW_CH1_8_TELEM_OFF) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + } + else if (result == STR_BINDING_500MW_CH9_16_TELEM_OFF) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; + } + else if (result == STR_BINDING_1_8_TELEM_ON) { + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; } else if (result == STR_BINDING_1_8_TELEM_OFF) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; } else if (result == STR_BINDING_9_16_TELEM_ON) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; } else if (result == STR_BINDING_9_16_TELEM_OFF) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; } else { return; } - moduleFlag[INTERNAL_MODULE] = MODULE_BIND; + moduleFlag[moduleIdx] = MODULE_BIND; } #endif @@ -711,6 +733,8 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (IS_MODULE_DSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); + else if (IS_MODULE_R9M(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_MODES, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -735,6 +759,8 @@ void menuModelSetup(event_t event) case 1: if (IS_MODULE_DSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); + else if (IS_MODULE_R9M(EXTERNAL_MODULE)) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LBT); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -747,7 +773,8 @@ void menuModelSetup(event_t event) // Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) { g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1; - } else { + } + else { g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0; } g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; @@ -771,13 +798,13 @@ void menuModelSetup(event_t event) { lcdDrawTextAlignedLeft(y, STR_SUBTYPE); uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true); - const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_rfProto); + const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_rfProto); if (multi_rfProto == MM_RF_CUSTOM_SELECTED) { - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, RIGHT | (menuHorizontalPosition == 1 ? attr : 0), 2); - } else - { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, RIGHT | (menuHorizontalPosition == 1 ? attr : 0), 2); + } + else { if (pdef->subTypeString != nullptr) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, pdef->subTypeString, g_model.moduleData[EXTERNAL_MODULE].subType, attr); } @@ -796,7 +823,7 @@ void menuModelSetup(event_t event) } } } - break; + break; #endif #if defined(PCBX7) @@ -991,22 +1018,33 @@ void menuModelSetup(event_t event) if (attr && l_posHorz > 0) { if (s_editMode > 0) { if (l_posHorz == 1) { - if (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16 && s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { - if(event==EVT_KEY_BREAK(KEY_ENTER)) { - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); - POPUP_MENU_SELECT_ITEM(g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off + (g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 << 1)); + if (IS_MODULE_R9M(moduleIdx) || (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16)) { + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + uint8_t default_selection; + if (IS_MODULE_R9M_LBT(moduleIdx)) { + POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH9_16_TELEM_OFF); + default_selection = 2; + } + else { + POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); + default_selection = g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off + (g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 << 1); + } + POPUP_MENU_SELECT_ITEM(default_selection); POPUP_MENU_START(onBindMenu); continue; } - if (moduleFlag[INTERNAL_MODULE] == MODULE_BIND) { + if (moduleFlag[moduleIdx] == MODULE_BIND) { newFlag = MODULE_BIND; } else { if (!popupMenuNoItems) { - s_editMode=0; // this is when popup is exited before a choice is made + s_editMode = 0; // this is when popup is exited before a choice is made } } } @@ -1083,14 +1121,16 @@ void menuModelSetup(event_t event) } } break; - case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: { + + case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: + { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); #if defined(MULTIMODULE) if (IS_MODULE_MULTIMODULE(moduleIdx)) { int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true); - const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_proto); + const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto); if (pdef->optionsstr) lcdDrawTextAlignedLeft(y, pdef->optionsstr); @@ -1101,21 +1141,23 @@ void menuModelSetup(event_t event) if (attr) { if (multi_proto == MM_RF_PROTO_FS_AFHDS2A) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, 0, 70); - } else if (multi_proto == MM_RF_PROTO_OLRS) { + } + else if (multi_proto == MM_RF_PROTO_OLRS) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -1, 7); - } else { + } + else { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); } } } #endif if (IS_MODULE_R9M(moduleIdx)) { - if (IS_TELEMETRY_INTERNAL_MODULE) { - lcdDrawTextAlignedLeft(y, STR_SPORT_OUT); + if (IS_TELEMETRY_INTERNAL_MODULE()) { + lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); } else { - g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_SPORT_OUT, attr, event); + g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEMETRY, attr, event); } } else if (IS_MODULE_SBUS(moduleIdx)) { @@ -1124,44 +1166,51 @@ void menuModelSetup(event_t event) } break; } - case ITEM_MODEL_EXTERNAL_MODULE_POWER: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + + case ITEM_MODEL_EXTERNAL_MODULE_POWER: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + if (IS_MODULE_R9M_FCC(moduleIdx)) { + // Power selection is only available on R9M FCC + lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); + if (attr) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_FCC_POWER_MAX); + } #if defined(MULTIMODULE) - if (IS_MODULE_MULTIMODULE(moduleIdx)) { - g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); - } + else if (IS_MODULE_MULTIMODULE(moduleIdx)) { + g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); + } #endif - if (IS_MODULE_R9M(moduleIdx)) { - lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), attr); - if (attr) - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3); + } - } - break; -#if defined(MULTIMODULE) - case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: - if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); - else - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); break; - case ITEM_MODEL_EXTERNAL_MODULE_STATUS: { - lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); - char statusText[64]; - multiModuleStatus.getStatusString(statusText); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); - break; - } - case ITEM_MODEL_EXTERNAL_MODULE_SYNCSTATUS: { - lcdDrawTextAlignedLeft(y, STR_MODULE_SYNC); +#if defined(MULTIMODULE) + case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); + else + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); + break; - char statusText[64]; - multiSyncStatus.getRefreshString(statusText); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); - break; - } + case ITEM_MODEL_EXTERNAL_MODULE_STATUS: { + lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); + + char statusText[64]; + multiModuleStatus.getStatusString(statusText); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); + break; + } + + case ITEM_MODEL_EXTERNAL_MODULE_SYNCSTATUS: { + lcdDrawTextAlignedLeft(y, STR_MODULE_SYNC); + + char statusText[64]; + multiSyncStatus.getRefreshString(statusText); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); + break; + } #endif #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 04d656b98..b7aa3bd1b 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -103,30 +103,54 @@ enum MenuModelSetupItems { #define MODEL_SETUP_RANGE_OFS 7*FW #define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW-2 +#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) + #if defined(BINDING_OPTIONS) void onBindMenu(const char * result) { - if (result == STR_BINDING_1_8_TELEM_ON) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false; + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); + + if (result == STR_BINDING_25MW_CH1_8_TELEM_OFF) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + } + else if (result == STR_BINDING_25MW_CH1_8_TELEM_ON) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + } + else if (result == STR_BINDING_500MW_CH1_8_TELEM_OFF) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + } + else if (result == STR_BINDING_500MW_CH9_16_TELEM_OFF) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; + } + else if (result == STR_BINDING_1_8_TELEM_ON) { + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; } else if (result == STR_BINDING_1_8_TELEM_OFF) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; } else if (result == STR_BINDING_9_16_TELEM_ON) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; } else if (result == STR_BINDING_9_16_TELEM_OFF) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; } else { return; } - moduleFlag[INTERNAL_MODULE] = MODULE_BIND; + moduleFlag[moduleIdx] = MODULE_BIND; } #endif @@ -219,8 +243,6 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) } } -#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) - int getSwitchWarningsCount() { int count = 0; @@ -253,7 +275,7 @@ int getSwitchWarningsCount() #define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t) 1 : (uint8_t)0 -#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 +#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS(0) @@ -306,8 +328,11 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, - ((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol))|| IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, - FAILSAFE_ROWS(EXTERNAL_MODULE), EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, + ((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, + FAILSAFE_ROWS(EXTERNAL_MODULE), + EXTERNAL_MODULE_OPTION_ROW, + MULTIMODULE_MODULE_ROWS + EXTERNAL_MODULE_POWER_ROW, LABEL(Trainer), 0, TRAINER_LINE1_ROWS, TRAINER_LINE2_ROWS}); #endif MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX); @@ -741,6 +766,8 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (IS_MODULE_DSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); + else if (IS_MODULE_R9M(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_MODES, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -775,6 +802,8 @@ void menuModelSetup(event_t event) case 1: if (IS_MODULE_DSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); + else if (IS_MODULE_R9M(EXTERNAL_MODULE)) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LBT); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -787,7 +816,8 @@ void menuModelSetup(event_t event) // Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) { g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1; - } else { + } + else { g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0; } g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; @@ -807,8 +837,9 @@ void menuModelSetup(event_t event) if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) { g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), 0, 63, EE_MODEL)); break; - } else { - const mm_protocol_definition* pdef = getMultiProtocolDefinition(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false)); + } + else { + const mm_protocol_definition * pdef = getMultiProtocolDefinition(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false)); if (pdef->maxSubtype > 0) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, pdef->maxSubtype); } @@ -967,11 +998,11 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); } if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { - if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); + if (xOffsetBind) + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); if (attr && l_posHorz==0) { if (s_editMode>0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); - if (checkIncDec_Ret) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; } @@ -986,29 +1017,40 @@ void menuModelSetup(event_t event) #if defined(MULTIMODULE) if (multiBindStatus == MULTI_BIND_FINISHED) { multiBindStatus = MULTI_NORMAL_OPERATION; - s_editMode=0; + s_editMode = 0; } #endif #if defined(BINDING_OPTIONS) if (attr && l_posHorz>0) { - if(s_editMode>0) { + if (s_editMode>0) { if (l_posHorz == 1) { - if (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16 && s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { - if(event==EVT_KEY_BREAK(KEY_ENTER)) { - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); - POPUP_MENU_SELECT_ITEM(g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off + (g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 << 1)); + if (IS_MODULE_R9M(moduleIdx) || (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16)) { + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + uint8_t default_selection; + if (IS_MODULE_R9M_LBT(moduleIdx)) { + POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH9_16_TELEM_OFF); + default_selection = 2; + } + else { + POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); + default_selection = g_model.moduleData[moduleIdx].pxx.receiver_telem_off + (g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 << 1); + } + POPUP_MENU_SELECT_ITEM(default_selection); POPUP_MENU_START(onBindMenu); continue; } - if (moduleFlag[INTERNAL_MODULE] == MODULE_BIND) { + if (moduleFlag[moduleIdx] == MODULE_BIND) { newFlag = MODULE_BIND; } else { if (!popupMenuNoItems) { - s_editMode=0; // this is when popup is exited before a choice is made + s_editMode = 0; // this is when popup is exited before a choice is made } } } @@ -1070,7 +1112,9 @@ void menuModelSetup(event_t event) break; } break; - case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: { + + case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: + { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); #if defined(MULTIMODULE) @@ -1100,12 +1144,12 @@ void menuModelSetup(event_t event) } #endif if (IS_MODULE_R9M(moduleIdx)) { - if (IS_TELEMETRY_INTERNAL_MODULE) { - lcdDrawTextAlignedLeft(y, STR_SPORT_OUT); + if (IS_TELEMETRY_INTERNAL_MODULE()) { + lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); } else { - g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_SPORT_OUT, attr, event); + g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEMETRY, attr, event); } } else if (IS_MODULE_SBUS(moduleIdx)) { @@ -1114,18 +1158,22 @@ void menuModelSetup(event_t event) } } break; - case ITEM_MODEL_EXTERNAL_MODULE_POWER: { + + case ITEM_MODEL_EXTERNAL_MODULE_POWER: + { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); -#if defined (MULTIMODULE) - if (IS_MODULE_MULTIMODULE(moduleIdx)) - g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); -#endif - if (IS_MODULE_R9M(moduleIdx)) { + if (IS_MODULE_R9M_FCC(moduleIdx)) { + // Power selection is only available on R9M FCC lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3); + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_FCC_POWER_MAX); } +#if defined (MULTIMODULE) + else if (IS_MODULE_MULTIMODULE(moduleIdx)) { + g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); + } +#endif break; } @@ -1136,7 +1184,8 @@ void menuModelSetup(event_t event) else g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); break; - case ITEM_MODEL_EXTERNAL_MODULE_STATUS: { + case ITEM_MODEL_EXTERNAL_MODULE_STATUS: + { lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); char statusText[64]; diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 9cfda1940..2b5685836 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -96,30 +96,54 @@ enum MenuModelSetupItems { #define MODEL_SETUP_SET_FAILSAFE_OFS 100 #define MODEL_SETUP_SLIDPOT_SPACING 45 +#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) + #if defined(BINDING_OPTIONS) void onBindMenu(const char * result) { - if (result == STR_BINDING_1_8_TELEM_ON) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false; + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); + + if (result == STR_BINDING_25MW_CH1_8_TELEM_OFF) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + } + else if (result == STR_BINDING_25MW_CH1_8_TELEM_ON) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + } + else if (result == STR_BINDING_500MW_CH1_8_TELEM_OFF) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + } + else if (result == STR_BINDING_500MW_CH9_16_TELEM_OFF) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; + } + else if (result == STR_BINDING_1_8_TELEM_ON) { + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; } else if (result == STR_BINDING_1_8_TELEM_OFF) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; } else if (result == STR_BINDING_9_16_TELEM_ON) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; } else if (result == STR_BINDING_9_16_TELEM_OFF) { - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true; - g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true; + g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; + g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; } else { return; } - moduleFlag[INTERNAL_MODULE] = MODULE_BIND; + moduleFlag[moduleIdx] = MODULE_BIND; } #endif @@ -197,8 +221,6 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) } } -#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) - int getSwitchWarningsCount() { int count = 0; @@ -219,7 +241,7 @@ int getSwitchWarningsCount() #define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0 -#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 +#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS(0) @@ -263,9 +285,15 @@ bool menuModelSetup(event_t event) EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, - ((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, - FAILSAFE_ROWS(EXTERNAL_MODULE), EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, - LABEL(Trainer), 0, TRAINER_LINE1_ROWS, TRAINER_LINE2_ROWS }); + ((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, + FAILSAFE_ROWS(EXTERNAL_MODULE), + EXTERNAL_MODULE_OPTION_ROW, + MULTIMODULE_MODULE_ROWS + EXTERNAL_MODULE_POWER_ROW, + LABEL(Trainer), + 0, + TRAINER_LINE1_ROWS, + TRAINER_LINE2_ROWS }); if (menuEvent) { moduleFlag[0] = 0; @@ -665,6 +693,8 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); else if (IS_MODULE_DSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); + else if (IS_MODULE_R9M(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_MODES, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -672,9 +702,9 @@ bool menuModelSetup(event_t event) lcdDrawText(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_CUSTOM, menuHorizontalPosition == 1 ? attr : 0); lcdDrawNumber(MODEL_SETUP_4TH_COLUMN, y, multi_rfProto, menuHorizontalPosition==2 ? attr : 0, 2); lcdDrawNumber(MODEL_SETUP_4TH_COLUMN + MODEL_SETUP_BIND_OFS, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2); - } else { - const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_rfProto); - + } + else { + const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_rfProto); lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition == 1 ? attr : 0); if (pdef->subTypeString != nullptr) lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, pdef->subTypeString, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); @@ -696,6 +726,8 @@ bool menuModelSetup(event_t event) case 1: if (IS_MODULE_DSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); + else if (IS_MODULE_R9M(EXTERNAL_MODULE)) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LBT); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -708,7 +740,8 @@ bool menuModelSetup(event_t event) // Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) { g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1; - } else { + } + else { g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0; } g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; @@ -876,39 +909,50 @@ bool menuModelSetup(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, y, STR_RECEIVER_NUM); } if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { - if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0 | LEFT, 2); - if (attr && l_posHorz==0 && s_editMode>0) { + if (xOffsetBind) + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0 | LEFT, 2); + if (attr && l_posHorz==0 && s_editMode>0) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); - } drawButton(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, (moduleFlag[moduleIdx] == MODULE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0)); drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleFlag[moduleIdx] == MODULE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0)); uint8_t newFlag = 0; #if defined(MULTIMODULE) if (multiBindStatus == MULTI_BIND_FINISHED) { multiBindStatus = MULTI_NORMAL_OPERATION; - s_editMode=0; + s_editMode = 0; } #endif #if defined(BINDING_OPTIONS) if (attr && l_posHorz>0) { - if(s_editMode>0) { + if (s_editMode>0) { if (l_posHorz == 1) { - if (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16 && s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { - if(event==EVT_KEY_BREAK(KEY_ENTER)) { - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); - POPUP_MENU_SELECT_ITEM(g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off + (g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 << 1)); + if (IS_MODULE_R9M(moduleIdx) || (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol == RF_PROTO_X16)) { + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + uint8_t default_selection; + if (IS_MODULE_R9M_LBT(moduleIdx)) { + POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH9_16_TELEM_OFF); + default_selection = 2; + } + else { + POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); + default_selection = g_model.moduleData[moduleIdx].pxx.receiver_telem_off + (g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 << 1); + } + POPUP_MENU_SELECT_ITEM(default_selection); POPUP_MENU_START(onBindMenu); continue; } - if (moduleFlag[INTERNAL_MODULE] == MODULE_BIND) { + if (moduleFlag[moduleIdx] == MODULE_BIND) { newFlag = MODULE_BIND; } else { if (!popupMenuNoItems) { - s_editMode=0; // this is when popup is exited before a choice is made + s_editMode = 0; // this is when popup is exited before a choice is made } } } @@ -970,7 +1014,9 @@ bool menuModelSetup(event_t event) } break; } - case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: { + + case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: + { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); #if defined(MULTIMODULE) if (IS_MODULE_MULTIMODULE(moduleIdx)) { @@ -988,17 +1034,19 @@ bool menuModelSetup(event_t event) if (attr) { if (multi_proto == MM_RF_PROTO_FS_AFHDS2A) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, 0, 70); - } else if (multi_proto == MM_RF_PROTO_OLRS) { + } + else if (multi_proto == MM_RF_PROTO_OLRS) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -1, 7); - } else { + } + else { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); } } } #endif if (IS_MODULE_R9M(moduleIdx)) { - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SPORT_OUT); - if (IS_TELEMETRY_INTERNAL_MODULE) { + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_TELEMETRY); + if (IS_TELEMETRY_INTERNAL_MODULE()) { lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); } else { @@ -1011,22 +1059,26 @@ bool menuModelSetup(event_t event) } } break; - case ITEM_MODEL_EXTERNAL_MODULE_POWER: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - if (IS_MODULE_R9M(moduleIdx)) { - lcdDrawText(MENUS_MARGIN_LEFT, y, TR_MULTI_RFPOWER); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), LEFT | attr); - if (attr) - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3); - } + + case ITEM_MODEL_EXTERNAL_MODULE_POWER: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + if (IS_MODULE_R9M_FCC(moduleIdx)) { + // Power selection is only available on R9M FCC + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_RFPOWER); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); + if (attr) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_FCC_POWER_MAX); + } #if defined(MULTIMODULE) - else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER); - g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); - } + else if (IS_MODULE_MULTIMODULE(moduleIdx)) { + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER); + g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); + } #endif } break; + #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 7f910b695..cc4e2d930 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -68,7 +68,6 @@ bool isCurrentSensor(int sensor); bool isTelemetryFieldAvailable(int index); bool isTelemetryFieldComparisonAvailable(int index); bool isSensorAvailable(int sensor); -const char* getR9MPowerString(int power); bool modelHasNotes(); #endif @@ -158,9 +157,9 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define IS_R9M_OR_XJTD16(x) ((IS_MODULE_XJT(x) && g_model.moduleData[x].rfProtocol== RF_PROTO_X16) || IS_MODULE_R9M(x)) #define FAILSAFE_ROWS(x) ((IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || IS_MODULE_R9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW -#define R9M_OPTION_ROW (IS_TELEMETRY_INTERNAL_MODULE ? TITLE_ROW : (uint8_t) 0) +#define R9M_OPTION_ROW (IS_TELEMETRY_INTERNAL_MODULE() ? TITLE_ROW : (uint8_t) 0) #define EXTERNAL_MODULE_OPTION_ROW (IS_MODULE_R9M(EXTERNAL_MODULE) ? R9M_OPTION_ROW : IS_MODULE_SBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) -#define EXTERNAL_MODULE_POWER_ROW (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) || IS_MODULE_R9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW +#define EXTERNAL_MODULE_POWER_ROW (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) || IS_MODULE_R9M_FCC(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 7a828b878..4f34d72dd 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -738,18 +738,3 @@ void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, Lcd else lcdDrawMMM(x, y, flags); } - -const char* getR9MPowerString(int power) -{ - switch (power) { - case 0: - return " 10 mW"; - case 1: - return "100 mW"; - case 2: - return "500 mW"; - case 3: - default: - return " 1 W"; - } -} diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index bf9516a8f..bf9dcb27d 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -503,6 +503,12 @@ enum XJTRFProtocols { RF_PROTO_LAST = RF_PROTO_LR12 }; +enum R9MSubTypes +{ + MODULE_SUBTYPE_R9M_FCC, + MODULE_SUBTYPE_R9M_LBT, +}; + enum MultiModuleRFProtocols { MM_RF_PROTO_CUSTOM = -1, MM_RF_PROTO_FIRST = MM_RF_PROTO_CUSTOM, diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 03cb5508f..371ab215c 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -454,7 +454,9 @@ void memswap(void * a, void * b, uint8_t size); #define MAX_CHANNELS(idx) (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS_M8()) #define NUM_CHANNELS(idx) (8+g_model.moduleData[idx].channelsCount) #endif -#define IS_MODULE_R9M(idx) (g_model.moduleData[idx].type==MODULE_TYPE_R9M) +#define IS_MODULE_R9M(idx) (g_model.moduleData[idx].type == MODULE_TYPE_R9M) +#define IS_MODULE_R9M_FCC(idx) (IS_MODULE_R9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC) +#define IS_MODULE_R9M_LBT(idx) (IS_MODULE_R9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_LBT) #define IS_MODULE_PXX(idx) (IS_MODULE_XJT(idx) || IS_MODULE_R9M(idx)) #if defined(DSM2) diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 7bdef6dde..288d37c21 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -180,4 +180,28 @@ inline void SEND_FAILSAFE_1S() } } +#define LEN_R9M_MODES "\007" +#define TR_R9M_MODES "FCC\0 ""LBT(EU)" +#define LEN_R9M_FCC_POWER_VALUES "\006" +#define LEN_R9M_LBT_POWER_VALUES "\006" +#define TR_R9M_FCC_POWER_VALUES "10 mW\0" "100 mW" "500 mW" "1 W\0" +#define TR_R9M_LBT_POWER_VALUES "25 mW\0" "500 mW" + +enum R9MFCCPowerValues { + R9M_FCC_POWER_10 = 0, + R9M_FCC_POWER_100, + R9M_FCC_POWER_500, + R9M_FCC_POWER_1000, + R9M_FCC_POWER_MAX = R9M_FCC_POWER_1000 +}; + +enum R9MLBTPowerValues { + R9M_LBT_POWER_25 = 0, + R9M_LBT_POWER_500, + R9M_LBT_POWER_MAX = R9M_LBT_POWER_500 +}; + +#define BIND_TELEM_ALLOWED(idx) (!IS_MODULE_R9M_LBT(idx) || g_model.moduleData[idx].pxx.power == R9M_LBT_POWER_25) +#define BIND_CH9TO16_ALLOWED(idx) (!IS_MODULE_R9M_LBT(idx) || g_model.moduleData[idx].pxx.power != R9M_LBT_POWER_25) + #endif // _PULSES_ARM_H_ diff --git a/radio/src/pulses/pxx_arm.cpp b/radio/src/pulses/pxx_arm.cpp index 32ad8c494..af7fdc40a 100644 --- a/radio/src/pulses/pxx_arm.cpp +++ b/radio/src/pulses/pxx_arm.cpp @@ -378,18 +378,19 @@ void setupPulsesPXX(uint8_t port) /* Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) */ #if defined(PCBHORUS) if (port == INTERNAL_MODULE) { - extra_flags |= g_model.moduleData[port].pxx.external_antenna; + extra_flags |= (g_model.moduleData[port].pxx.external_antenna << 0); } #endif #if defined(BINDING_OPTIONS) - extra_flags |= g_model.moduleData[port].pxx.receiver_telem_off << 1; - extra_flags |= g_model.moduleData[port].pxx.receiver_channel_9_16 << 2; + extra_flags |= (g_model.moduleData[port].pxx.receiver_telem_off << 1); + extra_flags |= (g_model.moduleData[port].pxx.receiver_channel_9_16 << 2); #endif if (IS_MODULE_R9M(port)) { - extra_flags |= g_model.moduleData[port].pxx.power << 3; - // Disable s.port if internal module is active - if (IS_TELEMETRY_INTERNAL_MODULE || !g_model.moduleData[port].pxx.sport_out) - extra_flags |= (1<< 5); + extra_flags |= (max(g_model.moduleData[port].pxx.power, IS_MODULE_R9M_FCC(port) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); + // Disable S.PORT if internal module is active + if (IS_TELEMETRY_INTERNAL_MODULE() || !g_model.moduleData[port].pxx.sport_out) { + extra_flags |= (1 << 5); + } } putPcmByte(port, extra_flags); diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 730523ca6..910069f9e 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -198,9 +198,9 @@ extern Fifo * luaInputTelemetryFifo; #endif #if defined(STM32) -#define IS_TELEMETRY_INTERNAL_MODULE (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT) +#define IS_TELEMETRY_INTERNAL_MODULE() (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT) #else -#define IS_TELEMETRY_INTERNAL_MODULE (false) +#define IS_TELEMETRY_INTERNAL_MODULE() (false) #endif #endif // _TELEMETRY_H_ diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index f5df1c3f2..2d77e9c71 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -108,6 +108,9 @@ const pm_char STR_OPEN9X[] PROGMEM = #if defined(CPUARM) ISTR(VTRAINERMODES) ISTR(TARANIS_PROTOCOLS) + ISTR(R9M_MODES) + ISTR(R9M_FCC_POWER_VALUES) + ISTR(R9M_LBT_POWER_VALUES) ISTR(TELEMETRY_PROTOCOLS) ISTR(XJT_PROTOCOLS) ISTR(DSM_PROTOCOLS) @@ -388,7 +391,7 @@ const pm_char STR_RECEIVER[] PROGMEM = TR_RECEIVER; const pm_char STR_SYNCMENU[] PROGMEM = TR_SYNCMENU; const pm_char STR_INTERNALRF[] PROGMEM = TR_INTERNALRF; const pm_char STR_EXTERNALRF[] PROGMEM = TR_EXTERNALRF; -const pm_char STR_SPORT_OUT[] PROGMEM = TR_SPORT_OUT; +const pm_char STR_MODULE_TELEMETRY[] PROGMEM = TR_MODULE_TELEMETRY; const pm_char STR_COUNTRYCODE[] PROGMEM = TR_COUNTRYCODE; const pm_char STR_USBMODE[] PROGMEM = TR_USBMODE; const pm_char STR_FAILSAFE[] PROGMEM = TR_FAILSAFE; @@ -475,7 +478,6 @@ const pm_char STR_MULTI_CUSTOM[] PROGMEM = TR_MULTI_CUSTOM; const pm_char STR_MULTI_RFTUNE[] PROGMEM = TR_MULTI_RFTUNE; const pm_char STR_MULTI_TELEMETRY[] PROGMEM = TR_MULTI_TELEMETRY; const pm_char STR_MULTI_VIDFREQ[] PROGMEM = TR_MULTI_VIDFREQ; -const pm_char STR_MULTI_RFPOWER[] PROGMEM = TR_MULTI_RFPOWER; const pm_char STR_MULTI_OPTION[] PROGMEM = TR_MULTI_OPTION; const pm_char STR_MULTI_AUTOBIND[] PROGMEM = TR_MULTI_AUTOBIND; const pm_char STR_MULTI_DSM_AUTODTECT[] PROGMEM = TR_MULTI_DSM_AUTODTECT; @@ -615,10 +617,14 @@ const pm_char STR_BLCOLOR[] PROGMEM = TR_BLCOLOR; #if defined(CPUARM) const pm_char STR_TRAINER[] PROGMEM = TR_TRAINER; const pm_char STR_MODULE_BIND[] PROGMEM = TR_MODULE_BIND; - const pm_char STR_BINDING_1_8_TELEM_ON[] PROGMEM = TR_BINDING_MODE1; - const pm_char STR_BINDING_1_8_TELEM_OFF[] PROGMEM = TR_BINDING_MODE2; - const pm_char STR_BINDING_9_16_TELEM_ON[] PROGMEM = TR_BINDING_MODE3; - const pm_char STR_BINDING_9_16_TELEM_OFF[] PROGMEM = TR_BINDING_MODE4; + const pm_char STR_BINDING_1_8_TELEM_ON[] PROGMEM = TR_BINDING_CH1_8_TELEM_ON; + const pm_char STR_BINDING_1_8_TELEM_OFF[] PROGMEM = TR_BINDING_CH1_8_TELEM_OFF; + const pm_char STR_BINDING_9_16_TELEM_ON[] PROGMEM = TR_BINDING_CH9_16_TELEM_ON; + const pm_char STR_BINDING_9_16_TELEM_OFF[] PROGMEM = TR_BINDING_CH9_16_TELEM_OFF; + const pm_char STR_BINDING_25MW_CH1_8_TELEM_OFF[] PROGMEM = TR_BINDING_25MW_CH1_8_TELEM_OFF; + const pm_char STR_BINDING_25MW_CH1_8_TELEM_ON[] PROGMEM = TR_BINDING_25MW_CH1_8_TELEM_ON; + const pm_char STR_BINDING_500MW_CH1_8_TELEM_OFF[] PROGMEM = TR_BINDING_500MW_CH1_8_TELEM_OFF; + const pm_char STR_BINDING_500MW_CH9_16_TELEM_OFF[] PROGMEM = TR_BINDING_500MW_CH9_16_TELEM_OFF; const pm_char STR_CHANNELRANGE[] PROGMEM = TR_CHANNELRANGE; const pm_char STR_ANTENNASELECTION[] PROGMEM = TR_ANTENNASELECTION; const pm_char STR_ANTENNACONFIRM1[] PROGMEM = TR_ANTENNACONFIRM1; @@ -676,6 +682,7 @@ const pm_char STR_BLCOLOR[] PROGMEM = TR_BLCOLOR; const pm_char STR_ADDMAINVIEW[] PROGMEM = TR_ADDMAINVIEW; const pm_char STR_BACKGROUND_COLOR[] PROGMEM = TR_BACKGROUND_COLOR; const pm_char STR_MAIN_COLOR[] PROGMEM = TR_MAIN_COLOR; + const pm_char STR_MULTI_RFPOWER[] PROGMEM = TR_MULTI_RFPOWER; #endif #if defined(CPUARM) diff --git a/radio/src/translations.h b/radio/src/translations.h index d82fe3cfd..0a3851511 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -87,11 +87,11 @@ #if defined(PCBHORUS) #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH #elif defined(PCBX9E) - #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH + #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH #elif defined(PCBTARANIS) && defined(BLUETOOTH) - #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH + #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH #elif defined(PCBTARANIS) - #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY + #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY #elif defined(CPUARM) #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY #endif @@ -219,10 +219,13 @@ extern const pm_char STR_OPEN9X[]; #define OFS_VTRAINERMODES (OFS_VFAILSAFE) #endif #if defined(CPUARM) - #define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES)) - #define OFS_TELEMETRY_PROTOCOLS (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) - #define OFS_XJT_PROTOCOLS (OFS_TELEMETRY_PROTOCOLS + sizeof(TR_TELEMETRY_PROTOCOLS)) - #define OFS_DSM_PROTOCOLS (OFS_XJT_PROTOCOLS + sizeof(TR_XJT_PROTOCOLS)) + #define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES)) + #define OFS_R9M_MODES (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) + #define OFS_R9M_FCC_POWER_VALUES (OFS_R9M_MODES + sizeof(TR_R9M_MODES)) + #define OFS_R9M_LBT_POWER_VALUES (OFS_R9M_FCC_POWER_VALUES + sizeof(TR_R9M_FCC_POWER_VALUES)) + #define OFS_TELEMETRY_PROTOCOLS (OFS_R9M_LBT_POWER_VALUES + sizeof(TR_R9M_LBT_POWER_VALUES)) + #define OFS_XJT_PROTOCOLS (OFS_TELEMETRY_PROTOCOLS + sizeof(TR_TELEMETRY_PROTOCOLS)) + #define OFS_DSM_PROTOCOLS (OFS_XJT_PROTOCOLS + sizeof(TR_XJT_PROTOCOLS)) #if defined(MULTIMODULE) #define OFS_MULTI_PROTOCOLS (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS)) #define OFS_VOLTSRC (OFS_MULTI_PROTOCOLS + sizeof(TR_MULTI_PROTOCOLS)) @@ -348,7 +351,10 @@ extern const pm_char STR_OPEN9X[]; #if defined(CPUARM) #define STR_VTRAINERMODES (STR_OPEN9X + OFS_VTRAINERMODES) #define STR_TARANIS_PROTOCOLS (STR_OPEN9X + OFS_TARANIS_PROTOCOLS) - #define STR_TELEMETRY_PROTOCOLS (STR_OPEN9X + OFS_TELEMETRY_PROTOCOLS) + #define STR_R9M_MODES (STR_OPEN9X + OFS_R9M_MODES) + #define STR_R9M_FCC_POWER_VALUES (STR_OPEN9X + OFS_R9M_FCC_POWER_VALUES) + #define STR_R9M_LBT_POWER_VALUES (STR_OPEN9X + OFS_R9M_LBT_POWER_VALUES) + #define STR_TELEMETRY_PROTOCOLS (STR_OPEN9X + OFS_TELEMETRY_PROTOCOLS) #define STR_XJT_PROTOCOLS (STR_OPEN9X + OFS_XJT_PROTOCOLS) #define STR_DSM_PROTOCOLS (STR_OPEN9X + OFS_DSM_PROTOCOLS) #if defined(MULTIMODULE) @@ -604,7 +610,6 @@ extern const pm_char STR_FAS_OFFSET[]; extern const pm_char STR_MULTI_CUSTOM[]; extern const pm_char STR_MULTI_OPTION[]; extern const pm_char STR_MULTI_VIDFREQ[]; -extern const pm_char STR_MULTI_RFPOWER[]; extern const pm_char STR_MULTI_RFTUNE[]; extern const pm_char STR_MULTI_TELEMETRY[]; extern const pm_char STR_MULTI_AUTOBIND[]; @@ -632,7 +637,7 @@ extern const pm_char STR_RECEIVER[]; extern const pm_char STR_SYNCMENU[]; extern const pm_char STR_INTERNALRF[]; extern const pm_char STR_EXTERNALRF[]; -extern const pm_char STR_SPORT_OUT[]; +extern const pm_char STR_MODULE_TELEMETRY[]; extern const pm_char STR_FAILSAFE[]; extern const pm_char STR_FAILSAFESET[]; extern const pm_char STR_HOLD[]; @@ -920,6 +925,10 @@ extern const pm_char STR_BLCOLOR[]; extern const pm_char STR_BINDING_1_8_TELEM_OFF[]; extern const pm_char STR_BINDING_9_16_TELEM_ON[]; extern const pm_char STR_BINDING_9_16_TELEM_OFF[]; + extern const pm_char STR_BINDING_25MW_CH1_8_TELEM_OFF[]; + extern const pm_char STR_BINDING_25MW_CH1_8_TELEM_ON[]; + extern const pm_char STR_BINDING_500MW_CH1_8_TELEM_OFF[]; + extern const pm_char STR_BINDING_500MW_CH9_16_TELEM_OFF[]; extern const pm_char STR_CHANNELRANGE[]; extern const pm_char STR_ANTENNASELECTION[]; extern const pm_char STR_ANTENNACONFIRM1[]; @@ -932,9 +941,9 @@ extern const pm_char STR_BLCOLOR[]; extern const pm_char STR_RESET_SUBMENU[]; extern const pm_char STR_LOWALARM[]; extern const pm_char STR_CRITICALALARM[]; -extern const pm_char STR_RSSIALARM_WARN[]; -extern const pm_char STR_NO_RSSIALARM[]; -extern const pm_char STR_DISABLE_ALARM[]; + extern const pm_char STR_RSSIALARM_WARN[]; + extern const pm_char STR_NO_RSSIALARM[]; + extern const pm_char STR_DISABLE_ALARM[]; extern const pm_char STR_TELEMETRY_TYPE[]; extern const pm_char STR_TELEMETRY_SENSORS[]; extern const pm_char STR_VALUE[]; @@ -977,6 +986,7 @@ extern const pm_char STR_DISABLE_ALARM[]; extern const pm_char STR_ADDMAINVIEW[]; extern const pm_char STR_BACKGROUND_COLOR[]; extern const pm_char STR_MAIN_COLOR[]; + extern const pm_char STR_MULTI_RFPOWER[]; #endif #if defined(CPUARM) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index a497afea0..25ea63dc9 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -860,17 +860,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetry" +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry") #define TR_DISABLE_INTERNAL TR("Disable int.", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3( "No telemetry", "No MULTI_TELEMETRY", "No MULTI_TELEMETRY detected") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING TR("Bind...","Binding") -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 63e84d688..0e9f93cfb 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -881,17 +881,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetrie" +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetrie" #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index a8c10d648..7f6227dc1 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -864,17 +864,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetry" +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry") #define TR_DISABLE_INTERNAL TR("Disable int.", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3("No telemetry", "No MULTI_TELEMETRY", "No MULTI_TELEMETRY detected") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING TR("Bind...","Binding") -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 5b13a4585..94f4600a5 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -840,17 +840,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetry" -#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry") +#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 41dc85ad4..36c448fd2 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -836,17 +836,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetry" +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 1da19e22f..96da2a918 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -863,17 +863,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Bind auto", INDENT "Bind automatique") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodét.", INDENT "Autodétection") #define TR_MULTI_LOWPOWER TR(INDENT "Basse puis.", INDENT "Mode basse puiss.") -#define TR_SPORT_OUT INDENT "Telemetry" +#define TR_MODULE_TELEMETRY TR(INDENT "Télem. mod.", INDENT "Télémétrie module") #define TR_DISABLE_INTERNAL TR("Désact intRF", "Désact. RF interne") #define TR_MODULE_NO_SERIAL_MODE TR("Mode série?", "Pas en mode série") #define TR_MODULE_NO_INPUT TR("Pas de sign.", "Aucun signal série") #define TR_MODULE_NO_TELEMETRY TR3("Pas de télm.", "Télémétrie absente", "Télémétrie absente(act. MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Bind..." -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Télem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Télem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Télem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Télem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Télem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Télem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Télem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Télem OFF" #define TR_PROTOCOL_INVALID TR("Sél. invalide", "Protocole invalide") #define TR_MODULE_STATUS TR(INDENT "Etat", INDENT "Etat module") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 866eeaa21..19bca4715 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -865,17 +865,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetry" +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index a72d35672..b1a6ab2c0 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -863,17 +863,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetry" +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index c4bb57699..566d802a9 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -867,17 +867,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetry" +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 133eeeab4..7bbbcfac9 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -842,17 +842,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetry" +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index f5060a1ec..b86d6a01c 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -879,17 +879,21 @@ #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") -#define TR_SPORT_OUT INDENT "Telemetry" +#define TR_MODULE_TELEMETRY TR(INDENT "Mod telem.", INDENT "Module telemetry") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_BINDING_MODE1 "Ch1-8 Telem ON" -#define TR_BINDING_MODE2 "Ch1-8 Telem OFF" -#define TR_BINDING_MODE3 "Ch9-16 Telem ON" -#define TR_BINDING_MODE4 "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_OFF "25mW Ch1-8 Telem OFF" +#define TR_BINDING_25MW_CH1_8_TELEM_ON "25mW Ch1-8 Telem ON" +#define TR_BINDING_500MW_CH1_8_TELEM_OFF "500mW Ch1-8 Telem OFF" +#define TR_BINDING_500MW_CH9_16_TELEM_OFF "500mW Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -- 2.11.4.GIT