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