From a3407ccbea3d3d5500881d2e2bdebe309a834db1 Mon Sep 17 00:00:00 2001 From: frazou Date: Sun, 16 Nov 2025 22:04:02 +0100 Subject: [PATCH] Add an optional filter for invalid (0 bpm) heart rate readings --- .../java/de/dennisguse/opentracks/data/models/HeartRate.java | 5 +++++ .../opentracks/sensors/sensorData/AggregatorHeartRate.java | 4 +++- .../opentracks/sensors/sensorData/SensorDataSet.java | 3 ++- .../services/announcement/VoiceAnnouncementUtils.java | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/data/models/HeartRate.java b/src/main/java/de/dennisguse/opentracks/data/models/HeartRate.java index 622eda7c1..ea1f4d2b0 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/HeartRate.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/HeartRate.java @@ -1,6 +1,7 @@ package de.dennisguse.opentracks.data.models; public record HeartRate(float value) { + public static HeartRate INVALID = HeartRate.of(0.0f); public static HeartRate of(float value) { return new HeartRate(value); @@ -9,4 +10,8 @@ public record HeartRate(float value) { public float getBPM() { return value; } + + public boolean isValid() { + return !this.equals(INVALID); + } } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorHeartRate.java b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorHeartRate.java index c46434f88..22c7bea24 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorHeartRate.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorHeartRate.java @@ -12,7 +12,9 @@ public class AggregatorHeartRate extends Aggregator { @Override protected void computeValue(Raw current) { - this.aggregatedValue = current.value(); + if (current.value().isValid()) { + this.aggregatedValue = current.value(); + } } @Override diff --git a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataSet.java b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataSet.java index eacfc9e49..3cf3b8058 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataSet.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataSet.java @@ -64,7 +64,8 @@ public class SensorDataSet { public Pair getHeartRate() { if (heartRate != null) { - return heartRate.getAggregatedValueWithSensorName(trackPointCreator.createNow()); + Pair value = heartRate.getAggregatedValueWithSensorName(trackPointCreator.createNow()); + if (value.first.isValid()) return value; } return null; diff --git a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java index 1c17fc3e2..c14514f86 100644 --- a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java +++ b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java @@ -161,7 +161,7 @@ class VoiceAnnouncementUtils { } Pair heartrate = sensorDataSet.getHeartRate(); - if (shouldVoiceAnnounceHeartRateCurrent() && heartrate != null && heartrate.first != null) { //TODO Check has an announcable value? + if (shouldVoiceAnnounceHeartRateCurrent() && heartrate != null && heartrate.first != null && heartrate.first.isValid()) { //TODO Check has an announcable value? int averageHeartRate = Math.round(heartrate.first.getBPM()); builder.append(" ")