From 22c5b8628666dbea26bebf99418be162c9f2b2f0 Mon Sep 17 00:00:00 2001 From: Roberto Viola Date: Mon, 27 Apr 2026 13:38:38 +0200 Subject: [PATCH 1/3] Toorx Speed Mag Pro --- src/devices/ftmsbike/ftmsbike.cpp | 6 ++++-- src/devices/ftmsbike/ftmsbike.h | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/devices/ftmsbike/ftmsbike.cpp b/src/devices/ftmsbike/ftmsbike.cpp index 591e7c7c7d..26865517ff 100644 --- a/src/devices/ftmsbike/ftmsbike.cpp +++ b/src/devices/ftmsbike/ftmsbike.cpp @@ -131,7 +131,7 @@ void ftmsbike::init() { if (initDone) return; - if(ICSE || HAMMER) { + if(ICSE || HAMMER || SPEEDMAGPRO) { uint8_t write[] = {FTMS_REQUEST_CONTROL}; bool ret = writeCharacteristic(write, sizeof(write), "requestControl", false, true); write[0] = {FTMS_RESET}; @@ -2026,9 +2026,11 @@ void ftmsbike::deviceDiscovered(const QBluetoothDeviceInfo &device) { ergModeSupported = false; max_resistance = 32; _ergTable.loadDefaultData(kSpeedRaceXDefaultErgData); + } else if(device.name().toUpper().startsWith("SPEEDMAGPRO")) { + qDebug() << QStringLiteral("SPEEDMAGPRO found"); + SPEEDMAGPRO = true; } - if(settings.value(QZSettings::force_resistance_instead_inclination, QZSettings::default_force_resistance_instead_inclination).toBool()) { resistance_lvl_mode = true; } diff --git a/src/devices/ftmsbike/ftmsbike.h b/src/devices/ftmsbike/ftmsbike.h index 70806043e7..e980644f60 100644 --- a/src/devices/ftmsbike/ftmsbike.h +++ b/src/devices/ftmsbike/ftmsbike.h @@ -183,6 +183,7 @@ class ftmsbike : public bike { bool S18 = false; bool ZIPRO_RAVE = false; bool SPEEDRACEX = false; + bool SPEEDMAGPRO = false; uint8_t secondsToResetTimer = 5; From b2b915f7bfb6b8b6040deb2dc81e6920a8b71443 Mon Sep 17 00:00:00 2001 From: Roberto Viola Date: Mon, 27 Apr 2026 16:20:24 +0200 Subject: [PATCH 2/3] allowing only simparms and power commands --- src/devices/ftmsbike/ftmsbike.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/devices/ftmsbike/ftmsbike.cpp b/src/devices/ftmsbike/ftmsbike.cpp index 26865517ff..db79f5cbd7 100644 --- a/src/devices/ftmsbike/ftmsbike.cpp +++ b/src/devices/ftmsbike/ftmsbike.cpp @@ -1779,6 +1779,11 @@ void ftmsbike::ftmsCharacteristicChanged(const QLowEnergyCharacteristic &charact qDebug() << "applying gears mod" << gears() << gearsZwiftRatio() << power; }*/ + if(SPEEDMAGPRO && b.at(0) != FTMS_SET_INDOOR_BIKE_SIMULATION_PARAMS && b.at(0) != FTMS_SET_TARGET_POWER) { + qDebug() << "SpeedMagPro bike workaround: only allowing simulation params and power commands, discarding the rest"; + return; + } + writeCharacteristic((uint8_t*)b.data(), b.length(), "injectWrite ", false, true); } } From 7d0ac40e2a52563c9e6d00363febfd80e3b18405 Mon Sep 17 00:00:00 2001 From: Roberto Viola Date: Tue, 28 Apr 2026 12:28:59 +0200 Subject: [PATCH 3/3] Update ftmsbike.cpp --- src/devices/ftmsbike/ftmsbike.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/devices/ftmsbike/ftmsbike.cpp b/src/devices/ftmsbike/ftmsbike.cpp index db79f5cbd7..d5e33dd022 100644 --- a/src/devices/ftmsbike/ftmsbike.cpp +++ b/src/devices/ftmsbike/ftmsbike.cpp @@ -2033,6 +2033,7 @@ void ftmsbike::deviceDiscovered(const QBluetoothDeviceInfo &device) { _ergTable.loadDefaultData(kSpeedRaceXDefaultErgData); } else if(device.name().toUpper().startsWith("SPEEDMAGPRO")) { qDebug() << QStringLiteral("SPEEDMAGPRO found"); + ergModeSupported = false; SPEEDMAGPRO = true; }