forked from upstream-mirrors/OpenTracks
03dd0c2308
Fixes #1424.
57 lines
2.1 KiB
Java
57 lines
2.1 KiB
Java
package de.dennisguse.opentracks.sensors;
|
|
|
|
import android.bluetooth.BluetoothGattCharacteristic;
|
|
import android.util.Log;
|
|
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
|
|
import de.dennisguse.opentracks.data.models.AtmosphericPressure;
|
|
import de.dennisguse.opentracks.sensors.sensorData.Aggregator;
|
|
import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer;
|
|
import de.dennisguse.opentracks.sensors.sensorData.Raw;
|
|
import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface;
|
|
|
|
public class BluetoothHandlerBarometricPressure implements SensorHandlerInterface {
|
|
private static final UUID ENVIRONMENTAL_SENSING_SERVICE = new UUID(0x181A00001000L, 0x800000805f9b34fbL);
|
|
public static final ServiceMeasurementUUID BAROMETRIC_PRESSURE = new ServiceMeasurementUUID(
|
|
ENVIRONMENTAL_SENSING_SERVICE,
|
|
new UUID(0x2A6D00001000L, 0x800000805f9b34fbL)
|
|
);
|
|
|
|
@Override
|
|
public List<ServiceMeasurementUUID> getServices() {
|
|
return List.of(BAROMETRIC_PRESSURE);
|
|
}
|
|
|
|
@Override
|
|
public Aggregator<?, ?> createEmptySensorData(String address, String name) {
|
|
return new AggregatorBarometer(address, name);
|
|
}
|
|
|
|
@Override
|
|
public void handlePayload(SensorManager.SensorDataChangedObserver observer, ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) {
|
|
AtmosphericPressure value = parseEnvironmentalSensing(characteristic);
|
|
if (value == null) return;
|
|
Log.i("ZXCV", "VALUE: " + value);
|
|
observer.onChange(new Raw<>(value));
|
|
}
|
|
|
|
/**
|
|
* Decoding:
|
|
* org.bluetooth.service.environmental_sensing.xml
|
|
* org.bluetooth.characteristic.pressure.xml
|
|
*/
|
|
public static AtmosphericPressure parseEnvironmentalSensing(BluetoothGattCharacteristic characteristic) {
|
|
byte[] raw = characteristic.getValue();
|
|
|
|
if (raw.length < 4) {
|
|
return null;
|
|
}
|
|
|
|
Integer pressure = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT32, 0);
|
|
return AtmosphericPressure.ofPA(pressure / 10f);
|
|
}
|
|
|
|
}
|