package de.dennisguse.opentracks.sensors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import android.bluetooth.BluetoothGattCharacteristic; import org.junit.Test; import de.dennisguse.opentracks.data.models.AtmosphericPressure; import de.dennisguse.opentracks.data.models.Cadence; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.HeartRate; import de.dennisguse.opentracks.data.models.Speed; import de.dennisguse.opentracks.sensors.sensorData.SensorDataCyclingCadenceAndDistanceSpeed; import de.dennisguse.opentracks.sensors.sensorData.SensorDataCyclingPower; import de.dennisguse.opentracks.sensors.sensorData.SensorDataRunning; public class BluetoothUtilsTest { @Test public void parseHeartRate_uint8() { // given BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothUtils.HEARTRATE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x02, 0x3C}); // when HeartRate heartRate = BluetoothUtils.parseHeartRate(characteristic); // then assertEquals(HeartRate.of(60), heartRate); } @Test public void parseHeartRate_uint16() { // given BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothUtils.HEARTRATE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x01, 0x01, 0x01}); // when HeartRate heartRate = BluetoothUtils.parseHeartRate(characteristic); // then assertEquals(HeartRate.of(257), heartRate); } @Test public void parseEnvironmentalSensing_Pa() { // given BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothUtils.BAROMETRIC_PRESSURE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{(byte) 0xB2, (byte) 0x48, (byte) 0x0F, (byte) 0x00}); // when AtmosphericPressure pressure = BluetoothUtils.parseEnvironmentalSensing(characteristic); // then assertEquals(AtmosphericPressure.ofPA(100165), pressure); } @Test public void parseCyclingSpeedCadence_crankOnly() { BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothUtils.CYCLING_SPEED_CADENCE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x02, (byte) 0xC8, 0x00, 0x00, 0x00, 0x06, (byte) 0x99}); // when SensorDataCyclingCadenceAndDistanceSpeed sensor = BluetoothUtils.parseCyclingCrankAndWheel("address", "sensorName", characteristic); // then assertNull(sensor.getDistanceSpeed()); assertEquals(200, sensor.getCadence().getCrankRevolutionsCount()); } @Test public void parseCyclingSpeedCadence_wheelOnly() { BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothUtils.CYCLING_SPEED_CADENCE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x01, (byte) 0xFF, (byte) 0xFF, 0, 1, 0x45, (byte) 0x99}); // when SensorDataCyclingCadenceAndDistanceSpeed sensor = BluetoothUtils.parseCyclingCrankAndWheel("address", "sensorName", characteristic); // then assertEquals(65535 + 16777216, sensor.getDistanceSpeed().getWheelRevolutionsCount()); assertNull(sensor.getCadence()); } @Test public void parseCyclingSpeedCadence_crankWheel() { BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothUtils.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 SensorDataCyclingCadenceAndDistanceSpeed sensor = BluetoothUtils.parseCyclingCrankAndWheel("address", "sensorName", characteristic); // then assertEquals(200 + 16777216, sensor.getDistanceSpeed().getWheelRevolutionsCount()); assertEquals(225, sensor.getCadence().getCrankRevolutionsCount()); } @Test public void parseCyclingPower_power() { BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothUtils.CYCLING_POWER.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0, 0, 40, 0}); // when SensorDataCyclingPower.Data powerCadence = BluetoothUtils.parseCyclingPower("", "", characteristic); // then assertEquals(40, powerCadence.power().getValue().getW(), 0.01); } @Test public void parseCyclingPower_power_with_cadence() { BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothUtils.CYCLING_POWER.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{0x2C, 0x00, 0x00, 0x00, (byte) 0x9F, 0x00, 0x0C, 0x00, (byte) 0xE5, 0x42}); // when SensorDataCyclingPower.Data powerCadence = BluetoothUtils.parseCyclingPower("", "", characteristic); // then assertEquals(0, powerCadence.power().getValue().getW(), 0.01); assertEquals(12, powerCadence.cadence().getCrankRevolutionsCount()); assertEquals(17125, powerCadence.cadence().getCrankRevolutionsTime()); } @Test public void parseRunningSpeedAndCadence_with_distance() { BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(BluetoothUtils.RUNNING_SPEED_CADENCE.serviceUUID(), 0, 0); characteristic.setValue(new byte[]{2, 0, 5, 80, (byte) 0xFF, (byte) 0xFF, 0, 1}); // when SensorDataRunning sensor = BluetoothUtils.parseRunningSpeedAndCadence("address", "sensorName", characteristic); // then assertEquals(Speed.of(5), sensor.getSpeed()); assertEquals(Cadence.of(80), sensor.getCadence()); assertEquals(Distance.of(6553.5 + 1677721.6), sensor.getTotalDistance()); } }