diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml
index ef89abcd6e..f524b94556 100644
--- a/.github/workflows/actions.yml
+++ b/.github/workflows/actions.yml
@@ -52,6 +52,7 @@ jobs:
- t18
- t8
- tlite
+ - t20
- tx12
- tx16s
- x10
@@ -97,6 +98,7 @@ jobs:
- t18
- t8;zorro;commando8
- tlite;tlitef4;tpro;tprov2;lr3pro
+ - t20
- tx12;tx12mk2;boxer
- tx16s
- x10;x10-access
diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt
index c1b4f4c3fe..6f97b8e911 100644
--- a/companion/src/CMakeLists.txt
+++ b/companion/src/CMakeLists.txt
@@ -320,6 +320,8 @@ elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TLITEF4)
set(FLAVOUR tlitef4)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TPRO)
set(FLAVOUR tpro)
+elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T20)
+ set(FLAVOUR t20)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12)
set(FLAVOUR tx12)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12MK2)
diff --git a/companion/src/modeledit/setup_function_switches.ui b/companion/src/modeledit/setup_function_switches.ui
index 3e272ce274..d5c7889385 100644
--- a/companion/src/modeledit/setup_function_switches.ui
+++ b/companion/src/modeledit/setup_function_switches.ui
@@ -44,7 +44,7 @@
- Function Switches
+ Customizable Switches
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp
index cdbc807e11..185b5943ac 100644
--- a/companion/src/multimodelprinter.cpp
+++ b/companion/src/multimodelprinter.cpp
@@ -965,7 +965,7 @@ QString MultiModelPrinter::printFunctionSwitches()
int numFS = Boards::getCapability(firmware->getBoard(), Board::FunctionSwitches);
int colwidth = 80 / numFS;
- QStringList headings = { tr("Function Switches") };
+ QStringList headings = { tr("Customizable Switches") };
for (int i = 0; i < numFS; i++) {
headings << tr("Switch %1").arg(i + 1);
}
diff --git a/companion/src/translations/companion_cs.ts b/companion/src/translations/companion_cs.ts
index f179bf3fba..e67c871b88 100644
--- a/companion/src/translations/companion_cs.ts
+++ b/companion/src/translations/companion_cs.ts
@@ -4617,8 +4617,8 @@ Nyní používáte:
- Function Switches
-
+ Customizable Switches
+ Nastavitelné přepínače
@@ -10492,8 +10492,8 @@ p, li { white-space: pre-wrap; }
- Function Switches
-
+ Customizable Switches
+ Nastavitelné přepínače
diff --git a/companion/src/translations/companion_da.ts b/companion/src/translations/companion_da.ts
index 05cbd02391..d126034b88 100644
--- a/companion/src/translations/companion_da.ts
+++ b/companion/src/translations/companion_da.ts
@@ -3646,8 +3646,8 @@ Du anvender aktuelt:
Formular
- Function Switches
- Funktion kontakt
+ Customizable Switches
+ Kontakter der kan tilpasses
Type
@@ -8503,8 +8503,8 @@ p, li { white-space: pre-wrap; }
Start
- Function Switches
- Funktion kontakt
+ Customizable Switches
+ Kontakter der kan tilpasses
Switch %1
diff --git a/companion/src/translations/companion_de.ts b/companion/src/translations/companion_de.ts
index 2cf817b0f8..147c91dce4 100644
--- a/companion/src/translations/companion_de.ts
+++ b/companion/src/translations/companion_de.ts
@@ -4600,8 +4600,8 @@ Sie verwenden gerade:
- Function Switches
-
+ Customizable Switches
+ Anpassbare Schalter
@@ -10471,8 +10471,8 @@ If blank then the mix is considered to be "ON" all the time.
- Function Switches
-
+ Customizable Switches
+ Anpassbare Schalter
diff --git a/companion/src/translations/companion_en.ts b/companion/src/translations/companion_en.ts
index 7a1a4012bb..f69624c826 100644
--- a/companion/src/translations/companion_en.ts
+++ b/companion/src/translations/companion_en.ts
@@ -4564,7 +4564,7 @@ You are currently using:
- Function Switches
+ Customizable Switches
@@ -10368,7 +10368,7 @@ If blank then the mix is considered to be "ON" all the time.
- Function Switches
+ Customizable Switches
diff --git a/companion/src/translations/companion_es.ts b/companion/src/translations/companion_es.ts
index 658695c07c..73958dde14 100644
--- a/companion/src/translations/companion_es.ts
+++ b/companion/src/translations/companion_es.ts
@@ -4613,7 +4613,7 @@ Actualmente estás usando:
- Function Switches
+ Customizable Switches
@@ -10564,7 +10564,7 @@ Esto determina cómo los valores de mezcla son añadidos.
- Function Switches
+ Customizable Switches
diff --git a/companion/src/translations/companion_fi.ts b/companion/src/translations/companion_fi.ts
index 269ab40468..010edc2e66 100644
--- a/companion/src/translations/companion_fi.ts
+++ b/companion/src/translations/companion_fi.ts
@@ -4598,7 +4598,7 @@ Käytät nyt:
- Function Switches
+ Customizable Switches
@@ -10512,7 +10512,7 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan.
- Function Switches
+ Customizable Switches
diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts
index 9ca06fefbc..dfb2d40064 100644
--- a/companion/src/translations/companion_fr.ts
+++ b/companion/src/translations/companion_fr.ts
@@ -4612,8 +4612,8 @@ Vous utilisez actuellement:
- Function Switches
-
+ Customizable Switches
+ Inters paramétrables
@@ -10717,8 +10717,8 @@ Mixage actif par défaut si non-renseigné.
- Function Switches
-
+ Customizable Switches
+ Inters paramétrables
diff --git a/companion/src/translations/companion_he.ts b/companion/src/translations/companion_he.ts
index 6c8a914259..db5808bf38 100644
--- a/companion/src/translations/companion_he.ts
+++ b/companion/src/translations/companion_he.ts
@@ -4564,8 +4564,8 @@ You are currently using:
- Function Switches
-
+ Customizable Switches
+ מפסקים בהתאמה אישית
@@ -10548,8 +10548,8 @@ This determines how mixer values are added.
- Function Switches
-
+ Customizable Switches
+ מפסקים בהתאמה אישית
diff --git a/companion/src/translations/companion_it.ts b/companion/src/translations/companion_it.ts
index d2857624e5..de8589486f 100644
--- a/companion/src/translations/companion_it.ts
+++ b/companion/src/translations/companion_it.ts
@@ -4598,8 +4598,8 @@ state attualmente utilizzando:
- Function Switches
-
+ Customizable Switches
+ Interruttori personalizzabili
@@ -10517,8 +10517,8 @@ Determina come il valore viene aggiunto alla miscelazione.
- Function Switches
-
+ Customizable Switches
+ Interruttori personalizzabili
diff --git a/companion/src/translations/companion_ja.ts b/companion/src/translations/companion_ja.ts
index efb3ce3292..45903a896d 100644
--- a/companion/src/translations/companion_ja.ts
+++ b/companion/src/translations/companion_ja.ts
@@ -4597,7 +4597,7 @@ You are currently using:
- Function Switches
+ Customizable Switches
@@ -10709,7 +10709,7 @@ If blank then the mix is considered to be "ON" all the time.
- Function Switches
+ Customizable Switches
diff --git a/companion/src/translations/companion_nl.ts b/companion/src/translations/companion_nl.ts
index 7ea689ba29..01429e0fa0 100644
--- a/companion/src/translations/companion_nl.ts
+++ b/companion/src/translations/companion_nl.ts
@@ -4564,7 +4564,7 @@ You are currently using:
- Function Switches
+ Customizable Switches
@@ -10546,7 +10546,7 @@ If blank then the mix is considered to be "ON" all the time.
- Function Switches
+ Customizable Switches
diff --git a/companion/src/translations/companion_pl.ts b/companion/src/translations/companion_pl.ts
index 27d2cba96d..dfb56fc76e 100644
--- a/companion/src/translations/companion_pl.ts
+++ b/companion/src/translations/companion_pl.ts
@@ -4585,8 +4585,8 @@ Aktualnie używasz:
- Function Switches
-
+ Customizable Switches
+ Ustawiane przełączniki
@@ -10510,8 +10510,8 @@ p, li { white-space: pre-wrap; }
- Function Switches
-
+ Customizable Switches
+ Ustawiane przełączniki
diff --git a/companion/src/translations/companion_pt.ts b/companion/src/translations/companion_pt.ts
index 00447e0a86..3b33fe6a24 100644
--- a/companion/src/translations/companion_pt.ts
+++ b/companion/src/translations/companion_pt.ts
@@ -4564,7 +4564,7 @@ You are currently using:
- Function Switches
+ Customizable Switches
@@ -10548,7 +10548,7 @@ This determines how mixer values are added.
- Function Switches
+ Customizable Switches
diff --git a/companion/src/translations/companion_ru.ts b/companion/src/translations/companion_ru.ts
index 251181620b..579eb09219 100644
--- a/companion/src/translations/companion_ru.ts
+++ b/companion/src/translations/companion_ru.ts
@@ -4596,7 +4596,7 @@ You are currently using:
- Function Switches
+ Customizable Switches
@@ -10478,7 +10478,7 @@ This determines how mixer values are added.
- Function Switches
+ Customizable Switches
diff --git a/companion/src/translations/companion_sv.ts b/companion/src/translations/companion_sv.ts
index 8be9cdf213..f254cc45f2 100644
--- a/companion/src/translations/companion_sv.ts
+++ b/companion/src/translations/companion_sv.ts
@@ -3646,8 +3646,8 @@ Du använder för närvarande:
Formulär
- Function Switches
- Funktionsbrytare
+ Customizable Switches
+ Anpassningsbara brytare
Type
@@ -8504,8 +8504,8 @@ p, li { white-space: pre-wrap; }
Start
- Function Switches
- Funktionsbrytare
+ Customizable Switches
+ Anpassningsbara brytare
Switch %1
diff --git a/companion/src/translations/companion_zh_CN.ts b/companion/src/translations/companion_zh_CN.ts
index b01f066449..7c1f51f8cb 100644
--- a/companion/src/translations/companion_zh_CN.ts
+++ b/companion/src/translations/companion_zh_CN.ts
@@ -4648,8 +4648,8 @@ You are currently using:
- Function Switches
-
+ Customizable Switches
+ 可自定义开关
@@ -10610,8 +10610,8 @@ If blank then the mix is considered to be "ON" all the time.
- Function Switches
-
+ Customizable Switches
+ 可自定义开关
diff --git a/companion/src/translations/companion_zh_TW.ts b/companion/src/translations/companion_zh_TW.ts
index c894d7f3d6..31516bb8d5 100644
--- a/companion/src/translations/companion_zh_TW.ts
+++ b/companion/src/translations/companion_zh_TW.ts
@@ -4648,8 +4648,8 @@ You are currently using:
- Function Switches
-
+ Customizable Switches
+ 可自定義開關
@@ -10610,8 +10610,8 @@ If blank then the mix is considered to be "ON" all the time.
- Function Switches
-
+ Customizable Switches
+ 可自定義開關
diff --git a/fw.json b/fw.json
index 8508f0c35c..4c0f54567e 100644
--- a/fw.json
+++ b/fw.json
@@ -25,6 +25,7 @@
["Jumper T-Lite (F4 MCU)", "tlitef4-"],
["Jumper T-Pro", "tpro-"],
["Jumper T-Pro V2", "tprov2-"],
+ ["Jumper T20", "t20-"],
["RadioMaster T8", "t8-"],
["RadioMaster TX12", "tx12-"],
["RadioMaster Boxer", "boxer-"],
diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h
index e52776e813..08ea06e26d 100644
--- a/radio/src/dataconstants.h
+++ b/radio/src/dataconstants.h
@@ -405,7 +405,11 @@ enum PotsWarnMode {
#define MAX_CALIB_ANALOG_INPUTS (MAX_STICKS + MAX_POTS + MAX_AXIS)
#define MAX_SWITCHES 20
+#if defined(RADIO_T20)
+#define MAX_TRIMS 8
+#else
#define MAX_TRIMS 6
+#endif
#define MAX_XPOTS_POSITIONS (MAX_POTS * XPOTS_MULTIPOS_COUNT)
diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h
index c3c8cd73a6..3ff6089b8d 100644
--- a/radio/src/datastructs.h
+++ b/radio/src/datastructs.h
@@ -128,6 +128,9 @@ static inline void check_struct()
#elif defined(RADIO_TPROV2)
CHKSIZE(RadioData, 859);
CHKSIZE(ModelData, 6290);
+#elif defined(RADIO_T20)
+ CHKSIZE(RadioData, 859);
+ CHKSIZE(ModelData, 6326);
#elif defined(RADIO_BOXER)
CHKSIZE(RadioData, 870);
CHKSIZE(ModelData, 6265);
diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp
index 398dbf5e19..3e64f0bb90 100644
--- a/radio/src/gui/128x64/model_flightmodes.cpp
+++ b/radio/src/gui/128x64/model_flightmodes.cpp
@@ -37,7 +37,7 @@ enum MenuModelFlightModeItems {
ITEM_MODEL_FLIGHT_MODE_NAME,
ITEM_MODEL_FLIGHT_MODE_SWITCH,
ITEM_MODEL_FLIGHT_MODE_TRIMS,
-#if defined(TRIMS_GPIO_REG_T5L)
+#if defined(TRIMS_GPIO_REG_T5L) || defined(TRIMS_GPIO_REG_LSD)
ITEM_MODEL_FLIGHT_MODE_TRIMS2,
#endif
ITEM_MODEL_FLIGHT_MODE_FADE_IN,
@@ -71,7 +71,7 @@ void menuModelFlightModeOne(event_t event)
#if defined(GVARS) && !defined(GVARS_IN_CURVES_SCREEN)
-#if defined(TRIMS_GPIO_REG_T5L)
+#if defined(TRIMS_GPIO_REG_T5L) || defined(TRIMS_GPIO_REG_LSD)
#define VERTICAL_SHIFT (ITEM_MODEL_FLIGHT_MODE_FADE_IN-ITEM_MODEL_FLIGHT_MODE_TRIMS2)
static const uint8_t mstate_tab_fm1[] = {0, 3, (uint8_t)(keysGetMaxTrims() - 5), 0, 0, (uint8_t)-1, 1, 1, 1, 1, 1, 1};
#else
@@ -132,7 +132,7 @@ void menuModelFlightModeOne(event_t event)
}
break;
-#if defined(TRIMS_GPIO_REG_T5L)
+#if defined(TRIMS_GPIO_REG_T5L) || defined(TRIMS_GPIO_REG_LSD)
case ITEM_MODEL_FLIGHT_MODE_TRIMS2:
{
auto trims = keysGetMaxTrims() - 4;
diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp
index 6448e14c55..d1fb509534 100644
--- a/radio/src/gui/128x64/model_setup.cpp
+++ b/radio/src/gui/128x64/model_setup.cpp
@@ -230,6 +230,7 @@ PACK(struct ExpandState {
uint8_t preflight:1;
uint8_t throttle:1;
uint8_t viewOpt:1;
+ uint8_t functionSwitches:1;
});
struct ExpandState expandState;
@@ -248,6 +249,13 @@ uint8_t THROTTLE_ROW(uint8_t value)
return HIDDEN_ROW;
}
+uint8_t FS_ROW(uint8_t value)
+{
+ if (expandState.functionSwitches)
+ return value;
+ return HIDDEN_ROW;
+}
+
uint8_t VIEWOPT_ROW(uint8_t value)
{
if (expandState.viewOpt)
@@ -341,7 +349,14 @@ inline uint8_t TIMER_ROW(uint8_t timer, uint8_t value)
#define EXTRA_MODULE_ROWS
#if defined(FUNCTION_SWITCHES)
- #define FUNCTION_SWITCHES_ROWS READONLY_ROW, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|(NUM_FUNCTIONS_SWITCHES-1),
+ #define FUNCTION_SWITCHES_ROWS 1, \
+ FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
+ FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
+ FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
+ FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
+ FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
+ FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
+ FS_ROW(NAVIGATION_LINE_BY_LINE|(NUM_FUNCTIONS_SWITCHES-1)),
#else
#define FUNCTION_SWITCHES_ROWS
#endif
@@ -779,7 +794,7 @@ void menuModelSetup(event_t event)
#if defined(FUNCTION_SWITCHES)
case ITEM_MODEL_SETUP_LABEL:
- lcdDrawTextAlignedLeft(y, "Function Switches");
+ expandState.functionSwitches = expandableSection(y, STR_FUNCTION_SWITCHES, expandState.functionSwitches, attr, event);
break;
case ITEM_MODEL_SETUP_SW1:
@@ -1076,9 +1091,14 @@ void menuModelSetup(event_t event)
(g_model.potsWarnEnabled & (1 << i))) {
flags |= INVERS;
}
-
- lcdDrawText(x, y, getPotLabel(i), flags);
- x = lcdNextPos+3;
+ if (max_pots > 3) {
+ lcdDrawText(x, y, getAnalogShortLabel(adcGetInputOffset(ADC_INPUT_POT) + i), flags);
+ x = lcdNextPos + 1;
+ }
+ else {
+ lcdDrawText(x, y, getPotLabel(i), flags);
+ x = lcdNextPos + 3;
+ }
}
}
}
@@ -1092,7 +1112,7 @@ void menuModelSetup(event_t event)
LcdFlags flags = 0;
if ((menuHorizontalPosition == i) && attr)
flags = BLINK | INVERS;
- else if (ANALOG_CENTER_BEEP(x) || (attr && CURSOR_ON_LINE()))
+ else if (ANALOG_CENTER_BEEP(i) || (attr && CURSOR_ON_LINE()))
flags = INVERS;
lcdDrawText(x, y, getAnalogShortLabel(i), flags);
}
diff --git a/radio/src/gui/128x64/startup_shutdown.cpp b/radio/src/gui/128x64/startup_shutdown.cpp
index c85eebcf17..b93f2d275d 100644
--- a/radio/src/gui/128x64/startup_shutdown.cpp
+++ b/radio/src/gui/128x64/startup_shutdown.cpp
@@ -29,6 +29,12 @@ const unsigned char bmp_sleep[] = {
#include "sleep.lbm"
};
+#if defined(RADIO_T20)
+constexpr uint8_t steps = NUM_FUNCTIONS_SWITCHES/2;
+#elif defined(FUNCTION_SWITCHES)
+constexpr uint8_t steps = NUM_FUNCTIONS_SWITCHES;
+#endif
+
void drawStartupAnimation(uint32_t duration, uint32_t totalDuration)
{
if (totalDuration == 0)
@@ -41,12 +47,16 @@ void drawStartupAnimation(uint32_t duration, uint32_t totalDuration)
#if defined(FUNCTION_SWITCHES)
uint8_t index2 = limit(
- 0, duration / (totalDuration / (NUM_FUNCTIONS_SWITCHES + 1)),
- NUM_FUNCTIONS_SWITCHES);
+ 0, duration / (totalDuration / (steps + 1)),
+ steps);
- for (uint8_t j = 0; j < NUM_FUNCTIONS_SWITCHES; j++) {
- if (index2 > j)
+ for (uint8_t j = 0; j < steps; j++) {
+ if (index2 > j) {
fsLedOn(j);
+#if defined(RADIO_T20)
+ fsLedOn(j + steps);
+#endif
+ }
}
#endif
@@ -72,14 +82,22 @@ void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration,
lcdClear();
#if defined(FUNCTION_SWITCHES)
- uint8_t index2 = limit(
- 0, duration / (totalDuration / (NUM_FUNCTIONS_SWITCHES + 1)),
- NUM_FUNCTIONS_SWITCHES);
- for (uint8_t j = 0; j < NUM_FUNCTIONS_SWITCHES; j++) {
+ uint8_t index2 = limit(
+ 0, duration / (totalDuration / (steps + 1)),
+ steps);
+
+ for (uint8_t j = 0; j < steps; j++) {
fsLedOff(j);
- if (NUM_FUNCTIONS_SWITCHES - index2 > j)
+#if defined(RADIO_T20)
+ fsLedOff(j + steps);
+#endif
+ if (steps - index2 > j) {
fsLedOn(j);
+#if defined(RADIO_T20)
+ fsLedOn(j + steps);
+#endif
+ }
}
#endif
diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp
index 81fce456dd..c085e9c6a2 100644
--- a/radio/src/gui/common/stdlcd/radio_hardware.cpp
+++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp
@@ -485,7 +485,7 @@ void menuRadioHardware(event_t event)
// draw hw name
LcdFlags flags = menuHorizontalPosition < 0 ? attr : 0;
lcdDrawText(INDENT_WIDTH, y, STR_CHAR_POT, flags);
- lcdDrawText(lcdNextPos, y, adcGetInputName(ADC_INPUT_POT, idx), flags);
+ lcdDrawText(lcdNextPos, y, adcGetInputLabel(ADC_INPUT_POT, idx), flags);
// draw custom name
if (analogHasCustomLabel(ADC_INPUT_POT, idx) ||
diff --git a/radio/src/hal/key_driver.h b/radio/src/hal/key_driver.h
index d7a0559026..f0d20baa5f 100644
--- a/radio/src/hal/key_driver.h
+++ b/radio/src/hal/key_driver.h
@@ -50,9 +50,11 @@ enum EnumKeys {
MAX_KEYS
};
-
+#if defined(RADIO_T20)
+#define MAX_TRIMS 8
+#else
#define MAX_TRIMS 6
-
+#endif
// returns a bit field with each key set as (1 << KEY_xxx)
uint32_t readKeys();
diff --git a/radio/src/hal/rotary_encoder.h b/radio/src/hal/rotary_encoder.h
index 5489c86512..b7c4801d8e 100644
--- a/radio/src/hal/rotary_encoder.h
+++ b/radio/src/hal/rotary_encoder.h
@@ -27,7 +27,11 @@
#define ROTENC_MIDSPEED 5
#define ROTENC_HIGHSPEED 50
+#if defined(RADIO_T20)
+#define ROTARY_ENCODER_GRANULARITY 4
+#else
#define ROTARY_ENCODER_GRANULARITY 2
+#endif
typedef int32_t rotenc_t;
diff --git a/radio/src/hal/switch_driver.h b/radio/src/hal/switch_driver.h
index bdb9a5033f..149d01b38f 100644
--- a/radio/src/hal/switch_driver.h
+++ b/radio/src/hal/switch_driver.h
@@ -53,7 +53,7 @@ uint8_t getSwitchCount();
// returns the highest row for a specified column
uint8_t switchGetMaxRow(uint8_t col);
-// returns the maximum number of function switches supported in hardware
+// returns the maximum number of customizable switches supported in hardware
uint8_t switchGetMaxFctSwitches();
struct switch_display_pos_t {
@@ -63,10 +63,10 @@ struct switch_display_pos_t {
switch_display_pos_t switchGetDisplayPosition(uint8_t idx);
-// The functions bellow support regular as well as function switches.
+// The functions bellow support regular as well as customizable switches.
//
// Regular switches are indexed from `0` to `switchGetMaxSwitches() - 1`
-// Function switches are indexed above the previous range.
+// Customizable switches are indexed above the previous range.
//
// The total number of switches (and max index + 1) is:
// switchGetMaxSwitches() + switchGetMaxFctSwitches()
diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp
index 88cf8b9934..a9def90f9b 100644
--- a/radio/src/opentx.cpp
+++ b/radio/src/opentx.cpp
@@ -903,7 +903,9 @@ void alert(const char * title, const char * msg , uint8_t sound)
}
#if defined(GVARS)
-#if MAX_TRIMS == 6
+#if MAX_TRIMS == 8
+int8_t trimGvar[MAX_TRIMS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
+#elif MAX_TRIMS == 6
int8_t trimGvar[MAX_TRIMS] = { -1, -1, -1, -1, -1, -1 };
#elif MAX_TRIMS == 4
int8_t trimGvar[MAX_TRIMS] = { -1, -1, -1, -1 };
diff --git a/radio/src/opentx.h b/radio/src/opentx.h
index 1037882755..3ee2f0d258 100644
--- a/radio/src/opentx.h
+++ b/radio/src/opentx.h
@@ -300,7 +300,7 @@ void memswap(void * a, void * b, uint8_t size);
#include "pulses/pulses.h"
#include "pulses/modules_helpers.h"
-#define MASK_CFN_TYPE uint64_t // current max = 64 function switches
+#define MASK_CFN_TYPE uint64_t // current max = 64 customizable switches
#define MASK_FUNC_TYPE uint32_t // current max = 32 functions
struct CustomFunctionsContext {
diff --git a/radio/src/stamp.cpp b/radio/src/stamp.cpp
index 9021358200..9ccfdc58d6 100644
--- a/radio/src/stamp.cpp
+++ b/radio/src/stamp.cpp
@@ -46,14 +46,6 @@
#define DISPLAY_VERSION
#endif
-#if defined(RADIO_TLITE)
-#if defined(STM32F407xx)
- #define CPU_NAME "-F4"
-#else
- #define CPU_NAME "-F2"
-#endif
-#endif
-
#if defined(COLORLCD)
const char fw_stamp[] = "FW" TAB ": edgetx-" FLAVOUR;
#if defined(RADIOMASTER_RELEASE) || defined(JUMPER_RELEASE)
diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt
index 41769409ea..b320ff016a 100644
--- a/radio/src/storage/yaml/CMakeLists.txt
+++ b/radio/src/storage/yaml/CMakeLists.txt
@@ -23,6 +23,8 @@ elseif(PCB STREQUAL NV14)
elseif(PCB STREQUAL X7)
if(PCBREV STREQUAL TPRO)
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tpro.cpp)
+ elseif(PCBREV STREQUAL T20)
+ set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_t20.cpp)
else()
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_128x64.cpp)
endif()
diff --git a/radio/src/storage/yaml/yaml_datastructs.cpp b/radio/src/storage/yaml/yaml_datastructs.cpp
index 4b4515dbc6..fe77e7c522 100644
--- a/radio/src/storage/yaml/yaml_datastructs.cpp
+++ b/radio/src/storage/yaml/yaml_datastructs.cpp
@@ -37,6 +37,8 @@
#elif defined(PCBX7)
#if defined(RADIO_TPRO) || defined(RADIO_TPROV2)
#include "yaml_datastructs_tpro.cpp"
+ #elif defined(RADIO_T20)
+ #include "yaml_datastructs_t20.cpp"
#else
#include "yaml_datastructs_128x64.cpp"
#endif
diff --git a/radio/src/storage/yaml/yaml_datastructs_t20.cpp b/radio/src/storage/yaml/yaml_datastructs_t20.cpp
new file mode 100644
index 0000000000..7e8bace608
--- /dev/null
+++ b/radio/src/storage/yaml/yaml_datastructs_t20.cpp
@@ -0,0 +1,870 @@
+// generated by generate_yaml.py
+
+//
+// Enums first
+//
+
+const struct YamlIdStr enum_BacklightMode[] = {
+ { e_backlight_mode_off, "backlight_mode_off" },
+ { e_backlight_mode_keys, "backlight_mode_keys" },
+ { e_backlight_mode_sticks, "backlight_mode_sticks" },
+ { e_backlight_mode_all, "backlight_mode_all" },
+ { e_backlight_mode_on, "backlight_mode_on" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_AntennaModes[] = {
+ { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" },
+ { ANTENNA_MODE_ASK, "MODE_ASK" },
+ { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" },
+ { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_ModuleType[] = {
+ { MODULE_TYPE_NONE, "TYPE_NONE" },
+ { MODULE_TYPE_PPM, "TYPE_PPM" },
+ { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" },
+ { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" },
+ { MODULE_TYPE_DSM2, "TYPE_DSM2" },
+ { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" },
+ { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" },
+ { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" },
+ { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" },
+ { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" },
+ { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" },
+ { MODULE_TYPE_GHOST, "TYPE_GHOST" },
+ { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
+ { MODULE_TYPE_SBUS, "TYPE_SBUS" },
+ { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
+ { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
+ { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_TrainerMultiplex[] = {
+ { TRAINER_OFF, "OFF" },
+ { TRAINER_ADD, "ADD" },
+ { TRAINER_REPL, "REPL" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_BeeperMode[] = {
+ { e_mode_quiet, "mode_quiet" },
+ { e_mode_alarms, "mode_alarms" },
+ { e_mode_nokeys, "mode_nokeys" },
+ { e_mode_all, "mode_all" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_BluetoothModes[] = {
+ { BLUETOOTH_OFF, "OFF" },
+ { BLUETOOTH_TELEMETRY, "TELEMETRY" },
+ { BLUETOOTH_TRAINER, "TRAINER" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_Functions[] = {
+ { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" },
+ { FUNC_TRAINER, "TRAINER" },
+ { FUNC_INSTANT_TRIM, "INSTANT_TRIM" },
+ { FUNC_RESET, "RESET" },
+ { FUNC_SET_TIMER, "SET_TIMER" },
+ { FUNC_ADJUST_GVAR, "ADJUST_GVAR" },
+ { FUNC_VOLUME, "VOLUME" },
+ { FUNC_SET_FAILSAFE, "SET_FAILSAFE" },
+ { FUNC_RANGECHECK, "RANGECHECK" },
+ { FUNC_BIND, "BIND" },
+ { FUNC_PLAY_SOUND, "PLAY_SOUND" },
+ { FUNC_PLAY_TRACK, "PLAY_TRACK" },
+ { FUNC_PLAY_VALUE, "PLAY_VALUE" },
+ { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" },
+ { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" },
+ { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" },
+ { FUNC_VARIO, "VARIO" },
+ { FUNC_HAPTIC, "HAPTIC" },
+ { FUNC_LOGS, "LOGS" },
+ { FUNC_BACKLIGHT, "BACKLIGHT" },
+ { FUNC_SCREENSHOT, "SCREENSHOT" },
+ { FUNC_RACING_MODE, "RACING_MODE" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_TimerModes[] = {
+ { TMRMODE_OFF, "OFF" },
+ { TMRMODE_ON, "ON" },
+ { TMRMODE_START, "START" },
+ { TMRMODE_THR, "THR" },
+ { TMRMODE_THR_REL, "THR_REL" },
+ { TMRMODE_THR_START, "THR_START" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_MixerMultiplex[] = {
+ { MLTPX_ADD, "ADD" },
+ { MLTPX_MUL, "MUL" },
+ { MLTPX_REPL, "REPL" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_MixSources[] = {
+ { MIXSRC_NONE, "NONE" },
+ { MIXSRC_MAX, "MAX" },
+ { MIXSRC_TrimRud, "TrimRud" },
+ { MIXSRC_TrimEle, "TrimEle" },
+ { MIXSRC_TrimThr, "TrimThr" },
+ { MIXSRC_TrimAil, "TrimAil" },
+ { MIXSRC_TrimT5, "TrimT5" },
+ { MIXSRC_TrimT6, "TrimT6" },
+ { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" },
+ { MIXSRC_TX_TIME, "TX_TIME" },
+ { MIXSRC_TX_GPS, "TX_GPS" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_LogicalSwitchesFunctions[] = {
+ { LS_FUNC_NONE, "FUNC_NONE" },
+ { LS_FUNC_VEQUAL, "FUNC_VEQUAL" },
+ { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" },
+ { LS_FUNC_VPOS, "FUNC_VPOS" },
+ { LS_FUNC_VNEG, "FUNC_VNEG" },
+ { LS_FUNC_RANGE, "FUNC_RANGE" },
+ { LS_FUNC_APOS, "FUNC_APOS" },
+ { LS_FUNC_ANEG, "FUNC_ANEG" },
+ { LS_FUNC_AND, "FUNC_AND" },
+ { LS_FUNC_OR, "FUNC_OR" },
+ { LS_FUNC_XOR, "FUNC_XOR" },
+ { LS_FUNC_EDGE, "FUNC_EDGE" },
+ { LS_FUNC_EQUAL, "FUNC_EQUAL" },
+ { LS_FUNC_GREATER, "FUNC_GREATER" },
+ { LS_FUNC_LESS, "FUNC_LESS" },
+ { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" },
+ { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" },
+ { LS_FUNC_TIMER, "FUNC_TIMER" },
+ { LS_FUNC_STICKY, "FUNC_STICKY" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_SwashType[] = {
+ { SWASH_TYPE_NONE, "TYPE_NONE" },
+ { SWASH_TYPE_120, "TYPE_120" },
+ { SWASH_TYPE_120X, "TYPE_120X" },
+ { SWASH_TYPE_140, "TYPE_140" },
+ { SWASH_TYPE_90, "TYPE_90" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_SwitchSources[] = {
+ { SWSRC_NONE, "NONE" },
+ { SWSRC_ON, "ON" },
+ { SWSRC_ONE, "ONE" },
+ { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
+ { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
+ { SWSRC_OFF, "OFF" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_PotsWarnMode[] = {
+ { POTS_WARN_OFF, "WARN_OFF" },
+ { POTS_WARN_MANUAL, "WARN_MANUAL" },
+ { POTS_WARN_AUTO, "WARN_AUTO" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_ModelOverridableEnable[] = {
+ { OVERRIDE_GLOBAL, "GLOBAL" },
+ { OVERRIDE_OFF, "OFF" },
+ { OVERRIDE_ON, "ON" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_FailsafeModes[] = {
+ { FAILSAFE_NOT_SET, "NOT_SET" },
+ { FAILSAFE_HOLD, "HOLD" },
+ { FAILSAFE_CUSTOM, "CUSTOM" },
+ { FAILSAFE_NOPULSES, "NOPULSES" },
+ { FAILSAFE_RECEIVER, "RECEIVER" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_TelemetrySensorFormula[] = {
+ { TELEM_FORMULA_ADD, "FORMULA_ADD" },
+ { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" },
+ { TELEM_FORMULA_MIN, "FORMULA_MIN" },
+ { TELEM_FORMULA_MAX, "FORMULA_MAX" },
+ { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" },
+ { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" },
+ { TELEM_FORMULA_CELL, "FORMULA_CELL" },
+ { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" },
+ { TELEM_FORMULA_DIST, "FORMULA_DIST" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_TelemetrySensorType[] = {
+ { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" },
+ { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_USBJoystickIfMode[] = {
+ { USBJOYS_JOYSTICK, "JOYSTICK" },
+ { USBJOYS_GAMEPAD, "GAMEPAD" },
+ { USBJOYS_MULTIAXIS, "MULTIAXIS" },
+ { 0, NULL }
+};
+const struct YamlIdStr enum_USBJoystickCh[] = {
+ { USBJOYS_CH_NONE, "CH_NONE" },
+ { USBJOYS_CH_BUTTON, "CH_BUTTON" },
+ { USBJOYS_CH_AXIS, "CH_AXIS" },
+ { USBJOYS_CH_SIM, "CH_SIM" },
+ { 0, NULL }
+};
+
+//
+// Structs last
+//
+
+static const struct YamlNode struct_CalibData[] = {
+ YAML_IDX_CUST("calib",r_calib,w_calib),
+ YAML_SIGNED( "mid", 16 ),
+ YAML_SIGNED( "spanNeg", 16 ),
+ YAML_SIGNED( "spanPos", 16 ),
+ YAML_END
+};
+static const struct YamlNode struct_signed_16[] = {
+ YAML_IDX,
+ YAML_SIGNED( "val", 16 ),
+ YAML_END
+};
+static const struct YamlNode struct_TrainerMix[] = {
+ YAML_IDX,
+ YAML_UNSIGNED( "srcChn", 6 ),
+ YAML_ENUM("mode", 2, enum_TrainerMultiplex),
+ YAML_SIGNED( "studWeight", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_TrainerData[] = {
+ YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL),
+ YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_1[] = {
+ YAML_STRING("name", 6),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_2[] = {
+ YAML_SIGNED( "val", 16 ),
+ YAML_UNSIGNED( "mode", 8 ),
+ YAML_UNSIGNED( "param", 8 ),
+ YAML_SIGNED( "spare", 32 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_3[] = {
+ YAML_SIGNED( "val1", 32 ),
+ YAML_SIGNED( "val2", 32 ),
+ YAML_END
+};
+static const struct YamlNode union_anonymous_0_elmts[] = {
+ YAML_STRUCT("play", 48, struct_anonymous_1, NULL),
+ YAML_STRUCT("all", 64, struct_anonymous_2, NULL),
+ YAML_STRUCT("clear", 64, struct_anonymous_3, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_CustomFunctionData[] = {
+ YAML_IDX,
+ YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
+ YAML_ENUM("func", 6, enum_Functions),
+ YAML_CUSTOM("def",r_customFn,w_customFn),
+ YAML_PADDING( 64 ),
+ YAML_PADDING( 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_RadioData[] = {
+ YAML_UNSIGNED( "manuallyEdited", 1 ),
+ YAML_PADDING( 7 ),
+ YAML_CUSTOM("semver",nullptr,w_semver),
+ YAML_CUSTOM("board",nullptr,w_board),
+ YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL),
+ YAML_PADDING( 16 ),
+ YAML_SIGNED( "currModel", 8 ),
+ YAML_UNSIGNED( "contrast", 8 ),
+ YAML_UNSIGNED( "vBatWarn", 8 ),
+ YAML_SIGNED( "txVoltageCalibration", 8 ),
+ YAML_ENUM("backlightMode", 3, enum_BacklightMode),
+ YAML_ENUM("antennaMode", 2, enum_AntennaModes),
+ YAML_UNSIGNED( "disableRtcWarning", 1 ),
+ YAML_UNSIGNED( "keysBacklight", 1 ),
+ YAML_PADDING( 1 ),
+ YAML_ENUM("internalModule", 8, enum_ModuleType),
+ YAML_STRUCT("trainer", 128, struct_TrainerData, NULL),
+ YAML_UNSIGNED( "view", 8 ),
+ YAML_PADDING( 2 ),
+ YAML_UNSIGNED( "fai", 1 ),
+ YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ),
+ YAML_UNSIGNED( "alarmsFlash", 1 ),
+ YAML_UNSIGNED( "disableMemoryWarning", 1 ),
+ YAML_UNSIGNED( "disableAlarmWarning", 1 ),
+ YAML_UNSIGNED( "stickMode", 2 ),
+ YAML_SIGNED( "timezone", 5 ),
+ YAML_UNSIGNED( "adjustRTC", 1 ),
+ YAML_UNSIGNED( "inactivityTimer", 8 ),
+ YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr),
+ YAML_UNSIGNED( "internalModuleBaudrate", 3 ),
+ YAML_SIGNED( "splashMode", 3 ),
+ YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ),
+ YAML_SIGNED( "switchesDelay", 8 ),
+ YAML_UNSIGNED( "lightAutoOff", 8 ),
+ YAML_UNSIGNED( "templateSetup", 8 ),
+ YAML_SIGNED( "PPM_Multiplier", 8 ),
+ YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ),
+ YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ),
+ YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ),
+ YAML_UNSIGNED( "gpsFormat", 1 ),
+ YAML_PADDING( 1 ),
+ YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ),
+ YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ),
+ YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ),
+ YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ),
+ YAML_UNSIGNED( "backlightBright", 8 ),
+ YAML_UNSIGNED( "globalTimer", 32 ),
+ YAML_UNSIGNED( "bluetoothBaudrate", 4 ),
+ YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes),
+ YAML_UNSIGNED( "countryCode", 2 ),
+ YAML_SIGNED( "pwrOnSpeed", 3 ),
+ YAML_SIGNED( "pwrOffSpeed", 3 ),
+ YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr),
+ YAML_UNSIGNED( "noJitterFilter", 1 ),
+ YAML_UNSIGNED( "imperial", 1 ),
+ YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ),
+ YAML_UNSIGNED( "USBMode", 2 ),
+ YAML_UNSIGNED( "jackMode", 2 ),
+ YAML_PADDING( 1 ),
+ YAML_STRING("ttsLanguage", 2),
+ YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ),
+ YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ),
+ YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ),
+ YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ),
+ YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ),
+ YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ),
+ YAML_SIGNED( "varioRepeat", 8 ),
+ YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active),
+ YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr),
+ YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr),
+ YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr),
+ YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid),
+ YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr),
+ YAML_ARRAY("potsConfig", 4, 8, struct_potConfig, nullptr),
+ YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr),
+ YAML_UNSIGNED( "backlightColor", 8 ),
+ YAML_STRING("ownerRegistrationID", 8),
+ YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr),
+ YAML_UNSIGNED( "rotEncMode", 2 ),
+ YAML_SIGNED( "uartSampleMode", 2 ),
+ YAML_PADDING( 3 ),
+ YAML_UNSIGNED( "audioMuteEnable", 1 ),
+ YAML_UNSIGNED( "radioGFDisabled", 1 ),
+ YAML_UNSIGNED( "radioTrainerDisabled", 1 ),
+ YAML_UNSIGNED( "modelHeliDisabled", 1 ),
+ YAML_UNSIGNED( "modelFMDisabled", 1 ),
+ YAML_UNSIGNED( "modelCurvesDisabled", 1 ),
+ YAML_UNSIGNED( "modelGVDisabled", 1 ),
+ YAML_UNSIGNED( "modelLSDisabled", 1 ),
+ YAML_UNSIGNED( "modelSFDisabled", 1 ),
+ YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ),
+ YAML_UNSIGNED( "modelTelemetryDisabled", 1 ),
+ YAML_END
+};
+static const struct YamlNode struct_unsigned_8[] = {
+ YAML_IDX,
+ YAML_UNSIGNED( "val", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_ModelHeader[] = {
+ YAML_STRING("name", 10),
+ YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_TimerData[] = {
+ YAML_IDX,
+ YAML_UNSIGNED( "start", 22 ),
+ YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
+ YAML_SIGNED( "value", 22 ),
+ YAML_ENUM("mode", 3, enum_TimerModes),
+ YAML_UNSIGNED( "countdownBeep", 2 ),
+ YAML_UNSIGNED( "minuteBeep", 1 ),
+ YAML_UNSIGNED( "persistent", 2 ),
+ YAML_SIGNED( "countdownStart", 2 ),
+ YAML_UNSIGNED( "showElapsed", 1 ),
+ YAML_UNSIGNED( "extraHaptic", 1 ),
+ YAML_PADDING( 6 ),
+ YAML_STRING("name", 3),
+ YAML_END
+};
+static const struct YamlNode struct_CurveRef[] = {
+ YAML_UNSIGNED( "type", 8 ),
+ YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ),
+ YAML_END
+};
+static const struct YamlNode struct_MixData[] = {
+ YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ),
+ YAML_UNSIGNED( "destCh", 5 ),
+ YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ),
+ YAML_UNSIGNED( "carryTrim", 1 ),
+ YAML_UNSIGNED( "mixWarn", 2 ),
+ YAML_ENUM("mltpx", 2, enum_MixerMultiplex),
+ YAML_PADDING( 1 ),
+ YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ),
+ YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
+ YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ),
+ YAML_STRUCT("curve", 16, struct_CurveRef, NULL),
+ YAML_UNSIGNED( "delayUp", 8 ),
+ YAML_UNSIGNED( "delayDown", 8 ),
+ YAML_UNSIGNED( "speedUp", 8 ),
+ YAML_UNSIGNED( "speedDown", 8 ),
+ YAML_STRING("name", 6),
+ YAML_END
+};
+static const struct YamlNode struct_LimitData[] = {
+ YAML_IDX,
+ YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ),
+ YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ),
+ YAML_SIGNED( "ppmCenter", 10 ),
+ YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ),
+ YAML_UNSIGNED( "symetrical", 1 ),
+ YAML_UNSIGNED( "revert", 1 ),
+ YAML_PADDING( 3 ),
+ YAML_SIGNED( "curve", 8 ),
+ YAML_STRING("name", 4),
+ YAML_END
+};
+static const struct YamlNode struct_ExpoData[] = {
+ YAML_UNSIGNED( "mode", 2 ),
+ YAML_UNSIGNED( "scale", 14 ),
+ YAML_CUSTOM("carryTrim",r_carryTrim,nullptr),
+ YAML_SIGNED( "trimSource", 6 ),
+ YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ),
+ YAML_UNSIGNED( "chn", 5 ),
+ YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
+ YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ),
+ YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ),
+ YAML_STRING("name", 6),
+ YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ),
+ YAML_STRUCT("curve", 16, struct_CurveRef, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_CurveHeader[] = {
+ YAML_IDX,
+ YAML_UNSIGNED( "type", 1 ),
+ YAML_UNSIGNED( "smooth", 1 ),
+ YAML_SIGNED( "points", 6 ),
+ YAML_STRING("name", 3),
+ YAML_END
+};
+static const struct YamlNode struct_signed_8[] = {
+ YAML_IDX,
+ YAML_SIGNED( "val", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_LogicalSwitchData[] = {
+ YAML_IDX,
+ YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions),
+ YAML_CUSTOM("def",r_logicSw,w_logicSw),
+ YAML_PADDING( 10 ),
+ YAML_PADDING( 10 ),
+ YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ),
+ YAML_PADDING( 1 ),
+ YAML_PADDING( 1 ),
+ YAML_PADDING( 16 ),
+ YAML_UNSIGNED( "delay", 8 ),
+ YAML_UNSIGNED( "duration", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_SwashRingData[] = {
+ YAML_ENUM("type", 8, enum_SwashType),
+ YAML_UNSIGNED( "value", 8 ),
+ YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ),
+ YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ),
+ YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ),
+ YAML_SIGNED( "collectiveWeight", 8 ),
+ YAML_SIGNED( "aileronWeight", 8 ),
+ YAML_SIGNED( "elevatorWeight", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_trim_t[] = {
+ YAML_IDX,
+ YAML_SIGNED( "value", 11 ),
+ YAML_UNSIGNED( "mode", 5 ),
+ YAML_END
+};
+static const struct YamlNode struct_FlightModeData[] = {
+ YAML_IDX,
+ YAML_ARRAY("trim", 16, 8, struct_trim_t, NULL),
+ YAML_STRING("name", 6),
+ YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
+ YAML_PADDING( 6 ),
+ YAML_UNSIGNED( "fadeIn", 8 ),
+ YAML_UNSIGNED( "fadeOut", 8 ),
+ YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active),
+ YAML_END
+};
+static const struct YamlNode struct_GVarData[] = {
+ YAML_IDX,
+ YAML_STRING("name", 3),
+ YAML_UNSIGNED( "min", 12 ),
+ YAML_UNSIGNED( "max", 12 ),
+ YAML_UNSIGNED( "popup", 1 ),
+ YAML_UNSIGNED( "prec", 1 ),
+ YAML_UNSIGNED( "unit", 2 ),
+ YAML_PADDING( 4 ),
+ YAML_END
+};
+static const struct YamlNode struct_VarioData[] = {
+ YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ),
+ YAML_UNSIGNED( "centerSilent", 1 ),
+ YAML_SIGNED( "centerMax", 8 ),
+ YAML_SIGNED( "centerMin", 8 ),
+ YAML_SIGNED( "min", 8 ),
+ YAML_SIGNED( "max", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_RssiAlarmData[] = {
+ YAML_CUSTOM("disabled",r_rssiDisabled,nullptr),
+ YAML_CUSTOM("warning",r_rssiWarning,nullptr),
+ YAML_CUSTOM("critical",r_rssiCritical,nullptr),
+ YAML_END
+};
+static const struct YamlNode struct_RFAlarmData[] = {
+ YAML_SIGNED( "warning", 8 ),
+ YAML_SIGNED( "critical", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_PpmModule[] = {
+ YAML_SIGNED( "delay", 6 ),
+ YAML_UNSIGNED( "pulsePol", 1 ),
+ YAML_UNSIGNED( "outputType", 1 ),
+ YAML_SIGNED( "frameLength", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_5[] = {
+ YAML_PADDING( 8 ),
+ YAML_UNSIGNED( "disableTelemetry", 1 ),
+ YAML_UNSIGNED( "disableMapping", 1 ),
+ YAML_UNSIGNED( "autoBindMode", 1 ),
+ YAML_UNSIGNED( "lowPowerMode", 1 ),
+ YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
+ YAML_UNSIGNED( "receiverHigherChannels", 1 ),
+ YAML_PADDING( 2 ),
+ YAML_SIGNED( "optionValue", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_6[] = {
+ YAML_UNSIGNED( "power", 2 ),
+ YAML_PADDING( 2 ),
+ YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
+ YAML_UNSIGNED( "receiverHigherChannels", 1 ),
+ YAML_SIGNED( "antennaMode", 2 ),
+ YAML_PADDING( 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_7[] = {
+ YAML_PADDING( 6 ),
+ YAML_UNSIGNED( "noninverted", 1 ),
+ YAML_PADDING( 1 ),
+ YAML_SIGNED( "refreshRate", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_string_64[] = {
+ YAML_IDX,
+ YAML_STRING("val", 8),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_8[] = {
+ YAML_UNSIGNED( "receivers", 7 ),
+ YAML_UNSIGNED( "racingMode", 1 ),
+ YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_9[] = {
+ YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL),
+ YAML_UNSIGNED( "mode", 3 ),
+ YAML_UNSIGNED( "rfPower", 1 ),
+ YAML_UNSIGNED( "reserved", 4 ),
+ YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_10[] = {
+ YAML_UNSIGNED( "emi", 2 ),
+ YAML_UNSIGNED( "telemetry", 1 ),
+ YAML_UNSIGNED( "phyMode", 3 ),
+ YAML_UNSIGNED( "reserved", 2 ),
+ YAML_UNSIGNED( "rfPower", 8 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_11[] = {
+ YAML_UNSIGNED( "raw12bits", 1 ),
+ YAML_UNSIGNED( "telemetryBaudrate", 3 ),
+ YAML_PADDING( 4 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_12[] = {
+ YAML_UNSIGNED( "telemetryBaudrate", 3 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_13[] = {
+ YAML_UNSIGNED( "flags", 8 ),
+ YAML_END
+};
+static const struct YamlNode union_anonymous_4_elmts[] = {
+ YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL),
+ YAML_STRUCT("ppm", 16, struct_PpmModule, NULL),
+ YAML_STRUCT("multi", 24, struct_anonymous_5, NULL),
+ YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL),
+ YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL),
+ YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL),
+ YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
+ YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
+ YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
+ YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
+ YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_ModuleData[] = {
+ YAML_IDX,
+ YAML_ENUM("type", 8, enum_ModuleType),
+ YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
+ YAML_UNSIGNED( "channelsStart", 8 ),
+ YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
+ YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
+ YAML_PADDING( 4 ),
+ YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
+ YAML_END
+};
+static const struct YamlNode struct_TrainerModuleData[] = {
+ YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ),
+ YAML_UNSIGNED( "channelsStart", 8 ),
+ YAML_SIGNED( "channelsCount", 8 ),
+ YAML_SIGNED( "frameLength", 8 ),
+ YAML_SIGNED( "delay", 6 ),
+ YAML_UNSIGNED( "pulsePol", 1 ),
+ YAML_PADDING( 1 ),
+ YAML_END
+};
+static const struct YamlNode union_ScriptDataInput_elmts[] = {
+ YAML_SIGNED( "value", 16 ),
+ YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ),
+ YAML_END
+};
+static const struct YamlNode union_ScriptDataInput[] = {
+ YAML_IDX,
+ YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input),
+ YAML_END
+};
+static const struct YamlNode struct_ScriptData[] = {
+ YAML_IDX,
+ YAML_STRING("file", 6),
+ YAML_STRING("name", 6),
+ YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_string_24[] = {
+ YAML_IDX,
+ YAML_STRING("val", 3),
+ YAML_END
+};
+static const struct YamlNode union_anonymous_14_elmts[] = {
+ YAML_UNSIGNED( "id", 16 ),
+ YAML_UNSIGNED( "persistentValue", 16 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_16[] = {
+ YAML_UNSIGNED( "physID", 5 ),
+ YAML_UNSIGNED( "rxIndex", 3 ),
+ YAML_END
+};
+static const struct YamlNode union_anonymous_15_elmts[] = {
+ YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL),
+ YAML_UNSIGNED( "instance", 8 ),
+ YAML_ENUM("formula", 8, enum_TelemetrySensorFormula),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_18[] = {
+ YAML_UNSIGNED( "ratio", 16 ),
+ YAML_SIGNED( "offset", 16 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_19[] = {
+ YAML_UNSIGNED( "source", 8 ),
+ YAML_UNSIGNED( "index", 8 ),
+ YAML_PADDING( 16 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_20[] = {
+ YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_21[] = {
+ YAML_UNSIGNED( "source", 8 ),
+ YAML_PADDING( 24 ),
+ YAML_END
+};
+static const struct YamlNode struct_anonymous_22[] = {
+ YAML_UNSIGNED( "gps", 8 ),
+ YAML_UNSIGNED( "alt", 8 ),
+ YAML_PADDING( 16 ),
+ YAML_END
+};
+static const struct YamlNode union_anonymous_17_elmts[] = {
+ YAML_STRUCT("custom", 32, struct_anonymous_18, NULL),
+ YAML_STRUCT("cell", 32, struct_anonymous_19, NULL),
+ YAML_STRUCT("calc", 32, struct_anonymous_20, NULL),
+ YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL),
+ YAML_STRUCT("dist", 32, struct_anonymous_22, NULL),
+ YAML_UNSIGNED( "param", 32 ),
+ YAML_END
+};
+static const struct YamlNode struct_TelemetrySensor[] = {
+ YAML_IDX,
+ YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1),
+ YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2),
+ YAML_STRING("label", 4),
+ YAML_UNSIGNED( "subId", 8 ),
+ YAML_ENUM("type", 1, enum_TelemetrySensorType),
+ YAML_PADDING( 1 ),
+ YAML_UNSIGNED( "unit", 6 ),
+ YAML_UNSIGNED( "prec", 2 ),
+ YAML_UNSIGNED( "autoOffset", 1 ),
+ YAML_UNSIGNED( "filter", 1 ),
+ YAML_UNSIGNED( "logs", 1 ),
+ YAML_UNSIGNED( "persistent", 1 ),
+ YAML_UNSIGNED( "onlyPositive", 1 ),
+ YAML_PADDING( 1 ),
+ YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg),
+ YAML_END
+};
+static const struct YamlNode struct_FrSkyBarData[] = {
+ YAML_IDX,
+ YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ),
+ YAML_SIGNED( "barMin", 16 ),
+ YAML_SIGNED( "barMax", 16 ),
+ YAML_END
+};
+static const struct YamlNode struct_LineDataSource[] = {
+ YAML_IDX,
+ YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ),
+ YAML_END
+};
+static const struct YamlNode struct_FrSkyLineData[] = {
+ YAML_IDX,
+ YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_TelemetryScriptData[] = {
+ YAML_STRING("file", 6),
+ YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL),
+ YAML_END
+};
+static const struct YamlNode union_TelemetryScreenData_u_elmts[] = {
+ YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL),
+ YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL),
+ YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL),
+ YAML_END
+};
+static const struct YamlNode struct_TelemetryScreenData[] = {
+ YAML_IDX,
+ YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type),
+ YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data),
+ YAML_END
+};
+static const struct YamlNode struct_USBJoystickChData[] = {
+ YAML_IDX,
+ YAML_ENUM("mode", 3, enum_USBJoystickCh),
+ YAML_UNSIGNED( "inversion", 1 ),
+ YAML_UNSIGNED( "param", 4 ),
+ YAML_UNSIGNED( "btn_num", 5 ),
+ YAML_UNSIGNED( "switch_npos", 3 ),
+ YAML_END
+};
+static const struct YamlNode struct_ModelData[] = {
+ YAML_CUSTOM("semver",nullptr,w_semver),
+ YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
+ YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
+ YAML_UNSIGNED( "telemetryProtocol", 3 ),
+ YAML_UNSIGNED( "thrTrim", 1 ),
+ YAML_UNSIGNED( "noGlobalFunctions", 1 ),
+ YAML_UNSIGNED( "displayTrims", 2 ),
+ YAML_UNSIGNED( "ignoreSensorIds", 1 ),
+ YAML_SIGNED( "trimInc", 3 ),
+ YAML_UNSIGNED( "disableThrottleWarning", 1 ),
+ YAML_UNSIGNED( "displayChecklist", 1 ),
+ YAML_UNSIGNED( "extendedLimits", 1 ),
+ YAML_UNSIGNED( "extendedTrims", 1 ),
+ YAML_UNSIGNED( "throttleReversed", 1 ),
+ YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ),
+ YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
+ YAML_UNSIGNED( "showInstanceIds", 1 ),
+ YAML_PADDING( 5 ),
+ YAML_SIGNED( "customThrottleWarningPosition", 8 ),
+ YAML_UNSIGNED( "beepANACenter", 16 ),
+ YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
+ YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL),
+ YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL),
+ YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL),
+ YAML_ARRAY("points", 8, 512, struct_signed_8, NULL),
+ YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL),
+ YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active),
+ YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active),
+ YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active),
+ YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ),
+ YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn),
+ YAML_PADDING( 64 ),
+ YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL),
+ YAML_STRUCT("varioData", 40, struct_VarioData, NULL),
+ YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ),
+ YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL),
+ YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL),
+ YAML_UNSIGNED( "thrTrimSw", 3 ),
+ YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode),
+ YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable),
+ YAML_PADDING( 1 ),
+ YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL),
+ YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL),
+ YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL),
+ YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL),
+ YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL),
+ YAML_UNSIGNED( "potsWarnEnabled", 8 ),
+ YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL),
+ YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL),
+ YAML_PADDING( 8 ),
+ YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL),
+ YAML_UNSIGNED( "view", 8 ),
+ YAML_STRING("modelRegistrationID", 8),
+ YAML_UNSIGNED( "functionSwitchConfig", 16 ),
+ YAML_UNSIGNED( "functionSwitchGroup", 16 ),
+ YAML_UNSIGNED( "functionSwitchStartConfig", 16 ),
+ YAML_UNSIGNED( "functionSwitchLogicalState", 8 ),
+ YAML_ARRAY("switchNames", 24, 6, struct_string_24, NULL),
+ YAML_UNSIGNED( "usbJoystickExtMode", 1 ),
+ YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode),
+ YAML_UNSIGNED( "usbJoystickCircularCut", 4 ),
+ YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL),
+ YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable),
+ YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable),
+ YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable),
+ YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable),
+ YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable),
+ YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable),
+ YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable),
+ YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable),
+ YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable),
+ YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable),
+ YAML_END
+};
+static const struct YamlNode struct_PartialModel[] = {
+ YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
+ YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
+ YAML_END
+};
+
+#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29
+
+static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData );
+
+const YamlNode* get_radiodata_nodes()
+{
+ return &__RadioData_root_node;
+}
+static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData );
+
+const YamlNode* get_modeldata_nodes()
+{
+ return &__ModelData_root_node;
+}
+static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel );
+
+const YamlNode* get_partialmodel_nodes()
+{
+ return &__PartialModel_root_node;
+}
+
diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp
index 9d627dae5e..162e0758c6 100644
--- a/radio/src/switches.cpp
+++ b/radio/src/switches.cpp
@@ -78,7 +78,7 @@ uint8_t potsPos[MAX_POTS];
((sw) % XPOTS_MULTIPOS_COUNT))
#if defined(FUNCTION_SWITCHES)
-// Function switches
+// Customizable switches
//
// Non pushed : SWSRC_Sx0 = -1024 = Sx(up) = state 0
// Pushed : SWSRC_Sx2 = +1024 = Sx(down) = state 1
diff --git a/radio/src/switches.h b/radio/src/switches.h
index f9f0576c01..4a7f995b28 100644
--- a/radio/src/switches.h
+++ b/radio/src/switches.h
@@ -60,21 +60,21 @@ uint8_t getXPotPosition(uint8_t idx);
div_t switchInfo(int switchPosition);
// Lookup switch index by letter ('A' to 'Z')
-// note: no function switches
+// note: no customizable switches
int switchLookupIdx(char c);
// Lookup switch index by name ('SA' to 'SZ')
-// note: no function switches
+// note: no customizable switches
int switchLookupIdx(const char* name, size_t len);
// Get switch letter ('A' to 'Z')
-// note: no function switches
+// note: no customizable switches
char switchGetLetter(uint8_t idx);
-// note: no function switches
+// note: no customizable switches
const char* switchGetCanonicalName(uint8_t idx);
-// function switches supported
+// customizable switches supported
void switchSetCustomName(uint8_t idx, const char* str, size_t len);
const char* switchGetCustomName(uint8_t idx);
bool switchHasCustomName(uint8_t idx);
diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
index afd3f1fcc4..48e0d00381 100644
--- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
+++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
@@ -48,6 +48,10 @@
#define BOOTLOADER_KEYS 0x42
#endif
+#if defined(RADIO_T20)
+ #define SECONDARY_BOOTLOADER_KEYS 0x1200
+#endif
+
#define APP_START_ADDRESS (uint32_t)(FIRMWARE_ADDRESS + BOOTLOADER_SIZE)
#if defined(EEPROM)
@@ -266,7 +270,11 @@ void bootloaderInitApp()
if ((~(KEYS_GPIO_REG_BIND->IDR) & KEYS_GPIO_PIN_BIND) == false) {
#else
// LHR & RHL trims not pressed simultanously
+#if defined(SECONDARY_BOOTLOADER_KEYS)
+ if (readTrims() != BOOTLOADER_KEYS && readTrims() != SECONDARY_BOOTLOADER_KEYS) {
+#else
if (readTrims() != BOOTLOADER_KEYS) {
+#endif
#endif
// Start main application
jumpTo(APP_START_ADDRESS);
diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt
index b9bb5c9c21..0f250cf56e 100644
--- a/radio/src/targets/taranis/CMakeLists.txt
+++ b/radio/src/targets/taranis/CMakeLists.txt
@@ -141,6 +141,17 @@ elseif(PCB STREQUAL X7)
add_definitions(-DRADIO_TPROV2)
add_definitions(-DMANUFACTURER_JUMPER)
set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough")
+ elseif(PCBREV STREQUAL T20)
+ set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module")
+ set(INTERNAL_MODULE_SERIAL YES)
+ set(FLAVOUR t20)
+ set(NAVIGATION_TYPE x7)
+ set(ROTARY_ENCODER YES)
+ set(CPU_TYPE_FULL STM32F407xE)
+ add_definitions(-DFUNCTION_SWITCHES)
+ add_definitions(-DRADIO_T20)
+ add_definitions(-DMANUFACTURER_JUMPER)
+ set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough")
elseif(PCBREV STREQUAL TLITE)
set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module")
set(INTERNAL_MODULE_SERIAL YES)
diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h
index f0c91f3962..d689c83d09 100644
--- a/radio/src/targets/taranis/board.h
+++ b/radio/src/targets/taranis/board.h
@@ -91,7 +91,11 @@ void sdMount();
void sdDone();
void sdPoll10ms();
uint32_t sdMounted();
+#if defined(SD_PRESENT_GPIO)
#define SD_CARD_PRESENT() ((SD_PRESENT_GPIO->IDR & SD_PRESENT_GPIO_PIN) == 0)
+#else
+#define SD_CARD_PRESENT() (true)
+#endif
#endif
// Flash Write driver
@@ -189,7 +193,7 @@ extern HardwareOptions hardwareOptions;
#define BATTERY_WARN 87 // 8.7V
#define BATTERY_MIN 85 // 8.5V
#define BATTERY_MAX 115 // 11.5V
-#elif defined(PCBXLITE)
+#elif defined(PCBXLITE) || defined(RADIO_T20)
// 2 x Li-Ion
#define BATTERY_WARN 66 // 6.6V
#define BATTERY_MIN 67 // 6.7V
@@ -296,6 +300,10 @@ uint8_t isBacklightEnabled();
#define USB_NAME "Jumper TPro V2"
#define USB_MANUFACTURER 'J', 'U', 'M', 'P', 'E', 'R', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'T', '-', 'P', 'R', 'O', ' ', 'V', '2' /* 8 Bytes */
+#elif defined(RADIO_T20)
+ #define USB_NAME "Jumper T20"
+ #define USB_MANUFACTURER 'J', 'U', 'M', 'P', 'E', 'R', ' ', ' ' /* 8 bytes */
+ #define USB_PRODUCT 'T', '-', '2', '0', ' ', ' ', ' ', ' ' /* 8 Bytes */
#elif defined(RADIO_COMMANDO8)
#define USB_NAME "iFlight Commando 8"
#define USB_MANUFACTURER 'i', 'F', 'l', 'i', 'g', 'h', 't', '-' /* 8 bytes */
diff --git a/radio/src/targets/taranis/diskio.cpp b/radio/src/targets/taranis/diskio.cpp
index 3d7b632366..80417b0e3c 100644
--- a/radio/src/targets/taranis/diskio.cpp
+++ b/radio/src/targets/taranis/diskio.cpp
@@ -214,6 +214,7 @@ void release_spi (void)
{
SD_DESELECT();
rcvr_spi();
+ delay_us(100);
}
#ifdef SD_USE_DMA
@@ -315,13 +316,15 @@ void power_on (void)
volatile BYTE dummyread;
card_power(1);
-
+
+#if defined(SD_PRESENT_GPIO)
GPIO_InitStructure.GPIO_Pin = SD_PRESENT_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(SD_PRESENT_GPIO, &GPIO_InitStructure);
+#endif
for (uint32_t Timer = 25000; Timer>0;Timer--); /* Wait for 250ms */
diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h
index ea1e250174..a3eaa3d1a3 100644
--- a/radio/src/targets/taranis/hal.h
+++ b/radio/src/targets/taranis/hal.h
@@ -145,6 +145,15 @@
#define KEYS_GPIO_PIN_MINUS LL_GPIO_PIN_14 // PE.14
#define KEYS_GPIO_REG_BIND GPIOD
#define KEYS_GPIO_PIN_BIND LL_GPIO_PIN_9 // PD.09
+#elif defined(RADIO_T20)
+ #define KEYS_GPIO_REG_PAGE GPIOD
+ #define KEYS_GPIO_PIN_PAGE LL_GPIO_PIN_11 // PD.11
+ #define KEYS_GPIO_REG_MENU GPIOD
+ #define KEYS_GPIO_PIN_MENU LL_GPIO_PIN_10 // PD.10
+ #define KEYS_GPIO_REG_EXIT GPIOD
+ #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_12 // PD.12
+ #define KEYS_GPIO_REG_ENTER GPIOE
+ #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_7 // PE.7
#elif defined(PCBX7)
#define KEYS_GPIO_REG_PAGE GPIOD
#define KEYS_GPIO_PIN_PAGE LL_GPIO_PIN_3 // PD.03
@@ -220,7 +229,7 @@
#define USE_EXTI15_10_IRQ
#define EXTI15_10_IRQ_Priority 5
#endif
-#elif defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TPRO) || defined(RADIO_TPROV2)
+#elif defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_T20)
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.09
@@ -339,6 +348,39 @@
#define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_2 // PC.02
#define TRIMS_GPIO_REG_RHL GPIOE
#define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_4 // PE.04
+#elif defined(RADIO_T20)
+ #define TRIMS_GPIO_REG_LHL GPIOD
+ #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_13 // PD.13
+ #define TRIMS_GPIO_REG_LHR GPIOG
+ #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_2 // PG.02
+ #define TRIMS_GPIO_REG_LVD GPIOG
+ #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_3 // PG.03
+ #define TRIMS_GPIO_REG_LVU GPIOD
+ #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_14 // PD.14
+ #define TRIMS_GPIO_REG_RVD GPIOF
+ #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_2 // PF.02
+ #define TRIMS_GPIO_REG_RVU GPIOE
+ #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_6 // PE.06
+ #define TRIMS_GPIO_REG_RHL GPIOE
+ #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_5 // PE.05
+ #define TRIMS_GPIO_REG_RHR GPIOF
+ #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_1 // PF.01
+ #define TRIMS_GPIO_REG_LSD GPIOG
+ #define TRIMS_GPIO_PIN_LSD LL_GPIO_PIN_9 // PG.09
+ #define TRIMS_GPIO_REG_LSU GPIOG
+ #define TRIMS_GPIO_PIN_LSU LL_GPIO_PIN_10 // PG.10
+ #define TRIMS_GPIO_REG_RSD GPIOD
+ #define TRIMS_GPIO_PIN_RSD LL_GPIO_PIN_7 // PD.07
+ #define TRIMS_GPIO_REG_RSU GPIOG
+ #define TRIMS_GPIO_PIN_RSU LL_GPIO_PIN_12 // PG.12
+ #define TRIMS_GPIO_REG_T7L GPIOB
+ #define TRIMS_GPIO_PIN_T7L LL_GPIO_PIN_3 // PB.03
+ #define TRIMS_GPIO_REG_T7R GPIOG
+ #define TRIMS_GPIO_PIN_T7R LL_GPIO_PIN_15 // PG.15
+ #define TRIMS_GPIO_REG_T8D GPIOG
+ #define TRIMS_GPIO_PIN_T8D LL_GPIO_PIN_13 // PG.13
+ #define TRIMS_GPIO_REG_T8U GPIOB
+ #define TRIMS_GPIO_PIN_T8U LL_GPIO_PIN_4 // PB.04
#elif defined(PCBX7) && !defined(RADIO_COMMANDO8)
#define TRIMS_GPIO_REG_LHL GPIOD
#define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_15 // PD.15
@@ -356,7 +398,7 @@
#define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_2 // PC.02
#define TRIMS_GPIO_REG_RHR GPIOE
#define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_4 // PE.04
-#elif defined(PCBX7) && defined(RADIO_COMMANDO8)
+#elif defined(RADIO_COMMANDO8)
#define TRIMS_GPIO_REG_LHL GPIOD
#define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_15 // PD.15
#define TRIMS_GPIO_REG_LHR GPIOC
@@ -456,7 +498,7 @@
#define STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A
#define SWITCHES_GPIO_REG_A GPIOE
- #define SWITCHES_GPIO_PIN_A LL_GPIO_PIN_3 // PE.03
+ #define SWITCHES_GPIO_PIN_A LL_GPIO_PIN_3 // PE.03
#elif defined(RADIO_TPRO) || defined(RADIO_TPROV2)
#define STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A
@@ -464,6 +506,12 @@
#define SWITCHES_GPIO_PIN_A_L LL_GPIO_PIN_13 // PE.13
#define SWITCHES_GPIO_REG_A_H GPIOE
#define SWITCHES_GPIO_PIN_A_H LL_GPIO_PIN_7 // PE.07
+#elif defined(RADIO_T20)
+ #define STORAGE_SWITCH_A
+ #define HARDWARE_SWITCH_A
+ #define SWITCHES_A_INVERTED
+ #define SWITCHES_GPIO_REG_A GPIOD
+ #define SWITCHES_GPIO_PIN_A LL_GPIO_PIN_0 // PD.00
#elif defined(PCBX7)
#define STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A
@@ -515,6 +563,12 @@
#define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_1 // PE.01
#define SWITCHES_GPIO_REG_B_H GPIOE
#define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_2 // PE.02
+#elif defined(RADIO_T20)
+ #define STORAGE_SWITCH_B
+ #define HARDWARE_SWITCH_B
+ #define SWITCHES_B_INVERTED
+ #define SWITCHES_GPIO_REG_B GPIOE
+ #define SWITCHES_GPIO_PIN_B LL_GPIO_PIN_2 // PE.02
#elif (RADIO_LR3PRO)
#define STORAGE_SWITCH_B
#define HARDWARE_SWITCH_B
@@ -606,6 +660,13 @@
#define HARDWARE_SWITCH_C
#define SWITCHES_GPIO_REG_C GPIOE
#define SWITCHES_GPIO_PIN_C LL_GPIO_PIN_14 // PE.14
+#elif defined(RADIO_T20)
+ #define STORAGE_SWITCH_C
+ #define HARDWARE_SWITCH_C
+ #define SWITCHES_GPIO_REG_C_L GPIOD
+ #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_2 // PD.02
+ #define SWITCHES_GPIO_REG_C_H GPIOD
+ #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_1 // PD.01
#elif defined(PCBX7)
#define STORAGE_SWITCH_C
#define HARDWARE_SWITCH_C
@@ -668,6 +729,13 @@
#define HARDWARE_SWITCH_D
#define SWITCHES_GPIO_REG_D GPIOD
#define SWITCHES_GPIO_PIN_D LL_GPIO_PIN_14 // PD.14
+#elif defined(RADIO_T20)
+ #define STORAGE_SWITCH_D
+ #define HARDWARE_SWITCH_D
+ #define SWITCHES_GPIO_REG_D_L GPIOE
+ #define SWITCHES_GPIO_PIN_D_L LL_GPIO_PIN_0 // PE.00
+ #define SWITCHES_GPIO_REG_D_H GPIOE
+ #define SWITCHES_GPIO_PIN_D_H LL_GPIO_PIN_1 // PE.01
#elif defined(PCBX7) && !defined(RADIO_COMMANDO8)
#define STORAGE_SWITCH_D
#define HARDWARE_SWITCH_D
@@ -750,6 +818,11 @@
#define HARDWARE_SWITCH_E
#define SWITCHES_GPIO_REG_E GPIOG
#define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_10 // PG.10
+#elif defined(RADIO_T20)
+ #define STORAGE_SWITCH_E
+ #define HARDWARE_SWITCH_E
+ #define SWITCHES_GPIO_REG_E GPIOD
+ #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_3 // PD.03
#elif defined(PCBX7)
// no SWE
#else
@@ -810,7 +883,12 @@
#define HARDWARE_SWITCH_F
#define SWITCHES_GPIO_REG_F GPIOG
#define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_9 // PG.09
-#elif defined(RADIO_T8) || defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_COMMANDO8) || defined(RADIO_LR3PRO)
+#elif defined(RADIO_T20)
+ #define STORAGE_SWITCH_F
+ #define HARDWARE_SWITCH_F
+ #define SWITCHES_GPIO_REG_F GPIOB
+ #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_5 // PB.05
+#elif defined(RADIO_T8) || defined(RADIO_TLITE) || defined(RADIO_TPROV2) || defined(RADIO_COMMANDO8) || defined(RADIO_LR3PRO)
// no SWF
#define STORAGE_SWITCH_F
#elif defined(RADIO_T12)
@@ -858,6 +936,12 @@
#define HARDWARE_SWITCH_G
#define SWITCHES_GPIO_REG_G GPIOG
#define SWITCHES_GPIO_PIN_G LL_GPIO_PIN_7 // PG.07
+#elif defined(RADIO_T20)
+ //TRIM left low
+ #define STORAGE_SWITCH_G
+ #define HARDWARE_SWITCH_G
+ #define SWITCHES_GPIO_REG_G GPIOD
+ #define SWITCHES_GPIO_PIN_G LL_GPIO_PIN_15 // PD.15
#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_T8) || defined(RADIO_COMMANDO8)
// no SWG
#else
@@ -899,7 +983,13 @@
#define HARDWARE_SWITCH_H
#define SWITCHES_GPIO_REG_H GPIOG
#define SWITCHES_GPIO_PIN_H LL_GPIO_PIN_6 // PG.06
-#elif defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_LR3PRO)
+#elif defined(RADIO_T20)
+ //TRIM right low
+ #define STORAGE_SWITCH_H
+ #define HARDWARE_SWITCH_H
+ #define SWITCHES_GPIO_REG_H GPIOF
+ #define SWITCHES_GPIO_PIN_H LL_GPIO_PIN_0 // PF.00
+#elif defined(RADIO_TLITE) || defined(RADIO_TPROV2) || defined(RADIO_LR3PRO)
// no SWH
#define STORAGE_SWITCH_H
#elif defined(PCBX7)
@@ -1014,6 +1104,17 @@
#define HARDWARE_SWITCH_L
#define SWITCHES_GPIO_REG_L GPIOG
#define SWITCHES_GPIO_PIN_L LL_GPIO_PIN_2 // PG.02
+#elif defined(RADIO_T20)
+ //TRIM left up
+ #define STORAGE_SWITCH_I
+ #define HARDWARE_SWITCH_I
+ #define SWITCHES_GPIO_REG_I GPIOG
+ #define SWITCHES_GPIO_PIN_I LL_GPIO_PIN_11 // PG.11
+ //TRIM right up
+ #define STORAGE_SWITCH_J
+ #define HARDWARE_SWITCH_J
+ #define SWITCHES_GPIO_REG_J GPIOG
+ #define SWITCHES_GPIO_PIN_J LL_GPIO_PIN_14 // PG.14
#elif defined(PCBX7)
#define STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I
@@ -1025,6 +1126,45 @@
#define SWITCHES_GPIO_PIN_J LL_GPIO_PIN_10 // PD.10
#endif
+#if defined(RADIO_T20)
+ //SW1
+ #define FUNCTION_SWITCH_1 SK
+ #define STORAGE_SWITCH_K
+ #define HARDWARE_SWITCH_K
+ #define SWITCHES_GPIO_REG_K GPIOE
+ #define SWITCHES_GPIO_PIN_K LL_GPIO_PIN_10 // PE.10
+ //SW2
+ #define FUNCTION_SWITCH_2 SL
+ #define STORAGE_SWITCH_L
+ #define HARDWARE_SWITCH_L
+ #define SWITCHES_GPIO_REG_L GPIOE
+ #define SWITCHES_GPIO_PIN_L LL_GPIO_PIN_8 // PE.08
+ //SW3
+ #define FUNCTION_SWITCH_3 SM
+ #define STORAGE_SWITCH_M
+ #define HARDWARE_SWITCH_M
+ #define SWITCHES_GPIO_REG_M GPIOE
+ #define SWITCHES_GPIO_PIN_M LL_GPIO_PIN_12 // PE.12
+ //SW4
+ #define FUNCTION_SWITCH_4 SN
+ #define STORAGE_SWITCH_N
+ #define HARDWARE_SWITCH_N
+ #define SWITCHES_GPIO_REG_N GPIOE
+ #define SWITCHES_GPIO_PIN_N LL_GPIO_PIN_13 // PE.13
+ //SW5
+ #define FUNCTION_SWITCH_5 SO
+ #define STORAGE_SWITCH_O
+ #define HARDWARE_SWITCH_O
+ #define SWITCHES_GPIO_REG_O GPIOE
+ #define SWITCHES_GPIO_PIN_O LL_GPIO_PIN_14 // PE.14
+ //SW6
+ #define FUNCTION_SWITCH_6 SP
+ #define STORAGE_SWITCH_P
+ #define HARDWARE_SWITCH_P
+ #define SWITCHES_GPIO_REG_P GPIOE
+ #define SWITCHES_GPIO_PIN_P LL_GPIO_PIN_15 // PE.15
+#endif
+
#if defined(PCBX9E)
#define STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I
@@ -1137,6 +1277,15 @@
#define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15)
#define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)
#define KEYS_GPIOG_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7)
+#elif defined(RADIO_T20)
+ #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG)
+ #define KEYS_GPIOA_PINS ()
+ #define KEYS_GPIOB_PINS (SWITCHES_GPIO_PIN_F | TRIMS_GPIO_PIN_T7L | TRIMS_GPIO_PIN_T8U)
+ #define KEYS_GPIOC_PINS (SWITCHES_GPIO_PIN_C)
+ #define KEYS_GPIOD_PINS (KEYS_GPIO_PIN_PAGE | KEYS_GPIO_PIN_MENU | KEYS_GPIO_PIN_EXIT | TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LVU | SWITCHES_GPIO_PIN_A_L | SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_G | TRIMS_GPIO_PIN_RSD)
+ #define KEYS_GPIOE_PINS (KEYS_GPIO_PIN_ENTER | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_RVU | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_D | SWITCHES_GPIO_PIN_E | SWITCHES_GPIO_PIN_K | SWITCHES_GPIO_PIN_L | SWITCHES_GPIO_PIN_M | SWITCHES_GPIO_PIN_N | SWITCHES_GPIO_PIN_O | SWITCHES_GPIO_PIN_P)
+ #define KEYS_GPIOF_PINS (TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RHR | SWITCHES_GPIO_PIN_H)
+ #define KEYS_GPIOG_PINS (TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_LVD | SWITCHES_GPIO_PIN_I | SWITCHES_GPIO_PIN_J | TRIMS_GPIO_PIN_LSD | TRIMS_GPIO_PIN_LSU | TRIMS_GPIO_PIN_RSU | TRIMS_GPIO_PIN_T7R | TRIMS_GPIO_PIN_T8D)
#elif defined(RADIO_FAMILY_JUMPER_T12)
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
#if !defined(RADIO_TLITE)
@@ -1223,12 +1372,14 @@
#endif
// ADC
-#define ADC_MAIN ADC1
-#define ADC_DMA DMA2
-#define ADC_DMA_CHANNEL LL_DMA_CHANNEL_0
-#define ADC_DMA_STREAM LL_DMA_STREAM_4
-#define ADC_DMA_STREAM_IRQ DMA2_Stream4_IRQn
-#define ADC_DMA_STREAM_IRQHandler DMA2_Stream4_IRQHandler
+#if !defined(RADIO_T20)
+ #define ADC_MAIN ADC1
+ #define ADC_DMA DMA2
+ #define ADC_DMA_CHANNEL LL_DMA_CHANNEL_0
+ #define ADC_DMA_STREAM LL_DMA_STREAM_4
+ #define ADC_DMA_STREAM_IRQ DMA2_Stream4_IRQn
+ #define ADC_DMA_STREAM_IRQHandler DMA2_Stream4_IRQHandler
+#endif
#define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_28CYCLES
#define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT
@@ -1438,6 +1589,45 @@
#define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_8
#define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10
#define ADC_VREF_PREC2 330
+#elif defined(RADIO_T20)
+ #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2)
+ #define ADC_RCC_APB1Periph 0
+ #define ADC_RCC_APB2Periph 0
+ #define ADC_MAIN ADC3
+ #define ADC_DMA DMA2
+ #define ADC_DMA_CHANNEL LL_DMA_CHANNEL_2
+ #define ADC_DMA_STREAM LL_DMA_STREAM_0
+ #define ADC_DMA_STREAM_IRQ DMA2_Stream0_IRQn
+ #define ADC_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler
+ #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_1 // PA.01
+ #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_0 // PA.00
+ #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_2 // PA.02
+ #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_3 // PA.03
+ #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_1 // ADC123_IN1
+ #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_0 // ADC123_IN0
+ #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_2 // ADC123_IN2
+ #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_3 // ADC123_IN3
+ #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_1 // PC.01
+ #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_0 // PC.00
+ #define ADC_GPIO_PIN_SLIDER1 LL_GPIO_PIN_3 // PC.03
+ #define ADC_GPIO_PIN_SLIDER2 LL_GPIO_PIN_2 // PC.02
+ #define ADC_GPIO_PIN_SLIDER3 LL_GPIO_PIN_5 // PF.05
+ #define ADC_GPIO_PIN_SLIDER4 LL_GPIO_PIN_3 // PF.03
+ #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_4 // PF.04
+ #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_11 // ADC123_IN11
+ #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_10 // ADC123_IN10
+ #define ADC_CHANNEL_SLIDER1 LL_ADC_CHANNEL_13 // ADC123_IN13
+ #define ADC_CHANNEL_SLIDER2 LL_ADC_CHANNEL_12 // ADC123_IN12
+ #define ADC_CHANNEL_SLIDER3 LL_ADC_CHANNEL_15 // ADC3_IN15
+ #define ADC_CHANNEL_SLIDER4 LL_ADC_CHANNEL_9 // ADC3_IN9
+ #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_14 // ADC3_IN14
+ #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV)
+ #define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2)
+ #define ADC_GPIOF_PINS (ADC_GPIO_PIN_SLIDER3 | ADC_GPIO_PIN_SLIDER4 | ADC_GPIO_PIN_BATT)
+ #define ADC_EXT ADC1
+ #define ADC_EXT_CHANNELS { ADC_CHANNEL_RTC_BATT }
+ #define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES
+ #define ADC_VREF_PREC2 330
#elif defined(PCBX7)
#define HARDWARE_POT1
#define HARDWARE_POT2
@@ -1541,6 +1731,8 @@
#define ADC_DIRECTION {-1, 1, 1, -1, -1, 1, 1, 1}
#elif defined(RADIO_TPRO) || defined(RADIO_TPROV2)
#define ADC_DIRECTION {1,-1,1,-1, 1,1, 1, 1}
+#elif defined(RADIO_T20)
+ #define ADC_DIRECTION {1,-1,1,-1, -1,1,-1,-1,-1,-1}
#elif defined(PCBX7)
#define ADC_DIRECTION {-1,1,-1,1, 1,1, 1, 1}
#elif defined(PCBX9LITE)
@@ -1550,7 +1742,7 @@
#endif
// PWR and LED driver
-#define PWR_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
+#define PWR_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG)
#if defined(PCBX9LITE)
#define PWR_SWITCH_GPIO GPIOA
@@ -1567,6 +1759,11 @@
#define PWR_SWITCH_GPIO_PIN GPIO_Pin_11 // PD.11
#define PWR_ON_GPIO GPIOD
#define PWR_ON_GPIO_PIN GPIO_Pin_10 // PD.10
+#elif defined(RADIO_T20)
+ #define PWR_SWITCH_GPIO GPIOG
+ #define PWR_SWITCH_GPIO_PIN GPIO_Pin_5 // PG.05
+ #define PWR_ON_GPIO GPIOG
+ #define PWR_ON_GPIO_PIN GPIO_Pin_6 // PG.06
#else
#define PWR_SWITCH_GPIO GPIOD
#define PWR_SWITCH_GPIO_PIN GPIO_Pin_1 // PD.01
@@ -1646,6 +1843,16 @@
#define LED_RED_GPIO_PIN GPIO_Pin_5 // PC.05
#define LED_BLUE_GPIO GPIOC
#define LED_BLUE_GPIO_PIN GPIO_Pin_4 // PC.04
+#elif defined(RADIO_T20)
+ #define STATUS_LEDS
+ #define GPIO_LED_GPIO_ON GPIO_SetBits
+ #define GPIO_LED_GPIO_OFF GPIO_ResetBits
+ #define LED_GREEN_GPIO GPIOG
+ #define LED_GREEN_GPIO_PIN GPIO_Pin_1 // PG.01
+ #define LED_RED_GPIO GPIOC
+ #define LED_RED_GPIO_PIN GPIO_Pin_5 // PC.05
+ #define LED_BLUE_GPIO GPIOC
+ #define LED_BLUE_GPIO_PIN GPIO_Pin_4 // PC.04
#elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER)
#define STATUS_LEDS
#define GPIO_LED_GPIO_ON GPIO_SetBits
@@ -1687,6 +1894,18 @@
#endif
#if defined(FUNCTION_SWITCHES)
+#if defined(RADIO_T20)
+ #define FS_RCC_AHB1Periph RCC_AHB1Periph_GPIOF
+ #define GPIO_FSLED_GPIO_ON GPIO_SetBits
+ #define GPIO_FSLED_GPIO_OFF GPIO_ResetBits
+ #define FSLED_GPIO GPIOF
+ #define FSLED_GPIO_PIN_1 GPIO_Pin_10
+ #define FSLED_GPIO_PIN_2 GPIO_Pin_9
+ #define FSLED_GPIO_PIN_3 GPIO_Pin_8
+ #define FSLED_GPIO_PIN_4 GPIO_Pin_7
+ #define FSLED_GPIO_PIN_5 GPIO_Pin_6
+ #define FSLED_GPIO_PIN_6 GPIO_Pin_13
+#else
#define FS_RCC_AHB1Periph RCC_AHB1Periph_GPIOF
#define GPIO_FSLED_GPIO_ON GPIO_SetBits
#define GPIO_FSLED_GPIO_OFF GPIO_ResetBits
@@ -1698,6 +1917,7 @@
#define FSLED_GPIO_PIN_5 GPIO_Pin_1
#define FSLED_GPIO_PIN_6 GPIO_Pin_0
#endif
+#endif
// Internal Module
#if defined(PCBXLITE)
@@ -1816,7 +2036,7 @@
#define INTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream5_IRQn
#define INTMODULE_TIMER_DMA_IRQHandler DMA2_Stream5_IRQHandler
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
-#elif (defined(RADIO_FAMILY_JUMPER_T12) && defined(HARDWARE_INTERNAL_MODULE)) || defined(RADIO_TX12) || defined(RADIO_T8) || defined(RADIO_TPRO) || defined(RADIO_TPROV2)
+#elif (defined(RADIO_FAMILY_JUMPER_T12) && defined(HARDWARE_INTERNAL_MODULE)) || defined(RADIO_TX12) || defined(RADIO_T8) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_T20)
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA1)
#define INTMODULE_PWR_GPIO GPIOC
#define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // PC.06
@@ -1844,6 +2064,11 @@
#define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_11 // PF.11
#define INTMODULE_BOOTCMD_DEFAULT 0 // RESET
#define INIT_INTMODULE_BOOTCMD_PIN() GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN);
+ #elif defined(RADIO_T20)
+ #define INTMODULE_BOOTCMD_GPIO GPIOE
+ #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_4 // PE.04
+ #define INTMODULE_BOOTCMD_DEFAULT 0 // RESET
+ #define INIT_INTMODULE_BOOTCMD_PIN() GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN);
#elif defined(RADIO_LR3PRO)
#define INTMODULE_BOOTCMD_GPIO GPIOB
#define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_5 // PB.05
@@ -1945,14 +2170,20 @@
#if defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_TLITE)
#define HARDWARE_EXTERNAL_MODULE_SIZE_SML
#endif
- #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
+ #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#if defined(RADIO_COMMANDO8)
#define EXTMODULE_RF_SWITCH_GPIO GPIOE //Antenna switching port
#define EXTMODULE_RF_SWITCH_GPIO_PIN GPIO_Pin_7 //Antenna switching pin //PE.07
#define EXTMODULE_PWR_GPIO GPIOE //External tuner power port //PE.02
- #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_2 //External tuner power pin
- #define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN|EXTMODULE_RF_SWITCH_GPIO_PIN)
- #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN|EXTMODULE_RF_SWITCH_GPIO_PIN)
+ #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_2 //External tuner power pin
+ #define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN|EXTMODULE_RF_SWITCH_GPIO_PIN)
+ #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN|EXTMODULE_RF_SWITCH_GPIO_PIN)
+ #elif defined(RADIO_T20)
+ #define EXTMODULE_PWR_GPIO GPIOB
+ #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_1 // PB.01
+ #define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
+ #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
+ #define HARDWARE_EXTERNAL_MODULE_SIZE_SML
#else
#define EXTMODULE_PWR_GPIO GPIOD
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08
@@ -2008,8 +2239,13 @@
#define TRAINER_IN_TIMER_Channel LL_TIM_CHANNEL_CH3
#define TRAINER_OUT_GPIO_PIN LL_GPIO_PIN_9 // PC.09
#define TRAINER_OUT_TIMER_Channel LL_TIM_CHANNEL_CH4
+#if defined(RADIO_T20)
+ #define TRAINER_DETECT_GPIO GPIOE
+ #define TRAINER_DETECT_GPIO_PIN LL_GPIO_PIN_8 // PE.03
+#else
#define TRAINER_DETECT_GPIO GPIOA
#define TRAINER_DETECT_GPIO_PIN LL_GPIO_PIN_8 // PA.08
+#endif
#if !defined(RADIO_X9DP2019) && !defined(RADIO_X7ACCESS)
#define TRAINER_DETECT_INVERTED
#endif
@@ -2124,7 +2360,7 @@
#define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08
#define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits
#define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits
-#elif defined(PCBX7ACCESS)
+#elif defined(PCBX7ACCESS)
#define SPORT_MAX_BAUDRATE 400000
#define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
#define SPORT_UPDATE_PWR_GPIO GPIOB
@@ -2321,7 +2557,7 @@
#define BACKLIGHT_CCMR1 TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 // Channel 1, PWM
#define BACKLIGHT_CCER TIM_CCER_CC1E
#define BACKLIGHT_COUNTER_REGISTER BACKLIGHT_TIMER->CCR1
-#elif defined(RADIO_T8) || defined(RADIO_TPROV2)
+#elif defined(RADIO_T8) || defined(RADIO_TPROV2) || defined(RADIO_T20)
#define BACKLIGHT_RCC_AHB1Periph 0
#define BACKLIGHT_RCC_APB1Periph 0
#define BACKLIGHT_RCC_APB2Periph 0
@@ -2337,7 +2573,7 @@
#define BACKLIGHT_GPIO_AF GPIO_AF_TIM4
#define BACKLIGHT_CCMR1 TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 // Channel2, PWM
#define BACKLIGHT_CCER TIM_CCER_CC2E
- #define BACKLIGHT_COUNTER_REGISTER BACKLIGHT_TIMER->CCR2
+ #define BACKLIGHT_COUNTER_REGISTER BACKLIGHT_TIMER->CCR2
#elif defined(PCBX7)
#define BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD
#define BACKLIGHT_RCC_APB1Periph RCC_APB1Periph_TIM4
@@ -2365,10 +2601,10 @@
#define KEYS_BACKLIGHT_RCC_AHB1Periph 0
// LCD driver
-#if defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_T8) || defined(RADIO_COMMANDO8) || defined(RADIO_TPRO) || defined(RADIO_TPROV2)
+#if defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_T8) || defined(RADIO_COMMANDO8) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_T20)
#define LCD_VERTICAL_INVERT
#endif
-#if defined(RADIO_LR3PRO) || defined(RADIO_TPROV2)
+#if defined(RADIO_LR3PRO) || defined(RADIO_TPROV2) || defined(RADIO_T20)
#define LCD_HORIZONTAL_INVERT
#define OLED_SCREEN
#endif
@@ -2425,8 +2661,13 @@
#define LCD_A0_GPIO_PIN GPIO_Pin_11 // PC.11
#define LCD_NCS_GPIO GPIOA
#define LCD_NCS_GPIO_PIN GPIO_Pin_15 // PA.15
+#if defined(RADIO_T20)
+ #define LCD_RST_GPIO GPIOA
+ #define LCD_RST_GPIO_PIN GPIO_Pin_14 // PA.14
+#else
#define LCD_RST_GPIO GPIOD
#define LCD_RST_GPIO_PIN GPIO_Pin_12 // PD.12
+#endif
#define LCD_DMA DMA1
#define LCD_DMA_Stream DMA1_Stream7
#define LCD_DMA_Stream_IRQn DMA1_Stream7_IRQn
@@ -2514,13 +2755,17 @@
// SD - SPI2
#define SD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
#define SD_RCC_APB1Periph RCC_APB1Periph_SPI2
-#define SD_PRESENT_GPIO GPIOD
-#if defined(PCBXLITE) || defined(PCBX9LITE)
- #define SD_PRESENT_GPIO_PIN GPIO_Pin_10 // PD.10
-#elif defined(RADIO_COMMANDO8)
- #define SD_PRESENT_GPIO_PIN GPIO_Pin_8 // PD.08
+#if defined(RADIO_T20)
+ // Using chip, so no detect
#else
- #define SD_PRESENT_GPIO_PIN GPIO_Pin_9 // PD.09
+#define SD_PRESENT_GPIO GPIOD
+#if defined(PCBXLITE) || defined(PCBX9LITE)
+ #define SD_PRESENT_GPIO_PIN GPIO_Pin_10 // PD.10
+#elif defined(RADIO_COMMANDO8)
+ #define SD_PRESENT_GPIO_PIN GPIO_Pin_8 // PD.08
+#else
+ #define SD_PRESENT_GPIO_PIN GPIO_Pin_9 // PD.09
+#endif
#endif
#define SD_GPIO GPIOB
#define SD_GPIO_PIN_CS GPIO_Pin_12 // PB.12
@@ -2564,22 +2809,28 @@
#define AUDIO_SPEAKER_ENABLE_GPIO_PIN GPIO_Pin_14 // PD.14
#define HEADPHONE_TRAINER_SWITCH_GPIO GPIOD
#define HEADPHONE_TRAINER_SWITCH_GPIO_PIN GPIO_Pin_9 // PD.09
-#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_ZORRO) || defined(RADIO_BOXER) || defined(RADIO_T8) || defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_LR3PRO)
- #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
- #define AUDIO_MUTE_GPIO GPIOE
- #define AUDIO_MUTE_GPIO_PIN GPIO_Pin_12 // PE.12
+#elif defined(RADIO_T20)
+ #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
+ #define AUDIO_MUTE_GPIO GPIOG
+ #define AUDIO_MUTE_GPIO_PIN GPIO_Pin_4 // PG.04
#define AUDIO_MUTE_DELAY 500 // ms
-#if defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_LR3PRO)
- #define AUDIO_UNMUTE_DELAY 250 // ms
-#else
#define AUDIO_UNMUTE_DELAY 150 // ms
-#endif
#elif defined(RADIO_COMMANDO8)
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
#define AUDIO_MUTE_GPIO GPIOB
#define AUDIO_MUTE_GPIO_PIN GPIO_Pin_1 // PB.01
#define AUDIO_MUTE_DELAY 500 // ms
#define INVERTED_MUTE_PIN
+#elif defined(MANUFACTURER_RADIOMASTER) || defined(MANUFACTURER_JUMPER) || defined(RADIO_LR3PRO)
+ #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
+ #define AUDIO_MUTE_GPIO GPIOE
+ #define AUDIO_MUTE_GPIO_PIN GPIO_Pin_12 // PE.12
+ #define AUDIO_MUTE_DELAY 500 // ms
+#if defined(MANUFACTURER_JUMPER) || defined(RADIO_LR3PRO)
+ #define AUDIO_UNMUTE_DELAY 250 // ms
+#else
+ #define AUDIO_UNMUTE_DELAY 150 // ms
+#endif
#else
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
#endif
diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h
index 7e6965dfd0..957ffb7676 100644
--- a/radio/src/telemetry/crossfire.h
+++ b/radio/src/telemetry/crossfire.h
@@ -113,7 +113,7 @@ const uint32_t CROSSFIRE_BAUDRATES[] = {
5250000,
};
-#if defined(RADIO_TPRO) || defined(RADIO_TPROV2)
+#if defined(RADIO_TPRO) || defined(RADIO_TPROV2) || defined(RADIO_T20)
#define CROSSFIRE_MAX_INTERNAL_BAUDRATE DIM(CROSSFIRE_BAUDRATES) - 3
#else
#define CROSSFIRE_MAX_INTERNAL_BAUDRATE DIM(CROSSFIRE_BAUDRATES) - 1
diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp
index 9cc78e59c1..1f414fbe25 100644
--- a/radio/src/translations.cpp
+++ b/radio/src/translations.cpp
@@ -164,6 +164,7 @@ const char STR_PPMFRAME[] = TR_PPMFRAME;
const char STR_REFRESHRATE[] = TR_REFRESHRATE;
const char STR_MS[] = TR_MS;
const char STR_SWITCH[] = TR_SWITCH;
+const char STR_FUNCTION_SWITCHES[] = TR_FUNCTION_SWITCHES;
const char STR_ADJUST_GVAR[] = TR_ADJUST_GVAR;
const char STR_PLAY_TRACK[] = TR_PLAY_TRACK;
const char STR_PLAY_VALUE[] = TR_PLAY_VALUE;
diff --git a/radio/src/translations.h b/radio/src/translations.h
index a73e8a4281..adc739e62a 100644
--- a/radio/src/translations.h
+++ b/radio/src/translations.h
@@ -288,6 +288,7 @@ extern const char STR_PPMFRAME[];
extern const char STR_REFRESHRATE[];
extern const char STR_MS[];
extern const char STR_SWITCH[];
+extern const char STR_FUNCTION_SWITCHES[];
extern const char STR_ADJUST_GVAR[];
extern const char STR_PLAY_TRACK[];
extern const char STR_PLAY_VALUE[];
diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h
index e17faf3693..62389fa18c 100644
--- a/radio/src/translations/cn.h
+++ b/radio/src/translations/cn.h
@@ -260,6 +260,7 @@
#define TR_WARN_5VOLTS "注意输出电平为5V"
#define TR_MS "ms"
#define TR_SWITCH "开关"
+#define TR_FUNCTION_SWITCHES "可自定义开关"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "微调"
#define TR_FADEIN "渐入"
@@ -446,7 +447,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "已校准的模拟值"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "原始模拟值 (5 Hz)"
#define TR_MENUCALIBRATION "校准"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "可自定义开关"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "将当前微调量保存至中点"
#else
@@ -831,7 +832,7 @@
#define TR_DEBUG "调试"
#define TR_KEYS_BTN BUTTON("按键")
#define TR_ANALOGS_BTN BUTTON(TR("模拟", "模拟量"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("自定义开关", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "未找到触摸硬件"
#define TR_TOUCH_EXIT "点击屏幕退出"
#define TR_SET BUTTON("设置")
diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h
index 99fde332a9..19d436eed9 100644
--- a/radio/src/translations/cz.h
+++ b/radio/src/translations/cz.h
@@ -275,6 +275,7 @@
#define TR_WARN_5VOLTS "Varování: výstupní úroveň je 5 voltů"
#define TR_MS "ms"
#define TR_SWITCH "Spínač"
+#define TR_FUNCTION_SWITCHES "Nastavitelné přepínače"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trimy"
#define TR_FADEIN "Přechod Zap"
@@ -461,8 +462,8 @@
#define TR_MENU_RADIO_ANALOGS "ANALOGY"
#define TR_MENU_RADIO_ANALOGS_CALIB "KALIBROVAT ANALOGY"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGY (5 Hz)"
-#define TR_MENUCALIBRATION "KALIBRACE"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENUCALIBRATION "KALIBRACE"
+#define TR_MENU_FSWITCH "NASTAVITELNÉ PŘEPÍNAČE"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trimy => Subtrimy"
#else
@@ -841,7 +842,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("SW","Přepínače"))
#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogy"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Vlastní Sw", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "Dotyková obrazovka nenalezena"
#define TR_TOUCH_EXIT "Dotkněte se obrazovky pro ukončení"
#define TR_SET BUTTON("Nast")
diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h
index deeae06e04..b60e21ab3e 100644
--- a/radio/src/translations/da.h
+++ b/radio/src/translations/da.h
@@ -273,6 +273,7 @@
#define TR_WARN_5VOLTS "Advarsel: udgang niveau er 5 volts"
#define TR_MS "ms"
#define TR_SWITCH "Kontakt"
+#define TR_FUNCTION_SWITCHES "Kontakter der kan tilpasses"
#define TR_SF_SWITCH "Udløser"
#define TR_TRIMS "Trim"
#define TR_FADEIN "Tone ind"
@@ -459,8 +460,8 @@
#define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "ANALOGS TEST")
#define TR_MENU_RADIO_ANALOGS_CALIB "KALIBRERET ANALOGE"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RÅ ANALOGE (5 Hz)"
-#define TR_MENUCALIBRATION "KALIBRIERING"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENUCALIBRATION "KALIBRIERING"
+#define TR_MENU_FSWITCH "KONTAKTER DER KAN TILPASSES"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trim => Subtrim"
#else
@@ -845,7 +846,7 @@
#define TR_DEBUG "Fejlfind"
#define TR_KEYS_BTN BUTTON("Taster")
#define TR_ANALOGS_BTN BUTTON(TR("Analo", "Analoge"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Tilpasset sw", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "Tryk skærm ikke fundet"
#define TR_TOUCH_EXIT "Tryk på skærm for at forlade"
#define TR_SET BUTTON("Set")
diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h
index def3a1ec5f..4df42e0718 100644
--- a/radio/src/translations/de.h
+++ b/radio/src/translations/de.h
@@ -270,6 +270,7 @@
#define TR_WARN_5VOLTS "Warnung: Ausgangspegel ist 5 Volt"
#define TR_MS "ms"
#define TR_SWITCH TR("Schalt.", "Schalter")
+#define TR_FUNCTION_SWITCHES "Anpassbare Schalter"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trimmer"
#define TR_FADEIN "Langs. Ein"
@@ -456,7 +457,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)"
#define TR_MENUCALIBRATION TR("KALIB. ANALOG", "KALIBRIERUNG-Analog")
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "ANPASSBARE SCHALTER"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trims => Subtrims"
#else
@@ -833,7 +834,7 @@
#define TR_DEBUG "Testen"
#define TR_KEYS_BTN BUTTON(TR("SW","Schalter"))
#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analoge"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("AnpSchalt", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "Touch hardware not found"
#define TR_TOUCH_EXIT "Touch screen to exit"
#define TR_CALIBRATION "Kalibrieren"
diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h
index 9c1c208213..d41ca65334 100644
--- a/radio/src/translations/en.h
+++ b/radio/src/translations/en.h
@@ -271,6 +271,7 @@
#define TR_WARN_5VOLTS "Warning: output level is 5 volts"
#define TR_MS "ms"
#define TR_SWITCH "Switch"
+#define TR_FUNCTION_SWITCHES "Customizable Switches"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trims"
#define TR_FADEIN "Fade in"
@@ -456,7 +457,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)"
#define TR_MENUCALIBRATION "CALIBRATION"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "CUSTOMIZABLE SWITCHES"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trims => Subtrims"
#else
@@ -841,7 +842,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON("Keys")
#define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Custom sw", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "Touch hardware not found"
#define TR_TOUCH_EXIT "Touch screen to exit"
#define TR_SET BUTTON("Set")
diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h
index d6d1831875..ed12176271 100644
--- a/radio/src/translations/es.h
+++ b/radio/src/translations/es.h
@@ -268,6 +268,7 @@
#define TR_WARN_5VOLTS "Aviso: nivel de salida 5 voltios"
#define TR_MS "ms"
#define TR_SWITCH TR("Interr.", "Interruptor")
+#define TR_FUNCTION_SWITCHES "Customizable switches"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trims"
#define TR_FADEIN "Inicio"
@@ -447,7 +448,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)"
#define TR_MENUCALIBRATION "CALIBRACIÓN"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "CUSTOMIZABLE SWITCHES"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trims => Offsets"
#else
@@ -836,7 +837,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("SW","Switches"))
#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Custom sw", "Customizable switches"))
#define TR_TOUCH_NOTFOUND "Hardware táctil no encontrado"
#define TR_TOUCH_EXIT "Tocar pantalla para salir"
#define TR_CALIBRATION "Calibración"
diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h
index 5745d1fc43..132b214e02 100644
--- a/radio/src/translations/fi.h
+++ b/radio/src/translations/fi.h
@@ -282,6 +282,7 @@
#define TR_WARN_5VOLTS "Warning: output level is 5 volts"
#define TR_MS "ms"
#define TR_SWITCH "Switch"
+#define TR_FUNCTION_SWITCHES "Customizable switches"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trims"
#define TR_FADEIN "Fade In"
@@ -462,7 +463,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)"
#define TR_MENUCALIBRATION "KALIBROINTI"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "CUSTOMIZABLE SWITCHES"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trims => Subtrims"
#else
@@ -850,7 +851,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("SW","Switches"))
#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Custom sw", "Customizable switches"))
#define TR_TOUCH_NOTFOUND "Touch hardware not found"
#define TR_TOUCH_EXIT "Touch screen to exit"
#define TR_SET "[Set]"
diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h
index 4fb0bb0193..61e6e1f1bd 100644
--- a/radio/src/translations/fr.h
+++ b/radio/src/translations/fr.h
@@ -277,6 +277,7 @@
#define TR_WARN_5VOLTS "Attention: niveau de sortie 5 volts"
#define TR_MS "ms"
#define TR_SWITCH TR("Inter", "Interrupteur")
+#define TR_FUNCTION_SWITCHES "Inters paramétrables"
#define TR_SF_SWITCH "Interrupteur"
#define TR_TRIMS "Trims"
#define TR_FADEIN "Fondu ON"
@@ -464,7 +465,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "ANALOG. CALIBRÉS"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)"
#define TR_MENUCALIBRATION "CALIBRATION"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "INTERS PARAMÉTRABLES"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trims => Subtrims"
#else
@@ -843,7 +844,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("Btns","Inters"))
#define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Custom sw", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "Écran tactile non trouvé"
#define TR_TOUCH_EXIT "Toucher écran pour quitter"
#define TR_SET BUTTON("Déf")
diff --git a/radio/src/translations/he.h b/radio/src/translations/he.h
index e70412c499..61d9e40843 100644
--- a/radio/src/translations/he.h
+++ b/radio/src/translations/he.h
@@ -350,6 +350,7 @@
#define TR_WARN_5VOLTS "Warning: output level is 5 volts"
#define TR_MS "ms"
#define TR_SWITCH "מתג"
+#define TR_FUNCTION_SWITCHES "מפסקים בהתאמה אישית"
#define TR_SF_SWITCH "הדק"
#define TR_TRIMS "קיזוזים"
#define TR_FADEIN "Fade in"
@@ -534,7 +535,8 @@
#define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "בדיקת אנלוגיות")
#define TR_MENU_RADIO_ANALOGS_CALIB "בדיקת אנלוגיות סטיקים ומגע"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)"
-#define TR_MENUCALIBRATION "כיול"
+#define TR_MENUCALIBRATION "כיול"
+#define TR_MENU_FSWITCH "מפסקים בהתאמה אישית"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trims => Subtrims"
#else
@@ -919,7 +921,7 @@
#define TR_DEBUG "איבחון"
#define TR_KEYS_BTN BUTTON("בדיקת מתגים")
#define TR_ANALOGS_BTN BUTTON(TR("Anas", "בדיקת אנלוגיות"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Custom sw", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "!מסך זה אינו מסך מגע"
#define TR_TOUCH_EXIT "גע במסך כדי לצאת"
#define TR_SET BUTTON("הגדר")
diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h
index 11d51f1f50..63e34dee28 100644
--- a/radio/src/translations/it.h
+++ b/radio/src/translations/it.h
@@ -269,6 +269,7 @@
#define TR_WARN_5VOLTS "Attenzione: il livello d'uscita è 5 Volts"
#define TR_MS "ms"
#define TR_SWITCH "Inter."
+#define TR_FUNCTION_SWITCHES "Interruttori personalizzabili"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trims"
#define TR_FADEIN "Diss.In"
@@ -454,7 +455,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "ANALOGICI CALIBRATI"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "ANALOGICI RAW (5 Hz)"
#define TR_MENUCALIBRATION "CALIBRAZIONE"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "INTERRUTTORI PERSONALIZZABILI"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trims => Subtrims"
#else
@@ -839,7 +840,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("SW", "Tasti"))
#define TR_ANALOGS_BTN BUTTON("Analogici")
-#define TR_FS_BTN BUTTON(TR("Fun. Inter.", "Funzione interruttori"))
+#define TR_FS_BTN BUTTON(TR("Int. pers.", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "Schermo touch non trovato"
#define TR_TOUCH_EXIT "Tocca lo schermo per uscire"
#define TR_SET BUTTON("Set")
diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h
index eb798e1a33..6d455cae74 100644
--- a/radio/src/translations/jp.h
+++ b/radio/src/translations/jp.h
@@ -266,6 +266,7 @@
#define TR_WARN_5VOLTS "警告: 出力レベル 5V"
#define TR_MS "ms"
#define TR_SWITCH "スイッチ"
+#define TR_FUNCTION_SWITCHES "Customizable switches"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "トリム"
#define TR_FADEIN "フェードイン"
@@ -451,7 +452,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "アナログ キャリブレーション"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW アナログ (5 Hz)"
#define TR_MENUCALIBRATION "キャリブレーション"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "CUSTOMIZABLE SWITCHES"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "トリム => サブトリム"
#else
@@ -836,7 +837,7 @@
#define TR_DEBUG "デバッグ"
#define TR_KEYS_BTN BUTTON("キー")
#define TR_ANALOGS_BTN BUTTON(TR("Anas", "アナログ"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Custom sw", "Customizable switches"))
#define TR_TOUCH_NOTFOUND "タッチパネルは見つかりませんでした"
#define TR_TOUCH_EXIT "画面をタップして終了します"
#define TR_SET BUTTON("設定")
diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h
index 5ff524b6d7..47770af000 100644
--- a/radio/src/translations/nl.h
+++ b/radio/src/translations/nl.h
@@ -268,6 +268,7 @@
#define TR_WARN_5VOLTS "Warning: output level is 5 volts"
#define TR_MS "ms"
#define TR_SWITCH TR("Schak.", "Schakelaar")
+#define TR_FUNCTION_SWITCHES "Customizable switches"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trims"
#define TR_FADEIN "Fade in"
@@ -457,7 +458,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)"
#define TR_MENUCALIBRATION TR("CALIB. ANALOOG", "CALIBRERING Sticks+Pots")
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "CUSTOMIZABLE SWITCHES"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trims => Subtrims"
#else
@@ -837,7 +838,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("SW","Switches"))
#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Custom sw", "Customizable switches"))
#define TR_TOUCH_NOTFOUND "Touch hardware not found"
#define TR_TOUCH_EXIT "Touch screen to exit"
#define TR_SET "[Set]"
diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h
index 80724045f4..7acb18d19e 100644
--- a/radio/src/translations/pl.h
+++ b/radio/src/translations/pl.h
@@ -267,6 +267,7 @@
#define TR_WARN_5VOLTS "Uwaga: output level is 5 volts"
#define TR_MS "ms"
#define TR_SWITCH "Przełą"
+#define TR_FUNCTION_SWITCHES "Ustawiane przełączniki"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trymy"
#define TR_FADEIN "Pojawia"
@@ -450,8 +451,8 @@
#define TR_MENU_RADIO_ANALOGS TR("WE-ANA","WEJŚCIA ANALOG.")
#define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)"
-#define TR_MENUCALIBRATION "KALIBRACJA"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENUCALIBRATION "KALIBRACJA"
+#define TR_MENU_FSWITCH "USTAWIANE PRZEŁĄCZNIKI"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trymery => Subtrimy"
#else
@@ -831,7 +832,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("SW","Switches"))
#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogi"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Ust. łącz.", TR_FUNCTION_SWITCHES ))
#define TR_TOUCH_NOTFOUND "Touch hardware not found"
#define TR_TOUCH_EXIT "Touch screen to exit"
#define TR_SET "[Set]"
diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h
index 2a8ec7e6b4..2770684af8 100644
--- a/radio/src/translations/pt.h
+++ b/radio/src/translations/pt.h
@@ -271,6 +271,7 @@
#define TR_WARN_5VOLTS "Warning: output level is 5 volts"
#define TR_MS "ms"
#define TR_SWITCH "Chave"
+#define TR_FUNCTION_SWITCHES "Botão customizável"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trims"
#define TR_FADEIN "Aparecer"
@@ -451,7 +452,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)"
#define TR_MENUCALIBRATION "CALIBRAGEM"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "BOTÃO CUSTOMIZÁVEL"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "Trims => Subtrims"
#else
@@ -839,7 +840,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("SW","Switches"))
#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Bt Custom", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "Touch hardware not found"
#define TR_TOUCH_EXIT "Touch screen to exit"
#define TR_SET "[Set]"
diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h
index c3ffe2373c..4281e73749 100644
--- a/radio/src/translations/se.h
+++ b/radio/src/translations/se.h
@@ -284,6 +284,7 @@
#define TR_WARN_5VOLTS "VARNING: Spänning ut är 5 volt"
#define TR_MS "ms"
#define TR_SWITCH "Brytare"
+#define TR_FUNCTION_SWITCHES "Anpassningsbara brytare"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "Trimmar"
#define TR_FADEIN "Tona in"
@@ -478,7 +479,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "KALIBRERADE ANALOGA"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RÅA ANALOGA (5Hz)"
#define TR_MENUCALIBRATION "KALIBRERING"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "ANPASSNINGSBARA BRYTARE"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "[Spara trimvärden]"
#else
@@ -859,7 +860,7 @@
#define TR_DEBUG "Debug"
#define TR_KEYS_BTN BUTTON(TR("Bryt.","Brytare"))
#define TR_ANALOGS_BTN BUTTON(TR("Ana.","Analoga"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("Anp. bryt.", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "Pekskärm hittas ej"
#define TR_TOUCH_EXIT "Peka på skärmen för att avsluta"
#define TR_SET BUTTON(TR("Def", "Ställ in"))
diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h
index 72fcbefc68..6281fa37d7 100644
--- a/radio/src/translations/tw.h
+++ b/radio/src/translations/tw.h
@@ -265,6 +265,7 @@
#define TR_WARN_5VOLTS "注意輸出電平是5V"
#define TR_MS "ms"
#define TR_SWITCH "開關"
+#define TR_FUNCTION_SWITCHES "可自定義開關"
#define TR_SF_SWITCH "Trigger"
#define TR_TRIMS "微調"
#define TR_FADEIN "漸入"
@@ -450,7 +451,7 @@
#define TR_MENU_RADIO_ANALOGS_CALIB "已校準的類比值"
#define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "原始類比值 (5 Hz)"
#define TR_MENUCALIBRATION "校準"
-#define TR_MENU_FSWITCH "FUNCTION SWITCHES"
+#define TR_MENU_FSWITCH "可自定義開關"
#if defined(COLORLCD)
#define TR_TRIMS2OFFSETS "將當前微調量保存至中點"
#else
@@ -835,7 +836,7 @@
#define TR_DEBUG "調試"
#define TR_KEYS_BTN BUTTON("按鍵")
#define TR_ANALOGS_BTN BUTTON(TR("類比", "類比"))
-#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches"))
+#define TR_FS_BTN BUTTON(TR("自定義開關", TR_FUNCTION_SWITCHES))
#define TR_TOUCH_NOTFOUND "未找到觸摸硬件"
#define TR_TOUCH_EXIT "點擊屏幕退出"
#define TR_SET BUTTON("設置")
diff --git a/radio/util/hw_defs/hal_keys.py b/radio/util/hw_defs/hal_keys.py
index ed50c73dbf..e6583739ed 100644
--- a/radio/util/hw_defs/hal_keys.py
+++ b/radio/util/hw_defs/hal_keys.py
@@ -21,13 +21,15 @@ TRIMS = [
{ "name": "T4", "dec": "RHL", "inc": "RHR", "input": "RH" },
{ "name": "T5", "dec": "LSD", "inc": "LSU" },
{ "name": "T6", "dec": "RSD", "inc": "RSU" },
+ { "name": "T7", "dec": "T7L", "inc": "T7R" },
+ { "name": "T8", "dec": "T8D", "inc": "T8U" },
# Surface
{ "name": "T1", "dec": "T1L", "inc": "T1R", "input": "ST" },
{ "name": "T2", "dec": "T2L", "inc": "T2R", "input": "TH" },
{ "name": "T3", "dec": "T3L", "inc": "T3R"},
{ "name": "T4", "dec": "T4L", "inc": "T4R"},
{ "name": "T5", "dec": "T5L", "inc": "T5R" },
- { "name": "T6", "dec": "T6L", "inc": "T6R" },
+ { "name": "T6", "dec": "T6D", "inc": "T6U" },
]
KEYS = [
diff --git a/radio/util/hw_defs/legacy_names.py b/radio/util/hw_defs/legacy_names.py
index 3a8dc1825e..7c9a41ae9d 100644
--- a/radio/util/hw_defs/legacy_names.py
+++ b/radio/util/hw_defs/legacy_names.py
@@ -293,6 +293,65 @@ LEGACY_NAMES = [
}
}
},
+ {
+ "targets": {"t20"},
+ "inputs": {
+ "LH": {
+ "yaml": "Rud"
+ },
+ "LV": {
+ "yaml": "Ele"
+ },
+ "RV": {
+ "yaml": "Thr"
+ },
+ "RH": {
+ "yaml": "Ail"
+ },
+ "P1": {
+ "yaml": "POT1",
+ "lua": "s1",
+ "label": "S1",
+ "short_label": "1",
+ "description": "Potentiometer 1"
+ },
+ "P2": {
+ "yaml": "POT2",
+ "lua": "s2",
+ "label": "S2",
+ "short_label": "2",
+ "description": "Potentiometer 2"
+ },
+ "SL1": {
+ "yaml": "SLIDER1",
+ "lua": "s3",
+ "label": "S3",
+ "short_label": "3",
+ "description": "Potentiometer 3"
+ },
+ "SL2": {
+ "yaml": "SLIDER2",
+ "lua": "s4",
+ "label": "S4",
+ "short_label": "4",
+ "description": "Potentiometer 4"
+ },
+ "SL3": {
+ "yaml": "SLIDER3",
+ "lua": "sl",
+ "label": "SL",
+ "short_label": "L",
+ "description": "Right finger slider"
+ },
+ "SL4": {
+ "yaml": "SLIDER4",
+ "lua": "sr",
+ "label": "SR",
+ "short_label": "R",
+ "description": "Right finger slider"
+ }
+ }
+ },
{
"targets": {"x9lite","x9lites"},
"inputs": {
diff --git a/radio/util/hw_defs/pot_config.py b/radio/util/hw_defs/pot_config.py
index f6c1bd15e2..d8b482e95d 100644
--- a/radio/util/hw_defs/pot_config.py
+++ b/radio/util/hw_defs/pot_config.py
@@ -13,6 +13,14 @@ POT_CONFIG = {
"P1": { "default": "WITH_DETENT" },
"P2": { "default": "WITH_DETENT" }
},
+ "t20": {
+ "P1": { "default": "WITH_DETENT" },
+ "P2": { "default": "WITH_DETENT" },
+ "SL1": { "default": "SLIDER_WITH_DETENT" },
+ "SL2": { "default": "SLIDER_WITH_DETENT" },
+ "SL3": { "default": "SLIDER_WITH_DETENT" },
+ "SL4": { "default": "SLIDER_WITH_DETENT" },
+ },
"t12": {
"P1": { "default": "WITHOUT_DETENT" },
"P2": { "default": "WITHOUT_DETENT" }
diff --git a/radio/util/hw_defs/switch_config.py b/radio/util/hw_defs/switch_config.py
index 84fa375ede..17a616f679 100644
--- a/radio/util/hw_defs/switch_config.py
+++ b/radio/util/hw_defs/switch_config.py
@@ -112,6 +112,20 @@ SWITCH_CONFIG = {
"SF": { "default": "2POS", "display": [ 1, 2 ] },
"SH": { "default": "TOGGLE", "display": [ 1, 3 ] },
},
+ "t20": {
+ # left side
+ "SA": { "default": "2POS", "display": [ 0, 0 ] },
+ "SC": { "default": "3POS", "display": [ 0, 1 ] },
+ "SE": { "default": "2POS", "display": [ 0, 2 ] },
+ "SG": { "default": "TOGGLE", "display": [ 0, 3 ] },
+ "SI": { "default": "TOGGLE", "display": [ 0, 4 ] },
+ # right side
+ "SB": { "default": "2POS", "display": [ 1, 0 ] },
+ "SD": { "default": "3POS", "display": [ 1, 1 ] },
+ "SF": { "default": "2POS", "display": [ 1, 2 ] },
+ "SH": { "default": "TOGGLE", "display": [ 1, 3 ] },
+ "SJ": { "default": "TOGGLE", "display": [ 1, 4 ] }
+ },
"tx12": {
# left side
"SA": { "default": "TOGGLE", "display": [ 0, 0 ] },
diff --git a/tools/boards.py b/tools/boards.py
index b53da92cc2..e9e7aa6b8d 100755
--- a/tools/boards.py
+++ b/tools/boards.py
@@ -70,4 +70,8 @@ boards = {
"PCB": "X7",
"PCBREV": "COMMANDO8",
},
+ "T20": {
+ "PCB": "X7",
+ "PCBREV": "T20",
+ },
}
diff --git a/tools/build-companion.sh b/tools/build-companion.sh
index 138974301e..c853b4d1eb 100755
--- a/tools/build-companion.sh
+++ b/tools/build-companion.sh
@@ -68,6 +68,7 @@ declare -a simulator_plugins=(x9lite x9lites
t8 t12 tx12 tx12mk2
zorro commando8 boxer
tlite tpro lr3pro
+ t20
x9d x9dp x9dp2019 x9e
xlite xlites
nv14
@@ -122,6 +123,9 @@ do
tpro)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TPRO"
;;
+ t20)
+ BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20"
+ ;;
xlite)
BUILD_OPTIONS+="-DPCB=XLITE"
;;
diff --git a/tools/build-gh.sh b/tools/build-gh.sh
index 785c7ee615..b1becde681 100755
--- a/tools/build-gh.sh
+++ b/tools/build-gh.sh
@@ -134,6 +134,9 @@ do
tprov2)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TPROV2"
;;
+ t20)
+ BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20"
+ ;;
lr3pro)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=LR3PRO"
;;
diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh
index 51e24bf0af..f8ece0f706 100755
--- a/tools/commit-tests.sh
+++ b/tools/commit-tests.sh
@@ -103,6 +103,9 @@ do
tlitef4)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TLITEF4"
;;
+ t20)
+ BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20"
+ ;;
xlite)
BUILD_OPTIONS+="-DPCB=XLITE"
;;
diff --git a/tools/generate-hw-defs.sh b/tools/generate-hw-defs.sh
index 598920dbdd..9552b9356d 100755
--- a/tools/generate-hw-defs.sh
+++ b/tools/generate-hw-defs.sh
@@ -6,7 +6,7 @@ set -e
: "${SRCDIR:=$(dirname "$(pwd)/$0")/..}"
-: ${FLAVOR:="nv14;t12;t16;t18;t8;zorro;commando8;tlite;tpro;tprov2;lr3pro;tx12;tx12mk2;boxer;tx16s;x10;x10-access;x12s;x7;x7-access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites"}
+: ${FLAVOR:="nv14;t12;t16;t18;t8;zorro;commando8;tlite;tpro;tprov2;t20;lr3pro;tx12;tx12mk2;boxer;tx16s;x10;x10-access;x12s;x7;x7-access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites"}
: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"}
# wipe build directory clean
@@ -63,6 +63,9 @@ do
tprov2)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TPROV2"
;;
+ t20)
+ BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20"
+ ;;
lr3pro)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=LR3PRO"
;;
diff --git a/tools/generate-yaml.sh b/tools/generate-yaml.sh
index 63e7840257..f4b271ba4e 100755
--- a/tools/generate-yaml.sh
+++ b/tools/generate-yaml.sh
@@ -8,7 +8,7 @@ if [[ -n ${GCC_ARM} ]] ; then
export PATH=${GCC_ARM}:$PATH
fi
-: ${FLAVOR:="tx16s;x12s;nv14;x9d;x9dp;x9e;x9lite;xlites;x7;tpro"}
+: ${FLAVOR:="tx16s;x12s;nv14;x9d;x9dp;x9e;x9lite;xlites;x7;tpro;t20"}
: ${SRCDIR:=$(dirname "$(pwd)/$0")/..}
: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DDISABLE_COMPANION=YES -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"}
@@ -65,6 +65,9 @@ do
tpro)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TPRO"
;;
+ t20)
+ BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T20"
+ ;;
xlite)
BUILD_OPTIONS+="-DPCB=XLITE"
;;
diff --git a/tools/msys2_fetch_and_build_all.sh b/tools/msys2_fetch_and_build_all.sh
index 790b2bf5eb..8681482e79 100644
--- a/tools/msys2_fetch_and_build_all.sh
+++ b/tools/msys2_fetch_and_build_all.sh
@@ -9,7 +9,7 @@
# -----------------------------------------------------------------------------
export BRANCH_NAME="main" # main|2.9|...
-export RADIO_TYPE="tx16s" # tx16s|x10|x10-access|x12s|x9d|x9dp|x9lite|x9lites|x7|x7-access|t12|tx12|tx12mk2|boxer|t8|zorro|tlite|tpro|lr3pro|xlite|xlites|x9dp2019|x9e|x9e-hall|t16|t18|nv14|commando8|
+export RADIO_TYPE="tx16s" # tx16s|x10|x10-access|x12s|x9d|x9dp|x9lite|x9lites|x7|x7-access|t12|tx12|tx12mk2|boxer|t8|zorro|tlite|tpro|t20/lr3pro|xlite|xlites|x9dp2019|x9e|x9e-hall|t16|t18|nv14|commando8|
export BUILD_OPTIONS="-DDEFAULT_MODE=2 -DGVARS=YES -DPPM_UNIT=US"
@@ -51,6 +51,9 @@ case $RADIO_TYPE in
tpro)
BUILD_OPTIONS+=" -DPCB=X7 -DPCBREV=TPRO"
;;
+ t20)
+ BUILD_OPTIONS+=" -DPCB=X7 -DPCBREV=T20"
+ ;;
lr3pro)
BUILD_OPTIONS+=" -DPCB=X7 -DPCBREV=LR3PRO"
;;