GPS: event-based using Raw.

Part of #1424.
This commit is contained in:
Dennis Guse
2023-11-19 16:08:17 +01:00
parent 1d0c6cdd92
commit dfdbc373ff
10 changed files with 74 additions and 142 deletions
@@ -30,7 +30,6 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange
@Override
public void onConnect(Aggregator<?, ?> aggregator) {
sensorDataSet.add(aggregator);
observer.onChange(new SensorDataSet(sensorDataSet));
}
@Override
@@ -42,13 +41,11 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange
@Override
public void onDisconnect(Aggregator<?, ?> aggregator) {
sensorDataSet.add(aggregator);
observer.onChange(new SensorDataSet(sensorDataSet));
}
@Override
public void onRemove(Aggregator<?, ?> aggregator) {
sensorDataSet.remove(aggregator);
observer.onChange(new SensorDataSet(sensorDataSet));
}
};
@@ -67,7 +64,7 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange
throw new RuntimeException("SensorManager cannot be started twice; stop first.");
}
gpsManager = new GPSManager(observer); //TODO Pass listener
gpsManager = new GPSManager(observer, listener);
altitudeSumManager = new GainManager(listener);
bluetoothSensorManager = new BluetoothRemoteSensorManager(context, handler, listener);
@@ -104,7 +101,6 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange
sensorDataSet.reset();
}
@Deprecated
@VisibleForTesting
public void onChanged(Raw<?> data) {
listener.onChange(data);
@@ -6,7 +6,7 @@ import java.time.Instant;
import de.dennisguse.opentracks.sensors.BluetoothRemoteSensorManager;
public abstract class Aggregator<Input extends Record, Output> {
public abstract class Aggregator<Input, Output> {
protected Raw<Input> previous;
@@ -0,0 +1,28 @@
package de.dennisguse.opentracks.sensors.sensorData;
import android.location.Location;
import androidx.annotation.NonNull;
public class AggregatorGPS extends Aggregator<Location, Location> {
public AggregatorGPS(String sensorAddress) {
super(sensorAddress);
}
@Override
protected void computeValue(Raw<Location> current) {
value = current.value();
}
@Override
public void reset() {
value = null;
}
@NonNull
@Override
protected Location getNoneValue() {
return new Location("none");
}
}
@@ -5,7 +5,7 @@ import androidx.annotation.NonNull;
import java.time.Instant;
public record Raw<T extends Record>(
public record Raw<T>(
@NonNull T value,
@NonNull Instant time
@@ -1,5 +1,6 @@
package de.dennisguse.opentracks.sensors.sensorData;
import android.location.Location;
import android.util.Log;
import android.util.Pair;
@@ -40,16 +41,20 @@ public final class SensorDataSet {
@VisibleForTesting
public AggregatorBarometer barometer;
public AggregatorGPS gps;
public SensorDataSet() {
}
public SensorDataSet(SensorDataSet toCopy) {
//TODO This is not a copy constructor anymore, but it should be - aggregators are no value objects
this.heartRate = toCopy.heartRate;
this.cyclingCadence = toCopy.cyclingCadence;
this.cyclingDistanceSpeed = toCopy.cyclingDistanceSpeed;
this.cyclingPower = toCopy.cyclingPower;
this.runningDistanceSpeedCadence = toCopy.runningDistanceSpeedCadence;
this.barometer = toCopy.barometer;
this.gps = toCopy.gps;
}
public Pair<HeartRate, String> getHeartRate() {
@@ -93,7 +98,7 @@ public final class SensorDataSet {
}
public void update(@NonNull Raw<?> data) {
Record value = data.value();
Object value = data.value();
if (value instanceof HeartRate) {
this.heartRate.add((Raw<HeartRate>) data);
@@ -122,6 +127,10 @@ public final class SensorDataSet {
this.barometer.add((Raw<AtmosphericPressure>) data);
return;
}
if (value instanceof Location) {
this.gps.add((Raw<Location>) data);
return;
}
throw new UnsupportedOperationException(data.getClass().getCanonicalName() + " " + data.value().getClass().getCanonicalName());
}
@@ -138,9 +147,14 @@ public final class SensorDataSet {
this.cyclingPower = null;
this.runningDistanceSpeedCadence = null;
this.barometer = null;
this.gps = null;
}
public void fillTrackPoint(TrackPoint trackPoint) {
if (gps != null && gps.hasValue()) {
trackPoint.setLocation(gps.getValue());
}
if (getHeartRate() != null) {
trackPoint.setHeartRate(getHeartRate().first);
}
@@ -180,6 +194,7 @@ public final class SensorDataSet {
if (cyclingPower != null) cyclingPower.reset();
if (runningDistanceSpeedCadence != null) runningDistanceSpeedCadence.reset();
if (barometer != null) barometer.reset();
if (gps != null) gps.reset();
}
private void set(@NonNull Aggregator<?, ?> type, @Nullable Aggregator<?, ?> sensorData) {
@@ -209,6 +224,10 @@ public final class SensorDataSet {
barometer = (AggregatorBarometer) sensorData;
return;
}
if (type instanceof AggregatorGPS) {
gps = (AggregatorGPS) sensorData;
return;
}
throw new UnsupportedOperationException(type.getClass().getCanonicalName());
}