From 18779a86d7edb0c1c72df3e13242b651e4324b37 Mon Sep 17 00:00:00 2001 From: Roberto Viola Date: Mon, 27 Apr 2026 11:25:43 +0200 Subject: [PATCH 1/2] proform 550r rowing --- src/devices/proformrower/proformrower.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/devices/proformrower/proformrower.cpp b/src/devices/proformrower/proformrower.cpp index b44ba1ed17..a68d4ff0c1 100644 --- a/src/devices/proformrower/proformrower.cpp +++ b/src/devices/proformrower/proformrower.cpp @@ -595,7 +595,8 @@ void proformrower::characteristicChanged(const QLowEnergyCharacteristic &charact } if (newValue.length() != 20 || newValue.at(0) != 0x00 || newValue.at(1) != 0x12 || newValue.at(2) != 0x01 || - newValue.at(3) != 0x04 || newValue.at(4) != 0x02 || (newValue.at(5) != 0x2e && newValue.at(5) != 0x30) || + newValue.at(3) != 0x04 || newValue.at(4) != 0x02 || + (newValue.at(5) != 0x2e && newValue.at(5) != 0x30 && newValue.at(5) != 0x31) || (((uint8_t)newValue.at(12)) == 0xFF && ((uint8_t)newValue.at(13)) == 0xFF && ((uint8_t)newValue.at(14)) == 0xFF && ((uint8_t)newValue.at(15)) == 0xFF && ((uint8_t)newValue.at(16)) == 0xFF && ((uint8_t)newValue.at(17)) == 0xFF && From b8cee458aacf77696ced1396aa66374f9b36d673 Mon Sep 17 00:00:00 2001 From: Roberto Viola Date: Mon, 27 Apr 2026 15:30:14 +0200 Subject: [PATCH 2/2] Update proformrower.cpp --- src/devices/proformrower/proformrower.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/devices/proformrower/proformrower.cpp b/src/devices/proformrower/proformrower.cpp index a68d4ff0c1..476050ebae 100644 --- a/src/devices/proformrower/proformrower.cpp +++ b/src/devices/proformrower/proformrower.cpp @@ -580,12 +580,23 @@ void proformrower::characteristicChanged(const QLowEnergyCharacteristic &charact lastPacket = newValue; if (newValue.length() == 20 && (uint8_t)newValue.at(0) == 0xff && newValue.at(1) == 0x11) { - Cadence = (uint8_t)(newValue.at(12)); + const bool rowerTelemetryFrame = (uint8_t)newValue.at(2) == 0 && (uint8_t)newValue.at(3) == 0 && + (uint8_t)newValue.at(4) == 0 && (uint8_t)newValue.at(5) == 0 && + (uint8_t)newValue.at(6) == 0 && (uint8_t)newValue.at(7) == 0 && + (uint8_t)newValue.at(8) == 0 && (uint8_t)newValue.at(9) == 0; + if (!rowerTelemetryFrame) { + return; + } + const uint8_t cadence = (uint8_t)(newValue.at(12)); + uint16_t s = (((uint16_t)((uint8_t)newValue.at(14)) << 8) + (uint16_t)((uint8_t)newValue.at(13))); + if (cadence == 0 && s > 0) { + return; + } + Cadence = cadence; StrokesCount += (Cadence.value()) * ((double)lastRefreshCharacteristicChanged.msecsTo(now)) / 60000; emit debug(QStringLiteral("Current Cadence: ") + QString::number(Cadence.value())); emit debug(QStringLiteral("Strokes Count: ") + QString::number(StrokesCount.value())); - uint16_t s = (((uint16_t)((uint8_t)newValue.at(14)) << 8) + (uint16_t)((uint8_t)newValue.at(13))); if (s > 0) Speed = (60.0 / (double)(s)) * 30.0; else