1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-19 06:15:10 +03:00

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
This commit is contained in:
Arne Schwabe 2016-08-02 18:21:18 +02:00 committed by Bertrand Songis
parent d0527be2c4
commit 0b67d412a0
26 changed files with 392 additions and 115 deletions

View file

@ -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);
#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<int8_t>(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];
}
@ -647,10 +787,13 @@ void menuModelSetup(uint8_t event)
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
ModuleData &moduleData = g_model.moduleData[moduleIdx];
lcd_putsLeft(y, TR_FAILSAFE);
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;
@ -672,8 +815,43 @@ void menuModelSetup(uint8_t event)
}
}
}
#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)

View file

@ -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:

View file

@ -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);

View file

@ -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:

View file

@ -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;

View file

@ -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:

View file

@ -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);

View file

@ -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)
{

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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[];

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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."

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"