diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index 8b240c8bd..201fe3ddd 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -66,8 +66,8 @@ import de.dennisguse.opentracks.data.models.TrackBuilder; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.io.file.TrackFileFormat; import de.dennisguse.opentracks.io.file.exporter.TrackExporter; -import de.dennisguse.opentracks.sensors.BluetoothHandlerCyclingPower; import de.dennisguse.opentracks.sensors.SensorManager; +import de.dennisguse.opentracks.sensors.driver.CyclingPowerBluetooth; import de.dennisguse.opentracks.sensors.sensorData.Aggregator; import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer; import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingCadence; @@ -663,7 +663,7 @@ public class ExportImportTest { SensorManager sensorManager = trackPointCreator.getSensorManager(); AggregatorCyclingPower cyclingPower = new AggregatorCyclingPower("", ""); - cyclingPower.add(trackPointCreator.getNow(), new BluetoothHandlerCyclingPower.Data(Power.of(power), null)); + cyclingPower.add(trackPointCreator.getNow(), new CyclingPowerBluetooth.Data(Power.of(power), null)); sensorManager.add(cyclingPower); diff --git a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerBarometricPressureTest.java b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/BluetoothHandlerBarometricPressureTest.java similarity index 69% rename from src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerBarometricPressureTest.java rename to src/androidTest/java/de/dennisguse/opentracks/sensors/driver/BluetoothHandlerBarometricPressureTest.java index 1a4ae59c7..e75ef520b 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerBarometricPressureTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/BluetoothHandlerBarometricPressureTest.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import static org.junit.Assert.assertEquals; @@ -13,11 +13,11 @@ public class BluetoothHandlerBarometricPressureTest { @Test public void parseEnvironmentalSensing_Pa() { // given - BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothHandlerBarometricPressure.BAROMETRIC_PRESSURE.serviceUUID(), 0, 0); + BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BarometerBluetooth.BAROMETRIC_PRESSURE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{(byte) 0xB2, (byte) 0x48, (byte) 0x0F, (byte) 0x00}); // when - AtmosphericPressure pressure = BluetoothHandlerBarometricPressure.parseEnvironmentalSensing(characteristic); + AtmosphericPressure pressure = BarometerBluetooth.parseEnvironmentalSensing(characteristic); // then assertEquals(AtmosphericPressure.ofHPA(1001.65f), pressure); diff --git a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerHeartRateTest.java b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/BluetoothHandlerHeartRateTest.java similarity index 67% rename from src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerHeartRateTest.java rename to src/androidTest/java/de/dennisguse/opentracks/sensors/driver/BluetoothHandlerHeartRateTest.java index 6cbfaa2d8..90f9b1301 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerHeartRateTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/BluetoothHandlerHeartRateTest.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import static org.junit.Assert.assertEquals; @@ -13,11 +13,11 @@ public class BluetoothHandlerHeartRateTest { @Test public void parseHeartRate_uint8() { // given - BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothHandlerHeartRate.HEARTRATE.serviceUUID(), 0, 0); + BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(HeartRateBluetooth.HEARTRATE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x02, 0x3C}); // when - HeartRate heartRate = BluetoothHandlerHeartRate.parseHeartRate(characteristic); + HeartRate heartRate = HeartRateBluetooth.parseHeartRate(characteristic); // then assertEquals(HeartRate.of(60), heartRate); @@ -26,11 +26,11 @@ public class BluetoothHandlerHeartRateTest { @Test public void parseHeartRate_uint16() { // given - BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothHandlerHeartRate.HEARTRATE.serviceUUID(), 0, 0); + BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(HeartRateBluetooth.HEARTRATE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x01, 0x01, 0x01}); // when - HeartRate heartRate = BluetoothHandlerHeartRate.parseHeartRate(characteristic); + HeartRate heartRate = HeartRateBluetooth.parseHeartRate(characteristic); // then assertEquals(HeartRate.of(257), heartRate); diff --git a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingDistanceSpeedTest.java b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/CyclingDistanceSpeedBluetoothTest.java similarity index 57% rename from src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingDistanceSpeedTest.java rename to src/androidTest/java/de/dennisguse/opentracks/sensors/driver/CyclingDistanceSpeedBluetoothTest.java index 58bbbfacd..989757209 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingDistanceSpeedTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/CyclingDistanceSpeedBluetoothTest.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -8,14 +8,14 @@ import android.util.Pair; import org.junit.Test; -public class BluetoothHandlerCyclingDistanceSpeedTest { +public class CyclingDistanceSpeedBluetoothTest { @Test public void parseCyclingSpeedCadence_crankOnly() { - BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothHandlerCyclingDistanceSpeed.CYCLING_SPEED_CADENCE.serviceUUID(), 0, 0); + BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(CyclingDistanceSpeedBluetooth.CYCLING_SPEED_CADENCE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x02, (byte) 0xC8, 0x00, 0x00, 0x00, 0x06, (byte) 0x99}); // when - Pair sensor = BluetoothHandlerCyclingDistanceSpeed.parseCyclingCrankAndWheel("address", "sensorName", characteristic); + Pair sensor = CyclingDistanceSpeedBluetooth.parseCyclingCrankAndWheel(characteristic); // then assertNull(sensor.first); @@ -24,11 +24,11 @@ public class BluetoothHandlerCyclingDistanceSpeedTest { @Test public void parseCyclingSpeedCadence_wheelOnly() { - BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothHandlerCyclingDistanceSpeed.CYCLING_SPEED_CADENCE.serviceUUID(), 0, 0); + BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(CyclingDistanceSpeedBluetooth.CYCLING_SPEED_CADENCE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x01, (byte) 0xFF, (byte) 0xFF, 0, 1, 0x45, (byte) 0x99}); // when - Pair sensor = BluetoothHandlerCyclingDistanceSpeed.parseCyclingCrankAndWheel("address", "sensorName", characteristic); + Pair sensor = CyclingDistanceSpeedBluetooth.parseCyclingCrankAndWheel(characteristic); // then assertEquals(65535 + 16777216, sensor.first.wheelRevolutionsCount()); @@ -37,11 +37,11 @@ public class BluetoothHandlerCyclingDistanceSpeedTest { @Test public void parseCyclingSpeedCadence_crankWheel() { - BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothHandlerCyclingDistanceSpeed.CYCLING_SPEED_CADENCE.serviceUUID(), 0, 0); + BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(CyclingDistanceSpeedBluetooth.CYCLING_SPEED_CADENCE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x03, (byte) 0xC8, 0x00, 0x00, 0x01, 0x06, (byte) 0x99, (byte) 0xE1, 0x00, 0x45, (byte) 0x99}); // when - Pair sensor = BluetoothHandlerCyclingDistanceSpeed.parseCyclingCrankAndWheel("address", "sensorName", characteristic); + Pair sensor = CyclingDistanceSpeedBluetooth.parseCyclingCrankAndWheel(characteristic); // then assertEquals(200 + 16777216, sensor.first.wheelRevolutionsCount()); diff --git a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingPowerTest.java b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/CyclingPowerBluetoothTest.java similarity index 64% rename from src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingPowerTest.java rename to src/androidTest/java/de/dennisguse/opentracks/sensors/driver/CyclingPowerBluetoothTest.java index 494a1705e..9fa28f13c 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingPowerTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/CyclingPowerBluetoothTest.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import static org.junit.Assert.assertEquals; @@ -6,15 +6,15 @@ import android.bluetooth.BluetoothGattCharacteristic; import org.junit.Test; -public class BluetoothHandlerCyclingPowerTest { +public class CyclingPowerBluetoothTest { @Test public void parseCyclingPower_power() { - BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothHandlerCyclingPower.CYCLING_POWER.serviceUUID(), 0, 0); + BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(CyclingPowerBluetooth.CYCLING_POWER.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0, 0, 40, 0}); // when - BluetoothHandlerCyclingPower.Data powerCadence = BluetoothHandlerCyclingPower.parseCyclingPower(characteristic); + CyclingPowerBluetooth.Data powerCadence = CyclingPowerBluetooth.parseCyclingPower(characteristic); // then assertEquals(40, powerCadence.power().getW(), 0.01); @@ -22,11 +22,11 @@ public class BluetoothHandlerCyclingPowerTest { @Test public void parseCyclingPower_power_with_cadence() { - BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothHandlerCyclingPower.CYCLING_POWER.serviceUUID(), 0, 0); + BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(CyclingPowerBluetooth.CYCLING_POWER.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x2C, 0x00, 0x00, 0x00, (byte) 0x9F, 0x00, 0x0C, 0x00, (byte) 0xE5, 0x42}); // when - BluetoothHandlerCyclingPower.Data powerCadence = BluetoothHandlerCyclingPower.parseCyclingPower(characteristic); + CyclingPowerBluetooth.Data powerCadence = CyclingPowerBluetooth.parseCyclingPower(characteristic); // then assertEquals(0, powerCadence.power().getW(), 0.01); diff --git a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerRunningSpeedAndCadenceTest.java b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/RunningSpeedAndCadenceBluetoothTest.java similarity index 67% rename from src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerRunningSpeedAndCadenceTest.java rename to src/androidTest/java/de/dennisguse/opentracks/sensors/driver/RunningSpeedAndCadenceBluetoothTest.java index 7ca2507e3..9442f4b80 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/sensors/BluetoothHandlerRunningSpeedAndCadenceTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/sensors/driver/RunningSpeedAndCadenceBluetoothTest.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import static org.junit.Assert.assertEquals; @@ -10,15 +10,15 @@ import de.dennisguse.opentracks.data.models.Cadence; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Speed; -public class BluetoothHandlerRunningSpeedAndCadenceTest { +public class RunningSpeedAndCadenceBluetoothTest { @Test public void parseRunningSpeedAndCadence_with_distance() { - BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothHandlerRunningSpeedAndCadence.RUNNING_SPEED_CADENCE.serviceUUID(), 0, 0); + BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(RunningSpeedAndCadenceBluetooth.RUNNING_SPEED_CADENCE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{2, 0, 5, 80, (byte) 0xFF, (byte) 0xFF, 0, 1}); // when - BluetoothHandlerRunningSpeedAndCadence.Data sensor = BluetoothHandlerRunningSpeedAndCadence.parseRunningSpeedAndCadence("sensorName", characteristic); + RunningSpeedAndCadenceBluetooth.Data sensor = RunningSpeedAndCadenceBluetooth.parseRunningSpeedAndCadence("sensorName", characteristic); // then assertEquals(Speed.of(5), sensor.speed()); diff --git a/src/androidTest/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataCyclingTest.java b/src/androidTest/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataCyclingTest.java index 23d404b03..51b41cd15 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataCyclingTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataCyclingTest.java @@ -13,9 +13,9 @@ import java.time.Instant; import de.dennisguse.opentracks.data.models.Cadence; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Speed; -import de.dennisguse.opentracks.sensors.BluetoothHandlerCyclingCadence; -import de.dennisguse.opentracks.sensors.BluetoothHandlerCyclingDistanceSpeed; import de.dennisguse.opentracks.sensors.UintUtils; +import de.dennisguse.opentracks.sensors.driver.CyclingCadenceBluetooth; +import de.dennisguse.opentracks.sensors.driver.CyclingDistanceSpeedBluetooth; @RunWith(AndroidJUnit4.class) public class SensorDataCyclingTest { @@ -25,8 +25,8 @@ public class SensorDataCyclingTest { AggregatorCyclingCadence current = new AggregatorCyclingCadence("", ""); // when - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(1, 1024)); - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(2, 2048)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(1, 1024)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(2, 2048)); // then assertEquals(60, current.getAggregatedValue(Instant.MIN).getRPM(), 0.01); @@ -37,8 +37,8 @@ public class SensorDataCyclingTest { AggregatorCyclingCadence current = new AggregatorCyclingCadence("", ""); // when - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(1, 6184)); - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(2, 8016)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(1, 6184)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(2, 8016)); // then assertEquals(33.53, current.getAggregatedValue(Instant.MIN).getRPM(), 0.01); @@ -49,8 +49,8 @@ public class SensorDataCyclingTest { AggregatorCyclingCadence current = new AggregatorCyclingCadence("", ""); // when - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(1, 1024)); - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(1, 2048)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(1, 1024)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(1, 2048)); // then assertEquals(Cadence.of(0), current.getAggregatedValue(Instant.MIN)); @@ -62,8 +62,8 @@ public class SensorDataCyclingTest { AggregatorCyclingCadence current = new AggregatorCyclingCadence("", ""); // when - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(1, 1024)); - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(2, 1024)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(1, 1024)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(2, 1024)); // then assertFalse(current.hasReceivedData()); //TODO Cadence should be 0? @@ -74,8 +74,8 @@ public class SensorDataCyclingTest { AggregatorCyclingCadence current = new AggregatorCyclingCadence("", ""); // when - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(1, UintUtils.UINT16_MAX - 1024)); - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(2, 0)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(1, UintUtils.UINT16_MAX - 1024)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(2, 0)); // then assertEquals(60, current.getAggregatedValue(Instant.MIN).getRPM(), 0.01); @@ -87,8 +87,8 @@ public class SensorDataCyclingTest { AggregatorCyclingCadence current = new AggregatorCyclingCadence("", ""); // when - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(UintUtils.UINT32_MAX - 1, 1024)); - current.add(Instant.MIN, new BluetoothHandlerCyclingCadence.CrankData(0, 2048)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(UintUtils.UINT32_MAX - 1, 1024)); + current.add(Instant.MIN, new CyclingCadenceBluetooth.CrankData(0, 2048)); // then // TODO See #953 @@ -102,8 +102,8 @@ public class SensorDataCyclingTest { current.setWheelCircumference(Distance.ofMM(2150)); // when - current.add(Instant.MIN, new BluetoothHandlerCyclingDistanceSpeed.WheelData(1, 6184)); - current.add(Instant.MIN, new BluetoothHandlerCyclingDistanceSpeed.WheelData(2, 8016)); + current.add(Instant.MIN, new CyclingDistanceSpeedBluetooth.WheelData(1, 6184)); + current.add(Instant.MIN, new CyclingDistanceSpeedBluetooth.WheelData(2, 8016)); // then assertEquals(2.15, current.getAggregatedValue(Instant.MIN).distance().toM(), 0.01); @@ -117,8 +117,8 @@ public class SensorDataCyclingTest { current.setWheelCircumference(Distance.ofMM(2000)); // when - current.add(Instant.MIN, new BluetoothHandlerCyclingDistanceSpeed.WheelData(UintUtils.UINT32_MAX - 1, 1024)); - current.add(Instant.MIN, new BluetoothHandlerCyclingDistanceSpeed.WheelData(0, 2048)); + current.add(Instant.MIN, new CyclingDistanceSpeedBluetooth.WheelData(UintUtils.UINT32_MAX - 1, 1024)); + current.add(Instant.MIN, new CyclingDistanceSpeedBluetooth.WheelData(0, 2048)); // then diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java index b70073f66..ae74caa10 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java @@ -42,8 +42,8 @@ import de.dennisguse.opentracks.data.models.Statistics; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.io.file.importer.TrackPointAssert; -import de.dennisguse.opentracks.sensors.BluetoothHandlerRunningSpeedAndCadence; import de.dennisguse.opentracks.sensors.SensorManager; +import de.dennisguse.opentracks.sensors.driver.RunningSpeedAndCadenceBluetooth; import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer; import de.dennisguse.opentracks.sensors.sensorData.AggregatorHeartRate; import de.dennisguse.opentracks.sensors.sensorData.AggregatorRunning; @@ -818,13 +818,13 @@ public class TrackRecordingServiceRecordingTest { String sensor1 = "2020-02-02T02:02:03Z"; trackPointCreator.setClock(sensor1); //Should be ignored - aggregatorRunning.add(trackPointCreator.getNow(), new BluetoothHandlerRunningSpeedAndCadence.Data(Speed.of(5), Cadence.of(1), Distance.ZERO)); + aggregatorRunning.add(trackPointCreator.getNow(), new RunningSpeedAndCadenceBluetooth.Data(Speed.of(5), Cadence.of(1), Distance.ZERO)); sensorManager.onChange(); // when String sensor2 = "2020-02-02T02:02:04Z"; trackPointCreator.setClock(sensor2); - aggregatorRunning.add(trackPointCreator.getNow(), new BluetoothHandlerRunningSpeedAndCadence.Data(Speed.of(5), Cadence.of(2), Distance.of(2))); + aggregatorRunning.add(trackPointCreator.getNow(), new RunningSpeedAndCadenceBluetooth.Data(Speed.of(5), Cadence.of(2), Distance.of(2))); sensorManager.onChange(); // when @@ -834,14 +834,14 @@ public class TrackRecordingServiceRecordingTest { // when String sensor3 = "2020-02-02T02:02:06Z"; trackPointCreator.setClock(sensor3); - aggregatorRunning.add(trackPointCreator.getNow(), new BluetoothHandlerRunningSpeedAndCadence.Data(Speed.of(5), Cadence.of(3), Distance.of(12))); + aggregatorRunning.add(trackPointCreator.getNow(), new RunningSpeedAndCadenceBluetooth.Data(Speed.of(5), Cadence.of(3), Distance.of(12))); sensorManager.onChange(); // when String sensor4 = "2020-02-02T02:02:07Z"; trackPointCreator.setClock(sensor4); //Should be ignored - aggregatorRunning.add(trackPointCreator.getNow(), new BluetoothHandlerRunningSpeedAndCadence.Data(Speed.of(5), Cadence.of(4), Distance.of(14))); + aggregatorRunning.add(trackPointCreator.getNow(), new RunningSpeedAndCadenceBluetooth.Data(Speed.of(5), Cadence.of(4), Distance.of(14))); sensorManager.onChange(); // when @@ -852,7 +852,7 @@ public class TrackRecordingServiceRecordingTest { String sensor5 = "2020-02-02T02:02:10Z"; trackPointCreator.setClock(sensor5); //Should be ignored - aggregatorRunning.add(trackPointCreator.getNow(), new BluetoothHandlerRunningSpeedAndCadence.Data(Speed.of(5), Cadence.of(5), Distance.of(16))); + aggregatorRunning.add(trackPointCreator.getNow(), new RunningSpeedAndCadenceBluetooth.Data(Speed.of(5), Cadence.of(5), Distance.of(16))); sensorManager.onChange(); // when diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingCadence.java b/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingCadence.java deleted file mode 100644 index 383feded5..000000000 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingCadence.java +++ /dev/null @@ -1,57 +0,0 @@ -package de.dennisguse.opentracks.sensors; - -import android.bluetooth.BluetoothGattCharacteristic; -import android.util.Log; -import android.util.Pair; - -import java.util.List; - -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingCadence; -import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface; - -public class BluetoothHandlerCyclingCadence implements SensorHandlerInterface { - private static final String TAG = BluetoothHandlerCyclingCadence.class.getSimpleName(); - - public static final List CYCLING_CADENCE = List.of( - BluetoothHandlerCyclingPower.CYCLING_POWER, - BluetoothHandlerCyclingDistanceSpeed.CYCLING_SPEED_CADENCE - ); - - @Override - public List getServices() { - return CYCLING_CADENCE; - } - - @Override - public AggregatorCyclingCadence createEmptySensorData(String address, String name) { - return new AggregatorCyclingCadence(address, name); - } - - @Override - public void handlePayload(DriverObserver0 observer, ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) { - if (serviceMeasurementUUID.equals(BluetoothHandlerCyclingPower.CYCLING_POWER)) { - BluetoothHandlerCyclingPower.Data data = BluetoothHandlerCyclingPower.parseCyclingPower(characteristic); - if (data != null && data.crank() != null) { - observer.onChange(data.crank()); - } - return; - } - - if (serviceMeasurementUUID.equals(BluetoothHandlerCyclingDistanceSpeed.CYCLING_SPEED_CADENCE)) { - Pair data = BluetoothHandlerCyclingDistanceSpeed.parseCyclingCrankAndWheel(address, sensorName, characteristic); - - if (data != null && data.second != null) { - observer.onChange(data.second); - } - return; - } - - Log.e(TAG, "Don't know how to decode this payload."); - } - - public record CrankData( - long crankRevolutionsCount, // UINT32 - int crankRevolutionsTime // UINT16; 1/1024s - ) {} -} diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerTemperature.java b/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerTemperature.java deleted file mode 100644 index a5e4e6f06..000000000 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerTemperature.java +++ /dev/null @@ -1,53 +0,0 @@ -package de.dennisguse.opentracks.sensors; - -import static de.dennisguse.opentracks.sensors.BluetoothHandlerBarometricPressure.ENVIRONMENTAL_SENSING_SERVICE; - -import android.bluetooth.BluetoothGattCharacteristic; - -import java.util.List; -import java.util.UUID; - -import de.dennisguse.opentracks.data.models.Temperature; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.Aggregator; -import de.dennisguse.opentracks.sensors.sensorData.AggregatorTemperature; -import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface; - -public class BluetoothHandlerTemperature implements SensorHandlerInterface { - public static final ServiceMeasurementUUID TEMPERATURE = new ServiceMeasurementUUID( - ENVIRONMENTAL_SENSING_SERVICE, - new UUID(0x2A6E00001000L, 0x800000805f9b34fbL) - ); - - @Override - public List getServices() { - return List.of(TEMPERATURE); - } - - @Override - public Aggregator createEmptySensorData(String address, String name) { - return new AggregatorTemperature(address, name); - } - - @Override - public void handlePayload(DriverObserver0 observer, ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) { - Temperature value = parseEnvironmentalSensing(characteristic); - if (value == null) return; - - observer.onChange(value); - } - - /** - * Decoding: org.bluetooth.characteristic.temperature.xml - */ - public static Temperature parseEnvironmentalSensing(BluetoothGattCharacteristic characteristic) { - byte[] raw = characteristic.getValue(); - - if (raw.length < 2) { - return null; - } - - Integer pressure = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_SINT16, 0); - return Temperature.ofCentiCelsius(pressure); - } -} diff --git a/src/main/java/de/dennisguse/opentracks/sensors/CyclingCadenceHandler.java b/src/main/java/de/dennisguse/opentracks/sensors/CyclingCadenceHandler.java index 3f97b7edf..4fde2f997 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/CyclingCadenceHandler.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/CyclingCadenceHandler.java @@ -3,12 +3,13 @@ package de.dennisguse.opentracks.sensors; import androidx.annotation.NonNull; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.sensors.driver.BluetoothDriver; +import de.dennisguse.opentracks.sensors.driver.CyclingCadenceBluetooth; import de.dennisguse.opentracks.sensors.driver.Driver; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; import de.dennisguse.opentracks.sensors.sensorData.Aggregator; import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingCadence; -public class CyclingCadenceHandler extends SensorHandler { +public class CyclingCadenceHandler extends SensorHandler { protected CyclingCadenceHandler(SensorManager sensorManager) { super(sensorManager); @@ -17,36 +18,16 @@ public class CyclingCadenceHandler extends SensorHandler( BluetoothUtils.getAdapter(getContext()), - new DriverObserver0() { - @Override - public void onConnect(Aggregator emptySensorData) { - driverObserver.onConnect(); - } - - @Override - public void onDisconnect(Aggregator emptySensorData) { - driverObserver.onDisconnect(); - } - - @Override - public void onRemove(Aggregator emptySensorData) { - driverObserver.onRemove(); - } - - @Override - public void onChange(Record value) { - driverObserver.onData((BluetoothHandlerCyclingCadence.CrankData) value); - } - }, - new BluetoothHandlerCyclingCadence() + driverObserver, + new CyclingCadenceBluetooth() ); } @NonNull @Override - protected Aggregator createAggregator() { + protected Aggregator createAggregator() { return new AggregatorCyclingCadence("", null); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/CyclingDistanceSpeedHandler.java b/src/main/java/de/dennisguse/opentracks/sensors/CyclingDistanceSpeedHandler.java index c7bcb99bf..54d07c3b4 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/CyclingDistanceSpeedHandler.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/CyclingDistanceSpeedHandler.java @@ -3,13 +3,12 @@ package de.dennisguse.opentracks.sensors; import androidx.annotation.NonNull; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.sensors.driver.BluetoothDriver; +import de.dennisguse.opentracks.sensors.driver.CyclingDistanceSpeedBluetooth; import de.dennisguse.opentracks.sensors.driver.Driver; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.Aggregator; import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingDistanceSpeed; -import de.dennisguse.opentracks.settings.PreferencesUtils; -public class CyclingDistanceSpeedHandler extends SensorHandler { +public class CyclingDistanceSpeedHandler extends SensorHandler { protected CyclingDistanceSpeedHandler(SensorManager sensorManager) { super(sensorManager); @@ -18,31 +17,11 @@ public class CyclingDistanceSpeedHandler extends SensorHandler( BluetoothUtils.getAdapter(getContext()), - new DriverObserver0() { - @Override - public void onConnect(Aggregator emptySensorData) { - driverObserver.onConnect(); - } - - @Override - public void onDisconnect(Aggregator emptySensorData) { - driverObserver.onDisconnect(); - } - - @Override - public void onRemove(Aggregator emptySensorData) { - driverObserver.onRemove(); - } - - @Override - public void onChange(Record value) { - ((AggregatorCyclingDistanceSpeed) getAggregator()).setWheelCircumference(PreferencesUtils.getWheelCircumference()); //TODO Fetch once and then listen for changes.); - driverObserver.onData((BluetoothHandlerCyclingDistanceSpeed.WheelData) value); - } - }, - new BluetoothHandlerCyclingDistanceSpeed() + driverObserver, + new CyclingDistanceSpeedBluetooth() ); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/CyclingPowerHandler.java b/src/main/java/de/dennisguse/opentracks/sensors/CyclingPowerHandler.java index a646333b0..65f43d2e4 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/CyclingPowerHandler.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/CyclingPowerHandler.java @@ -3,12 +3,12 @@ package de.dennisguse.opentracks.sensors; import androidx.annotation.NonNull; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.sensors.driver.BluetoothDriver; +import de.dennisguse.opentracks.sensors.driver.CyclingPowerBluetooth; import de.dennisguse.opentracks.sensors.driver.Driver; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.Aggregator; import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingPower; -public class CyclingPowerHandler extends SensorHandler { +public class CyclingPowerHandler extends SensorHandler { protected CyclingPowerHandler(SensorManager sensorManager) { super(sensorManager); @@ -17,30 +17,10 @@ public class CyclingPowerHandler extends SensorHandler( BluetoothUtils.getAdapter(getContext()), - new DriverObserver0() { - @Override - public void onConnect(Aggregator emptySensorData) { - driverObserver.onConnect(); - } - - @Override - public void onDisconnect(Aggregator emptySensorData) { - driverObserver.onDisconnect(); - } - - @Override - public void onRemove(Aggregator emptySensorData) { - driverObserver.onRemove(); - } - - @Override - public void onChange(Record value) { - driverObserver.onData((BluetoothHandlerCyclingPower.Data) value); - } - }, - new BluetoothHandlerCyclingPower() + driverObserver, + new CyclingPowerBluetooth() ); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/GainManager.java b/src/main/java/de/dennisguse/opentracks/sensors/GainManager.java index 8aa136bc1..64a67ff0c 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/GainManager.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/GainManager.java @@ -4,9 +4,10 @@ import androidx.annotation.NonNull; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.models.AtmosphericPressure; +import de.dennisguse.opentracks.sensors.driver.BarometerBluetooth; import de.dennisguse.opentracks.sensors.driver.BarometerInternal; +import de.dennisguse.opentracks.sensors.driver.BluetoothDriver; import de.dennisguse.opentracks.sensors.driver.Driver; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; import de.dennisguse.opentracks.sensors.sensorData.Aggregator; import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer; @@ -34,30 +35,10 @@ public class GainManager extends SensorHandler { @NonNull @Override protected Driver createDriverBluetooth(String address) { - return new BluetoothConnectionManager( + return new BluetoothDriver<>( BluetoothUtils.getAdapter(getContext()), - new DriverObserver0() { - @Override - public void onConnect(Aggregator emptySensorData) { - driverObserver.onConnect(); - } - - @Override - public void onDisconnect(Aggregator emptySensorData) { - driverObserver.onDisconnect(); - } - - @Override - public void onRemove(Aggregator emptySensorData) { - driverObserver.onRemove(); - } - - @Override - public void onChange(Record value) { - driverObserver.onData((AtmosphericPressure) value); - } - }, - new BluetoothHandlerBarometricPressure() + driverObserver, + new BarometerBluetooth() ); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/HeartRateHandler.java b/src/main/java/de/dennisguse/opentracks/sensors/HeartRateHandler.java index 55df2dba6..b4e911f24 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/HeartRateHandler.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/HeartRateHandler.java @@ -4,8 +4,9 @@ import androidx.annotation.NonNull; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.models.HeartRate; +import de.dennisguse.opentracks.sensors.driver.BluetoothDriver; import de.dennisguse.opentracks.sensors.driver.Driver; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; +import de.dennisguse.opentracks.sensors.driver.HeartRateBluetooth; import de.dennisguse.opentracks.sensors.sensorData.Aggregator; import de.dennisguse.opentracks.sensors.sensorData.AggregatorHeartRate; @@ -18,30 +19,10 @@ public class HeartRateHandler extends SensorHandler { @NonNull @Override protected Driver createDriverBluetooth(String address) { - return new BluetoothConnectionManager( + return new BluetoothDriver<>( BluetoothUtils.getAdapter(getContext()), - new DriverObserver0() { - @Override - public void onConnect(Aggregator emptySensorData) { - driverObserver.onConnect(); - } - - @Override - public void onDisconnect(Aggregator emptySensorData) { - driverObserver.onDisconnect(); - } - - @Override - public void onRemove(Aggregator emptySensorData) { - driverObserver.onRemove(); - } - - @Override - public void onChange(Record value) { - driverObserver.onData((HeartRate) value); - } - }, - new BluetoothHandlerHeartRate() + driverObserver, + new HeartRateBluetooth() ); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/RunningSpeedCadenceDistanceHandler.java b/src/main/java/de/dennisguse/opentracks/sensors/RunningSpeedCadenceDistanceHandler.java index 98e7ca033..e2b2d6333 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/RunningSpeedCadenceDistanceHandler.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/RunningSpeedCadenceDistanceHandler.java @@ -3,12 +3,12 @@ package de.dennisguse.opentracks.sensors; import androidx.annotation.NonNull; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.sensors.driver.BluetoothDriver; import de.dennisguse.opentracks.sensors.driver.Driver; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.Aggregator; +import de.dennisguse.opentracks.sensors.driver.RunningSpeedAndCadenceBluetooth; import de.dennisguse.opentracks.sensors.sensorData.AggregatorRunning; -public class RunningSpeedCadenceDistanceHandler extends SensorHandler { +public class RunningSpeedCadenceDistanceHandler extends SensorHandler { protected RunningSpeedCadenceDistanceHandler(SensorManager sensorManager) { super(sensorManager); @@ -17,30 +17,10 @@ public class RunningSpeedCadenceDistanceHandler extends SensorHandler( BluetoothUtils.getAdapter(getContext()), - new DriverObserver0() { - @Override - public void onConnect(Aggregator emptySensorData) { - driverObserver.onConnect(); - } - - @Override - public void onDisconnect(Aggregator emptySensorData) { - driverObserver.onDisconnect(); - } - - @Override - public void onRemove(Aggregator emptySensorData) { - driverObserver.onRemove(); - } - - @Override - public void onChange(Record value) { - driverObserver.onData((BluetoothHandlerRunningSpeedAndCadence.Data) value); - } - }, - new BluetoothHandlerRunningSpeedAndCadence() + driverObserver, + new RunningSpeedAndCadenceBluetooth() ); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/SensorHandler.java b/src/main/java/de/dennisguse/opentracks/sensors/SensorHandler.java index e4b93037c..542f82126 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/SensorHandler.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/SensorHandler.java @@ -22,7 +22,7 @@ public abstract class SensorHandler { private Aggregator aggregator; - protected final DriverObserver driverObserver = new DriverObserver() { + protected final DriverObserver driverObserver = new DriverObserver<>() { @Override public void onConnect() { SensorHandler.this.aggregator = createAggregator(); diff --git a/src/main/java/de/dennisguse/opentracks/sensors/SensorManager.java b/src/main/java/de/dennisguse/opentracks/sensors/SensorManager.java index 0adc79c2a..0bf27eec2 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/SensorManager.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/SensorManager.java @@ -17,7 +17,7 @@ import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.HeartRate; import de.dennisguse.opentracks.data.models.Position; import de.dennisguse.opentracks.data.models.Speed; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; +import de.dennisguse.opentracks.sensors.driver.BluetoothDriver; import de.dennisguse.opentracks.sensors.sensorData.Aggregator; import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer; import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingCadence; @@ -34,8 +34,7 @@ import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.util.SystemUtils; //TODO provide context and handler for different Managers (not passing via start(), but similar to getNow()). -//TODO Remove DriverObserver from SensorManager -public class SensorManager implements SharedPreferences.OnSharedPreferenceChangeListener, DriverObserver0 { +public class SensorManager implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = SensorManager.class.getSimpleName(); @@ -122,8 +121,6 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange context = null; handler = null; - - clear(); } public void reset() { @@ -160,7 +157,7 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange this.altitudeSumManager = altitudeSumManager; } - private synchronized void connect(BluetoothConnectionManager connectionManager, String address) { + private synchronized void connect(BluetoothDriver connectionManager, String address) { connectionManager.connect(context, handler, address); } @@ -199,27 +196,6 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange } } - //TODO Inlined from SensorDataAggregator; Aggregators will be moved into Drivers. - @Deprecated - public void onConnect(Aggregator aggregator) { - throw new UnsupportedOperationException(); - } - - @Deprecated - public void onDisconnect(Aggregator aggregator) { - throw new UnsupportedOperationException(); - } - - @Deprecated - public void onRemove(Aggregator aggregator) { - throw new UnsupportedOperationException(); - } - - @Override - public void onChange(Record value) { - throw new UnsupportedOperationException(); - } - public Instant getNow() { return observer.getNow(); } @@ -240,8 +216,8 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange return ((AggregatorCyclingCadence) cyclingCadenceHandler.getAggregator()).getAggregatedValueWithSensorName(now); } - if (runningSpeedCadenceDistanceHandler.getAggregator() != null && runningSpeedCadenceDistanceHandler.getAggregator().hasReceivedData() && ((AggregatorRunning)runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue(now).cadence() != null) { - return new SensorData<>(((AggregatorRunning)runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue().cadence(), runningSpeedCadenceDistanceHandler.getAggregator().getSensorNameOrAddress()); + if (runningSpeedCadenceDistanceHandler.getAggregator() != null && runningSpeedCadenceDistanceHandler.getAggregator().hasReceivedData() && ((AggregatorRunning) runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue(now).cadence() != null) { + return new SensorData<>(((AggregatorRunning) runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue().cadence(), runningSpeedCadenceDistanceHandler.getAggregator().getSensorNameOrAddress()); } return null; @@ -253,7 +229,7 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange } if (runningSpeedCadenceDistanceHandler.getAggregator() != null && runningSpeedCadenceDistanceHandler.getAggregator().hasReceivedData()) { - return new SensorData<>(((AggregatorRunning)runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue(now).distance(), runningSpeedCadenceDistanceHandler.getAggregator().getSensorNameOrAddress()); + return new SensorData<>(((AggregatorRunning) runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue(now).distance(), runningSpeedCadenceDistanceHandler.getAggregator().getSensorNameOrAddress()); } @@ -267,8 +243,8 @@ public class SensorManager implements SharedPreferences.OnSharedPreferenceChange return new SensorData<>(((AggregatorCyclingDistanceSpeed) cyclingDistanceSpeedHandler.getAggregator()).getAggregatedValue(now).speed(), cyclingDistanceSpeedHandler.getAggregator().getSensorNameOrAddress()); } - if (runningSpeedCadenceDistanceHandler.getAggregator() != null && runningSpeedCadenceDistanceHandler.getAggregator().hasReceivedData() && ((AggregatorRunning)runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue(now).speed() != null) { - return new SensorData<>(((AggregatorRunning)runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue().speed(), runningSpeedCadenceDistanceHandler.getAggregator().getSensorNameOrAddress()); + if (runningSpeedCadenceDistanceHandler.getAggregator() != null && runningSpeedCadenceDistanceHandler.getAggregator().hasReceivedData() && ((AggregatorRunning) runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue(now).speed() != null) { + return new SensorData<>(((AggregatorRunning) runningSpeedCadenceDistanceHandler.getAggregator()).getAggregatedValue().speed(), runningSpeedCadenceDistanceHandler.getAggregator().getSensorNameOrAddress()); } return null; diff --git a/src/main/java/de/dennisguse/opentracks/sensors/TemperatureHandler.java b/src/main/java/de/dennisguse/opentracks/sensors/TemperatureHandler.java index 8a1ddb3b0..5b990d72b 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/TemperatureHandler.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/TemperatureHandler.java @@ -4,8 +4,9 @@ import androidx.annotation.NonNull; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.models.Temperature; +import de.dennisguse.opentracks.sensors.driver.BluetoothDriver; import de.dennisguse.opentracks.sensors.driver.Driver; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; +import de.dennisguse.opentracks.sensors.driver.TemperatureBluetooth; import de.dennisguse.opentracks.sensors.sensorData.Aggregator; import de.dennisguse.opentracks.sensors.sensorData.AggregatorTemperature; @@ -18,30 +19,10 @@ public class TemperatureHandler extends SensorHandler { @NonNull @Override protected Driver createDriverBluetooth(String address) { - return new BluetoothConnectionManager( + return new BluetoothDriver<>( BluetoothUtils.getAdapter(getContext()), - new DriverObserver0() { - @Override - public void onConnect(Aggregator emptySensorData) { - driverObserver.onConnect(); - } - - @Override - public void onDisconnect(Aggregator emptySensorData) { - driverObserver.onDisconnect(); - } - - @Override - public void onRemove(Aggregator emptySensorData) { - driverObserver.onRemove(); - } - - @Override - public void onChange(Record value) { - driverObserver.onData((Temperature) value); - } - }, - new BluetoothHandlerTemperature() + driverObserver, + new TemperatureBluetooth() ); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerBarometricPressure.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/BarometerBluetooth.java similarity index 55% rename from src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerBarometricPressure.java rename to src/main/java/de/dennisguse/opentracks/sensors/driver/BarometerBluetooth.java index 6ef0256a2..cfb2186b9 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerBarometricPressure.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/BarometerBluetooth.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import android.bluetooth.BluetoothGattCharacteristic; @@ -6,12 +6,9 @@ import java.util.List; import java.util.UUID; import de.dennisguse.opentracks.data.models.AtmosphericPressure; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.Aggregator; -import de.dennisguse.opentracks.sensors.sensorData.AggregatorBarometer; -import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface; +import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; -public class BluetoothHandlerBarometricPressure implements SensorHandlerInterface { +public class BarometerBluetooth implements BluetoothDriver.BluetoothParser { static final UUID ENVIRONMENTAL_SENSING_SERVICE = new UUID(0x181A00001000L, 0x800000805f9b34fbL); public static final ServiceMeasurementUUID BAROMETRIC_PRESSURE = new ServiceMeasurementUUID( ENVIRONMENTAL_SENSING_SERVICE, @@ -24,16 +21,8 @@ public class BluetoothHandlerBarometricPressure implements SensorHandlerInterfac } @Override - public Aggregator createEmptySensorData(String address, String name) { - return new AggregatorBarometer(address, name); - } - - @Override - public void handlePayload(DriverObserver0 observer, ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) { - AtmosphericPressure value = parseEnvironmentalSensing(characteristic); - if (value == null) return; - - observer.onChange(value); + public AtmosphericPressure parsePayload(ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, BluetoothGattCharacteristic characteristic) { + return parseEnvironmentalSensing(characteristic); } /** diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothConnectionManager.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/BluetoothDriver.java similarity index 82% rename from src/main/java/de/dennisguse/opentracks/sensors/BluetoothConnectionManager.java rename to src/main/java/de/dennisguse/opentracks/sensors/driver/BluetoothDriver.java index deeb24d82..811bdc769 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothConnectionManager.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/BluetoothDriver.java @@ -14,7 +14,7 @@ * the License. */ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; @@ -31,24 +31,24 @@ import android.util.Log; import androidx.annotation.NonNull; +import java.util.List; import java.util.Optional; import java.util.UUID; -import de.dennisguse.opentracks.sensors.driver.Driver; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface; +import de.dennisguse.opentracks.sensors.BluetoothUtils; +import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; /** * Manages connection to a Bluetooth LE sensor and subscribes for onChange-notifications. */ @SuppressLint("MissingPermission") -public class BluetoothConnectionManager implements Driver { +public class BluetoothDriver implements Driver { - private static final String TAG = BluetoothConnectionManager.class.getSimpleName(); + private static final String TAG = BluetoothDriver.class.getSimpleName(); - private final DriverObserver0 observer; + private final DriverObserver observer; - private final SensorHandlerInterface sensorHandler; + private final BluetoothParser sensorHandler; private final BluetoothAdapter bluetoothAdapter; private BluetoothGatt bluetoothGatt; @@ -128,11 +128,15 @@ public class BluetoothConnectionManager implements Driver { return; } - sensorHandler.handlePayload(observer, serviceMeasurementUUID.get(), gatt.getDevice().getName(), gatt.getDevice().getAddress(), characteristic); + T value = sensorHandler.parsePayload(serviceMeasurementUUID.get(), gatt.getDevice().getName(), characteristic); + if (value == null) { + return; + } + observer.onData(value); } }; - BluetoothConnectionManager(BluetoothAdapter bluetoothAdapter, DriverObserver0 observer, SensorHandlerInterface sensorHandler) { + public BluetoothDriver(BluetoothAdapter bluetoothAdapter, DriverObserver observer, BluetoothParser sensorHandler) { this.bluetoothAdapter = bluetoothAdapter; this.observer = observer; this.sensorHandler = sensorHandler; @@ -145,26 +149,11 @@ public class BluetoothConnectionManager implements Driver { return; } - if (SensorType.NONE.getPreferenceValue().equals(address)) { - Log.w(TAG, "NONE: going to disconnect"); - if (isConnected()) { - disconnect(); - observer.onRemove(sensorHandler.createEmptySensorData(null, null)); - } - return; - } - if (isConnected()) { - Log.w(TAG, "Already connected; ignoring."); + Log.e(TAG, "Already connected; ignoring."); return; } - if (isSameBluetoothDevice(address)) { - return; - } else { - disconnect(); - } - BluetoothDevice device; try { device = bluetoothAdapter.getRemoteDevice(address); @@ -177,11 +166,11 @@ public class BluetoothConnectionManager implements Driver { bluetoothGatt = device.connectGatt(context, false, connectCallback, BluetoothDevice.TRANSPORT_AUTO, 0, handler); - observer.onConnect(sensorHandler.createEmptySensorData(device.getAddress(), device.getName())); + observer.onConnect(); //TODO pass device.getAddress(), device.getName() } private synchronized void clearData() { - observer.onDisconnect(sensorHandler.createEmptySensorData(bluetoothGatt.getDevice().getAddress(), bluetoothGatt.getDevice().getName())); + observer.onDisconnect(); } @Override @@ -215,4 +204,11 @@ public class BluetoothConnectionManager implements Driver { public boolean isConnected() { return bluetoothGatt != null; } + + public interface BluetoothParser { + + List getServices(); + + T parsePayload(ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, BluetoothGattCharacteristic characteristic); + } } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/driver/CyclingCadenceBluetooth.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/CyclingCadenceBluetooth.java new file mode 100644 index 000000000..6177f131b --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/CyclingCadenceBluetooth.java @@ -0,0 +1,49 @@ +package de.dennisguse.opentracks.sensors.driver; + +import android.bluetooth.BluetoothGattCharacteristic; +import android.util.Log; +import android.util.Pair; + +import java.util.List; + +import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; + +public class CyclingCadenceBluetooth implements BluetoothDriver.BluetoothParser { + private static final String TAG = CyclingCadenceBluetooth.class.getSimpleName(); + + public static final List CYCLING_CADENCE = List.of( + CyclingPowerBluetooth.CYCLING_POWER, + CyclingDistanceSpeedBluetooth.CYCLING_SPEED_CADENCE + ); + + @Override + public List getServices() { + return CYCLING_CADENCE; + } + + @Override + public CrankData parsePayload(ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, BluetoothGattCharacteristic characteristic) { + if (serviceMeasurementUUID.equals(CyclingPowerBluetooth.CYCLING_POWER)) { + CyclingPowerBluetooth.Data data = CyclingPowerBluetooth.parseCyclingPower(characteristic); + if (data != null && data.crank() != null) { + return data.crank(); + } + } + + if (serviceMeasurementUUID.equals(CyclingDistanceSpeedBluetooth.CYCLING_SPEED_CADENCE)) { + Pair data = CyclingDistanceSpeedBluetooth.parseCyclingCrankAndWheel(characteristic); + + if (data != null && data.second != null) { + return data.second; + } + } + + Log.e(TAG, "Don't know how to decode this payload."); + return null; + } + + public record CrankData( + long crankRevolutionsCount, // UINT32 + int crankRevolutionsTime // UINT16; 1/1024s + ) {} +} diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingDistanceSpeed.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/CyclingDistanceSpeedBluetooth.java similarity index 61% rename from src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingDistanceSpeed.java rename to src/main/java/de/dennisguse/opentracks/sensors/driver/CyclingDistanceSpeedBluetooth.java index 3cb3742d9..30959e422 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingDistanceSpeed.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/CyclingDistanceSpeedBluetooth.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import android.bluetooth.BluetoothGattCharacteristic; import android.util.Pair; @@ -9,11 +9,9 @@ import androidx.annotation.VisibleForTesting; import java.util.List; import java.util.UUID; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingDistanceSpeed; -import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface; +import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; -public class BluetoothHandlerCyclingDistanceSpeed implements SensorHandlerInterface { +public class CyclingDistanceSpeedBluetooth implements BluetoothDriver.BluetoothParser { public static final ServiceMeasurementUUID CYCLING_SPEED_CADENCE = new ServiceMeasurementUUID( new UUID(0x181600001000L, 0x800000805f9b34fbL), @@ -26,22 +24,18 @@ public class BluetoothHandlerCyclingDistanceSpeed implements SensorHandlerInterf } @Override - public AggregatorCyclingDistanceSpeed createEmptySensorData(String address, String name) { - return new AggregatorCyclingDistanceSpeed(address, name); - } + public WheelData parsePayload(ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, BluetoothGattCharacteristic characteristic) { + Pair data = parseCyclingCrankAndWheel(characteristic); + if (data != null && data.first != null) { + return data.first; + } - @Override - public void handlePayload(DriverObserver0 observer, ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) { - Pair data = parseCyclingCrankAndWheel(address, sensorName, characteristic); - if (data == null) return; - if (data.first == null) return; - - observer.onChange(data.first); + return null; } @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) - public static Pair parseCyclingCrankAndWheel(String address, String sensorName, @NonNull BluetoothGattCharacteristic characteristic) { + public static Pair parseCyclingCrankAndWheel(@NonNull BluetoothGattCharacteristic characteristic) { // DOCUMENTATION https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Characteristics/org.bluetooth.characteristic.csc_measurement.xml int valueLength = characteristic.getValue().length; if (valueLength == 0) { @@ -62,13 +56,13 @@ public class BluetoothHandlerCyclingDistanceSpeed implements SensorHandlerInterf index += 2; } - BluetoothHandlerCyclingCadence.CrankData crankData = null; + CyclingCadenceBluetooth.CrankData crankData = null; if (hasCrank && valueLength - index >= 4) { long crankCount = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, index); index += 2; int crankTime = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, index); // 1/1024s - crankData = new BluetoothHandlerCyclingCadence.CrankData(crankCount, crankTime); + crankData = new CyclingCadenceBluetooth.CrankData(crankCount, crankTime); } return new Pair<>(wheelData, crankData); diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingPower.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/CyclingPowerBluetooth.java similarity index 67% rename from src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingPower.java rename to src/main/java/de/dennisguse/opentracks/sensors/driver/CyclingPowerBluetooth.java index 42c22d3a2..15c70c069 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerCyclingPower.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/CyclingPowerBluetooth.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import android.bluetooth.BluetoothGattCharacteristic; @@ -9,11 +9,9 @@ import java.util.List; import java.util.UUID; import de.dennisguse.opentracks.data.models.Power; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingPower; -import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface; +import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; -public class BluetoothHandlerCyclingPower implements SensorHandlerInterface { +public class CyclingPowerBluetooth implements BluetoothDriver.BluetoothParser { public static final ServiceMeasurementUUID CYCLING_POWER = new ServiceMeasurementUUID( new UUID(0x181800001000L, 0x800000805f9b34fbL), @@ -26,17 +24,8 @@ public class BluetoothHandlerCyclingPower implements SensorHandlerInterface { } @Override - public AggregatorCyclingPower createEmptySensorData(String address, String name) { - return new AggregatorCyclingPower(address, name); - } - - @Override - public void handlePayload(DriverObserver0 observer, @NonNull ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) { - Data cyclingPower = parseCyclingPower(characteristic); - - if (cyclingPower == null) return; - - observer.onChange(cyclingPower); + public CyclingPowerBluetooth.Data parsePayload(@NonNull ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, BluetoothGattCharacteristic characteristic) { + return parseCyclingPower(characteristic); } @@ -69,19 +58,22 @@ public class BluetoothHandlerCyclingPower implements SensorHandlerInterface { index += 2 + 2; } - BluetoothHandlerCyclingCadence.CrankData crankData = null; + CyclingCadenceBluetooth.CrankData crankData = null; if (hasCrank && valueLength - index >= 4) { long crankCount = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, index); index += 2; int crankTime = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, index); // 1/1024s - crankData = new BluetoothHandlerCyclingCadence.CrankData(crankCount, crankTime); + crankData = new CyclingCadenceBluetooth.CrankData(crankCount, crankTime); } return new Data(Power.of(instantaneousPower), crankData); } - public record Data(Power power, BluetoothHandlerCyclingCadence.CrankData crank) {} - + public record Data( + Power power, + CyclingCadenceBluetooth.CrankData crank + ) { + } } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/driver/DriverObserver0.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/DriverObserver0.java deleted file mode 100644 index 14d5f15c7..000000000 --- a/src/main/java/de/dennisguse/opentracks/sensors/driver/DriverObserver0.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.dennisguse.opentracks.sensors.driver; - -import de.dennisguse.opentracks.sensors.sensorData.Aggregator; - -@Deprecated //Use DriverObserver -public interface DriverObserver0 { - - //TODO Pass SensorName as parameter only - void onConnect(Aggregator emptySensorData); - - //TODO Remove parameter - void onDisconnect(Aggregator emptySensorData); - - //TODO Remove parameter - void onRemove(Aggregator emptySensorData); - - void onChange(Record value); - -} diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerHeartRate.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/HeartRateBluetooth.java similarity index 70% rename from src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerHeartRate.java rename to src/main/java/de/dennisguse/opentracks/sensors/driver/HeartRateBluetooth.java index a359fc145..15df1f19b 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerHeartRate.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/HeartRateBluetooth.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import android.bluetooth.BluetoothGattCharacteristic; @@ -9,11 +9,9 @@ import java.util.List; import java.util.UUID; import de.dennisguse.opentracks.data.models.HeartRate; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.AggregatorHeartRate; -import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface; +import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; -public class BluetoothHandlerHeartRate implements SensorHandlerInterface { +public class HeartRateBluetooth implements BluetoothDriver.BluetoothParser { public static final ServiceMeasurementUUID HEARTRATE = new ServiceMeasurementUUID( new UUID(0x180D00001000L, 0x800000805f9b34fbL), @@ -36,17 +34,8 @@ public class BluetoothHandlerHeartRate implements SensorHandlerInterface { } @Override - public AggregatorHeartRate createEmptySensorData(String address, String name) { - return new AggregatorHeartRate(address, name); - } - - @Override - public void handlePayload(DriverObserver0 observer, @NonNull ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) { - HeartRate heartRate = parseHeartRate(characteristic); - - if (heartRate == null) return; - - observer.onChange(heartRate); + public HeartRate parsePayload(@NonNull ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, BluetoothGattCharacteristic characteristic) { + return parseHeartRate(characteristic); } @VisibleForTesting diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerRunningSpeedAndCadence.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/RunningSpeedAndCadenceBluetooth.java similarity index 76% rename from src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerRunningSpeedAndCadence.java rename to src/main/java/de/dennisguse/opentracks/sensors/driver/RunningSpeedAndCadenceBluetooth.java index 827cb98af..43460f2ec 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothHandlerRunningSpeedAndCadence.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/RunningSpeedAndCadenceBluetooth.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; import android.bluetooth.BluetoothGattCharacteristic; @@ -11,11 +11,9 @@ import java.util.UUID; import de.dennisguse.opentracks.data.models.Cadence; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Speed; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; -import de.dennisguse.opentracks.sensors.sensorData.AggregatorRunning; -import de.dennisguse.opentracks.sensors.sensorData.SensorHandlerInterface; +import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; -public class BluetoothHandlerRunningSpeedAndCadence implements SensorHandlerInterface { +public class RunningSpeedAndCadenceBluetooth implements BluetoothDriver.BluetoothParser { public static final ServiceMeasurementUUID RUNNING_SPEED_CADENCE = new ServiceMeasurementUUID( @@ -29,16 +27,8 @@ public class BluetoothHandlerRunningSpeedAndCadence implements SensorHandlerInte } @Override - public AggregatorRunning createEmptySensorData(String address, String name) { - return new AggregatorRunning(address, name); - } - - @Override - public void handlePayload(DriverObserver0 observer, @NonNull ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic) { - Data data = parseRunningSpeedAndCadence(sensorName, characteristic); - if (data == null) return; - - observer.onChange(data); + public Data parsePayload(ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, BluetoothGattCharacteristic characteristic) { + return parseRunningSpeedAndCadence(sensorName, characteristic); } @VisibleForTesting diff --git a/src/main/java/de/dennisguse/opentracks/sensors/SensorType.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/SensorType.java similarity index 90% rename from src/main/java/de/dennisguse/opentracks/sensors/SensorType.java rename to src/main/java/de/dennisguse/opentracks/sensors/driver/SensorType.java index 2a64246e2..f49575eea 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/SensorType.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/SensorType.java @@ -1,4 +1,4 @@ -package de.dennisguse.opentracks.sensors; +package de.dennisguse.opentracks.sensors.driver; public enum SensorType { NONE("NONE"), //TODO Use R.string.sensor_type_value_none diff --git a/src/main/java/de/dennisguse/opentracks/sensors/driver/TemperatureBluetooth.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/TemperatureBluetooth.java new file mode 100644 index 000000000..5f495848a --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/TemperatureBluetooth.java @@ -0,0 +1,42 @@ +package de.dennisguse.opentracks.sensors.driver; + +import static de.dennisguse.opentracks.sensors.driver.BarometerBluetooth.ENVIRONMENTAL_SENSING_SERVICE; + +import android.bluetooth.BluetoothGattCharacteristic; + +import java.util.List; +import java.util.UUID; + +import de.dennisguse.opentracks.data.models.Temperature; +import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; + +public class TemperatureBluetooth implements BluetoothDriver.BluetoothParser { + public static final ServiceMeasurementUUID TEMPERATURE = new ServiceMeasurementUUID( + ENVIRONMENTAL_SENSING_SERVICE, + new UUID(0x2A6E00001000L, 0x800000805f9b34fbL) + ); + + @Override + public List getServices() { + return List.of(TEMPERATURE); + } + + @Override + public Temperature parsePayload(ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, BluetoothGattCharacteristic characteristic) { + return parseEnvironmentalSensing(characteristic); + } + + /** + * Decoding: org.bluetooth.characteristic.temperature.xml + */ + public static Temperature parseEnvironmentalSensing(BluetoothGattCharacteristic characteristic) { + byte[] raw = characteristic.getValue(); + + if (raw.length < 2) { + return null; + } + + Integer pressure = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_SINT16, 0); + return Temperature.ofCentiCelsius(pressure); + } +} diff --git a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingCadence.java b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingCadence.java index dfb4542f3..6f109d8e9 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingCadence.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingCadence.java @@ -7,10 +7,10 @@ import androidx.annotation.NonNull; import java.time.Duration; import de.dennisguse.opentracks.data.models.Cadence; -import de.dennisguse.opentracks.sensors.BluetoothHandlerCyclingCadence; import de.dennisguse.opentracks.sensors.UintUtils; +import de.dennisguse.opentracks.sensors.driver.CyclingCadenceBluetooth; -public class AggregatorCyclingCadence extends Aggregator { +public class AggregatorCyclingCadence extends Aggregator { private final String TAG = AggregatorCyclingCadence.class.getSimpleName(); @@ -19,7 +19,7 @@ public class AggregatorCyclingCadence extends Aggregator current) { + protected void computeValue(Raw current) { if (previous == null) { return; } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingDistanceSpeed.java b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingDistanceSpeed.java index 40c1baf47..4d1a273ca 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingDistanceSpeed.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingDistanceSpeed.java @@ -8,10 +8,10 @@ import java.time.Duration; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Speed; -import de.dennisguse.opentracks.sensors.BluetoothHandlerCyclingDistanceSpeed; import de.dennisguse.opentracks.sensors.UintUtils; +import de.dennisguse.opentracks.sensors.driver.CyclingDistanceSpeedBluetooth; -public class AggregatorCyclingDistanceSpeed extends Aggregator { +public class AggregatorCyclingDistanceSpeed extends Aggregator { private final String TAG = AggregatorCyclingDistanceSpeed.class.getSimpleName(); @@ -22,7 +22,7 @@ public class AggregatorCyclingDistanceSpeed extends Aggregator current) { + protected void computeValue(Raw current) { if (previous == null) { return; } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingPower.java b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingPower.java index c8050ec69..a369763a8 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingPower.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorCyclingPower.java @@ -3,16 +3,16 @@ package de.dennisguse.opentracks.sensors.sensorData; import androidx.annotation.NonNull; import de.dennisguse.opentracks.data.models.Power; -import de.dennisguse.opentracks.sensors.BluetoothHandlerCyclingPower; +import de.dennisguse.opentracks.sensors.driver.CyclingPowerBluetooth; -public class AggregatorCyclingPower extends Aggregator { +public class AggregatorCyclingPower extends Aggregator { public AggregatorCyclingPower(String name, String address) { super(name, address); } @Override - public void computeValue(Raw current) { + public void computeValue(Raw current) { this.aggregatedValue = current.value().power(); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorRunning.java b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorRunning.java index 2c415e59b..8cdf81b93 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorRunning.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/AggregatorRunning.java @@ -5,12 +5,12 @@ import androidx.annotation.NonNull; import de.dennisguse.opentracks.data.models.Cadence; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Speed; -import de.dennisguse.opentracks.sensors.BluetoothHandlerRunningSpeedAndCadence; +import de.dennisguse.opentracks.sensors.driver.RunningSpeedAndCadenceBluetooth; /** * Provides cadence in rpm and speed in milliseconds from Bluetooth LE Running Speed and Cadence sensors. */ -public final class AggregatorRunning extends Aggregator { +public final class AggregatorRunning extends Aggregator { private static final String TAG = AggregatorRunning.class.getSimpleName(); @@ -19,7 +19,7 @@ public final class AggregatorRunning extends Aggregator current) { + public void computeValue(Raw current) { if (previous == null) { return; } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorHandlerInterface.java b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorHandlerInterface.java deleted file mode 100644 index de5a9ac2a..000000000 --- a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorHandlerInterface.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.dennisguse.opentracks.sensors.sensorData; - -import android.bluetooth.BluetoothGattCharacteristic; - -import java.util.List; - -import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; -import de.dennisguse.opentracks.sensors.driver.DriverObserver0; - -public interface SensorHandlerInterface { - - List getServices(); - - Aggregator createEmptySensorData(String address, String name); - - void handlePayload(DriverObserver0 observer, ServiceMeasurementUUID serviceMeasurementUUID, String sensorName, String address, BluetoothGattCharacteristic characteristic); -} diff --git a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java index acff98e07..ede4d04c8 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java @@ -48,7 +48,7 @@ import de.dennisguse.opentracks.data.models.HeartRateZones; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.io.file.TrackFileFormat; import de.dennisguse.opentracks.io.file.TrackFilenameGenerator; -import de.dennisguse.opentracks.sensors.SensorType; +import de.dennisguse.opentracks.sensors.driver.SensorType; import de.dennisguse.opentracks.ui.customRecordingLayout.DataField; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayoutIO; diff --git a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingCadencePreference.java b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingCadencePreference.java index ce0d9a2f7..a078bdb34 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingCadencePreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingCadencePreference.java @@ -5,7 +5,7 @@ import android.util.AttributeSet; import androidx.preference.PreferenceDialogFragmentCompat; -import de.dennisguse.opentracks.sensors.BluetoothHandlerCyclingCadence; +import de.dennisguse.opentracks.sensors.driver.CyclingCadenceBluetooth; public class BluetoothLeCyclingCadencePreference extends BluetoothLeSensorPreference { @@ -27,6 +27,6 @@ public class BluetoothLeCyclingCadencePreference extends BluetoothLeSensorPrefer @Override public PreferenceDialogFragmentCompat createInstance() { - return BluetoothLeSensorPreferenceDialog.newInstance(getKey(), BluetoothHandlerCyclingCadence.CYCLING_CADENCE); + return BluetoothLeSensorPreferenceDialog.newInstance(getKey(), CyclingCadenceBluetooth.CYCLING_CADENCE); } } diff --git a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingPowerPreference.java b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingPowerPreference.java index ff99809cd..8a2ac7294 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingPowerPreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingPowerPreference.java @@ -7,7 +7,7 @@ import androidx.preference.PreferenceDialogFragmentCompat; import java.util.List; -import de.dennisguse.opentracks.sensors.BluetoothHandlerCyclingPower; +import de.dennisguse.opentracks.sensors.driver.CyclingPowerBluetooth; public class BluetoothLeCyclingPowerPreference extends BluetoothLeSensorPreference { @@ -29,6 +29,6 @@ public class BluetoothLeCyclingPowerPreference extends BluetoothLeSensorPreferen @Override public PreferenceDialogFragmentCompat createInstance() { - return BluetoothLeSensorPreference.BluetoothLeSensorPreferenceDialog.newInstance(getKey(), List.of(BluetoothHandlerCyclingPower.CYCLING_POWER)); + return BluetoothLeSensorPreference.BluetoothLeSensorPreferenceDialog.newInstance(getKey(), List.of(CyclingPowerBluetooth.CYCLING_POWER)); } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingSpeedPreference.java b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingSpeedPreference.java index bddce5a21..63ffcc644 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingSpeedPreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeCyclingSpeedPreference.java @@ -7,7 +7,7 @@ import androidx.preference.PreferenceDialogFragmentCompat; import java.util.List; -import de.dennisguse.opentracks.sensors.BluetoothHandlerCyclingDistanceSpeed; +import de.dennisguse.opentracks.sensors.driver.CyclingDistanceSpeedBluetooth; public class BluetoothLeCyclingSpeedPreference extends BluetoothLeSensorPreference { @@ -29,6 +29,6 @@ public class BluetoothLeCyclingSpeedPreference extends BluetoothLeSensorPreferen @Override public PreferenceDialogFragmentCompat createInstance() { - return BluetoothLeSensorPreference.BluetoothLeSensorPreferenceDialog.newInstance(getKey(), List.of(BluetoothHandlerCyclingDistanceSpeed.CYCLING_SPEED_CADENCE)); + return BluetoothLeSensorPreference.BluetoothLeSensorPreferenceDialog.newInstance(getKey(), List.of(CyclingDistanceSpeedBluetooth.CYCLING_SPEED_CADENCE)); } } diff --git a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeHeartRatePreference.java b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeHeartRatePreference.java index 97a447ddd..5ce0f6243 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeHeartRatePreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeHeartRatePreference.java @@ -5,7 +5,7 @@ import android.util.AttributeSet; import androidx.preference.PreferenceDialogFragmentCompat; -import de.dennisguse.opentracks.sensors.BluetoothHandlerHeartRate; +import de.dennisguse.opentracks.sensors.driver.HeartRateBluetooth; public class BluetoothLeHeartRatePreference extends BluetoothLeSensorPreference { @@ -27,6 +27,6 @@ public class BluetoothLeHeartRatePreference extends BluetoothLeSensorPreference @Override public PreferenceDialogFragmentCompat createInstance() { - return BluetoothLeSensorPreference.BluetoothLeSensorPreferenceDialog.newInstance(getKey(), BluetoothHandlerHeartRate.HEART_RATE_SUPPORTING_DEVICES); + return BluetoothLeSensorPreference.BluetoothLeSensorPreferenceDialog.newInstance(getKey(), HeartRateBluetooth.HEART_RATE_SUPPORTING_DEVICES); } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLePressurePreference.java b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLePressurePreference.java index ee3e495a9..165600826 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLePressurePreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLePressurePreference.java @@ -9,7 +9,7 @@ import androidx.preference.PreferenceDialogFragmentCompat; import java.util.List; -import de.dennisguse.opentracks.sensors.BluetoothHandlerBarometricPressure; +import de.dennisguse.opentracks.sensors.driver.BarometerBluetooth; public class BluetoothLePressurePreference extends BluetoothLeSensorPreference { @@ -36,6 +36,6 @@ public class BluetoothLePressurePreference extends BluetoothLeSensorPreference { boolean hasInternalSensor = pressureSensor != null; return BluetoothLeSensorPreference.BluetoothLeSensorPreferenceDialog - .newInstance(getKey(), List.of(BluetoothHandlerBarometricPressure.BAROMETRIC_PRESSURE), hasInternalSensor); + .newInstance(getKey(), List.of(BarometerBluetooth.BAROMETRIC_PRESSURE), hasInternalSensor); } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeRunningSpeedAndCadencePreference.java b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeRunningSpeedAndCadencePreference.java index 470b8d636..426ad1972 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeRunningSpeedAndCadencePreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeRunningSpeedAndCadencePreference.java @@ -7,7 +7,7 @@ import androidx.preference.PreferenceDialogFragmentCompat; import java.util.List; -import de.dennisguse.opentracks.sensors.BluetoothHandlerRunningSpeedAndCadence; +import de.dennisguse.opentracks.sensors.driver.RunningSpeedAndCadenceBluetooth; public class BluetoothLeRunningSpeedAndCadencePreference extends BluetoothLeSensorPreference { @@ -29,6 +29,6 @@ public class BluetoothLeRunningSpeedAndCadencePreference extends BluetoothLeSens @Override public PreferenceDialogFragmentCompat createInstance() { - return BluetoothLeSensorPreference.BluetoothLeSensorPreferenceDialog.newInstance(getKey(), List.of(BluetoothHandlerRunningSpeedAndCadence.RUNNING_SPEED_CADENCE)); + return BluetoothLeSensorPreference.BluetoothLeSensorPreferenceDialog.newInstance(getKey(), List.of(RunningSpeedAndCadenceBluetooth.RUNNING_SPEED_CADENCE)); } } diff --git a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeSensorPreference.java b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeSensorPreference.java index 531fb6f0d..1143d60b7 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeSensorPreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeSensorPreference.java @@ -28,8 +28,8 @@ import java.util.List; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.sensors.BluetoothUtils; -import de.dennisguse.opentracks.sensors.SensorType; import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; +import de.dennisguse.opentracks.sensors.driver.SensorType; import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.util.PermissionRequester; diff --git a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeTemperaturePreference.java b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeTemperaturePreference.java index 6cca492ad..b79caf2c4 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeTemperaturePreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeTemperaturePreference.java @@ -7,7 +7,7 @@ import androidx.preference.PreferenceDialogFragmentCompat; import java.util.List; -import de.dennisguse.opentracks.sensors.BluetoothHandlerTemperature; +import de.dennisguse.opentracks.sensors.driver.TemperatureBluetooth; public class BluetoothLeTemperaturePreference extends BluetoothLeSensorPreference { @@ -30,6 +30,6 @@ public class BluetoothLeTemperaturePreference extends BluetoothLeSensorPreferenc @Override public PreferenceDialogFragmentCompat createInstance() { return BluetoothLeSensorPreferenceDialog - .newInstance(getKey(), List.of(BluetoothHandlerTemperature.TEMPERATURE)); + .newInstance(getKey(), List.of(TemperatureBluetooth.TEMPERATURE)); } } \ No newline at end of file