From 8fd3d50add42dc3881f1e84bc98f8afac7ad4c07 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 22 Nov 2024 12:32:40 +0100 Subject: [PATCH] feat: add support for ExpressLRS optional arming method (#5641) Co-authored-by: elecpower --- .../src/firmwares/edgetx/yaml_moduledata.cpp | 5 ++ companion/src/firmwares/moduledata.cpp | 32 +++++++++++ companion/src/firmwares/moduledata.h | 17 +++++- companion/src/modeledit/setup.cpp | 57 ++++++++++++++++--- companion/src/modeledit/setup.h | 2 +- companion/src/modeledit/setup_module.ui | 19 ++++++- companion/src/modelprinter.cpp | 6 ++ companion/src/translations/companion_cs.ts | 15 +++++ companion/src/translations/companion_da.ts | 15 +++++ companion/src/translations/companion_de.ts | 15 +++++ companion/src/translations/companion_en.ts | 15 +++++ companion/src/translations/companion_es.ts | 15 +++++ companion/src/translations/companion_fi.ts | 15 +++++ companion/src/translations/companion_fr.ts | 15 +++++ companion/src/translations/companion_he.ts | 15 +++++ companion/src/translations/companion_it.ts | 15 +++++ companion/src/translations/companion_ja.ts | 15 +++++ companion/src/translations/companion_nl.ts | 15 +++++ companion/src/translations/companion_pl.ts | 15 +++++ companion/src/translations/companion_pt.ts | 15 +++++ companion/src/translations/companion_ru.ts | 15 +++++ companion/src/translations/companion_sv.ts | 15 +++++ companion/src/translations/companion_zh_CN.ts | 15 +++++ companion/src/translations/companion_zh_TW.ts | 15 +++++ radio/src/dataconstants.h | 7 +++ radio/src/datastructs_private.h | 8 ++- radio/src/gui/128x64/model_setup.cpp | 41 +++++++++++++ radio/src/gui/212x64/model_setup.cpp | 25 ++++++++ .../colorlcd/module/crossfire_settings.cpp | 37 +++++++++++- .../gui/colorlcd/module/crossfire_settings.h | 8 ++- radio/src/gui/gui_common.cpp | 5 ++ radio/src/gui/gui_common.h | 1 + radio/src/pulses/crossfire.cpp | 27 +++++++-- .../storage/yaml/yaml_datastructs_128x64.cpp | 6 +- .../src/storage/yaml/yaml_datastructs_f16.cpp | 6 +- .../storage/yaml/yaml_datastructs_nv14.cpp | 6 +- .../storage/yaml/yaml_datastructs_pl18.cpp | 6 +- .../src/storage/yaml/yaml_datastructs_t15.cpp | 6 +- .../src/storage/yaml/yaml_datastructs_t20.cpp | 6 +- .../storage/yaml/yaml_datastructs_tpro.cpp | 6 +- .../src/storage/yaml/yaml_datastructs_x10.cpp | 6 +- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 6 +- .../yaml/yaml_datastructs_x9dp2019.cpp | 6 +- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 6 +- .../storage/yaml/yaml_datastructs_xlite.cpp | 6 +- .../storage/yaml/yaml_datastructs_xlites.cpp | 6 +- radio/src/telemetry/crossfire.cpp | 11 ++++ radio/src/telemetry/crossfire.h | 7 ++- radio/src/tests/crossfire.cpp | 4 +- radio/src/translations.cpp | 2 + radio/src/translations.h | 2 + radio/src/translations/cn.h | 2 + radio/src/translations/cz.h | 2 + radio/src/translations/da.h | 2 + radio/src/translations/de.h | 2 + radio/src/translations/en.h | 2 + radio/src/translations/es.h | 2 + radio/src/translations/fi.h | 2 + radio/src/translations/fr.h | 2 + radio/src/translations/he.h | 2 + radio/src/translations/it.h | 2 + radio/src/translations/jp.h | 2 + radio/src/translations/nl.h | 2 + radio/src/translations/pl.h | 2 + radio/src/translations/pt.h | 2 + radio/src/translations/ru.h | 2 + radio/src/translations/se.h | 2 + radio/src/translations/tw.h | 2 + radio/src/translations/ua.h | 2 + 69 files changed, 654 insertions(+), 38 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_moduledata.cpp b/companion/src/firmwares/edgetx/yaml_moduledata.cpp index c10e29830..b53c8230d 100644 --- a/companion/src/firmwares/edgetx/yaml_moduledata.cpp +++ b/companion/src/firmwares/edgetx/yaml_moduledata.cpp @@ -23,6 +23,7 @@ #include "yaml_generalsettings.h" #include "eeprominterface.h" #include "rawsource.h" +#include "yaml_rawswitch.h" #include "multiprotocols.h" // type: TYPE_MULTIMODULE @@ -242,6 +243,8 @@ Node convert::encode(const ModuleData& rhs) Node crsf; YamlTelemetryBaudrate br(&rhs.crsf.telemetryBaudrate); crsf["telemetryBaudrate"] = br.value; + crsf["crsfArmingMode"] = rhs.crsf.crsfArmingMode; + crsf["crsfArmingTrigger"] = rhs.crsf.crsfArmingTrigger; mod["crsf"] = crsf; } break; case PULSES_LEMON_DSMP: { @@ -399,6 +402,8 @@ bool convert::decode(const Node& node, ModuleData& rhs) YamlTelemetryBaudrate telemetryBaudrate; crsf["telemetryBaudrate"] >> telemetryBaudrate.value; telemetryBaudrate.toCpn(&rhs.crsf.telemetryBaudrate, getCurrentFirmware()->getBoard()); + crsf["crsfArmingMode"] >> rhs.crsf.crsfArmingMode; + crsf["crsfArmingTrigger"] >> rhs.crsf.crsfArmingTrigger; } else if (mod["dsmp"]) { Node dsmp = mod["dsmp"]; dsmp["flags"] >> rhs.dsmp.flags; diff --git a/companion/src/firmwares/moduledata.cpp b/companion/src/firmwares/moduledata.cpp index 79fac3304..a021d39ba 100644 --- a/companion/src/firmwares/moduledata.cpp +++ b/companion/src/firmwares/moduledata.cpp @@ -770,3 +770,35 @@ AbstractStaticItemModel * ModuleData::afhds3EmiItemModel() mdl->loadItemList(); return mdl; } + +QString ModuleData::crsfArmingModeToString() const +{ + return crsfArmingModeToString(crsf.crsfArmingMode); +} + +// static +QString ModuleData::crsfArmingModeToString(int mode) +{ + switch (mode) { + case CRSF_ARMING_MODE_CH5: + return tr("CH5"); + case CRSF_ARMING_MODE_SWITCH: + return tr("Switch"); + default: + return CPN_STR_UNKNOWN_ITEM; + } +} + +// static +AbstractStaticItemModel * ModuleData::crsfArmingModeItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName(AIM_MODULE_CRSFARMINGMODE); + + for (int i = 0; i < CRSF_ARMING_MODE_COUNT; i++) { + mdl->appendToItemList(crsfArmingModeToString(i), i); + } + + mdl->loadItemList(); + return mdl; +} diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index bc892e4b6..06abd3d09 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -23,9 +23,12 @@ #include "constants.h" #include "radio/src/MultiProtoDefs.h" +#include "rawswitch.h" #include +constexpr char AIM_MODULE_CRSFARMINGMODE[] {"moduledata.crsfArmingMode"}; + class Firmware; class RadioDataConversionState; class AbstractStaticItemModel; @@ -114,6 +117,12 @@ class ModuleData { Q_DECLARE_TR_FUNCTIONS(ModuleData) public: + enum CrsfArmingMode { + CRSF_ARMING_MODE_CH5, + CRSF_ARMING_MODE_SWITCH, + CRSF_ARMING_MODE_COUNT + }; + ModuleData() { clear(); @@ -191,6 +200,8 @@ class ModuleData { struct CRSF { unsigned int telemetryBaudrate; + unsigned int crsfArmingMode; + RawSwitch crsfArmingTrigger; } crsf; struct Access { @@ -203,7 +214,7 @@ class ModuleData { unsigned int flags; } dsmp; - void clear() { memset(this, 0, sizeof(ModuleData)); } + void clear() { memset(reinterpret_cast(this), 0, sizeof(ModuleData)); } void convert(RadioDataConversionState & cstate); bool isPxx2Module() const; bool supportRxNum() const; @@ -234,4 +245,8 @@ class ModuleData { static AbstractStaticItemModel * afhds2aMode2ItemModel(); static AbstractStaticItemModel * afhds3PhyModeItemModel(); static AbstractStaticItemModel * afhds3EmiItemModel(); + + QString crsfArmingModeToString() const; + static QString crsfArmingModeToString(int mode); + static AbstractStaticItemModel * crsfArmingModeItemModel(); }; diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 5ed52cd23..723226891 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -34,11 +34,13 @@ #include -constexpr char FIM_TIMERSWITCH[] {"Timer Switch"}; -constexpr char FIM_THRSOURCE[] {"Throttle Source"}; -// constexpr char FIM_TRAINERMODE[] {"Trainer Mode"}; -constexpr char FIM_ANTENNAMODE[] {"Antenna Mode"}; -constexpr char FIM_HATSMODE[] {"Hats Mode"}; +constexpr char FIM_TIMERSWITCH[] {"Timer Switch"}; +constexpr char FIM_THRSOURCE[] {"Throttle Source"}; +// constexpr char FIM_TRAINERMODE[] {"Trainer Mode"}; +constexpr char FIM_ANTENNAMODE[] {"Antenna Mode"}; +constexpr char FIM_HATSMODE[] {"Hats Mode"}; +constexpr char FIM_CRSFARMSWITCH[] {"CRSF Arming Switch"}; + TimerPanel::TimerPanel(QWidget * parent, ModelData & model, TimerData & timer, GeneralSettings & generalSettings, Firmware * firmware, QWidget * prevFocus, FilteredItemModelFactory * panelFilteredModels, CompoundItemModelFactory * panelItemModels): @@ -230,11 +232,13 @@ void TimerPanel::onModeChanged(int index) #define MASK_CHANNELMAP (1<<20) #define MASK_MULTI_BAYANG_OPT (1<<21) #define MASK_AFHDS (1<<22) +#define MASK_CSRF_ARMING_MODE (1<<23) +#define MASK_CSRF_ARMING_TRIGGER (1<<24) quint8 ModulePanel::failsafesValueDisplayType = ModulePanel::FAILSAFE_DISPLAY_PERCENT; ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & module, GeneralSettings & generalSettings, Firmware * firmware, int moduleIdx, - FilteredItemModelFactory * panelFilteredItemModels): + FilteredItemModelFactory * panelFilteredItemModels, CompoundItemModelFactory * panelItemModels): ModelPanel(parent, model, generalSettings, firmware), module(module), moduleIdx(moduleIdx), @@ -310,6 +314,11 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul ui->registrationId->setText(model.registrationId); + if (panelItemModels) { + ui->crsfArmingMode->setModel(panelItemModels->getItemModel(AIM_MODULE_CRSFARMINGMODE)); + ui->crsfArmingTrigger->setModel(panelFilteredItemModels->getItemModel(FIM_CRSFARMSWITCH)); + } + setupFailsafes(); disableMouseScrolling(); @@ -350,6 +359,21 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul emit modified(); }); + connect(ui->crsfArmingMode, static_cast(&QComboBox::currentIndexChanged), [=] (int index) + { + this->module.crsf.crsfArmingMode = ui->crsfArmingMode->currentData().toInt(); + if (this->module.crsf.crsfArmingMode != ModuleData::CRSF_ARMING_MODE_SWITCH) + this->module.crsf.crsfArmingTrigger = RawSwitch(SWITCH_TYPE_NONE); + update(); + emit modified(); + }); + + connect(ui->crsfArmingTrigger, static_cast(&QComboBox::currentIndexChanged), [=] (int index) + { + this->module.crsf.crsfArmingTrigger = RawSwitch(ui->crsfArmingTrigger->currentData().toInt()); + emit modified(); + }); + lock = false; } @@ -505,10 +529,15 @@ void ModulePanel::update() max_rx_num = 20; break; case PULSES_CROSSFIRE: - mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_BAUDRATE; + mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_BAUDRATE | MASK_CSRF_ARMING_MODE; module.channelsCount = 16; ui->telemetryBaudrate->setModel(ModuleData::telemetryBaudrateItemModel(protocol)); ui->telemetryBaudrate->setField(module.crsf.telemetryBaudrate); + ui->crsfArmingMode->setCurrentIndex(module.crsf.crsfArmingMode); + if (module.crsf.crsfArmingMode == ModuleData::CRSF_ARMING_MODE_SWITCH) { + mask |= MASK_CSRF_ARMING_TRIGGER; + ui->crsfArmingTrigger->setCurrentIndex(ui->crsfArmingTrigger->findData(RawSwitch(module.crsf.crsfArmingTrigger).toValue())); + } break; case PULSES_GHOST: mask |= MASK_CHANNELS_RANGE | MASK_GHOST | MASK_BAUDRATE; @@ -602,6 +631,9 @@ void ModulePanel::update() ui->channelsCount->setMaximum(module.getMaxChannelCount()); ui->channelsCount->setValue(module.channelsCount); ui->channelsCount->setSingleStep(firmware->getCapability(HasPPMStart) ? 1 : 2); + ui->label_crsfArmingMode->setVisible(mask & MASK_CSRF_ARMING_MODE); + ui->crsfArmingMode->setVisible(mask & MASK_CSRF_ARMING_MODE); + ui->crsfArmingTrigger->setVisible(mask & MASK_CSRF_ARMING_TRIGGER); // PPM settings fields ui->label_ppmPolarity->setVisible(mask & MASK_SBUSPPM_FIELDS); @@ -1563,17 +1595,24 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge FIM_TIMERSWITCH); connectItemModelEvents(panelFilteredModels->getItemModel(FIM_TIMERSWITCH)); + panelFilteredModels->registerItemModel(new FilteredItemModel(sharedItemModels->getItemModel(AbstractItemModel::IMID_RawSwitch), + RawSwitch::SpecialFunctionsContext), + FIM_CRSFARMSWITCH); + connectItemModelEvents(panelFilteredModels->getItemModel(FIM_CRSFARMSWITCH)); + panelFilteredModels->registerItemModel(new FilteredItemModel(sharedItemModels->getItemModel(AbstractItemModel::IMID_ThrSource)), FIM_THRSOURCE); connectItemModelEvents(panelFilteredModels->getItemModel(FIM_THRSOURCE)); + panelFilteredModels->registerItemModel(new FilteredItemModel(GeneralSettings::hatsModeItemModel(false)), FIM_HATSMODE); + panelItemModels = new CompoundItemModelFactory(&generalSettings, &model); panelItemModels->registerItemModel(TimerData::countdownBeepItemModel()); panelItemModels->registerItemModel(TimerData::countdownStartItemModel()); panelItemModels->registerItemModel(TimerData::persistentItemModel()); panelItemModels->registerItemModel(TimerData::modeItemModel()); panelItemModels->registerItemModel(TimerData::showElapsedItemModel()); - panelFilteredModels->registerItemModel(new FilteredItemModel(GeneralSettings::hatsModeItemModel(false)), FIM_HATSMODE); + panelItemModels->registerItemModel(ModuleData::crsfArmingModeItemModel()); Board::Type board = firmware->getBoard(); @@ -1807,7 +1846,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge } for (int i = firmware->getCapability(NumFirstUsableModule); i < firmware->getCapability(NumModules); i++) { - modules[i] = new ModulePanel(this, model, model.moduleData[i], generalSettings, firmware, i, panelFilteredModels); + modules[i] = new ModulePanel(this, model, model.moduleData[i], generalSettings, firmware, i, panelFilteredModels, panelItemModels); ui->modulesLayout->addWidget(modules[i]); connect(modules[i], &ModulePanel::modified, this, &SetupPanel::modified); connect(modules[i], &ModulePanel::updateItemModels, this, &SetupPanel::onModuleUpdateItemModels); diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index 0916ac191..a43ffa46b 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -76,7 +76,7 @@ class ModulePanel : public ModelPanel public: ModulePanel(QWidget * parent, ModelData & model, ModuleData & module, GeneralSettings & generalSettings, Firmware * firmware, int moduleIdx, - FilteredItemModelFactory * panelFilteredItemModels = nullptr); + FilteredItemModelFactory * panelFilteredItemModels = nullptr, CompoundItemModelFactory * panelItemModels = nullptr); virtual ~ModulePanel(); virtual void update(); diff --git a/companion/src/modeledit/setup_module.ui b/companion/src/modeledit/setup_module.ui index 51e71f6f9..fcbb98b10 100644 --- a/companion/src/modeledit/setup_module.ui +++ b/companion/src/modeledit/setup_module.ui @@ -7,7 +7,7 @@ 0 0 1075 - 527 + 543 @@ -429,6 +429,23 @@ + + + + Arm using + + + + + + + + + + + + + diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 64b11dbc2..e7460f5ad 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -234,6 +234,12 @@ QString ModelPrinter::printModule(int idx) if (module.protocol == PULSES_GHOST) { str << printLabelValue(tr("Raw 12 bits"), printBoolean(module.ghost.raw12bits, BOOLEAN_YN)); } + if (module.protocol == PULSES_CROSSFIRE) { + str << printLabelValue(tr("Arming mode"), module.crsfArmingModeToString()); + if (module.crsf.crsfArmingMode == ModuleData::CRSF_ARMING_MODE_SWITCH) { + str << printLabelValue(tr("Switch"), RawSwitch(module.crsf.crsfArmingTrigger).toString()); + } + } } } result = str.join(" "); diff --git a/companion/src/translations/companion_cs.ts b/companion/src/translations/companion_cs.ts index 8d2ebef4e..958e1f1fd 100644 --- a/companion/src/translations/companion_cs.ts +++ b/companion/src/translations/companion_cs.ts @@ -10252,6 +10252,21 @@ p, li { white-space: pre-wrap; } Receiver No. Číslo přijímače + + + Arm using + Arm mód + + + + CH5 + CH5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_da.ts b/companion/src/translations/companion_da.ts index 3478781e2..7bd48c3de 100644 --- a/companion/src/translations/companion_da.ts +++ b/companion/src/translations/companion_da.ts @@ -10111,6 +10111,21 @@ p, li { white-space: pre-wrap; } Receiver No. Modtager nummer. + + + Arm using + Aktiver m. + + + + CH5 + KA5 + + + + Switch + Switch + CH diff --git a/companion/src/translations/companion_de.ts b/companion/src/translations/companion_de.ts index a9abc745e..0acafcda2 100644 --- a/companion/src/translations/companion_de.ts +++ b/companion/src/translations/companion_de.ts @@ -10233,6 +10233,21 @@ p, li { white-space: pre-wrap; } Receiver No. Empfänger Nr. + + + Arm using + Armen via + + + + CH5 + CH5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_en.ts b/companion/src/translations/companion_en.ts index 55c2e1a65..1facd70da 100644 --- a/companion/src/translations/companion_en.ts +++ b/companion/src/translations/companion_en.ts @@ -10031,6 +10031,21 @@ p, li { white-space: pre-wrap; } Receiver No. + + + Arm using + Arm using + + + + CH5 + CH5 + + + + Switch + Switch + RF Output Power diff --git a/companion/src/translations/companion_es.ts b/companion/src/translations/companion_es.ts index a85e3a68b..e6eefe640 100644 --- a/companion/src/translations/companion_es.ts +++ b/companion/src/translations/companion_es.ts @@ -10291,6 +10291,21 @@ p, li { white-space: pre-wrap; } Receiver No. Receptor Nº. + + + Arm using + Modo Arm. + + + + CH5 + CH5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_fi.ts b/companion/src/translations/companion_fi.ts index 08d5be949..0d5314b8c 100644 --- a/companion/src/translations/companion_fi.ts +++ b/companion/src/translations/companion_fi.ts @@ -10273,6 +10273,21 @@ p, li { white-space: pre-wrap; } Receiver No. Vastaanotin No. + + + Arm using + Arm using + + + + CH5 + CH5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts index 28fccb375..62bbfe964 100644 --- a/companion/src/translations/companion_fr.ts +++ b/companion/src/translations/companion_fr.ts @@ -10301,6 +10301,21 @@ p, li { white-space: pre-wrap; } Receiver No. Récepteur No. + + + Arm using + Mod. Arm. + + + + CH5 + CH5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_he.ts b/companion/src/translations/companion_he.ts index 565b7e033..41c798900 100644 --- a/companion/src/translations/companion_he.ts +++ b/companion/src/translations/companion_he.ts @@ -10133,6 +10133,21 @@ p, li { white-space: pre-wrap; } Receiver No. + + + Arm using + Arm using + + + + CH5 + ערוץ 5 + + + + Switch + Switch + Low power mode diff --git a/companion/src/translations/companion_it.ts b/companion/src/translations/companion_it.ts index 2f3b87bcb..e4a0be4c4 100644 --- a/companion/src/translations/companion_it.ts +++ b/companion/src/translations/companion_it.ts @@ -10278,6 +10278,21 @@ p, li { white-space: pre-wrap; } Receiver No. Numero Ricev. + + + Arm using + Modo arm + + + + CH5 + CH5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_ja.ts b/companion/src/translations/companion_ja.ts index 843dadc26..c892a5378 100644 --- a/companion/src/translations/companion_ja.ts +++ b/companion/src/translations/companion_ja.ts @@ -10177,6 +10177,21 @@ p, li { white-space: pre-wrap; } Receiver No. 受信機 No. + + + Arm using + アーム ロック解除 + + + + CH5 + CH5 + + + + Switch + Switch + RF Output Power diff --git a/companion/src/translations/companion_nl.ts b/companion/src/translations/companion_nl.ts index ef6c170b6..3977b8761 100644 --- a/companion/src/translations/companion_nl.ts +++ b/companion/src/translations/companion_nl.ts @@ -10138,6 +10138,21 @@ p, li { white-space: pre-wrap; } Receiver No. + + + Arm using + Arm using + + + + CH5 + CH5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_pl.ts b/companion/src/translations/companion_pl.ts index bdd431f2e..2e6859069 100644 --- a/companion/src/translations/companion_pl.ts +++ b/companion/src/translations/companion_pl.ts @@ -10271,6 +10271,21 @@ p, li { white-space: pre-wrap; } Receiver No. Nr odbiornika. + + + Arm using + Arm using + + + + CH5 + KN5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_pt.ts b/companion/src/translations/companion_pt.ts index 6ee2e21ec..972411ca0 100644 --- a/companion/src/translations/companion_pt.ts +++ b/companion/src/translations/companion_pt.ts @@ -10133,6 +10133,21 @@ p, li { white-space: pre-wrap; } Receiver No. + + + Arm using + Armar via + + + + CH5 + CH5 + + + + Switch + Switch + Low power mode diff --git a/companion/src/translations/companion_ru.ts b/companion/src/translations/companion_ru.ts index eedffc4fe..3b7f2601b 100644 --- a/companion/src/translations/companion_ru.ts +++ b/companion/src/translations/companion_ru.ts @@ -10224,6 +10224,21 @@ p, li { white-space: pre-wrap; } Receiver No. Номер приёмника + + + Arm using + Arm режим + + + + CH5 + CH5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_sv.ts b/companion/src/translations/companion_sv.ts index 01f8cda0a..ae7c76d76 100644 --- a/companion/src/translations/companion_sv.ts +++ b/companion/src/translations/companion_sv.ts @@ -10118,6 +10118,21 @@ p, li { white-space: pre-wrap; } Receiver No. Mottagarnummer + + + Arm using + Aktivera m. + + + + CH5 + KA5 + + + + Switch + Switch + CH diff --git a/companion/src/translations/companion_zh_CN.ts b/companion/src/translations/companion_zh_CN.ts index 9c2c84056..0e54f18f3 100644 --- a/companion/src/translations/companion_zh_CN.ts +++ b/companion/src/translations/companion_zh_CN.ts @@ -10361,6 +10361,21 @@ p, li { white-space: pre-wrap; } Receiver No. 接收机编号 [Receiver No.]. + + + Arm using + 解锁类型 + + + + CH5 + CH5 + + + + Switch + Switch + Output type diff --git a/companion/src/translations/companion_zh_TW.ts b/companion/src/translations/companion_zh_TW.ts index e01972b6f..4e27d5c9e 100644 --- a/companion/src/translations/companion_zh_TW.ts +++ b/companion/src/translations/companion_zh_TW.ts @@ -10371,6 +10371,21 @@ p, li { white-space: pre-wrap; } Open Drain 開漏輸出 [Open Drain] + + + Arm using + 解鎖類型 + + + + CH5 + CH5 + + + + Switch + Switch + Push Pull diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 20057eeb9..b36e54a17 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -189,6 +189,13 @@ enum ModuleIndex { SPORT_MODULE = MAX_MODULES }; +enum ArmingMode { + ARMING_MODE_FIRST = 0, + ARMING_MODE_CH5 = ARMING_MODE_FIRST, + ARMING_MODE_SWITCH = 1, + ARMING_MODE_LAST = ARMING_MODE_SWITCH, +}; + enum TrainerMode { TRAINER_MODE_OFF, TRAINER_MODE_MASTER_TRAINER_JACK, diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 717433d19..d47166f7b 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -535,9 +535,13 @@ PACK(struct ModuleData { uint8_t telemetryBaudrate:3; uint8_t spare1:4 SKIP; } ghost); - NOBACKUP(struct { + NOBACKUP(PACK(struct { uint8_t telemetryBaudrate:3; - } crsf); + uint8_t crsfArmingMode:1; + uint8_t spare2:4 SKIP; + int16_t crsfArmingTrigger:10 CUST(r_swtchSrc,w_swtchSrc); + int16_t spare3:6; + }) crsf); NOBACKUP(struct { uint8_t flags; } dsmp); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 90240241d..693e4b685 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -119,6 +119,10 @@ enum MenuModelSetupItems { #if defined(CROSSFIRE) || defined(GHOST) ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE, ITEM_MODEL_SETUP_INTERNAL_MODULE_SERIALSTATUS, + #if defined(CROSSFIRE) + ITEM_MODEL_SETUP_INTERNAL_MODULE_ARMING_MODE, + ITEM_MODEL_SETUP_INTERNAL_MODULE_ARMING_TRIGGER, + #endif #endif #if defined(MULTIMODULE) ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL, @@ -155,6 +159,10 @@ enum MenuModelSetupItems { #if defined(CROSSFIRE) || defined(GHOST) ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SERIALSTATUS, + #if defined(CROSSFIRE) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_MODE, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_TRIGGER, + #endif #endif #if defined(MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL, @@ -268,9 +276,13 @@ static uint8_t VIEWOPT_ROW(uint8_t value) { return expandState.viewOpt ? value : #else #define IF_MODULE_BAUDRATE_ADJUST(module, xxx) (isModuleCrossfire(module) ? (uint8_t)(xxx) : HIDDEN_ROW) #endif +#define IF_MODULE_ARMED(module, xxx) (CRSF_ELRS_MIN_VER(module, 4, 0) ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_MODULE_ARMED_TRIGGER(module, xxx) ((CRSF_ELRS_MIN_VER(module, 4, 0) && g_model.moduleData[module].crsf.crsfArmingMode) ? (uint8_t)(xxx) : HIDDEN_ROW) #else #define IF_MODULE_SYNCED(module, xxx) #define IF_MODULE_BAUDRATE_ADJUST(module, xxx) +#define IF_MODULE_ARMED(module, xxx) +#define IF_MODULE_ARMED_TRIGGER(module, xxx) #endif @@ -471,6 +483,8 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) LABEL(InternalModule), \ MODULE_TYPE_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE */ \ IF_MODULE_SYNCED(INTERNAL_MODULE, 0), /* Sync rate + errors */ \ + IF_MODULE_ARMED(INTERNAL_MODULE, 0), /* Arming Mode */ \ + IF_MODULE_ARMED_TRIGGER(INTERNAL_MODULE, 0),/* Arming Trigger */ \ MULTIMODULE_TYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL */ \ MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \ MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \ @@ -498,6 +512,8 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) MODULE_TYPE_ROWS(EXTERNAL_MODULE), \ IF_MODULE_BAUDRATE_ADJUST(EXTERNAL_MODULE, 0), /* Baudrate */ \ IF_MODULE_SYNCED(EXTERNAL_MODULE, 0), /* Sync rate + errors */ \ + IF_MODULE_ARMED(EXTERNAL_MODULE, 0), /* Arming Mode */ \ + IF_MODULE_ARMED_TRIGGER(EXTERNAL_MODULE, 0), /* Arming TRIGGER */ \ MULTIMODULE_TYPE_ROWS(EXTERNAL_MODULE) /* PROTOCOL */ \ MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) /* SUBTYPE */ \ MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) \ @@ -1410,6 +1426,31 @@ void menuModelSetup(event_t event) break; #endif +#if defined(CROSSFIRE) +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_ARMING_MODE: +#endif +#if defined(HARDWARE_EXTERNAL_MODULE) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_MODE: +#endif + g_model.moduleData[moduleIdx].crsf.crsfArmingMode = + editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_CRSF_ARMING_MODE, STR_CRSF_ARMING_MODES, + g_model.moduleData[moduleIdx].crsf.crsfArmingMode, ARMING_MODE_FIRST, ARMING_MODE_LAST, attr, event, INDENT_WIDTH); + break; + +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_ARMING_TRIGGER: +#endif +#if defined(HARDWARE_EXTERNAL_MODULE) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_TRIGGER: +#endif + lcdDrawTextIndented(y, STR_SWITCH); + drawSwitch(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].crsf.crsfArmingTrigger, attr); + if(attr) + CHECK_INCDEC_SWITCH(event, g_model.moduleData[moduleIdx].crsf.crsfArmingTrigger, SWSRC_FIRST, SWSRC_LAST, EE_MODEL, isSwitchAvailableForArming); + break; +#endif + #if defined(MULTIMODULE) #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL: diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 0082894d8..0feed3cb7 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -125,6 +125,10 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SERIALSTATUS, #endif +#if defined(CROSSFIRE) + ITEM_MODEL_SETUP_ARMING_MODE, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_TRIGGER, +#endif #if defined (MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_DSM_CLONED, @@ -420,9 +424,13 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW() #else #define IF_MODULE_BAUDRATE_ADJUST(module, xxx) (isModuleCrossfire(module) ? (uint8_t)(xxx) : HIDDEN_ROW) #endif +#define IF_MODULE_ARMED(module, xxx) (CRSF_ELRS_MIN_VER(module, 4, 0) ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_MODULE_ARMED_TRIGGER(module, xxx) ((CRSF_ELRS_MIN_VER(module, 4, 0) && g_model.moduleData[module].crsf.crsfArmingMode) ? (uint8_t)(xxx) : HIDDEN_ROW) #else #define IF_MODULE_SYNCED(module, xxx) #define IF_MODULE_BAUDRATE_ADJUST(module, xxx) +#define IF_MODULE_ARMED(module, xxx) +#define IF_MODULE_ARMED_TRIGGER(module, xxx) #endif #if defined(PXX2) @@ -546,6 +554,8 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_TYPE_ROW(), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE IF_MODULE_BAUDRATE_ADJUST(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE IF_MODULE_SYNCED(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_SERIALSTATUS + IF_MODULE_ARMED(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_ARMING_MODE + IF_MODULE_ARMED_TRIGGER(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_ARMING_TRIGGER MULTIMODULE_TYPE_ROW(EXTERNAL_MODULE) // ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL MULTIMODULE_DSM_CLONED_RAW(EXTERNAL_MODULE), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_DSM_CLONED MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) // ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS + ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS @@ -1266,6 +1276,21 @@ void menuModelSetup(event_t event) break; #endif +#if defined(CROSSFIRE) + case ITEM_MODEL_SETUP_ARMING_MODE: + g_model.moduleData[EXTERNAL_MODULE].crsf.crsfArmingMode = + editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_CRSF_ARMING_MODE, STR_CRSF_ARMING_MODES, + g_model.moduleData[EXTERNAL_MODULE].crsf.crsfArmingMode, ARMING_MODE_FIRST, ARMING_MODE_LAST, attr, event, INDENT_WIDTH); + break; + + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_TRIGGER: + lcdDrawTextIndented(y, STR_SWITCH); + drawSwitch(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].crsf.crsfArmingTrigger, attr); + if(attr) + CHECK_INCDEC_SWITCH(event, g_model.moduleData[EXTERNAL_MODULE].crsf.crsfArmingTrigger, SWSRC_FIRST, SWSRC_LAST, EE_MODEL, isSwitchAvailableForArming); + break; +#endif + #if defined(MULTIMODULE) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL: { diff --git a/radio/src/gui/colorlcd/module/crossfire_settings.cpp b/radio/src/gui/colorlcd/module/crossfire_settings.cpp index 1bcd25f3a..575d271ae 100644 --- a/radio/src/gui/colorlcd/module/crossfire_settings.cpp +++ b/radio/src/gui/colorlcd/module/crossfire_settings.cpp @@ -30,7 +30,7 @@ CrossfireSettings::CrossfireSettings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx) : - Window(parent, rect_t{}), md(&g_model.moduleData[moduleIdx]) + Window(parent, rect_t{}), md(&g_model.moduleData[moduleIdx]), moduleIdx(moduleIdx) { FlexGridLayout grid(g); setFlexLayout(); @@ -66,4 +66,39 @@ CrossfireSettings::CrossfireSettings(Window* parent, const FlexGridLayout& g, sprintf(msg, "%d Hz", 1000000 / getMixerSchedulerPeriod()); return std::string(msg); }); + + moduleIdx = moduleIdx; + + auto armingLine = newLine(grid); + lblArmMode = new StaticText(armingLine, rect_t{}, STR_CRSF_ARMING_MODE); + auto box = new Window(armingLine, rect_t{}); + box->padAll(PAD_TINY); + box->setFlexLayout(LV_FLEX_FLOW_ROW, PAD_SMALL); + choArmMode = new Choice(box, rect_t{}, STR_CRSF_ARMING_MODES, 0, 1, GET_SET_DEFAULT(md->crsf.crsfArmingMode)); + choArmSwitch = new SwitchChoice(box, rect_t{}, SWSRC_FIRST, SWSRC_LAST, GET_SET_DEFAULT(md->crsf.crsfArmingTrigger)); + choArmSwitch->setAvailableHandler([=](int sw) { return isSwitchAvailableForArming(sw); }); + + update(); +} + +void CrossfireSettings::update() { + if(CRSF_ELRS_MIN_VER(moduleIdx, 4, 0)) { + lblArmMode->show(); + choArmMode->show(); + + if(md->crsf.crsfArmingMode == ARMING_MODE_SWITCH) + choArmSwitch->show(); + else + choArmSwitch->hide(); + } else { + lblArmMode->hide(); + choArmMode->hide(); + choArmSwitch->hide(); + } +} + +void CrossfireSettings::checkEvents() { + update(); + + Window::checkEvents(); } diff --git a/radio/src/gui/colorlcd/module/crossfire_settings.h b/radio/src/gui/colorlcd/module/crossfire_settings.h index a8878ac05..13685285b 100644 --- a/radio/src/gui/colorlcd/module/crossfire_settings.h +++ b/radio/src/gui/colorlcd/module/crossfire_settings.h @@ -23,14 +23,20 @@ #include "window.h" #include "module_setup.h" +#include "switchchoice.h" struct ModuleData; class CrossfireSettings : public Window, public ModuleOptions { ModuleData* md; + StaticText *lblArmMode; + Choice *choArmMode; + SwitchChoice *choArmSwitch; + uint8_t moduleIdx; - void update() override {} + void checkEvents() override; + void update() override; public: CrossfireSettings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx); diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index d2783cd6a..07553d7ed 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -536,6 +536,11 @@ bool isSwitchAvailableInMixes(int swtch) return isSwitchAvailable(swtch, MixesContext); } +bool isSwitchAvailableForArming(int swtch) +{ + return isSwitchAvailable(swtch, ModelCustomFunctionsContext); +} + #if defined(COLORLCD) bool isSwitch2POSWarningStateAvailable(int state) { diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 29bf3ce28..0cdb5d5c4 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -72,6 +72,7 @@ bool isSwitchAvailable(int swtch, SwitchContext context); bool isSerialModeAvailable(uint8_t port_nr, int mode); bool isSwitchAvailableInLogicalSwitches(int swtch); bool isSwitchAvailableInCustomFunctions(int swtch); +bool isSwitchAvailableForArming(int swtch); bool isSwitchAvailableInMixes(int swtch); bool isPxx2IsrmChannelsCountAllowed(int channels); bool isModuleUsingSport(uint8_t moduleBay, uint8_t moduleType); diff --git a/radio/src/pulses/crossfire.cpp b/radio/src/pulses/crossfire.cpp index 7f9b39ac1..2bcd3c054 100644 --- a/radio/src/pulses/crossfire.cpp +++ b/radio/src/pulses/crossfire.cpp @@ -93,11 +93,21 @@ uint8_t createCrossfireModelIDFrame(uint8_t moduleIdx, uint8_t * frame) } // Range for pulses (channels output) is [-1024:+1024] -uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses) +uint8_t createCrossfireChannelsFrame(uint8_t moduleIdx, uint8_t * frame, int16_t * pulses) { + // + // sends channel data and also communicates commanded armed status in arming mode Switch. + // frame len 24 -> arming mode CH5: module will use channel 5 + // frame len 25 -> arming mode Switch: send commanded armed status in extra byte after channel data + // + ModuleData *md = &g_model.moduleData[moduleIdx]; + + uint8_t armingMode = md->crsf.crsfArmingMode; // 0 = Channel mode, 1 = Switch mode + uint8_t lenAdjust = (armingMode == ARMING_MODE_SWITCH) ? 1 : 0; + uint8_t * buf = frame; *buf++ = MODULE_ADDRESS; - *buf++ = 24; // 1(ID) + 22 + 1(CRC) + *buf++ = 24 + lenAdjust; // 1(ID) + 22(channel data) + (+1 extra byte if Switch mode) + 1(CRC) uint8_t * crc_start = buf; *buf++ = CHANNELS_ID; uint32_t bits = 0; @@ -112,7 +122,14 @@ uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses) bitsavailable -= 8; } } - *buf++ = crc8(crc_start, 23); + + if (armingMode == ARMING_MODE_SWITCH) { + swsrc_t sw = md->crsf.crsfArmingTrigger; + + *buf++ = (sw != SWSRC_NONE) && getSwitch(sw, 0); // commanded armed status in Switch mode + } + + *buf++ = crc8(crc_start, 23 + lenAdjust); return buf - frame; } @@ -152,12 +169,12 @@ static void setupPulsesCrossfire(uint8_t module, uint8_t*& p_buf, if(moduleAlive[module] == false) { // if the module was dead and came back to live, e.g. reset moduleAlive[module] = true; // declare the module as alive moduleState[module].counter = CRSF_FRAME_MODELID; // and send it the modelID again - TRACE("[XF] sending ModelID after module reset"); } } } if (moduleState[module].counter == CRSF_FRAME_MODELID) { + TRACE("[XF] ModelID %d", g_model.header.modelId[module]); p_buf += createCrossfireModelIDFrame(module, p_buf); moduleState[module].counter = CRSF_FRAME_MODELID_SENT; } else if (moduleState[module].counter == CRSF_FRAME_MODELID_SENT && crossfireModuleStatus[module].queryCompleted == false) { @@ -167,7 +184,7 @@ static void setupPulsesCrossfire(uint8_t module, uint8_t*& p_buf, moduleState[module].mode = MODULE_MODE_NORMAL; } else { /* TODO: nChannels */ - p_buf += createCrossfireChannelsFrame(p_buf, channels); + p_buf += createCrossfireChannelsFrame(module, p_buf, channels); } } } diff --git a/radio/src/storage/yaml/yaml_datastructs_128x64.cpp b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp index f98c7c661..5feceb7fe 100644 --- a/radio/src/storage/yaml/yaml_datastructs_128x64.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp @@ -602,6 +602,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -618,7 +622,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_f16.cpp b/radio/src/storage/yaml/yaml_datastructs_f16.cpp index ddb86cc37..f2aee2dc2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_f16.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_f16.cpp @@ -630,6 +630,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -646,7 +650,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index ec06a121a..130b78659 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -627,6 +627,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -643,7 +647,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp index 95f127ea3..e9721f268 100644 --- a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp @@ -627,6 +627,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -643,7 +647,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t15.cpp b/radio/src/storage/yaml/yaml_datastructs_t15.cpp index b14aa2666..4077e9750 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t15.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t15.cpp @@ -630,6 +630,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -646,7 +650,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t20.cpp b/radio/src/storage/yaml/yaml_datastructs_t20.cpp index faf052cf1..33b993a7f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t20.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t20.cpp @@ -603,6 +603,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -619,7 +623,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index 97eedc1dc..2ba8d2f0c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -603,6 +603,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -619,7 +623,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index cf6dab7dc..c4bedbafe 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -629,6 +629,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -645,7 +649,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 36af8afae..3252922cd 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -601,6 +601,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -617,7 +621,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9dp2019.cpp b/radio/src/storage/yaml/yaml_datastructs_x9dp2019.cpp index 9cc689ff7..b75f96910 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9dp2019.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9dp2019.cpp @@ -602,6 +602,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -618,7 +622,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index ee42c3487..5fd70f965 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -602,6 +602,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -618,7 +622,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 6a0d2eb13..6fd277c58 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -601,6 +601,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -617,7 +621,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 03516dab3..67dfc96ba 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -605,6 +605,10 @@ static const struct YamlNode struct_anonymous_11[] = { }; static const struct YamlNode struct_anonymous_12[] = { YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_13[] = { @@ -621,7 +625,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), YAML_END }; diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp index 259c7d4d8..b46c78733 100644 --- a/radio/src/telemetry/crossfire.cpp +++ b/radio/src/telemetry/crossfire.cpp @@ -270,6 +270,17 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer, crossfireModuleStatus[module].major = rxBuffer[14 + nameSize]; crossfireModuleStatus[module].minor = rxBuffer[15 + nameSize]; crossfireModuleStatus[module].revision = rxBuffer[16 + nameSize]; + + ModuleData *md = &g_model.moduleData[module]; + + if(!CRSF_ELRS_MIN_VER(module, 4, 0) && + (md->crsf.crsfArmingMode != ARMING_MODE_CH5 || md->crsf.crsfArmingMode != SWSRC_NONE)) { + md->crsf.crsfArmingMode = ARMING_MODE_CH5; + md->crsf.crsfArmingTrigger = SWSRC_NONE; + + storageDirty(EE_MODEL); + } + crossfireModuleStatus[module].queryCompleted = true; } diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h index e12d9298b..d45c75616 100644 --- a/radio/src/telemetry/crossfire.h +++ b/radio/src/telemetry/crossfire.h @@ -119,8 +119,6 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer, uint8_t rxBufferCount); void crossfireSetDefault(int index, uint8_t id, uint8_t subId); -uint8_t createCrossfireModelIDFrame(uint8_t* frame); - const uint32_t CROSSFIRE_BAUDRATES[] = { 115200, 400000, @@ -158,6 +156,11 @@ const uint8_t CROSSFIRE_FRAME_PERIODS[] = { % DIM(CROSSFIRE_BAUDRATES) #endif +#define CRSF_ELRS_MIN_VER(moduleIdx, maj, min) \ + (crossfireModuleStatus[moduleIdx].isELRS \ + && crossfireModuleStatus[moduleIdx].major >= maj \ + && crossfireModuleStatus[moduleIdx].minor >= min) + #if defined(HARDWARE_INTERNAL_MODULE) #define INT_CROSSFIRE_BR_IDX CROSSFIRE_STORE_TO_INDEX(g_eeGeneral.internalModuleBaudrate) #define INT_CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[INT_CROSSFIRE_BR_IDX] diff --git a/radio/src/tests/crossfire.cpp b/radio/src/tests/crossfire.cpp index 07a91357f..1ed3caa0b 100644 --- a/radio/src/tests/crossfire.cpp +++ b/radio/src/tests/crossfire.cpp @@ -25,7 +25,7 @@ #if defined(CROSSFIRE) -uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses); +uint8_t createCrossfireChannelsFrame(uint8_t moduleIdx, uint8_t * frame, int16_t * pulses); TEST(Crossfire, createCrossfireChannelsFrame) { int16_t pulsesStart[MAX_TRAINER_CHANNELS]; @@ -36,7 +36,7 @@ TEST(Crossfire, createCrossfireChannelsFrame) pulsesStart[i] = -1024 + (2048 / MAX_TRAINER_CHANNELS) * i; } - createCrossfireChannelsFrame(crossfire, pulsesStart); + createCrossfireChannelsFrame(EXTERNAL_MODULE, crossfire, pulsesStart); // TODO check } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index c398a53a6..7f186322a 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -80,6 +80,7 @@ ISTR(AFHDS3_POWERS); ISTR(FLYSKY_PULSE_PROTO); ISTR(FLYSKY_SERIAL_PROTO); ISTR(CURVE_TYPES); +ISTR(CRSF_ARMING_MODES); ISTR(VSENSORTYPES); ISTR(VFORMULAS); ISTR(VPREC); @@ -538,6 +539,7 @@ const char STR_TEMP_CALIB[] = TR_TEMP_CALIB; const char STR_TIME[] = TR_TIME; const char STR_MAXBAUDRATE[] = TR_MAXBAUDRATE; const char STR_BAUDRATE[] = TR_BAUDRATE; +const char STR_CRSF_ARMING_MODE[] = TR_CRSF_ARMING_MODE; const char STR_SAMPLE_MODE[] = TR_SAMPLE_MODE; const char STR_SD_INFO_TITLE[] = TR_SD_INFO_TITLE; const char STR_SD_SPEED[] = TR_SD_SPEED; diff --git a/radio/src/translations.h b/radio/src/translations.h index f0c072272..bbac8bc72 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -825,6 +825,8 @@ extern const char STR_TEMP_CALIB[]; extern const char STR_TIME[]; extern const char STR_MAXBAUDRATE[]; extern const char STR_BAUDRATE[]; +extern const char STR_CRSF_ARMING_MODE[]; +extern const char* const STR_CRSF_ARMING_MODES[]; extern const char STR_SAMPLE_MODE[]; extern const char* const STR_SAMPLE_MODES[]; extern const char STR_BLUETOOTH_BAUDRATE[]; diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 8b843f5ae..fdb16e0e6 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -710,6 +710,8 @@ #define TR_TIME "时间" #define TR_MAXBAUDRATE "最大带宽" #define TR_BAUDRATE "波特率" +#define TR_CRSF_ARMING_MODE "解锁类型" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE "采样模式" #define TR_SAMPLE_MODES "标准","OneBit" #define TR_LOADING "加载中..." diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 7556a6856..49776023c 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -721,6 +721,8 @@ #define TR_TIME "Čas" #define TR_MAXBAUDRATE "Max baudů" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE "Arm mód" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE "Vzorkovací režim" #define TR_SAMPLE_MODES "Normální","OneBit" #define TR_LOADING "Načítání..." diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 387b8a28d..4b06b3a9d 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -714,6 +714,8 @@ #define TR_TIME "Tid" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE TR("Aktiver m.", "Aktiver med") +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE "Måle tilstand" #define TR_SAMPLE_MODES "Normal","EnBit" #define TR_LOADING "Indlæser..." diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index e87ca8b77..79d9d91b5 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -708,6 +708,8 @@ #define TR_TEMP_CALIB "Temp. abgl." #define TR_TIME "Uhrzeit:" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE "Armen via" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_MAXBAUDRATE "Max Baud" #define TR_SAMPLE_MODE "Abtastmodus" #define TR_SAMPLE_MODES "Normal","OneBit" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 629fb8aa6..973f12dea 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -712,6 +712,8 @@ #define TR_TIME "Time" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE "Arm using" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index f0109fbca..b814b8c1f 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -705,6 +705,8 @@ #define TR_TIME "Hora" #define TR_MAXBAUDRATE "Máx bauds" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE TR("Modo Arm.", "Modo Armado") +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE "Modo de muestra" #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 7b66ba3e8..412b1daf2 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -719,6 +719,8 @@ #define TR_TIME "Aika" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE "Arm using" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 288b88bcd..4563daf5c 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -710,6 +710,8 @@ #define TR_TIME "Heure" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE TR("Mod. Arm.", "Mode d'armement") +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE "Mode" #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Chargement..." diff --git a/radio/src/translations/he.h b/radio/src/translations/he.h index ba8c99f42..45f734902 100644 --- a/radio/src/translations/he.h +++ b/radio/src/translations/he.h @@ -713,6 +713,8 @@ #define TR_TIME "זמן" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE "Arm using" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE "Sample Mode" #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "...טוען" diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index 53bd68340..81e8824ca 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -708,6 +708,8 @@ #define TR_TIME "Ora" #define TR_MAXBAUDRATE "Max Bauds" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE TR("Modo arm", "Modo d'armamento") +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE "Modo Semplice" #define TR_SAMPLE_MODES "Normale","OneBit" #define TR_LOADING "Caricamento..." diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index 40d95d9c1..59653809d 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -713,6 +713,8 @@ #define TR_TIME "時間" #define TR_MAXBAUDRATE "最大ボーレート" #define TR_BAUDRATE "ボーレート" +#define TR_CRSF_ARMING_MODE "アーム ロック解除" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE "サンプルモード" #define TR_SAMPLE_MODES "標準","OneBit" #define TR_LOADING "読み込み中..." diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 1c2aba66a..08a6719dc 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -706,6 +706,8 @@ #define TR_TIME "Tijd:" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE "Arm using" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal""OneBit" #define TR_LOADING "Loading..." diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index 440b2156a..163e4f389 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -707,6 +707,8 @@ #define TR_TIME "Czas" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE "Arm using" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Ładowanie..." diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 33ffb894e..b27629221 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -717,6 +717,8 @@ #define TR_TIME "Hora" #define TR_MAXBAUDRATE "Bauds Max" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE TR("Armar via", "Armar usando") +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Carregando..." diff --git a/radio/src/translations/ru.h b/radio/src/translations/ru.h index 6a29ce150..be6f159ca 100644 --- a/radio/src/translations/ru.h +++ b/radio/src/translations/ru.h @@ -716,6 +716,8 @@ #define TR_TIME "Время" #define TR_MAXBAUDRATE "Макс скорость" #define TR_BAUDRATE "Скор пер" +#define TR_CRSF_ARMING_MODE "Arm режим" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE TR("Реж выб","Реж выб") #define TR_SAMPLE_MODES "Обыч","Один бит" #define TR_LOADING "Загрузка..." diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index f8ef3a528..eb42eab63 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -723,6 +723,8 @@ #define TR_TEMP_CALIB "Temp. kalib." #define TR_TIME "Tid" #define TR_BAUDRATE "Baudrate" +#define TR_CRSF_ARMING_MODE TR("Aktivera m.", "Aktivera med") +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_MAXBAUDRATE "Max bauds" #define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 7e3f3504b..e15d27925 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -715,6 +715,8 @@ #define TR_TIME "時間" #define TR_MAXBAUDRATE "最大帶寬" #define TR_BAUDRATE "波特率" +#define TR_CRSF_ARMING_MODE "解鎖類型" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE "採樣模式" #define TR_SAMPLE_MODES "標準","OneBit" #define TR_LOADING "加載中..." diff --git a/radio/src/translations/ua.h b/radio/src/translations/ua.h index 37ca28ba9..b3d54a8b4 100644 --- a/radio/src/translations/ua.h +++ b/radio/src/translations/ua.h @@ -716,6 +716,8 @@ #define TR_TIME "Час" #define TR_MAXBAUDRATE "Max швидкість" #define TR_BAUDRATE "Швидкість" +#define TR_CRSF_ARMING_MODE "Arm using" +#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH #define TR_SAMPLE_MODE TR("Вибірка","Режим вибірки") #define TR_SAMPLE_MODES "Нормальний","OneBit" #define TR_LOADING "Завантаження..."