Bluetooth sensors: event-driven TrackPoint creation.

Part of #500.
This commit is contained in:
Dennis Guse
2022-01-01 21:15:46 +01:00
parent 1fb8fc6a09
commit c4b8082efc
9 changed files with 40 additions and 27 deletions
@@ -88,7 +88,6 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
@Override
public void run() {
updateRecordingDataWhileRecording();
trackPointCreator.onNewTrackPointWithoutGPS(); //TODO Should not be called every second, right? + with do some duplicate computation with updateRecordingDataWhileRecording().
Handler localHandler = TrackRecordingService.this.handler;
if (localHandler == null) {
@@ -121,7 +121,7 @@ public class GPSHandler implements LocationListener, GpsStatus.GpsStatusListener
}
lastTrackPoint = trackPoint;
trackPointCreator.onNewTrackPoint(trackPoint, thresholdHorizontalAccuracy);
trackPointCreator.onNewTrackPoint(trackPoint);
}
@Override
@@ -20,7 +20,7 @@ import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager;
/**
* Creates TrackPoints while recording by fusing data from different sensors (e.g., GNSS, barometer, BLE sensors).
*/
public class TrackPointCreator {
public class TrackPointCreator implements BluetoothRemoteSensorManager.SensorDataSetChangeObserver {
private static final String TAG = TrackPointCreator.class.getSimpleName();
@@ -51,10 +51,10 @@ public class TrackPointCreator {
gpsHandler.onStart(context);
remoteSensorManager = new BluetoothRemoteSensorManager(context);
remoteSensorManager.start();
remoteSensorManager = new BluetoothRemoteSensorManager(context, this);
altitudeSumManager = new AltitudeSumManager();
remoteSensorManager.start();
altitudeSumManager.start(context);
}
@@ -109,19 +109,25 @@ public class TrackPointCreator {
gpsHandler.onSharedPreferenceChanged(key);
}
public synchronized void onNewTrackPoint(@NonNull TrackPoint trackPoint, @NonNull Distance thresholdHorizontalAccuracy) {
/**
* Got a new TrackPoint from Bluetooth only; contains no GPS location.
*
* @param sensorDataSet
*/
@Override
public void onChange(SensorDataSet sensorDataSet) {
onNewTrackPoint(new TrackPoint(TrackPoint.Type.SENSORPOINT, createNow()));
}
public synchronized void onNewTrackPoint(@NonNull TrackPoint trackPoint) {
fill(trackPoint);
boolean stored = service.newTrackPoint(trackPoint, thresholdHorizontalAccuracy);
boolean stored = service.newTrackPoint(trackPoint, gpsHandler.getThresholdHorizontalAccuracy());
if (stored) {
resetSensorData();
}
}
public void onNewTrackPointWithoutGPS() {
onNewTrackPoint(new TrackPoint(TrackPoint.Type.SENSORPOINT, createNow()), gpsHandler.getThresholdHorizontalAccuracy());
}
public TrackPoint createSegmentStartManual() {
return TrackPoint.createSegmentStartManualWithTime(createNow());
}
@@ -33,8 +33,8 @@ import de.dennisguse.opentracks.content.sensor.SensorData;
import de.dennisguse.opentracks.content.sensor.SensorDataCycling;
import de.dennisguse.opentracks.content.sensor.SensorDataRunning;
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
import de.dennisguse.opentracks.util.BluetoothUtils;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.BluetoothUtils;
/**
* Bluetooth LE sensor manager: manages connections to Bluetooth LE sensors.
@@ -71,6 +71,8 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager.
private final SensorDataSet sensorDataSet = new SensorDataSet();
private final SensorDataSetChangeObserver observer;
private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
@@ -110,8 +112,9 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager.
}
};
public BluetoothRemoteSensorManager(Context context) {
public BluetoothRemoteSensorManager(@NonNull Context context, @NonNull SensorDataSetChangeObserver observer) {
this.context = context;
this.observer = observer;
bluetoothAdapter = BluetoothUtils.getAdapter(context);
}
@@ -208,10 +211,15 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager.
}
sensorDataSet.set(sensorData);
observer.onChange(new SensorDataSet(sensorDataSet));
}
@Override
public void onDisconnecting(SensorData<?> sensorData) {
sensorDataSet.remove(sensorData);
}
public interface SensorDataSetChangeObserver {
void onChange(SensorDataSet sensorDataSet);
}
}