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"