Skip to content

Commit 1cbf67f

Browse files
pfeerickclaude
andauthored
feat: selectable trainer lead wiring for Flysky radios (#7961)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent cf3cc47 commit 1cbf67f

62 files changed

Lines changed: 195 additions & 42 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎companion/src/firmwares/boardjson.cpp‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@ const int BoardJson::getCapability(const Board::Capability capability) const
238238
case Board::StatusLedColors:
239239
return m_hardware.status_led_colors;
240240

241+
case Board::HasTrainerJackCrossover:
242+
return m_hardware.trainer_jack_crossover;
243+
241244
case Board::HasStatusLedPwm:
242245
return m_hardware.status_led_pwm;
243246

@@ -1342,6 +1345,12 @@ bool BoardJson::loadFile(Board::Type board, QString hwdefn, InputsTable * inputs
13421345
hardware.cpu_type = o.value("cpu_type").toString().toStdString();
13431346
}
13441347

1348+
if (obj.value("trainer").isObject()) {
1349+
const QJsonObject &o = obj.value("trainer").toObject();
1350+
1351+
hardware.trainer_jack_crossover = o.value("trainer_jack_crossover").toBool();
1352+
}
1353+
13451354
if (obj.value("identity").isObject()) {
13461355
const QJsonObject &o = obj.value("identity").toObject();
13471356

‎companion/src/firmwares/boardjson.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class BoardJson
133133
int has_int_module_support = 0;
134134
int sport_max_baudrate = 0;
135135
int surface = 0;
136+
int trainer_jack_crossover = 0;
136137
std::string cpu = "";
137138
std::string cpu_type = "";
138139
};

‎companion/src/firmwares/boards.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ namespace Board {
254254
HasRTC,
255255
HasSDCard,
256256
HasSwitchableJack,
257+
HasTrainerJackCrossover,
257258
HasTrainerModuleCPPM,
258259
HasTrainerModuleSBUS,
259260
HasVBat,

‎companion/src/firmwares/edgetx/yaml_generalsettings.cpp‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ Node convert<GeneralSettings>::encode(const GeneralSettings& rhs)
263263
node["disableTrainerPoweroffAlarm"] = (int)rhs.disableTrainerPoweroffAlarm;
264264
node["USBMode"] = rhs.usbMode;
265265
node["usbChargeDisabled"] = (int)rhs.usbChargeDisabled;
266+
node["trainerTipOnly"] = rhs.trainerTipOnly;
266267
node["hatsMode"] = hatsModeLut << rhs.hatsMode;
267268
node["stickDeadZone"] = rhs.stickDeadZone;
268269
node["jackMode"] = rhs.jackMode;
@@ -558,6 +559,7 @@ bool convert<GeneralSettings>::decode(const Node& node, GeneralSettings& rhs)
558559
node["disableTrainerPoweroffAlarm"] >> rhs.disableTrainerPoweroffAlarm;
559560
node["USBMode"] >> rhs.usbMode;
560561
node["usbChargeDisabled"] >> rhs.usbChargeDisabled;
562+
node["trainerTipOnly"] >> rhs.trainerTipOnly;
561563
node["hatsMode"] >> hatsModeLut >> rhs.hatsMode;
562564
node["stickDeadZone"] >> rhs.stickDeadZone;
563565
node["jackMode"] >> rhs.jackMode;

‎companion/src/firmwares/generalsettings.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ class GeneralSettings {
319319
bool disableTrainerPoweroffAlarm;
320320
unsigned int usbMode;
321321
bool usbChargeDisabled;
322+
unsigned int trainerTipOnly;
322323
unsigned int hatsMode;
323324
unsigned int stickDeadZone;
324325
unsigned int jackMode;

‎companion/src/generaledit/hardware.cpp‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,16 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
225225
addParams();
226226
}
227227

228+
if (Boards::getCapability(board, Board::HasTrainerJackCrossover)) {
229+
addLabel(tr("Trainer lead"));
230+
AutoComboBox *trainerLead = new AutoComboBox(this);
231+
trainerLead->addItem(tr("Crossover"), 0);
232+
trainerLead->addItem(tr("Standard"), 1);
233+
trainerLead->setField(generalSettings.trainerTipOnly, this);
234+
params->append(trainerLead);
235+
addParams();
236+
}
237+
228238
if (firmware->getCapability(BluetoothEnabled)) {
229239
addLabel(tr("Bluetooth"));
230240

‎radio/src/boards/generic_stm32/trainer_ports.cpp‎

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,13 @@
2929
#include "dataconstants.h"
3030

3131
#include "hal.h"
32+
#include "edgetx.h"
3233

3334
__WEAK void board_trainer_init()
3435
{
3536
#if defined(TRAINER_DETECT_GPIO)
3637
gpio_init(TRAINER_DETECT_GPIO, GPIO_IN_PU, GPIO_PIN_SPEED_LOW);
37-
#endif
38+
#endif
3839

3940
trainer_init();
4041
}
@@ -63,11 +64,6 @@ static const stm32_pulse_timer_t trainerOutputTimer = {
6364
.DMA_TC_CallbackPtr = nullptr,
6465
};
6566

66-
void trainer_init_dsc_out()
67-
{
68-
trainer_init_output(&trainerOutputTimer);
69-
}
70-
7167
static const stm32_pulse_timer_t trainerInputTimer = {
7268
.GPIO = TRAINER_IN_GPIO,
7369
.GPIO_Alternate = TRAINER_GPIO_AF,
@@ -82,6 +78,25 @@ static const stm32_pulse_timer_t trainerInputTimer = {
8278
.DMA_TC_CallbackPtr = nullptr,
8379
};
8480

81+
#if defined(TRAINER_JACK_CROSSOVER)
82+
// Trainer in is on the jack tip and out on the ring, for the crossover lead
83+
// the radio ships with. A mono lead grounds the ring, so optionally send on
84+
// the tip (the input pin) as well.
85+
static_assert(__IS_TRAINER_TIMER_OUT_CHANNEL_SUPPORTED(TRAINER_IN_TIMER_Channel),
86+
"Unsupported trainer timer input channel for tip-only output");
87+
#endif
88+
89+
void trainer_init_dsc_out()
90+
{
91+
#if defined(TRAINER_JACK_CROSSOVER)
92+
if (g_eeGeneral.trainerTipOnly) {
93+
trainer_init_output(&trainerInputTimer);
94+
return;
95+
}
96+
#endif
97+
trainer_init_output(&trainerOutputTimer);
98+
}
99+
85100
void trainer_init_dsc_in()
86101
{
87102
trainer_init_capture(&trainerInputTimer);

‎radio/src/boards/hw_defs/el18.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@
404404
"trainer_timer_irqn": "TIM4_IRQn",
405405
"trainer_timer_irqhandler": "TIM4_IRQHandler",
406406
"trainer_gpio_af": "LL_GPIO_AF_2",
407-
"trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)"
407+
"trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)",
408+
"trainer_jack_crossover": true
408409
}
409410
}

‎radio/src/boards/hw_defs/nb4p.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@
267267
"trainer_timer_irqn": "TIM4_IRQn",
268268
"trainer_timer_irqhandler": "TIM4_IRQHandler",
269269
"trainer_gpio_af": "LL_GPIO_AF_2",
270-
"trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)"
270+
"trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)",
271+
"trainer_jack_crossover": true
271272
}
272273
}

‎radio/src/boards/hw_defs/nv14.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@
404404
"trainer_timer_irqn": "TIM4_IRQn",
405405
"trainer_timer_irqhandler": "TIM4_IRQHandler",
406406
"trainer_gpio_af": "LL_GPIO_AF_2",
407-
"trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)"
407+
"trainer_timer_freq": "(PERI1_FREQUENCY * TIMER_MULT_APB1)",
408+
"trainer_jack_crossover": true
408409
}
409410
}

0 commit comments

Comments
 (0)