1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-25 01:05:10 +03:00

Streamline multi interface (#7524)

This commit is contained in:
3djc 2020-04-21 14:53:33 +02:00 committed by GitHub
parent 07b096ff44
commit 9c632b582d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 147 additions and 36 deletions

View file

@ -313,7 +313,7 @@ void onBluetoothConnectMenu(const char * result)
MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \
MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \
MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS */ \
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(MODULE_BIND_ROWS(INTERNAL_MODULE)))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM */ \
MODULE_OPTION_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS */ \
MULTIMODULE_MODULE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND */ \
@ -1000,7 +1000,25 @@ void menuModelSetup(event_t event)
lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, multi_rfProto, attr);
if (attr) {
int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
if (direction == -1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
else
multiRfProto = convertMultiToOtx(status.protocolPrev);
}
if (direction == 1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
else
multiRfProto = convertMultiToOtx(status.protocolNext);
}
}
else {
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
}
if (checkIncDec_Ret) {
g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto);
g_model.moduleData[moduleIdx].subType = 0;
@ -1326,7 +1344,8 @@ void menuModelSetup(event_t event)
}
}
lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0);
lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
if (!IS_RX_MULTI(moduleIdx))
lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
uint8_t newFlag = 0;
#if defined(MULTIMODULE)
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
@ -1586,7 +1605,7 @@ void menuModelSetup(event_t event)
}
#if defined(MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event);
}
#endif

View file

@ -907,7 +907,25 @@ void menuModelSetup(event_t event)
switch (menuHorizontalPosition) {
case 0: {
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
MultiModuleStatus &status = getMultiModuleStatus(EXTERNAL_MODULE);
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
if (direction == -1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
else
multiRfProto = convertMultiToOtx(status.protocolPrev);
}
if (direction == 1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
else
multiRfProto = convertMultiToOtx(status.protocolNext);
}
}
else {
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
}
if (checkIncDec_Ret) {
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto);
g_model.moduleData[EXTERNAL_MODULE].subType = 0;
@ -1122,8 +1140,13 @@ void menuModelSetup(event_t event)
lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM);
}
if (isModuleBindRangeAvailable(moduleIdx)) {
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
bindButtonPos = lcdNextPos + FW;
if (!IS_RX_MULTI(moduleIdx)) {
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz == 0 ? attr : 0) | LEADING0 | LEFT, 2);
bindButtonPos = lcdNextPos + FW;
}
else {
bindButtonPos = MODEL_SETUP_2ND_COLUMN;
}
if (attr && l_posHorz==0) {
if (s_editMode>0) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
@ -1141,7 +1164,8 @@ void menuModelSetup(event_t event)
}
}
lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0);
lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
if (!IS_RX_MULTI(moduleIdx))
lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
uint8_t newFlag = 0;
#if defined(MULTIMODULE)
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
@ -1306,7 +1330,7 @@ void menuModelSetup(event_t event)
}
#if defined (MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event);
}
#endif
break;

View file

@ -1112,9 +1112,27 @@ bool menuModelSetup(event_t event)
if (isModuleDSM2(moduleIdx))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
#if defined(MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
else if (isModuleMultimodule(moduleIdx)) {
int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
if (direction == -1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
else
multiRfProto = convertMultiToOtx(status.protocolPrev);
}
if (direction == 1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
else
multiRfProto = convertMultiToOtx(status.protocolNext);
}
}
else {
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
}
if (checkIncDec_Ret) {
g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto);
g_model.moduleData[moduleIdx].subType = 0;
@ -1336,7 +1354,8 @@ bool menuModelSetup(event_t event)
{
lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MODULE);
drawButton(MODEL_SETUP_2ND_COLUMN, y, STR_REGISTER, (menuHorizontalPosition == 0 ? attr : 0));
drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0));
if (!IS_RX_MULTI(moduleIdx))
drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0));
if (attr) {
if (moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) {
if (menuHorizontalPosition == 0 && event == EVT_KEY_BREAK(KEY_ENTER)) {
@ -1520,7 +1539,8 @@ bool menuModelSetup(event_t event)
}
}
drawButton(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, (moduleState[moduleIdx].mode == MODULE_MODE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0));
drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0));
if (!IS_RX_MULTI(moduleIdx))
drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0));
uint8_t newFlag = 0;
#if defined(MULTIMODULE)
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
@ -1683,7 +1703,7 @@ bool menuModelSetup(event_t event)
}
#if defined(MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER);
lcdDrawText(MENUS_MARGIN_LEFT, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER);
g_model.moduleData[moduleIdx].multi.lowPowerMode = editCheckBox(g_model.moduleData[moduleIdx].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event);
}
#endif

View file

@ -789,7 +789,7 @@ int getFirstAvailable(int min, int max, IsValueAvailable isValueAvailable)
#if defined(MULTIMODULE)
// This maps OpenTX multi type with Pascal's Multi type
uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
uint8_t multiConvertOtxToMulti(uint8_t moduleIdx, uint8_t type)
{
// 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky)
@ -818,6 +818,27 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
return type;
}
// This maps multi type to OpenTX number, type ONLY (no subtype)
int convertMultiToOtx(int type)
{
if (type == 3) //FrSkyD
return MODULE_SUBTYPE_MULTI_FRSKY;
if (type == 15) //FrSkyX
return MODULE_SUBTYPE_MULTI_FRSKY;
if (type == 25) //FrSkyV
return MODULE_SUBTYPE_MULTI_FRSKY;
if (type > 25)
type = type - 1;
if (type > 15)
type = type - 1;
return type - 1; //Multi list starts at 1
}
// Third row is number of subtypes -1 (max valid subtype)
#define NO_SUBTYPE nullptr
@ -866,6 +887,7 @@ const char STR_SUBTYPE_ZSX[] = "\007""280JJRC";
const char STR_SUBTYPE_FLYZONE[] = "\005""FZ410";
const char STR_SUBTYPE_FX816[] = "\003""P38";
const char STR_SUBTYPE_ESKY150[] = "\003""4CH""7CH";
const char STR_SUBTYPE_FRSKYL[] = "\010""LR12\0 ""LR12 6ch";
const char* mm_options_strings::options[] = {
nullptr,
@ -925,6 +947,8 @@ const mm_protocol_definition multi_protocols[] = {
{MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr},
{MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, NO_SUBTYPE, nullptr},
{MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE},
{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)

View file

@ -122,6 +122,8 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value,
void drawSourceCustomValue(coord_t x, coord_t y, source_t channel, int32_t val, LcdFlags flags=0);
void drawSourceValue(coord_t x, coord_t y, source_t channel, LcdFlags flags=0);
int convertMultiToOtx(int type);
void drawCurve(coord_t offset=0);
#if defined(COLORLCD)
@ -139,6 +141,9 @@ void runFatalErrorScreen(const char * message);
inline uint8_t MODULE_BIND_ROWS(int moduleIdx)
{
if (IS_RX_MULTI(moduleIdx))
return 0;
if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx))
return 1;
@ -150,7 +155,7 @@ inline uint8_t MODULE_BIND_ROWS(int moduleIdx)
inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx)
{
if (!IS_MODULE_ENABLED(moduleIdx))
if (!IS_MODULE_ENABLED(moduleIdx) || IS_RX_MULTI(moduleIdx))
return HIDDEN_ROW;
if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || isModuleSBUS(moduleIdx) || (isModuleMultimodule(moduleIdx) && g_model.moduleData[moduleIdx].getMultiProtocol() != MODULE_SUBTYPE_MULTI_DSM2))
@ -250,14 +255,14 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx)
return false;
}
#define MULTIMODULE_MODULE_ROWS(moduleIdx) MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP
#define MULTIMODULE_MODULE_ROWS(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP
#define MULTIMODULE_TYPE_ROW(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW,
#define MULTIMODULE_STATUS_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(moduleIdx) && getMultiSyncStatus(moduleIdx).isValid()) ? TITLE_ROW : HIDDEN_ROW,
#define MULTIMODULE_MODE_ROWS(moduleIdx) (g_model.moduleData[moduleIdx].multi.customProto) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t)2 : (uint8_t)1
#define MULTIMODULE_TYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW,
#define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW,
#define MULTIMODULE_OPTIONS_ROW(moduleIdx) (isModuleMultimodule(moduleIdx) && MULTIMODULE_HASOPTIONS(moduleIdx)) ? (uint8_t) 0: HIDDEN_ROW
#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW
#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW
#else
#define MULTIMODULE_STATUS_ROWS(moduleIdx)

View file

@ -71,7 +71,7 @@ class MultiFirmwareInformation {
bool isMultiInternalFirmware() const
{
return (boardType == FIRMWARE_MULTI_STM && telemetryInversion == false && optibootSupport == true && bootloaderCheck == true && telemetryType == FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY);
return (boardType == FIRMWARE_MULTI_STM && optibootSupport == true && bootloaderCheck == true && telemetryType == FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY);
}
bool isMultiExternalFirmware() const

View file

@ -102,68 +102,70 @@ enum ModuleSubtypeR9M {
enum ModuleSubtypeMulti {
MODULE_SUBTYPE_MULTI_FIRST = 0,
MODULE_SUBTYPE_MULTI_FLYSKY = MODULE_SUBTYPE_MULTI_FIRST,
MODULE_SUBTYPE_MULTI_HUBSAN,
MODULE_SUBTYPE_MULTI_FRSKY,
MODULE_SUBTYPE_MULTI_HISKY,
MODULE_SUBTYPE_MULTI_V2X2,
MODULE_SUBTYPE_MULTI_DSM2,
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,
MODULE_SUBTYPE_MULTI_SLT, //10
MODULE_SUBTYPE_MULTI_CX10,
MODULE_SUBTYPE_MULTI_CG023,
MODULE_SUBTYPE_MULTI_BAYANG,
MODULE_SUBTYPE_MULTI_ESky,
MODULE_SUBTYPE_MULTI_MT99XX,
MODULE_SUBTYPE_MULTI_MT99XX, //15
MODULE_SUBTYPE_MULTI_MJXQ,
MODULE_SUBTYPE_MULTI_SHENQI,
MODULE_SUBTYPE_MULTI_FY326,
MODULE_SUBTYPE_MULTI_SFHSS,
MODULE_SUBTYPE_MULTI_J6PRO,
MODULE_SUBTYPE_MULTI_J6PRO, //20
MODULE_SUBTYPE_MULTI_FQ777,
MODULE_SUBTYPE_MULTI_ASSAN,
MODULE_SUBTYPE_MULTI_HONTAI,
MODULE_SUBTYPE_MULTI_OLRS,
MODULE_SUBTYPE_MULTI_FS_AFHDS2A,
MODULE_SUBTYPE_MULTI_FS_AFHDS2A, //25
MODULE_SUBTYPE_MULTI_Q2X2,
MODULE_SUBTYPE_MULTI_WK_2X01,
MODULE_SUBTYPE_MULTI_Q303,
MODULE_SUBTYPE_MULTI_GW008,
MODULE_SUBTYPE_MULTI_DM002,
MODULE_SUBTYPE_MULTI_DM002, //30
MODULE_SUBTYPE_MULTI_CABELL,
MODULE_SUBTYPE_MULTI_ESKY150,
MODULE_SUBTYPE_MULTI_H83D,
MODULE_SUBTYPE_MULTI_CORONA,
MODULE_SUBTYPE_MULTI_CFLIE,
MODULE_SUBTYPE_MULTI_CFLIE, //35
MODULE_SUBTYPE_MULTI_HITEC,
MODULE_SUBTYPE_MULTI_WFLY,
MODULE_SUBTYPE_MULTI_BUGS,
MODULE_SUBTYPE_MULTI_BUGS_MINI,
MODULE_SUBTYPE_MULTI_TRAXXAS,
MODULE_SUBTYPE_MULTI_TRAXXAS, //40
MODULE_SUBTYPE_MULTI_NCC1701,
MODULE_SUBTYPE_MULTI_E01X,
MODULE_SUBTYPE_MULTI_V911S,
MODULE_SUBTYPE_MULTI_GD00X,
MODULE_SUBTYPE_MULTI_V761,
MODULE_SUBTYPE_MULTI_V761, //45
MODULE_SUBTYPE_MULTI_KF606,
MODULE_SUBTYPE_MULTI_REDPINE,
MODULE_SUBTYPE_MULTI_POTENSIC,
MODULE_SUBTYPE_MULTI_ZSX,
MODULE_SUBTYPE_MULTI_FLYZONE,
MODULE_SUBTYPE_MULTI_FLYZONE, //50
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_FX816, //55
MODULE_SUBTYPE_MULTI_BAYANG_RX,
MODULE_SUBTYPE_MULTI_PELIKAN,
MODULE_SUBTYPE_MULTI_TIGER,
MODULE_SUBTYPE_MULTI_XK,
MODULE_SUBTYPE_MULTI_XN297DUMP,
MODULE_SUBTYPE_MULTI_XN297DUMP, //60
MODULE_SUBTYPE_MULTI_FRSKYX2,
MODULE_SUBTYPE_MULTI_FRSKY_R9,
MODULE_SUBTYPE_MULTI_PROPEL,
MODULE_SUBTYPE_MULTI_FRSKYL,
MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FRSKY_R9
};
#define MODULE_SUBTYPE_MULTI_XN297DP 63-3

View file

@ -384,6 +384,9 @@ inline bool isModuleRxNumAvailable(uint8_t moduleIdx)
if (isModuleISRM(moduleIdx))
return true;
if (IS_RX_MULTI(moduleIdx))
return false;
if (isModuleMultimodule(moduleIdx))
return true;

View file

@ -555,7 +555,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const
return;
}
if (major <= 1 && minor <= 3 && revision <= 0 && patch < 87 && SLOW_BLINK_ON_PHASE) {
if (major <= 1 && minor <= 3 && revision <= 0 && patch < 91 && SLOW_BLINK_ON_PHASE) {
strcpy(statusText, STR_MODULE_UPGRADE);
}
else {

View file

@ -111,6 +111,7 @@ extern uint8_t telemetryProtocol;
#define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_CLONED)) \
|| (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX2))
#define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT)
#define IS_RX_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_BAYANG_RX))
#if defined(HARDWARE_INTERNAL_MODULE)
#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE)||IS_D16_MULTI(EXTERNAL_MODULE))))
#else

View file

@ -695,6 +695,7 @@ const char STR_DISABLE_CH_MAP[] = TR_DISABLE_CH_MAP;
const char STR_DISABLE_TELEM[] = TR_DISABLE_TELEM;
const char STR_MULTI_DSM_AUTODTECT[] = TR_MULTI_DSM_AUTODTECT;
const char STR_MULTI_LOWPOWER[] = TR_MULTI_LOWPOWER;
const char STR_MULTI_LNA_DISABLE[] = TR_MULTI_LNA_DISABLE;
const char STR_MODULE_NO_SERIAL_MODE[] = TR_MODULE_NO_SERIAL_MODE;
const char STR_MODULE_NO_INPUT[] = TR_MODULE_NO_INPUT;
const char STR_MODULE_WAITFORBIND[] = TR_MODULE_WAITFORBIND;

View file

@ -394,6 +394,7 @@ extern const char STR_DISABLE_CH_MAP[];
extern const char STR_DISABLE_TELEM[];
extern const char STR_MULTI_DSM_AUTODTECT[];
extern const char STR_MULTI_LOWPOWER[];
extern const char STR_MULTI_LNA_DISABLE[];
extern const char STR_MODULE_NO_SERIAL_MODE[];
extern const char STR_MODULE_NO_INPUT[];
extern const char STR_MODULE_WAITFORBIND[];

View file

@ -638,6 +638,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetekce", INDENT "Formát autodetekce")
#define TR_MULTI_LOWPOWER TR(INDENT "Nízký výkon", INDENT "Režim nízkého výkonu")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
#define TR_MODULE_TELEM_ON TR("Zap", "Zapnuto")
#define TR_DISABLE_INTERNAL TR("Vypnout int.", "Vypnout interní RF")

View file

@ -640,6 +640,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")

View file

@ -639,6 +639,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
#define TR_DISABLE_INTERNAL TR("Disable int.", "Disable internal RF")

View file

@ -641,6 +641,7 @@
#define TR_DISABLE_TELEM TR("No telem", "Desactivar telem.")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetectar formato")
#define TR_MULTI_LOWPOWER TR(INDENT "Baja poten.", INDENT "Modo de baja poten.")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
#define TR_MODULE_TELEM_ON TR("ON", "Activado")
#define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desact. mod. int. RF")

View file

@ -657,6 +657,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")

View file

@ -660,6 +660,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Désact Télémétrie")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodét.", INDENT "Autodétection")
#define TR_MULTI_LOWPOWER TR(INDENT "Basse puis.", INDENT "Mode basse puiss.")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "Lien S.Port")
#define TR_MODULE_TELEM_ON TR("ON", "Actif")
#define TR_DISABLE_INTERNAL TR("Désact intRF", "Désact. RF interne")

View file

@ -659,6 +659,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Telem. disabil.")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Trova autom.", INDENT "Autoril. il formato")
#define TR_MULTI_LOWPOWER TR(INDENT "Bassa pot.", INDENT "Modo bassa potenza")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "Link S.Port")
#define TR_MODULE_TELEM_ON TR("ON", "Abilitato")
#define TR_DISABLE_INTERNAL TR("Disatt. RF int.", "Disattiva RF interna")

View file

@ -645,6 +645,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")

View file

@ -658,6 +658,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")

View file

@ -649,6 +649,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")

View file

@ -658,6 +658,7 @@
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")