diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 067b0f573..81eba22d6 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1284,17 +1284,18 @@ void registerOpenTxFirmwares() registerOpenTxFirmware(firmware); /* Jumper T12 board */ - firmware = new OpenTxFirmware("opentx-t12", QCoreApplication::translate("Firmware", "Jumper T12"), BOARD_JUMPER_T12); + firmware = new OpenTxFirmware("opentx-t12", QCoreApplication::translate("Firmware", "Jumper T12 / T12 Pro"), BOARD_JUMPER_T12); addOpenTxCommonOptions(firmware); firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support")); firmware->addOption("nogvars", Firmware::tr("Disable Global variables")); firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen")); firmware->addOption("flexr9m", Firmware::tr("Enable non certified R9M firmwares")); + firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); addOpenTxFontOptions(firmware); registerOpenTxFirmware(firmware); /* Jumper T16 board */ - firmware = new OpenTxFirmware("opentx-t16", Firmware::tr("Jumper T16 / T16+"), BOARD_JUMPER_T16); + firmware = new OpenTxFirmware("opentx-t16", Firmware::tr("Jumper T16 / T16+ / T16 Pro"), BOARD_JUMPER_T16); addOpenTxFrskyOptions(firmware); firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 8890a4903..c23aa06e3 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -84,12 +84,24 @@ enum MenuModelSetupItems { #if defined(HARDWARE_INTERNAL_MODULE) ITEM_MODEL_SETUP_INTERNAL_MODULE_LABEL, ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE, +#if defined(MULTIMODULE) + ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE, + ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, + ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS, +#endif ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS, - ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND, + ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE, ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM, + ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS, +#if defined(MULTIMODULE) + ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND, + ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_TELEM, + ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_MAPPING, +#endif #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA) ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA, #endif + ITEM_MODEL_SETUP_INTERNAL_MODULE_POWER, ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE, ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS, @@ -108,7 +120,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, #endif ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS, - ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM, #if defined(PCBSKY9X) && defined(REVX) ITEM_MODEL_SETUP_EXTERNAL_MODULE_OUTPUT_TYPE, @@ -190,12 +202,12 @@ enum MenuModelSetupItems { #define OUTPUT_TYPE_ROW #endif -inline uint8_t EXTERNAL_MODULE_TYPE_ROW() +inline uint8_t MODULE_TYPE_ROWS(int moduleIdx) { - if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) + if (isModuleXJT(moduleIdx) || isModuleR9MNonAccess(moduleIdx) || isModuleDSM2(moduleIdx)) return 1; #if defined(MULTIMODULE) - else if (isModuleMultimodule(EXTERNAL_MODULE)) { + else if (isModuleMultimodule(moduleIdx)) { return 1; } #endif @@ -203,6 +215,17 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW() return 0; } +inline uint8_t MODULE_SUBTYPE_ROWS(int moduleIdx) +{ +#if defined(MULTIMODULE) + if (isModuleMultimodule(moduleIdx)) { + return MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? 1 : HIDDEN_ROW; + } +#endif + + return HIDDEN_ROW; +} + #define POT_WARN_ROWS ((g_model.potsWarnMode) ? (uint8_t)(NUM_POTS+NUM_SLIDERS) : (uint8_t)0) #define TIMER_ROWS 2, 0, 0, 0, 0 @@ -279,17 +302,22 @@ void onBluetoothConnectMenu(const char * result) #if defined(HARDWARE_INTERNAL_MODULE) #define INTERNAL_MODULE_ROWS \ LABEL(InternalModule), \ - INTERNAL_MODULE_TYPE_ROWS, \ - MODULE_CHANNELS_ROWS(INTERNAL_MODULE), \ - IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1)), \ - IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* RxNum */ \ - EXTERNAL_ANTENNA_ROW \ - IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* Failsafe */ \ - IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* Range check and Register buttons */ \ - IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* Module options */ \ - IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* Receiver 1 */ \ - IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* Receiver 2 */ \ - IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* Receiver 3 */ + MODULE_TYPE_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE*/ \ + 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_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 */ \ + EXTERNAL_ANTENNA_ROW /* ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA */ \ + MODULE_POWER_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_POWER */ \ + IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE */ \ + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE */ \ + IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS*/ \ + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1 */ \ + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_2 */ \ + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_3 */ #else #define INTERNAL_MODULE_ROWS #endif @@ -329,7 +357,7 @@ void menuModelSetup(event_t event) INTERNAL_MODULE_ROWS LABEL(ExternalModule), - EXTERNAL_MODULE_TYPE_ROW(), + MODULE_TYPE_ROWS(EXTERNAL_MODULE), MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), @@ -370,8 +398,8 @@ void menuModelSetup(event_t event) NUM_STICKS+NUM_POTS+NUM_SLIDERS-1, // Center beeps 0, // Global functions - LABEL(ExternalModule), - EXTERNAL_MODULE_TYPE_ROW(), + LABEL(ExternalModule), + MODULE_TYPE_ROWS(EXTERNAL_MODULE), MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), @@ -427,6 +455,7 @@ void menuModelSetup(event_t event) } } + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS); LcdFlags attr = (sub == k ? blink : 0); @@ -797,6 +826,7 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_INTERNALRF); break; +#if !defined(INTERNAL_MODULE_MULTI) case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE: { lcdDrawTextAlignedLeft(y, INDENT TR_MODE); @@ -846,6 +876,7 @@ void menuModelSetup(event_t event) break; } #endif +#endif #if defined(PCBSKY9X) case ITEM_MODEL_SETUP_EXTRA_MODULE_LABEL: @@ -857,96 +888,110 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_EXTERNALRF); break; +#if defined(INTERNAL_MODULE_MULTI) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE: +#endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE: lcdDrawTextAlignedLeft(y, INDENT TR_MODE); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_EXTERNAL_MODULE_PROTOCOLS, reusableBuffer.moduleSetup.newType, menuHorizontalPosition==0 ? attr : 0); - if (isModuleXJT(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_XJT_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleDSM2(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleR9MNonAccess(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_EXTERNAL_MODULE_PROTOCOLS, moduleIdx == EXTERNAL_MODULE ? reusableBuffer.moduleSetup.newType : g_model.moduleData[moduleIdx].type, menuHorizontalPosition==0 ? attr : 0); + if (isModuleXJT(moduleIdx)) + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_XJT_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[moduleIdx].subType, menuHorizontalPosition==1 ? attr : 0); + else if (isModuleDSM2(moduleIdx)) + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[moduleIdx].rfProtocol, menuHorizontalPosition==1 ? attr : 0); + else if (isModuleR9MNonAccess(moduleIdx)) + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[moduleIdx].subType, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) - else if (isModuleMultimodule(EXTERNAL_MODULE)) { - int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); - lcdDrawMultiProtocolString(lcdNextPos + 3, y, EXTERNAL_MODULE, multi_rfProto, menuHorizontalPosition == 1 ? attr : 0); + else if (isModuleMultimodule(moduleIdx)) { + int multi_rfProto = g_model.moduleData[moduleIdx].getMultiProtocol(); + lcdDrawMultiProtocolString(lcdNextPos + 3, y, moduleIdx, multi_rfProto, menuHorizontalPosition == 1 ? attr : 0); } #endif - if (attr && menuHorizontalPosition == 0) { + if (attr && menuHorizontalPosition == 0 && moduleIdx == EXTERNAL_MODULE) { if (s_editMode > 0) { - g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_NONE; + g_model.moduleData[moduleIdx].type = MODULE_TYPE_NONE; } else if (reusableBuffer.moduleSetup.newType != reusableBuffer.moduleSetup.previousType) { - g_model.moduleData[EXTERNAL_MODULE].type = reusableBuffer.moduleSetup.newType; + g_model.moduleData[moduleIdx].type = reusableBuffer.moduleSetup.newType; reusableBuffer.moduleSetup.previousType = reusableBuffer.moduleSetup.newType; - setModuleType(EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].type); + setModuleType(moduleIdx, g_model.moduleData[moduleIdx].type); } - else if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE) { - g_model.moduleData[EXTERNAL_MODULE].type = reusableBuffer.moduleSetup.newType; + else if (g_model.moduleData[moduleIdx].type == MODULE_TYPE_NONE) { + g_model.moduleData[moduleIdx].type = reusableBuffer.moduleSetup.newType; } } if (attr) { if (s_editMode > 0) { switch (menuHorizontalPosition) { case 0: - reusableBuffer.moduleSetup.newType = checkIncDec(event, reusableBuffer.moduleSetup.newType, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isExternalModuleAvailable); +#if defined(HARDWARE_INTERNAL_MODULE) + if (moduleIdx == INTERNAL_MODULE) { + uint8_t moduleType = checkIncDec(event, g_model.moduleData[moduleIdx].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, + isInternalModuleAvailable); + if (checkIncDec_Ret) { + setModuleType(moduleIdx, moduleType); + } + } + else +#endif + reusableBuffer.moduleSetup.newType = checkIncDec(event, reusableBuffer.moduleSetup.newType, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, + isExternalModuleAvailable); break; case 1: - if (isModuleDSM2(EXTERNAL_MODULE)) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); + if (isModuleDSM2(moduleIdx)) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); } - else if (isModuleR9MNonAccess(EXTERNAL_MODULE)) { - g_model.moduleData[EXTERNAL_MODULE].subType = checkIncDec(event, - g_model.moduleData[EXTERNAL_MODULE].subType, - MODULE_SUBTYPE_R9M_FCC, - MODULE_SUBTYPE_R9M_LAST, - EE_MODEL, - isR9MModeAvailable); + else if (isModuleR9MNonAccess(moduleIdx)) { + g_model.moduleData[moduleIdx].subType = checkIncDec(event, + g_model.moduleData[moduleIdx].subType, + MODULE_SUBTYPE_R9M_FCC, + MODULE_SUBTYPE_R9M_LAST, + EE_MODEL, + isR9MModeAvailable); if (checkIncDec_Ret) { - g_model.moduleData[EXTERNAL_MODULE].pxx.power = 0; - g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; - g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); + g_model.moduleData[moduleIdx].pxx.power = 0; + g_model.moduleData[moduleIdx].channelsStart = 0; + g_model.moduleData[moduleIdx].channelsCount = defaultModuleChannels_M8(moduleIdx); } } #if defined(MULTIMODULE) - else if (isModuleMultimodule(EXTERNAL_MODULE)) { - int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); + 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); if (checkIncDec_Ret) { - g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto); - g_model.moduleData[EXTERNAL_MODULE].subType = 0; + g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto); + g_model.moduleData[moduleIdx].subType = 0; // Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled - if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) { - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1; + if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) { + g_model.moduleData[moduleIdx].multi.autoBindMode = 1; } else { - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0; + g_model.moduleData[moduleIdx].multi.autoBindMode = 0; } - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; + g_model.moduleData[moduleIdx].multi.optionValue = 0; } } #endif else { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_PXX1_LAST); + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].subType, 0, MODULE_SUBTYPE_PXX1_LAST); } if (checkIncDec_Ret) { - g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; - g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); + g_model.moduleData[moduleIdx].channelsStart = 0; + g_model.moduleData[moduleIdx].channelsCount = defaultModuleChannels_M8(moduleIdx); } } } #if POPUP_LEVEL > 1 else if (old_editMode > 0) { - if (isModuleR9MNonAccess(EXTERNAL_MODULE)) { - if (g_model.moduleData[EXTERNAL_MODULE].subType > MODULE_SUBTYPE_R9M_EU) { + if (isModuleR9MNonAccess(moduleIdx)) { + if (g_model.moduleData[moduleIdx].subType > MODULE_SUBTYPE_R9M_EU) { POPUP_WARNING(STR_MODULE_PROTOCOL_FLEX_WARN_LINE1); SET_WARNING_INFO(STR_MODULE_PROTOCOL_WARN_LINE2, sizeof(TR_MODULE_PROTOCOL_WARN_LINE2) - 1, 0); } #if POPUP_LEVEL >= 3 - else if (g_model.moduleData[EXTERNAL_MODULE].subType == MODULE_SUBTYPE_R9M_EU) { + else if (g_model.moduleData[moduleIdx].subType == MODULE_SUBTYPE_R9M_EU) { POPUP_WARNING(STR_MODULE_PROTOCOL_EU_WARN_LINE1); SET_WARNING_INFO(STR_MODULE_PROTOCOL_WARN_LINE2, sizeof(TR_MODULE_PROTOCOL_WARN_LINE2) - 1, 0); } @@ -962,14 +1007,17 @@ void menuModelSetup(event_t event) break; #if defined(MULTIMODULE) +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE: +#endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SUBTYPE: { lcdDrawTextAlignedLeft(y, STR_SUBTYPE); - lcdDrawMultiSubProtocolString(MODEL_SETUP_2ND_COLUMN, y, EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].subType, attr); + lcdDrawMultiSubProtocolString(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, g_model.moduleData[moduleIdx].subType, attr); if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0:{ - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, getMaxMultiSubtype(EXTERNAL_MODULE)); + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].subType, 0, getMaxMultiSubtype(moduleIdx)); break; } } @@ -1076,7 +1124,6 @@ void menuModelSetup(event_t event) #endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; lcdDrawTextAlignedLeft(y, STR_CHANNELRANGE); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_CH, menuHorizontalPosition==0 ? attr : 0); @@ -1138,7 +1185,6 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM: case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2); if (attr) { @@ -1153,7 +1199,6 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE: case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_REGISTER_RANGE: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawTextAlignedLeft(y, INDENT TR_MODULE); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON(TR_REGISTER), (menuHorizontalPosition == 0 ? attr : 0)); lcdDrawText(lcdLastRightPos + 3, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0)); @@ -1201,11 +1246,10 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTRA_MODULE_BIND: #endif #if defined(HARDWARE_INTERNAL_MODULE) - case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: #endif - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; if (isModulePPM(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_PPMFRAME); @@ -1342,7 +1386,6 @@ void menuModelSetup(event_t event) #if defined(PCBSKY9X) && defined(REVX) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_OUTPUT_TYPE: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; moduleData.ppm.outputType = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_OUTPUT_TYPE, STR_VOUTPUT_TYPE, moduleData.ppm.outputType, 0, 1, attr, event); break; @@ -1353,7 +1396,6 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE: #endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData &moduleData = g_model.moduleData[moduleIdx]; lcdDrawTextAlignedLeft(y, STR_FAILSAFE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition == 0 ? attr : 0); @@ -1410,15 +1452,16 @@ void menuModelSetup(event_t event) } break; #endif - +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS: +#endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); #if defined(MULTIMODULE) if (isModuleMultimodule(moduleIdx)) { int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; - const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); + const uint8_t multi_proto = g_model.moduleData[moduleIdx].getMultiProtocol(); if (multi_proto < MODULE_SUBTYPE_MULTI_LAST) { const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto); if (pdef->optionsstr) { @@ -1471,9 +1514,11 @@ void menuModelSetup(event_t event) break; } +#if defined(INTERNAL_MODULE_MULTI) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_POWER: +#endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER: { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); auto & module = g_model.moduleData[moduleIdx]; // Lite FCC / Lite FLEX / Lite Pro Flex if (isModuleTypeR9MNonAccess(module.type)) { @@ -1546,35 +1591,47 @@ void menuModelSetup(event_t event) break; #if defined(MULTIMODULE) +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND: +#endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND: - if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); + if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) + g_model.moduleData[moduleIdx].multi.autoBindMode = editCheckBox(g_model.moduleData[moduleIdx].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); else - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); + g_model.moduleData[moduleIdx].multi.autoBindMode = editCheckBox(g_model.moduleData[moduleIdx].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); break; - +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_TELEM: +#endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_TELEM: - g_model.moduleData[EXTERNAL_MODULE].multi.disableTelemetry = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.disableTelemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_DISABLE_TELEM, attr, event); + g_model.moduleData[moduleIdx].multi.disableTelemetry = editCheckBox(g_model.moduleData[moduleIdx].multi.disableTelemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_DISABLE_TELEM, attr, event); break; - +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_MAPPING: +#endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_MAPPING: - g_model.moduleData[EXTERNAL_MODULE].multi.disableMapping = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.disableMapping, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_DISABLE_CH_MAP, attr, event); + g_model.moduleData[moduleIdx].multi.disableMapping = editCheckBox(g_model.moduleData[moduleIdx].multi.disableMapping, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_DISABLE_CH_MAP, attr, event); break; +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS: +#endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS: { lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); char statusText[64]; - getMultiModuleStatus(EXTERNAL_MODULE).getStatusString(statusText); + getMultiModuleStatus(moduleIdx).getStatusString(statusText); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); break; } - +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS: +#endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS: { lcdDrawTextAlignedLeft(y, STR_MODULE_SYNC); char statusText[64]; - getMultiSyncStatus(EXTERNAL_MODULE).getRefreshString(statusText); + getMultiSyncStatus(moduleIdx).getRefreshString(statusText); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); break; } @@ -1639,7 +1696,7 @@ void menuModelSetup(event_t event) if (old_editMode > 0 && s_editMode == 0) { switch(menuVerticalPosition) { #if defined(HARDWARE_INTERNAL_MODULE) - case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM: if (menuHorizontalPosition == 0) checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE); @@ -1651,7 +1708,7 @@ void menuModelSetup(event_t event) checkModelIdUnique(g_eeGeneral.currModel, EXTRA_MODULE); break; #endif - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM: if (menuHorizontalPosition == 0) checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE); diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index b37c674ed..fe8ac60dc 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -21,6 +21,7 @@ #include "opentx.h" #include +#if defined(MULTIMODULE) void lcdDrawMultiProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t protocol, LcdFlags flags) { if (protocol <= MODULE_SUBTYPE_MULTI_LAST) { @@ -51,6 +52,7 @@ void lcdDrawMultiSubProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint lcdDrawNumber(x, y, subType, flags); } } +#endif void drawStringWithIndex(coord_t x, coord_t y, const char * str, uint8_t idx, LcdFlags flags) { diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index c42a0d071..2c3441240 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -101,7 +101,7 @@ bool FrskyDeviceFirmwareUpdate::readBuffer(uint8_t * buffer, uint8_t count, uint { watchdogSuspend(timeout); - switch(module) { + switch (module) { case INTERNAL_MODULE: { uint32_t elapsed = 0; @@ -176,8 +176,8 @@ const uint8_t * FrskyDeviceFirmwareUpdate::readFrame(uint32_t timeout) { RTOS_WAIT_MS(1); - switch(module) { -#if defined(INTMODULE_USART) && !(defined(PCBXLITE) && !defined(PCBXLITES)) + switch (module) { +#if defined(INTERNAL_MODULE_PXX2) case INTERNAL_MODULE: return readFullDuplexFrame(intmoduleFifo, timeout); #endif @@ -235,8 +235,8 @@ void FrskyDeviceFirmwareUpdate::sendFrame() } } - switch(module) { -#if defined(INTMODULE_USART) && !(defined(PCBXLITE) && !defined(PCBXLITES)) + switch (module) { +#if defined(INTERNAL_MODULE_PXX2) case INTERNAL_MODULE: return intmoduleSendBuffer(outputTelemetryBuffer.data, ptr - outputTelemetryBuffer.data); #endif @@ -331,10 +331,7 @@ const char * FrskyDeviceFirmwareUpdate::doFlashFirmware(const char * filename) #endif switch (module) { -#if defined(INTMODULE_USART) && !(defined(PCBXLITE) && !defined(PCBXLITES)) - // on XLite we don't use TX + RX but the S.PORT line - // this ifdef can be removed if we use .frsk instead of .frk - // theorically it should be possible to use an ISRM module in an XLite +#if defined(INTERNAL_MODULE_PXX2) case INTERNAL_MODULE: intmoduleSerialStart(57600, true, USART_Parity_No, USART_StopBits_1, USART_WordLength_8b); break; @@ -511,7 +508,9 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); } +#if defined(HARDWARE_INTERNAL_MODULE) INTERNAL_MODULE_OFF(); +#endif EXTERNAL_MODULE_OFF(); SPORT_UPDATE_POWER_OFF(); diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index 0fcee68ad..ae89db72b 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -550,7 +550,9 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); } +#if defined(HARDWARE_INTERNAL_MODULE) INTERNAL_MODULE_OFF(); +#endif EXTERNAL_MODULE_OFF(); SPORT_UPDATE_POWER_OFF(); diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp index 6d6d1fce4..15a24fa3d 100644 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ b/radio/src/targets/horus/bootloader/boot_menu.cpp @@ -70,7 +70,7 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) if (st == ST_START) { - bootloaderDrawTitle(88, "HORUS BOOTLOADER"); + bootloaderDrawTitle(88, "OpenTX Bootloader"); lcdDrawBitmapPattern(90, 72, LBM_FLASH, TEXT_COLOR); lcdDrawText(124, 75, "Write Firmware"); diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index e83512dd4..6715cc46a 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -107,6 +107,7 @@ elseif(PCB STREQUAL X7) set(NAVIGATION_TYPE 9x) add_definitions(-DRADIO_T12) add_definitions(-DEEPROM_VARIANT=0x4001) + option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" OFF) else() option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) @@ -251,7 +252,7 @@ if(PCB STREQUAL X9E OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STRE ) endif() -if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR PCB STREQUAL X9LITES) +if(PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT PCBREV STREQUAL T12) OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR PCB STREQUAL X9LITES) add_definitions(-DBLUETOOTH) set(TARGET_SRC ${TARGET_SRC} @@ -351,6 +352,15 @@ if(INTERNAL_MODULE_PXX2) add_definitions(-DINTERNAL_MODULE_PXX2) endif() +if(INTERNAL_MODULE_MULTI) + add_definitions(-DHARDWARE_INTERNAL_MODULE) + add_definitions(-DINTERNAL_MODULE_MULTI) + set(TARGET_SRC + ${TARGET_SRC} + ../common/arm/stm32/intmodule_serial_driver.cpp + ) +endif() + if(INTERNAL_MODULE_PPM) add_definitions(-DHARDWARE_INTERNAL_MODULE) add_definitions(-DINTERNAL_MODULE_PPM) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index e21267199..06f17abae 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -122,6 +122,9 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #endif void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable, uint16_t parity, uint16_t stopBits, uint16_t wordLength); +#if defined(INTERNAL_MODULE_MULTI) +void intmoduleTimerStart(uint32_t periodMs); +#endif void intmoduleSendByte(uint8_t byte); void intmoduleSendBuffer(const uint8_t * data, uint8_t size); void intmoduleSendNextFrame(); diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 53cc66618..235e5eefb 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1003,26 +1003,31 @@ #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5 #define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #elif defined(RADIO_T12) - //left here is somebody will mod the radio for internal module - #define INTMODULE_PULSES - #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) - #define INTMODULE_RCC_APB1Periph 0 - #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM1 - #define INTMODULE_PWR_GPIO GPIOC - #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // JUMPER INT PC.06 //X7 INT is PC.06 - #define INTMODULE_TX_GPIO GPIOA - #define INTMODULE_TX_GPIO_PIN GPIO_Pin_7 // JUMPER INT PA.07 //X7 INT is PA.10 - #define INTMODULE_TX_GPIO_PinSource GPIO_PinSource10 - #define INTMODULE_TIMER TIM1 - #define INTMODULE_TIMER_CC_IRQn TIM1_CC_IRQn - #define INTMODULE_TIMER_CC_IRQHandler TIM1_CC_IRQHandler - #define INTMODULE_TX_GPIO_AF GPIO_AF_TIM1 - #define INTMODULE_DMA_CHANNEL DMA_Channel_6 - #define INTMODULE_DMA_STREAM DMA2_Stream5 - #define INTMODULE_DMA_STREAM_IRQn DMA2_Stream5_IRQn - #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler - #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5 - #define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) + #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) + #define INTMODULE_PWR_GPIO GPIOC + #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // PC.06 + #define INTMODULE_GPIO GPIOB + #define INTMODULE_TX_GPIO_PIN GPIO_Pin_10 // PB.10 + #define INTMODULE_RX_GPIO_PIN GPIO_Pin_11 // PB.11 + #define INTMODULE_GPIO_PinSource_TX GPIO_PinSource10 + #define INTMODULE_GPIO_PinSource_RX GPIO_PinSource11 + #define INTMODULE_USART USART3 + #define INTMODULE_GPIO_AF GPIO_AF_USART3 + #define INTMODULE_USART_IRQn USART3_IRQn + #define INTMODULE_USART_IRQHandler USART3_IRQHandler + #define INTMODULE_DMA_STREAM DMA1_Stream3 + #define INTMODULE_DMA_STREAM_IRQ DMA1_Stream3_IRQn + #define INTMODULE_DMA_STREAM_IRQHandler DMA1_Stream3_IRQHandler + #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF3 + #define INTMODULE_DMA_CHANNEL DMA_Channel_4 + #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2 + #define INTMODULE_RCC_APB2Periph RCC_APB1Periph_USART3 + #define INTMODULE_TIMER TIM2 + #define INTMODULE_TIMER_IRQn TIM2_IRQn + #define INTMODULE_TIMER_IRQHandler TIM2_IRQHandler + #define INTMODULE_TIMER_CC_IRQn TIM2_CC_IRQn + #define INTMODULE_TIMER_CC_IRQHandler TIM2_CC_IRQHandler + #define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #else #define INTMODULE_PULSES #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e91fcc6fd..6672feed9 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -643,7 +643,7 @@ #define TR_MODULE_NO_TELEMETRY TR3("Bez telemetrie", "Bez MULTI_TELEMETIE", "Nedetekována MULTI_TELEMETRIE") #define TR_MODULE_WAITFORBIND "Párovat při zavedení protokolu" #define TR_MODULE_BINDING TR("Bind...","Párování") -#define TR_MODULE_UPGRADE "Module upgrade required" +#define TR_MODULE_UPGRADE TR("Upg. needed", "Module upgrade required") #define TR_REBIND "Nutno přepárovat" #define TR_REG_OK "Registrace ok" #define TR_BIND_OK "Úspěšné párovaní" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 73a1faf06..e1e7f2d76 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -645,7 +645,7 @@ #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE "Module upgrade required" +#define TR_MODULE_UPGRADE TR("Upg. needed", "Module upgrade required") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index c3ee04f76..a7de822a7 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -644,7 +644,7 @@ #define TR_MODULE_NO_TELEMETRY TR3("No telemetry", "No MULTI_TELEMETRY", "No MULTI_TELEMETRY detected") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING TR("Bind...","Binding") -#define TR_MODULE_UPGRADE "Module upgrade required" +#define TR_MODULE_UPGRADE TR("Upg. needed", "Module upgrade required") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 67575c574..08bc9e542 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -668,7 +668,7 @@ #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE "Module upgrade required" +#define TR_MODULE_UPGRADE TR("Upg. needed", "Module upgrade required") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 1b82e339b..6c9df4342 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -662,7 +662,7 @@ #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE "Module upgrade required" +#define TR_MODULE_UPGRADE TR("Upg. needed", "Module upgrade required") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index de69f57eb..0624ea977 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -650,7 +650,7 @@ #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE "Module upgrade required" +#define TR_MODULE_UPGRADE TR("Upg. needed", "Module upgrade required") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index e24aff0cb..6a5470e8e 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -663,7 +663,7 @@ #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE "Module upgrade required" +#define TR_MODULE_UPGRADE TR("Upg. needed", "Module upgrade required") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 9dcbd834f..866f27a24 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -654,7 +654,7 @@ #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE "Module upgrade required" +#define TR_MODULE_UPGRADE TR("Upg. needed", "Module upgrade required") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 269965fc8..11d4c9baf 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -663,7 +663,7 @@ #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE "Module upgrade required" +#define TR_MODULE_UPGRADE TR("Upg. needed", "Module upgrade required") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/tools/build-jumper.py b/tools/build-jumper.py index 0a2db17f3..ab3fb9e45 100755 --- a/tools/build-jumper.py +++ b/tools/build-jumper.py @@ -14,6 +14,12 @@ boards = { "PCBREV": "T12", "DEFAULT_MODE": "2", }, + "T12PRO": { + "PCB": "X7", + "PCBREV": "T12", + "INTERNAL_MODULE_MULTI": "YES", + "DEFAULT_MODE": "2", + }, "T16": { "PCB": "X10", "PCBREV": "T16",