From 0b67d412a0ed4ae8003c123d7c9a0f309a3d836c Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 2 Aug 2016 18:21:18 +0200 Subject: [PATCH] Schwabe/multimodule 9x (#3676) * Fix Multimodule showing up as Crossfire when only multimode and not crossfire is enabled. * Don't hardcode telemetry to be Frysky on non STM32 arm targets * Port multi module code to 9X platforms * Allow Spektrum telemetry protocol to be selected as protocol for the telemetry selection * Fix infinite loop in spektrum code * Fix cosmetics Changes also done for Horus and Taranis UI where appropriate --- radio/src/gui/128x64/model_setup.cpp | 220 +++++++++++++++++++--- radio/src/gui/128x64/model_telemetry.cpp | 4 +- radio/src/gui/212x64/model_setup.cpp | 17 +- radio/src/gui/212x64/model_telemetry.cpp | 6 +- radio/src/gui/480x272/model_setup.cpp | 13 +- radio/src/gui/480x272/model_telemetry.cpp | 5 +- radio/src/gui/gui_common.h | 1 + radio/src/gui/gui_common_arm.cpp | 46 ++++- radio/src/myeeprom.h | 11 +- radio/src/opentx.h | 11 +- radio/src/pulses/pulses_arm.h | 2 +- radio/src/telemetry/spektrum.cpp | 2 +- radio/src/telemetry/telemetry.cpp | 9 +- radio/src/translations.cpp | 4 + radio/src/translations.h | 7 +- radio/src/translations/cz.h.txt | 14 +- radio/src/translations/de.h.txt | 14 +- radio/src/translations/en.h.txt | 15 +- radio/src/translations/es.h.txt | 14 +- radio/src/translations/fi.h.txt | 14 +- radio/src/translations/fr.h.txt | 8 +- radio/src/translations/it.h.txt | 14 +- radio/src/translations/nl.h.txt | 14 +- radio/src/translations/pl.h.txt | 14 +- radio/src/translations/pt.h.txt | 14 +- radio/src/translations/se.h.txt | 14 +- 26 files changed, 392 insertions(+), 115 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7cd7b247e..12c90c746 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -58,12 +58,19 @@ enum menuModelSetupItems { #if defined(CPUARM) ITEM_MODEL_EXTERNAL_MODULE_LABEL, ITEM_MODEL_EXTERNAL_MODULE_MODE, +#if defined(MULTIMODULE) + ITEM_MODEL_EXTERNAL_MODULE_SUBTYPE, +#endif ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_EXTERNAL_MODULE_BIND, #if defined(PCBSKY9X) && defined(REVX) ITEM_MODEL_EXTERNAL_MODULE_OUTPUT_TYPE, #endif ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, +#if defined(MULTIMODULE) + ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, + ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER, +#endif #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -99,16 +106,39 @@ void menuModelSetup(uint8_t event) #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)(x) : HIDDEN_ROW) #define IF_EXTERNAL_MODULE_ON(x) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) - #define EXTERNAL_MODULE_CHANNELS_ROWS() IF_EXTERNAL_MODULE_ON(IS_MODULE_DSM2(EXTERNAL_MODULE) ? (uint8_t)0 : (uint8_t)1) - #define EXTERNAL_MODULE_SETTINGS_ROWS() (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW + #define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1) + #define EXTERNAL_MODULE_BIND_ROWS() (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW + #if defined(PCBSKY9X) && defined(REVX) #define OUTPUT_TYPE_ROWS() (IS_MODULE_PPM(EXTERNAL_MODULE) ? (uint8_t)0 : HIDDEN_ROW) , #else #define OUTPUT_TYPE_ROWS() #endif #define TRAINER_CHANNELS_ROWS() (HIDDEN_ROW) - #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS() : 0) - #define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW) + #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) + +#if defined MULTIMODULE + #define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_SFHSS || x >= MM_RF_PROTO_CUSTOM) + #define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].multi.rfProtocol))) ? (uint8_t) 0: HIDDEN_ROW +#else + #define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW +#endif + #define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x)) + +#if defined(MULTIMODULE) + #define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ) + #define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM ) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t)2 : (uint8_t)1 + #define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, + #define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t) 0 : HIDDEN_ROW + #define MULTIMODULE_SUBTYPE_ROWS(x) IS_MODULE_MULTIMODULE(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW, +#else + #define MULTIMODULE_MODE_ROWS(x) (uint8_t)0 + #define MULTIMODULE_MODULE_ROWS + #define MULTIMODULE_SUBTYPE_ROWS(x) +#endif + + #define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 + #define CURSOR_ON_CELL (true) #define MODEL_SETUP_MAX_LINES (1+ITEM_MODEL_SETUP_MAX) #define POT_WARN_ITEMS() ((g_model.nPotsToWarn >> 6) ? (uint8_t)NUM_POTS : (uint8_t)0) @@ -121,11 +151,13 @@ void menuModelSetup(uint8_t event) #define TRAINER_MODULE_ROWS MENU_TAB({ 0, 0, TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, 0, 1, 0, 0, 0, 0, 0, CASE_CPUARM(LABEL(PreflightCheck)) CASE_CPUARM(0) 0, 6, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, 0, LABEL(ExternalModule), - (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, - EXTERNAL_MODULE_CHANNELS_ROWS(), - EXTERNAL_MODULE_SETTINGS_ROWS(), + EXTERNAL_MODULE_MODE_ROWS, + MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) + EXTERNAL_MODULE_CHANNELS_ROWS, + EXTERNAL_MODULE_BIND_ROWS(), OUTPUT_TYPE_ROWS() FAILSAFE_ROWS(EXTERNAL_MODULE), + MULTIMODULE_MODULE_ROWS EXTRA_MODULE_ROWS TRAINER_MODULE_ROWS }); #elif defined(CPUM64) @@ -502,6 +534,12 @@ void menuModelSetup(uint8_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (IS_MODULE_DSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); +#if defined(MULTIMODULE) + else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { + uint8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); + } +#endif if (attr && (editMode>0 || p1valdiff)) { switch (menuHorizontalPosition) { case 0: @@ -518,8 +556,27 @@ void menuModelSetup(uint8_t event) case 1: if (IS_MODULE_DSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); - else +#if defined(MULTIMODULE) + else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST); + if (checkIncDec_Ret) { + // When in custom protocol mode the highest bit (0x20) is set to indicate the protocl we might be way above MM_RF_PROTO_LAST. + // Reset to MM_RF_PROTO_LAST-1 in that case + if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) { + g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = MM_RF_PROTO_LAST-1; + } + g_model.moduleData[EXTERNAL_MODULE].subType = 0; + // Sensible default for DSM2 (same as for ppm): 6ch@11ms + if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2) + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = MM_RF_DSM2_11MS_6CH_OPTION; + else + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; + } + } +#endif + else { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, RF_PROTO_X16, RF_PROTO_LAST); + } if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; g_model.moduleData[EXTERNAL_MODULE].channelsCount = MAX_EXTERNAL_MODULE_CHANNELS(); @@ -528,7 +585,90 @@ void menuModelSetup(uint8_t event) } break; #endif - +#if defined (MULTIMODULE) + case ITEM_MODEL_EXTERNAL_MODULE_SUBTYPE: + { + lcd_putsLeft(y, STR_SUBTYPE); + int8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); + switch (multi_rfProto) { + case MM_RF_PROTO_FLYSKY: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_FLYSKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_FRSKY: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_FRSKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_HISKY: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_HISKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_DSM2: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType + 1, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_YD717: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_YD717, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_KN: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_KN, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_SYMAX: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_SYMAX, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_CX10: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_CX10, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_CG023: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_CG023, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_MT99XX: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_MT99, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_MJXQ: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_MJXQ, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); + break; + case MM_RF_PROTO_CUSTOM: + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, menuHorizontalPosition == 0 ? attr : 0, 2); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 1 ? attr : 0, 2); + break; + } + if (attr && (editMode > 0 || p1valdiff)) { + switch (menuHorizontalPosition) { + case 0: + switch (min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM)) { + case MM_RF_PROTO_HISKY: + case MM_RF_PROTO_DSM2: + case MM_RF_PROTO_SYMAX: + case MM_RF_PROTO_KN: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1); + break; + case MM_RF_PROTO_CG023: + case MM_RF_PROTO_MT99XX: + case MM_RF_PROTO_FRSKY: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2); + break; + case MM_RF_PROTO_FLYSKY: + case MM_RF_PROTO_MJXQ: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3); + break; + case MM_RF_PROTO_YD717: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4); + break; + case MM_RF_PROTO_CX10: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7); + break; + case MM_RF_PROTO_CUSTOM: + //custom protocol using the highest bit 0x20 to indicate that the protocol and the lower bits as the rfProtocol + g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = 0x20 | checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, 1, 31, EE_MODEL); + break; + } + break; + case 1: + // Custom protocol, third column is subtype + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7); + break; + } + } + } + break; +#endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_CHANNELS: #endif @@ -602,11 +742,11 @@ void menuModelSetup(uint8_t event) else { lcd_putsLeft(y, STR_RECEIVER_NUM); } - if (IS_MODULE_XJT(moduleIdx) || IS_MODULE_DSM2(moduleIdx)) { + if (IS_MODULE_XJT(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); if (attr && l_posHorz==0) { if (editMode>0 || p1valdiff) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], IS_MODULE_DSM2(moduleIdx) ? 20 : 63); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], IS_MODULE_DSM2(moduleIdx) ? 20 : IS_MODULE_MULTIMODULE(moduleIdx) ? 15 : 63); if (checkIncDec_Ret) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; } @@ -646,34 +786,72 @@ void menuModelSetup(uint8_t event) case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - ModuleData & moduleData = g_model.moduleData[moduleIdx]; - lcd_putsLeft(y, TR_FAILSAFE); + ModuleData &moduleData = g_model.moduleData[moduleIdx]; if (IS_MODULE_XJT(moduleIdx)) { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition==0 ? attr : 0); - if (moduleData.failsafeMode == FAILSAFE_CUSTOM) lcdDrawText(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_SET, menuHorizontalPosition==1 ? attr : 0); + lcd_putsLeft(y, TR_FAILSAFE); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition == 0 + ? attr : 0); + if (moduleData.failsafeMode == FAILSAFE_CUSTOM) + lcdDrawText(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_SET, menuHorizontalPosition == 1 + ? attr : 0); if (attr) { if (moduleData.failsafeMode != FAILSAFE_CUSTOM) menuHorizontalPosition = 0; - if (menuHorizontalPosition==0) { - if (editMode>0 || p1valdiff) { + if (menuHorizontalPosition == 0) { + if (editMode > 0 || p1valdiff) { CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST); if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx); } } - else if (menuHorizontalPosition==1) { + else if (menuHorizontalPosition == 1) { s_editMode = 0; - if (moduleData.failsafeMode==FAILSAFE_CUSTOM && event==EVT_KEY_FIRST(KEY_ENTER)) { + if (moduleData.failsafeMode == FAILSAFE_CUSTOM && event == EVT_KEY_FIRST(KEY_ENTER)) { g_moduleIdx = moduleIdx; pushMenu(menuModelFailsafe); } } else { - lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W-MODEL_SETUP_2ND_COLUMN-MENUS_SCROLLBAR_WIDTH, 8); + lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN - MENUS_SCROLLBAR_WIDTH, 8); } } } - break; +#if defined(MULTIMODULE) + else if (IS_MODULE_MULTIMODULE(moduleIdx)) { + switch (g_model.moduleData[moduleIdx].multi.rfProtocol) + { + case MM_RF_PROTO_FRSKY: + case MM_RF_PROTO_SFHSS: + lcd_putsLeft(y, STR_MULTI_RFTUNE); + break; + case MM_RF_PROTO_HUBSAN: + lcd_putsLeft(y, STR_MULTI_VIDFREQ); + break; + case MM_RF_PROTO_DSM2: + g_model.moduleData[moduleIdx].multi.optionValue = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMFRAME, STR_OPTIONS_DSM, g_model.moduleData[moduleIdx].multi.optionValue, 0, 12, attr, event); + break; + default: + lcd_putsLeft(y, STR_MULTI_OPTION); + break; + } + if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); + if (attr) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); + } + } + } +#endif } + break; + +#if defined(MULTIMODULE) + case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: + 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); + break; + case ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER: + 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); + break; +#endif #endif #if !defined(CPUARM) diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index 2e4d2a524..ea81d43cc 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -553,7 +553,9 @@ void menuModelTelemetry(uint8_t event) switch (k) { #if defined(CPUARM) case ITEM_TELEMETRY_PROTOCOL_TYPE: - g_model.telemetryProtocol = selectMenuItem(TELEM_COL2, y, STR_TELEMETRY_TYPE, "\017FrSky S.PORT\0 FrSky D\0 FrSky D (cable)", g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, CASE_PCBSKY9X(PROTOCOL_FRSKY_D_SECONDARY) attr, event); + lcd_putsLeft(y, STR_TELEMETRY_TYPE); + lcdDrawTextAtIndex(TELEM_COL2, y, STR_TELEMETRY_PROTOCOLS, g_model.telemetryProtocol, attr); + g_model.telemetryProtocol = checkIncDec(event, g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, PROTOCOL_TELEMETRY_LAST, EE_MODEL, isTelemetryProtocolAvailable); break; #if defined(REVX) case ITEM_TELEMETRY_INVERTED_SERIAL: diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index c062ac074..d0c0748f0 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -80,7 +80,7 @@ enum menuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_EXTERNAL_MODULE_BIND, ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, -#ifdef MULTIMODULE +#if defined (MULTIMODULE) ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER, #endif @@ -715,7 +715,7 @@ void menuModelSetup(uint8_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - int8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); + uint8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); // Do not use MODEL_SETUP_3RD_COLUMN here since some the protocol string are so long that we cannot afford the 2 spaces (+6) here lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); @@ -773,25 +773,27 @@ void menuModelSetup(uint8_t event) case 1: if (IS_MODULE_DSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); +#if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST); if (checkIncDec_Ret) { // When in custom protocol mode the highest bit (0x20) is set to indicate the protocl we might be way above MM_RF_PROTO_LAST. // Reset to MM_RF_PROTO_LAST-1 in that case - if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) - { + if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) { g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = MM_RF_PROTO_LAST-1; } g_model.moduleData[EXTERNAL_MODULE].subType = 0; // Sensible default for DSM2 (same as for ppm): 6ch@11ms if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2) - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 6; + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = MM_RF_DSM2_11MS_6CH_OPTION; else g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; } } - else +#endif + else { g_model.moduleData[EXTERNAL_MODULE].rfProtocol = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, RF_PROTO_X16, RF_PROTO_LAST, EE_MODEL, isRfProtocolAvailable); + } if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; g_model.moduleData[EXTERNAL_MODULE].channelsCount = 0; @@ -978,7 +980,8 @@ void menuModelSetup(uint8_t event) } #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - switch (g_model.moduleData[moduleIdx].multi.rfProtocol) { + switch (g_model.moduleData[moduleIdx].multi.rfProtocol) + { case MM_RF_PROTO_FRSKY: case MM_RF_PROTO_SFHSS: lcd_putsLeft(y, STR_MULTI_RFTUNE); diff --git a/radio/src/gui/212x64/model_telemetry.cpp b/radio/src/gui/212x64/model_telemetry.cpp index 94472738b..093fe448a 100644 --- a/radio/src/gui/212x64/model_telemetry.cpp +++ b/radio/src/gui/212x64/model_telemetry.cpp @@ -433,7 +433,7 @@ void menuModelTelemetry(uint8_t event) lcdDrawText(TELEM_COL2, y, "---", 0); // TODO shortcut } TelemetrySensor * sensor = & g_model.telemetrySensors[index]; -#ifdef MULTIMODULE +#if defined(MULTIMODULE) if (IS_SPEKTRUM_PROTOCOL()) { // Spektrum does not (yet?) really support multiple sensor of the same type. But a lot of // different sensor display the same information (e.g. voltage, capacity). Show the id @@ -463,7 +463,9 @@ void menuModelTelemetry(uint8_t event) switch (k) { case ITEM_TELEMETRY_PROTOCOL_TYPE: - g_model.telemetryProtocol = selectMenuItem(TELEM_COL2, y, STR_TELEMETRY_TYPE, "\017FrSky S.PORT\0 FrSky D\0 FrSky D (cable)", g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, g_eeGeneral.serial2Mode==UART_MODE_TELEMETRY ? PROTOCOL_FRSKY_D_SECONDARY : PROTOCOL_FRSKY_D, attr, event); + lcd_putsLeft(y, STR_TELEMETRY_TYPE); + lcdDrawTextAtIndex(TELEM_COL2, y, STR_TELEMETRY_PROTOCOLS, g_model.telemetryProtocol, attr); + g_model.telemetryProtocol = checkIncDec(event, g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, PROTOCOL_TELEMETRY_LAST, EE_MODEL, isTelemetryProtocolAvailable); break; case ITEM_TELEMETRY_SENSORS_LABEL: diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 7502cb68e..5f051e799 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -597,7 +597,7 @@ bool menuModelSetup(evt_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - int8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); + uint8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); switch(multi_rfProto) { @@ -662,20 +662,20 @@ bool menuModelSetup(evt_t event) if (checkIncDec_Ret) { // When in custom protocol mode the highest bit (0x20) is set to indicate the protocl we might be way above MM_RF_PROTO_LAST. // Reset to MM_RF_PROTO_LAST-1 in that case - if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) - { + if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) { g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = MM_RF_PROTO_LAST-1; } g_model.moduleData[EXTERNAL_MODULE].subType = 0; // Sensible default for DSM2 (same as for ppm): 6ch@11ms if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2) - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 6; + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = MM_RF_DSM2_11MS_6CH_OPTION; else g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; } } - else + else { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, RF_PROTO_X16, RF_PROTO_LAST); + } if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; g_model.moduleData[EXTERNAL_MODULE].channelsCount = MAX_EXTERNAL_MODULE_CHANNELS(); @@ -846,7 +846,8 @@ bool menuModelSetup(evt_t event) } #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - switch (g_model.moduleData[moduleIdx].multi.rfProtocol) { + switch (g_model.moduleData[moduleIdx].multi.rfProtocol) + { case MM_RF_PROTO_FRSKY: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_RFTUNE); break; diff --git a/radio/src/gui/480x272/model_telemetry.cpp b/radio/src/gui/480x272/model_telemetry.cpp index 431e9876c..07d8701ea 100644 --- a/radio/src/gui/480x272/model_telemetry.cpp +++ b/radio/src/gui/480x272/model_telemetry.cpp @@ -436,7 +436,7 @@ bool menuModelTelemetry(evt_t event) lcdDrawText(TELEM_COL2, y, "---"); // TODO shortcut } TelemetrySensor * sensor = & g_model.telemetrySensors[index]; -#ifdef MULTIMODULE +#if defined(MULTIMODULE) if (IS_SPEKTRUM_PROTOCOL()) { // Spektrum does not (yet?) really support multiple sensor of the same type. But a lot of // different sensor display the same information (e.g. voltage, capacity). Show the id @@ -467,7 +467,8 @@ bool menuModelTelemetry(evt_t event) switch (k) { case ITEM_TELEMETRY_PROTOCOL_TYPE: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TELEMETRY_TYPE); - g_model.telemetryProtocol = selectMenuItem(TELEM_COL2, y, "\017FrSky S.PORT\0 FrSky D\0 FrSky D (cable)", g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, PROTOCOL_FRSKY_D, attr, event); + lcdDrawTextAtIndex(TELEM_COL2, y, STR_TELEMETRY_PROTOCOLS, g_model.telemetryProtocol, attr); + g_model.telemetryProtocol = checkIncDec(event, g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, PROTOCOL_TELEMETRY_LAST, EE_MODEL, isTelemetryProtocolAvailable); break; case ITEM_TELEMETRY_SENSORS_LABEL: diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 3b3eed16c..748caa709 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -47,6 +47,7 @@ bool isSwitchAvailableInMixes(int swtch); bool isSwitchAvailableInTimers(int swtch); bool isModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); +bool isTelemetryProtocolAvailable(int protocol); bool isTrainerModeAvailable(int mode); bool isSensorUnit(int sensor, uint8_t unit); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 06b86f86a..fa83a57d6 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -482,22 +482,30 @@ bool isSourceAvailableInResetSpecialFunction(int index) } } -#if defined(PCBFLAMENCO) -bool isModuleAvailable(int module) -{ - return true; -} -#else + bool isModuleAvailable(int module) { #if defined(CROSSFIRE) if (module == MODULE_TYPE_CROSSFIRE && g_model.moduleData[INTERNAL_MODULE].rfProtocol != RF_PROTO_OFF) { return false; } +#else + if (module == MODULE_TYPE_CROSSFIRE) { + return false; + } +#endif +#if !defined(DSM2) + if (module == MODULE_TYPE_DSM2) { + return false; + } +#endif +#if !defined(MULTIMODULE) + if (module == MODULE_TYPE_MULTIMODULE) { + return false; + } #endif return true; } -#endif bool isRfProtocolAvailable(int protocol) { @@ -514,6 +522,30 @@ bool isRfProtocolAvailable(int protocol) return true; } +#if defined(CPUARM) +bool isTelemetryProtocolAvailable(int protocol) +{ + +#if defined(PCBTARANIS) + if(protocol == PROTOCOL_FRSKY_D_SECONDARY && g_eeGeneral.serial2Mode != UART_MODE_TELEMETRY) + return false; +#endif + if (protocol== PROTOCOL_PULSES_CROSSFIRE) + return false; + +#if !defined(MULTIMODULE) + if (protocol== PROTOCOL_SPEKTRUM) + return false; +#endif +#if defined(PBHORUS) + if (protocol == PROTOCOL_FRSKY_D_SECONDARY) + return false; +#endif + + return true; +} +#endif + #if defined(PCBHORUS) bool isTrainerModeAvailable(int mode) { diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index d6aca8c80..1e27159ee 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -532,6 +532,8 @@ enum MultiModuleRFProtocols { MM_RF_PROTO_LAST= MM_RF_PROTO_CUSTOM }; +#define MM_RF_DSM2_11MS_6CH_OPTION 6 + #define HAS_RF_PROTOCOL_FAILSAFE(rf) ((rf) == RF_PROTO_X16) #define HAS_RF_PROTOCOL_MODELINDEX(rf) (((rf) == RF_PROTO_X16) || ((rf) == RF_PROTO_LR12)) @@ -545,15 +547,9 @@ enum ModuleTypes { MODULE_TYPE_NONE = 0, MODULE_TYPE_PPM, MODULE_TYPE_XJT, -#if defined(DSM2) MODULE_TYPE_DSM2, -#endif -#if defined(CROSSFIRE) MODULE_TYPE_CROSSFIRE, -#endif -#if defined(MULTIMODULE) MODULE_TYPE_MULTIMODULE, -#endif MODULE_TYPE_COUNT }; @@ -610,7 +606,8 @@ enum TelemetryType PROTOCOL_FRSKY_D, PROTOCOL_FRSKY_D_SECONDARY, PROTOCOL_PULSES_CROSSFIRE, - PROTOCOL_SPEKTRUM + PROTOCOL_SPEKTRUM, + PROTOCOL_TELEMETRY_LAST=PROTOCOL_SPEKTRUM }; enum DisplayTrims diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 3a34506ec..9626f1903 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -409,6 +409,12 @@ void memswap(void * a, void * b, uint8_t size); #define MAX_TRAINER_CHANNELS() (8) #endif +#if defined(MULTIMODULE) + #define IS_MODULE_MULTIMODULE(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_MULTIMODULE) +#else + #define IS_MODULE_MULTIMODULE(idx) (false) +#endif + #if defined(PCBTARANIS) || defined(PCBHORUS) #if defined(TARANIS_INTERNAL_PPM) #define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || (idx==INTERNAL_MODULE && g_model.moduleData[INTERNAL_MODULE].type==MODULE_TYPE_PPM)|| (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_PPM)) @@ -427,11 +433,6 @@ void memswap(void * a, void * b, uint8_t size); #else #define IS_MODULE_CROSSFIRE(idx) (false) #endif - #if defined(MULTIMODULE) - #define IS_MODULE_MULTIMODULE(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_MULTIMODULE) - #else - #define IS_MODULE_MULTIMODULE(idx) (false) - #endif #if defined(TARANIS_INTERNAL_PPM) #define MAX_INTERNAL_MODULE_CHANNELS() ((g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[0].rfProtocol] : maxChannelsModules[g_model.moduleData[INTERNAL_MODULE].type]) #else diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 447a28eae..fa7d6b37a 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -73,6 +73,7 @@ PACK(struct PxxUartPulsesData { }); #endif +#define MULTIMODULE_BAUDRATE 100000 #if defined(PPM_PIN_TIMER) /* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ /* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */ @@ -86,7 +87,6 @@ PACK(struct PxxTimerPulsesData { uint32_t pcmOnesCount; }); -#define MULTIMODULE_BAUDRATE 100000 #if defined(MULTIMODULE) #define MAX_PULSES_TRANSITIONS 300 #else diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index 064e2a735..f9413a14b 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -210,7 +210,7 @@ static int32_t bcdToInt8(uint8_t bcd) { } static int32_t bcdToInt32(uint32_t bcd) { - return bcdToInt16(bcd >> 16) + 10000 * bcdToInt32(bcd); + return bcdToInt16(bcd >> 16) + 10000 * bcdToInt16(bcd); } // Spektrum uses Big Endian data types diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 23b00ead2..3031b2ee8 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -57,6 +57,11 @@ lcdint_t applyChannelRatio(source_t channel, lcdint_t val) #endif #if defined(CPUSTM32) +#define IS_TELEMETRY_INTERNAL_MODULE (g_model.moduleData[INTERNAL_MODULE].rfProtocol != RF_PROTO_OFF) +#else +#define IS_TELEMETRY_INTERNAL_MODULE (false) +#endif +#if defined(CPUARM) void processTelemetryData(uint8_t data) { #if defined(CROSSFIRE) @@ -109,7 +114,7 @@ void telemetryWakeup() } else { // Receive serial data here - rxPdcUsart(processFrskyTelemetryData); + rxPdcUsart(processTelemetryData); } #endif @@ -406,7 +411,7 @@ void telemetryReset() void telemetryInit(uint8_t protocol) { #if defined(MULTIMODULE) // TODO: Is there a better way to communicate this to this function? - if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { + if (!IS_TELEMETRY_INTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { // The DIY Multi module always speaks 100000 baud regardless of the telemetry protocol in use telemetryPortInit(MULTIMODULE_BAUDRATE, TELEMETRY_SERIAL_8E2); } else diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 36ce2aac3..1f1beec78 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -105,6 +105,7 @@ const pm_char STR_OPEN9X[] PROGMEM = #if defined(CPUARM) ISTR(VTRAINERMODES) ISTR(TARANIS_PROTOCOLS) + ISTR(TELEMETRY_PROTOCOLS) ISTR(XJT_PROTOCOLS) ISTR(DSM_PROTOCOLS) #if defined(MULTIMODULE) @@ -463,6 +464,9 @@ const pm_char STR_MULTI_OPTION[] PROGMEM = TR_MULTI_OPTION; const pm_char STR_MULTI_AUTOBIND[] PROGMEM = TR_MULTI_AUTOBIND; const pm_char STR_MULTI_LOWPOWER[] PROGMEM = TR_MULTI_LOWPOWER; const pm_char STR_MULTI_DSMFRAME[] PROGMEM = TR_MULTI_DSMFRAME; +#if defined(PCBSKY9X) +const pm_char STR_SUBTYPE[] PROGMEM = TR_SUBTYPE; +#endif #endif const pm_char STR_RESET_BTN[] PROGMEM = TR_RESET_BTN; diff --git a/radio/src/translations.h b/radio/src/translations.h index 614c62c10..56bd40e20 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -201,7 +201,8 @@ extern const pm_char STR_OPEN9X[]; #endif #if defined(CPUARM) #define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES)) - #define OFS_XJT_PROTOCOLS (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) + #define OFS_TELEMETRY_PROTOCOLS (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) + #define OFS_XJT_PROTOCOLS (OFS_TELEMETRY_PROTOCOLS + sizeof(TR_TELEMETRY_PROTOCOLS)) #define OFS_DSM_PROTOCOLS (OFS_XJT_PROTOCOLS + sizeof(TR_XJT_PROTOCOLS)) #if defined(MULTIMODULE) #define OFS_MULTI_PROTOCOLS (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS)) @@ -333,6 +334,7 @@ extern const pm_char STR_OPEN9X[]; #if defined(CPUARM) #define STR_VTRAINERMODES (STR_OPEN9X + OFS_VTRAINERMODES) #define STR_TARANIS_PROTOCOLS (STR_OPEN9X + OFS_TARANIS_PROTOCOLS) + #define STR_TELEMETRY_PROTOCOLS (STR_OPEN9X + OFS_TELEMETRY_PROTOCOLS) #define STR_XJT_PROTOCOLS (STR_OPEN9X + OFS_XJT_PROTOCOLS) #define STR_DSM_PROTOCOLS (STR_OPEN9X + OFS_DSM_PROTOCOLS) #if defined(MULTIMODULE) @@ -587,6 +589,9 @@ extern const pm_char STR_MULTI_RFTUNE[]; extern const pm_char STR_MULTI_AUTOBIND[]; extern const pm_char STR_MULTI_LOWPOWER[]; extern const pm_char STR_MULTI_DSMFRAME[]; +#if defined(PCBSKY9X) +extern const pm_char STR_SUBTYPE[]; +#endif #endif #if defined(DSM2) || defined(PXX) extern const pm_char STR_RECEIVER_NUM[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 2af246467..2cb069dac 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -97,6 +97,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "Vyp\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "Vyp\0""D16\0""D8\0 ""LR12" @@ -687,6 +690,7 @@ #define TR_AILDIRECTION "\012Křidélka" #define TR_COLDIRECTION "\012Kolektiv" #define TR_MODE INDENT"Mód" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Není volné expo!" #define TR_NOFREEMIXER "Není volný mix!" #define TR_SOURCE INDENT"Zdroj" @@ -860,12 +864,12 @@ #else #define TR_RECEIVER_NUM "RX číslo" #endif -#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" -#define TR_MULTI_VIDFREQ INDENT "Video frequency" -#define TR_MULTI_DSMFRAME INDENT "DSM frame format" -#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT"Limit" #define TR_MINRSSI "Min Rssi" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 96013a5c7..c9bfe58b9 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -101,6 +101,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "AUS\0""D16\0""D8\0 ""LR12" @@ -704,6 +707,7 @@ #define TR_AILDIRECTION TR("Roll Richtung", "Roll Servo Richtung") #define TR_COLDIRECTION TR("Pitch Richtung", "Pitch Servo Richtung") #define TR_MODE INDENT "Modus" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Expos voll!" #define TR_NOFREEMIXER "Mischer voll!" #define TR_SOURCE INDENT "Quelle" @@ -879,12 +883,12 @@ #define TR_RECEIVER_NUM "Empf Nr." #define TR_RECEIVER "Empf Nr." #endif -#define TR_MULTI_RFTUNE INDENT "RF Freq. Feintuning" -#define TR_MULTI_VIDFREQ INDENT "Video Frequenz" -#define TR_MULTI_DSMFRAME INDENT "DSM Rahmenformat" -#define TR_MULTI_OPTION INDENT "Optionswert" +#define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM Frm", INDENT "DSM Rahmenformat") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Grenzen" #define TR_MINRSSI "Min. RSSI" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index a2a8ff520..32a41a52f 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -101,6 +101,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -199,6 +202,7 @@ #if defined(IRPROTOS) #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" #else + #define TR_IRPROTOS #endif @@ -704,6 +708,7 @@ #define TR_AILDIRECTION "AIL Direction" #define TR_COLDIRECTION "PIT Direction" #define TR_MODE INDENT "Mode" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "No free expo!" #define TR_NOFREEMIXER "No free mixer!" #define TR_SOURCE INDENT "Source" @@ -879,12 +884,12 @@ #define TR_RECEIVER_NUM "RxNum" #define TR_RECEIVER "RxNum" #endif -#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" -#define TR_MULTI_VIDFREQ INDENT "Video frequency" -#define TR_MULTI_DSMFRAME INDENT "DSM frame format" -#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limit" #define TR_MINRSSI "Min Rssi" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 921be0de1..3331805ff 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -97,6 +97,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -660,6 +663,7 @@ #define TR_AILDIRECTION TR("AIL Direccion","Lateral cyc. direccion") #define TR_COLDIRECTION TR("PIT Direccion","Coll. pitch direccion") #define TR_MODE INDENT"Modo" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "No expo libre!" #define TR_NOFREEMIXER "No mezcla lib!" #define TR_SOURCE INDENT"Fuente" @@ -824,12 +828,12 @@ #define TR_MONITOR_MIXER_DESC "Mixers" #define TR_RECEIVER_NUM TR("RxNum", INDENT"Receptor No.") #define TR_RECEIVER INDENT "Receiver" -#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" -#define TR_MULTI_VIDFREQ INDENT "Video frequency" -#define TR_MULTI_DSMFRAME INDENT "DSM frame format" -#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync " TR_ENTER #define TR_LIMIT INDENT"Limite" #define TR_MINRSSI "Min Rssi" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 30b07a7d7..ceb25a7b7 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -97,6 +97,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -660,6 +663,7 @@ #define TR_AILDIRECTION TR("AIL Direction","Lateral cyc. direction") #define TR_COLDIRECTION TR("PIT Direction","Coll. pitch direction") #define TR_MODE INDENT"Mode" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "No free expo!" #define TR_NOFREEMIXER "No free mixer!" #define TR_SOURCE INDENT"Source" @@ -824,12 +828,12 @@ #define TR_MONITOR_MIXER_DESC "Mixers" #define TR_RECEIVER_NUM TR("RxNum", INDENT"Receiver No.") #define TR_RECEIVER INDENT "Receiver" -#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" -#define TR_MULTI_VIDFREQ INDENT "Video frequency" -#define TR_MULTI_DSMFRAME INDENT "DSM frame format" -#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT"Limit" #define TR_MINRSSI "Min Rssi" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index de40282a8..b5be54c8b 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -97,6 +97,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -686,6 +689,7 @@ #define TR_AILDIRECTION TR("Inv. latéral", "Inversion latéral") #define TR_COLDIRECTION TR("Inv. collectif", "Inversion collectif") #define TR_MODE INDENT "Mode" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Max expos atteint!" #define TR_NOFREEMIXER "Max mixages atteint!" #define TR_SOURCE INDENT "Source" @@ -859,9 +863,9 @@ #define TR_MULTI_RFTUNE INDENT "Ajustement fréq." #define TR_MULTI_VIDFREQ INDENT "Fréquence vidéo" #define TR_MULTI_DSMFRAME INDENT "Format trame DSM" -#define TR_MULTI_OPTION INDENT "Option perso" +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option perso") #define TR_MULTI_AUTOBIND INDENT "Bind automatique" -#define TR_MULTI_LOWPOWER INDENT "Mode basse puiss." +#define TR_MULTI_LOWPOWER TR( INDENT "low power", INDENT "Mode basse puiss.") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Limite" #define TR_MINRSSI "RSSI Min." diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index f96fc00d5..9f573822a 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -97,6 +97,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -686,6 +689,7 @@ #define TR_AILDIRECTION TR("Direzione AIL","Direzione Lateral cyc.") #define TR_COLDIRECTION TR("Direzione PIT","Direzione Coll. Passo") #define TR_MODE INDENT"Modo" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Expo pieni!" #define TR_NOFREEMIXER "Mixer pieni!" #define TR_SOURCE INDENT"Sorg." @@ -859,12 +863,12 @@ #else #define TR_RECEIVER_NUM "RxNum" #endif -#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" -#define TR_MULTI_VIDFREQ INDENT "Video frequency" -#define TR_MULTI_DSMFRAME INDENT "DSM frame format" -#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limiti" #define TR_MINRSSI "Min Rssi" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 874170079..840099ce3 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -98,6 +98,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "UIT\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -693,6 +696,7 @@ #define TR_AILDIRECTION "AIL Direction" #define TR_COLDIRECTION "PIT Direction" #define TR_MODE INDENT "Mode" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Geen vrije expo!" #define TR_NOFREEMIXER "Geen vrije mixer!" #define TR_SOURCE INDENT "Source" @@ -873,12 +877,12 @@ #else #define TR_RECEIVER_NUM "RxNum" #endif -#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" -#define TR_MULTI_VIDFREQ INDENT "Video frequency" -#define TR_MULTI_DSMFRAME INDENT "DSM frame format" -#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Grenzen" #define TR_MINRSSI "Min. RSSI" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index b76183a26..01e0f39a3 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -98,6 +98,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -688,6 +691,7 @@ #define TR_AILDIRECTION TR("Kierunek Lotk","Lateral cyc. direction") #define TR_COLDIRECTION TR("PIT Direction","Coll. pitch direction") #define TR_MODE INDENT "Tryb" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "BrakWoln.Expo!" #define TR_NOFREEMIXER "BrakWoln.Mixów!" #define TR_SOURCE INDENT "Źródło" @@ -861,12 +865,12 @@ #else #define TR_RECEIVER_NUM "NumOdb" #endif -#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" -#define TR_MULTI_VIDFREQ INDENT "Video frequency" -#define TR_MULTI_DSMFRAME INDENT "DSM frame format" -#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Synch]" #define TR_LIMIT INDENT "Limit" #define TR_MINRSSI "Min Rssi" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 95c294fe3..95504c9c4 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -97,6 +97,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -655,6 +658,7 @@ #define TR_AILDIRECTION "AIL Sentido" #define TR_COLDIRECTION "COL Sentido" #define TR_MODE INDENT"Modo" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "No free expo!" #define TR_NOFREEMIXER "No free mixer!" #define TR_SOURCE INDENT"Fonte" @@ -820,12 +824,12 @@ #define TR_RECEIVER_NUM "RxNum" #define TR_RECEIVER INDENT "Receiver" #define TR_SYNCMENU "Sync [MENU]" -#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" -#define TR_MULTI_VIDFREQ INDENT "Video frequency" -#define TR_MULTI_DSMFRAME INDENT "DSM frame format" -#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_LIMIT INDENT"Limite" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitude" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index e72d18630..c27e3a453 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -97,6 +97,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "Av\0 ""D16\0""D8\0 ""LR12" @@ -699,6 +702,7 @@ #define TR_AILDIRECTION "SKEV Riktning" #define TR_COLDIRECTION "PITCH Riktn. " #define TR_MODE INDENT"Läge" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Expo saknas!" #define TR_NOFREEMIXER "Mixer saknas!" #define TR_SOURCE INDENT"Källa" @@ -873,12 +877,12 @@ #define TR_RECEIVER_NUM "RxNum" #endif #define TR_SYNCMENU "Synk [MENU]" -#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" -#define TR_MULTI_VIDFREQ INDENT "Video frequency" -#define TR_MULTI_DSMFRAME INDENT "DSM frame format" -#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_LIMIT INDENT "Nivå" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Breddgrad"