diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothInlife.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothInlife.java index 2dcdcc5b..505492d8 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothInlife.java +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothInlife.java @@ -20,7 +20,9 @@ import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCharacteristic; import android.content.Context; +import com.health.openscale.core.OpenScale; import com.health.openscale.core.datatypes.ScaleMeasurement; +import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.core.utils.Converters; import java.util.UUID; @@ -84,9 +86,34 @@ public class BluetoothInlife extends BluetoothCommunication { } float weight = Converters.fromUnsignedInt16Be(data, 2) / 10.0f; + float lbm = Converters.fromUnsignedInt24Be(data, 4) / 1000.0f; + + final ScaleUser selectedUser = OpenScale.getInstance().getSelectedScaleUser(); + switch (selectedUser.getActivityLevel()) { + case SEDENTARY: + case MILD: + break; + case MODERATE: + lbm *= 1.0427f; + break; + case HEAVY: + case EXTREME: + lbm *= 1.0958f; + break; + } + + float fatKg = weight - lbm; + float fat = (fatKg / weight) * 100.0f; + float water = (0.73f * (weight - fatKg) / weight) * 100.0f; + float muscle = (0.548f * lbm / weight) * 100.0f; + float bone = 0.05158f * lbm; ScaleMeasurement measurement = new ScaleMeasurement(); measurement.setWeight(weight); + measurement.setFat(fat); + measurement.setWater(water); + measurement.setMuscle(muscle); + measurement.setBone(bone); addScaleData(measurement); } diff --git a/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java b/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java index a78b5963..d7c109b1 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java +++ b/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java @@ -284,10 +284,21 @@ public class Converters { return value; } + public static int fromSignedInt24Be(byte[] data, int offset) { + int value = data[offset] << 16; + value += (data[offset + 1] & 0xFF) << 8; + value += data[offset + 2] & 0xFF; + return value; + } + public static int fromUnsignedInt24Le(byte[] data, int offset) { return fromSignedInt24Le(data, offset) & 0xFFFFFF; } + public static int fromUnsignedInt24Be(byte[] data, int offset) { + return fromSignedInt24Be(data, offset) & 0xFFFFFF; + } + public static int fromSignedInt32Le(byte[] data, int offset) { int value = data[offset + 3] << 24; value += (data[offset + 2] & 0xFF) << 16; diff --git a/android_app/app/src/test/java/com/health/openscale/ConvertersTest.java b/android_app/app/src/test/java/com/health/openscale/ConvertersTest.java index 066ffcad..61c6d9d8 100644 --- a/android_app/app/src/test/java/com/health/openscale/ConvertersTest.java +++ b/android_app/app/src/test/java/com/health/openscale/ConvertersTest.java @@ -133,10 +133,18 @@ public class ConvertersTest { assertEquals(0x0010fcfe, Converters.fromSignedInt24Le(data, 1)); assertEquals(0x007f10fc, Converters.fromSignedInt24Le(data, 2)); + assertEquals(0xfffdfefc, Converters.fromSignedInt24Be(data, 0)); + assertEquals(0xfffefc10, Converters.fromSignedInt24Be(data, 1)); + assertEquals(0xfffc107f, Converters.fromSignedInt24Be(data, 2)); + assertEquals(0xfcfefd, Converters.fromUnsignedInt24Le(data, 0)); assertEquals(0x10fcfe, Converters.fromUnsignedInt24Le(data, 1)); assertEquals(0x7f10fc, Converters.fromUnsignedInt24Le(data, 2)); + assertEquals(0xfdfefc, Converters.fromUnsignedInt24Be(data, 0)); + assertEquals(0xfefc10, Converters.fromUnsignedInt24Be(data, 1)); + assertEquals(0xfc107f, Converters.fromUnsignedInt24Be(data, 2)); + assertEquals(-1234567, Converters.fromSignedInt24Le(Converters.toInt32Le(-1234567), 0)); }