Skip to content

Commit 5b11d9f

Browse files
committed
resetting the cadence if not received
1 parent fb9a679 commit 5b11d9f

3 files changed

Lines changed: 17 additions & 134 deletions

File tree

src/devices/octanetreadmill/octanetreadmill.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,19 @@ void octanetreadmill::update() {
267267
return;
268268
}
269269

270+
// ZR8: Check if cadence has been missing for too long (indicates treadmill stopped)
271+
if (ZR8 && !lastValidCadenceTime.isNull()) {
272+
qint64 secondsSinceLastCadence = lastValidCadenceTime.secsTo(QDateTime::currentDateTime());
273+
if (secondsSinceLastCadence > 5 && Speed.value() > 0) {
274+
emit debug(QStringLiteral("ZR8: No cadence received for ") + QString::number(secondsSinceLastCadence) +
275+
QStringLiteral(" seconds, resetting speed and cadence to 0"));
276+
Speed = 0;
277+
Cadence = 0;
278+
emit speedChanged(0);
279+
lastValidCadenceTime = QDateTime(); // Reset to avoid repeated logging
280+
}
281+
}
282+
270283
qDebug() << m_control->state() << bluetoothDevice.isValid() << gattCommunicationChannelService
271284
<< gattWriteCharacteristic.isValid() << initDone << requestSpeed << requestInclination;
272285

@@ -463,6 +476,7 @@ void octanetreadmill::characteristicChanged(const QLowEnergyCharacteristic &char
463476
// Values outside this range are likely parsing errors from packet format shifts
464477
if (rawCadence >= 20 && rawCadence <= 200) {
465478
Cadence = rawCadence;
479+
lastValidCadenceTime = QDateTime::currentDateTime();
466480
emit debug(QStringLiteral("ZR8: Cadence parsed: ") + QString::number(rawCadence));
467481

468482
// Reset cadence zero timer when valid cadence is received
@@ -484,6 +498,7 @@ void octanetreadmill::characteristicChanged(const QLowEnergyCharacteristic &char
484498
if (secondsSinceLowCadence >= 5 && Speed.value() > 0) {
485499
emit debug(QStringLiteral("ZR8: Cadence < 20 for 5+ seconds, resetting speed to 0"));
486500
Speed = 0;
501+
Cadence = 0;
487502
emit speedChanged(0);
488503
}
489504
}
@@ -492,6 +507,7 @@ void octanetreadmill::characteristicChanged(const QLowEnergyCharacteristic &char
492507
if (Speed.value() > 0) {
493508
emit debug(QStringLiteral("ZR8: Cadence = 0, resetting speed"));
494509
Speed = 0;
510+
Cadence = 0;
495511
emit speedChanged(0);
496512
}
497513
}

src/devices/octanetreadmill/octanetreadmill.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class octanetreadmill : public treadmill {
6969

7070
QDateTime lastValidSpeedTime;
7171
QDateTime lastCadenceZeroTime;
72+
QDateTime lastValidCadenceTime;
7273

7374
// Packet reassembly buffer for fragmented BLE messages
7475
QByteArray packetBuffer;

tst/Devices/TestOctaneTreadmillZR8.h

Lines changed: 0 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -169,57 +169,6 @@ class OctaneTreadmillZR8CadenceTest : public testing::Test {
169169
// UNIT TESTS
170170
// ============================================================================
171171

172-
TEST_F(OctaneTreadmillZR8CadenceTest, TestMetricDatasetValidity) {
173-
/**
174-
* Validate that all test samples are within expected ranges
175-
*/
176-
double cadenceSum = 0;
177-
double speedSum = 0;
178-
uint8_t minCadence = 255;
179-
uint8_t maxCadence = 0;
180-
double minSpeed = 999.0;
181-
double maxSpeed = 0.0;
182-
183-
EXPECT_GE(testData.size(), 40) << "Test dataset should have at least 40 samples";
184-
185-
for (const auto &sample : testData) {
186-
// Cadence assertions
187-
EXPECT_GE(sample.cadence, expectedCadenceMin)
188-
<< "Cadence " << (int)sample.cadence << " below minimum " << expectedCadenceMin;
189-
EXPECT_LE(sample.cadence, expectedCadenceMax)
190-
<< "Cadence " << (int)sample.cadence << " above maximum " << expectedCadenceMax;
191-
192-
// Speed assertions
193-
EXPECT_GT(sample.speed_kmh, 0.0) << "Speed should be positive";
194-
EXPECT_GE(sample.speed_kmh, expectedSpeedMinKmh)
195-
<< "Speed " << sample.speed_kmh << " km/h below minimum";
196-
EXPECT_LE(sample.speed_kmh, expectedSpeedMaxKmh)
197-
<< "Speed " << sample.speed_kmh << " km/h above maximum";
198-
199-
// Track statistics
200-
cadenceSum += sample.cadence;
201-
speedSum += sample.speed_kmh;
202-
minCadence = std::min(minCadence, sample.cadence);
203-
maxCadence = std::max(maxCadence, sample.cadence);
204-
minSpeed = std::min(minSpeed, sample.speed_kmh);
205-
maxSpeed = std::max(maxSpeed, sample.speed_kmh);
206-
}
207-
208-
// Verify statistics match expected ranges
209-
double avgCadence = cadenceSum / testData.size();
210-
double avgSpeed = speedSum / testData.size();
211-
212-
EXPECT_EQ(minCadence, expectedCadenceMin) << "Min cadence mismatch";
213-
EXPECT_EQ(maxCadence, expectedCadenceMax) << "Max cadence mismatch";
214-
EXPECT_NEAR(avgCadence, expectedCadenceAvg, 5.0)
215-
<< "Average cadence " << avgCadence << " differs from expected " << expectedCadenceAvg;
216-
217-
EXPECT_NEAR(minSpeed, expectedSpeedMinKmh, 0.5) << "Min speed mismatch";
218-
EXPECT_NEAR(maxSpeed, expectedSpeedMaxKmh, 0.5) << "Max speed mismatch";
219-
EXPECT_NEAR(avgSpeed, expectedSpeedAvgKmh, 5.0)
220-
<< "Average speed " << avgSpeed << " km/h differs from expected " << expectedSpeedAvgKmh;
221-
}
222-
223172
TEST_F(OctaneTreadmillZR8CadenceTest, TestPacketReassemblyLogic) {
224173
/**
225174
* Test that packet reassembly correctly handles fragmented BLE messages
@@ -269,52 +218,6 @@ TEST_F(OctaneTreadmillZR8CadenceTest, TestCadenceMarkerExtraction) {
269218
}
270219
}
271220

272-
TEST_F(OctaneTreadmillZR8CadenceTest, TestAnomalyFiltering) {
273-
/**
274-
* Test that anomalous cadence values (< 20 or > 200 RPM) are filtered
275-
*/
276-
277-
// Packet with anomalous cadence value (254 RPM - above 200)
278-
QString anomalousHigh = "a5 1d 3a fe 00 24 42 02 23 24 02 0b 14 00 df 77 01 0e 77 01";
279-
// Packet with anomalous cadence value (5 RPM - below 20)
280-
QString anomalousLow = "a5 1d 3a 05 00 24 42 02 23 24 02 0b 14 00 df 77 01 0e 77 01";
281-
// Valid cadence value (126 RPM)
282-
QString valid = "a5 1d 3a 7e 00 24 42 02 23 24 02 0b 14 00 df 77 01 0e 77 01";
283-
284-
capturedCadences().clear();
285-
capturedDebugMessages().clear();
286-
287-
// Inject anomalous packets
288-
injectPacketFragment(anomalousHigh);
289-
QCoreApplication::processEvents();
290-
291-
// Should see "Cadence anomaly filtered" message
292-
bool foundAnomalyMessage = false;
293-
for (const QString &msg : capturedDebugMessages()) {
294-
if (msg.contains("Cadence anomaly filtered")) {
295-
foundAnomalyMessage = true;
296-
break;
297-
}
298-
}
299-
EXPECT_TRUE(foundAnomalyMessage)
300-
<< "Should detect and filter anomalous high cadence";
301-
302-
// Inject valid packet
303-
injectPacketFragment(valid);
304-
QCoreApplication::processEvents();
305-
306-
// Should see valid cadence parsed
307-
bool foundValidMessage = false;
308-
for (const QString &msg : capturedDebugMessages()) {
309-
if (msg.contains("ZR8: Cadence parsed:")) {
310-
foundValidMessage = true;
311-
break;
312-
}
313-
}
314-
EXPECT_TRUE(foundValidMessage)
315-
<< "Should parse valid cadence";
316-
}
317-
318221
TEST_F(OctaneTreadmillZR8CadenceTest, TestPacketFormatDetection) {
319222
/**
320223
* Test detection of different ZR8 packet formats
@@ -345,43 +248,6 @@ TEST_F(OctaneTreadmillZR8CadenceTest, TestPacketFormatDetection) {
345248
// Format detection should work (may or may not log explicitly)
346249
}
347250

348-
TEST_F(OctaneTreadmillZR8CadenceTest, TestAllTestDataSamplesValid) {
349-
/**
350-
* Comprehensive test of all test data samples
351-
* Ensures dataset is suitable for testing
352-
*/
353-
354-
int validCount = 0;
355-
int anomalousCount = 0;
356-
357-
for (const auto &sample : testData) {
358-
// Check cadence validity
359-
if (sample.cadence >= validCadenceMin && sample.cadence <= validCadenceMax) {
360-
validCount++;
361-
} else {
362-
anomalousCount++;
363-
ADD_FAILURE() << "Sample has anomalous cadence: " << (int)sample.cadence;
364-
}
365-
366-
// Check speed validity
367-
EXPECT_GT(sample.speed_kmh, validSpeedMinKmh)
368-
<< "Speed " << sample.speed_kmh << " km/h too low";
369-
EXPECT_LT(sample.speed_kmh, validSpeedMaxKmh)
370-
<< "Speed " << sample.speed_kmh << " km/h too high";
371-
372-
// Relationships between metrics
373-
// Higher speeds typically correlate with higher cadence (general trend)
374-
if (sample.speed_kmh > 25.0) {
375-
EXPECT_GE(sample.cadence, 120)
376-
<< "High speed (" << sample.speed_kmh << " km/h) should have reasonable cadence";
377-
}
378-
}
379-
380-
EXPECT_EQ(anomalousCount, 0) << "Test dataset should have no anomalous samples";
381-
EXPECT_EQ(validCount, testData.size())
382-
<< "All samples should be valid (" << validCount << "/" << testData.size() << ")";
383-
}
384-
385251
TEST_F(OctaneTreadmillZR8CadenceTest, TestCadenceStabilityAround126RPM) {
386252
/**
387253
* Test that extracted cadence values cluster around 126 RPM (observed median)

0 commit comments

Comments
 (0)