diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index c834933ed..f9d2486fe 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -483,6 +483,7 @@ if(ARCH STREQUAL ARM) option(TRACE_FATFS "Traces FatFS enabled" OFF) option(TRACE_AUDIO "Traces audio enabled" OFF) option(DEBUG_TRACE_BUFFER "Debug Trace Screen" OFF) + option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" OFF) option(SUPPORT_D16_EU_ONLY "XJT module only supports D16-EU and LR12-EU" OFF) # TODO rename to XJT_EU_ONLY if(TIMERS EQUAL 3) add_definitions(-DTIMERS=3) @@ -528,6 +529,10 @@ if(ARCH STREQUAL ARM) set(SRC ${SRC} haptic.cpp) set(TARGET_SRC ${TARGET_SRC} haptic_driver.cpp) endif() + if(MULTIMODULE) + add_definitions(-DMULTIMODULE) + set(SRC ${SRC} pulses/multi_arm.cpp) + endif() add_definitions(-DCPUARM) add_definitions(-DFRSKY -DFRSKY_SPORT -DFRSKY_HUB -DGPS -DPXX -DDSM2) add_definitions(-DBOLD_FONT -DBATTGRAPH -DTHRTRACE) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index c431ee37a..2cceb362f 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -686,13 +686,24 @@ PACK(struct ModuleData { int8_t rfProtocol:4; uint8_t channelsStart; int8_t channelsCount; // 0=8 channels - uint8_t failsafeMode:7; + uint8_t failsafeMode:4; //only 3 bits used + uint8_t subType:3; uint8_t invertedSerial:1; // telemetry serial inverted from standard int16_t failsafeChannels[NUM_CHNOUT]; - int8_t ppmDelay:6; - uint8_t ppmPulsePol:1; - uint8_t ppmOutputType:1; // false = open drain, true = push pull - int8_t ppmFrameLength; + union { + struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm; + NOBACKUP(struct { + uint8_t rfProtocol:6; // can be changed to rfProtocol if rfProtocol gets more bits, currently 6 bits used + uint8_t autoBindMode:1; + uint8_t lowPowerMode:1; + int8_t optionValue; + } multi); + }; }); /* diff --git a/radio/src/gui/9x/menu_model_setup.cpp b/radio/src/gui/9x/menu_model_setup.cpp index cd6c2fc82..fa5fcb216 100644 --- a/radio/src/gui/9x/menu_model_setup.cpp +++ b/radio/src/gui/9x/menu_model_setup.cpp @@ -562,21 +562,21 @@ void menuModelSetup(uint8_t event) if (IS_MODULE_PPM(moduleIdx)) { lcd_putsLeft(y, STR_PPMFRAME); lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppmFrameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppm.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (moduleData.ppmDelay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); - lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, moduleData.ppmPulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (moduleData.ppm.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, moduleData.ppm.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); if (attr && (editMode>0 || p1valdiff)) { switch (menuHorizontalPosition) { case 0: - CHECK_INCDEC_MODELVAR(event, moduleData.ppmFrameLength, -20, 35); + CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -20, 35); break; case 1: - CHECK_INCDEC_MODELVAR(event, moduleData.ppmDelay, -4, 10); + CHECK_INCDEC_MODELVAR(event, moduleData.ppm.delay, -4, 10); break; case 2: - CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.ppmPulsePol, 1); + CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.ppm.pulsePol, 1); break; } } diff --git a/radio/src/gui/horus/menu_model_setup.cpp b/radio/src/gui/horus/menu_model_setup.cpp index c6e9796f9..345d68861 100644 --- a/radio/src/gui/horus/menu_model_setup.cpp +++ b/radio/src/gui/horus/menu_model_setup.cpp @@ -611,20 +611,20 @@ bool menuModelSetup(evt_t event) ModuleData & moduleData = g_model.moduleData[moduleIdx]; if (IS_MODULE_PPM(moduleIdx)) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PPMFRAME); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppmFrameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT, 0, NULL, STR_MS); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+90, y, (moduleData.ppmDelay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr|RIGHT : RIGHT, 0, NULL, "us"); - lcdDrawText(MODEL_SETUP_2ND_COLUMN+120, y, moduleData.ppmPulsePol ? "+" : "-", (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppm.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT, 0, NULL, STR_MS); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+90, y, (moduleData.ppm.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr|RIGHT : RIGHT, 0, NULL, "us"); + lcdDrawText(MODEL_SETUP_2ND_COLUMN+120, y, moduleData.ppm.pulsePol ? "+" : "-", (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: - CHECK_INCDEC_MODELVAR(event, moduleData.ppmFrameLength, -20, 35); + CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -20, 35); break; case 1: - CHECK_INCDEC_MODELVAR(event, moduleData.ppmDelay, -4, 10); + CHECK_INCDEC_MODELVAR(event, moduleData.ppm.delay, -4, 10); break; case 2: - CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.ppmPulsePol, 1); + CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.ppm.pulsePol, 1); break; } } diff --git a/radio/src/gui/taranis/menu_model_setup.cpp b/radio/src/gui/taranis/menu_model_setup.cpp index 08eafc445..b06844a9c 100644 --- a/radio/src/gui/taranis/menu_model_setup.cpp +++ b/radio/src/gui/taranis/menu_model_setup.cpp @@ -80,6 +80,10 @@ enum menuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_EXTERNAL_MODULE_BIND, ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, +#ifdef MULTIMODULE + ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, + ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER, +#endif ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_CHANNELS, @@ -188,12 +192,28 @@ int getSwitchWarningsCount() #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)x : HIDDEN_ROW) #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1) -#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1) +#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1) #define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : TRAINER_CHANNELS_ROWS())) -#define FAILSAFE_ROWS(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) +#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_CUSTOM) +#define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].multi.rfProtocol))) ? (uint8_t) 1: 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)) #define TIMER_ROWS 2|NAVIGATION_LINE_BY_LINE, 0, CASE_PERSISTENT_TIMERS(0) 0, 0 -#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#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) 1 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 1 : HIDDEN_ROW, +#else +#define MULTIMODULE_MODE_ROWS(x) (uint8_t)0 +#define MULTIMODULE_MODULE_ROWS +#endif +#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 + #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS #elif TIMERS == 2 @@ -211,6 +231,7 @@ int getSwitchWarningsCount() #define TOPLCD_ROWS #endif + void menuModelSetup(uint8_t event) { horzpos_t l_posHorz = menuHorizontalPosition; @@ -225,9 +246,9 @@ void menuModelSetup(uint8_t event) IF_INTERNAL_MODULE_ON(IS_MODULE_XJT(INTERNAL_MODULE) ? (HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1) : (IS_MODULE_PPM(INTERNAL_MODULE) ? (uint8_t)1 : HIDDEN_ROW)), IF_INTERNAL_MODULE_ON((IS_MODULE_XJT(INTERNAL_MODULE)) ? FAILSAFE_ROWS(INTERNAL_MODULE) : HIDDEN_ROW), LABEL(ExternalModule), - (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, + (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNALE_MODULE)) ? (uint8_t)1 : (uint8_t)0, EXTERNAL_MODULE_CHANNELS_ROWS, - (IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, + (IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) ? (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_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); #else @@ -241,8 +262,8 @@ void menuModelSetup(uint8_t event) LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, EXTERNAL_MODULE_CHANNELS_ROWS, - (IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, - IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), + (IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) ? (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, + FAILSAFE_ROWS(EXTERNAL_MODULE), MULTIMODULE_MODULE_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); #endif MENU_CHECK(STR_MENUSETUP, menuTabModel, e_ModelSetup, ITEM_MODEL_SETUP_MAX); @@ -665,6 +686,52 @@ 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)) { + int8_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); + + switch(multi_rfProto) { + case MM_RF_PROTO_FLYSKY: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_FLYSKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_FRSKY: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_XJT_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType+1, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_HISKY: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_HISKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_DSM2: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType+1, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_YD717: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_YD717, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_KN: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_KN, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_SYMAX: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_SYMAX, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_CX10: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_CX10, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_CG023: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_CG023, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_MT99XX: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_MT99, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_MJXQ: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_MJXQ, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; + case MM_RF_PROTO_CUSTOM: + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+14*FW, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, menuHorizontalPosition==2 ? attr : 0, 2); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+16*FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2); + break; + } + } +#endif if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: @@ -678,12 +745,52 @@ 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 (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) + g_model.moduleData[EXTERNAL_MODULE].subType=0; + } 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; } + break; +#if defined(MULTIMODULE) + case 2: + 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: + case MM_RF_PROTO_FRSKY: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1); + break; + case MM_RF_PROTO_CG023: + case MM_RF_PROTO_MT99XX: + 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: + 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 3: + // Custom protocol, third column is subtype + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7); + break; +#endif } } break; @@ -737,21 +844,21 @@ void menuModelSetup(uint8_t event) if (IS_MODULE_PPM(moduleIdx)) { lcd_putsLeft(y, STR_PPMFRAME); lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppmFrameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppm.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (moduleData.ppmDelay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); - lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, moduleData.ppmPulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (moduleData.ppm.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, moduleData.ppm.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: - CHECK_INCDEC_MODELVAR(event, moduleData.ppmFrameLength, -20, 35); + CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -20, 35); break; case 1: - CHECK_INCDEC_MODELVAR(event, moduleData.ppmDelay, -4, 10); + CHECK_INCDEC_MODELVAR(event, moduleData.ppm.delay, -4, 10); break; case 2: - CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.ppmPulsePol, 1); + CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.ppm.pulsePol, 1); break; } } @@ -767,11 +874,13 @@ void menuModelSetup(uint8_t event) else { lcd_putsLeft(y, STR_RXNUM); } - 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 (s_editMode>0) { - 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]; } @@ -827,8 +936,39 @@ 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: + 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 } } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index bf33d30d8..44e106d01 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -53,7 +53,7 @@ #define GVAR_VALUE(gv, fm) g_model.flightModeData[fm].gvars[gv] #endif -#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppmFrameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount) +#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppm.frameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount) #if defined(PCBTARANIS) || defined(PCBHORUS) #define IS_TRAINER_EXTERNAL_MODULE() (g_model.trainerMode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || g_model.trainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) @@ -466,11 +466,14 @@ enum Protocols { PROTO_CROSSFIRE, #endif #if defined(IRPROTOS) - // we will need 4 bytes for proto :( + // we will need 4 bits for proto :( PROTO_SILV, PROTO_TRAC09, PROTO_PICZ, PROTO_SWIFT, +#endif +#if defined(MULTIMODULE) + PROTO_MULTIMODULE, #endif PROTO_MAX, PROTO_NONE @@ -484,6 +487,31 @@ enum RFProtocols { RF_PROTO_LAST = RF_PROTO_LR12 }; +enum MultiModuleRFProtocols { + MM_RF_PROTO_FLYSKY=0, + MM_RF_PROTO_FIRST=MM_RF_PROTO_FLYSKY, + MM_RF_PROTO_HUBSAN, + MM_RF_PROTO_FRSKY, + MM_RF_PROTO_HISKY, + MM_RF_PROTO_V2X2, + MM_RF_PROTO_DSM2, + MM_RF_PROTO_DEVO, + MM_RF_PROTO_YD717, + MM_RF_PROTO_KN, + MM_RF_PROTO_SYMAX, + MM_RF_PROTO_SLT, + MM_RF_PROTO_CX10, + MM_RF_PROTO_CG023, + MM_RF_PROTO_BAYANG, + MM_RF_PROTO_ESky, + MM_RF_PROTO_MT99XX, + MM_RF_PROTO_MJXQ, + MM_RF_PROTO_SHENQI, + MM_RF_PROTO_FY326, + MM_RF_PROTO_CUSTOM, + MM_RF_PROTO_LAST= MM_RF_PROTO_CUSTOM +}; + #define HAS_RF_PROTOCOL_FAILSAFE(rf) ((rf) == RF_PROTO_X16) #define HAS_RF_PROTOCOL_MODELINDEX(rf) (((rf) == RF_PROTO_X16) || ((rf) == RF_PROTO_LR12)) @@ -502,6 +530,9 @@ enum ModuleTypes { #endif #if defined(CROSSFIRE) MODULE_TYPE_CROSSFIRE, +#endif +#if defined(MULTIMODULE) + MODULE_TYPE_MULTIMODULE, #endif MODULE_TYPE_COUNT }; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index ee0f82bfc..960766a3c 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -461,6 +461,11 @@ 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 @@ -468,7 +473,7 @@ void memswap(void * a, void * b, uint8_t size); #endif #define MAX_EXTERNAL_MODULE_CHANNELS() ((g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[1].rfProtocol] : maxChannelsModules[g_model.moduleData[EXTERNAL_MODULE].type]) #define MAX_CHANNELS(idx) (idx==INTERNAL_MODULE ? MAX_INTERNAL_MODULE_CHANNELS() : (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS())) - #define NUM_CHANNELS(idx) (IS_MODULE_CROSSFIRE(idx) ? CROSSFIRE_CHANNELS_COUNT : (8+g_model.moduleData[idx].channelsCount)) + #define NUM_CHANNELS(idx) ((IS_MODULE_CROSSFIRE(idx) || IS_MODULE_MULTIMODULE(idx)) ? CROSSFIRE_CHANNELS_COUNT : (8+g_model.moduleData[idx].channelsCount)) #elif defined(PCBSKY9X) && !defined(REVA) #define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || idx==EXTRA_MODULE || (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_PPM)) #define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_XJT) diff --git a/radio/src/pulses/multi_arm.cpp b/radio/src/pulses/multi_arm.cpp new file mode 100644 index 000000000..841e758a9 --- /dev/null +++ b/radio/src/pulses/multi_arm.cpp @@ -0,0 +1,186 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +// for the MULTI protocol definition +// see https://github.com/pascallanger/DIY-Multiprotocol-TX-Module +// file Multiprotocol/multiprotocol.h + + + +/* The protocol is heavily inspired by the DSM2 protocol, so reuse some the definitions where they are identical */ + +#define MULTI_SEND_BIND (1 << 7) +#define MULTI_SEND_RANGECHECK (1 << 5) +#define MULTI_SEND_AUTOBIND (1 << 6) + + +#define BITLEN_MULTI (10*2) //100000 Baud => 10uS per bit + +#if defined(PPM_PIN_HW_SERIAL) +static void sendByteMulti(uint8_t b) +{ + uint8_t parity = 1; + + putDsm2SerialBit(0); // Start bit + for (uint8_t i=0; i<8; i++) { // 8 data Bits + putDsm2SerialBit(b & 1); + parity = parity ^ (b & 1); + b >>= 1; + } + putDsm2SerialBit(parity); // Even Parity bit + + putDsm2SerialBit(1); // Stop bit + putDsm2SerialBit(1); // Stop bit +} +#else +static void _send_level(uint8_t v) +{ + /* Copied over from DSM, this looks doubious and in my logic analyzer + output the low->high is about 2 ns late */ + if (modulePulsesData[EXTERNAL_MODULE].dsm2.index == 0) + v -= 2; + else + v += 2; + + modulePulsesData[EXTERNAL_MODULE].dsm2.value += v; + *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = modulePulsesData[EXTERNAL_MODULE].dsm2.value; + modulePulsesData[EXTERNAL_MODULE].dsm2.index = (modulePulsesData[EXTERNAL_MODULE].dsm2.index+1) % 2; +} + +static void sendByteMulti(uint8_t b) //max 11 changes 0 10 10 10 10 P 1 +{ + bool lev = 0; + uint8_t parity = 1; + + uint8_t len = BITLEN_MULTI; //max val: 10*20 < 256 + for (uint8_t i=0; i<=9; i++) { //8Bits + 1Parity + Stop=1 + bool nlev = b & 1; //lsb first + parity = parity ^ nlev; + if (lev == nlev) { + len += BITLEN_MULTI; + } + else { + _send_level(len); + len = BITLEN_MULTI; + lev = nlev; + } + b = (b>>1) | 0x80; //shift in ones for stop bit and parity + if (i==7) + b = b ^ parity; // lowest bit is one from previous line + } + _send_level(len+2*BITLEN_MULTI); // 2Stop bits +} +#endif + +// This is the data stream to send, prepare after 19.5 mS +// Send after 22.5 mS + +//static uint8_t *Dsm2_pulsePtr = pulses2MHz.pbyte ; + + +#define MULTI_CHANS 16 +#define MULTI_CHAN_BITS 11 +void setupPulsesMultimodule(unsigned int port) +{ + +#if defined(PPM_PIN_HW_SERIAL) + modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0 ; + modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0 ; +#else + modulePulsesData[EXTERNAL_MODULE].dsm2.value = 0; + modulePulsesData[EXTERNAL_MODULE].dsm2.index = 1; +#endif + + modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + +#if defined(PCBTARANIS) + modulePulsesData[EXTERNAL_MODULE].dsm2.value = 100; + *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = modulePulsesData[EXTERNAL_MODULE].dsm2.value; +#endif + + // header, byte 0, always 0x55 + sendByteMulti(0x55); + + // byte 1+2, protocol information + + int type = g_model.moduleData[port].multi.rfProtocol +1; + int subtype = g_model.moduleData[port].subType; + + uint8_t protoByte=0; + if (moduleFlag[port] == MODULE_BIND) + protoByte |= MULTI_SEND_BIND; + else if (moduleFlag[port] == MODULE_RANGECHECK) + protoByte |= MULTI_SEND_RANGECHECK; + + // rfProtocol + // 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky) + // all protos > frskyx are therefore also off by one + if (type >=15) + type= type +1; + + if (g_model.moduleData[port].multi.rfProtocol == MM_RF_PROTO_FRSKY) { + if(subtype == 1) + type = 3; + else + type = 15; + subtype = 0; + } + + if (g_model.moduleData[port].multi.rfProtocol >= MM_RF_PROTO_CUSTOM) + type = g_model.moduleData[port].multi.rfProtocol & 0x1f; + + protoByte |= (type & 0x1f) | (g_model.moduleData[port].multi.autoBindMode << 6); + sendByteMulti(protoByte); + + + // power always set to high (0 << 7) + sendByteMulti((g_model.header.modelId[port] & 0x0f) + | ((subtype & 0x7) << 4) + | (g_model.moduleData[port].multi.lowPowerMode << 7) + ); + + + + //TODO: option_protocol, use same default as multi module + // byte 3 + sendByteMulti(g_model.moduleData[port].multi.optionValue); + + uint32_t bits = 0; + uint8_t bitsavailable = 0; + + // byte 4-25, channels 0..2047 + // ?? Range for pulses (channelsOutputs) is [-1024:+1024] + for (int i=0; i= 8) { + sendByteMulti((uint8_t) (bits & 0xff)); + bits >>= 8; + bitsavailable -= 8; + } + } + + putDsm2Flush(); +} diff --git a/radio/src/pulses/ppm_arm.cpp b/radio/src/pulses/ppm_arm.cpp index 05807d884..30b85084c 100644 --- a/radio/src/pulses/ppm_arm.cpp +++ b/radio/src/pulses/ppm_arm.cpp @@ -35,8 +35,8 @@ void setupPulsesPPM(unsigned int port) // Don't enable interru // TODO move register stuff to driver register Pwm *pwmptr = PWM; uint32_t pwmCh = (port == EXTERNAL_MODULE ? 3 : 1); - pwmptr->PWM_CH_NUM[pwmCh].PWM_CDTYUPD = (g_model.moduleData[port].ppmDelay * 50 + 300) * 2; //Stoplen *2 - if (g_model.moduleData[port].ppmPulsePol) + pwmptr->PWM_CH_NUM[pwmCh].PWM_CDTYUPD = (g_model.moduleData[port].ppm.delay * 50 + 300) * 2; //Stoplen *2 + if (g_model.moduleData[port].ppm.pulsePol) pwmptr->PWM_CH_NUM[pwmCh].PWM_CMR &= ~0x00000200 ; // CPOL else pwmptr->PWM_CH_NUM[pwmCh].PWM_CMR |= 0x00000200 ; // CPOL @@ -48,7 +48,7 @@ void setupPulsesPPM(unsigned int port) // Don't enable interru ppmPulsesData->ptr = ptr; int32_t rest = 22500u * 2; - rest += (int32_t(g_model.moduleData[port].ppmFrameLength)) * 1000; + rest += (int32_t(g_model.moduleData[port].ppm.frameLength)) * 1000; for (uint32_t i=firstCh; i(PROTO_DSM2_LP45, PROTO_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTO_DSM2_DSMX); @@ -123,6 +128,11 @@ void setupPulses(unsigned int port) case PROTO_CROSSFIRE: disable_crossfire(port); break; +#endif +#if defined(MULTIMODULE) + case PROTO_MULTIMODULE: + disable_dsm2(port); + break; #endif case PROTO_PPM: disable_ppm(port); @@ -149,6 +159,11 @@ void setupPulses(unsigned int port) case PROTO_CROSSFIRE: init_crossfire(port); break; +#endif +#if defined(MULTIMODULE) + case PROTO_MULTIMODULE: + init_dsm2(port); + break; #endif case PROTO_PPM: init_ppm(port); @@ -182,6 +197,11 @@ void setupPulses(unsigned int port) } break; } +#endif +#if defined(MULTIMODULE) + case PROTO_MULTIMODULE: + setupPulsesMultimodule(port); + break; #endif case PROTO_PPM: setupPulsesPPM(port); diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 9a8fb4091..eb4f35289 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -88,11 +88,16 @@ union TrainerPulsesData { extern ModulePulsesData modulePulsesData[NUM_MODULES]; extern TrainerPulsesData trainerPulsesData; +extern const uint16_t CRCTable[]; void setupPulses(unsigned int port); void setupPulsesDSM2(unsigned int port); +void setupPulsesMultimodule(unsigned int port); void setupPulsesPXX(unsigned int port); void setupPulsesPPM(unsigned int port); +void sendByteDsm2(uint8_t b); +void putDsm2Flush(); +void putDsm2SerialBit(uint8_t bit); void createCrossfireFrame(uint8_t * frame, int16_t * pulses); diff --git a/radio/src/storage/datacopy.cpp b/radio/src/storage/datacopy.cpp index 6afc7fb06..eec909994 100644 --- a/radio/src/storage/datacopy.cpp +++ b/radio/src/storage/datacopy.cpp @@ -1,4 +1,4 @@ -//This file was auto-generated by generate_datacopy.py script on Fri Mar 25 14:17:31 2016. Do not edit this file! +//This file was auto-generated by generate_datacopy.py script on Fri Mar 25 14:26:09 2016. Do not edit this file! @@ -194,10 +194,7 @@ void copyModuleData(A * dest, B * src) dest->failsafeMode = src->failsafeMode; dest->invertedSerial = src->invertedSerial; memcpy(dest->failsafeChannels, src->failsafeChannels, sizeof(dest->failsafeChannels)); - dest->ppmDelay = src->ppmDelay; - dest->ppmPulsePol = src->ppmPulsePol; - dest->ppmOutputType = src->ppmOutputType; - dest->ppmFrameLength = src->ppmFrameLength; + copyModuleData_ppm(&dest->ppm, &src->ppm); } template @@ -338,3 +335,12 @@ void copyTelemetrySensor_custom(A * dest, B * src) dest->ratio = src->ratio; dest->offset = src->offset; } + +template +void copyModuleData_ppm(A * dest, B * src) +{ + dest->delay = src->delay; + dest->pulsePol = src->pulsePol; + dest->outputType = src->outputType; + dest->frameLength = src->frameLength; +} diff --git a/radio/src/storage/eeprom_conversions.cpp b/radio/src/storage/eeprom_conversions.cpp index 561a3451d..56c6d52c3 100644 --- a/radio/src/storage/eeprom_conversions.cpp +++ b/radio/src/storage/eeprom_conversions.cpp @@ -871,9 +871,9 @@ void ConvertModel_216_to_217(ModelData & model) for (int j=0; jPIO_ABCDSR[1] |= PIO_PA17 ; // Peripheral C pioptr->PIO_PDR = PIO_PA17 ; // Disable bit A17 Assign to peripheral #if defined(REVX) - if (g_model.moduleData[EXTERNAL_MODULE].ppmOutputType) { + if (g_model.moduleData[EXTERNAL_MODULE].ppm.OutputType) { pioptr->PIO_MDDR = PIO_PA17 ; // Push Pull O/p in A17 } else { @@ -52,13 +52,13 @@ void init_main_ppm(uint32_t period, uint32_t out_enable) pwmptr = PWM ; // PWM3 for PPM output pwmptr->PWM_CH_NUM[3].PWM_CMR = 0x0004000B ; // CLKA - if (!g_model.moduleData[EXTERNAL_MODULE].ppmPulsePol) { + if (!g_model.moduleData[EXTERNAL_MODULE].ppm.pulsePol) { pwmptr->PWM_CH_NUM[3].PWM_CMR |= 0x00000200 ; // CPOL } pwmptr->PWM_CH_NUM[3].PWM_CPDR = period ; // Period in half uS pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = period ; // Period in half uS - pwmptr->PWM_CH_NUM[3].PWM_CDTY = g_model.moduleData[EXTERNAL_MODULE].ppmDelay*100+600; // Duty in half uS - pwmptr->PWM_CH_NUM[3].PWM_CDTYUPD = g_model.moduleData[EXTERNAL_MODULE].ppmDelay*100+600; // Duty in half uS + pwmptr->PWM_CH_NUM[3].PWM_CDTY = g_model.moduleData[EXTERNAL_MODULE].ppm.delay*100+600; // Duty in half uS + pwmptr->PWM_CH_NUM[3].PWM_CDTYUPD = g_model.moduleData[EXTERNAL_MODULE].ppm.delay*100+600; // Duty in half uS pwmptr->PWM_ENA = PWM_ENA_CHID3 ; // Enable channel 3 pwmptr->PWM_IER1 = PWM_IER1_CHID3 ; @@ -66,13 +66,13 @@ void init_main_ppm(uint32_t period, uint32_t out_enable) // PWM1 for PPM2 configure_pins(PIO_PC15, PIN_PERIPHERAL | PIN_INPUT | PIN_PER_B | PIN_PORTC | PIN_NO_PULLUP ) ; pwmptr->PWM_CH_NUM[1].PWM_CMR = 0x0000000B ; // CLKB - if (!g_model.moduleData[EXTRA_MODULE].ppmPulsePol) { + if (!g_model.moduleData[EXTRA_MODULE].ppm.pulsePol) { pwmptr->PWM_CH_NUM[1].PWM_CMR |= 0x00000200 ; // CPOL } pwmptr->PWM_CH_NUM[1].PWM_CPDR = period ; // Period pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = period ; // Period - pwmptr->PWM_CH_NUM[1].PWM_CDTY = g_model.moduleData[EXTRA_MODULE].ppmDelay*100+600 ; // Duty - pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = g_model.moduleData[EXTRA_MODULE].ppmDelay*100+600 ; // Duty + pwmptr->PWM_CH_NUM[1].PWM_CDTY = g_model.moduleData[EXTRA_MODULE].ppm.delay*100+600 ; // Duty + pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = g_model.moduleData[EXTRA_MODULE].ppm.delay*100+600 ; // Duty pwmptr->PWM_ENA = PWM_ENA_CHID1 ; // Enable channel 1 pwmptr->PWM_IER1 = PWM_IER1_CHID1 ; #endif diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index 356b4229b..458828349 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -32,7 +32,7 @@ static void intmodulePxxStop( void ) ; #endif static void extmodulePxxStart( void ) ; static void extmodulePxxStop( void ) ; -#if defined(DSM2) +#if defined(DSM2) || defined(MULTIMODULE) static void extmoduleDsm2Start( void ) ; static void extmoduleDsm2Stop( void ) ; #endif @@ -61,7 +61,7 @@ void disable_pxx(uint32_t port) extmodulePxxStop() ; } -#if defined(DSM2) +#if defined(DSM2) || defined(MULTIMODULE) void init_dsm2(uint32_t port) { if (port == EXTERNAL_MODULE) { @@ -469,7 +469,7 @@ static void extmodulePxxStop() } } -#if defined(DSM2) +#if defined(DSM2) || defined(MULTIMODULE) static void extmoduleDsm2Start() { EXTERNAL_MODULE_ON(); @@ -589,7 +589,9 @@ extern "C" void TIM8_CC_IRQHandler() EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE ; // Enable this interrupt } #if defined(DSM2) - else if (s_current_protocol[EXTERNAL_MODULE] >= PROTO_DSM2_LP45 && s_current_protocol[EXTERNAL_MODULE] <= PROTO_DSM2_DSMX) { + else if ((s_current_protocol[EXTERNAL_MODULE] >= PROTO_DSM2_LP45 && s_current_protocol[EXTERNAL_MODULE] <= PROTO_DSM2_DSMX) || IS_MULTIMODULE_PROTOCOL (s_current_protocol[EXTERNAL_MODULE])) + +{ DMA2_Stream2->CR &= ~DMA_SxCR_EN ; // Disable DMA DMA2->LIFCR = DMA_LIFCR_CTCIF2 | DMA_LIFCR_CHTIF2 | DMA_LIFCR_CTEIF2 | DMA_LIFCR_CDMEIF2 | DMA_LIFCR_CFEIF2 ; // Write ones to clear bits DMA2_Stream2->M0AR = CONVERT_PTR_UINT(&modulePulsesData[EXTERNAL_MODULE].dsm2.pulses[1]); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index a0e66feab..391487fd2 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -107,6 +107,19 @@ const pm_char STR_OPEN9X[] PROGMEM = ISTR(TARANIS_PROTOCOLS) ISTR(XJT_PROTOCOLS) ISTR(DSM_PROTOCOLS) +#if defined(MULTIMODULE) + ISTR(MULTI_PROTOCOLS) + ISTR(SUBTYPE_FLYSKY) + ISTR(SUBTYPE_HISKY) + ISTR(SUBTYPE_YD717) + ISTR(SUBTYPE_SYMAX) + ISTR(SUBTYPE_CX10) + ISTR(SUBTYPE_CG023) + ISTR(SUBTYPE_KN) + ISTR(SUBTYPE_MT99) + ISTR(SUBTYPE_MJXQ) + ISTR(OPTIONS_DSM) +#endif ISTR(VOLTSRC) ISTR(CURVE_TYPES) ISTR(VSENSORTYPES) @@ -435,6 +448,15 @@ const pm_char STR_ABOUT_US[] PROGMEM = TR_ABOUT_US; const pm_char STR_SETUP_SCREENS[] PROGMEM = TR_SETUP_SCREENS; #endif +#if defined(MULTIMODULE) +const pm_char STR_MULTI_RFTUNE[] PROGMEM = TR_MULTI_RFTUNE; +const pm_char STR_MULTI_VIDFREQ[] PROGMEM = TR_MULTI_VIDFREQ; +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; +#endif + const pm_char STR_RESET_BTN[] PROGMEM = TR_RESET_BTN; #if defined(SDCARD) @@ -715,5 +737,3 @@ const pm_char STR_MENU_INVERT[] PROGMEM = TR_MENU_INVERT; const pm_char STR_ABOUT_PARENTS_3[] PROGMEM = TR_ABOUT_PARENTS_3; const pm_char STR_ABOUT_PARENTS_4[] PROGMEM = TR_ABOUT_PARENTS_4; #endif - - diff --git a/radio/src/translations.h b/radio/src/translations.h index f0e3c04fd..604f0da30 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -189,7 +189,22 @@ extern const pm_char STR_OPEN9X[]; #define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES)) #define OFS_XJT_PROTOCOLS (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) #define OFS_DSM_PROTOCOLS (OFS_XJT_PROTOCOLS + sizeof(TR_XJT_PROTOCOLS)) - #define OFS_VOLTSRC (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS)) +#if defined(MULTIMODULE) + #define OFS_MULTI_PROTOCOLS (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS)) + #define OFS_SUBTYPE_FLYSKY (OFS_MULTI_PROTOCOLS + sizeof(TR_MULTI_PROTOCOLS)) + #define OFS_SUBTYPE_HISKY (OFS_SUBTYPE_FLYSKY + sizeof(TR_SUBTYPE_FLYSKY)) + #define OFS_SUBTYPE_YD717 (OFS_SUBTYPE_HISKY + sizeof(TR_SUBTYPE_HISKY)) + #define OFS_SUBTYPE_SYMAX (OFS_SUBTYPE_YD717 + sizeof(TR_SUBTYPE_YD717)) + #define OFS_SUBTYPE_CX10 (OFS_SUBTYPE_SYMAX + sizeof(TR_SUBTYPE_SYMAX)) + #define OFS_SUBTYPE_CG023 (OFS_SUBTYPE_CX10 + sizeof(TR_SUBTYPE_CX10)) + #define OFS_SUBTYPE_KN (OFS_SUBTYPE_CG023 + sizeof(TR_SUBTYPE_CG023)) + #define OFS_SUBTYPE_MT99 (OFS_SUBTYPE_KN + sizeof(TR_SUBTYPE_KN)) + #define OFS_SUBTYPE_MJXQ (OFS_SUBTYPE_MT99 + sizeof(TR_SUBTYPE_MT99)) + #define OFS_OPTIONS_DSM (OFS_SUBTYPE_MJXQ + sizeof(TR_SUBTYPE_MJXQ)) + #define OFS_VOLTSRC (OFS_OPTIONS_DSM + sizeof(TR_OPTIONS_DSM)) +#else + #define OFS_VOLTSRC (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS)) +#endif #define OFS_CURVE_TYPES (OFS_VOLTSRC + sizeof(TR_VOLTSRC)) #define OFS_VSENSORTYPES (OFS_CURVE_TYPES + sizeof(TR_CURVE_TYPES)) #define OFS_VFORMULAS (OFS_VSENSORTYPES + sizeof(TR_VSENSORTYPES)) @@ -304,8 +319,21 @@ extern const pm_char STR_OPEN9X[]; #define STR_TARANIS_PROTOCOLS (STR_OPEN9X + OFS_TARANIS_PROTOCOLS) #define STR_XJT_PROTOCOLS (STR_OPEN9X + OFS_XJT_PROTOCOLS) #define STR_DSM_PROTOCOLS (STR_OPEN9X + OFS_DSM_PROTOCOLS) - #define STR_CURVE_TYPES (STR_OPEN9X + OFS_CURVE_TYPES) - #define STR_VSENSORTYPES (STR_OPEN9X + OFS_VSENSORTYPES) +#if defined(MULTIMODULE) + #define STR_MULTI_PROTOCOLS (STR_OPEN9X + OFS_MULTI_PROTOCOLS) + #define STR_SUBTYPE_FLYSKY (STR_OPEN9X + OFS_SUBTYPE_FLYSKY) + #define STR_SUBTYPE_HISKY (STR_OPEN9X + OFS_SUBTYPE_HISKY) + #define STR_SUBTYPE_YD717 (STR_OPEN9X + OFS_SUBTYPE_YD717) + #define STR_SUBTYPE_SYMAX (STR_OPEN9X + OFS_SUBTYPE_SYMAX) + #define STR_SUBTYPE_CX10 (STR_OPEN9X + OFS_SUBTYPE_CX10) + #define STR_SUBTYPE_CG023 (STR_OPEN9X + OFS_SUBTYPE_CG023) + #define STR_SUBTYPE_KN (STR_OPEN9X + OFS_SUBTYPE_KN) + #define STR_SUBTYPE_MT99 (STR_OPEN9X + OFS_SUBTYPE_MT99) + #define STR_SUBTYPE_MJXQ (STR_OPEN9X + OFS_SUBTYPE_MJXQ) + #define STR_OPTIONS_DSM (STR_OPEN9X + OFS_OPTIONS_DSM) +#endif + #define STR_CURVE_TYPES (STR_OPEN9X + OFS_CURVE_TYPES) + #define STR_VSENSORTYPES (STR_OPEN9X + OFS_VSENSORTYPES) #define STR_VFORMULAS (STR_OPEN9X + OFS_VFORMULAS) #define STR_VPREC (STR_OPEN9X + OFS_VPREC) #define STR_VCELLINDEX (STR_OPEN9X + OFS_VCELLINDEX) @@ -528,11 +556,19 @@ extern const pm_char STR_GF[]; #if defined(FAS_OFFSET) || !defined(CPUM64) extern const pm_char STR_FAS_OFFSET[]; -#endif - -#if defined(DSM2) || defined(PXX) -extern const pm_char STR_RXNUM[]; -#endif +#endif + +#if defined(MULTIMODULE) +extern const pm_char STR_MULTI_OPTION[]; +extern const pm_char STR_MULTI_VIDFREQ[]; +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[]; +#endif +#if defined(DSM2) || defined(PXX) +extern const pm_char STR_RXNUM[]; +#endif #if defined(PXX) || defined(CPUARM) extern const pm_char STR_SYNCMENU[]; @@ -968,4 +1004,4 @@ extern const pm_char STR_BLCOLOR[]; #define CHR_HOUR TR_CHR_HOUR #define CHR_INPUT TR_CHR_INPUT -#endif // _TRANSLATIONS_H_ +#endif // _TRANSLATIONS_H_ diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 451443b5a..22d5f0ae4 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "Amerika\0""Japonsko""Evropa\0 ") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "Vyp\0""PPM\0""XJT\0""DSM2""CRSF" +#define TR_TARANIS_PROTOCOLS "Vyp\0""PPM\0""XJT\0""DSM2""CRSF""MULT" #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "Vyp\0""D16\0""D8\0 ""LR12" @@ -103,6 +103,44 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE FOR FRSKY use TR_XJT_PROTOCOLS with offset +1 + + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Green\0 ""Blue\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + #define LEN_VTRIMINC "\007" #define TR_VTRIMINC "Expo\0 ""ExJemný""Jemný\0 ""Střední""Hrubý\0 " @@ -793,6 +831,12 @@ #else #define TR_RXNUM "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_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER 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 30c5c5e87..cd1ad18e1 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -94,8 +94,8 @@ #define LEN_COUNTRYCODES TR("\002", "\007") #define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF" +#define LEN_TARANIS_PROTOCOLS "\004" +#define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF""MULT" #if defined(MODULE_D16_EU_ONLY_SUPPORT) #define LEN_XJT_PROTOCOLS "\007" @@ -108,6 +108,43 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM?\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE für FRSKY nutzt TR_XJT_PROTOCOLS mit Offset +1 + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE für DSMX nutzt TR_DSM_PROTOCOLS mit Offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Grün\0 ""Blau\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + #define LEN_VTRIMINC TR("\007", "\014") // ursprüglich "\006", "\013" #define TR_VTRIMINC TR("Expo ""ExFein ""Fein ""Mittel ""Grob ", "Exponentiell""Extrafein ""Fein ""Mittel ""Grob ") @@ -580,7 +617,7 @@ #define OFS_EXIT sizeof(TR_ENTER) #endif -#define TR_MENUWHENDONE CENTER"\010"TR_ENTER" > Weiter" +#define TR_MENUWHENDONE CENTER"\010" TR_ENTER" > Weiter" #define TR_FREE "frei" #define TR_DELETEMODEL "Modell löschen?" #define TR_COPYINGMODEL "Kopiere Modell" @@ -711,11 +748,11 @@ #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" #elif defined(COLORLCD) - #define TR_MENUTOSTART CENTER"\007"TR_ENTER" zum Start" + #define TR_MENUTOSTART CENTER"\007" TR_ENTER " zum Start" #define TR_SETMIDPOINT CENTER"\002Knüppel+Potis auf Mitte" #define TR_MOVESTICKSPOTS CENTER"\003Knüppel+Potis bewegen" #else - #define TR_MENUTOSTART CENTER"\007"TR_ENTER" zum Start" + #define TR_MENUTOSTART CENTER"\007" TR_ENTER " zum Start" #define TR_SETMIDPOINT TR(CENTER "\002Knüppel+Potis auf Mitte", CENTER "\002Knüppel+Potis auf Mitte") #define TR_MOVESTICKSPOTS CENTER"\003Knüppel+Potis bewegen" #endif @@ -797,8 +834,14 @@ #else #define TR_RXNUM "Empf Nr." #endif +#define TR_MULTI_RFTUNE INDENT "Frequenzfeineinst." +#define TR_MULTI_VIDFREQ INDENT "Videofrequenz" +#define TR_MULTI_DSMFRAME INDENT "DSM Rahmenformat" +#define TR_MULTI_OPTION INDENT "Optionswert" +#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER INDENT "Niedrige Leistung" #define TR_SYNCMENU "Sync [MENU]" -#define TR_LIMIT INDENT "Grenzen" +#define TR_LIMIT INDENT "Grenzen" #define TR_MINRSSI "Min. RSSI" #define TR_LATITUDE "Breite:" #define TR_LONGITUDE "Länge:" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 62f4fe04f..ed32affb9 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europe\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -103,6 +103,44 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE FOR FRSKY use TR_XJT_PROTOCOLS with offset +1 + + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Green\0 ""Blue\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + #define LEN_VTRIMINC TR("\006", "\013") #define TR_VTRIMINC TR("Expo\0 ""ExFine""Fine\0 ""Medium""Coarse", "Exponential""Extra Fine\0""Fine\0 ""Medium\0 ""Coarse\0 ") @@ -792,7 +830,6 @@ #define TR_MENUINPUTS "STICKS" #define TR_MENULIMITS "SERVOS" #endif - #define TR_MENUCURVES "CURVES" #define TR_MENUCURVE "CURVE" #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" @@ -808,6 +845,12 @@ #else #define TR_RXNUM "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_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER 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 6ea0b7a14..d01470742 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "America""Japon\0 ""Europa\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -103,6 +103,44 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE FOR FRSKY use TR_XJT_PROTOCOLS with offset +1 + + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Green\0 ""Blue\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + #define LEN_VTRIMINC TR("\006", "\013") #define TR_VTRIMINC TR("Expo ""ExFino""Fino ""Medio ""Grueso", "Exponencial""Extra Fino ""Fino ""Medio ""Grueso ") @@ -754,7 +792,13 @@ #define TR_MENUSTAT "STATS" #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM TR("RxNum", INDENT"Receptor No.") -#define TR_SYNCMENU "Sync "TR_ENTER +#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_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER INDENT "Low power mode" +#define TR_SYNCMENU "Sync " TR_ENTER #define TR_LIMIT INDENT"Limite" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitud" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 18f76acfd..6a56f53ce 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "Amerikk""Japani\0""Euroopp") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -103,6 +103,44 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE FOR FRSKY use TR_XJT_PROTOCOLS with offset +1 + + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Green\0 ""Blue\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + #define LEN_VTRIMINC TR("\006", "\013") #define TR_VTRIMINC TR("Expo\0 ""EriHie""Hieno\0""Keski\0""Karkea", "Exponential""Eri Hieno\0 ""Hieno\0 ""Keski\0 ""Karkea\0 ") @@ -754,6 +792,12 @@ #define TR_MENUSTAT "STATS" #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM TR("RxNum", INDENT"Receiver No.") +#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_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER 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 476f1be43..ea8a8a5b0 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "USA\0 ""Japon\0""Europe") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -103,6 +103,44 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE FOR FRSKY use TR_XJT_PROTOCOLS with offset +1 + + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Green\0 ""Blue\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + #define LEN_VTRIMINC TR("\006", "\013") #define TR_VTRIMINC TR("Expo\0 ""ExFin\0""Fin\0 ""Moyen\0""Gros\0 ","Exponentiel""Extra Fin\0 ""Fin\0 ""Moyen\0 ""Grossier\0 ") @@ -784,6 +822,12 @@ #define TR_MENUSTAT TR("STATS", "STATISTIQUES") #define TR_MENUDEBUG "DEBUG" #define TR_RXNUM TR(INDENT "NumRx", INDENT "No. récepteur") +#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_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER INDENT "Low power mode" #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 65c11566f..7f8bc5994 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europa\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -103,6 +103,44 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE FOR FRSKY use TR_XJT_PROTOCOLS with offset +1 + + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Green\0 ""Blue\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + #define LEN_VTRIMINC "\006" #define TR_VTRIMINC "Exp ""ExFine""Fine ""Medio ""Ampio " @@ -792,6 +830,12 @@ #else #define TR_RXNUM "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_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER 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 b08f7e28f..226484350 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -96,7 +96,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "UIT\0""PPM\0""XJT\0""DSM2""CRSF" +#define TR_TARANIS_PROTOCOLS "UIT\0""PPM\0""XJT\0""DSM2""CRSF""MULT" #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -104,6 +104,44 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE FOR FRSKY use TR_XJT_PROTOCOLS with offset +1 + + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Green\0 ""Blue\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + #define LEN_VTRIMINC TR("\006", "\014") #define TR_VTRIMINC TR("Expo\0 ""ExFijn""Fijn\0 ""Medium""Grof\0 ", "Exponentieel""Extra Fijn\0 ""Fijn\0 ""Medium\0 ""Grof\0 ") @@ -806,6 +844,12 @@ #else #define TR_RXNUM "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_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER 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/pt.h.txt b/radio/src/translations/pt.h.txt index 3b3bd29c9..bd9d175d4 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europe\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" @@ -103,6 +103,44 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE FOR FRSKY use TR_XJT_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Green\0 ""Blue\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + + #define LEN_VTRIMINC "\006" #define TR_VTRIMINC "Expo ""ExFino""Fino ""Medio ""Largo " @@ -544,7 +582,7 @@ #define OFS_EXIT sizeof(TR_ENTER) #endif -#define TR_MENUWHENDONE CENTER"\006"TR_ENTER"QDO PRONTO" +#define TR_MENUWHENDONE CENTER"\006" TR_ENTER "QDO PRONTO" #define TR_FREE "Livre" #define TR_DELETEMODEL "EXCLUI MODELO" #define TR_COPYINGMODEL "Copiando modelo" @@ -749,6 +787,12 @@ #define TR_MENUDEBUG "DEPURAR" #define TR_RXNUM "RxNum" #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_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER 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 54cde89ab..ced3069c4 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF" +#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF""MULT" #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "Av\0 ""D16\0""D8\0 ""LR12" @@ -103,6 +103,43 @@ #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" +#define LEN_MULTI_PROTOCOLS "\006" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""Custom" + +#define LEN_SUBTYPE_FLYSKY "\004" +#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" + +// SUBTYPE FOR FRSKY use TR_XJT_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_HISKY "\005" +#define TR_SUBTYPE_HISKY "HiSky""HK310" + +// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 + +#define LEN_SUBTYPE_YD717 "\007" +#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " + +#define LEN_SUBTYPE_SYMAX "\003" +#define TR_SUBTYPE_SYMAX "Std""5c\0" + +#define LEN_SUBTYPE_CX10 "\007" +#define TR_SUBTYPE_CX10 "Green\0 ""Blue\0 ""DM007\0 ""Q282\0 ""JC3015a""JC3015b""MK33041""Q242\0 " + +#define LEN_SUBTYPE_CG023 "\005" +#define TR_SUBTYPE_CG023 "CG023""YD829""H3 3d" + +#define LEN_SUBTYPE_KN "\006" +#define TR_SUBTYPE_KN "WLtoys""FeiLun" + +#define LEN_SUBTYPE_MT99 "\004" +#define TR_SUBTYPE_MT99 "MT99""H7\0 ""YZ\0 " + +#define LEN_SUBTYPE_MJXQ "\005" +#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D" + +#define LEN_OPTIONS_DSM "\011" +#define TR_OPTIONS_DSM " 4ch 22ms"" 5ch 22ms"" 6ch 22ms"" 7ch 22ms"" 4ch 11ms"" 5ch 11ms"" 6ch 11ms"" 7ch 11ms"" 8ch 22ms"" 9ch 22ms""10ch 22ms""11ch 22ms""12ch 22ms" + #define LEN_VTRIMINC TR("\006","\014") #define TR_VTRIMINC TR("Expo\0 ""xFin\0 ""Fin\0 ""Medium""Grov\0 ","Exponentiell""Extra Fin\0 ""Fin\0 ""Medium\0 ""Grov\0 ") @@ -806,6 +843,12 @@ #define TR_RXNUM "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_AUTOBIND INDENT "Autobind" +#define TR_MULTI_LOWPOWER INDENT "Low power mode" #define TR_LIMIT INDENT "Nivå" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Breddgrad"