From b86a9d3802ec6a4bb25fcb5f370b99079d33383e Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 2 Sep 2024 21:44:23 +0300 Subject: [PATCH] tbel: refactoring tbUtils with docs --- .../thingsboard/script/api/tbel/TbUtils.java | 28 +++---- .../script/api/tbel/TbUtilsTest.java | 81 ++++++++++++------- 2 files changed, 68 insertions(+), 41 deletions(-) diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java index d188111cc3..6651f26cc5 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java @@ -273,13 +273,13 @@ public class TbUtils { Long.class, boolean.class, boolean.class))); parserConfig.addImport("longToHex", new MethodStub(TbUtils.class.getMethod("longToHex", Long.class, boolean.class, boolean.class, int.class))); - parserConfig.addImport("intLongToString", new MethodStub(TbUtils.class.getMethod("intLongToString", + parserConfig.addImport("intLongToRadixString", new MethodStub(TbUtils.class.getMethod("intLongToRadixString", Long.class))); - parserConfig.addImport("intLongToString", new MethodStub(TbUtils.class.getMethod("intLongToString", + parserConfig.addImport("intLongToRadixString", new MethodStub(TbUtils.class.getMethod("intLongToRadixString", Long.class, int.class))); - parserConfig.addImport("intLongToString", new MethodStub(TbUtils.class.getMethod("intLongToString", + parserConfig.addImport("intLongToRadixString", new MethodStub(TbUtils.class.getMethod("intLongToRadixString", Long.class, int.class, boolean.class))); - parserConfig.addImport("intLongToString", new MethodStub(TbUtils.class.getMethod("intLongToString", + parserConfig.addImport("intLongToRadixString", new MethodStub(TbUtils.class.getMethod("intLongToRadixString", Long.class, int.class, boolean.class, boolean.class))); parserConfig.addImport("floatToHex", new MethodStub(TbUtils.class.getMethod("floatToHex", Float.class))); @@ -327,7 +327,7 @@ public class TbUtils { String.class))); parserConfig.addImport("isHexadecimal", new MethodStub(TbUtils.class.getMethod("isHexadecimal", String.class))); - parserConfig.addImport("byteArrayToExecutionArrayList", new MethodStub(TbUtils.class.getMethod("bytesToExecutionArrayList", + parserConfig.addImport("bytesToExecutionArrayList", new MethodStub(TbUtils.class.getMethod("bytesToExecutionArrayList", ExecutionContext.class, byte[].class))); parserConfig.addImport("padStart", new MethodStub(TbUtils.class.getMethod("padStart", String.class, int.class, char.class))); @@ -725,19 +725,19 @@ public class TbUtils { return prepareNumberHexString(l, bigEndian, pref, len, HEX_LEN_LONG_MAX); } - public static String intLongToString(Long number) { - return intLongToString(number, DEC_RADIX); + public static String intLongToRadixString(Long number) { + return intLongToRadixString(number, DEC_RADIX); } - public static String intLongToString(Long number, int radix) { - return intLongToString(number, radix, true); + public static String intLongToRadixString(Long number, int radix) { + return intLongToRadixString(number, radix, true); } - public static String intLongToString(Long number, int radix, boolean bigEndian) { - return intLongToString(number, radix, bigEndian, false); + public static String intLongToRadixString(Long number, int radix, boolean bigEndian) { + return intLongToRadixString(number, radix, bigEndian, false); } - public static String intLongToString(Long number, int radix, boolean bigEndian, boolean pref) { + public static String intLongToRadixString(Long number, int radix, boolean bigEndian, boolean pref) { if (radix >= 25 && radix <= MAX_RADIX) { return Long.toString(number, radix); } @@ -1344,8 +1344,8 @@ public class TbUtils { * Writes the bit value to the appropriate location in the bins array, starting at the end of the array, * to ensure proper alignment (highest bit to low end). */ - public static byte[] parseLongToBinaryArray(long longValue, int binsLength) { - int len = Math.min(binsLength, BYTES_LEN_LONG_MAX * BIN_LEN_MAX); + public static byte[] parseLongToBinaryArray(long longValue, int binLength) { + int len = Math.min(binLength, BYTES_LEN_LONG_MAX * BIN_LEN_MAX); byte[] bins = new byte[len]; for (int i = 0; i < len; i++) { bins[len - 1 - i] = (byte) ((longValue >> i) & 1); diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java index 0c22f62f1f..2e36b3df42 100644 --- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java @@ -330,8 +330,8 @@ public class TbUtilsTest { @Test public void parseBytesIntToFloat() { byte[] intValByte = {0x00, 0x00, 0x00, 0x0A}; - Float valueExpected = 10.0f; - Float valueActual = TbUtils.parseBytesIntToFloat(intValByte, 3, 1, true); + float valueExpected = 10.0f; + float valueActual = TbUtils.parseBytesIntToFloat(intValByte, 3, 1, true); Assertions.assertEquals(valueExpected, valueActual); valueActual = TbUtils.parseBytesIntToFloat(intValByte, 3, 1, false); Assertions.assertEquals(valueExpected, valueActual); @@ -345,20 +345,23 @@ public class TbUtilsTest { valueExpected = 10.0f; valueActual = TbUtils.parseBytesIntToFloat(intValByte, 0, 4, true); Assertions.assertEquals(valueExpected, valueActual); - valueExpected = 1.6777216E8f; - valueActual = TbUtils.parseBytesIntToFloat(intValByte, 0, 4, false); + valueExpected = 167772.16f; + double factor = 1e3; + valueActual = (float) (TbUtils.parseBytesIntToFloat(intValByte, 0, 4, false) / factor); + Assertions.assertEquals(valueExpected, valueActual); String dataAT101 = "0x01756403671B01048836BF7701F000090722050000"; List byteAT101 = TbUtils.hexToBytes(ctx, dataAT101); float latitudeExpected = 24.62495f; int offset = 9; - valueActual = TbUtils.parseBytesIntToFloat(byteAT101, offset, 4, false); - Assertions.assertEquals(latitudeExpected, valueActual / 1000000); + factor = 1e6; + valueActual = (float) (TbUtils.parseBytesIntToFloat(byteAT101, offset, 4, false) / factor); + Assertions.assertEquals(latitudeExpected, valueActual); float longitudeExpected = 118.030576f; - valueActual = TbUtils.parseBytesIntToFloat(byteAT101, offset + 4, 4, false); - Assertions.assertEquals(longitudeExpected, valueActual / 1000000); + valueActual = (float) (TbUtils.parseBytesIntToFloat(byteAT101, offset + 4, 4, false) / factor); + Assertions.assertEquals(longitudeExpected, valueActual); valueExpected = 9.185175E8f; valueActual = TbUtils.parseBytesIntToFloat(byteAT101, offset); @@ -520,6 +523,18 @@ public class TbUtilsTest { valueExpected = 7.2057594037927936E17d; valueActual = TbUtils.parseBytesLongToDouble(longValByte, 0, 8, false); Assertions.assertEquals(valueExpected, valueActual); + + String dataPalacKiyv = "0x32D009423F23B300B0106E08D96B6C00"; + List byteAT101 = TbUtils.hexToBytes(ctx, dataPalacKiyv); + double latitudeExpected = 50.422775429058610d; + int offset = 0; + double factor = 1e15; + valueActual = TbUtils.parseBytesLongToDouble(byteAT101, offset, 8, false); + Assertions.assertEquals(latitudeExpected, valueActual / factor); + + double longitudeExpected = 30.517877378257072d; + valueActual = TbUtils.parseBytesLongToDouble(byteAT101, offset + 8, 8, false); + Assertions.assertEquals(longitudeExpected, valueActual / factor); } @Test @@ -720,27 +735,27 @@ public class TbUtilsTest { @Test public void numberToString_Test() { - Assertions.assertEquals("00111010", TbUtils.intLongToString(58L, MIN_RADIX)); - Assertions.assertEquals("0000000010011110", TbUtils.intLongToString(158L, MIN_RADIX)); - Assertions.assertEquals("00000000000000100000001000000001", TbUtils.intLongToString(131585L, MIN_RADIX)); - Assertions.assertEquals("0111111111111111111111111111111111111111111111111111111111111111", TbUtils.intLongToString(Long.MAX_VALUE, MIN_RADIX)); - Assertions.assertEquals("1000000000000000000000000000000000000000000000000000000000000001", TbUtils.intLongToString(-Long.MAX_VALUE, MIN_RADIX)); - Assertions.assertEquals("1111111111111111111111111111111111111111111111111111111110011010", TbUtils.intLongToString(-102L, MIN_RADIX)); - Assertions.assertEquals("1111111111111111111111111111111111111111111111111100110010011010", TbUtils.intLongToString(-13158L, MIN_RADIX)); - Assertions.assertEquals("777777777777777777777", TbUtils.intLongToString(Long.MAX_VALUE, 8)); - Assertions.assertEquals("1000000000000000000000", TbUtils.intLongToString(Long.MIN_VALUE, 8)); - Assertions.assertEquals("9223372036854775807", TbUtils.intLongToString(Long.MAX_VALUE)); - Assertions.assertEquals("-9223372036854775808", TbUtils.intLongToString(Long.MIN_VALUE)); - Assertions.assertEquals("3366", TbUtils.intLongToString(13158L, 16)); - Assertions.assertEquals("FFCC9A", TbUtils.intLongToString(-13158L, 16)); - Assertions.assertEquals("0xFFCC9A", TbUtils.intLongToString(-13158L, 16, true, true)); + Assertions.assertEquals("00111010", TbUtils.intLongToRadixString(58L, MIN_RADIX)); + Assertions.assertEquals("0000000010011110", TbUtils.intLongToRadixString(158L, MIN_RADIX)); + Assertions.assertEquals("00000000000000100000001000000001", TbUtils.intLongToRadixString(131585L, MIN_RADIX)); + Assertions.assertEquals("0111111111111111111111111111111111111111111111111111111111111111", TbUtils.intLongToRadixString(Long.MAX_VALUE, MIN_RADIX)); + Assertions.assertEquals("1000000000000000000000000000000000000000000000000000000000000001", TbUtils.intLongToRadixString(-Long.MAX_VALUE, MIN_RADIX)); + Assertions.assertEquals("1111111111111111111111111111111111111111111111111111111110011010", TbUtils.intLongToRadixString(-102L, MIN_RADIX)); + Assertions.assertEquals("1111111111111111111111111111111111111111111111111100110010011010", TbUtils.intLongToRadixString(-13158L, MIN_RADIX)); + Assertions.assertEquals("777777777777777777777", TbUtils.intLongToRadixString(Long.MAX_VALUE, 8)); + Assertions.assertEquals("1000000000000000000000", TbUtils.intLongToRadixString(Long.MIN_VALUE, 8)); + Assertions.assertEquals("9223372036854775807", TbUtils.intLongToRadixString(Long.MAX_VALUE)); + Assertions.assertEquals("-9223372036854775808", TbUtils.intLongToRadixString(Long.MIN_VALUE)); + Assertions.assertEquals("3366", TbUtils.intLongToRadixString(13158L, 16)); + Assertions.assertEquals("FFCC9A", TbUtils.intLongToRadixString(-13158L, 16)); + Assertions.assertEquals("0xFFCC9A", TbUtils.intLongToRadixString(-13158L, 16, true, true)); - Assertions.assertEquals("0x0400", TbUtils.intLongToString(1024L, 16, true, true)); - Assertions.assertNotEquals("400", TbUtils.intLongToString(1024L, 16)); - Assertions.assertEquals("0xFFFC00", TbUtils.intLongToString(-1024L, 16, true, true)); - Assertions.assertNotEquals("0xFC00", TbUtils.intLongToString(-1024L, 16, true, true)); + Assertions.assertEquals("0x0400", TbUtils.intLongToRadixString(1024L, 16, true, true)); + Assertions.assertNotEquals("400", TbUtils.intLongToRadixString(1024L, 16)); + Assertions.assertEquals("0xFFFC00", TbUtils.intLongToRadixString(-1024L, 16, true, true)); + Assertions.assertNotEquals("0xFC00", TbUtils.intLongToRadixString(-1024L, 16, true, true)); - Assertions.assertEquals("hazelnut", TbUtils.intLongToString(1356099454469L, MAX_RADIX)); + Assertions.assertEquals("hazelnut", TbUtils.intLongToRadixString(1356099454469L, MAX_RADIX)); } @Test @@ -1067,6 +1082,18 @@ public class TbUtilsTest { String actual = TbUtils.hexToBase64(hex); Assertions.assertEquals(expected, actual); } + @Test + public void bytesToHex_Test() { + byte[] bb = {(byte) 0xBB, (byte) 0xAA}; + String expected = "BBAA"; + String actual = TbUtils.bytesToHex(bb); + Assertions.assertEquals(expected, actual); + ExecutionArrayList expectedList = new ExecutionArrayList<>(ctx); + expectedList.addAll(List.of(-69, 83)); + expected = "BB53"; + actual = TbUtils.bytesToHex(expectedList); + Assertions.assertEquals(expected, actual); + } private static List toList(byte[] data) { List result = new ArrayList<>(data.length);