From c788ad6add9e7fa664d86ac39e50f39aaacad4b6 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 21 Mar 2016 02:23:11 +0100 Subject: [PATCH 01/10] Move ppm related options into own struct This allows to have the ppm related options in a union with a other module protocol specific options for the multi module. --- radio/src/datastructs.h | 10 ++++++---- radio/src/gui/9x/menu_model_setup.cpp | 12 ++++++------ radio/src/gui/horus/menu_model_setup.cpp | 12 ++++++------ radio/src/gui/taranis/menu_model_setup.cpp | 12 ++++++------ radio/src/myeeprom.h | 2 +- radio/src/pulses/ppm_arm.cpp | 14 +++++++------- radio/src/storage/datacopy.cpp | 16 +++++++++++----- radio/src/storage/eeprom_conversions.cpp | 6 +++--- radio/src/targets/sky9x/pulses_driver.cpp | 14 +++++++------- 9 files changed, 53 insertions(+), 45 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index c431ee37a..16205d537 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -689,10 +689,12 @@ PACK(struct ModuleData { uint8_t failsafeMode:7; 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; + struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm; }); /* 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..06bbf04a6 100644 --- a/radio/src/gui/taranis/menu_model_setup.cpp +++ b/radio/src/gui/taranis/menu_model_setup.cpp @@ -737,21 +737,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; } } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index bf33d30d8..29c989610 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) 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; ifailsafeMode = 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 From 119e413a6d072f5fc4efa44b3579688c11ce8250 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 16 Feb 2016 00:07:58 +0100 Subject: [PATCH 02/10] Multi module support for Taranis Reuse some of the DSM2 routines to avoid code duplication. This first version only implements the protocol on the Taranis. (and not Telemetry code is currently untested and will not work (Polarity mismatch). The main protocols to use telemetry are FrSky protocols and not a high priority on the Taranis. Patch v3: Fix myeeprom.h, include option value in menu. Patch v4: Fix identing, name substructs of modeldata --- radio/src/CMakeLists.txt | 5 + radio/src/datastructs.h | 23 ++- radio/src/gui/taranis/menu_model_setup.cpp | 122 +++++++++++++-- radio/src/myeeprom.h | 31 +++- radio/src/opentx.h | 7 +- radio/src/pulses/multi_arm.cpp | 162 ++++++++++++++++++++ radio/src/pulses/pulses.h | 10 ++ radio/src/pulses/pulses_arm.cpp | 20 +++ radio/src/pulses/pulses_arm.h | 4 + radio/src/targets/taranis/pulses_driver.cpp | 10 +- radio/src/translations.cpp | 19 ++- radio/src/translations.h | 31 ++++ radio/src/translations/en.h.txt | 40 ++++- 13 files changed, 458 insertions(+), 26 deletions(-) create mode 100644 radio/src/pulses/multi_arm.cpp diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 548c7f21d..e54fb70db 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 16205d537..dc11fbb6e 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -686,15 +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]; - struct { - int8_t delay:6; - uint8_t pulsePol:1; - uint8_t outputType:1; // false = open drain, true = push pull - int8_t frameLength; - } ppm; + union { + struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm; + 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/taranis/menu_model_setup.cpp b/radio/src/gui/taranis/menu_model_setup.cpp index 06bbf04a6..501be83ca 100644 --- a/radio/src/gui/taranis/menu_model_setup.cpp +++ b/radio/src/gui/taranis/menu_model_setup.cpp @@ -188,12 +188,26 @@ 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) +#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) 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 +#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 @@ -225,9 +239,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 +255,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), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); #endif MENU_CHECK(STR_MENUSETUP, menuTabModel, e_ModelSetup, ITEM_MODEL_SETUP_MAX); @@ -665,6 +679,46 @@ 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)) { + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, menuHorizontalPosition==1 ? attr : 0); + switch(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol) { + 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; + } + } +#endif if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: @@ -678,12 +732,45 @@ 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 (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol) { + 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; + } + break; +#endif } } break; @@ -767,11 +854,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,6 +916,21 @@ 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, TR_MULTI_RFTUNE); + break; + case MM_RF_PROTO_HUBSAN: + lcd_putsLeft(y, TR_MULTI_VIDFREQ); + break; + } + 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; } } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 29c989610..a23623f76 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -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,29 @@ 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_LAST= MM_RF_PROTO_SHENQI +}; + #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 +528,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..26221a483 --- /dev/null +++ b/radio/src/pulses/multi_arm.cpp @@ -0,0 +1,162 @@ +/* + * 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 BITLEN_MULTI (10*2) //100000 Baud => 10uS per bit + +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 +} + +// 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 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; + } + + protoByte |= (type & 0x1f); + sendByteMulti(protoByte); + + + // power always set to high (0 << 7) + sendByteMulti((g_model.header.modelId[port] & 0x0f) + | (0 << 7) | ((subtype & 0x7) << 4)); + + + //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/pulses.h b/radio/src/pulses/pulses.h index 6895b199b..04b466157 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -68,6 +68,16 @@ enum ModuleFlag #define IS_DSM2_SERIAL_PROTOCOL(protocol) (0) #endif +#if defined(MULTIMODULE) + #define IS_MULTIMODULE_PROTOCOL(protocol) (protocol==PROTO_MULTIMODULE) + #if !defined(DSM2) + #error You need to enable DSM2 = PPM for MULTIMODULE support + #endif +#else + #define IS_MULTIMODULE_PROTOCOL(protocol) (0) +#endif + + #if defined(CPUARM) #include "pulses_arm.h" #else diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index 626e57290..0354e180d 100644 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -64,6 +64,11 @@ void setupPulses(unsigned int port) case MODULE_TYPE_XJT: required_protocol = PROTO_PXX; break; +#if defined(MULTIMODULE) + case MODULE_TYPE_MULTIMODULE: + required_protocol = PROTO_MULTIMODULE; + break; +#endif #if defined(PCBTARANIS) && defined(DSM2) case MODULE_TYPE_DSM2: required_protocol = limit(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..747f11b77 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -88,11 +88,15 @@ 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 createCrossfireFrame(uint8_t * frame, int16_t * pulses); 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..68d169cff 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -107,6 +107,18 @@ 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) +#endif ISTR(VOLTSRC) ISTR(CURVE_TYPES) ISTR(VSENSORTYPES) @@ -435,6 +447,11 @@ 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; +#endif + const pm_char STR_RESET_BTN[] PROGMEM = TR_RESET_BTN; #if defined(SDCARD) @@ -715,5 +732,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..b5c421a11 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -189,7 +189,21 @@ 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)) +#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_VOLTSRC (OFS_SUBTYPE_MJXQ + sizeof(TR_SUBTYPE_MJXQ)) +#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,6 +318,18 @@ 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) +#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) +#endif #define STR_CURVE_TYPES (STR_OPEN9X + OFS_CURVE_TYPES) #define STR_VSENSORTYPES (STR_OPEN9X + OFS_VSENSORTYPES) #define STR_VFORMULAS (STR_OPEN9X + OFS_VFORMULAS) @@ -530,6 +556,11 @@ extern const pm_char STR_GF[]; extern const pm_char STR_FAS_OFFSET[]; #endif +#if defined(MULTIMODULE) +extern const pm_char STR_MULTI_OPT[]; +#endif +extern const pm_char STR_MULTI_VIDFREQ[]; +extern const pm_char STR_MULTI_RFTUNE[]; #if defined(DSM2) || defined(PXX) extern const pm_char STR_RXNUM[]; #endif diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 62f4fe04f..3bb41759f 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,41 @@ #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" + +#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_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 +827,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 +842,8 @@ #else #define TR_RXNUM "RxNum" #endif +#define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" +#define TR_MULTI_VIDFREQ INDENT "Video frequency" #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limit" #define TR_MINRSSI "Min Rssi" From 9de6e09c0933913dd85224771f58f2f83c672853 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 8 Mar 2016 00:38:12 +0100 Subject: [PATCH 03/10] Implement autobind and low power setting and specifying a custom protocol for the multi module Specifying a custom prtocol is useful if OpenTX firmware is older than the multi module firmware and the protocol in question is not yet in the protocol list of the OpenTX firmware. --- radio/src/gui/taranis/menu_model_setup.cpp | 69 ++++++++++++++++------ radio/src/myeeprom.h | 3 +- radio/src/pulses/multi_arm.cpp | 13 +++- radio/src/translations.cpp | 7 ++- radio/src/translations.h | 16 ++--- radio/src/translations/en.h.txt | 5 +- 6 files changed, 81 insertions(+), 32 deletions(-) diff --git a/radio/src/gui/taranis/menu_model_setup.cpp b/radio/src/gui/taranis/menu_model_setup.cpp index 501be83ca..7e10819f8 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, @@ -192,7 +196,7 @@ int getSwitchWarningsCount() #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())) #if defined MULTIMODULE -#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2) +#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 @@ -200,11 +204,13 @@ int getSwitchWarningsCount() #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 #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) MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t)2 : (uint8_t)1 + +#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 @@ -225,6 +231,7 @@ int getSwitchWarningsCount() #define TOPLCD_ROWS #endif + void menuModelSetup(uint8_t event) { horzpos_t l_posHorz = menuHorizontalPosition; @@ -256,7 +263,7 @@ void menuModelSetup(uint8_t event) EXTERNAL_MODULE_MODE_ROWS, EXTERNAL_MODULE_CHANNELS_ROWS, (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), + 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); @@ -681,8 +688,10 @@ void menuModelSetup(uint8_t event) 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)) { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, menuHorizontalPosition==1 ? attr : 0); - switch(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol) { + 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; @@ -716,6 +725,10 @@ void menuModelSetup(uint8_t event) 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 @@ -746,7 +759,7 @@ void menuModelSetup(uint8_t event) break; #if defined(MULTIMODULE) case 2: - switch (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol) { + 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: @@ -768,8 +781,15 @@ void menuModelSetup(uint8_t event) 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 } } @@ -918,21 +938,34 @@ 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, TR_MULTI_RFTUNE); - break; - case MM_RF_PROTO_HUBSAN: - lcd_putsLeft(y, TR_MULTI_VIDFREQ); - break; - } - 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); + 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; + default: + lcd_putsLeft(y, STR_MULTI_OPTION); + break; + } + 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 a23623f76..3f1143d4a 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -507,7 +507,8 @@ enum MultiModuleRFProtocols { MM_RF_PROTO_MT99XX, MM_RF_PROTO_MJXQ, MM_RF_PROTO_SHENQI, - MM_RF_PROTO_LAST= MM_RF_PROTO_SHENQI + MM_RF_PROTO_CUSTOM, + MM_RF_PROTO_LAST= MM_RF_PROTO_CUSTOM }; #define HAS_RF_PROTOCOL_FAILSAFE(rf) ((rf) == RF_PROTO_X16) diff --git a/radio/src/pulses/multi_arm.cpp b/radio/src/pulses/multi_arm.cpp index 26221a483..47eb44687 100644 --- a/radio/src/pulses/multi_arm.cpp +++ b/radio/src/pulses/multi_arm.cpp @@ -30,6 +30,7 @@ #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 @@ -114,7 +115,7 @@ void setupPulsesMultimodule(unsigned int port) protoByte |= MULTI_SEND_RANGECHECK; // rfProtocol - // 15 is FrskyX or D16 which we map as a subprotocol of 3 (FrSky) + // 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; @@ -127,13 +128,19 @@ void setupPulsesMultimodule(unsigned int port) subtype = 0; } - protoByte |= (type & 0x1f); + 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) - | (0 << 7) | ((subtype & 0x7) << 4)); + | ((subtype & 0x7) << 4) + | (g_model.moduleData[port].multi.lowPowerMode << 7) + ); + //TODO: option_protocol, use same default as multi module diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 68d169cff..3467653b8 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -448,8 +448,11 @@ 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_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; #endif const pm_char STR_RESET_BTN[] PROGMEM = TR_RESET_BTN; diff --git a/radio/src/translations.h b/radio/src/translations.h index b5c421a11..0eadda25c 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -554,16 +554,18 @@ extern const pm_char STR_GF[]; #if defined(FAS_OFFSET) || !defined(CPUM64) extern const pm_char STR_FAS_OFFSET[]; -#endif - -#if defined(MULTIMODULE) -extern const pm_char STR_MULTI_OPT[]; #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[]; -#if defined(DSM2) || defined(PXX) -extern const pm_char STR_RXNUM[]; -#endif +extern const pm_char STR_MULTI_AUTOBIND[]; +extern const pm_char STR_MULTI_LOWPOWER[]; +#endif +#if defined(DSM2) || defined(PXX) +extern const pm_char STR_RXNUM[]; +#endif #if defined(PXX) || defined(CPUARM) extern const pm_char STR_SYNCMENU[]; diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 3bb41759f..eb5bdff5a 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -104,7 +104,7 @@ #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" +#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""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -844,6 +844,9 @@ #endif #define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" #define TR_MULTI_VIDFREQ INDENT "Video frequency" +#define TR_MULTI_OPTION INDENT "Option value" +#define TR_MULTI_AUTOBIND INDENT "Autobind on power up" +#define TR_MULTI_LOWPOWER INDENT "Low power mode" #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limit" #define TR_MINRSSI "Min Rssi" From f86dc6b156f62e5afebe815e190c3c5ad09cc4fc Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 15 Mar 2016 18:36:10 +0100 Subject: [PATCH 04/10] Implement DSM2/DSMX frame format options --- radio/src/gui/taranis/menu_model_setup.cpp | 11 +++++++---- radio/src/translations.cpp | 2 ++ radio/src/translations.h | 13 ++++++++----- radio/src/translations/en.h.txt | 6 +++++- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/radio/src/gui/taranis/menu_model_setup.cpp b/radio/src/gui/taranis/menu_model_setup.cpp index 7e10819f8..b06844a9c 100644 --- a/radio/src/gui/taranis/menu_model_setup.cpp +++ b/radio/src/gui/taranis/menu_model_setup.cpp @@ -945,13 +945,17 @@ void menuModelSetup(uint8_t event) 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; } - 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); + 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 @@ -961,7 +965,6 @@ void menuModelSetup(uint8_t event) 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; diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 3467653b8..391487fd2 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -118,6 +118,7 @@ const pm_char STR_OPEN9X[] PROGMEM = ISTR(SUBTYPE_KN) ISTR(SUBTYPE_MT99) ISTR(SUBTYPE_MJXQ) + ISTR(OPTIONS_DSM) #endif ISTR(VOLTSRC) ISTR(CURVE_TYPES) @@ -453,6 +454,7 @@ 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; diff --git a/radio/src/translations.h b/radio/src/translations.h index 0eadda25c..604f0da30 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -200,9 +200,10 @@ extern const pm_char STR_OPEN9X[]; #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_VOLTSRC (OFS_SUBTYPE_MJXQ + sizeof(TR_SUBTYPE_MJXQ)) + #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)) + #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)) @@ -329,9 +330,10 @@ extern const pm_char STR_OPEN9X[]; #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_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) @@ -562,6 +564,7 @@ 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[]; @@ -1001,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/en.h.txt b/radio/src/translations/en.h.txt index eb5bdff5a..1084b5a41 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -138,6 +138,9 @@ #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 ") @@ -844,8 +847,9 @@ #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 on power up" +#define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_LOWPOWER INDENT "Low power mode" #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limit" From 99c7e3f0ad29398d417a96aa4058891e26cfaf38 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 21 Mar 2016 23:26:55 +0100 Subject: [PATCH 05/10] Add FY326 protocol --- radio/src/myeeprom.h | 1 + radio/src/translations/en.h.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 3f1143d4a..44e106d01 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -507,6 +507,7 @@ enum MultiModuleRFProtocols { 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 }; diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 1084b5a41..ed32affb9 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -104,7 +104,7 @@ #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""Custom" +#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" From 0dc2f60e0903a35825b9f086f8214adf10293fb9 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 21 Mar 2016 23:51:45 +0100 Subject: [PATCH 06/10] Add german translations for multi module (Also fix C++11 suffix error when compiling on OS X/clang) --- radio/src/translations/de.h.txt | 58 +++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 30c5c5e87..dc6f304a7 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" @@ -706,16 +743,17 @@ #define TR_CAL "Kal." #define TR_VTRIM "Trim - +" #define TR_BG "BG:" +<<<<<<< HEAD #if defined(PCBHORUS) #define TR_MENUTOSTART "Press [Enter] to start" #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" +#if defined(COLORLCD) + #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 +835,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:" From 96c64f2895747b6aa0e62e182bd8c82d3092f2ea Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 21 Mar 2016 23:51:45 +0100 Subject: [PATCH 07/10] Add german translations for multi module (Also fix C++11 suffix error when compiling on OS X/clang) --- radio/src/translations/de.h.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index dc6f304a7..cd1ad18e1 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -743,12 +743,11 @@ #define TR_CAL "Kal." #define TR_VTRIM "Trim - +" #define TR_BG "BG:" -<<<<<<< HEAD #if defined(PCBHORUS) #define TR_MENUTOSTART "Press [Enter] to start" #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" -#if defined(COLORLCD) +#elif defined(COLORLCD) #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" From 5d19adb1eb9c2dda61bf5433fbf89089180b96aa Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 22 Mar 2016 00:28:53 +0100 Subject: [PATCH 08/10] Copy strings for multimode support from en.h.txt to other languages --- radio/src/translations/cz.h.txt | 46 ++++++++++++++++++++++++++++++- radio/src/translations/es.h.txt | 48 +++++++++++++++++++++++++++++++-- radio/src/translations/fi.h.txt | 46 ++++++++++++++++++++++++++++++- radio/src/translations/fr.h.txt | 46 ++++++++++++++++++++++++++++++- radio/src/translations/it.h.txt | 46 ++++++++++++++++++++++++++++++- radio/src/translations/nl.h.txt | 46 ++++++++++++++++++++++++++++++- radio/src/translations/pt.h.txt | 48 +++++++++++++++++++++++++++++++-- radio/src/translations/se.h.txt | 45 ++++++++++++++++++++++++++++++- 8 files changed, 361 insertions(+), 10 deletions(-) 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/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" From c09c3e0a2b75aa88dfe05a5d5a0bca56bfd8123e Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 25 Mar 2016 14:09:17 +0100 Subject: [PATCH 09/10] Do not backup the multi module struct --- radio/src/datastructs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index dc11fbb6e..2cceb362f 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -697,12 +697,12 @@ PACK(struct ModuleData { uint8_t outputType:1; // false = open drain, true = push pull int8_t frameLength; } ppm; - struct { + 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; + } multi); }; }); From 2ad644d793137f9c09769db7fdd10176daab85f3 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 28 Mar 2016 00:19:31 +0200 Subject: [PATCH 10/10] Add horus support for multi pulses (untested, following DSM2) --- radio/src/pulses/multi_arm.cpp | 19 ++++++++++++++++++- radio/src/pulses/pulses_arm.h | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/radio/src/pulses/multi_arm.cpp b/radio/src/pulses/multi_arm.cpp index 47eb44687..841e758a9 100644 --- a/radio/src/pulses/multi_arm.cpp +++ b/radio/src/pulses/multi_arm.cpp @@ -35,6 +35,23 @@ #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 @@ -49,7 +66,6 @@ static void _send_level(uint8_t v) 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; @@ -73,6 +89,7 @@ static void sendByteMulti(uint8_t b) //max 11 changes 0 10 10 10 10 P 1 } _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 diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 747f11b77..eb4f35289 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -97,6 +97,7 @@ 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);