diff --git a/src/main/java/de/dennisguse/opentracks/content/sensor/SensorData.java b/src/main/java/de/dennisguse/opentracks/content/sensor/SensorData.java index 494414355..f4d7ef88c 100644 --- a/src/main/java/de/dennisguse/opentracks/content/sensor/SensorData.java +++ b/src/main/java/de/dennisguse/opentracks/content/sensor/SensorData.java @@ -1,5 +1,7 @@ package de.dennisguse.opentracks.content.sensor; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager; @@ -11,6 +13,10 @@ public class SensorData { private final long timestamp_ms; + SensorData(String sensorAddress) { + this(sensorAddress, null, System.currentTimeMillis()); + } + SensorData(String sensorAddress, String sensorName) { this(sensorAddress, sensorName, System.currentTimeMillis()); } @@ -22,14 +28,20 @@ public class SensorData { this.timestamp_ms = timestamp_ms; } + @NonNull public String getSensorAddress() { return sensorAddress; } + @Nullable public String getSensorName() { return sensorName; } + public String getSensorNameOrAddress() { + return sensorName != null ? sensorName : sensorAddress; + } + /** * Is the data recent considering the current time. */ diff --git a/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataCycling.java b/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataCycling.java index b1a57e018..ced31f02b 100644 --- a/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataCycling.java +++ b/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataCycling.java @@ -29,6 +29,12 @@ public final class SensorDataCycling { private final int crankRevolutionsTime; // UINT16; 1/1024s private float cadence_rpm = INVALID_VALUE_FLOAT; + public Cadence(String sensorAddress) { + super(sensorAddress); + this.crankRevolutionsCount = INVALID_VALUE_INT; + this.crankRevolutionsTime = INVALID_VALUE_INT; + } + public Cadence(String sensorAddress, String sensorName, long crankRevolutionsCount, int crankRevolutionsTime) { super(sensorAddress, sensorName); this.crankRevolutionsCount = crankRevolutionsCount; @@ -97,6 +103,12 @@ public final class SensorDataCycling { private final int wheelRevolutionsTime; // UINT16; 1/1024s private float speed_mps = INVALID_VALUE_FLOAT; + public Speed(String sensorAddress) { + super(sensorAddress); + this.wheelRevolutionsCount = INVALID_VALUE_INT; + this.wheelRevolutionsTime = INVALID_VALUE_INT; + } + public Speed(String sensorAddress, String sensorName, int wheelRevolutionsCount, int wheelRevolutionsTime) { super(sensorAddress, sensorName); this.wheelRevolutionsCount = wheelRevolutionsCount; diff --git a/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataHeartRate.java b/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataHeartRate.java index 0ba0232d4..5ea7193c6 100644 --- a/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataHeartRate.java +++ b/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataHeartRate.java @@ -6,6 +6,11 @@ public class SensorDataHeartRate extends SensorData { private final float heartRate_bpm; + public SensorDataHeartRate(String address) { + super(address); + heartRate_bpm = Float.NaN; + } + public SensorDataHeartRate(String name, String address, float heartRate_bpm) { super(name, address); this.heartRate_bpm = heartRate_bpm; diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java index 9905999e3..b4ab658fc 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java @@ -430,7 +430,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi if (sensorDataSet != null && sensorDataSet.getHeartRate() != null) { SensorDataHeartRate data = sensorDataSet.getHeartRate(); - sensorName = data.getSensorName(); + sensorName = data.getSensorNameOrAddress(); if (data.hasHeartRate_bpm() && data.isRecent()) { sensorValue = StringUtils.formatDecimal(data.getHeartRate_bpm(), 0); } @@ -452,7 +452,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi String sensorName = getContext().getString(R.string.value_unknown); if (sensorDataSet != null && sensorDataSet.getCyclingCadence() != null) { SensorDataCycling.Cadence data = sensorDataSet.getCyclingCadence(); - sensorName = data.getSensorName(); + sensorName = data.getSensorNameOrAddress(); if (data.hasCadence_rpm() && data.isRecent()) { sensorValue = StringUtils.formatDecimal(data.getCadence_rpm(), 0); diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index 7d85b18f7..406c180ba 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -689,7 +689,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand } SensorDataSet getSensorDataSet() { - if (remoteSensorManager == null || !remoteSensorManager.isEnabled()) { + if (remoteSensorManager == null) { return null; } diff --git a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothConnectionManager.java b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothConnectionManager.java index fbd4c4240..976853e40 100644 --- a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothConnectionManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothConnectionManager.java @@ -55,6 +55,7 @@ public abstract class BluetoothConnectionManager { switch (newState) { case BluetoothProfile.STATE_CONNECTING: Log.d(TAG, "Connecting to sensor: " + gatt.getDevice()); + break; case BluetoothProfile.STATE_CONNECTED: Log.d(TAG, "Connected to sensor: " + gatt.getDevice()); @@ -62,9 +63,11 @@ public abstract class BluetoothConnectionManager { break; case BluetoothProfile.STATE_DISCONNECTING: Log.d(TAG, "Disconnecting from sensor: " + gatt.getDevice()); + break; case BluetoothProfile.STATE_DISCONNECTED: Log.d(TAG, "Disconnected from sensor: " + gatt.getDevice()); + break; } } @@ -114,8 +117,9 @@ public abstract class BluetoothConnectionManager { Log.d(TAG, "Connecting to: " + device); - bluetoothGatt = device.connectGatt(context, true, this.connectCallback); - + bluetoothGatt = device.connectGatt(context, true, connectCallback); + SensorData sensorData = createPreConnectSensorData(bluetoothGatt.getDevice().getAddress()); + observer.onChanged(sensorData); } synchronized void disconnect() { @@ -135,10 +139,12 @@ public abstract class BluetoothConnectionManager { return address.equals(bluetoothGatt.getDevice().getAddress()); } + protected abstract SensorData createPreConnectSensorData(String address); + /** * @return null if data could not be parsed. */ - protected abstract de.dennisguse.opentracks.content.sensor.SensorData parsePayload(String sensorName, String address, BluetoothGattCharacteristic characteristic); + protected abstract SensorData parsePayload(String sensorName, String address, BluetoothGattCharacteristic characteristic); public static class HeartRate extends BluetoothConnectionManager { @@ -146,6 +152,11 @@ public abstract class BluetoothConnectionManager { super(BluetoothUtils.HEART_RATE_SERVICE_UUID, BluetoothUtils.HEART_RATE_MEASUREMENT_CHAR_UUID, observer); } + @Override + protected SensorData createPreConnectSensorData(String address) { + return new SensorDataHeartRate(address); + } + @Override protected SensorDataHeartRate parsePayload(String sensorName, String address, BluetoothGattCharacteristic characteristic) { Integer heartRate = BluetoothUtils.parseHeartRate(characteristic); @@ -160,6 +171,11 @@ public abstract class BluetoothConnectionManager { super(BluetoothUtils.CYCLING_SPEED_CADENCE_SERVICE_UUID, BluetoothUtils.CYCLING_SPPED_CADENCE_MEASUREMENT_CHAR_UUID, observer); } + @Override + protected SensorData createPreConnectSensorData(String address) { + return new SensorDataCycling.Cadence(address); + } + @Override protected SensorDataCycling.Cadence parsePayload(String sensorName, String address, BluetoothGattCharacteristic characteristic) { SensorDataCycling.CadenceAndSpeed cadenceAndSpeed = BluetoothUtils.parseCyclingCrankAndWheel(address, sensorName, characteristic); @@ -186,6 +202,11 @@ public abstract class BluetoothConnectionManager { super(BluetoothUtils.CYCLING_SPEED_CADENCE_SERVICE_UUID, BluetoothUtils.CYCLING_SPPED_CADENCE_MEASUREMENT_CHAR_UUID, observer); } + @Override + protected SensorData createPreConnectSensorData(String address) { + return new SensorDataCycling.Speed(address); + } + @Override protected SensorDataCycling.Speed parsePayload(String sensorName, String address, BluetoothGattCharacteristic characteristic) { SensorDataCycling.CadenceAndSpeed cadenceAndSpeed = BluetoothUtils.parseCyclingCrankAndWheel(address, sensorName, characteristic);