1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-21 16:02:04 +02:00

Add methods for converting to/from uint32 big-endian

This commit is contained in:
Erik Johansson
2018-04-09 21:02:29 +02:00
parent 1c5b13b7eb
commit b7b67b0f08
3 changed files with 39 additions and 4 deletions

View File

@@ -30,7 +30,6 @@ import com.health.openscale.core.utils.Converters;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.ParseException; import java.text.ParseException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@@ -523,7 +522,7 @@ public class BluetoothBeurerBF700_800 extends BluetoothCommunication {
throw new ParseException("Parse scala data: unexpected length", 0); throw new ParseException("Parse scala data: unexpected length", 0);
} }
long timestamp = ByteBuffer.wrap(data, 0, 4).getInt() * 1000L; long timestamp = Converters.fromUnsignedInt32Be(data, 0) * 1000;
float weight = getKiloGram(data, 4); float weight = getKiloGram(data, 4);
int impedance = Converters.fromUnsignedInt16Be(data, 6); int impedance = Converters.fromUnsignedInt16Be(data, 6);
float fat = getPercent(data, 8); float fat = getPercent(data, 8);
@@ -553,10 +552,11 @@ public class BluetoothBeurerBF700_800 extends BluetoothCommunication {
private void updateDateTimeBeurer() { private void updateDateTimeBeurer() {
// Update date/time of the scale // Update date/time of the scale
long unixTime = System.currentTimeMillis() / 1000L; long unixTime = System.currentTimeMillis() / 1000L;
byte[] unixTimeBytes = ByteBuffer.allocate(Long.SIZE / 8).putLong(unixTime).array(); byte[] unixTimeBytes = Converters.toUnsignedInt32Be(unixTime);
Log.d(TAG, "Write new Date/Time:" + unixTime + " " + byteInHex(unixTimeBytes)); Log.d(TAG, "Write new Date/Time:" + unixTime + " " + byteInHex(unixTimeBytes));
writeBytes(new byte[]{(byte) getAlternativeStartByte(9), unixTimeBytes[4], unixTimeBytes[5], unixTimeBytes[6], unixTimeBytes[7]}); writeBytes(new byte[]{(byte) getAlternativeStartByte(9),
unixTimeBytes[0], unixTimeBytes[1], unixTimeBytes[2], unixTimeBytes[3]});
} }
private void setUnitCommand() { private void setUnitCommand() {

View File

@@ -129,4 +129,21 @@ public class Converters {
value += data[offset + 1] & 0xFF; value += data[offset + 1] & 0xFF;
return value; return value;
} }
public static long fromUnsignedInt32Be(byte[] data, int offset) {
long value = (long) (data[offset] & 0xFF) << 24;
value += (data[offset + 1] & 0xFF) << 16;
value += (data[offset + 2] & 0xFF) << 8;
value += data[offset + 3] & 0xFF;
return value;
}
public static byte[] toUnsignedInt32Be(long value) {
byte[] data = new byte[4];
data[0] = (byte) ((value >> 24) & 0xFF);
data[1] = (byte) ((value >> 16) & 0xFF);
data[2] = (byte) ((value >> 8) & 0xFF);
data[3] = (byte) (value & 0xFF);
return data;
}
} }

View File

@@ -23,6 +23,7 @@ import org.junit.Test;
import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertArrayEquals;
public class ConvertersTest { public class ConvertersTest {
@@ -88,4 +89,21 @@ public class ConvertersTest {
assertEquals(0xfc10, Converters.fromUnsignedInt16Be(data, 2)); assertEquals(0xfc10, Converters.fromUnsignedInt16Be(data, 2));
assertEquals(0x107f, Converters.fromUnsignedInt16Be(data, 3)); assertEquals(0x107f, Converters.fromUnsignedInt16Be(data, 3));
} }
@Test
public void unsignedInt32Converters() throws Exception {
byte[] data = new byte[]{(byte) 0xf1, (byte) 0xf2, (byte) 0xf3, (byte) 0x7f, (byte) 0x7e};
assertEquals(0xf1f2f37fL, Converters.fromUnsignedInt32Be(data, 0));
assertEquals(0xf2f37f7eL, Converters.fromUnsignedInt32Be(data, 1));
data = new byte[]{(byte) 0x80, (byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0x00};
assertEquals(0x800001ffL, Converters.fromUnsignedInt32Be(data, 0));
assertEquals(0x1ff00L, Converters.fromUnsignedInt32Be(data, 1));
data = new byte[]{(byte) 0xff, (byte) 0xfe, (byte) 0xfd, (byte) 0xfc};
assertArrayEquals(data, Converters.toUnsignedInt32Be(0xfffefdfcL));
assertEquals(0xffffffffL,
Converters.fromUnsignedInt32Be(
Converters.toUnsignedInt32Be(0xffffffffL), 0));
}
} }