From 04359757c44ab764978eca272353a090d3ce0661 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 22 May 2023 12:07:29 +0200 Subject: [PATCH] fix: Update built-in Multi-protocol module protocol lists, single source for firmware and cpn (#3435) * - Concentrated Multi protocol definitions into a consistent single source. Actually two .h files, one for the protocol list and names, the other for subtypes and capababilites, see comments in .h files as to why - updated available protocols reflecting 1.3.3.20 (15+ protocols) - fixed Companion always showing f/s and channel map options in model setup disregarding the protocol capability * Following @pfeerick's review: changed heaeders and typos fixed Ubuntu runtime error on assert fixed change of Multi protocol not triggering writing yaml file * corrected copy/paste error * fixed FrSky index juggling * Updated Multiprotocol database to current MPM project status (ref. MPM Multiprotos.ino) - changed protocol name FX816 to FX - added Flysky AFHDS2A options PPM and PPWM SBUS 16ch subtypes "PWM,SB16" and "PPM,SB16 - added V761 option to select TOPRC - added FX options "816" and "620" - added FRSKYR9 option "-- 8ch" * MPM protocol scan excludes some protocols which are not meant to be selected. For Companion and Simualtor (and for radios if there is no MPM connected) this was handled in different places with outdated information. Harmonized and centralized the handling of non-selectabale protocols into the single source for all companion, Simulator and all gui types. * More cleanup: - changed some MPM protocol names to the ones the MPM delivers with MPM protocol scan to harmonize names between CPN/Simulator/radio - added XN2927DUMP and MOULDKG to the list of excluded MPM protocols just like the MPM does with MPM protocol scan - added new option value limits and moved definitions to single source - adapted CPN and radio to use common definitions of option values for all GUI types - moved distributed MPM (as far as possible) to one coherent place under a single #if defined (MULTIMODULE) - fixed option value not reset at change of protocol - some editorial stuff Note: There is still some work to be done on CPN GUI option values. DSM2 servo rates are hard coded, BAYANG telemetry options are only shown by index and not by text as in radio code, AFHDS2A servo update rate is shown as index too which is to no use for users. I'll try to fix all this in the next session, but request to get rid of BAYANG telemetry options translations. It is much easier to define a common string list by using untranslated.h * rebase due to fr.h * resolve merge conflict with main fr.h * more cleanup: - deleted multiple definition of MM_RF_CUSTOM_SELECTED in favor of single source define - bw radios: change to only allow defined protocols rather than a fixed 127 protocols * Changes: - magic sentinel number 0xfe as define - add 10 NN protocol entries for future use of new MPM protocols not yet defined in ETX (still recommend timely ETX maintenance update if MPM releases new firmware) * Changes by @elecpower: - align field labels to radio - change servo update frequency from combo box to spin box with edit only via up/down arrows to stop invalid values being entered via keyboard. Remove frequency list used to populate combo box as only used by Companion. - add validation to module yaml decode checking for unsupported multi protocols and/or multi protocol sub types and if unsupported set module to OFF just to be safe. * Changes: - radio: added validation to module yaml decode checking for unsupported multi protocols and/or multi protocol sub types and if unsupported set module to OFF just to be safe. * CPN: use sentinel define * cpn: Sort multi protocols list (courtesy @elecpower) * fixes #3480 changes: - moved FrSky subtype defines to MultiProtoDefs.h - updated bind_button_driver.cpp * missed replacing one instance of setMultiProtocol() * changes: - editorial change - added multi option to OMP protocol (ref #2713) * rather go for STR_MULTI_RFTUNE because MPM manual talks about RF tune * made XN297_DUMP selectable (available with MPM debug fw only) * corrected merge mistakes --- .../src/firmwares/edgetx/yaml_moduledata.cpp | 119 +------- companion/src/firmwares/moduledata.h | 96 +----- companion/src/firmwares/multiprotocols.cpp | 215 ++------------ companion/src/firmwares/multiprotocols.h | 19 +- companion/src/modeledit/setup.cpp | 127 +++++--- companion/src/modeledit/setup.h | 2 +- companion/src/modeledit/setup_module.ui | 2 +- radio/src/MultiProtoDefs.h | 246 ++++++++++++++++ radio/src/MultiSubtypeDefs.h | 276 ++++++++++++++++++ radio/src/datastructs_private.h | 4 - radio/src/gui/128x64/model_setup.cpp | 4 +- radio/src/gui/212x64/model_setup.cpp | 6 +- radio/src/gui/colorlcd/mpm_settings.cpp | 12 +- radio/src/gui/gui_common.cpp | 171 +---------- radio/src/gui/gui_common.h | 5 - radio/src/io/multi_protolist.cpp | 5 +- radio/src/model_init.cpp | 4 +- radio/src/pulses/modules_constants.h | 100 ------- radio/src/pulses/modules_helpers.h | 233 +++++++-------- .../storage/yaml/yaml_datastructs_funcs.cpp | 16 +- .../targets/taranis/bind_button_driver.cpp | 28 +- radio/src/translations.cpp | 3 +- radio/src/translations.h | 3 +- radio/src/translations/cn.h | 1 - radio/src/translations/cz.h | 1 - radio/src/translations/da.h | 1 - radio/src/translations/de.h | 1 - radio/src/translations/en.h | 1 - radio/src/translations/es.h | 1 - radio/src/translations/fi.h | 1 - radio/src/translations/fr.h | 1 - radio/src/translations/it.h | 1 - radio/src/translations/jp.h | 1 - radio/src/translations/nl.h | 1 - radio/src/translations/pl.h | 1 - radio/src/translations/pt.h | 1 - radio/src/translations/se.h | 1 - radio/src/translations/tw.h | 1 - radio/src/translations/untranslated.h | 12 +- 39 files changed, 814 insertions(+), 909 deletions(-) create mode 100644 radio/src/MultiProtoDefs.h create mode 100644 radio/src/MultiSubtypeDefs.h diff --git a/companion/src/firmwares/edgetx/yaml_moduledata.cpp b/companion/src/firmwares/edgetx/yaml_moduledata.cpp index 9219a586e..8739843c0 100644 --- a/companion/src/firmwares/edgetx/yaml_moduledata.cpp +++ b/companion/src/firmwares/edgetx/yaml_moduledata.cpp @@ -21,8 +21,8 @@ #include "yaml_moduledata.h" #include "yaml_generalsettings.h" #include "eeprominterface.h" -#include "moduledata.h" #include "rawsource.h" +#include "multiprotocols.h" // type: TYPE_MULTIMODULE // subType: 15,2 @@ -105,106 +105,6 @@ static const YamlLookupTable failsafeLut = { { FAILSAFE_RECEIVER, "RECEIVER" }, }; -enum MMRFrskySubtypes { - MM_RF_FRSKY_SUBTYPE_D16, - MM_RF_FRSKY_SUBTYPE_D8, - MM_RF_FRSKY_SUBTYPE_D16_8CH, - MM_RF_FRSKY_SUBTYPE_V8, - MM_RF_FRSKY_SUBTYPE_D16_LBT, - MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH, - MM_RF_FRSKY_SUBTYPE_D8_CLONED, - MM_RF_FRSKY_SUBTYPE_D16_CLONED -}; - -// from radio/src/pulses/multi.cpp -static void convertMultiProtocolToEtx(int *protocol, int *subprotocol) -{ - if (*protocol == 3 && *subprotocol == 0) { - *protocol = MODULE_SUBTYPE_MULTI_FRSKY + 1; - *subprotocol = MM_RF_FRSKY_SUBTYPE_D8; - return; - } - - if (*protocol == 3 && *subprotocol == 1) { - *protocol = MODULE_SUBTYPE_MULTI_FRSKY + 1; - *subprotocol = MM_RF_FRSKY_SUBTYPE_D8_CLONED; - return; - } - - if (*protocol == 25) { - *protocol = MODULE_SUBTYPE_MULTI_FRSKY + 1; - *subprotocol = MM_RF_FRSKY_SUBTYPE_V8; - return; - } - - if (*protocol == 15) { - *protocol = MODULE_SUBTYPE_MULTI_FRSKY + 1; - - if (*subprotocol == 0) - *subprotocol = MM_RF_FRSKY_SUBTYPE_D16; - else if (*subprotocol == 1) - *subprotocol = MM_RF_FRSKY_SUBTYPE_D16_8CH; - else if (*subprotocol == 2) - *subprotocol = MM_RF_FRSKY_SUBTYPE_D16_LBT; - else if (*subprotocol == 3) - *subprotocol = MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH; - else if (*subprotocol == 4) - *subprotocol = MM_RF_FRSKY_SUBTYPE_D16_CLONED; - - return; - } - - if (*protocol >= 25) - *protocol -= 1; - - if (*protocol >= 16) - *protocol -= 1; -} - -void convertEtxProtocolToMulti(int *protocol, int *subprotocol) -{ - // Special treatment for the FrSky entry... - if (*protocol == MODULE_SUBTYPE_MULTI_FRSKY + 1) { - if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D8) { - //D8 - *protocol = 3; - *subprotocol = 0; - } - else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D8_CLONED) { - //D8 - *protocol = 3; - *subprotocol = 1; - } - else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_V8) { - //V8 - *protocol = 25; - *subprotocol = 0; - } - else { - *protocol = 15; - if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16_8CH) - *subprotocol = 1; - else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16) - *subprotocol = 0; // D16 - else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16_LBT) - *subprotocol = 2; - else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH) - *subprotocol = 3; - else - *subprotocol = 4; // D16_CLONED - } - } - else { - // 15 for Multimodule is FrskyX or D16 which we map as a protocol of 3 (FrSky) - // all protos > frskyx are therefore also off by one - if (*protocol >= 15) - *protocol += 1; - // 25 is again a FrSky *protocol (FrskyV) so shift again - if (*protocol >= 25) - *protocol += 1; - } -} - static int exportPpmDelay(int delay) { return (delay - 300) / 50; } static int importPpmDelay(int delay) { return 300 + 50 * delay; } @@ -251,7 +151,6 @@ Node convert::encode(const ModuleData& rhs) case PULSES_MULTIMODULE: { int rfProtocol = rhs.multi.rfProtocol + 1; int subType = rhs.subType; - convertEtxProtocolToMulti(&rfProtocol, &subType); std::string st_str = std::to_string(rfProtocol); st_str += ","; st_str += std::to_string(subType); @@ -380,7 +279,6 @@ bool convert::decode(const Node& node, ModuleData& rhs) int rfProtocol = std::stoi(st_str, &pos); st_str = st_str.substr(pos + 1); int rfSubType = std::stoi(st_str); - convertMultiProtocolToEtx(&rfProtocol, &rfSubType); if (rfProtocol > 0) { rhs.multi.rfProtocol = rfProtocol - 1; rhs.subType = rfSubType; @@ -456,6 +354,21 @@ bool convert::decode(const Node& node, ModuleData& rhs) } } + // perform integrity checks and fix-ups + + if (rhs.protocol == PULSES_MULTIMODULE) { + if (rhs.multi.rfProtocol > MODULE_SUBTYPE_MULTI_LAST) { + qDebug() << "Multi protocol:" << rhs.multi.rfProtocol << "exceeds supported protocols. Module set to: OFF"; + rhs.clear(); + const auto & pdef = multiProtocols.getProtocol(rhs.multi.rfProtocol); + if (rhs.subType >= pdef.numSubTypes()) { + qDebug() << "Multi protocol sub-type:" << rhs.subType << "exceeds number of supported sub-types. Module set to: OFF"; + rhs.clear(); + } + } + } + + return true; } } diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index 4d927c01f..a47ab2bb9 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -21,6 +21,7 @@ #pragma once #include "constants.h" +#include "radio/src/MultiProtoDefs.h" #include @@ -88,101 +89,6 @@ enum PulsesProtocol { PULSES_PROTOCOL_LAST }; -enum MultiModuleRFProtocols { - MODULE_SUBTYPE_MULTI_FLYSKY=0, - MODULE_SUBTYPE_MULTI_FIRST=MODULE_SUBTYPE_MULTI_FLYSKY, - MODULE_SUBTYPE_MULTI_HUBSAN, - MODULE_SUBTYPE_MULTI_FRSKY, - MODULE_SUBTYPE_MULTI_HISKY, - MODULE_SUBTYPE_MULTI_V2X2, - MODULE_SUBTYPE_MULTI_DSM2, - MODULE_SUBTYPE_MULTI_DEVO, - MODULE_SUBTYPE_MULTI_YD717, - MODULE_SUBTYPE_MULTI_KN, - MODULE_SUBTYPE_MULTI_SYMAX, - MODULE_SUBTYPE_MULTI_SLT, - MODULE_SUBTYPE_MULTI_CX10, - MODULE_SUBTYPE_MULTI_CG023, - MODULE_SUBTYPE_MULTI_BAYANG, - MODULE_SUBTYPE_MULTI_ESky, - MODULE_SUBTYPE_MULTI_MT99XX, - MODULE_SUBTYPE_MULTI_MJXQ, - MODULE_SUBTYPE_MULTI_SHENQI, - MODULE_SUBTYPE_MULTI_FY326, - MODULE_SUBTYPE_MULTI_FUTABA, - MODULE_SUBTYPE_MULTI_J6PRO, - MODULE_SUBTYPE_MULTI_FQ777, - MODULE_SUBTYPE_MULTI_ASSAN, - MODULE_SUBTYPE_MULTI_HONTAI, - MODULE_SUBTYPE_MULTI_OLRS, - MODULE_SUBTYPE_MULTI_FS_AFHDS2A, - MODULE_SUBTYPE_MULTI_Q2X2, - MODULE_SUBTYPE_MULTI_WK_2X01, - MODULE_SUBTYPE_MULTI_Q303, - MODULE_SUBTYPE_MULTI_GW008, - MODULE_SUBTYPE_MULTI_DM002, - MODULE_SUBTYPE_MULTI_CABELL, - MODULE_SUBTYPE_MULTI_ESKY150, - MODULE_SUBTYPE_MULTI_H83D, - MODULE_SUBTYPE_MULTI_CORONA, - MODULE_SUBTYPE_MULTI_CFLIE, - MODULE_SUBTYPE_MULTI_HITEC, - MODULE_SUBTYPE_MULTI_WFLY, - MODULE_SUBTYPE_MULTI_BUGS, - MODULE_SUBTYPE_MULTI_BUGS_MINI, - MODULE_SUBTYPE_MULTI_TRAXXAS, - MODULE_SUBTYPE_MULTI_NCC1701, - MODULE_SUBTYPE_MULTI_E01X, - MODULE_SUBTYPE_MULTI_V911S, - MODULE_SUBTYPE_MULTI_GD00X, - MODULE_SUBTYPE_MULTI_V761, - MODULE_SUBTYPE_MULTI_KF606, - MODULE_SUBTYPE_MULTI_REDPINE, - MODULE_SUBTYPE_MULTI_POTENSIC, - MODULE_SUBTYPE_MULTI_ZSX, - MODULE_SUBTYPE_MULTI_HEIGHT, - MODULE_SUBTYPE_MULTI_SCANNER, - MODULE_SUBTYPE_MULTI_FRSKYX_RX, - MODULE_SUBTYPE_MULTI_AFHDS2A_RX, - MODULE_SUBTYPE_MULTI_HOTT, - MODULE_SUBTYPE_MULTI_FX816, - MODULE_SUBTYPE_MULTI_BAYANG_RX, - MODULE_SUBTYPE_MULTI_PELIKAN, - MODULE_SUBTYPE_MULTI_TIGER, - MODULE_SUBTYPE_MULTI_XK, - MODULE_SUBTYPE_MULTI_XN297DUMP, - MODULE_SUBTYPE_MULTI_FRSKYX2, - MODULE_SUBTYPE_MULTI_FRSKY_R9, - MODULE_SUBTYPE_MULTI_PROPEL, - MODULE_SUBTYPE_MULTI_FRSKYL, - MODULE_SUBTYPE_MULTI_SKYARTEC, - MODULE_SUBTYPE_MULTI_ESKY150V2, - MODULE_SUBTYPE_MULTI_DSM_RX, - MODULE_SUBTYPE_MULTI_JJRC345, - MODULE_SUBTYPE_MULTI_Q90C, - MODULE_SUBTYPE_MULTI_KYOSHO, - MODULE_SUBTYPE_MULTI_RLINK, - MODULE_SUBTYPE_MULTI_ELRS, - MODULE_SUBTYPE_MULTI_REALACC, - MODULE_SUBTYPE_MULTI_OMP, - MODULE_SUBTYPE_MULTI_MLINK, - MODULE_SUBTYPE_MULTI_WFLY2, - MODULE_SUBTYPE_MULTI_E016HV2, - MODULE_SUBTYPE_MULTI_E010R5, - MODULE_SUBTYPE_MULTI_LOLI, - MODULE_SUBTYPE_MULTI_E129, - MODULE_SUBTYPE_MULTI_JOYSWAY, - MODULE_SUBTYPE_MULTI_E016H, - MODULE_SUBTYPE_MULTI_CONFIG, - MODULE_SUBTYPE_MULTI_IKEAANSLUTA, - MODULE_SUBTYPE_MULTI_WILLIFM, - MODULE_SUBTYPE_MULTI_LOSI, - MODULE_SUBTYPE_MULTI_MOULDKG, - MODULE_SUBTYPE_MULTI_XERALL, - MODULE_SUBTYPE_MULTI_MT99XX2, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_MT99XX2 -}; - enum ModuleSubtypeR9M { MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_EU, diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index 6a3f4bb99..1e4064c3e 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -22,216 +22,51 @@ #include "multiprotocols.h" #include "radiodata.h" +#include "compounditemmodels.h" -#define STR_MULTI_SUBTYPE QT_TRANSLATE_NOOP("Multiprotocols", "Subtype") -#define STR_MULTI_VIDFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Video TX frequency") -#define STR_MULTI_RFTUNE QT_TRANSLATE_NOOP("Multiprotocols", "CC2500 frequency fine tune") -#define STR_MULTI_RFPOWER QT_TRANSLATE_NOOP("Multiprotocols", "RF power") -#define STR_MULTI_TELEMETRY QT_TRANSLATE_NOOP("Multiprotocols", "Telemetry") -#define STR_MULTI_SERVOFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Servo output frequency") -#define STR_MULTI_OPTION QT_TRANSLATE_NOOP("Multiprotocols", "Option value") -#define STR_MULTI_FIXEDID QT_TRANSLATE_NOOP("Multiprotocols", "Fixed ID value") -#define STR_MULTI_MAX_THROW QT_TRANSLATE_NOOP("Multiprotocols", "Enable Max Throw") -#define STR_MULTI_RFCHAN QT_TRANSLATE_NOOP("Multiprotocols", "RF Channel Number") -#define STR_MULTI_DEFAULT QT_TRANSLATE_NOOP("Multiprotocols", "DEFAULT") - -static const QStringList STR_SUBTYPE_CUSTOM ({ - STR_MULTI_SUBTYPE " 0", STR_MULTI_SUBTYPE " 1", STR_MULTI_SUBTYPE " 2", STR_MULTI_SUBTYPE " 3", - STR_MULTI_SUBTYPE " 4", STR_MULTI_SUBTYPE " 5", STR_MULTI_SUBTYPE " 6", STR_MULTI_SUBTYPE " 7" - }); -static const QStringList STR_SUBTYPE_FLYSKY {"Standard", "V9x9", "V6x6", "V912", "CX20"}; -static const QStringList STR_SUBTYPE_HUBSAN {"H107", "H301", "H501"}; -static const QStringList STR_SUBTYPE_FRSKY {"D16", "D8", "D16 8ch", "V8", "D16 EU-LBT", "D16 EU-LBT 8ch", "D8 Cloned", "D16 Cloned"}; -static const QStringList STR_SUBTYPE_HISKY {"Standard", "HK310"}; -static const QStringList STR_SUBTYPE_V2X2 {"Standard", "JXD506", "MR101"}; -static const QStringList STR_SUBTYPE_DSM {"DSM2 1F", "DSM2 2F", "DSMX 1F", "DSMX 2F", "Auto", "DSMR 1F"}; -static const QStringList STR_SUBTYPE_DEVO {"8 Channel", "10 Channel", "12 Channel", "6 Channel", "7 Channel"}; -static const QStringList STR_SUBTYPE_YD717 {"Standard", "Skywalker", "Syma X4", "XINXUN", "NIHUI"}; -static const QStringList STR_SUBTYPE_KN {"WLtoys", "FeiLun"}; -static const QStringList STR_SUBTYPE_SYMAX {"Standard", "Syma X5C"}; -static const QStringList STR_SUBTYPE_SLT {"V1 (6 Channel)", "V2 (8 Channel)", "Q100", "Q200", "MR100"}; -static const QStringList STR_SUBTYPE_CX10 {"Green", "Blue", "DM007", "-", "JC3015a", "JC3015b", "MK33041"}; -static const QStringList STR_SUBTYPE_CG023 {"Standard", "YD829"}; -static const QStringList STR_SUBTYPE_BAYANG {"Standard", "H8S3D", "X16 AH", "IRDRONE", "DHD D4", "QX100"}; -static const QStringList STR_SUBTYPE_ESky {"Standard", "ET4"}; -static const QStringList STR_SUBTYPE_MT99 {"MT99", "H7", "YZ", "LS", "FY805", "A180", "Dragon", "F949G"}; -static const QStringList STR_SUBTYPE_MJXQ {"WLH08", "X600", "X800", "H26D", "E010", "H26WH", "Phoenix"}; -static const QStringList STR_SUBTYPE_FY326 {"Standard", "FY319"}; -static const QStringList STR_SUBTYPE_FUTABA {"SFHSS"}; -static const QStringList STR_SUBTYPE_HONTAI {"Standard", "JJRC X1", "X5C1 Clone", "FQ777_951"}; -static const QStringList STR_SUBTYPE_AFHDS2A {"PWM and IBUS", "PPM and IBUS", "PWM and SBUS", "PPM and SBUS", "PWM and IBUS16", "PPM and IBUS16"}; -static const QStringList STR_SUBTYPE_Q2X2 {"Q222", "Q242", "Q282"}; -static const QStringList STR_SUBTYPE_WK2x01 {"WK2801", "WK2401", "W6_5_1", "W6_6_1", "W6_HEL", "W6_HEL_I"}; -static const QStringList STR_SUBTYPE_Q303 {"Standard", "CX35", "CX10D", "CX10WD"}; -static const QStringList STR_SUBTYPE_CABELL {"Cabell V3", "Cab V3 Telem", "-", "-", "-", "-", "Set FailSafe", "Unbind"}; -static const QStringList STR_SUBTYPE_ESKY150 {"4 Channel", "7 Channel"}; -static const QStringList STR_SUBTYPE_H83D {"H8 Mini 3D", "H20H", "H20 Mini", "H30 Mini"}; -static const QStringList STR_SUBTYPE_CORONA {"Corona V1", "Corona V2", "Flydream V3"}; -static const QStringList STR_SUBTYPE_HITEC {"Optima", "Optima Hub Telem", "Minima"}; -static const QStringList STR_SUBTYPE_WFLY {"WFR0x"}; -static const QStringList STR_SUBTYPE_BUGS_MINI {"Standard", "Bugs 3H"}; -static const QStringList STR_SUBTYPE_TRAXXAS {"6519 RX"}; -static const QStringList STR_SUBTYPE_E01X {"E012", "E015"}; -static const QStringList STR_SUBTYPE_V911S {"Standard", "E119"}; -static const QStringList STR_SUBTYPE_GD00X {"GD V1", "GD V2"}; -static const QStringList STR_SUBTYPE_V761 {"3 Channel", "4 Channel"}; -static const QStringList STR_SUBTYPE_KF606 {"Standard", "MIG320"}; -static const QStringList STR_SUBTYPE_REDPINE {"Fast", "Slow"}; -static const QStringList STR_SUBTYPE_POTENSIC {"A20 Firefly"}; -static const QStringList STR_SUBTYPE_ZSX {"JJRC ZSX-280"}; -static const QStringList STR_SUBTYPE_HEIGHT {"5 Channel", "8 Channel"}; -static const QStringList STR_SUBTYPE_FRSKYX_RX {"RX", "Clone TX"}; -static const QStringList STR_SUBTYPE_HOTT {"Sync", "No_Sync"}; -static const QStringList STR_SUBTYPE_FX816 {"P38"}; -static const QStringList STR_SUBTYPE_PELIKAN {"Pro", "Lite", "SCX24"}; -static const QStringList STR_SUBTYPE_XK {"X450", "X420"}; -static const QStringList STR_SUBTYPE_XN297DUMP {"250K", "1M", "2M", "AUTO", "NRF","CC2500"}; -static const QStringList STR_SUBTYPE_FRSKYX2 {"D16", "D16 8ch", "D16 EU-LBT", "D16 EU-LBT 8ch", "Cloned", "Cloned 8ch"}; -static const QStringList STR_SUBTYPE_FRSKYR9 {"915 MHz", "868 MHz", "915 MHz 8-Channel", "868 MHz 8-Channel", "FCC", "---", "FCC 8-Channel"}; -static const QStringList STR_SUBTYPE_PROPEL {"74-Z"}; -static const QStringList STR_SUBTYPE_FRSKYL {"LR12", "LR12 6-Channel"}; -static const QStringList STR_SUBTYPE_ESKY150V2 {"150 V2"}; -static const QStringList STR_SUBTYPE_JJRC345 {"Standard", "SkyTumbler"}; -static const QStringList STR_SUBTYPE_KYOSHO {"FHSS", "Hype"}; -static const QStringList STR_SUBTYPE_RLINK {"Surface", "Air", "DumboRC"}; -static const QStringList STR_SUBTYPE_ELRS {"Not Available WIP"}; -static const QStringList STR_SUBTYPE_REALACC {"R11"}; -static const QStringList STR_SUBTYPE_WFLY2 {"RF20x"}; -static const QStringList STR_SUBTYPE_MOULDKG {"Analog", "Digital"}; -static const QStringList STR_SUBTYPE_MT992 {"PA18"}; - -static const QStringList NO_SUBTYPE {STR_MULTI_DEFAULT}; - - -// Table is designed to be shared with gui_common_arm.cpp - -const Multiprotocols multiProtocols { - {MODULE_SUBTYPE_MULTI_FLYSKY, 4, false, STR_SUBTYPE_FLYSKY, nullptr}, - {MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ}, - {MODULE_SUBTYPE_MULTI_FRSKY, 7, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HISKY, 1, false, STR_SUBTYPE_HISKY, nullptr}, - {MODULE_SUBTYPE_MULTI_V2X2, 2, false, STR_SUBTYPE_V2X2, nullptr}, - {MODULE_SUBTYPE_MULTI_DSM2, 5, false, STR_SUBTYPE_DSM, STR_MULTI_MAX_THROW}, - {MODULE_SUBTYPE_MULTI_DEVO, 4, false, STR_SUBTYPE_DEVO, STR_MULTI_FIXEDID}, - {MODULE_SUBTYPE_MULTI_YD717, 4, false, STR_SUBTYPE_YD717, nullptr}, - {MODULE_SUBTYPE_MULTI_KN, 1, false, STR_SUBTYPE_KN, nullptr}, - {MODULE_SUBTYPE_MULTI_SYMAX, 1, false, STR_SUBTYPE_SYMAX, nullptr}, - {MODULE_SUBTYPE_MULTI_SLT, 4, false, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_CX10, 6, false, STR_SUBTYPE_CX10, nullptr}, - {MODULE_SUBTYPE_MULTI_CG023, 1, false, STR_SUBTYPE_CG023, nullptr}, - {MODULE_SUBTYPE_MULTI_BAYANG, 5, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, - {MODULE_SUBTYPE_MULTI_ESky, 1, false, STR_SUBTYPE_ESky, nullptr}, - {MODULE_SUBTYPE_MULTI_MT99XX, 7, false, STR_SUBTYPE_MT99, nullptr}, - {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, STR_SUBTYPE_MJXQ, nullptr}, - {MODULE_SUBTYPE_MULTI_FY326, 1, false, STR_SUBTYPE_FY326, nullptr}, - {MODULE_SUBTYPE_MULTI_FUTABA, 0, true, STR_SUBTYPE_FUTABA, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_J6PRO, 0, false, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_HONTAI, 3, false, STR_SUBTYPE_HONTAI, nullptr}, - {MODULE_SUBTYPE_MULTI_OLRS, 0, false, NO_SUBTYPE, STR_MULTI_RFPOWER}, - {MODULE_SUBTYPE_MULTI_FS_AFHDS2A, 5, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ}, - {MODULE_SUBTYPE_MULTI_Q2X2, 2, false, STR_SUBTYPE_Q2X2, nullptr}, - {MODULE_SUBTYPE_MULTI_WK_2X01, 5, false, STR_SUBTYPE_WK2x01, nullptr}, - {MODULE_SUBTYPE_MULTI_Q303, 3, false, STR_SUBTYPE_Q303, nullptr}, - {MODULE_SUBTYPE_MULTI_CABELL, 7, false, STR_SUBTYPE_CABELL, STR_MULTI_OPTION}, - {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, STR_SUBTYPE_ESKY150, nullptr}, - {MODULE_SUBTYPE_MULTI_H83D, 3, false, STR_SUBTYPE_H83D, nullptr}, - {MODULE_SUBTYPE_MULTI_CORONA, 2, false, STR_SUBTYPE_CORONA, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HITEC, 2, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_WFLY, 0, false, STR_SUBTYPE_WFLY, nullptr}, - {MODULE_SUBTYPE_MULTI_BUGS_MINI, 1, false, STR_SUBTYPE_BUGS_MINI, nullptr}, - {MODULE_SUBTYPE_MULTI_TRAXXAS, 0, false, STR_SUBTYPE_TRAXXAS, nullptr}, - {MODULE_SUBTYPE_MULTI_E01X, 1, false, STR_SUBTYPE_E01X, nullptr}, - {MODULE_SUBTYPE_MULTI_V911S, 1, false, STR_SUBTYPE_V911S, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_GD00X, 1, false, STR_SUBTYPE_GD00X, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_V761, 1, false, STR_SUBTYPE_V761, nullptr}, - {MODULE_SUBTYPE_MULTI_KF606, 1, false, STR_SUBTYPE_KF606, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_POTENSIC, 0, false, STR_SUBTYPE_POTENSIC, nullptr}, - {MODULE_SUBTYPE_MULTI_ZSX, 0, false, STR_SUBTYPE_ZSX, nullptr}, - {MODULE_SUBTYPE_MULTI_HEIGHT, 1, false, STR_SUBTYPE_HEIGHT, nullptr}, - {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 1, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HOTT, 1, true, STR_SUBTYPE_HOTT, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr}, - {MODULE_SUBTYPE_MULTI_PELIKAN, 2, false, STR_SUBTYPE_PELIKAN, nullptr}, - {MODULE_SUBTYPE_MULTI_XK, 1, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_XN297DUMP, 5, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN}, - {MODULE_SUBTYPE_MULTI_FRSKYX2, 5, true, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_FRSKY_R9, 6, true, STR_SUBTYPE_FRSKYR9, nullptr}, - {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, STR_SUBTYPE_PROPEL, nullptr}, - {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_JJRC345, 1, false, STR_SUBTYPE_JJRC345, nullptr}, - {MODULE_SUBTYPE_MULTI_Q90C, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_KYOSHO, 1, false, STR_SUBTYPE_KYOSHO, nullptr}, - {MODULE_SUBTYPE_MULTI_RLINK, 2, false, STR_SUBTYPE_RLINK, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_ELRS, 0, false, STR_SUBTYPE_ELRS, nullptr}, - {MODULE_SUBTYPE_MULTI_REALACC, 0, false, STR_SUBTYPE_REALACC, nullptr}, - {MODULE_SUBTYPE_MULTI_OMP, 0, false, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_MLINK, 0, true, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_WFLY2, 0, false, STR_SUBTYPE_WFLY2, STR_MULTI_OPTION}, - {MODULE_SUBTYPE_MULTI_E016HV2, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_LOLI, 0, true, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_MOULDKG, 1, false, STR_SUBTYPE_MOULDKG, STR_MULTI_OPTION}, - {MODULE_SUBTYPE_MULTI_XERALL, 0, false, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_MT99XX2, 0, false, STR_SUBTYPE_MT992, nullptr}, - {MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION}, - - // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) - { 0xfe, 0, false, NO_SUBTYPE, nullptr} -}; - -int Multiprotocols::MultiProtocolDefinition::getOptionMin() const { - if (optionsstr == STR_MULTI_RFPOWER) - return -1; - else if (optionsstr == STR_MULTI_SERVOFREQ) - return 0; - else - return -128; -} - -int Multiprotocols::MultiProtocolDefinition::getOptionMax() const { - if (optionsstr == STR_MULTI_RFPOWER) - return 7; - else if (optionsstr == STR_MULTI_SERVOFREQ) - return 70; - else - return 127; -} +#define CPN +#include "radio/src/MultiSubtypeDefs.h" +#undef CPN const Multiprotocols::MultiProtocolDefinition & Multiprotocols::getProtocol(int protocol) const { for (const Multiprotocols::MultiProtocolDefinition & proto: protocols) if (proto.protocol == protocol) return proto; - // Protocol not found, return the default (last) proto - Q_ASSERT(protocols.rbegin()->protocol == 0xfe); + // Protocol not found, return the sentinel proto + Q_ASSERT(protocols.rbegin()->protocol == MODULE_SUBTYPE_MULTI_SENTINEL); return *protocols.rbegin(); } // static -QString Multiprotocols::protocolToString(int protocol, bool custom) +QString Multiprotocols::protocolToString(int protocol) { - static const QStringList strings({ - "FlySky", "Hubsan", "FrSky", "Hisky", "V2x2", "DSM", "Devo", "YD717", "KN", "SymaX", "SLT", "CX10", "CG023", - "Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "Futaba", "J6 PRO","FQ777","Assan","Hontai","Open LRS", - "FlySky AFHDS2A", "Q2x2", "WK2x01", "Q303", "GW008", "DM002", "Cabell", "ESky 150", "H8 3D", "Corona", "CFlie", - "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "WL Heli V911S", "GD00X", "Volantex V761", - "KFPlan KF606", "Redpine", "Potensic", "ZSX", "Height", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816", - "Bayang RX", "Pelikan", "Tiger", "XK", "XN297 Dump", "FrSky X 2.1", "FrSky R9", "Propel", "FrSky L", "Skyartec", - "ESky 150v2", "DSM RX", "JJRC345", "Q90C", "Kyosho", "RadioLink", "ExpressLRS", "Realacc", "OMP", "M-Link", "Wfly 2", - "Eachine E016H v2", "E010 R5", "Loli 3", "Eachine E129", "Joysway", "Eachine E016H", "Config", "IKEA Ansluta", "WilliFM", - "LOSI", "Mould King", "Xerall", "MT99XX2" - }); + static const QStringList strings { PROTO_NAMES }; return strings.value(protocol, CPN_STR_UNKNOWN_ITEM); } // static -QString Multiprotocols::subTypeToString(int protocol, unsigned subType) +QString Multiprotocols::subTypeToString(int protocol, unsigned int subType) { if (protocol > MODULE_SUBTYPE_MULTI_LAST) return tr(qPrintable(QString::number(subType))); else return tr(qPrintable(multiProtocols.getProtocol(protocol).subTypeStrings.value(subType, CPN_STR_UNKNOWN_ITEM))); } + +// static +AbstractStaticItemModel * Multiprotocols::protocolItemModel() +{ + AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); + mdl->setName("multiprotocols.protocol"); + + for (int i = 0; i <= MODULE_SUBTYPE_MULTI_LAST; i++) { + if (isMultiProtocolSelectable(i)) + mdl->appendToItemList(protocolToString(i), i); + } + + mdl->loadItemList(); + mdl->sort(0); + return mdl; +} diff --git a/companion/src/firmwares/multiprotocols.h b/companion/src/firmwares/multiprotocols.h index 42a6cfc9c..5ddfed426 100644 --- a/companion/src/firmwares/multiprotocols.h +++ b/companion/src/firmwares/multiprotocols.h @@ -18,14 +18,13 @@ * GNU General Public License for more details. */ -#ifndef OPENTX_MULTI_H -#define OPENTX_MULTI_H +#pragma once #include #include #include "moduledata.h" -#define MM_RF_CUSTOM_SELECTED 0xff +class AbstractStaticItemModel; class Multiprotocols { @@ -37,6 +36,7 @@ class Multiprotocols int protocol; unsigned int maxSubtype; bool hasFailsafe; + bool disableChannelMap; QStringList protocols; QString optionsstr; }; @@ -44,6 +44,7 @@ class Multiprotocols struct MultiProtocolDefinition { const int protocol; const bool hasFailsafe; + const bool disableChannelMap; const QStringList subTypeStrings; const QString optionsstr; @@ -52,13 +53,10 @@ class Multiprotocols return protocol > MODULE_SUBTYPE_MULTI_LAST ? 8 : (unsigned int) subTypeStrings.length(); } - int getOptionMin() const; - - int getOptionMax() const; - MultiProtocolDefinition(const radio_mm_definition &rd) : protocol(rd.protocol), hasFailsafe(rd.hasFailsafe), + disableChannelMap(rd.disableChannelMap), subTypeStrings(rd.protocols), optionsstr(rd.optionsstr) { @@ -73,8 +71,9 @@ class Multiprotocols } const MultiProtocolDefinition &getProtocol(int protocol) const; - static QString protocolToString(int protocol, bool custom = false); - static QString subTypeToString(int protocol, unsigned subType); + static QString protocolToString(int protocol); + static QString subTypeToString(int protocol, unsigned int subType); + static AbstractStaticItemModel * protocolItemModel(); private: @@ -83,5 +82,3 @@ class Multiprotocols }; extern const Multiprotocols multiProtocols; - -#endif //OPENTX_MULTI_H diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index edfc73a6f..3cad60f88 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -202,26 +202,28 @@ void TimerPanel::onModeChanged(int index) #define FAILSAFE_CHANNEL_HOLD 2000 #define FAILSAFE_CHANNEL_NOPULSE 2001 -#define MASK_PROTOCOL (1<<0) -#define MASK_CHANNELS_COUNT (1<<1) -#define MASK_RX_NUMBER (1<<2) -#define MASK_CHANNELS_RANGE (1<<3) -#define MASK_PPM_FIELDS (1<<4) -#define MASK_FAILSAFES (1<<5) -#define MASK_OPEN_DRAIN (1<<6) -#define MASK_MULTIMODULE (1<<7) -#define MASK_ANTENNA (1<<8) -#define MASK_MULTIOPTION (1<<9) -#define MASK_R9M (1<<10) -#define MASK_SBUSPPM_FIELDS (1<<11) -#define MASK_SUBTYPES (1<<12) -#define MASK_ACCESS (1<<13) -#define MASK_RX_FREQ (1<<14) -#define MASK_RF_POWER (1<<15) -#define MASK_RF_RACING_MODE (1<<16) -#define MASK_GHOST (1<<17) -#define MASK_BAUDRATE (1<<18) -#define MASK_MULTI_DSM_OPT (1<<19) +#define MASK_PROTOCOL (1<<0) +#define MASK_CHANNELS_COUNT (1<<1) +#define MASK_RX_NUMBER (1<<2) +#define MASK_CHANNELS_RANGE (1<<3) +#define MASK_PPM_FIELDS (1<<4) +#define MASK_FAILSAFES (1<<5) +#define MASK_OPEN_DRAIN (1<<6) +#define MASK_MULTIMODULE (1<<7) +#define MASK_ANTENNA (1<<8) +#define MASK_MULTIOPTION (1<<9) +#define MASK_R9M (1<<10) +#define MASK_SBUSPPM_FIELDS (1<<11) +#define MASK_SUBTYPES (1<<12) +#define MASK_ACCESS (1<<13) +#define MASK_RX_FREQ (1<<14) +#define MASK_RF_POWER (1<<15) +#define MASK_RF_RACING_MODE (1<<16) +#define MASK_GHOST (1<<17) +#define MASK_BAUDRATE (1<<18) +#define MASK_MULTI_DSM_OPT (1<<19) +#define MASK_CHANNELMAP (1<<20) +#define MASK_MULTI_BAYANG_OPT (1<<21) quint8 ModulePanel::failsafesValueDisplayType = ModulePanel::FAILSAFE_DISPLAY_PERCENT; @@ -289,14 +291,7 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul } } - for (int i = 0; i <= MODULE_SUBTYPE_MULTI_LAST; i++) { - if (i == MODULE_SUBTYPE_MULTI_SCANNER || i == MODULE_SUBTYPE_MULTI_CONFIG) - continue; - ui->multiProtocol->addItem(Multiprotocols::protocolToString(i), i); - } - for (int i = MODULE_SUBTYPE_MULTI_LAST + 1; i <= 124; i++) { - ui->multiProtocol->addItem(QString::number(i + 3), i); - } + ui->multiProtocol->setModel(Multiprotocols::protocolItemModel()); ui->btnGrpValueType->setId(ui->optPercent, FAILSAFE_DISPLAY_PERCENT); ui->btnGrpValueType->setId(ui->optUs, FAILSAFE_DISPLAY_USEC); @@ -499,7 +494,18 @@ void ModulePanel::update() break; case PULSES_MULTIMODULE: mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_MULTIMODULE | MASK_SUBTYPES; - max_rx_num = 63; + + switch (module.multi.rfProtocol) { + case MODULE_SUBTYPE_MULTI_OLRS: + max_rx_num = MODULE_SUBTYPE_MULTI_OLRS_RXNUM; + case MODULE_SUBTYPE_MULTI_BUGS: + max_rx_num = MODULE_SUBTYPE_MULTI_BUGS_RXNUM; + case MODULE_SUBTYPE_MULTI_BUGS_MINI: + max_rx_num = MODULE_SUBTYPE_MULTI_BUGS_MINI_RXNUM; + default: + max_rx_num = 63; + } + if (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) mask |= MASK_CHANNELS_COUNT; else @@ -507,11 +513,15 @@ void ModulePanel::update() if (pdef.optionsstr != nullptr) { if (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) mask |= MASK_MULTI_DSM_OPT; + else if (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_BAYANG) + mask |= MASK_MULTI_BAYANG_OPT; else mask |= MASK_MULTIOPTION; } if (pdef.hasFailsafe || (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_FRSKY && (module.subType == 0 || module.subType == 2 || module.subType > 3 ))) mask |= MASK_FAILSAFES; + if (pdef.disableChannelMap) + mask |= MASK_CHANNELMAP; break; case PULSES_AFHDS3: module.channelsCount = 18; @@ -533,8 +543,7 @@ void ModulePanel::update() else if (model->trainerMode != TRAINER_MODE_MASTER_JACK) { mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT; } - - if (module.hasFailsafes(firmware)) { + else if (module.hasFailsafes(firmware)) { mask |= MASK_FAILSAFES; } @@ -647,10 +656,10 @@ void ModulePanel::update() ui->optionValue->setVisible(mask & MASK_MULTIOPTION); ui->lblChkOption->setVisible(mask & MASK_MULTI_DSM_OPT); ui->chkOption->setVisible(mask & MASK_MULTI_DSM_OPT); - ui->lblCboOption->setVisible(mask & MASK_MULTI_DSM_OPT); - ui->cboOption->setVisible(mask & MASK_MULTI_DSM_OPT); + ui->lblCboOption->setVisible(mask & MASK_MULTI_DSM_OPT || mask & MASK_MULTI_BAYANG_OPT); + ui->cboOption->setVisible(mask & MASK_MULTI_DSM_OPT || mask & MASK_MULTI_BAYANG_OPT); ui->disableTelem->setVisible(mask & MASK_MULTIMODULE); - ui->disableChMap->setVisible(mask & MASK_MULTIMODULE); + ui->disableChMap->setVisible(mask & MASK_CHANNELMAP); ui->lowPower->setVisible(mask & MASK_MULTIMODULE); ui->autoBind->setVisible(mask & MASK_MULTIMODULE); if (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) @@ -667,10 +676,32 @@ void ModulePanel::update() } if (mask & MASK_MULTIOPTION) { - ui->optionValue->setMinimum(pdef.getOptionMin()); - ui->optionValue->setMaximum(pdef.getOptionMax()); - ui->optionValue->setValue(module.multi.optionValue); ui->label_option->setText(qApp->translate("Multiprotocols", qPrintable(pdef.optionsstr))); + int8_t min, max; + getMultiOptionValues(module.multi.rfProtocol, min, max); + + auto lineEdit = ui->optionValue->findChild(); + + if (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) { + ui->optionValue->setMinimum(50 + 5 * min); + ui->optionValue->setMaximum(50 + 5 * max); + ui->optionValue->setSingleStep(5); + ui->optionValue->setValue(50 + 5 * module.multi.optionValue); + if (lineEdit) { + lineEdit->setReadOnly(true); + lineEdit->setFocusPolicy(Qt::NoFocus); + } + } + else { + ui->optionValue->setMinimum(min); + ui->optionValue->setMaximum(max); + ui->optionValue->setSingleStep(1); + ui->optionValue->setValue(module.multi.optionValue); + if (lineEdit) { + lineEdit->setReadOnly(false); + lineEdit->setFocusPolicy(Qt::WheelFocus); + } + } } if (mask & MASK_MULTI_DSM_OPT) { @@ -678,7 +709,15 @@ void ModulePanel::update() ui->chkOption->setChecked(Helpers::getBitmappedValue(module.multi.optionValue, 0)); ui->lblCboOption->setText(qApp->translate("Multiprotocols", "Servo update rate")); ui->cboOption->clear(); - ui->cboOption->addItems({"22ms", "11ms"}); + ui->cboOption->addItems({ DSM2_OPTION_SERVOFREQ_NAMES }); + ui->cboOption->setSizeAdjustPolicy(QComboBox::AdjustToContents); + ui->cboOption->setCurrentIndex(Helpers::getBitmappedValue(module.multi.optionValue, 1)); + } + + if (mask & MASK_MULTI_BAYANG_OPT) { + ui->lblCboOption->setText(qApp->translate("Multiprotocols", qPrintable(pdef.optionsstr))); + ui->cboOption->clear(); + ui->cboOption->addItems({ BAYANG_OPTION_TELEMETRY_NAMES }); ui->cboOption->setSizeAdjustPolicy(QComboBox::AdjustToContents); ui->cboOption->setCurrentIndex(Helpers::getBitmappedValue(module.multi.optionValue, 1)); } @@ -864,6 +903,7 @@ void ModulePanel::onMultiProtocolChanged(int index) if (!lock && module.multi.rfProtocol != (unsigned)rfProtocol) { lock=true; module.multi.rfProtocol = (unsigned int)rfProtocol; + module.multi.optionValue = 0; unsigned int maxSubTypes = multiProtocols.getProtocol(index).numSubTypes(); if (rfProtocol > MODULE_SUBTYPE_MULTI_LAST) maxSubTypes = 8; @@ -876,10 +916,15 @@ void ModulePanel::onMultiProtocolChanged(int index) } } -void ModulePanel::on_optionValue_editingFinished() +void ModulePanel::on_optionValue_valueChanged(int value) { - if (module.multi.optionValue != ui->optionValue->value()) { - module.multi.optionValue = ui->optionValue->value(); + if (!lock) { + if (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) { + module.multi.optionValue = (value - 50) / 5; + } + else { + module.multi.optionValue = value; + } emit modified(); } } diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index b793e24d8..af83bce37 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -111,7 +111,7 @@ class ModulePanel : public ModelPanel void onFailsafesDisplayValueTypeChanged(int type); void onRfFreqChanged(int freq); void updateFailsafe(unsigned channel); - void on_optionValue_editingFinished(); + void on_optionValue_valueChanged(int value); void onClearAccessRxClicked(); void on_chkOption_stateChanged(int state); void on_cboOption_currentIndexChanged(int value); diff --git a/companion/src/modeledit/setup_module.ui b/companion/src/modeledit/setup_module.ui index a45a48a1b..3adbb69e5 100644 --- a/companion/src/modeledit/setup_module.ui +++ b/companion/src/modeledit/setup_module.ui @@ -768,7 +768,7 @@ - Low Power + Low power mode diff --git a/radio/src/MultiProtoDefs.h b/radio/src/MultiProtoDefs.h new file mode 100644 index 000000000..6f837f83c --- /dev/null +++ b/radio/src/MultiProtoDefs.h @@ -0,0 +1,246 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +// +// Data based on MPM firmware version 1.3.3.20 +// + +#if defined(MULTIMODULE) or defined(SIMU) + +#pragma once + +// +// Common list of supported Multi protocols +// +enum ModuleSubtypeMulti { + MODULE_SUBTYPE_MULTI_FIRST = 0, + MODULE_SUBTYPE_MULTI_FLYSKY = MODULE_SUBTYPE_MULTI_FIRST, + MODULE_SUBTYPE_MULTI_HUBSAN, //1 + MODULE_SUBTYPE_MULTI_FRSKY, //2 + MODULE_SUBTYPE_MULTI_HISKY, //3 + MODULE_SUBTYPE_MULTI_V2X2, //4 + MODULE_SUBTYPE_MULTI_DSM2, //5 + MODULE_SUBTYPE_MULTI_DEVO, + MODULE_SUBTYPE_MULTI_YD717, + MODULE_SUBTYPE_MULTI_KN, + MODULE_SUBTYPE_MULTI_SYMAX, + MODULE_SUBTYPE_MULTI_SLT, //10 + MODULE_SUBTYPE_MULTI_CX10, + MODULE_SUBTYPE_MULTI_CG023, + MODULE_SUBTYPE_MULTI_BAYANG, + MODULE_SUBTYPE_MULTI_FRSKYX, + MODULE_SUBTYPE_MULTI_ESky, //15 + MODULE_SUBTYPE_MULTI_MT99XX, + MODULE_SUBTYPE_MULTI_MJXQ, + MODULE_SUBTYPE_MULTI_SHENQI, + MODULE_SUBTYPE_MULTI_FY326, + MODULE_SUBTYPE_MULTI_FUTABA, //20 + MODULE_SUBTYPE_MULTI_J6PRO, + MODULE_SUBTYPE_MULTI_FQ777, + MODULE_SUBTYPE_MULTI_ASSAN, + MODULE_SUBTYPE_MULTI_FRSKYV, + MODULE_SUBTYPE_MULTI_HONTAI, //25 + MODULE_SUBTYPE_MULTI_OLRS, + MODULE_SUBTYPE_MULTI_FS_AFHDS2A, + MODULE_SUBTYPE_MULTI_Q2X2, + MODULE_SUBTYPE_MULTI_WK_2X01, + MODULE_SUBTYPE_MULTI_Q303, //30 + MODULE_SUBTYPE_MULTI_GW008, + MODULE_SUBTYPE_MULTI_DM002, + MODULE_SUBTYPE_MULTI_CABELL, + MODULE_SUBTYPE_MULTI_ESKY150, + MODULE_SUBTYPE_MULTI_H83D, //35 + MODULE_SUBTYPE_MULTI_CORONA, + MODULE_SUBTYPE_MULTI_CFLIE, + MODULE_SUBTYPE_MULTI_HITEC, + MODULE_SUBTYPE_MULTI_WFLY, + MODULE_SUBTYPE_MULTI_BUGS, //40 + MODULE_SUBTYPE_MULTI_BUGS_MINI, + MODULE_SUBTYPE_MULTI_TRAXXAS, + MODULE_SUBTYPE_MULTI_NCC1701, + MODULE_SUBTYPE_MULTI_E01X, + MODULE_SUBTYPE_MULTI_V911S, //45 + MODULE_SUBTYPE_MULTI_GD00X, + MODULE_SUBTYPE_MULTI_V761, + MODULE_SUBTYPE_MULTI_KF606, + MODULE_SUBTYPE_MULTI_REDPINE, + MODULE_SUBTYPE_MULTI_POTENSIC, //50 + MODULE_SUBTYPE_MULTI_ZSX, + MODULE_SUBTYPE_MULTI_HEIGHT, + MODULE_SUBTYPE_MULTI_SCANNER, + MODULE_SUBTYPE_MULTI_FRSKYX_RX, + MODULE_SUBTYPE_MULTI_AFHDS2A_RX, //55 + MODULE_SUBTYPE_MULTI_HOTT, + MODULE_SUBTYPE_MULTI_FX, + MODULE_SUBTYPE_MULTI_BAYANG_RX, + MODULE_SUBTYPE_MULTI_PELIKAN, + MODULE_SUBTYPE_MULTI_TIGER, //60 + MODULE_SUBTYPE_MULTI_XK, + MODULE_SUBTYPE_MULTI_XN297DUMP, + MODULE_SUBTYPE_MULTI_FRSKYX2, + MODULE_SUBTYPE_MULTI_FRSKY_R9, + MODULE_SUBTYPE_MULTI_PROPEL, //65 + MODULE_SUBTYPE_MULTI_FRSKYL, + MODULE_SUBTYPE_MULTI_SKYARTEC, + MODULE_SUBTYPE_MULTI_ESKY150V2, + MODULE_SUBTYPE_MULTI_DSM_RX, + MODULE_SUBTYPE_MULTI_JJRC345, //70 + MODULE_SUBTYPE_MULTI_Q90C, + MODULE_SUBTYPE_MULTI_KYOSHO, + MODULE_SUBTYPE_MULTI_RLINK, + MODULE_SUBTYPE_MULTI_ELRS, + MODULE_SUBTYPE_MULTI_REALACC, //75 + MODULE_SUBTYPE_MULTI_OMP, + MODULE_SUBTYPE_MULTI_MLINK, + MODULE_SUBTYPE_MULTI_WFLY2, + MODULE_SUBTYPE_MULTI_E016HV2, + MODULE_SUBTYPE_MULTI_E010R5, //80 + MODULE_SUBTYPE_MULTI_LOLI, + MODULE_SUBTYPE_MULTI_E129, + MODULE_SUBTYPE_MULTI_JOYSWAY, + MODULE_SUBTYPE_MULTI_E016H, + MODULE_SUBTYPE_MULTI_CONFIG, //85 + MODULE_SUBTYPE_MULTI_IKEAANSLUTA, + MODULE_SUBTYPE_MULTI_WILLIFM, + MODULE_SUBTYPE_MULTI_LOSI, + MODULE_SUBTYPE_MULTI_MOULDKG, + MODULE_SUBTYPE_MULTI_XERALL, //90 + MODULE_SUBTYPE_MULTI_MT99XX2, + MODULE_SUBTYPE_MULTI_KYOSHO2, + // + // spare entries - don't touch, + // just add to known protocols + // + MODULE_SUBTYPE_MULTI_NN1, + MODULE_SUBTYPE_MULTI_NN2, + MODULE_SUBTYPE_MULTI_NN3, + MODULE_SUBTYPE_MULTI_NN4, + MODULE_SUBTYPE_MULTI_NN5, + MODULE_SUBTYPE_MULTI_NN6, + MODULE_SUBTYPE_MULTI_NN7, + MODULE_SUBTYPE_MULTI_NN8, + MODULE_SUBTYPE_MULTI_NN9, + MODULE_SUBTYPE_MULTI_NN10, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_NN10, + // + // Sentinel + // + MODULE_SUBTYPE_MULTI_SENTINEL = 0xfe, + // + // most likely no longer required + // + MM_RF_CUSTOM_SELECTED = 0xff +}; + +// +// Common list of Multi protocol names. Needs to match enum ModuleSubtypeMulti +// +#define KNOWN_PROTO_NAMES \ + "FlySky","Hubsan","FrSky D","Hisky","V2x2","DSM","Devo","YD717","KN","SymaX",\ + "SLT","CX10","CG023","Bayang","FrSky X","ESky","MT99XX","MJXq","Shenqi","FY326",\ + "Futaba","J6 Pro","FQ777","Assan","FrSky V","Hontai","OpenLrs","FlSky2A","Q2x2","Walkera", \ + "Q303","GW008","DM002","Cabell","Esky150","H8 3D","Corona","CFlie","Hitec","WFLY",\ + "Bugs","BugMini","Traxxas","NCC1701","E01X","V911S","GD00X","V761","KF606","Redpine",\ + "Potensi","ZSX","Height","Scanner","FrSkyRX","FS2A_RX","HoTT","FX","BayanRX","Pelikan",\ + "Tiger", "XK","XN297DU","FrSkyX2","FrSkyR9","Propel","FrSky L","Skyartc","ESkyV2","DSM_RX",\ + "JJRC345","Q90C","Kyosho","RadLink","ExpLRS","Realacc","OMP","M-Link","WFLY2","E016Hv2",\ + "E010r5","LOLI","E129","JOYSWAY","E016H","Config","IKEA","WILLIFM","Losi","MouldKg",\ + "Xerall","MT99XX2", "Kyosho2" +#define SPARE_PROTO_NAMES \ + "NN 1","NN 2","NN 3","NN 4","NN 5","NN 6","NN 7","NN 8","NN 9","NN 10" +#define SPARE_SUBTYPE_NAMES \ + "SUB 1","SUB 2","SUB 3","SUB 4","SUB 5","SUB 6","SUB 7","SUB 8" +#define PROTO_NAMES KNOWN_PROTO_NAMES,SPARE_PROTO_NAMES + +// +// Common list of option names. Needs to match inline void getMultiOptionValues cases. +// +#define BAYANG_OPTION_TELEMETRY_NAMES "Off","On","Off+Aux","On+Aux" +#define DSM2_OPTION_SERVOFREQ_NAMES "22ms","11ms" + +// +// Common list of protocols the MPM doesn't allow to be selected (not sent by MPM protocol scan) +// +inline bool isMultiProtocolSelectable(int protocol) +{ + return (protocol != MODULE_SUBTYPE_MULTI_CONFIG && + protocol != MODULE_SUBTYPE_MULTI_SCANNER && + protocol != MODULE_SUBTYPE_MULTI_OLRS && + protocol != MODULE_SUBTYPE_MULTI_WILLIFM && + protocol != MODULE_SUBTYPE_MULTI_ELRS && + protocol != MODULE_SUBTYPE_MULTI_IKEAANSLUTA && + protocol != MODULE_SUBTYPE_MULTI_CFLIE && + // protocol != MODULE_SUBTYPE_MULTI_XN297DUMP && // XN297_DUMP is available with MPM debug fw only + protocol != MODULE_SUBTYPE_MULTI_MOULDKG + ); +} + +// +// Common protocol specific option values +// +inline void getMultiOptionValues(int8_t multi_proto, int8_t &min, int8_t &max) { + switch (multi_proto) { + case MODULE_SUBTYPE_MULTI_DSM2: + min = 0; // STR_MULTI_SERVOFREQ: 22ms, 11ms + max = 1; + break; + case MODULE_SUBTYPE_MULTI_BAYANG: + min = 0; // STR_MULTI_TELEMETRY: Off, On, Off+AUX, On+Aux + max = 3; + break; + case MODULE_SUBTYPE_MULTI_OLRS: + min = -1; + max = 7; + break; + case MODULE_SUBTYPE_MULTI_FS_AFHDS2A: + min = 0; // STR_MULTI_SERVOFREQ: (50+optionvalue*5)ms + max = 70; + break; + case MODULE_SUBTYPE_MULTI_XN297DUMP: + min = -1; + max = 84; + break; + default: + min = -128; // all other option types, e.g STR_MULTI_RFTUNE + max = 127; + break; + } +} + +// +// Out of the ordinary max. numbers of model IDs +// +#define MODULE_SUBTYPE_MULTI_OLRS_RXNUM 4 +#define MODULE_SUBTYPE_MULTI_BUGS_RXNUM 15 +#define MODULE_SUBTYPE_MULTI_BUGS_MINI_RXNUM 15 + +// +// subtypes for Radiomaster T8 bind key and Radiomaster RTF use. +// see defines RTF, BIND_KEY and the protocol subtype list STRLIST() +// in MultiSubTypeDefs.h +// +#define MULTI_FRSKYD_SUBTYPE_D8 0 +#define MULTI_FRSKYX_SUBTYPE_D16_FCC 0 +#define MULTI_FRSKYX_SUBTYPE_D16_LBT 2 +#define MULTI_FRSKYX2_SUBTYPE_D16_FCC 0 +#define MULTI_FRSKYX2_SUBTYPE_D16_LBT 2 + +#endif // MULTIMODULE diff --git a/radio/src/MultiSubtypeDefs.h b/radio/src/MultiSubtypeDefs.h new file mode 100644 index 000000000..ce8254388 --- /dev/null +++ b/radio/src/MultiSubtypeDefs.h @@ -0,0 +1,276 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +// +// Data based on MPM firmware version 1.3.3.20 +// + +#if defined(MULTIMODULE) or defined(SIMU) + +#pragma once + +// +// Single source of Multi protocol defintions: +// - MultiProtoDefs.h contains the protocol list and names as per Multi.txt +// Widely used in Companion/Simulator and radio firmware code +// - MutliSubtypesDef.h contains subtype definitions and generates data structurse +// for Companion and Simulator/radio code in radio/src/gui/gui_common.cpp and +// companion/src/firmwares/multiprotocols.cpp +// + +// +// include list of Multi protocosl +// +#include "MultiProtoDefs.h" + +// +// This distinction circumvents the different ways of handling translations of menu texts +// and sets the defines STRLIST and PROTODEF such that the correct Companion/Simulator and radio code +// data structures are generated +// +#if defined(CPN) + #define STRLIST(x, ...) static const QStringList x __VA_ARGS__; + #define PROTODEF const Multiprotocols multiProtocols + + #define STR_MULTI_OPTION QT_TRANSLATE_NOOP("Multiprotocols", "Option value") + #define STR_MULTI_RFTUNE QT_TRANSLATE_NOOP("Multiprotocols", "CC2500 frequency fine tune") + #define STR_MULTI_VIDFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Video TX frequency") + #define STR_MULTI_FIXEDID QT_TRANSLATE_NOOP("Multiprotocols", "Fixed ID value") + #define STR_MULTI_TELEMETRY QT_TRANSLATE_NOOP("Multiprotocols", "Telemetry") + #define STR_MULTI_SERVOFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Servo update rate") + #define STR_MULTI_MAX_THROW QT_TRANSLATE_NOOP("Multiprotocols", "Enable max throw") + #define STR_MULTI_RFCHAN QT_TRANSLATE_NOOP("Multiprotocols", "Select RF channel") + #define STR_MULTI_RFPOWER QT_TRANSLATE_NOOP("Multiprotocols", "RF power") + + #define STR_MULTI_DEFAULT QT_TRANSLATE_NOOP("Multiprotocols", "DEFAULT") + STRLIST(NO_SUBTYPE, {STR_MULTI_DEFAULT}) +#else + #define STRLIST(x, ...) const char* const x[] = __VA_ARGS__; + #define PROTODEF const mm_protocol_definition multi_protocols[] + + const char* const mm_options_strings::options[] = { + nullptr, + STR_MULTI_OPTION, + STR_MULTI_RFTUNE, + STR_MULTI_VIDFREQ, + STR_MULTI_FIXEDID, + STR_MULTI_TELEMETRY, + STR_MULTI_SERVOFREQ, + STR_MULTI_MAX_THROW, + STR_MULTI_RFCHAN, + STR_MULTI_RFPOWER, + STR_MULTI_WBUS // probably not used by MPM anymore + }; + + #define NO_SUBTYPE nullptr +#endif + +// +// Common definitions of Multi protocol subtype options (only for protocols that do have subtypes) +// +STRLIST(STR_SUBTYPE_FLYSKY, {"Std","V9x9","V6x6","V912","CX20"}) +STRLIST(STR_SUBTYPE_HUBSAN, {"H107","H301","H501"}) +STRLIST(STR_SUBTYPE_FRSKYD, {"D8","Cloned"}) +STRLIST(STR_SUBTYPE_FRSKYX, {"D16","D16 8ch","LBT(EU)","LBT 8ch","Cloned", "Cloned 8ch"}) +STRLIST(STR_SUBTYPE_HISKY, {"Std","HK310"}) +STRLIST(STR_SUBTYPE_V2X2, {"Std","JXD506","MR101"}) +STRLIST(STR_SUBTYPE_DSM, {"2 1F","2 2F","X 1F","X 2F","Auto","R 1F"}) +STRLIST(STR_SUBTYPE_DEVO, {"8ch","10ch","12ch","6ch","7ch"}) +STRLIST(STR_SUBTYPE_YD717, {"Std","SkyWlkr","Syma X4","XINXUN","NIHUI"}) +STRLIST(STR_SUBTYPE_KN, {"WLtoys","FeiLun"}) +STRLIST(STR_SUBTYPE_SYMAX, {"Std","X5C"}) +STRLIST(STR_SUBTYPE_SLT, {"V1_6ch","V2_8ch","Q100","Q200","MR100"}) +STRLIST(STR_SUBTYPE_CX10, {"Green","Blue","DM007","-","JC3015a","JC3015b","MK33041"}) +STRLIST(STR_SUBTYPE_CG023, {"Std","YD829"}) +STRLIST(STR_SUBTYPE_BAYANG, {"Std","H8S3D","X16 AH","IRDrone","DHD D4","QX100"}) +STRLIST(STR_SUBTYPE_ESky, {"Std","ET4"}) +STRLIST(STR_SUBTYPE_MT99, {"MT99","H7","YZ","LS","FY805","A180","Dragon","F949G"}) +STRLIST(STR_SUBTYPE_MJXQ, {"WLH08","X600","X800","H26D","E010","H26WH","Phoenix"}) +STRLIST(STR_SUBTYPE_FY326, {"Std","FY319"}) +STRLIST(STR_SUBTYPE_FUTABA, {"SFHSS"}) +STRLIST(STR_SUBTYPE_HONTAI, {"Std","JJRC X1","X5C1","FQ_951"}) +STRLIST(STR_SUBTYPE_AFHDS2A, {"PWM,IBUS","PPM,IBUS","PWM,SBUS","PPM,SBUS","PWM,IB16","PPM,IB16","PWM,SB16","PPM,SB16"}) +STRLIST(STR_SUBTYPE_Q2X2, {"Q222","Q242","Q282"}) +STRLIST(STR_SUBTYPE_WK2x01, {"WK2801","WK2401","W6_5_1","W6_6_1","W6_HeL","W6_HeI"}) +STRLIST(STR_SUBTYPE_Q303, {"Std","CX35","CX10D","CX10WD"}) +STRLIST(STR_SUBTYPE_CABELL, {"V3","V3 Telm","-","-","-","-","F-Safe","Unbind"}) +STRLIST(STR_SUBTYPE_ESKY150, {"4ch","7ch"}) +STRLIST(STR_SUBTYPE_H83D, {"Std","H20H","H20Mini","H30Mini"}) +STRLIST(STR_SUBTYPE_CORONA, {"V1","V2","FD V3"}) +STRLIST(STR_SUBTYPE_HITEC, {"Optima","Opt Hub","Minima"}) +STRLIST(STR_SUBTYPE_WFLY, {"WFR0x"}) +STRLIST(STR_SUBTYPE_BUGS_MINI, {"Std","Bugs3H"}) +STRLIST(STR_SUBTYPE_TRAXXAS, {"6519"}) +STRLIST(STR_SUBTYPE_E01X, {"E012","E015"}) +STRLIST(STR_SUBTYPE_V911S, {"Std","E119"}) +STRLIST(STR_SUBTYPE_GD00X, {"GD_V1","GD_V2"}) +STRLIST(STR_SUBTYPE_V761, {"3ch","4ch","TOPRC"}) +STRLIST(STR_SUBTYPE_KF606, {"KF606","MIG320"}) +STRLIST(STR_SUBTYPE_REDPINE, {"Fast","Slow"}) +STRLIST(STR_SUBTYPE_POTENSIC, {"A20"}) +STRLIST(STR_SUBTYPE_ZSX, {"280JJRC"}) +STRLIST(STR_SUBTYPE_HEIGHT, {"5ch","8ch"}) +STRLIST(STR_SUBTYPE_FRSKYX_RX, {"Multi","CloneTX","EraseTX","CPPM"}) +STRLIST(STR_SUBTYPE_HOTT, {"Sync","No_Sync"}) +STRLIST(STR_SUBTYPE_FX, {"816","620"}) +STRLIST(STR_SUBTYPE_PELIKAN, {"Pro","Lite","SCX24"}) +STRLIST(STR_SUBTYPE_XK, {"X450","X420"}) +STRLIST(STR_SUBTYPE_XN297DUMP, {"250K","1M","2M","AUTO","NRF","CC2500"}) +STRLIST(STR_SUBTYPE_FRSKYR9, {"915MHz","868MHz","915 8ch","868 8ch","FCC","--","FCC 8ch","-- 8ch"}) +STRLIST(STR_SUBTYPE_PROPEL, {"74-Z"}) +STRLIST(STR_SUBTYPE_FRSKYL, {"LR12","LR12 6ch"}) +STRLIST(STR_SUBTYPE_ESKY150V2, {"150 V2"}) +STRLIST(STR_SUBTYPE_JJRC345, {"Std","SkyTmbr"}) +STRLIST(STR_SUBTYPE_KYOSHO, {"FHSS","Hype"}) +STRLIST(STR_SUBTYPE_KYOSHO2, {"KT-17"}) +STRLIST(STR_SUBTYPE_RLINK, {"Surface","Air","DumboRC"}) +STRLIST(STR_SUBTYPE_ELRS, {"N/A WIP"}) +STRLIST(STR_SUBTYPE_REALACC, {"R11"}) +STRLIST(STR_SUBTYPE_WFLY2, {"RF20x"}) +STRLIST(STR_SUBTYPE_MOULDKG, {"Analog","Digital"}) +STRLIST(STR_SUBTYPE_MT992, {"PA18"}) +STRLIST(STR_SUBTYPE_RX, {"Multi","CPPM"}) +STRLIST(STR_SUBTYPE_E129, {"STD","C186"}) + +// +// Generic subtypes for future use protocols - don't touch +// +STRLIST(STR_SUBTYPE_NN, { SPARE_SUBTYPE_NAMES }) + +// +// Common data structure defining Multi protocol capabilites, i.e. number of subtypes, +// failsafe support yes/no, channel map disabled yes/no, reference to the suptype options strings above +// and further protocol options, e.g. RF tune, video frequency. +// +PROTODEF { + {MODULE_SUBTYPE_MULTI_FLYSKY, 4, false, true, STR_SUBTYPE_FLYSKY, nullptr}, + {MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ}, + {MODULE_SUBTYPE_MULTI_FRSKY, 1, false, false, STR_SUBTYPE_FRSKYD, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_HISKY, 1, true, true, STR_SUBTYPE_HISKY, nullptr}, + {MODULE_SUBTYPE_MULTI_V2X2, 2, false, false, STR_SUBTYPE_V2X2, nullptr}, + {MODULE_SUBTYPE_MULTI_DSM2, 5, false, true, STR_SUBTYPE_DSM, STR_MULTI_MAX_THROW}, + {MODULE_SUBTYPE_MULTI_DEVO, 4, true, true, STR_SUBTYPE_DEVO, STR_MULTI_FIXEDID}, + {MODULE_SUBTYPE_MULTI_YD717, 4, false, false, STR_SUBTYPE_YD717, nullptr}, + {MODULE_SUBTYPE_MULTI_KN, 1, false, false, STR_SUBTYPE_KN, nullptr}, + {MODULE_SUBTYPE_MULTI_SYMAX, 1, false, false, STR_SUBTYPE_SYMAX, nullptr}, + {MODULE_SUBTYPE_MULTI_SLT, 4, false, true, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_CX10, 6, false, false, STR_SUBTYPE_CX10, nullptr}, + {MODULE_SUBTYPE_MULTI_CG023, 1, false, false, STR_SUBTYPE_CG023, nullptr}, + {MODULE_SUBTYPE_MULTI_BAYANG, 5, false, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, + {MODULE_SUBTYPE_MULTI_FRSKYX, 5, true, false, STR_SUBTYPE_FRSKYX, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_ESky, 1, false, true, STR_SUBTYPE_ESky, nullptr}, + {MODULE_SUBTYPE_MULTI_MT99XX, 7, false, false, STR_SUBTYPE_MT99, nullptr}, + {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, false, STR_SUBTYPE_MJXQ, nullptr}, + {MODULE_SUBTYPE_MULTI_SHENQI, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_FY326, 1, false, false, STR_SUBTYPE_FY326, nullptr}, + {MODULE_SUBTYPE_MULTI_FUTABA, 0, true, true, STR_SUBTYPE_FUTABA, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_J6PRO, 0, false, true, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_FQ777, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_ASSAN, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_FRSKYV, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_HONTAI, 3, false, false, STR_SUBTYPE_HONTAI, nullptr}, + // MODULE_SUBTYPE_MULTI_OLRS non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_FS_AFHDS2A, 7, true, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ}, + {MODULE_SUBTYPE_MULTI_Q2X2, 2, false, false, STR_SUBTYPE_Q2X2, nullptr}, + {MODULE_SUBTYPE_MULTI_WK_2X01, 5, true, true, STR_SUBTYPE_WK2x01, nullptr}, + {MODULE_SUBTYPE_MULTI_Q303, 3, false, false, STR_SUBTYPE_Q303, nullptr}, + {MODULE_SUBTYPE_MULTI_GW008, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_DM002, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_CABELL, 7, false, false, STR_SUBTYPE_CABELL, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr}, + {MODULE_SUBTYPE_MULTI_H83D, 3, false, false, STR_SUBTYPE_H83D, nullptr}, + {MODULE_SUBTYPE_MULTI_CORONA, 2, false, false, STR_SUBTYPE_CORONA, STR_MULTI_RFTUNE}, + // MODULE_SUBTYPE_MULTI_CFLIE non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_HITEC, 2, false, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_WFLY, 0, true, false, STR_SUBTYPE_WFLY, nullptr}, + {MODULE_SUBTYPE_MULTI_BUGS, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_BUGS_MINI, 1, false, false, STR_SUBTYPE_BUGS_MINI, nullptr}, + {MODULE_SUBTYPE_MULTI_TRAXXAS, 0, false, false, STR_SUBTYPE_TRAXXAS, nullptr}, + {MODULE_SUBTYPE_MULTI_NCC1701, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_E01X, 1, false, false, STR_SUBTYPE_E01X, nullptr}, + {MODULE_SUBTYPE_MULTI_V911S, 1, false, false, STR_SUBTYPE_V911S, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_GD00X, 1, false, false, STR_SUBTYPE_GD00X, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_V761, 2, false, false, STR_SUBTYPE_V761, nullptr}, + {MODULE_SUBTYPE_MULTI_KF606, 1, false, false, STR_SUBTYPE_KF606, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_POTENSIC, 0, false, false, STR_SUBTYPE_POTENSIC, nullptr}, + {MODULE_SUBTYPE_MULTI_ZSX, 0, false, false, STR_SUBTYPE_ZSX, nullptr}, + {MODULE_SUBTYPE_MULTI_HEIGHT, 1, false, false, STR_SUBTYPE_HEIGHT, nullptr}, + // MODULE_SUBTYPE_MULTI_SCANNER non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 3, false, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_AFHDS2A_RX, 1, false, false, STR_SUBTYPE_RX, nullptr}, //new + {MODULE_SUBTYPE_MULTI_HOTT, 1, true, false, STR_SUBTYPE_HOTT, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FX, 1, false, false, STR_SUBTYPE_FX, nullptr}, + {MODULE_SUBTYPE_MULTI_BAYANG_RX, 1, false, false, STR_SUBTYPE_RX, nullptr}, //new + {MODULE_SUBTYPE_MULTI_PELIKAN, 2, false, true, STR_SUBTYPE_PELIKAN, nullptr}, + {MODULE_SUBTYPE_MULTI_TIGER, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_XK, 1, false, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_XN297DUMP, 5, false, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN}, + {MODULE_SUBTYPE_MULTI_FRSKYX2, 5, true, false, STR_SUBTYPE_FRSKYX, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKY_R9, 7, true, false, STR_SUBTYPE_FRSKYR9, nullptr}, + {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, STR_SUBTYPE_PROPEL, nullptr}, + {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, true, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_DSM_RX, 1, false, true, STR_SUBTYPE_RX, nullptr}, //new + {MODULE_SUBTYPE_MULTI_JJRC345, 1, false, false, STR_SUBTYPE_JJRC345, nullptr}, + {MODULE_SUBTYPE_MULTI_Q90C, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_KYOSHO, 1, false, true, STR_SUBTYPE_KYOSHO, nullptr}, + {MODULE_SUBTYPE_MULTI_RLINK, 2, false, false, STR_SUBTYPE_RLINK, STR_MULTI_RFTUNE}, + // MODULE_SUBTYPE_MULTI_ELRS non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_REALACC, 0, false, false, STR_SUBTYPE_REALACC, nullptr}, + {MODULE_SUBTYPE_MULTI_OMP, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_MLINK, 0, true, false, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_WFLY2, 0, true, false, STR_SUBTYPE_WFLY2, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_E016HV2, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_E010R5, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_LOLI, 0, true, false, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_E129, 1, false, false, STR_SUBTYPE_E129, nullptr}, //new + {MODULE_SUBTYPE_MULTI_JOYSWAY, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_E016H, 0, false, false, NO_SUBTYPE, nullptr}, //new + // MODULE_SUBTYPE_MULTI_CONFIG non selectable and masked out for selection + // MODULE_SUBTYPE_MULTI_IKEAANSLUTA non selectable and masked out for selection + // MODULE_SUBTYPE_MULTI_WILLIFM non selectable and masked out for selection + {MODULE_SUBTYPE_MULTI_LOSI, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_MOULDKG, 1, false, false, STR_SUBTYPE_MOULDKG, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_XERALL, 0, false, false, NO_SUBTYPE, nullptr}, //new + {MODULE_SUBTYPE_MULTI_MT99XX2, 0, false, false, STR_SUBTYPE_MT992, nullptr}, + {MODULE_SUBTYPE_MULTI_KYOSHO2, 0, false, false, STR_SUBTYPE_KYOSHO2, nullptr}, + {MODULE_SUBTYPE_MULTI_NN1, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN2, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN3, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN4, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN5, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN6, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN7, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN8, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN9, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_NN10, 7, true, true, STR_SUBTYPE_NN, STR_MULTI_OPTION}, + // + // most likely no longer required + // + {MM_RF_CUSTOM_SELECTED, 0, true, false, NO_SUBTYPE, STR_MULTI_OPTION}, + + // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) + {MODULE_SUBTYPE_MULTI_SENTINEL, 0, false, false, NO_SUBTYPE, nullptr}, +}; + +#endif // MULTIMODULE diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 5a134d4e4..2aabb02a9 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -446,10 +446,6 @@ PACK(struct TrainerModuleData { * Module structure */ -// Only used in case switch and if statements as "virtual" protocol -#define MM_RF_CUSTOM_SELECTED 0xff -#define MULTI_MAX_PROTOCOLS 127 // rfProtocol:4 + rfProtocolExtra:3 - PACK(struct PpmModule { int8_t delay:6; uint8_t pulsePol:1; diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 1a2c534ab..43b6f6b1a 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1266,7 +1266,7 @@ void menuModelSetup(event_t event) } } else { - CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MODULE_SUBTYPE_MULTI_LAST, isMultiProtocolSelectable); } if (checkIncDec_Ret) { g_model.moduleData[moduleIdx].multi.rfProtocol = multiRfProto; @@ -1813,7 +1813,7 @@ void menuModelSetup(event_t event) max = 15; } else if (title == STR_MULTI_TELEMETRY) { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_TELEMETRY_MODE, optionValue, LEFT | attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_BAYANG_OPTIONS, optionValue, LEFT | attr); } else if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) { lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, 50 + 5 * optionValue, LEFT | attr); diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index a92a26f05..10a083429 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1058,7 +1058,7 @@ void menuModelSetup(event_t event) #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol; - CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MODULE_SUBTYPE_MULTI_LAST, isMultiProtocolSelectable); if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = multiRfProto; g_model.moduleData[EXTERNAL_MODULE].subType = 0; @@ -1189,7 +1189,7 @@ void menuModelSetup(event_t event) } } else { - CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MODULE_SUBTYPE_MULTI_LAST, isMultiProtocolSelectable); } if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = multiRfProto; @@ -1570,7 +1570,7 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr); } else if (title == STR_MULTI_TELEMETRY) { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_TELEMETRY_MODE, optionValue, LEFT | attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_BAYANG_OPTIONS, optionValue, LEFT | attr); } else if (title == STR_MULTI_WBUS) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_WBUS_MODE, optionValue, LEFT | attr); diff --git a/radio/src/gui/colorlcd/mpm_settings.cpp b/radio/src/gui/colorlcd/mpm_settings.cpp index 19e757499..8798fb411 100644 --- a/radio/src/gui/colorlcd/mpm_settings.cpp +++ b/radio/src/gui/colorlcd/mpm_settings.cpp @@ -92,8 +92,8 @@ void MPMProtoOption::update(const MultiRfProtocols::RfProto* rfProto, ModuleData choice->setSetValueHandler(SET_DEFAULT(md->multi.optionValue)); lv_obj_clear_flag(choice->getLvObj(), LV_OBJ_FLAG_HIDDEN); lv_event_send(choice->getLvObj(), LV_EVENT_VALUE_CHANGED, nullptr); - } else if (title == STR_MULTI_TELEMETRY) { // e.g. Bayang - choice->setValues(STR_MULTI_TELEMETRY_MODE); + } else if (title == STR_MULTI_TELEMETRY) { // Bayang + choice->setValues(STR_MULTI_BAYANG_OPTIONS); choice->setMin(min); choice->setMax(max); choice->setGetValueHandler(GET_DEFAULT(md->multi.optionValue)); @@ -131,8 +131,8 @@ void MPMProtoOption::update(const MultiRfProtocols::RfProto* rfProto, ModuleData cb->update(); lv_obj_clear_flag(cb->getLvObj(), LV_OBJ_FLAG_HIDDEN); } else { - edit->setMin(-128); - edit->setMax(127); + edit->setMin(min); + edit->setMax(max); edit->setGetValueHandler(GET_DEFAULT(md->multi.optionValue)); edit->setSetValueHandler(SET_DEFAULT(md->multi.optionValue)); lv_obj_clear_flag(edit->getLvObj(), LV_OBJ_FLAG_HIDDEN); @@ -203,8 +203,6 @@ struct MPMServoRate : public FormGroup::Line { Choice* choice; }; -static const char* _servoRates[] = {"22ms", "11ms"}; - MPMServoRate::MPMServoRate(FormGroup* form, FlexGridLayout *layout, uint8_t moduleIdx) : FormGroup::Line(form, layout) { @@ -212,7 +210,7 @@ MPMServoRate::MPMServoRate(FormGroup* form, FlexGridLayout *layout, uint8_t modu new StaticText(this, rect_t{}, STR_MULTI_SERVOFREQ, 0, COLOR_THEME_PRIMARY1); auto md = &g_model.moduleData[moduleIdx]; - choice = new Choice(this, rect_t{}, _servoRates, 0, 1, 0, 0); + choice = new Choice(this, rect_t{}, STR_MULTI_DSM_OPTIONS, 0, 1, 0, 0); choice->setGetValueHandler(GET_DEFAULT((md->multi.optionValue & 0x02) >> 1)); choice->setSetValueHandler(SET_VALUE( diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 6f047e2b6..1a6196e7c 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -22,6 +22,9 @@ #include "opentx.h" #include "hal/module_port.h" +#undef CPN +#include "MultiSubtypeDefs.h" + #if defined(PCBFRSKY) || defined(PCBFLYSKY) uint8_t switchToMix(uint8_t source) { @@ -1110,179 +1113,11 @@ int getFirstAvailable(int min, int max, IsValueAvailable isValueAvailable) } #if defined(MULTIMODULE) -// Third row is number of subtypes -1 (max valid subtype) -#define NO_SUBTYPE nullptr - -// Table is designed to be shared with companion multi.cpp - -// The subtype and options strings are only referenced here, so -// define them here to avoid duplication in all language files -// Also since these strings are ARM only and likely stay ARM only -// we don't need the special eeprom/flash string handling, just define them as -// local strings - -const char* const STR_SUBTYPE_FLYSKY[] = {"Std","V9x9","V6x6","V912","CX20"}; -const char* const STR_SUBTYPE_HUBSAN[] = {"H107","H301","H501"}; -const char* const STR_SUBTYPE_FRSKYD[] = {"D8","Cloned"}; -const char* const STR_SUBTYPE_FRSKYX[] = {"D16","D16 8ch","LBT(EU)","LBT 8ch","Cloned", "Cloned 8ch"}; -const char* const STR_SUBTYPE_HISKY[] = {"Std","HK310"}; -const char* const STR_SUBTYPE_V2X2[] = {"Std","JXD506","MR101"}; -const char* const STR_SUBTYPE_DSM[] = {"2 1F","2 2F","X 1F","X 2F","Auto","R 1F"}; -const char* const STR_SUBTYPE_DEVO[] = {"8ch","10ch","12ch","6ch","7ch"}; -const char* const STR_SUBTYPE_YD717[] = {"Std","SkyWlkr","Syma X4","XINXUN","NIHUI"}; -const char* const STR_SUBTYPE_KN[] = {"WLtoys","FeiLun"}; -const char* const STR_SUBTYPE_SYMAX[] = {"Std","X5C"}; -const char* const STR_SUBTYPE_SLT[] = {"V1_6ch","V2_8ch","Q100","Q200","MR100"}; -const char* const STR_SUBTYPE_CX10[] = {"Green","Blue","DM007","-","JC3015a","JC3015b","MK33041"}; -const char* const STR_SUBTYPE_CG023[] = {"Std","YD829"}; -const char* const STR_SUBTYPE_BAYANG[] = {"Std","H8S3D","X16 AH","IRDrone","DHD D4","QX100"}; -const char* const STR_SUBTYPE_ESky[] = {"Std","ET4"}; -const char* const STR_SUBTYPE_MT99[] = {"MT99","H7","YZ","LS","FY805","A180","Dragon","F949G"}; -const char* const STR_SUBTYPE_MJXQ[] = {"WLH08","X600","X800","H26D","E010","H26WH","Phoenix"}; -const char* const STR_SUBTYPE_FY326[] = {"Std","FY319"}; -const char* const STR_SUBTYPE_FUTABA[] = {"SFHSS"}; -const char* const STR_SUBTYPE_HONTAI[] = {"Std","JJRC X1","X5C1","FQ_951"}; -const char* const STR_SUBTYPE_AFHDS2A[] = {"PWM,IBUS","PPM,IBUS","PWM,SBUS","PPM,SBUS","PWM,IB16","PPM,IB16"}; -const char* const STR_SUBTYPE_Q2X2[] = {"Q222","Q242","Q282"}; -const char* const STR_SUBTYPE_WK2x01[] = {"WK2801","WK2401","W6_5_1","W6_6_1","W6_HeL","W6_HeI"}; -const char* const STR_SUBTYPE_Q303[] = {"Std","CX35","CX10D","CX10WD"}; -const char* const STR_SUBTYPE_CABELL[] = {"V3","V3 Telm","-","-","-","-","F-Safe","Unbind"}; -const char* const STR_SUBTYPE_ESKY150[] = {"4ch","7ch"}; -const char* const STR_SUBTYPE_H83D[] = {"Std","H20H","H20Mini","H30Mini"}; -const char* const STR_SUBTYPE_CORONA[] = {"V1","V2","FD V3"}; -const char* const STR_SUBTYPE_HITEC[] = {"Optima","Opt Hub","Minima"}; -const char* const STR_SUBTYPE_WFLY[] = {"WFR0x"}; -const char* const STR_SUBTYPE_BUGS_MINI[] = {"Std","Bugs3H"}; -const char* const STR_SUBTYPE_TRAXXAS[] = {"6519"}; -const char* const STR_SUBTYPE_E01X[] = {"E012","E015"}; -const char* const STR_SUBTYPE_V911S[] = {"Std","E119"}; -const char* const STR_SUBTYPE_GD00X[] = {"GD_V1","GD_V2"}; -const char* const STR_SUBTYPE_V761[] = {"3ch","4ch"}; -const char* const STR_SUBTYPE_KF606[] = {"KF606","MIG320"}; -const char* const STR_SUBTYPE_REDPINE[] = {"Fast","Slow"}; -const char* const STR_SUBTYPE_POTENSIC[] = {"A20"}; -const char* const STR_SUBTYPE_ZSX[] = {"280JJRC"}; -const char* const STR_SUBTYPE_HEIGHT[] = {"5ch","8ch"}; -const char* const STR_SUBTYPE_FRSKYX_RX[] = {"Multi","CloneTX","EraseTX","CPPM"}; -const char* const STR_SUBTYPE_HOTT[] = {"Sync","No_Sync"}; -const char* const STR_SUBTYPE_FX816[] = {"P38"}; -const char* const STR_SUBTYPE_PELIKAN[] = {"Pro","Lite","SCX24"}; -const char* const STR_SUBTYPE_XK[] = {"X450","X420"}; -const char* const STR_SUBTYPE_XN297DUMP[] = {"250K","1M","2M","AUTO","NRF","CC2500"}; -const char* const STR_SUBTYPE_FRSKYR9[] = {"915MHz","868MHz","915 8ch","868 8ch","FCC","---","FCC 8ch"}; -const char* const STR_SUBTYPE_PROPEL[] = {"74-Z"}; -const char* const STR_SUBTYPE_FRSKYL[] = {"LR12","LR12 6ch"}; -const char* const STR_SUBTYPE_ESKY150V2[] = {"150 V2"}; -const char* const STR_SUBTYPE_JJRC345[] = {"Std","SkyTmbr"}; -const char* const STR_SUBTYPE_KYOSHO[] = {"FHSS","Hype"}; -const char* const STR_SUBTYPE_KYOSHO2[] = {"KT-17"}; -const char* const STR_SUBTYPE_RLINK[] = {"Surface","Air","DumboRC"}; -const char* const STR_SUBTYPE_ELRS[] = {"N/A WIP"}; -const char* const STR_SUBTYPE_REALACC[] = {"R11"}; -const char* const STR_SUBTYPE_WFLY2[] = {"RF20x"}; -const char* const STR_SUBTYPE_MOULDKG[] = {"Analog","Digital"}; -const char* const STR_SUBTYPE_MT992[] = {"PA18"}; - -const char* const mm_options_strings::options[] = { - nullptr, - STR_MULTI_OPTION, - STR_MULTI_RFTUNE, - STR_MULTI_VIDFREQ, - STR_MULTI_FIXEDID, - STR_MULTI_TELEMETRY, - STR_MULTI_SERVOFREQ, - STR_MULTI_MAX_THROW, - STR_MULTI_RFCHAN, - STR_MULTI_RFPOWER, - STR_MULTI_WBUS -}; - const uint8_t getMaxMultiOptions() { return DIM(mm_options_strings::options); } -const mm_protocol_definition multi_protocols[] = { -// Protocol as defined in pulses\modules_constants.h, number of sub_protocols - 1, Failsafe supported, Disable channel mapping supported, Subtype string, Option type - {MODULE_SUBTYPE_MULTI_FLYSKY, 4, false, true, STR_SUBTYPE_FLYSKY, nullptr}, - {MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ}, - {MODULE_SUBTYPE_MULTI_FRSKYD, 1, false, false, STR_SUBTYPE_FRSKYD, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HISKY, 1, true, true, STR_SUBTYPE_HISKY, nullptr}, - {MODULE_SUBTYPE_MULTI_V2X2, 2, false, false, STR_SUBTYPE_V2X2, nullptr}, - {MODULE_SUBTYPE_MULTI_DSM2, 5, false, true, STR_SUBTYPE_DSM, STR_MULTI_MAX_THROW}, - {MODULE_SUBTYPE_MULTI_DEVO, 4, true, true, STR_SUBTYPE_DEVO, STR_MULTI_FIXEDID}, - {MODULE_SUBTYPE_MULTI_YD717, 4, false, false, STR_SUBTYPE_YD717, nullptr}, - {MODULE_SUBTYPE_MULTI_KN, 1, false, false, STR_SUBTYPE_KN, nullptr}, - {MODULE_SUBTYPE_MULTI_SYMAX, 1, false, false, STR_SUBTYPE_SYMAX, nullptr}, - {MODULE_SUBTYPE_MULTI_SLT, 4, false, true, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_CX10, 6, false, false, STR_SUBTYPE_CX10, nullptr}, - {MODULE_SUBTYPE_MULTI_CG023, 1, false, false, STR_SUBTYPE_CG023, nullptr}, - {MODULE_SUBTYPE_MULTI_BAYANG, 5, false, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, - {MODULE_SUBTYPE_MULTI_FRSKYX, 5, true, false, STR_SUBTYPE_FRSKYX, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_ESky, 1, false, true, STR_SUBTYPE_ESky, nullptr}, - {MODULE_SUBTYPE_MULTI_MT99XX, 7, false, false, STR_SUBTYPE_MT99, nullptr}, - {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, false, STR_SUBTYPE_MJXQ, nullptr}, - {MODULE_SUBTYPE_MULTI_FY326, 1, false, false, STR_SUBTYPE_FY326, nullptr}, - {MODULE_SUBTYPE_MULTI_FUTABA, 0, true, true, STR_SUBTYPE_FUTABA, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_J6PRO, 0, false, true, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_FRSKYV, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HONTAI, 3, false, false, STR_SUBTYPE_HONTAI, nullptr}, - {MODULE_SUBTYPE_MULTI_OLRS, 0, false, false, NO_SUBTYPE, STR_RF_POWER}, - {MODULE_SUBTYPE_MULTI_FS_AFHDS2A, 5, true, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ}, - {MODULE_SUBTYPE_MULTI_Q2X2, 2, false, false, STR_SUBTYPE_Q2X2, nullptr}, - {MODULE_SUBTYPE_MULTI_WK_2X01, 5, true, true, STR_SUBTYPE_WK2x01, nullptr}, - {MODULE_SUBTYPE_MULTI_Q303, 3, false, false, STR_SUBTYPE_Q303, nullptr}, - {MODULE_SUBTYPE_MULTI_CABELL, 7, false, false, STR_SUBTYPE_CABELL, STR_MULTI_OPTION}, - {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr}, - {MODULE_SUBTYPE_MULTI_H83D, 3, false, false, STR_SUBTYPE_H83D, nullptr}, - {MODULE_SUBTYPE_MULTI_CORONA, 2, false, false, STR_SUBTYPE_CORONA, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HITEC, 2, false, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_WFLY, 0, true, false, STR_SUBTYPE_WFLY, nullptr}, - {MODULE_SUBTYPE_MULTI_BUGS_MINI, 1, false, false, STR_SUBTYPE_BUGS_MINI, nullptr}, - {MODULE_SUBTYPE_MULTI_TRAXXAS, 0, false, false, STR_SUBTYPE_TRAXXAS, nullptr}, - {MODULE_SUBTYPE_MULTI_E01X, 1, false, false, STR_SUBTYPE_E01X, nullptr}, - {MODULE_SUBTYPE_MULTI_V911S, 1, false, false, STR_SUBTYPE_V911S, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_GD00X, 1, false, false, STR_SUBTYPE_GD00X, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_V761, 1, false, false, STR_SUBTYPE_V761, nullptr}, - {MODULE_SUBTYPE_MULTI_KF606, 1, false, false, STR_SUBTYPE_KF606, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_POTENSIC, 0, false, false, STR_SUBTYPE_POTENSIC, nullptr}, - {MODULE_SUBTYPE_MULTI_ZSX, 0, false, false, STR_SUBTYPE_ZSX, nullptr}, - {MODULE_SUBTYPE_MULTI_HEIGHT, 1, false, false, STR_SUBTYPE_HEIGHT, nullptr}, - {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 3, false, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HOTT, 1, true, false, STR_SUBTYPE_HOTT, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, - {MODULE_SUBTYPE_MULTI_PELIKAN, 2, false, true, STR_SUBTYPE_PELIKAN, nullptr}, - {MODULE_SUBTYPE_MULTI_XK, 1, false, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_XN297DUMP, 5, false, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN}, - {MODULE_SUBTYPE_MULTI_FRSKYX2, 5, true, false, STR_SUBTYPE_FRSKYX, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_FRSKY_R9, 6, true, false, STR_SUBTYPE_FRSKYR9, nullptr}, - {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, STR_SUBTYPE_PROPEL, nullptr}, - {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, true, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_JJRC345, 1, false, false, STR_SUBTYPE_JJRC345, nullptr}, - {MODULE_SUBTYPE_MULTI_Q90C, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_KYOSHO, 1, false, true, STR_SUBTYPE_KYOSHO, nullptr}, - {MODULE_SUBTYPE_MULTI_RLINK, 2, false, false, STR_SUBTYPE_RLINK, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_ELRS, 0, false, false, STR_SUBTYPE_ELRS, nullptr}, - {MODULE_SUBTYPE_MULTI_REALACC, 0, false, false, STR_SUBTYPE_REALACC, nullptr}, - {MODULE_SUBTYPE_MULTI_OMP, 0, false, false, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_MLINK, 0, true, false, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_WFLY2, 0, true, false, STR_SUBTYPE_WFLY2, STR_MULTI_OPTION}, - {MODULE_SUBTYPE_MULTI_E016HV2, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_LOLI, 0, true, false, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_MOULDKG, 1, false, false, STR_SUBTYPE_MOULDKG, STR_MULTI_OPTION}, - {MODULE_SUBTYPE_MULTI_MT99XX2, 0, false, false, STR_SUBTYPE_MT992, nullptr}, - {MODULE_SUBTYPE_MULTI_KYOSHO2, 0, false, false, STR_SUBTYPE_KYOSHO2, nullptr}, - {MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION}, - - // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) - {0xfe, 0, false, false, NO_SUBTYPE, nullptr} -}; - -#undef NO_SUBTYPE - const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol) { const mm_protocol_definition *pdef; diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index a0d0580f5..74a5f0fc3 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -255,11 +255,6 @@ inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx) return MULTI_DISABLE_CHAN_MAP_ROW_STATIC(moduleIdx); } -inline bool isMultiProtocolSelectable(int protocol) -{ - return protocol != MODULE_SUBTYPE_MULTI_SCANNER; -} - inline bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx) { if (!isModuleMultimodule(moduleIdx)) { diff --git a/radio/src/io/multi_protolist.cpp b/radio/src/io/multi_protolist.cpp index bca9381b9..e112d0e45 100644 --- a/radio/src/io/multi_protolist.cpp +++ b/radio/src/io/multi_protolist.cpp @@ -284,8 +284,7 @@ bool MultiRfProtocols::scanReply(const uint8_t* packet, uint8_t len) // (const char*)packet); int proto = replyProtoId - 1; - if (proto != MODULE_SUBTYPE_MULTI_CONFIG && - proto != MODULE_SUBTYPE_MULTI_SCANNER) { + if (isMultiProtocolSelectable(proto)) { RfProto rfProto(proto); if (rfProto.parse(packet, len)) { proto2idx[proto] = protoList.size(); @@ -363,7 +362,7 @@ void MultiRfProtocols::fillBuiltinProtos() // build the list of static protos protoList.clear(); protoList.reserve(MODULE_SUBTYPE_MULTI_LAST - MODULE_SUBTYPE_MULTI_FIRST + 1); - for (; pdef->protocol != 0xfe; pdef++) { + for (; pdef->protocol != MODULE_SUBTYPE_MULTI_SENTINEL; pdef++) { RfProto rfProto(pdef->protocol); if (pdef->protocol == MM_RF_CUSTOM_SELECTED) break; // skip custom proto diff --git a/radio/src/model_init.cpp b/radio/src/model_init.cpp index 90140f1a6..8eaabb8f0 100644 --- a/radio/src/model_init.cpp +++ b/radio/src/model_init.cpp @@ -106,8 +106,8 @@ void setVendorSpecificModelDefaults(uint8_t id) // Those settings are for headless radio g_model.trainerData.mode = TRAINER_MODE_SLAVE; g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_MULTIMODULE; - g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY); - g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D8; + g_model.moduleData[INTERNAL_MODULE].multi.rfProtocol = MODULE_SUBTYPE_MULTI_FRSKY; + g_model.moduleData[INTERNAL_MODULE].subType = MULTI_FRSKYD_SUBTYPE_D8; g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES; #endif } diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index 69db89c62..4c177927e 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -102,106 +102,6 @@ enum ModuleSubtypeR9M { MODULE_SUBTYPE_R9M_LAST=MODULE_SUBTYPE_R9M_AUPLUS }; -/* Multi module */ - -enum ModuleSubtypeMulti { - MODULE_SUBTYPE_MULTI_FIRST = 0, - MODULE_SUBTYPE_MULTI_FLYSKY = MODULE_SUBTYPE_MULTI_FIRST, - MODULE_SUBTYPE_MULTI_HUBSAN, //1 - MODULE_SUBTYPE_MULTI_FRSKYD, //2 - MODULE_SUBTYPE_MULTI_HISKY, //3 - MODULE_SUBTYPE_MULTI_V2X2, //4 - MODULE_SUBTYPE_MULTI_DSM2, //5 - MODULE_SUBTYPE_MULTI_DEVO, - MODULE_SUBTYPE_MULTI_YD717, - MODULE_SUBTYPE_MULTI_KN, - MODULE_SUBTYPE_MULTI_SYMAX, - MODULE_SUBTYPE_MULTI_SLT, //10 - MODULE_SUBTYPE_MULTI_CX10, - MODULE_SUBTYPE_MULTI_CG023, - MODULE_SUBTYPE_MULTI_BAYANG, - MODULE_SUBTYPE_MULTI_FRSKYX, - MODULE_SUBTYPE_MULTI_ESky, //15 - MODULE_SUBTYPE_MULTI_MT99XX, - MODULE_SUBTYPE_MULTI_MJXQ, - MODULE_SUBTYPE_MULTI_SHENQI, - MODULE_SUBTYPE_MULTI_FY326, - MODULE_SUBTYPE_MULTI_FUTABA, //20 - MODULE_SUBTYPE_MULTI_J6PRO, - MODULE_SUBTYPE_MULTI_FQ777, - MODULE_SUBTYPE_MULTI_ASSAN, - MODULE_SUBTYPE_MULTI_FRSKYV, - MODULE_SUBTYPE_MULTI_HONTAI, //25 - MODULE_SUBTYPE_MULTI_OLRS, - MODULE_SUBTYPE_MULTI_FS_AFHDS2A, - MODULE_SUBTYPE_MULTI_Q2X2, - MODULE_SUBTYPE_MULTI_WK_2X01, - MODULE_SUBTYPE_MULTI_Q303, //30 - MODULE_SUBTYPE_MULTI_GW008, - MODULE_SUBTYPE_MULTI_DM002, - MODULE_SUBTYPE_MULTI_CABELL, - MODULE_SUBTYPE_MULTI_ESKY150, - MODULE_SUBTYPE_MULTI_H83D, //35 - MODULE_SUBTYPE_MULTI_CORONA, - MODULE_SUBTYPE_MULTI_CFLIE, - MODULE_SUBTYPE_MULTI_HITEC, - MODULE_SUBTYPE_MULTI_WFLY, - MODULE_SUBTYPE_MULTI_BUGS, //40 - MODULE_SUBTYPE_MULTI_BUGS_MINI, - MODULE_SUBTYPE_MULTI_TRAXXAS, - MODULE_SUBTYPE_MULTI_NCC1701, - MODULE_SUBTYPE_MULTI_E01X, - MODULE_SUBTYPE_MULTI_V911S, //45 - MODULE_SUBTYPE_MULTI_GD00X, - MODULE_SUBTYPE_MULTI_V761, - MODULE_SUBTYPE_MULTI_KF606, - MODULE_SUBTYPE_MULTI_REDPINE, - MODULE_SUBTYPE_MULTI_POTENSIC, //50 - MODULE_SUBTYPE_MULTI_ZSX, - MODULE_SUBTYPE_MULTI_HEIGHT, - MODULE_SUBTYPE_MULTI_SCANNER, - MODULE_SUBTYPE_MULTI_FRSKYX_RX, - MODULE_SUBTYPE_MULTI_AFHDS2A_RX, //55 - MODULE_SUBTYPE_MULTI_HOTT, - MODULE_SUBTYPE_MULTI_FX816, - MODULE_SUBTYPE_MULTI_BAYANG_RX, - MODULE_SUBTYPE_MULTI_PELIKAN, - MODULE_SUBTYPE_MULTI_TIGER, //60 - MODULE_SUBTYPE_MULTI_XK, - MODULE_SUBTYPE_MULTI_XN297DUMP, - MODULE_SUBTYPE_MULTI_FRSKYX2, - MODULE_SUBTYPE_MULTI_FRSKY_R9, - MODULE_SUBTYPE_MULTI_PROPEL, //65 - MODULE_SUBTYPE_MULTI_FRSKYL, - MODULE_SUBTYPE_MULTI_SKYARTEC, - MODULE_SUBTYPE_MULTI_ESKY150V2, - MODULE_SUBTYPE_MULTI_DSM_RX, - MODULE_SUBTYPE_MULTI_JJRC345, //70 - MODULE_SUBTYPE_MULTI_Q90C, - MODULE_SUBTYPE_MULTI_KYOSHO, - MODULE_SUBTYPE_MULTI_RLINK, - MODULE_SUBTYPE_MULTI_ELRS, - MODULE_SUBTYPE_MULTI_REALACC, //75 - MODULE_SUBTYPE_MULTI_OMP, - MODULE_SUBTYPE_MULTI_MLINK, - MODULE_SUBTYPE_MULTI_WFLY2, - MODULE_SUBTYPE_MULTI_E016HV2, - MODULE_SUBTYPE_MULTI_E010R5, //80 - MODULE_SUBTYPE_MULTI_LOLI, - MODULE_SUBTYPE_MULTI_E129, - MODULE_SUBTYPE_MULTI_JOYSWAY, - MODULE_SUBTYPE_MULTI_E016H, - MODULE_SUBTYPE_MULTI_CONFIG, //85 - MODULE_SUBTYPE_MULTI_IKEAANSLUTA, - MODULE_SUBTYPE_MULTI_WILLIFM, - MODULE_SUBTYPE_MULTI_LOSI, - MODULE_SUBTYPE_MULTI_MOULDKG, - MODULE_SUBTYPE_MULTI_XERALL, //90 - MODULE_SUBTYPE_MULTI_MT99XX2, - MODULE_SUBTYPE_MULTI_KYOSHO2, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_KYOSHO2 -}; - enum MMDSM2Subtypes { MM_RF_DSM2_SUBTYPE_DSM2_22, MM_RF_DSM2_SUBTYPE_DSM2_11, diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index f58c0005a..1f4891c17 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -27,6 +27,7 @@ #include "opentx_helpers.h" #include "storage/storage.h" #include "globals.h" +#include "MultiProtoDefs.h" #if defined(MULTIMODULE) #include "telemetry/multi.h" @@ -48,33 +49,102 @@ extern uint32_t NV14internalModuleFwVersion; (moduleState[module].protocol == PROTOCOL_CHANNELS_PXX2)) #if defined (MULTIMODULE) -#define IS_D16_MULTI(module) \ - ((g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_FRSKYX) || \ - (g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_FRSKYX2)) + #define IS_D16_MULTI(module) \ + ((g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_FRSKYX) || \ + (g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_FRSKYX2)) -#define IS_R9_MULTI(module) \ - (g_model.moduleData[module].multi.rfProtocol == \ - MODULE_SUBTYPE_MULTI_FRSKY_R9) + #define IS_R9_MULTI(module) \ + (g_model.moduleData[module].multi.rfProtocol == \ + MODULE_SUBTYPE_MULTI_FRSKY_R9) -#define IS_HOTT_MULTI(module) \ - (g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_HOTT) + #define IS_HOTT_MULTI(module) \ + (g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_HOTT) -#define IS_CONFIG_MULTI(module) \ - (g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_CONFIG) + #define IS_CONFIG_MULTI(module) \ + (g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_CONFIG) -#define IS_DSM_MULTI(module) \ - (g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) + #define IS_DSM_MULTI(module) \ + (g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) -#define IS_RX_MULTI(module) \ - ((g_model.moduleData[module].multi.rfProtocol == \ - MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || \ - (g_model.moduleData[module].multi.rfProtocol == \ - MODULE_SUBTYPE_MULTI_FRSKYX_RX) || \ - (g_model.moduleData[module].multi.rfProtocol == \ - MODULE_SUBTYPE_MULTI_BAYANG_RX) || \ - (g_model.moduleData[module].multi.rfProtocol == \ - MODULE_SUBTYPE_MULTI_DSM_RX)) + #define IS_RX_MULTI(module) \ + ((g_model.moduleData[module].multi.rfProtocol == \ + MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || \ + (g_model.moduleData[module].multi.rfProtocol == \ + MODULE_SUBTYPE_MULTI_FRSKYX_RX) || \ + (g_model.moduleData[module].multi.rfProtocol == \ + MODULE_SUBTYPE_MULTI_BAYANG_RX) || \ + (g_model.moduleData[module].multi.rfProtocol == \ + MODULE_SUBTYPE_MULTI_DSM_RX)) + // When using packed, the pointer in here end up not being aligned, which clang and gcc complain about + // Keep the order of the fields that the so that the size stays small + struct mm_options_strings { + static const char* const options[]; + }; + + const uint8_t getMaxMultiOptions(); + + struct mm_protocol_definition { + uint8_t protocol; + uint8_t maxSubtype; + bool failsafe; + bool disable_ch_mapping; + const char* const* subTypeString; + const char* optionsstr; + }; + + const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); + + inline uint8_t getMaxMultiSubtype(uint8_t moduleIdx) + { + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + + uint8_t max_pdef = 0; + auto proto = g_model.moduleData[moduleIdx].multi.rfProtocol; + const mm_protocol_definition *pdef = getMultiProtocolDefinition(proto); + if (pdef) { + max_pdef = pdef->maxSubtype; + } + + uint8_t max_status = 0; + if (status.isValid()) { + max_status = (status.protocolSubNbr == 0 ? 0 : status.protocolSubNbr - 1); + } + + return max(max_status, max_pdef); + } + + inline bool isModuleMultimodule(uint8_t idx) + { + return g_model.moduleData[idx].type == MODULE_TYPE_MULTIMODULE; + } + + inline bool isModuleMultimoduleDSM2(uint8_t idx) + { + return isModuleMultimodule(idx) && + g_model.moduleData[idx].multi.rfProtocol == + MODULE_SUBTYPE_MULTI_DSM2; + } + + inline void resetMultiProtocolsOptions(uint8_t moduleIdx) + { + if (!isModuleMultimodule(moduleIdx)) + return; + + // Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled + if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) { + g_model.moduleData[moduleIdx].multi.autoBindMode = 1; + } + else { + g_model.moduleData[moduleIdx].multi.autoBindMode = 0; + } + g_model.moduleData[moduleIdx].multi.optionValue = 0; + g_model.moduleData[moduleIdx].multi.disableTelemetry = 0; + g_model.moduleData[moduleIdx].multi.disableMapping = 0; + g_model.moduleData[moduleIdx].multi.lowPowerMode = 0; + g_model.moduleData[moduleIdx].failsafeMode = FAILSAFE_NOT_SET; + g_model.header.modelId[moduleIdx] = 0; + } #else #define IS_D16_MULTI(module) false #define IS_R9_MULTI(module) false @@ -82,68 +152,16 @@ extern uint32_t NV14internalModuleFwVersion; #define IS_CONFIG_MULTI(module) false #define IS_DSM_MULTI(module) false #define IS_RX_MULTI(module) false -#endif -#if defined(MULTIMODULE) -// When using packed, the pointer in here end up not being aligned, which clang and gcc complain about -// Keep the order of the fields that the so that the size stays small -struct mm_options_strings { - static const char* const options[]; -}; - -const uint8_t getMaxMultiOptions(); - -struct mm_protocol_definition { - uint8_t protocol; - uint8_t maxSubtype; - bool failsafe; - bool disable_ch_mapping; - const char* const* subTypeString; - const char* optionsstr; -}; - -const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); - -inline uint8_t getMaxMultiSubtype(uint8_t moduleIdx) -{ - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - - uint8_t max_pdef = 0; - auto proto = g_model.moduleData[moduleIdx].multi.rfProtocol; - const mm_protocol_definition *pdef = getMultiProtocolDefinition(proto); - if (pdef) { - max_pdef = pdef->maxSubtype; + inline bool isModuleMultimodule(uint8_t) + { + return false; } - uint8_t max_status = 0; - if (status.isValid()) { - max_status = (status.protocolSubNbr == 0 ? 0 : status.protocolSubNbr - 1); + inline bool isModuleMultimoduleDSM2(uint8_t) + { + return false; } - - return max(max_status, max_pdef); -} - -inline bool isModuleMultimodule(uint8_t idx) -{ - return g_model.moduleData[idx].type == MODULE_TYPE_MULTIMODULE; -} - -inline bool isModuleMultimoduleDSM2(uint8_t idx) -{ - return isModuleMultimodule(idx) && - g_model.moduleData[idx].multi.rfProtocol == - MODULE_SUBTYPE_MULTI_DSM2; -} -#else -inline bool isModuleMultimodule(uint8_t) -{ - return false; -} - -inline bool isModuleMultimoduleDSM2(uint8_t) -{ - return false; -} #endif inline bool isModuleTypeXJT(uint8_t type) @@ -648,10 +666,11 @@ inline uint8_t getMaxRxNum(uint8_t idx) if (isModuleMultimodule(idx)) { switch (g_model.moduleData[idx].multi.rfProtocol) { case MODULE_SUBTYPE_MULTI_OLRS: - return 4; + return MODULE_SUBTYPE_MULTI_OLRS_RXNUM; case MODULE_SUBTYPE_MULTI_BUGS: + return MODULE_SUBTYPE_MULTI_BUGS_RXNUM; case MODULE_SUBTYPE_MULTI_BUGS_MINI: - return 15; + return MODULE_SUBTYPE_MULTI_BUGS_MINI_RXNUM; } } #endif @@ -810,56 +829,4 @@ inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType) extern bool isExternalAntennaEnabled(); -#if defined(MULTIMODULE) -inline void resetMultiProtocolsOptions(uint8_t moduleIdx) -{ - if (!isModuleMultimodule(moduleIdx)) - return; - - // Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled - if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) { - g_model.moduleData[moduleIdx].multi.autoBindMode = 1; - } - else { - g_model.moduleData[moduleIdx].multi.autoBindMode = 0; - } - g_model.moduleData[moduleIdx].multi.optionValue = 0; - g_model.moduleData[moduleIdx].multi.disableTelemetry = 0; - g_model.moduleData[moduleIdx].multi.disableMapping = 0; - g_model.moduleData[moduleIdx].multi.lowPowerMode = 0; - g_model.moduleData[moduleIdx].failsafeMode = FAILSAFE_NOT_SET; - g_model.header.modelId[moduleIdx] = 0; -} - -inline void getMultiOptionValues(int8_t multi_proto, int8_t & min, int8_t & max) -{ - switch (multi_proto) { - case MODULE_SUBTYPE_MULTI_DSM2: - min = 0; - max = 1; - break; - case MODULE_SUBTYPE_MULTI_BAYANG: - min = 0; - max = 3; - break; - case MODULE_SUBTYPE_MULTI_OLRS: - min = -1; - max = 7; - break; - case MODULE_SUBTYPE_MULTI_FS_AFHDS2A: - min = 0; - max = 70; - break; - case MODULE_SUBTYPE_MULTI_XN297DUMP: - min = -1; - max = 84; - break; - default: - min = -128; - max = 127; - break; - } -} -#endif - #endif // _MODULES_HELPERS_H_ diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 94def2f5e..34f500195 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -1888,8 +1888,20 @@ static void r_modSubtype(void* user, uint8_t* data, uint32_t bitoffs, // convert to ETX format and write to vars if (type > 0) { - md->multi.rfProtocol = type - 1; - md->subType = subtype; + type -= 1; // change to internal 0 based representation + + if(type > MODULE_SUBTYPE_MULTI_LAST) { + TRACE("Multi protocol: %d exceeds supported protocols. Module set to: OFF", type); + md->type = MODULE_TYPE_NONE; + } else { + if(subtype > getMultiProtocolDefinition(type)->maxSubtype) { + TRACE("Multi protocol sub-type %d exceeds number of supported sub-types. Module set to: OFF", subtype); + md->type = MODULE_TYPE_NONE; + } else { + md->multi.rfProtocol = type; + md->subType = subtype; + } + } } #endif } else if (md->type == MODULE_TYPE_DSM2) { diff --git a/radio/src/targets/taranis/bind_button_driver.cpp b/radio/src/targets/taranis/bind_button_driver.cpp index 966c15d45..a9feeb5d2 100644 --- a/radio/src/targets/taranis/bind_button_driver.cpp +++ b/radio/src/targets/taranis/bind_button_driver.cpp @@ -19,8 +19,8 @@ * GNU General Public License for more details. */ -#include "board.h" - +#include "opentx.h" +#include "MultiProtoDefs.h" bool setBindProtocolSelection() { @@ -29,16 +29,16 @@ bool setBindProtocolSelection() // Center: D8 if (abs(xPos < 50 && abs(yPos) < 50)) { - g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY); - g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D8; + g_model.moduleData[INTERNAL_MODULE].multi.rfProtocol = MODULE_SUBTYPE_MULTI_FRSKY; + g_model.moduleData[INTERNAL_MODULE].subType = MULTI_FRSKYD_SUBTYPE_D8; storageDirty(EE_MODEL); return true; } // Top left: D16 FCC if (xPos < -512 && yPos > 512) { - g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY); - g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D16; + g_model.moduleData[INTERNAL_MODULE].multi.rfProtocol = MODULE_SUBTYPE_MULTI_FRSKYX; + g_model.moduleData[INTERNAL_MODULE].subType = MULTI_FRSKYX_SUBTYPE_D16_FCC; g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES; storageDirty(EE_MODEL); return true; @@ -46,8 +46,8 @@ bool setBindProtocolSelection() // Top right: D16 LBT if (xPos > 512 && yPos > 512) { - g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY); - g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D16_LBT; + g_model.moduleData[INTERNAL_MODULE].multi.rfProtocol = MODULE_SUBTYPE_MULTI_FRSKYX; + g_model.moduleData[INTERNAL_MODULE].subType = MULTI_FRSKYX_SUBTYPE_D16_LBT; g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES; storageDirty(EE_MODEL); return true; @@ -55,8 +55,8 @@ bool setBindProtocolSelection() // Bottom left: V2.1 D16 FCC if (xPos < -512 && yPos < -512) { - g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKYX2); - g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKYX2_SUBTYPE_D16; + g_model.moduleData[INTERNAL_MODULE].multi.rfProtocol = MODULE_SUBTYPE_MULTI_FRSKYX2; + g_model.moduleData[INTERNAL_MODULE].subType = MULTI_FRSKYX2_SUBTYPE_D16_FCC; g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES; storageDirty(EE_MODEL); return true; @@ -64,8 +64,8 @@ bool setBindProtocolSelection() // Bottom right: V2.1 D16 LBT if (xPos > 512 && yPos < -512) { - g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKYX2); - g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKYX2_SUBTYPE_D16_LBT; + g_model.moduleData[INTERNAL_MODULE].multi.rfProtocol = MODULE_SUBTYPE_MULTI_FRSKYX2; + g_model.moduleData[INTERNAL_MODULE].subType = MULTI_FRSKYX2_SUBTYPE_D16_LBT; g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES; storageDirty(EE_MODEL); return true; @@ -79,7 +79,7 @@ void bindButtonHandler(event_t event) if( !isModuleMultimodule(INTERNAL_MODULE)) return; - if (event == EVT_KEY_LONG(KEY_BIND) && getMultiBindStatus(INTERNAL_MODULE) == MULTI_NORMAL_OPERATION) { + if (event == EVT_KEY_LONG(KEY_BIND) && getMultiBindStatus(INTERNAL_MODULE) == MULTI_BIND_NONE) { if (setBindProtocolSelection()) { setMultiBindStatus(INTERNAL_MODULE, MULTI_BIND_INITIATED); moduleState[INTERNAL_MODULE].mode = MODULE_MODE_BIND; @@ -94,7 +94,7 @@ void bindButtonHandler(event_t event) } if (getMultiBindStatus(INTERNAL_MODULE) == MULTI_BIND_FINISHED) { - setMultiBindStatus(INTERNAL_MODULE, MULTI_NORMAL_OPERATION); + setMultiBindStatus(INTERNAL_MODULE, MULTI_BIND_NONE); moduleState[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; LED_ERROR_END(); } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 67d5b3cce..20f195265 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -111,7 +111,8 @@ ISTR(VSWASHTYPE); #if defined(MULTIMODULE) ISTR(MULTI_PROTOCOLS); ISTR(MULTI_POWER); -ISTR(MULTI_TELEMETRY_MODE); +ISTR(MULTI_BAYANG_OPTIONS); +ISTR(MULTI_DSM_OPTIONS); ISTR(MULTI_WBUS_MODE); #endif diff --git a/radio/src/translations.h b/radio/src/translations.h index c30b4318c..2a17e34f8 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -205,7 +205,8 @@ extern const char* const STR_SBUS_INVERSION_VALUES[]; extern const char* const STR_MULTI_PROTOCOLS[]; extern const char* const STR_MULTI_POWER[]; -extern const char* const STR_MULTI_TELEMETRY_MODE[]; +extern const char* const STR_MULTI_BAYANG_OPTIONS[]; +extern const char* const STR_MULTI_DSM_OPTIONS[]; extern const char* const STR_MULTI_WBUS_MODE[]; extern const char* const STR_SPORT_MODES[]; extern const char* const STR_FSGROUPS[]; diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 81ac8a568..a19f2f848 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -60,7 +60,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","not inverted" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "自定义" #define TR_VTRIMINC "指数","很小","较小","中等","较大" #define TR_VDISPLAYTRIMS "不显示","改变时","始终显示" diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 2c94b8531..32d2336b2 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -63,7 +63,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (kabel)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetrie" #define TR_SBUS_INVERSION_VALUES "normal","neinvertováno" -#define TR_MULTI_TELEMETRY_MODE "VYP","ZAP","ZAP+Aux","ZAP+Aux" #define TR_MULTI_CUSTOM "Vlastní" #define TR_VTRIMINC "Expo","ExJemný","Jemný","Střední","Hrubý" #define TR_VDISPLAYTRIMS "Ne","Změna","Ano" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index a78fe6289..dffafda0e 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -66,7 +66,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (kabel)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetri" #define TR_SBUS_INVERSION_VALUES "normal","ikke invers" -#define TR_MULTI_TELEMETRY_MODE "Fra","Til","Fra+Aux","Til+Aux" #define TR_MULTI_CUSTOM "Tilpasset" #define TR_VTRIMINC TR("Expo","Exponentiel"),TR("ExFin","Ekstra fin"),"Fin","Medium","Grov" #define TR_VDISPLAYTRIMS "Nej","Ændre","Ja" diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 964b21826..d021e5289 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -63,7 +63,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (Kabel)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetrie" #define TR_SBUS_INVERSION_VALUES "normal","nicht inv." -#define TR_MULTI_TELEMETRY_MODE "Aus","Ein","Aus+Aux","Ein+Aux" #define TR_MULTI_CUSTOM "Benutzer" #define TR_VTRIMINC TR("Expo","Exponentiell"),TR("ExFein","Extrafein"),"Fein","Mittel","Grob" #define TR_VDISPLAYTRIMS "Nein","Kurz","Ja" // Trimmwerte Keine, kurze Anzeigen, Ja diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 7a63517e4..3bdeea4a7 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -59,7 +59,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","not inverted" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Exponential"),TR("ExFine","Extra Fine"),"Fine","Medium","Coarse" #define TR_VDISPLAYTRIMS "No","Change","Yes" diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index 9648b481a..0dafa4bc9 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -61,7 +61,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","not inverted" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Exponencial"),TR("ExFino","Extra fino")"Fino","Medio","Grueso" #define TR_VDISPLAYTRIMS "No","Cambiar","Si" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 99abfcfb0..5fc143d66 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -63,7 +63,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","not inverted" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Exponential"),TR("EriHie","Eri Hieno"),"Hieno","Keski","Karkea" #define TR_VDISPLAYTRIMS "No","Change","Yes" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index b893de690..ae6a636d9 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -62,7 +62,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (câble)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Télémetrie" #define TR_SBUS_INVERSION_VALUES "normal","non inversé" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "Perso" #define TR_VTRIMINC TR("Expo","Exponentiel"),TR("ExFin","Extra Fin"),"Fin","Moyen",TR("Gros","Grossier") #define TR_VDISPLAYTRIMS "Non","Change","Oui" diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index 90e4d0a66..885af267c 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -64,7 +64,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Telemetria Multi" #define TR_SBUS_INVERSION_VALUES "normale","non invertito" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "Person." #define TR_VTRIMINC TR("Expo","Esponenziale"),TR("ExFine","Extra Fine"),"Fine","Medio","Ampio" #define TR_VDISPLAYTRIMS "No","Cambio","Si" diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index 4f4a18540..f692cc105 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -59,7 +59,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "標準","リバースなし" -#define TR_MULTI_TELEMETRY_MODE "OFF","ON","OFF+AUX","ON+AUX" #define TR_MULTI_CUSTOM "カスタム" #define TR_VTRIMINC "ステップExpo","ステップ極小","ステップ小","ステップ中","ステップ大" #define TR_VDISPLAYTRIMS "非表示","変更時","常時表示" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 3c590f6e8..4886f32cb 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -62,7 +62,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","not inverted" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Exponentieel"),TR("ExFijn","Extra Fijn"),"Fijn","Medium","Grof" #define TR_VDISPLAYTRIMS "Nee","Kort","Ja" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index bfe04c4c1..82ade8704 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -61,7 +61,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","not inverted" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Expotencja"),TR("B.Dokł","B.Dokładny"),TR("Dokł.","Dokładny"),"Średni",TR("Zgrubn","Zgrubny") #define TR_VDISPLAYTRIMS "Nie","Zmień","Tak" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 428471b0f..7e1b43719 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -61,7 +61,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","not inverted" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC "Expo","ExFino","Fino","Medio","Largo" #define TR_VDISPLAYTRIMS "No","Change","Yes" diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index d05cfd5ec..8c5334fd2 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -69,7 +69,6 @@ #define TR_JACK_MODES "Fråga","Audio","Lärare" #define TR_TELEMETRY_PROTOCOLS "FrSky S.Port","FrSky D","FrSky D (sladd)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","ej inverterad" -#define TR_MULTI_TELEMETRY_MODE "Av","På","Av+Aux","På+Aux" #define TR_MULTI_CUSTOM "Anpassad" #define TR_VTRIMINC TR("Expo","Exponentiell"),TR("xFin","Extra fin"),"Fin","Medium","Grov" #define TR_VDISPLAYTRIMS "Nej","Ändring","Ja" diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 1fda2d512..8d985d1b8 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -60,7 +60,6 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (cable)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","not inverted" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" #define TR_MULTI_CUSTOM "自定義" #define TR_VTRIMINC "指數","很小","較小","中等","較大" #define TR_VDISPLAYTRIMS "不顯示","改變時","始終顯示" diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 34cd1bdb0..857cf68cc 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -28,6 +28,8 @@ * \0 -ends current string */ +#include "MultiProtoDefs.h" + #if defined(PCBX12S) #define TR_POTS_VSRCRAW STR_CHAR_POT"S1", STR_CHAR_POT"6P", STR_CHAR_POT"S2", STR_CHAR_TRIM"L1", STR_CHAR_TRIM"L2", STR_CHAR_SLIDER"LS", STR_CHAR_SLIDER"RS", STR_CHAR_POT"JSx", STR_CHAR_POT"JSy" #define TR_SW_VSRCRAW STR_CHAR_SWITCH"SA", STR_CHAR_SWITCH"SB", STR_CHAR_SWITCH"SC", STR_CHAR_SWITCH"SD", STR_CHAR_SWITCH"SE", STR_CHAR_SWITCH"SF", STR_CHAR_SWITCH"SG", STR_CHAR_SWITCH"SH", STR_CHAR_SWITCH"SI", STR_CHAR_SWITCH"SJ" @@ -137,13 +139,9 @@ #define TR_PPM_PROTOCOLS TR("No Telem", "No Telemetry"),"MLink" #define TR_DSM_PROTOCOLS "LP45","DSM2","DSMX" -#define TR_MULTI_PROTOCOLS "FlySky","Hubsan","FrSkyD","Hisky","V2x2","DSM","Devo","YD717","KN","SymaX","SLT","CX10","CG023", \ - "Bayang","FrSkyX","ESky","MT99XX","MJXq","Shenqi","FY326","Futaba","J6 Pro","FQ777","Assan","FrSkyV","Hontai","OpenLrs","FlSky2A","Q2x2","Walkera", \ - "Q303","GW008","DM002","Cabell","Esky150","H8 3D","Corona","CFlie","Hitec","WFly","Bugs","BugMini","Traxxas","NCC1701","E01X", \ - "V911S","GD00X","V761","KF606","Redpine","Potensi","ZSX","Height","Scanner","FrSkyRX","FS2A_RX","HoTT","FX816","BayanRX","Pelikan","Tiger", \ - "XK","XN297DU","FrSkyX2","FrSkyR9","Propel","FrSkyL","Skyartc","ESky-v2","DSM RX","JJRC345","Q90C","Kyosho","RadLink","ExpLRS","Realacc", \ - "OMP","M-Link","Wfly 2","E016Hv2","E010r5","LOLI","E129","JOYSWAY","E016H","Config","IKEA","WILLIFM","Losi","MouldKg","Xerall","MT99XX2", \ - "Kyosho2" +#define TR_MULTI_PROTOCOLS PROTO_NAMES +#define TR_MULTI_BAYANG_OPTIONS BAYANG_OPTION_TELEMETRY_NAMES +#define TR_MULTI_DSM_OPTIONS DSM2_OPTION_SERVOFREQ_NAMES #define TR_MULTI_POWER "1.6mW","2.0mW","2.5mW","3.2mW","4.0mW","5.0mW","6.3mW","7.9mW","10mW","13mW","16mW","20mW","25mW","32mW","40mW","50mW" #define TR_MULTI_WBUS_MODE "WBUS","PPM"