Skip to content

Commit 6b1cd88

Browse files
3djcelecpower
andauthored
fix(f4): limit CRSF external module speed to 3.75Mbps (#6923)
Co-authored-by: elecpower <elecpower@users.noreply.github.com>
1 parent 0087e25 commit 6b1cd88

File tree

9 files changed

+86
-48
lines changed

9 files changed

+86
-48
lines changed

companion/src/firmwares/boards.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,3 +859,8 @@ inline bool IS_STM32H7(Board::Type board)
859859
IS_JUMPER_T15PRO(board) ||
860860
IS_RADIOMASTER_TX15(board);
861861
}
862+
863+
inline bool IS_STM32F2F4(Board::Type board)
864+
{
865+
return (!IS_STM32H5(board) && !IS_STM32H7(board));
866+
}

companion/src/firmwares/edgetx/yaml_modeldata.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1504,6 +1504,12 @@ bool convert<ModelData>::decode(const Node& node, ModelData& rhs)
15041504
rhs.moduleData[i].modelId = modelIds[i];
15051505
}
15061506

1507+
// v2.12 CRSF limit external module to 3.75M for older boards
1508+
if (IS_STM32F2F4(board) &&
1509+
rhs.moduleData[1].protocol == PULSES_CROSSFIRE &&
1510+
rhs.moduleData[1].crsf.telemetryBaudrate > 4)
1511+
rhs.moduleData[1].crsf.telemetryBaudrate = 4;
1512+
15071513
if (node["failsafeChannels"]) {
15081514
int failsafeChans[CPN_MAX_CHNOUT];
15091515
memset(failsafeChans, 0, sizeof(failsafeChans));

companion/src/firmwares/moduledata.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,12 +641,16 @@ AbstractStaticItemModel * ModuleData::protocolItemModel(GeneralSettings & settin
641641
return mdl;
642642
}
643643

644-
AbstractStaticItemModel * ModuleData::telemetryBaudrateItemModel(unsigned int protocol)
644+
AbstractStaticItemModel * ModuleData::telemetryBaudrateItemModel(unsigned int protocol, int moduleIdx, int board)
645645
{
646646
AbstractStaticItemModel * mdl = new AbstractStaticItemModel();
647647
mdl->setName("moduledata.baudrate");
648648

649649
for (int i = 0; i < moduleBaudratesList.size(); i++) {
650+
// CRSF limit external module to 3.75M for older boards
651+
if (protocol == PULSES_CROSSFIRE && moduleIdx == 1 &&
652+
IS_STM32F2F4((Board::Type)board) && i > 4) break;
653+
650654
if (protocol == PULSES_GHOST && i >= 2) break;
651655
mdl->appendToItemList(moduleBaudratesList.at(i), i);
652656
}

companion/src/firmwares/moduledata.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ class ModuleData {
235235
static AbstractStaticItemModel * internalModuleItemModel(int board = -1);
236236
static bool isProtocolAvailable(int moduleidx, unsigned int protocol, GeneralSettings & generalSettings);
237237
static AbstractStaticItemModel * protocolItemModel(GeneralSettings & settings);
238-
static AbstractStaticItemModel * telemetryBaudrateItemModel(unsigned int protocol);
238+
static AbstractStaticItemModel * telemetryBaudrateItemModel(unsigned int protocol, int moduleIdx = -1, int board = 0);
239239
static bool isAvailable(PulsesProtocol proto, int port = 0); // moved from OpenTxFirmware EdgeTX v2.9 - TODO remove and use isProtocolAvailable
240240

241241
QString afhds2aMode1ToString() const;

companion/src/modeledit/setup_module.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ void ModulePanel::update()
352352
case PULSES_CROSSFIRE:
353353
mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_BAUDRATE | MASK_CSRF_ARMING_MODE;
354354
module.channelsCount = 16;
355-
ui->telemetryBaudrate->setModel(ModuleData::telemetryBaudrateItemModel(protocol));
355+
ui->telemetryBaudrate->setModel(ModuleData::telemetryBaudrateItemModel(protocol, moduleIdx, board));
356356
ui->telemetryBaudrate->setField(module.crsf.telemetryBaudrate);
357357
ui->crsfArmingMode->setCurrentIndex(module.crsf.crsfArmingMode);
358358
if (module.crsf.crsfArmingMode == ModuleData::CRSF_ARMING_MODE_SWITCH) {
@@ -428,10 +428,13 @@ void ModulePanel::update()
428428
mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT;
429429
}
430430

431-
if (isExternalModule(moduleIdx))
431+
if (isExternalModule(moduleIdx)) {
432+
ui->label_baudrate->setVisible(mask & MASK_BAUDRATE);
432433
ui->telemetryBaudrate->setVisible(mask & MASK_BAUDRATE);
433-
else
434+
} else {
435+
ui->label_baudrate->setVisible(false);
434436
ui->telemetryBaudrate->setVisible(false);
437+
}
435438

436439
ui->label_protocol->setVisible(mask & MASK_PROTOCOL);
437440
ui->protocol->setVisible(mask & MASK_PROTOCOL);

0 commit comments

Comments
 (0)