From 807ac3fc9f6a9691e503740e827c7e55c063ec6c Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Fri, 1 Jul 2022 16:22:07 +0200 Subject: [PATCH] Remove UnitConversions for time/durations. --- .../opentracks/data/TrackSelectionTest.java | 3 +- .../ui/intervals/IntervalStatisticsTest.java | 3 +- .../opentracks/chart/ChartPoint.java | 3 +- .../opentracks/data/models/Cadence.java | 29 ++++++++++++++----- .../opentracks/data/models/Speed.java | 2 +- .../data/models/UnitConversions.java | 22 ++------------ .../sensors/sensorData/SensorDataCycling.java | 11 ++++--- .../stats/TrackStatisticsUpdater.java | 3 +- 8 files changed, 35 insertions(+), 41 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/data/TrackSelectionTest.java b/src/androidTest/java/de/dennisguse/opentracks/data/TrackSelectionTest.java index e73ca914e..b710b1a8c 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/data/TrackSelectionTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/data/TrackSelectionTest.java @@ -7,6 +7,7 @@ import junit.framework.TestCase; import org.junit.Test; import org.junit.runner.RunWith; +import java.time.Duration; import java.time.Instant; import de.dennisguse.opentracks.data.models.Track; @@ -105,7 +106,7 @@ public class TrackSelectionTest extends TestCase { long oneDay = 24 * 60 * 60 * 1000; TrackSelection filterWrong1 = new TrackSelection().addDateRange(instant, null); TrackSelection filterWrong2 = new TrackSelection().addDateRange(null, instant); - TrackSelection filterOk = new TrackSelection().addDateRange(instant, instant.plusMillis(oneDay)); + TrackSelection filterOk = new TrackSelection().addDateRange(instant, instant.plus(Duration.ofDays(1))); // when SelectionData selectionWrong1 = filterWrong1.buildSelection(); diff --git a/src/androidTest/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsTest.java b/src/androidTest/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsTest.java index 606cfa721..58b29f422 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsTest.java @@ -21,7 +21,6 @@ import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; -import de.dennisguse.opentracks.data.models.UnitConversions; import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.stats.TrackStatisticsUpdater; @@ -180,7 +179,7 @@ public class IntervalStatisticsTest { // then assertEquals(trackStatistics.getTotalDistance().toM(), totalDistance.toM(), 0.01); - assertEquals(trackStatistics.getTotalTime().toMillis(), totalTime * UnitConversions.S_TO_MS, 1); + assertEquals(trackStatistics.getTotalTime().toSeconds(), totalTime, 0.01); assertEquals(intervalList.size(), (int) Math.ceil(trackStatistics.getTotalDistance().toM() / distanceInterval)); if (totalGain != null) { assertEquals(totalGain, numberOfPoints * TestDataUtil.ALTITUDE_GAIN, 0.1); diff --git a/src/main/java/de/dennisguse/opentracks/chart/ChartPoint.java b/src/main/java/de/dennisguse/opentracks/chart/ChartPoint.java index 80bea370a..af44edb12 100644 --- a/src/main/java/de/dennisguse/opentracks/chart/ChartPoint.java +++ b/src/main/java/de/dennisguse/opentracks/chart/ChartPoint.java @@ -6,7 +6,6 @@ import androidx.annotation.VisibleForTesting; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Speed; import de.dennisguse.opentracks.data.models.TrackPoint; -import de.dennisguse.opentracks.data.models.UnitConversions; import de.dennisguse.opentracks.settings.UnitSystem; import de.dennisguse.opentracks.stats.TrackStatistics; @@ -41,7 +40,7 @@ public class ChartPoint { if (smoothedSpeed != null) { speed = smoothedSpeed.to(unitSystem); - pace = smoothedSpeed.toPace(unitSystem).toMillis() * UnitConversions.MS_TO_S * UnitConversions.S_TO_MIN; + pace = smoothedSpeed.toPace(unitSystem).toSeconds() / 60d; } if (trackPoint.hasHeartRate()) { heartRate = (double) trackPoint.getHeartRate().getBPM(); diff --git a/src/main/java/de/dennisguse/opentracks/data/models/Cadence.java b/src/main/java/de/dennisguse/opentracks/data/models/Cadence.java index fcf3c7155..c1bb33745 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Cadence.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Cadence.java @@ -2,22 +2,35 @@ package de.dennisguse.opentracks.data.models; import androidx.annotation.NonNull; +import java.time.Duration; import java.util.Objects; public class Cadence { - public static Cadence of(float value) { - return new Cadence(value); + public static Cadence of(float value, Duration duration) { + if (duration.isZero()) { + return zero(); + } + + return new Cadence(value / (duration.toMillis() / (float) Duration.ofMinutes(1).toMillis())); } - private final float value; + public static Cadence of(float value_rpm) { + return new Cadence(value_rpm); + } + + public static Cadence zero() { + return of(0.0f); + } + + private final float value_rpm; private Cadence(float value) { - this.value = value; + this.value_rpm = value; } public float getRPM() { - return value; + return value_rpm; } @Override @@ -25,19 +38,19 @@ public class Cadence { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Cadence cadence = (Cadence) o; - return Float.compare(cadence.value, value) == 0; + return Float.compare(cadence.value_rpm, value_rpm) == 0; } @Override public int hashCode() { - return Objects.hash(value); + return Objects.hash(value_rpm); } @NonNull @Override public String toString() { return "Cadence{" + - "value=" + value + " rpm" + + "value=" + value_rpm + " rpm" + '}'; } } diff --git a/src/main/java/de/dennisguse/opentracks/data/models/Speed.java b/src/main/java/de/dennisguse/opentracks/data/models/Speed.java index 0aaf47b80..a8635d6e3 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Speed.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Speed.java @@ -15,7 +15,7 @@ public class Speed { return zero(); } - return new Speed(distance.toM() / (duration.toMillis() * UnitConversions.MS_TO_S)); + return new Speed(distance.toM() / (duration.toMillis() / (double) Duration.ofSeconds(1).toMillis())); } public static Speed of(double speed_mps) { diff --git a/src/main/java/de/dennisguse/opentracks/data/models/UnitConversions.java b/src/main/java/de/dennisguse/opentracks/data/models/UnitConversions.java index 033fcafb7..7c877224d 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/UnitConversions.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/UnitConversions.java @@ -15,6 +15,8 @@ */ package de.dennisguse.opentracks.data.models; +import java.time.Duration; + /** * Unit conversion constants. * @@ -22,24 +24,6 @@ package de.dennisguse.opentracks.data.models; */ public class UnitConversions { - // Time //TODO Use Duration - // multiplication factor to convert seconds to milliseconds - @Deprecated - public static final long S_TO_MS = 1000; - - // multiplication factor to convert milliseconds to seconds - @Deprecated - public static final double MS_TO_S = 1d / S_TO_MS; - // multiplication factor to convert minutes to seconds - @Deprecated - public static final double MIN_TO_S = 60.0; - // multiplication factor to convert seconds to minutes - @Deprecated - public static final double S_TO_MIN = 1 / MIN_TO_S; - // multiplication factor to convert minutes to hours - @Deprecated - public static final double MIN_TO_HR = 1 / 60.0; - // multiplication factor to convert kilometers to miles public static final double KM_TO_MI = 0.621371192; @@ -58,7 +42,7 @@ public class UnitConversions { public static final double M_TO_NAUTICAL_MILE = 1 / NAUTICAL_MILE_TO_M; public static final double KM_TO_NAUTICAL_MILE = 1000 * M_TO_NAUTICAL_MILE; // multiplication factor to convert meters per second to kilometers per hour - public static final double MPS_TO_KMH = M_TO_KM / (S_TO_MIN * MIN_TO_HR); + public static final double MPS_TO_KMH = M_TO_KM / (1d / Duration.ofHours(1).toSeconds()); // multiplication factor to convert miles to km public static final double MI_TO_KM = 1 / KM_TO_MI; // multiplication factor to convert miles to m diff --git a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataCycling.java b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataCycling.java index 9337bef47..1d3ad400b 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataCycling.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataCycling.java @@ -11,7 +11,6 @@ import java.time.Duration; import de.dennisguse.opentracks.data.models.Cadence; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Speed; -import de.dennisguse.opentracks.data.models.UnitConversions; import de.dennisguse.opentracks.sensors.UintUtils; /** @@ -68,8 +67,9 @@ public final class SensorDataCycling { public void compute(CyclingCadence previous) { if (hasData() && previous != null && previous.hasData()) { - float timeDiff_ms = UintUtils.diff(crankRevolutionsTime, previous.crankRevolutionsTime, UintUtils.UINT16_MAX) / 1024f * UnitConversions.S_TO_MS; - if (timeDiff_ms <= 0) { + float timeDiff_ms = UintUtils.diff(crankRevolutionsTime, previous.crankRevolutionsTime, UintUtils.UINT16_MAX) / 1024f * 1000; + Duration timeDiff = Duration.ofMillis((long) timeDiff_ms); + if (timeDiff.isZero() || timeDiff.isNegative()) { Log.e(TAG, "Timestamps difference is invalid: cannot compute cadence."); value = null; return; @@ -82,8 +82,7 @@ public final class SensorDataCycling { } long crankDiff = UintUtils.diff(crankRevolutionsCount, previous.crankRevolutionsCount, UintUtils.UINT32_MAX); - float cadence_ms = crankDiff / timeDiff_ms; - value = Cadence.of((float) (cadence_ms / UnitConversions.MS_TO_S / UnitConversions.S_TO_MIN)); + value = Cadence.of(crankDiff, timeDiff); } } @@ -147,7 +146,7 @@ public final class SensorDataCycling { public void compute(DistanceSpeed previous, Distance wheelCircumference) { if (hasData() && previous != null && previous.hasData()) { - float timeDiff_ms = UintUtils.diff(wheelRevolutionsTime, previous.wheelRevolutionsTime, UintUtils.UINT16_MAX) / 1024f * UnitConversions.S_TO_MS; + float timeDiff_ms = UintUtils.diff(wheelRevolutionsTime, previous.wheelRevolutionsTime, UintUtils.UINT16_MAX) / 1024f * 1000; Duration timeDiff = Duration.ofMillis((long) timeDiff_ms); if (timeDiff.isZero() || timeDiff.isNegative()) { Log.e(TAG, "Timestamps difference is invalid: cannot compute speed."); diff --git a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java index c038cee66..833ad47c4 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java +++ b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java @@ -27,7 +27,6 @@ import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.HeartRate; import de.dennisguse.opentracks.data.models.Speed; import de.dennisguse.opentracks.data.models.TrackPoint; -import de.dennisguse.opentracks.data.models.UnitConversions; /** * Updater for {@link TrackStatistics}. @@ -196,7 +195,7 @@ public class TrackStatisticsUpdater { // See if the speed seems physically likely. Ignore any speeds that imply acceleration greater than 2g. Duration timeDifference = Duration.between(lastTrackPoint.getTime(), trackPoint.getTime()); Speed maxSpeedDifference = Speed.of(Distance.of(SPEED_MAX_ACCELERATION), Duration.ofMillis(1000)) - .mul(timeDifference.toMillis() / UnitConversions.S_TO_MS); + .mul(timeDifference.toSeconds()); Speed speedDifference = Speed.absDiff(lastTrackPoint.getSpeed(), trackPoint.getSpeed()); return speedDifference.lessThan(maxSpeedDifference);