BluetoothSensorManager: on initiate connect to sensor, report address to be shown on UI.

Fixes #64.
This commit is contained in:
Dennis Guse
2020-10-31 08:42:20 +01:00
parent 08b9cb31fa
commit b6850eb46f
6 changed files with 56 additions and 6 deletions
@@ -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.
*/
@@ -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;
@@ -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;
@@ -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);
@@ -689,7 +689,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
}
SensorDataSet getSensorDataSet() {
if (remoteSensorManager == null || !remoteSensorManager.isEnabled()) {
if (remoteSensorManager == null) {
return null;
}
@@ -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);