Skip to content

Commit

Permalink
GPS: event-based using Raw.
Browse files Browse the repository at this point in the history
Part of #1424.
  • Loading branch information
dennisguse committed Apr 8, 2024
1 parent 5c75e9a commit 9f6ea07
Show file tree
Hide file tree
Showing 10 changed files with 74 additions and 142 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingDistanceSpeed;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingPower;
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.services.TrackRecordingService;
import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
Expand Down Expand Up @@ -604,6 +605,6 @@ private void sendLocation(TrackPointCreator trackPointCreator, String time, doub
mockAltitudeChange(trackPointCreator, altitudeGain);

trackPointCreator.setClock(time);
trackPointCreator.onChange(location);
trackPointCreator.getSensorManager().onChanged(new Raw<>(location));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,10 @@ public void testRecording_gpsOnly_recordingDistance_below() {
.setAltitudeGain(0f)
.setAltitudeLoss(0f),
new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, Instant.parse(stopTime))
.setLatitude(45.00002)
.setLongitude(35)
.setHorizontalAccuracy(Distance.of(1))
.setSpeed(Speed.of(15))
.setAltitudeGain(0f)
.setAltitudeLoss(0f)
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
Expand Down Expand Up @@ -672,6 +676,9 @@ public void testRecording_gpsAndSensor_gpsIdleMoving_sensorMoving() {
.setSpeed(Speed.of(5))
.setSensorDistance(Distance.of(0)),
new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, Instant.parse(stopTime))
.setLatitude(45.001)
.setLongitude(35)
.setHorizontalAccuracy(Distance.of(1))
.setSensorDistance(Distance.of(11))
.setSpeed(Speed.of(5))
.setSensorDistance(Distance.of(0))
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -42,13 +41,11 @@ public void onChange(Raw<?> data) {
@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));
}
};

Expand All @@ -67,7 +64,7 @@ public void start(Context context, Handler handler) {
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);

Expand Down Expand Up @@ -104,7 +101,6 @@ public void reset() {
sensorDataSet.reset();
}

@Deprecated
@VisibleForTesting
public void onChanged(Raw<?> data) {
listener.onChange(data);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import de.dennisguse.opentracks.sensors.BluetoothRemoteSensorManager;

public abstract class Aggregator<Input extends Record, Output> {
public abstract class Aggregator<Input, Output> {

protected Raw<Input> previous;

Expand Down
Original file line number Diff line number Diff line change
@@ -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");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import java.time.Instant;

public record Raw<T extends Record>(
public record Raw<T>(
@NonNull T value,

@NonNull Instant time
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.dennisguse.opentracks.sensors.sensorData;

import android.location.Location;
import android.util.Log;
import android.util.Pair;

Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -93,7 +98,7 @@ public void add(@NonNull Aggregator<?, ?> data) {
}

public void update(@NonNull Raw<?> data) {
Record value = data.value();
Object value = data.value();

if (value instanceof HeartRate) {
this.heartRate.add((Raw<HeartRate>) data);
Expand Down Expand Up @@ -122,6 +127,10 @@ public void update(@NonNull Raw<?> data) {
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());
}
Expand All @@ -138,9 +147,14 @@ public void clear() {
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);
}
Expand Down Expand Up @@ -180,6 +194,7 @@ public void reset() {
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) {
Expand Down Expand Up @@ -209,6 +224,10 @@ private void set(@NonNull Aggregator<?, ?> type, @Nullable Aggregator<?, ?> sens
barometer = (AggregatorBarometer) sensorData;
return;
}
if (type instanceof AggregatorGPS) {
gps = (AggregatorGPS) sensorData;
return;
}

throw new UnsupportedOperationException(type.getClass().getCanonicalName());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.sensors.SensorConnector;
import de.dennisguse.opentracks.sensors.SensorManager;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorGPS;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.LocationUtils;
import de.dennisguse.opentracks.util.PermissionRequester;
Expand All @@ -32,6 +35,8 @@ public class GPSManager implements SensorConnector, LocationListenerCompat, GpsS
private static final String LOCATION_PROVIDER = LocationManager.GPS_PROVIDER;

private TrackPointCreator trackPointCreator;

private SensorManager.SensorDataChangedObserver listener;
private Context context;
private Handler handler;

Expand All @@ -40,8 +45,9 @@ public class GPSManager implements SensorConnector, LocationListenerCompat, GpsS
private Duration gpsInterval;
private Distance thresholdHorizontalAccuracy;

public GPSManager(TrackPointCreator trackPointCreator) {
public GPSManager(TrackPointCreator trackPointCreator, SensorManager.SensorDataChangedObserver listener) {
this.trackPointCreator = trackPointCreator;
this.listener = listener;
}

public void start(@NonNull Context context, @NonNull Handler handler) {
Expand All @@ -52,6 +58,9 @@ public void start(@NonNull Context context, @NonNull Handler handler) {

gpsStatusManager = new GpsStatusManager(context, this, handler);
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

listener.onConnect(new AggregatorGPS("internal"));

registerLocationListener();
gpsStatusManager.start();
}
Expand All @@ -72,6 +81,9 @@ public void stop(Context context) {
gpsStatusManager.stop();
gpsStatusManager = null;

listener.onDisconnect(new AggregatorGPS("internal"));
listener = null;

trackPointCreator = null;
}

Expand Down Expand Up @@ -126,7 +138,7 @@ public void onLocationChanged(@NonNull Location location) {
return;
}

trackPointCreator.onChange(location);
listener.onChange(new Raw<>(location));
}

@Override
Expand Down
Loading

0 comments on commit 9f6ea07

Please sign in to comment.