From 6dd100f337e6ec4366f5257d27518fae024bb9c7 Mon Sep 17 00:00:00 2001 From: Peter Feerick <5500713+pfeerick@users.noreply.github.com> Date: Sat, 31 Oct 2026 02:17:32 +0000 Subject: [PATCH 1/4] feat(color): selectable trainer lead wiring for Flysky radios Flysky radios (PL18 family, NV14, EL18, NB4P, PA01, ST16) put trainer in and out on different 3.5mm jack contacts, and ship with a crossover lead to suit. With a mono lead, as used by most other radios, the ring is grounded, so whichever direction is on the ring stops working. Add a "Trainer lead" option in Radio Setup > Hardware on these boards: - Crossover (default): existing behaviour, in and out on their own contacts - Standard: in and out both on the tip, for mono or straight leads Boards opt in via "trainer_jack_crossover" in their hw_defs; boards whose output (rather than input) is on the tip also set "trainer_jack_tip_is_out" (ST16). The setting takes a spare bit in the COLORLCD radio settings. Co-Authored-By: Claude Opus 5.5 --- .../boards/generic_stm32/trainer_ports.cpp | 45 ++++++++++++++++++- radio/src/boards/hw_defs/el18.json | 3 +- radio/src/boards/hw_defs/nb4p.json | 3 +- radio/src/boards/hw_defs/nv14.json | 3 +- radio/src/boards/hw_defs/pa01.json | 3 +- radio/src/boards/hw_defs/pl18.json | 3 +- radio/src/boards/hw_defs/pl18ev.json | 3 +- radio/src/boards/hw_defs/pl18u.json | 3 +- radio/src/boards/hw_defs/st16.json | 4 +- radio/src/datastructs_private.h | 7 ++- .../src/gui/colorlcd/radio/radio_hardware.cpp | 16 +++++++ .../src/storage/yaml/yaml_datastructs_c14.cpp | 3 +- .../src/storage/yaml/yaml_datastructs_f16.cpp | 3 +- .../storage/yaml/yaml_datastructs_gx15.cpp | 3 +- .../src/storage/yaml/yaml_datastructs_h17.cpp | 3 +- .../storage/yaml/yaml_datastructs_nb4p.cpp | 3 +- .../storage/yaml/yaml_datastructs_nv14.cpp | 3 +- .../storage/yaml/yaml_datastructs_pa01.cpp | 3 +- .../storage/yaml/yaml_datastructs_pl18.cpp | 3 +- .../storage/yaml/yaml_datastructs_pl18u.cpp | 3 +- .../storage/yaml/yaml_datastructs_st16.cpp | 3 +- .../src/storage/yaml/yaml_datastructs_t15.cpp | 3 +- .../storage/yaml/yaml_datastructs_t15h7.cpp | 3 +- .../storage/yaml/yaml_datastructs_t15pro.cpp | 3 +- .../storage/yaml/yaml_datastructs_t18h7.cpp | 3 +- .../src/storage/yaml/yaml_datastructs_t22.cpp | 3 +- .../storage/yaml/yaml_datastructs_tx15.cpp | 3 +- .../yaml/yaml_datastructs_tx16smk3.cpp | 3 +- .../src/storage/yaml/yaml_datastructs_v12.cpp | 3 +- .../src/storage/yaml/yaml_datastructs_v15.cpp | 3 +- .../src/storage/yaml/yaml_datastructs_x10.cpp | 3 +- radio/src/translations/i18n/cn.h | 3 ++ radio/src/translations/i18n/cz.h | 3 ++ radio/src/translations/i18n/da.h | 3 ++ radio/src/translations/i18n/de.h | 3 ++ radio/src/translations/i18n/en.h | 3 ++ radio/src/translations/i18n/es.h | 3 ++ radio/src/translations/i18n/fi.h | 3 ++ radio/src/translations/i18n/fr.h | 3 ++ radio/src/translations/i18n/he.h | 3 ++ radio/src/translations/i18n/it.h | 3 ++ radio/src/translations/i18n/jp.h | 3 ++ radio/src/translations/i18n/ko.h | 3 ++ radio/src/translations/i18n/nl.h | 3 ++ radio/src/translations/i18n/pl.h | 3 ++ radio/src/translations/i18n/pt.h | 3 ++ radio/src/translations/i18n/ru.h | 3 ++ radio/src/translations/i18n/se.h | 3 ++ radio/src/translations/i18n/sk.h | 3 ++ radio/src/translations/i18n/tw.h | 3 ++ radio/src/translations/i18n/ua.h | 3 ++ radio/src/translations/sim_string_list.h | 2 + radio/src/translations/string_list.h | 2 + radio/src/translations/translation_def.h | 1 + radio/util/hw_defs/models.py | 2 + tools/hwdef_schema.json | 4 +- 56 files changed, 192 insertions(+), 32 deletions(-) diff --git a/radio/src/boards/generic_stm32/trainer_ports.cpp b/radio/src/boards/generic_stm32/trainer_ports.cpp index c0373921f4a..c6a8cbba7c4 100644 --- a/radio/src/boards/generic_stm32/trainer_ports.cpp +++ b/radio/src/boards/generic_stm32/trainer_ports.cpp @@ -29,12 +29,13 @@ #include "dataconstants.h" #include "hal.h" +#include "edgetx.h" __WEAK void board_trainer_init() { #if defined(TRAINER_DETECT_GPIO) gpio_init(TRAINER_DETECT_GPIO, GPIO_IN_PU, GPIO_PIN_SPEED_LOW); -#endif +#endif trainer_init(); } @@ -63,8 +64,44 @@ static const stm32_pulse_timer_t trainerOutputTimer = { .DMA_TC_CallbackPtr = nullptr, }; +#if defined(TRAINER_JACK_CROSSOVER) +// Trainer in and out are on different jack contacts, meant for the crossover +// lead the radio ships with. A mono lead grounds the ring, so offer to run +// both directions on the tip instead. +#if defined(TRAINER_JACK_TIP_IS_OUT) + #define TRAINER_TIP_GPIO TRAINER_OUT_GPIO + #define TRAINER_TIP_TIMER_Channel TRAINER_OUT_TIMER_Channel +#else + #define TRAINER_TIP_GPIO TRAINER_IN_GPIO + #define TRAINER_TIP_TIMER_Channel TRAINER_IN_TIMER_Channel +#endif + +static_assert(__IS_TRAINER_TIMER_OUT_CHANNEL_SUPPORTED(TRAINER_TIP_TIMER_Channel), + "Unsupported trainer timer tip channel"); + +static const stm32_pulse_timer_t trainerTipTimer = { + .GPIO = TRAINER_TIP_GPIO, + .GPIO_Alternate = TRAINER_GPIO_AF, + .TIMx = TRAINER_TIMER, + .TIM_Freq = TRAINER_TIMER_FREQ, + .TIM_Channel = TRAINER_TIP_TIMER_Channel, + .TIM_IRQn = TRAINER_TIMER_IRQn, + .DMAx = nullptr, + .DMA_Stream = 0, + .DMA_Channel = 0, + .DMA_IRQn = (IRQn_Type)0, + .DMA_TC_CallbackPtr = nullptr, +}; +#endif + void trainer_init_dsc_out() { +#if defined(TRAINER_JACK_CROSSOVER) + if (g_eeGeneral.trainerTipOnly) { + trainer_init_output(&trainerTipTimer); + return; + } +#endif trainer_init_output(&trainerOutputTimer); } @@ -84,6 +121,12 @@ static const stm32_pulse_timer_t trainerInputTimer = { void trainer_init_dsc_in() { +#if defined(TRAINER_JACK_CROSSOVER) + if (g_eeGeneral.trainerTipOnly) { + trainer_init_capture(&trainerTipTimer); + return; + } +#endif trainer_init_capture(&trainerInputTimer); } diff --git a/radio/src/boards/hw_defs/el18.json b/radio/src/boards/hw_defs/el18.json index 1001ca99c3c..b30b87fd22f 100644 --- a/radio/src/boards/hw_defs/el18.json +++ b/radio/src/boards/hw_defs/el18.json @@ -404,6 +404,7 @@ "trainer_timer_irqn": "TIM4_IRQn", "trainer_timer_irqhandler": "TIM4_IRQHandler", "trainer_gpio_af": "LL_GPIO_AF_2", - "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)" + "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "trainer_jack_crossover": true } } diff --git a/radio/src/boards/hw_defs/nb4p.json b/radio/src/boards/hw_defs/nb4p.json index 09154e6d46c..37192a06563 100644 --- a/radio/src/boards/hw_defs/nb4p.json +++ b/radio/src/boards/hw_defs/nb4p.json @@ -267,6 +267,7 @@ "trainer_timer_irqn": "TIM4_IRQn", "trainer_timer_irqhandler": "TIM4_IRQHandler", "trainer_gpio_af": "LL_GPIO_AF_2", - "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)" + "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "trainer_jack_crossover": true } } diff --git a/radio/src/boards/hw_defs/nv14.json b/radio/src/boards/hw_defs/nv14.json index 045f71ba681..706c95dd323 100644 --- a/radio/src/boards/hw_defs/nv14.json +++ b/radio/src/boards/hw_defs/nv14.json @@ -404,6 +404,7 @@ "trainer_timer_irqn": "TIM4_IRQn", "trainer_timer_irqhandler": "TIM4_IRQHandler", "trainer_gpio_af": "LL_GPIO_AF_2", - "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)" + "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "trainer_jack_crossover": true } } diff --git a/radio/src/boards/hw_defs/pa01.json b/radio/src/boards/hw_defs/pa01.json index 1c04a5c14cd..0f763794af6 100644 --- a/radio/src/boards/hw_defs/pa01.json +++ b/radio/src/boards/hw_defs/pa01.json @@ -392,6 +392,7 @@ "trainer_timer_irqn": "TIM1_CC_IRQn", "trainer_timer_irqhandler": "TIM1_CC_IRQHandler", "trainer_gpio_af": "LL_GPIO_AF_1", - "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)" + "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "trainer_jack_crossover": true } } diff --git a/radio/src/boards/hw_defs/pl18.json b/radio/src/boards/hw_defs/pl18.json index da43303620a..bab36edf8b4 100644 --- a/radio/src/boards/hw_defs/pl18.json +++ b/radio/src/boards/hw_defs/pl18.json @@ -390,6 +390,7 @@ "trainer_timer_irqn": "TIM4_IRQn", "trainer_timer_irqhandler": "TIM4_IRQHandler", "trainer_gpio_af": "LL_GPIO_AF_2", - "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)" + "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "trainer_jack_crossover": true } } diff --git a/radio/src/boards/hw_defs/pl18ev.json b/radio/src/boards/hw_defs/pl18ev.json index 0be17d570e7..b4ea1e0c1e0 100644 --- a/radio/src/boards/hw_defs/pl18ev.json +++ b/radio/src/boards/hw_defs/pl18ev.json @@ -434,6 +434,7 @@ "trainer_timer_irqn": "TIM4_IRQn", "trainer_timer_irqhandler": "TIM4_IRQHandler", "trainer_gpio_af": "LL_GPIO_AF_2", - "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)" + "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "trainer_jack_crossover": true } } diff --git a/radio/src/boards/hw_defs/pl18u.json b/radio/src/boards/hw_defs/pl18u.json index 171ef41e0b7..579ef426393 100644 --- a/radio/src/boards/hw_defs/pl18u.json +++ b/radio/src/boards/hw_defs/pl18u.json @@ -407,6 +407,7 @@ "trainer_timer_irqn": "TIM4_IRQn", "trainer_timer_irqhandler": "TIM4_IRQHandler", "trainer_gpio_af": "LL_GPIO_AF_2", - "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)" + "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "trainer_jack_crossover": true } } diff --git a/radio/src/boards/hw_defs/st16.json b/radio/src/boards/hw_defs/st16.json index 7b31d781175..340ccdae0c7 100644 --- a/radio/src/boards/hw_defs/st16.json +++ b/radio/src/boards/hw_defs/st16.json @@ -519,7 +519,9 @@ "trainer_timer_irqn": "TIM15_IRQn", "trainer_timer_irqhandler": "TIM15_IRQHandler", "trainer_gpio_af": "LL_GPIO_AF_4", - "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)" + "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", + "trainer_jack_crossover": true, + "trainer_jack_tip_is_out": true }, "key_lock_combo": [ "KEY_EXIT", diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 18c9ca68c1e..6a15235c8f7 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -1219,13 +1219,16 @@ PACK(struct RadioData { // Radio level tabs control (global settings) NOBACKUP(uint8_t modelSelectLayout:2); NOBACKUP(uint8_t radioThemesDisabled:1); + // 0 = trainer in/out on their own jack contacts (crossover lead, default), + // 1 = both on the tip (mono / straight lead). TRAINER_JACK_CROSSOVER only + NOBACKUP(uint8_t trainerTipOnly:1); #if defined(USB_CHARGE_CONTROL) // 0 = charge while USB active (default), 1 = hold the charger off while USB // is plugged in SD/Joystick/VCP mode NOBACKUP(uint8_t usbChargeDisabled:1); - NOBACKUP(uint8_t spare:6 SKIP); + NOBACKUP(uint8_t spare:5 SKIP); #else - NOBACKUP(uint8_t spare:7 SKIP); + NOBACKUP(uint8_t spare:6 SKIP); #endif #elif LCD_W == 128 uint8_t invertLCD:1; // Invert B&W LCD display diff --git a/radio/src/gui/colorlcd/radio/radio_hardware.cpp b/radio/src/gui/colorlcd/radio/radio_hardware.cpp index fc57e4c3af6..e941fb7f173 100644 --- a/radio/src/gui/colorlcd/radio/radio_hardware.cpp +++ b/radio/src/gui/colorlcd/radio/radio_hardware.cpp @@ -22,6 +22,7 @@ #include "radio_hardware.h" #include "edgetx.h" +#include "choice.h" #include "getset_helpers.h" #include "hal/adc_driver.h" #include "hw_extmodule.h" @@ -165,6 +166,21 @@ const static SetupLineDef setupLines[] = { new ToggleSwitch(parent, {x, y, 0, 0}, GET_SET_DEFAULT(g_eeGeneral.audioMuteEnable)); } }, +#endif +#if defined(TRAINER_JACK_CROSSOVER) + { + // Trainer jack wiring: crossover lead vs mono / straight lead + STR_DEF(STR_TRAINER_JACK_MODE), + [](Window* parent, coord_t x, coord_t y) { + new Choice(parent, {x, y, 0, 0}, STR_TRAINER_JACK_MODES, 0, 1, + GET_DEFAULT(g_eeGeneral.trainerTipOnly), [=](int32_t newValue) { + g_eeGeneral.trainerTipOnly = newValue; + SET_DIRTY(); + // restarted on the new contacts by checkTrainerSettings() + stopTrainer(); + }); + } + }, #endif {nullptr, nullptr}, }; diff --git a/radio/src/storage/yaml/yaml_datastructs_c14.cpp b/radio/src/storage/yaml/yaml_datastructs_c14.cpp index 81079dac127..7a12f97092c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_c14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_c14.cpp @@ -474,7 +474,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_f16.cpp b/radio/src/storage/yaml/yaml_datastructs_f16.cpp index deca61c1a1b..1dbd5d91bca 100644 --- a/radio/src/storage/yaml/yaml_datastructs_f16.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_f16.cpp @@ -475,7 +475,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_gx15.cpp b/radio/src/storage/yaml/yaml_datastructs_gx15.cpp index 5373309f211..2983abac9ea 100644 --- a/radio/src/storage/yaml/yaml_datastructs_gx15.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_gx15.cpp @@ -498,8 +498,9 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), YAML_UNSIGNED( "usbChargeDisabled", 1 ), - YAML_PADDING( 6 ), + YAML_PADDING( 5 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_h17.cpp b/radio/src/storage/yaml/yaml_datastructs_h17.cpp index 7cad23b569c..de5cb26d87d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_h17.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_h17.cpp @@ -469,7 +469,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_nb4p.cpp b/radio/src/storage/yaml/yaml_datastructs_nb4p.cpp index 41e83bb5be6..03e807226be 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nb4p.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nb4p.cpp @@ -465,7 +465,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 06b9f866951..36672f520b7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -465,7 +465,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ARRAY("keyShortcuts", 8, 6, struct_KeyShortcut, NULL), YAML_ARRAY("qmFavorites", 8, 12, struct_QMFavorite, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_pa01.cpp b/radio/src/storage/yaml/yaml_datastructs_pa01.cpp index 96643126a95..4f0ac605118 100644 --- a/radio/src/storage/yaml/yaml_datastructs_pa01.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_pa01.cpp @@ -498,7 +498,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp index e41b4810019..dcbe900758b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp @@ -472,7 +472,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_pl18u.cpp b/radio/src/storage/yaml/yaml_datastructs_pl18u.cpp index cfddee0632a..2def7ffbe9a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_pl18u.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_pl18u.cpp @@ -465,7 +465,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_st16.cpp b/radio/src/storage/yaml/yaml_datastructs_st16.cpp index eca99be6f0d..d1536f51f6d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_st16.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_st16.cpp @@ -498,7 +498,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_t15.cpp b/radio/src/storage/yaml/yaml_datastructs_t15.cpp index 8e25a6ef249..1579cbf38ce 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t15.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t15.cpp @@ -483,7 +483,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_t15h7.cpp b/radio/src/storage/yaml/yaml_datastructs_t15h7.cpp index efecdd65629..7513972850a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t15h7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t15h7.cpp @@ -498,7 +498,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_t15pro.cpp b/radio/src/storage/yaml/yaml_datastructs_t15pro.cpp index efecdd65629..7513972850a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t15pro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t15pro.cpp @@ -498,7 +498,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_t18h7.cpp b/radio/src/storage/yaml/yaml_datastructs_t18h7.cpp index 38114b7a477..ab639771abc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t18h7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t18h7.cpp @@ -493,7 +493,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_t22.cpp b/radio/src/storage/yaml/yaml_datastructs_t22.cpp index efecdd65629..7513972850a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t22.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t22.cpp @@ -498,7 +498,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx15.cpp b/radio/src/storage/yaml/yaml_datastructs_tx15.cpp index 5373309f211..2983abac9ea 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx15.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx15.cpp @@ -498,8 +498,9 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), YAML_UNSIGNED( "usbChargeDisabled", 1 ), - YAML_PADDING( 6 ), + YAML_PADDING( 5 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp b/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp index 88ee740d5b7..e62517f3eaa 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp @@ -499,8 +499,9 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), YAML_UNSIGNED( "usbChargeDisabled", 1 ), - YAML_PADDING( 6 ), + YAML_PADDING( 5 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_v12.cpp b/radio/src/storage/yaml/yaml_datastructs_v12.cpp index 3c886a9d22a..64e63fe2f59 100644 --- a/radio/src/storage/yaml/yaml_datastructs_v12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_v12.cpp @@ -493,7 +493,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_v15.cpp b/radio/src/storage/yaml/yaml_datastructs_v15.cpp index 192f60d3926..4dd823e075c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_v15.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_v15.cpp @@ -500,7 +500,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index f3c773b8e0b..920a8cf6a40 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -474,7 +474,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "favMultiMode", 1 ), YAML_UNSIGNED( "modelSelectLayout", 2 ), YAML_UNSIGNED( "radioThemesDisabled", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "trainerTipOnly", 1 ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "pwrOffIfInactive", 8 ), YAML_ENUM("statusLedError", 2, enum_StatusLedColor, NULL), YAML_ENUM("statusLedReady", 2, enum_StatusLedColor, NULL), diff --git a/radio/src/translations/i18n/cn.h b/radio/src/translations/i18n/cn.h index 626f29dc8b1..4a681fbfb32 100644 --- a/radio/src/translations/i18n/cn.h +++ b/radio/src/translations/i18n/cn.h @@ -567,6 +567,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("关机检查教练", "关机时检查教练信号") #define TR_MODEL_STILL_POWERED "模型未断电" #define TR_TRAINER_STILL_CONNECTED "教练信号未断开" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB未断开" #define TR_MODEL_SHUTDOWN "关机 ?" #define TR_PRESS_ENTER_TO_CONFIRM "确认" diff --git a/radio/src/translations/i18n/cz.h b/radio/src/translations/i18n/cz.h index d714b037bce..8cafb1a350e 100644 --- a/radio/src/translations/i18n/cz.h +++ b/radio/src/translations/i18n/cz.h @@ -569,6 +569,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trenér vypnutí", "Kontrola trenéra při vypnutí") #define TR_MODEL_STILL_POWERED "Model stále spuštěn" #define TR_TRAINER_STILL_CONNECTED "Trenér stále připojen" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB stále připojeno" #define TR_MODEL_SHUTDOWN "Vypnout?" #define TR_PRESS_ENTER_TO_CONFIRM "Zmáčkni ENTER pro potvrzení" diff --git a/radio/src/translations/i18n/da.h b/radio/src/translations/i18n/da.h index 9f6a9338127..4f72962bb1c 100644 --- a/radio/src/translations/i18n/da.h +++ b/radio/src/translations/i18n/da.h @@ -572,6 +572,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Træner alarm", "Kontroller træner forbindelse") #define TR_MODEL_STILL_POWERED "Model stadig med strøm" #define TR_TRAINER_STILL_CONNECTED "Træner fortsat forbundet" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB stadig forbundet" #define TR_MODEL_SHUTDOWN "Luk ned?" #define TR_PRESS_ENTER_TO_CONFIRM "Tryk enter for bekræft" diff --git a/radio/src/translations/i18n/de.h b/radio/src/translations/i18n/de.h index e16600f6459..3680ab697b5 100644 --- a/radio/src/translations/i18n/de.h +++ b/radio/src/translations/i18n/de.h @@ -569,6 +569,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trainer b. Aussch.", "Prüfe Trainer bei Ausschalten") #define TR_MODEL_STILL_POWERED "Modell noch aktiv!" #define TR_TRAINER_STILL_CONNECTED "Schüler noch verbunden" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB noch verbunden" #define TR_MODEL_SHUTDOWN "Herunterfahren?" #define TR_PRESS_ENTER_TO_CONFIRM "Drücke [ENTER] zum Bestätigen" diff --git a/radio/src/translations/i18n/en.h b/radio/src/translations/i18n/en.h index c89ac711e31..e38c2fcfc63 100644 --- a/radio/src/translations/i18n/en.h +++ b/radio/src/translations/i18n/en.h @@ -568,6 +568,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trainer shutdown", "Check trainer on shutdown") #define TR_MODEL_STILL_POWERED "Model still powered" #define TR_TRAINER_STILL_CONNECTED TR("Trainer still on","Trainer still connected") +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB still connected" #define TR_MODEL_SHUTDOWN "Shutdown?" #define TR_PRESS_ENTER_TO_CONFIRM "Press enter to confirm" diff --git a/radio/src/translations/i18n/es.h b/radio/src/translations/i18n/es.h index 05370adcf39..7c18a393533 100644 --- a/radio/src/translations/i18n/es.h +++ b/radio/src/translations/i18n/es.h @@ -566,6 +566,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trainer alarm", "check trainer connection") #define TR_MODEL_STILL_POWERED "Modelo aun encendido" #define TR_TRAINER_STILL_CONNECTED "Trainer still connected" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB still connected" #define TR_MODEL_SHUTDOWN "Apagar ?" #define TR_PRESS_ENTER_TO_CONFIRM "Enter para confirmar" diff --git a/radio/src/translations/i18n/fi.h b/radio/src/translations/i18n/fi.h index 4a8da731af1..062b74458be 100644 --- a/radio/src/translations/i18n/fi.h +++ b/radio/src/translations/i18n/fi.h @@ -567,6 +567,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trainer alarm", "check trainer connection") #define TR_MODEL_STILL_POWERED "Model still powered" #define TR_TRAINER_STILL_CONNECTED "Trainer still connected" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB still connected" #define TR_MODEL_SHUTDOWN "Shutdown ?" #define TR_PRESS_ENTER_TO_CONFIRM "Press enter to confirm" diff --git a/radio/src/translations/i18n/fr.h b/radio/src/translations/i18n/fr.h index 2cb7a25cb54..e470f52ac01 100644 --- a/radio/src/translations/i18n/fr.h +++ b/radio/src/translations/i18n/fr.h @@ -570,6 +570,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trainer shutdown", "Vérifier écolage avant extinction") #define TR_MODEL_STILL_POWERED TR("Modèle alimenté", "Modèle encore alimenté") #define TR_TRAINER_STILL_CONNECTED "Élève encore connecté" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB encore connecté" #define TR_MODEL_SHUTDOWN "Éteindre ?" #define TR_PRESS_ENTER_TO_CONFIRM "Appui [Enter] pour confirmer" diff --git a/radio/src/translations/i18n/he.h b/radio/src/translations/i18n/he.h index 76042693328..8c8d91d752d 100644 --- a/radio/src/translations/i18n/he.h +++ b/radio/src/translations/i18n/he.h @@ -571,6 +571,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("התראת טריינר", "בדוק חיבור טריינר") #define TR_MODEL_STILL_POWERED "מודל עדיין פעיל" #define TR_TRAINER_STILL_CONNECTED "מצב חניך עדיין מחובר" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "חיבור עדיין מחובר" #define TR_MODEL_SHUTDOWN "?לכבות" #define TR_PRESS_ENTER_TO_CONFIRM "לחץ אנטר לאישור" diff --git a/radio/src/translations/i18n/it.h b/radio/src/translations/i18n/it.h index 3b827b341db..adc564a00fa 100644 --- a/radio/src/translations/i18n/it.h +++ b/radio/src/translations/i18n/it.h @@ -568,6 +568,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Spegnimento Trainer", "Controlla trainer spegnendo") #define TR_MODEL_STILL_POWERED "Radio ancora\nconnessa" #define TR_TRAINER_STILL_CONNECTED "Trainer ancora\nconnesso" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB ancora\nconnesso" #define TR_MODEL_SHUTDOWN "Spegnimento?" #define TR_PRESS_ENTER_TO_CONFIRM "Premi [ENT] per confermare" diff --git a/radio/src/translations/i18n/jp.h b/radio/src/translations/i18n/jp.h index 7c0fe11b7fc..f205aeb31c4 100644 --- a/radio/src/translations/i18n/jp.h +++ b/radio/src/translations/i18n/jp.h @@ -567,6 +567,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trainer shutdown", "シャットダウン時にトレーナーをチェック") #define TR_MODEL_STILL_POWERED "電源が入ったままです" #define TR_TRAINER_STILL_CONNECTED "トレーナー通信はまだ継続しています" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USBが接続されたままです" #define TR_MODEL_SHUTDOWN "シャットダウンしますか?" #define TR_PRESS_ENTER_TO_CONFIRM "Enterを押して確認してください" diff --git a/radio/src/translations/i18n/ko.h b/radio/src/translations/i18n/ko.h index 7800a01be36..1c46ddd3861 100644 --- a/radio/src/translations/i18n/ko.h +++ b/radio/src/translations/i18n/ko.h @@ -574,6 +574,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("트레이너 상태 확인", "종료 시 트레이너 확인") #define TR_MODEL_STILL_POWERED "모델 전원이 켜져 있음" #define TR_TRAINER_STILL_CONNECTED TR("트레이너 연결됨", "트레이너 아직 연결됨") +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB 연결 중" #define TR_MODEL_SHUTDOWN "모델을 종료할까요?" diff --git a/radio/src/translations/i18n/nl.h b/radio/src/translations/i18n/nl.h index 42bf51a86fb..67d48859664 100644 --- a/radio/src/translations/i18n/nl.h +++ b/radio/src/translations/i18n/nl.h @@ -569,6 +569,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trainer alarm", "check trainer connection") #define TR_MODEL_STILL_POWERED "Model still powered" #define TR_TRAINER_STILL_CONNECTED "Trainer still connected" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB still connected" #define TR_MODEL_SHUTDOWN "Shutdown ?" #define TR_PRESS_ENTER_TO_CONFIRM "Press enter to confirm" diff --git a/radio/src/translations/i18n/pl.h b/radio/src/translations/i18n/pl.h index c1303a1f863..35fe5003346 100644 --- a/radio/src/translations/i18n/pl.h +++ b/radio/src/translations/i18n/pl.h @@ -567,6 +567,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trener wyłączanie", "Sprawdzaj trener przy wyłączaniu") #define TR_MODEL_STILL_POWERED "Model jest włączony" #define TR_TRAINER_STILL_CONNECTED "Uczeń ciągle podłączony" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB jest podłączone" #define TR_MODEL_SHUTDOWN "Wyłączyć?" #define TR_PRESS_ENTER_TO_CONFIRM "Press enter to confirm" diff --git a/radio/src/translations/i18n/pt.h b/radio/src/translations/i18n/pt.h index 6fb1c3ec3a4..23d4cbf19c5 100644 --- a/radio/src/translations/i18n/pt.h +++ b/radio/src/translations/i18n/pt.h @@ -567,6 +567,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Trainer ao desl", "Checar trainer ao desligar") #define TR_MODEL_STILL_POWERED "Modelo ainda ligado" #define TR_TRAINER_STILL_CONNECTED "Trainer ainda conectado" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB ainda ligado" #define TR_MODEL_SHUTDOWN "Desligar?" #define TR_PRESS_ENTER_TO_CONFIRM "Press enter p/ confirmar" diff --git a/radio/src/translations/i18n/ru.h b/radio/src/translations/i18n/ru.h index 1d7d93d4b37..cd78446e7c4 100644 --- a/radio/src/translations/i18n/ru.h +++ b/radio/src/translations/i18n/ru.h @@ -570,6 +570,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("ВЫК Тренер", "Проверьте работу тренера при ВЫКЛ") #define TR_MODEL_STILL_POWERED "Модель работает" #define TR_TRAINER_STILL_CONNECTED "Тренер подкл" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB подкл" #define TR_MODEL_SHUTDOWN "Отключение?" #define TR_PRESS_ENTER_TO_CONFIRM "Нажмите [Enter] для подтв" diff --git a/radio/src/translations/i18n/se.h b/radio/src/translations/i18n/se.h index ecc354673e2..3a73b275876 100644 --- a/radio/src/translations/i18n/se.h +++ b/radio/src/translations/i18n/se.h @@ -571,6 +571,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Lärare alarm", "Kolla läraranslutningen") #define TR_MODEL_STILL_POWERED TR("Modell på","Modellen är på") #define TR_TRAINER_STILL_CONNECTED "Lärare fortfarande ansluten" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB är ansluten" #define TR_MODEL_SHUTDOWN "Stänga av?" #define TR_PRESS_ENTER_TO_CONFIRM "Tryck [ENTER] för att bekräfta" diff --git a/radio/src/translations/i18n/sk.h b/radio/src/translations/i18n/sk.h index 714a1b212ce..99f8fb70aae 100644 --- a/radio/src/translations/i18n/sk.h +++ b/radio/src/translations/i18n/sk.h @@ -574,6 +574,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Tréner vypnutý", "Kontrola trénera pri vypnutí") #define TR_MODEL_STILL_POWERED "Model stále spustený" #define TR_TRAINER_STILL_CONNECTED "Tréner stále pripojený" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB stále pripojené" #define TR_MODEL_SHUTDOWN "Vypnúť?" #define TR_PRESS_ENTER_TO_CONFIRM "Stlač ENTER pre potvrdenie" diff --git a/radio/src/translations/i18n/tw.h b/radio/src/translations/i18n/tw.h index a3c0c7eeee8..5484e753c19 100644 --- a/radio/src/translations/i18n/tw.h +++ b/radio/src/translations/i18n/tw.h @@ -565,6 +565,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("關機檢查教練", "關機時檢查教練信號") #define TR_MODEL_STILL_POWERED "模型未斷電" #define TR_TRAINER_STILL_CONNECTED "教練信號未斷開" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB未斷開" #define TR_MODEL_SHUTDOWN "關機 ?" #define TR_PRESS_ENTER_TO_CONFIRM "確認" diff --git a/radio/src/translations/i18n/ua.h b/radio/src/translations/i18n/ua.h index cf7ac995065..bb0b7770d8a 100644 --- a/radio/src/translations/i18n/ua.h +++ b/radio/src/translations/i18n/ua.h @@ -569,6 +569,9 @@ #define TR_TRAINER_SHUTDOWN_ALARM TR("Тренер при вимк.", "Перевіряти тренер при вимиканні") #define TR_MODEL_STILL_POWERED "Модель досі під живленням" #define TR_TRAINER_STILL_CONNECTED "Трен. досі підключено" +#define TR_TRAINER_JACK_MODE "Trainer lead" +#define TR_TRAINER_JACK_MODES_1 "Crossover" +#define TR_TRAINER_JACK_MODES_2 "Standard" #define TR_USB_STILL_CONNECTED "USB досі підключено" #define TR_MODEL_SHUTDOWN "Вимкнути?" #define TR_PRESS_ENTER_TO_CONFIRM "Тисни enter для підтвердження" diff --git a/radio/src/translations/sim_string_list.h b/radio/src/translations/sim_string_list.h index 0ece2c080f9..11ae8e55914 100644 --- a/radio/src/translations/sim_string_list.h +++ b/radio/src/translations/sim_string_list.h @@ -1010,6 +1010,8 @@ #define STR_TOUCH_PANEL currentLangStrings->STR_TOUCH_PANEL #define STR_TRAINER_SHUTDOWN_ALARM currentLangStrings->STR_TRAINER_SHUTDOWN_ALARM #define STR_TRAINER_STILL_CONNECTED currentLangStrings->STR_TRAINER_STILL_CONNECTED +#define STR_TRAINER_JACK_MODE currentLangStrings->STR_TRAINER_JACK_MODE +#define STR_TRAINER_JACK_MODES currentLangStrings->STR_TRAINER_JACK_MODES #define STR_TRAINER currentLangStrings->STR_TRAINER #define STR_TRIM currentLangStrings->STR_TRIM #define STR_TRIMINC currentLangStrings->STR_TRIMINC diff --git a/radio/src/translations/string_list.h b/radio/src/translations/string_list.h index f3dee893726..f51525022cd 100644 --- a/radio/src/translations/string_list.h +++ b/radio/src/translations/string_list.h @@ -1006,6 +1006,8 @@ STR(TOUCH_ENABLED) STR(TOUCH_PANEL) STR(TRAINER_SHUTDOWN_ALARM) STR(TRAINER_STILL_CONNECTED) +STR(TRAINER_JACK_MODE) +STRARRAY(TRAINER_JACK_MODES) STR(TRAINER) STR(TRIM) STR(TRIMINC) diff --git a/radio/src/translations/translation_def.h b/radio/src/translations/translation_def.h index c6c6ebba316..aa5012e0c09 100644 --- a/radio/src/translations/translation_def.h +++ b/radio/src/translations/translation_def.h @@ -136,6 +136,7 @@ #define TR_FS_COLOR_LIST SA9(TR_FS_COLOR_LIST) #define TR_STATUS_LED_COLORS SA3(TR_STATUS_LED_COLORS) +#define TR_TRAINER_JACK_MODES SA2(TR_TRAINER_JACK_MODES) #define TR_VUSBJOYSTICK_CH_AXIS SA9(TR_VUSBJOYSTICK_CH_AXIS) #define TR_POTTYPES SA8(TR_POTTYPES) diff --git a/radio/util/hw_defs/models.py b/radio/util/hw_defs/models.py index 04c9f6c742a..fa0bd5e2c66 100644 --- a/radio/util/hw_defs/models.py +++ b/radio/util/hw_defs/models.py @@ -363,6 +363,8 @@ class Trainer(BaseModel): trainer_gpio_af: Optional[str] = None trainer_detect_gpio: Optional[str] = None trainer_detect_inverted: Optional[bool] = None + trainer_jack_crossover: Optional[bool] = None + trainer_jack_tip_is_out: Optional[bool] = None Input = Union[StickInput, FlexInput, SwitchInput, RawInput, VBatInput, RTCBatInput, LuxInput] diff --git a/tools/hwdef_schema.json b/tools/hwdef_schema.json index e9133e8ff75..6dcfa487c1d 100644 --- a/tools/hwdef_schema.json +++ b/tools/hwdef_schema.json @@ -480,7 +480,9 @@ "trainer_timer_freq": { "type": "string" }, "trainer_gpio_af": { "type": "string" }, "trainer_detect_gpio": { "type": "string" }, - "trainer_detect_inverted": { "type": "boolean" } + "trainer_detect_inverted": { "type": "boolean" }, + "trainer_jack_crossover": { "type": "boolean" }, + "trainer_jack_tip_is_out": { "type": "boolean" } } } } From d243d1ba8ff3fab02e2bf8b5140bda96afa51a02 Mon Sep 17 00:00:00 2001 From: Peter Feerick <5500713+pfeerick@users.noreply.github.com> Date: Sat, 31 Oct 2026 02:18:08 +0000 Subject: [PATCH 2/4] fix(bw): jack mode setting showed country codes instead of modes TR_JACK_MODES was built from the TR_COUNTRY_CODES strings since #6502, so the Jack mode option (X-Lite S / X-Lite Pro) listed US/JP/EU rather than Ask/Audio/Trainer. Co-Authored-By: Claude Opus 5.5 --- radio/src/translations/translation_def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/translations/translation_def.h b/radio/src/translations/translation_def.h index aa5012e0c09..8bfe6dee206 100644 --- a/radio/src/translations/translation_def.h +++ b/radio/src/translations/translation_def.h @@ -190,7 +190,7 @@ #define TR_TRNMODE SA3(TR_TRNMODE) #define TR_VPERSISTENT SA3(TR_VPERSISTENT) #define TR_COUNTRY_CODES SA3(TR_COUNTRY_CODES) -#define TR_JACK_MODES SA3(TR_COUNTRY_CODES) +#define TR_JACK_MODES SA3(TR_JACK_MODES) #define TR_VDISPLAYTRIMS SA3(TR_VDISPLAYTRIMS) #define TR_ADCFILTERVALUES SA3(TR_ADCFILTERVALUES) #define TR_VMLTPX SA3(TR_VMLTPX) From 87976a0bd7494c16bc42ce7c65a6fd2da091d44b Mon Sep 17 00:00:00 2001 From: Peter Feerick <5500713+pfeerick@users.noreply.github.com> Date: Sat, 31 Oct 2026 02:33:39 +0000 Subject: [PATCH 3/4] feat(cpn): trainer lead option for split trainer jack boards Companion support for the radio "Trainer lead" setting (trainerTipOnly): read and write it in radio settings so saving from Companion no longer resets it, and show a Crossover / Standard choice on the Hardware page for boards with "trainer_jack_crossover" in their hw_defs. Co-Authored-By: Claude Opus 5.5 --- companion/src/firmwares/boardjson.cpp | 9 +++++++++ companion/src/firmwares/boardjson.h | 1 + companion/src/firmwares/boards.h | 1 + .../src/firmwares/edgetx/yaml_generalsettings.cpp | 2 ++ companion/src/firmwares/generalsettings.h | 1 + companion/src/generaledit/hardware.cpp | 10 ++++++++++ 6 files changed, 24 insertions(+) diff --git a/companion/src/firmwares/boardjson.cpp b/companion/src/firmwares/boardjson.cpp index a0327585725..4eedfaf0af8 100644 --- a/companion/src/firmwares/boardjson.cpp +++ b/companion/src/firmwares/boardjson.cpp @@ -238,6 +238,9 @@ const int BoardJson::getCapability(const Board::Capability capability) const case Board::StatusLedColors: return m_hardware.status_led_colors; + case Board::HasTrainerJackCrossover: + return m_hardware.trainer_jack_crossover; + case Board::HasStatusLedPwm: return m_hardware.status_led_pwm; @@ -1342,6 +1345,12 @@ bool BoardJson::loadFile(Board::Type board, QString hwdefn, InputsTable * inputs hardware.cpu_type = o.value("cpu_type").toString().toStdString(); } + if (obj.value("trainer").isObject()) { + const QJsonObject &o = obj.value("trainer").toObject(); + + hardware.trainer_jack_crossover = o.value("trainer_jack_crossover").toBool(); + } + if (obj.value("identity").isObject()) { const QJsonObject &o = obj.value("identity").toObject(); diff --git a/companion/src/firmwares/boardjson.h b/companion/src/firmwares/boardjson.h index 55535c345cc..0677334a7d3 100644 --- a/companion/src/firmwares/boardjson.h +++ b/companion/src/firmwares/boardjson.h @@ -133,6 +133,7 @@ class BoardJson int has_int_module_support = 0; int sport_max_baudrate = 0; int surface = 0; + int trainer_jack_crossover = 0; std::string cpu = ""; std::string cpu_type = ""; }; diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index c5fb0921ae5..3a341f13a94 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -254,6 +254,7 @@ namespace Board { HasRTC, HasSDCard, HasSwitchableJack, + HasTrainerJackCrossover, HasTrainerModuleCPPM, HasTrainerModuleSBUS, HasVBat, diff --git a/companion/src/firmwares/edgetx/yaml_generalsettings.cpp b/companion/src/firmwares/edgetx/yaml_generalsettings.cpp index 60e1c7f1e78..23beb578dc4 100644 --- a/companion/src/firmwares/edgetx/yaml_generalsettings.cpp +++ b/companion/src/firmwares/edgetx/yaml_generalsettings.cpp @@ -263,6 +263,7 @@ Node convert::encode(const GeneralSettings& rhs) node["disableTrainerPoweroffAlarm"] = (int)rhs.disableTrainerPoweroffAlarm; node["USBMode"] = rhs.usbMode; node["usbChargeDisabled"] = (int)rhs.usbChargeDisabled; + node["trainerTipOnly"] = rhs.trainerTipOnly; node["hatsMode"] = hatsModeLut << rhs.hatsMode; node["stickDeadZone"] = rhs.stickDeadZone; node["jackMode"] = rhs.jackMode; @@ -558,6 +559,7 @@ bool convert::decode(const Node& node, GeneralSettings& rhs) node["disableTrainerPoweroffAlarm"] >> rhs.disableTrainerPoweroffAlarm; node["USBMode"] >> rhs.usbMode; node["usbChargeDisabled"] >> rhs.usbChargeDisabled; + node["trainerTipOnly"] >> rhs.trainerTipOnly; node["hatsMode"] >> hatsModeLut >> rhs.hatsMode; node["stickDeadZone"] >> rhs.stickDeadZone; node["jackMode"] >> rhs.jackMode; diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h index 4c0f34ddb91..dcb2cee69af 100644 --- a/companion/src/firmwares/generalsettings.h +++ b/companion/src/firmwares/generalsettings.h @@ -319,6 +319,7 @@ class GeneralSettings { bool disableTrainerPoweroffAlarm; unsigned int usbMode; bool usbChargeDisabled; + unsigned int trainerTipOnly; unsigned int hatsMode; unsigned int stickDeadZone; unsigned int jackMode; diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index d69f9dc4fc5..ec906689d3b 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -225,6 +225,16 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings addParams(); } + if (Boards::getCapability(board, Board::HasTrainerJackCrossover)) { + addLabel(tr("Trainer lead")); + AutoComboBox *trainerLead = new AutoComboBox(this); + trainerLead->addItem(tr("Crossover"), 0); + trainerLead->addItem(tr("Standard"), 1); + trainerLead->setField(generalSettings.trainerTipOnly, this); + params->append(trainerLead); + addParams(); + } + if (firmware->getCapability(BluetoothEnabled)) { addLabel(tr("Bluetooth")); From 6798a7ca6273953b161e9979ee17710bb76a1bc3 Mon Sep 17 00:00:00 2001 From: Peter Feerick <5500713+pfeerick@users.noreply.github.com> Date: Sat, 31 Oct 2026 03:28:46 +0000 Subject: [PATCH 4/4] fix(st16): swap trainer in/out pins to match other Flysky radios ST16 had trainer in on PE5 (jack ring) and out on PE6 (jack tip), the opposite of the PL18 family and PA01, so it couldn't pair with them over the Flysky crossover lead in either direction. The schematic names PE5 PPM_IN and PE6 PPM_OUT on the MCU sheet, but the jack sheet labels the PE6 path PPM_INPUT and the PE5 path PPM_OUTPUT. Each is only a 200R series resistor plus ESD clamps, so either pin can drive or capture. Following the jack sheet gives in on the tip and out on the ring, matching the other Flysky radios. With every crossover board now having input on the tip, tip-only mode just sends on the input pin, so trainer_jack_tip_is_out is no longer needed. Co-Authored-By: Claude Opus 5.5 --- .../boards/generic_stm32/trainer_ports.cpp | 50 ++++--------------- radio/src/boards/hw_defs/st16.json | 11 ++-- radio/util/hw_defs/models.py | 1 - tools/hwdef_schema.json | 3 +- 4 files changed, 17 insertions(+), 48 deletions(-) diff --git a/radio/src/boards/generic_stm32/trainer_ports.cpp b/radio/src/boards/generic_stm32/trainer_ports.cpp index c6a8cbba7c4..07eb10c1060 100644 --- a/radio/src/boards/generic_stm32/trainer_ports.cpp +++ b/radio/src/boards/generic_stm32/trainer_ports.cpp @@ -64,27 +64,12 @@ static const stm32_pulse_timer_t trainerOutputTimer = { .DMA_TC_CallbackPtr = nullptr, }; -#if defined(TRAINER_JACK_CROSSOVER) -// Trainer in and out are on different jack contacts, meant for the crossover -// lead the radio ships with. A mono lead grounds the ring, so offer to run -// both directions on the tip instead. -#if defined(TRAINER_JACK_TIP_IS_OUT) - #define TRAINER_TIP_GPIO TRAINER_OUT_GPIO - #define TRAINER_TIP_TIMER_Channel TRAINER_OUT_TIMER_Channel -#else - #define TRAINER_TIP_GPIO TRAINER_IN_GPIO - #define TRAINER_TIP_TIMER_Channel TRAINER_IN_TIMER_Channel -#endif - -static_assert(__IS_TRAINER_TIMER_OUT_CHANNEL_SUPPORTED(TRAINER_TIP_TIMER_Channel), - "Unsupported trainer timer tip channel"); - -static const stm32_pulse_timer_t trainerTipTimer = { - .GPIO = TRAINER_TIP_GPIO, +static const stm32_pulse_timer_t trainerInputTimer = { + .GPIO = TRAINER_IN_GPIO, .GPIO_Alternate = TRAINER_GPIO_AF, .TIMx = TRAINER_TIMER, .TIM_Freq = TRAINER_TIMER_FREQ, - .TIM_Channel = TRAINER_TIP_TIMER_Channel, + .TIM_Channel = TRAINER_IN_TIMER_Channel, .TIM_IRQn = TRAINER_TIMER_IRQn, .DMAx = nullptr, .DMA_Stream = 0, @@ -92,41 +77,28 @@ static const stm32_pulse_timer_t trainerTipTimer = { .DMA_IRQn = (IRQn_Type)0, .DMA_TC_CallbackPtr = nullptr, }; + +#if defined(TRAINER_JACK_CROSSOVER) +// Trainer in is on the jack tip and out on the ring, for the crossover lead +// the radio ships with. A mono lead grounds the ring, so optionally send on +// the tip (the input pin) as well. +static_assert(__IS_TRAINER_TIMER_OUT_CHANNEL_SUPPORTED(TRAINER_IN_TIMER_Channel), + "Unsupported trainer timer input channel for tip-only output"); #endif void trainer_init_dsc_out() { #if defined(TRAINER_JACK_CROSSOVER) if (g_eeGeneral.trainerTipOnly) { - trainer_init_output(&trainerTipTimer); + trainer_init_output(&trainerInputTimer); return; } #endif trainer_init_output(&trainerOutputTimer); } -static const stm32_pulse_timer_t trainerInputTimer = { - .GPIO = TRAINER_IN_GPIO, - .GPIO_Alternate = TRAINER_GPIO_AF, - .TIMx = TRAINER_TIMER, - .TIM_Freq = TRAINER_TIMER_FREQ, - .TIM_Channel = TRAINER_IN_TIMER_Channel, - .TIM_IRQn = TRAINER_TIMER_IRQn, - .DMAx = nullptr, - .DMA_Stream = 0, - .DMA_Channel = 0, - .DMA_IRQn = (IRQn_Type)0, - .DMA_TC_CallbackPtr = nullptr, -}; - void trainer_init_dsc_in() { -#if defined(TRAINER_JACK_CROSSOVER) - if (g_eeGeneral.trainerTipOnly) { - trainer_init_capture(&trainerTipTimer); - return; - } -#endif trainer_init_capture(&trainerInputTimer); } diff --git a/radio/src/boards/hw_defs/st16.json b/radio/src/boards/hw_defs/st16.json index 340ccdae0c7..ad078c9adc9 100644 --- a/radio/src/boards/hw_defs/st16.json +++ b/radio/src/boards/hw_defs/st16.json @@ -511,17 +511,16 @@ "usb_gpio_af": "GPIO_AF10" }, "trainer": { - "trainer_in_gpio": "GPIO_PIN(GPIOE, 5)", - "trainer_in_timer_channel": "LL_TIM_CHANNEL_CH1", - "trainer_out_gpio": "GPIO_PIN(GPIOE, 6)", - "trainer_out_timer_channel": "LL_TIM_CHANNEL_CH2", + "trainer_in_gpio": "GPIO_PIN(GPIOE, 6)", + "trainer_in_timer_channel": "LL_TIM_CHANNEL_CH2", + "trainer_out_gpio": "GPIO_PIN(GPIOE, 5)", + "trainer_out_timer_channel": "LL_TIM_CHANNEL_CH1", "trainer_timer": "TIM15", "trainer_timer_irqn": "TIM15_IRQn", "trainer_timer_irqhandler": "TIM15_IRQHandler", "trainer_gpio_af": "LL_GPIO_AF_4", "trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)", - "trainer_jack_crossover": true, - "trainer_jack_tip_is_out": true + "trainer_jack_crossover": true }, "key_lock_combo": [ "KEY_EXIT", diff --git a/radio/util/hw_defs/models.py b/radio/util/hw_defs/models.py index fa0bd5e2c66..284b46fb202 100644 --- a/radio/util/hw_defs/models.py +++ b/radio/util/hw_defs/models.py @@ -364,7 +364,6 @@ class Trainer(BaseModel): trainer_detect_gpio: Optional[str] = None trainer_detect_inverted: Optional[bool] = None trainer_jack_crossover: Optional[bool] = None - trainer_jack_tip_is_out: Optional[bool] = None Input = Union[StickInput, FlexInput, SwitchInput, RawInput, VBatInput, RTCBatInput, LuxInput] diff --git a/tools/hwdef_schema.json b/tools/hwdef_schema.json index 6dcfa487c1d..c7b7cf4dd7f 100644 --- a/tools/hwdef_schema.json +++ b/tools/hwdef_schema.json @@ -481,8 +481,7 @@ "trainer_gpio_af": { "type": "string" }, "trainer_detect_gpio": { "type": "string" }, "trainer_detect_inverted": { "type": "boolean" }, - "trainer_jack_crossover": { "type": "boolean" }, - "trainer_jack_tip_is_out": { "type": "boolean" } + "trainer_jack_crossover": { "type": "boolean" } } } }