forked from upstream-mirrors/OpenTracks
+23
-11
@@ -11,6 +11,7 @@ import android.location.Location;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
@@ -58,12 +59,14 @@ import de.dennisguse.opentracks.data.models.Track;
|
|||||||
import de.dennisguse.opentracks.data.models.TrackPoint;
|
import de.dennisguse.opentracks.data.models.TrackPoint;
|
||||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||||
import de.dennisguse.opentracks.io.file.exporter.TrackExporter;
|
import de.dennisguse.opentracks.io.file.exporter.TrackExporter;
|
||||||
|
import de.dennisguse.opentracks.sensors.BluetoothHandlerManagerCyclingPower;
|
||||||
import de.dennisguse.opentracks.sensors.sensorData.Aggregator;
|
import de.dennisguse.opentracks.sensors.sensorData.Aggregator;
|
||||||
import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer;
|
import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer;
|
||||||
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingCadence;
|
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingCadence;
|
||||||
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingDistanceSpeed;
|
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingDistanceSpeed;
|
||||||
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingPower;
|
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingPower;
|
||||||
import de.dennisguse.opentracks.sensors.sensorData.AggregatorHeartRate;
|
import de.dennisguse.opentracks.sensors.sensorData.AggregatorHeartRate;
|
||||||
|
import de.dennisguse.opentracks.sensors.sensorData.Raw;
|
||||||
import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet;
|
import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet;
|
||||||
import de.dennisguse.opentracks.services.TrackRecordingService;
|
import de.dennisguse.opentracks.services.TrackRecordingService;
|
||||||
import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
|
import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
|
||||||
@@ -72,7 +75,7 @@ import de.dennisguse.opentracks.stats.TrackStatistics;
|
|||||||
/**
|
/**
|
||||||
* Export a track to {@link TrackFileFormat} and verify that the import is identical.
|
* Export a track to {@link TrackFileFormat} and verify that the import is identical.
|
||||||
* <p>
|
* <p>
|
||||||
* Note: those tests are affected by {@link Aggregator}.isRecent().
|
* Note: those tests are affected by {@link Aggregator}.isOutdated().
|
||||||
* If the test device is too slow (like in a CI) these are likely to fail as the sensor data will be omitted from actual.
|
* If the test device is too slow (like in a CI) these are likely to fail as the sensor data will be omitted from actual.
|
||||||
*/
|
*/
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
@@ -548,23 +551,32 @@ public class ExportImportTest {
|
|||||||
private void mockSensorData(TrackPointCreator trackPointCreator, Float speed, Distance distance, float heartRate, float cadence, Float power, Float altitudeGain) {
|
private void mockSensorData(TrackPointCreator trackPointCreator, Float speed, Distance distance, float heartRate, float cadence, Float power, Float altitudeGain) {
|
||||||
SensorDataSet sensorDataSet = trackPointCreator.getSensorManager().sensorDataSet;
|
SensorDataSet sensorDataSet = trackPointCreator.getSensorManager().sensorDataSet;
|
||||||
|
|
||||||
AggregatorCyclingPower cyclingPower = Mockito.mock(AggregatorCyclingPower.class);
|
AggregatorCyclingPower cyclingPower = new AggregatorCyclingPower("", "");
|
||||||
Mockito.when(cyclingPower.hasAggregatedValue()).thenReturn(true);
|
cyclingPower.add(new Raw<>(trackPointCreator.createNow(), new BluetoothHandlerManagerCyclingPower.Data(Power.of(power), null)));
|
||||||
Mockito.when(cyclingPower.getAggregatedValue(Mockito.any())).thenReturn(Power.of(power));
|
|
||||||
sensorDataSet.add(cyclingPower);
|
sensorDataSet.add(cyclingPower);
|
||||||
|
|
||||||
AggregatorHeartRate avgHeartRate = Mockito.mock(AggregatorHeartRate.class);
|
|
||||||
Mockito.when(avgHeartRate.getAggregatedValue(Mockito.any())).thenReturn(HeartRate.of(heartRate));
|
AggregatorHeartRate avgHeartRate = new AggregatorHeartRate("", "");
|
||||||
|
avgHeartRate.add(new Raw<>(trackPointCreator.createNow(), HeartRate.of(heartRate)));
|
||||||
sensorDataSet.add(avgHeartRate);
|
sensorDataSet.add(avgHeartRate);
|
||||||
|
|
||||||
AggregatorCyclingCadence cyclingCadence = Mockito.mock(AggregatorCyclingCadence.class);
|
AggregatorCyclingCadence cyclingCadence = new AggregatorCyclingCadence("", "") {
|
||||||
Mockito.when(cyclingCadence.hasAggregatedValue()).thenReturn(true);
|
@NonNull
|
||||||
Mockito.when(cyclingCadence.getAggregatedValue(Mockito.any())).thenReturn(Cadence.of(cadence));
|
@Override
|
||||||
|
public Cadence getAggregatedValue(Instant now) {
|
||||||
|
return Cadence.of(cadence);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasReceivedData() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
sensorDataSet.add(cyclingCadence);
|
sensorDataSet.add(cyclingCadence);
|
||||||
|
|
||||||
if (distance != null && speed != null) {
|
if (distance != null && speed != null) {
|
||||||
AggregatorCyclingDistanceSpeed distanceSpeed = Mockito.mock(AggregatorCyclingDistanceSpeed.class);
|
AggregatorCyclingDistanceSpeed distanceSpeed = Mockito.mock(AggregatorCyclingDistanceSpeed.class);
|
||||||
Mockito.when(distanceSpeed.hasAggregatedValue()).thenReturn(true);
|
Mockito.when(distanceSpeed.hasReceivedData()).thenReturn(true);
|
||||||
Mockito.when(distanceSpeed.getAggregatedValue(Mockito.any())).thenReturn(new AggregatorCyclingDistanceSpeed.Data(null, distance, Speed.of(speed)));
|
Mockito.when(distanceSpeed.getAggregatedValue(Mockito.any())).thenReturn(new AggregatorCyclingDistanceSpeed.Data(null, distance, Speed.of(speed)));
|
||||||
sensorDataSet.add(distanceSpeed);
|
sensorDataSet.add(distanceSpeed);
|
||||||
} else {
|
} else {
|
||||||
@@ -581,7 +593,7 @@ public class ExportImportTest {
|
|||||||
|
|
||||||
if (altitudeGain != null) {
|
if (altitudeGain != null) {
|
||||||
AggregatorBarometer barometer = Mockito.mock(AggregatorBarometer.class);
|
AggregatorBarometer barometer = Mockito.mock(AggregatorBarometer.class);
|
||||||
Mockito.when(barometer.hasAggregatedValue()).thenReturn(true);
|
Mockito.when(barometer.hasReceivedData()).thenReturn(true);
|
||||||
Mockito.when(barometer.getAggregatedValue(Mockito.any())).thenReturn(new AltitudeGainLoss(altitudeGain, altitudeGain));
|
Mockito.when(barometer.getAggregatedValue(Mockito.any())).thenReturn(new AltitudeGainLoss(altitudeGain, altitudeGain));
|
||||||
sensorDataSet.add(barometer);
|
sensorDataSet.add(barometer);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+1
-1
@@ -66,7 +66,7 @@ public class SensorDataCyclingTest {
|
|||||||
current.add(new Raw<>(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(2, 1024)));
|
current.add(new Raw<>(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(2, 1024)));
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertFalse(current.hasAggregatedValue()); //TODO Cadence should be 0?
|
assertFalse(current.hasReceivedData()); //TODO Cadence should be 0?
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
+3
-4
@@ -149,12 +149,11 @@ public class TrackRecordingServiceRecordingTest {
|
|||||||
String gps1 = "2020-02-02T02:02:03Z";
|
String gps1 = "2020-02-02T02:02:03Z";
|
||||||
TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps1, 45.0, 35.0, 1, 15);
|
TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps1, 45.0, 35.0, 1, 15);
|
||||||
String gps2 = "2020-02-02T02:02:04Z";
|
String gps2 = "2020-02-02T02:02:04Z";
|
||||||
|
|
||||||
TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps2, 45.0, 35.0, 1, 15);
|
TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps2, 45.0, 35.0, 1, 15);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
String idleTime = "2020-02-02T02:02:17Z";
|
String idleTime = "2020-02-02T02:02:17Z";
|
||||||
trackPointCreator.setClock("2020-02-02T02:02:17Z");
|
trackPointCreator.setClock(idleTime);
|
||||||
Thread.sleep(Duration.ofSeconds(15).toMillis());
|
Thread.sleep(Duration.ofSeconds(15).toMillis());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
@@ -722,14 +721,14 @@ public class TrackRecordingServiceRecordingTest {
|
|||||||
.setLongitude(35)
|
.setLongitude(35)
|
||||||
.setHorizontalAccuracy(Distance.of(1))
|
.setHorizontalAccuracy(Distance.of(1))
|
||||||
.setSensorDistance(Distance.of(11))
|
.setSensorDistance(Distance.of(11))
|
||||||
.setSpeed(Speed.of(5))
|
.setSpeed(Speed.of(0)) //Sensor data is now outdated, but we do not fall back to GPS.
|
||||||
.setSensorDistance(Distance.of(0))
|
.setSensorDistance(Distance.of(0))
|
||||||
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
|
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mockAltitudeChange(TrackPointCreator trackPointCreator, float altitudeGain) {
|
private void mockAltitudeChange(TrackPointCreator trackPointCreator, float altitudeGain) {
|
||||||
AggregatorBarometer barometer = Mockito.mock(AggregatorBarometer.class);
|
AggregatorBarometer barometer = Mockito.mock(AggregatorBarometer.class);
|
||||||
Mockito.when(barometer.hasAggregatedValue()).thenReturn(true);
|
Mockito.when(barometer.hasReceivedData()).thenReturn(true);
|
||||||
Mockito.when(barometer.getAggregatedValue(Mockito.any())).thenReturn(new AltitudeGainLoss(altitudeGain, altitudeGain));
|
Mockito.when(barometer.getAggregatedValue(Mockito.any())).thenReturn(new AltitudeGainLoss(altitudeGain, altitudeGain));
|
||||||
|
|
||||||
trackPointCreator.getSensorManager().sensorDataSet.barometer = barometer;
|
trackPointCreator.getSensorManager().sensorDataSet.barometer = barometer;
|
||||||
|
|||||||
@@ -37,7 +37,11 @@ public abstract class Aggregator<Input, Output> {
|
|||||||
|
|
||||||
protected abstract void computeValue(Raw<Input> current);
|
protected abstract void computeValue(Raw<Input> current);
|
||||||
|
|
||||||
public boolean hasAggregatedValue() {
|
/**
|
||||||
|
* @return did we process data from a sensor.
|
||||||
|
* NOTE: for some sensors this may require more than one measurement.
|
||||||
|
*/
|
||||||
|
public boolean hasReceivedData() {
|
||||||
return aggregatedValue != null;
|
return aggregatedValue != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,15 +50,14 @@ public abstract class Aggregator<Input, Output> {
|
|||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public Output getAggregatedValue(Instant now) {
|
public Output getAggregatedValue(Instant now) {
|
||||||
if (!hasAggregatedValue()) {
|
if (!hasReceivedData()) {
|
||||||
return getNoneValue();
|
return getNoneValue();
|
||||||
}
|
}
|
||||||
//TODO This should only affect measured data (like heartrate), but not aggregated values.
|
if (isOutdated(now)) {
|
||||||
//Remove current measurements, but provide aggregates?
|
resetImmediate();
|
||||||
if (isRecent(now)) {
|
|
||||||
return aggregatedValue;
|
|
||||||
}
|
}
|
||||||
return getNoneValue();
|
|
||||||
|
return aggregatedValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@@ -63,20 +66,28 @@ public abstract class Aggregator<Input, Output> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset long term aggregated values (more than derived from previous SensorData). e.g. overall distance.
|
* Reset short-term (i.e., non-aggregated) values that were directly derived from sensor data.
|
||||||
*/
|
*/
|
||||||
public abstract void reset();
|
protected abstract void resetImmediate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset long-term (i.e., aggregated) values (more than derived from previous SensorData) like overall distance.
|
||||||
|
*/
|
||||||
|
public abstract void resetAggregated();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is the data recent considering the current time.
|
* Is the data recent considering the current time.
|
||||||
*/
|
*/
|
||||||
private boolean isRecent(Instant now) {
|
private boolean isOutdated(Instant now) {
|
||||||
if (previous == null) {
|
if (previous == null) {
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return now
|
return now
|
||||||
.isBefore(previous.time().plus(BluetoothRemoteSensorManager.MAX_SENSOR_DATE_SET_AGE)); //TODO Per Sensor!
|
.isAfter(
|
||||||
|
previous.time()
|
||||||
|
.plus(BluetoothRemoteSensorManager.MAX_SENSOR_DATE_SET_AGE)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|||||||
@@ -32,7 +32,11 @@ public class AggregatorBarometer extends Aggregator<AtmosphericPressure, Altitud
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
protected void resetImmediate() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetAggregated() {
|
||||||
aggregatedValue = getNoneValue();
|
aggregatedValue = getNoneValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-1
@@ -47,7 +47,12 @@ public class AggregatorCyclingCadence extends Aggregator<BluetoothHandlerCycling
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
protected void resetImmediate() {
|
||||||
|
aggregatedValue = getNoneValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetAggregated() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|||||||
+12
-7
@@ -55,7 +55,12 @@ public class AggregatorCyclingDistanceSpeed extends Aggregator<BluetoothHandlerC
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
protected void resetImmediate() {
|
||||||
|
aggregatedValue = new Data(Distance.of(0), aggregatedValue.distanceOverall, Speed.zero());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetAggregated() {
|
||||||
if (aggregatedValue != null) {
|
if (aggregatedValue != null) {
|
||||||
aggregatedValue = new Data(aggregatedValue.distance, Distance.of(0), aggregatedValue.speed);
|
aggregatedValue = new Data(aggregatedValue.distance, Distance.of(0), aggregatedValue.speed);
|
||||||
}
|
}
|
||||||
@@ -64,16 +69,16 @@ public class AggregatorCyclingDistanceSpeed extends Aggregator<BluetoothHandlerC
|
|||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
protected Data getNoneValue() {
|
protected Data getNoneValue() {
|
||||||
if (aggregatedValue != null) {
|
return new Data(Distance.of(0), Distance.of(0), Speed.zero());
|
||||||
return new Data(aggregatedValue.distance, aggregatedValue.distanceOverall, Speed.zero());
|
|
||||||
} else {
|
|
||||||
return new Data(Distance.of(0), Distance.of(0), Speed.zero());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setWheelCircumference(Distance wheelCircumference) {
|
public void setWheelCircumference(Distance wheelCircumference) {
|
||||||
this.wheelCircumference = wheelCircumference;
|
this.wheelCircumference = wheelCircumference;
|
||||||
}
|
}
|
||||||
|
|
||||||
public record Data(Distance distance, Distance distanceOverall, Speed speed) {}
|
public record Data(
|
||||||
|
Distance distance, //Only used for debugging
|
||||||
|
Distance distanceOverall,
|
||||||
|
Speed speed) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-1
@@ -17,7 +17,12 @@ public class AggregatorCyclingPower extends Aggregator<BluetoothHandlerManagerCy
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
protected void resetImmediate() {
|
||||||
|
aggregatedValue = getNoneValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetAggregated() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|||||||
@@ -17,7 +17,19 @@ public class AggregatorGPS extends Aggregator<Position, Position> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
protected void resetImmediate() {
|
||||||
|
aggregatedValue = Position.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetAggregated() {
|
||||||
|
/*
|
||||||
|
* GPS data is not an aggregated value, but for now we want to ensure to only save the data once.
|
||||||
|
* The data is too large to save it more often than needed (i.e., duplicated values).
|
||||||
|
* TODO: this behavior can be changed if TrackRecordingManager.insertTrackPoint() would strip GPS data if it was already saved. This would simplify TrackPointCreator.createCurrentTrackPoint()
|
||||||
|
*/
|
||||||
|
aggregatedValue = Position.empty();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|||||||
@@ -16,7 +16,12 @@ public class AggregatorHeartRate extends Aggregator<HeartRate, HeartRate> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
protected void resetImmediate() {
|
||||||
|
aggregatedValue = getNoneValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetAggregated() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|||||||
@@ -36,7 +36,12 @@ public final class AggregatorRunning extends Aggregator<BluetoothHandlerRunningS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
protected void resetImmediate() {
|
||||||
|
aggregatedValue = new Data(Speed.zero(), Cadence.of(0f), aggregatedValue.distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetAggregated() {
|
||||||
if (aggregatedValue != null) {
|
if (aggregatedValue != null) {
|
||||||
aggregatedValue = new Data(aggregatedValue.speed, aggregatedValue.cadence, Distance.of(0));
|
aggregatedValue = new Data(aggregatedValue.speed, aggregatedValue.cadence, Distance.of(0));
|
||||||
}
|
}
|
||||||
@@ -45,11 +50,7 @@ public final class AggregatorRunning extends Aggregator<BluetoothHandlerRunningS
|
|||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
protected Data getNoneValue() {
|
protected Data getNoneValue() {
|
||||||
if (aggregatedValue != null) {
|
return new Data(Speed.zero(), Cadence.of(0f), Distance.of(0));
|
||||||
return new Data(Speed.zero(), Cadence.of(0f), aggregatedValue.distance);
|
|
||||||
} else {
|
|
||||||
return new Data(Speed.zero(), Cadence.of(0f), Distance.of(0));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public record Data(Speed speed, Cadence cadence, @NonNull Distance distance) {
|
public record Data(Speed speed, Cadence cadence, @NonNull Distance distance) {
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ public class SensorDataSet {
|
|||||||
return cyclingCadence.getAggregatedValueWithSensorName(trackPointCreator.createNow());
|
return cyclingCadence.getAggregatedValueWithSensorName(trackPointCreator.createNow());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (runningDistanceSpeedCadence != null && runningDistanceSpeedCadence.hasAggregatedValue() && runningDistanceSpeedCadence.aggregatedValue.cadence() != null) {
|
if (runningDistanceSpeedCadence != null && runningDistanceSpeedCadence.hasReceivedData() && runningDistanceSpeedCadence.aggregatedValue.cadence() != null) {
|
||||||
return new Pair<>(runningDistanceSpeedCadence.aggregatedValue.cadence(), runningDistanceSpeedCadence.getSensorNameOrAddress());
|
return new Pair<>(runningDistanceSpeedCadence.aggregatedValue.cadence(), runningDistanceSpeedCadence.getSensorNameOrAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,11 +83,11 @@ public class SensorDataSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Pair<Speed, String> getSpeed() {
|
public Pair<Speed, String> getSpeed() {
|
||||||
if (cyclingDistanceSpeed != null && cyclingDistanceSpeed.hasAggregatedValue() && cyclingDistanceSpeed.getAggregatedValue(trackPointCreator.createNow()).speed() != null) {
|
if (cyclingDistanceSpeed != null && cyclingDistanceSpeed.hasReceivedData() && cyclingDistanceSpeed.getAggregatedValue(trackPointCreator.createNow()).speed() != null) {
|
||||||
return new Pair<>(cyclingDistanceSpeed.getAggregatedValue(trackPointCreator.createNow()).speed(), cyclingDistanceSpeed.getSensorNameOrAddress());
|
return new Pair<>(cyclingDistanceSpeed.getAggregatedValue(trackPointCreator.createNow()).speed(), cyclingDistanceSpeed.getSensorNameOrAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (runningDistanceSpeedCadence != null && runningDistanceSpeedCadence.hasAggregatedValue() && runningDistanceSpeedCadence.getAggregatedValue(trackPointCreator.createNow()).speed() != null) {
|
if (runningDistanceSpeedCadence != null && runningDistanceSpeedCadence.hasReceivedData() && runningDistanceSpeedCadence.getAggregatedValue(trackPointCreator.createNow()).speed() != null) {
|
||||||
return new Pair<>(runningDistanceSpeedCadence.aggregatedValue.speed(), runningDistanceSpeedCadence.getSensorNameOrAddress());
|
return new Pair<>(runningDistanceSpeedCadence.aggregatedValue.speed(), runningDistanceSpeedCadence.getSensorNameOrAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +156,7 @@ public class SensorDataSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void fillTrackPoint(TrackPoint trackPoint) {
|
public void fillTrackPoint(TrackPoint trackPoint) {
|
||||||
if (gps != null && gps.hasAggregatedValue()) {
|
if (gps != null && gps.hasReceivedData()) {
|
||||||
trackPoint.setPosition(gps.getAggregatedValue(trackPointCreator.createNow()));
|
trackPoint.setPosition(gps.getAggregatedValue(trackPointCreator.createNow()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,19 +172,19 @@ public class SensorDataSet {
|
|||||||
trackPoint.setSpeed(getSpeed().first);
|
trackPoint.setSpeed(getSpeed().first);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cyclingDistanceSpeed != null && cyclingDistanceSpeed.hasAggregatedValue()) {
|
if (cyclingDistanceSpeed != null && cyclingDistanceSpeed.hasReceivedData()) {
|
||||||
trackPoint.setSensorDistance(cyclingDistanceSpeed.getAggregatedValue(trackPointCreator.createNow()).distanceOverall());
|
trackPoint.setSensorDistance(cyclingDistanceSpeed.getAggregatedValue(trackPointCreator.createNow()).distanceOverall());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cyclingPower != null && cyclingPower.hasAggregatedValue()) {
|
if (cyclingPower != null && cyclingPower.hasReceivedData()) {
|
||||||
trackPoint.setPower(cyclingPower.getAggregatedValue(trackPointCreator.createNow()));
|
trackPoint.setPower(cyclingPower.getAggregatedValue(trackPointCreator.createNow()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (runningDistanceSpeedCadence != null && runningDistanceSpeedCadence.hasAggregatedValue()) {
|
if (runningDistanceSpeedCadence != null && runningDistanceSpeedCadence.hasReceivedData()) {
|
||||||
trackPoint.setSensorDistance(runningDistanceSpeedCadence.getAggregatedValue(trackPointCreator.createNow()).distance());
|
trackPoint.setSensorDistance(runningDistanceSpeedCadence.getAggregatedValue(trackPointCreator.createNow()).distance());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barometer != null && barometer.hasAggregatedValue()) {
|
if (barometer != null && barometer.hasReceivedData()) {
|
||||||
trackPoint.setAltitudeGain(barometer.getAggregatedValue(trackPointCreator.createNow()).gain_m());
|
trackPoint.setAltitudeGain(barometer.getAggregatedValue(trackPointCreator.createNow()).gain_m());
|
||||||
trackPoint.setAltitudeLoss(barometer.getAggregatedValue(trackPointCreator.createNow()).loss_m());
|
trackPoint.setAltitudeLoss(barometer.getAggregatedValue(trackPointCreator.createNow()).loss_m());
|
||||||
}
|
}
|
||||||
@@ -193,13 +193,13 @@ public class SensorDataSet {
|
|||||||
public void reset() {
|
public void reset() {
|
||||||
Log.i(TAG, "Resetting data");
|
Log.i(TAG, "Resetting data");
|
||||||
|
|
||||||
if (heartRate != null) heartRate.reset();
|
if (heartRate != null) heartRate.resetAggregated();
|
||||||
if (cyclingCadence != null) cyclingCadence.reset();
|
if (cyclingCadence != null) cyclingCadence.resetAggregated();
|
||||||
if (cyclingDistanceSpeed != null) cyclingDistanceSpeed.reset();
|
if (cyclingDistanceSpeed != null) cyclingDistanceSpeed.resetAggregated();
|
||||||
if (cyclingPower != null) cyclingPower.reset();
|
if (cyclingPower != null) cyclingPower.resetAggregated();
|
||||||
if (runningDistanceSpeedCadence != null) runningDistanceSpeedCadence.reset();
|
if (runningDistanceSpeedCadence != null) runningDistanceSpeedCadence.resetAggregated();
|
||||||
if (barometer != null) barometer.reset();
|
if (barometer != null) barometer.resetAggregated();
|
||||||
if (gps != null) gps.reset();
|
if (gps != null) gps.resetAggregated();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void set(@NonNull Aggregator<?, ?> type, @Nullable Aggregator<?, ?> sensorData) {
|
private void set(@NonNull Aggregator<?, ?> type, @Nullable Aggregator<?, ?> sensorData) {
|
||||||
|
|||||||
Reference in New Issue
Block a user