This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
The following commit(s) were added to refs/heads/master by this push: new 34bac1f [Modbus] added example to read an int from 2 registers [General] changed byte[] to Byte[] to avoid recurring boxing problems 34bac1f is described below commit 34bac1fc9684eb7d88b935962fea46d097e28e5c Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Wed Sep 26 12:58:57 2018 +0200 [Modbus] added example to read an int from 2 registers [General] changed byte[] to Byte[] to avoid recurring boxing problems --- .../plc4x/java/api/messages/PlcReadResponse.java | 6 ++--- .../java/base/messages/DefaultPlcReadResponse.java | 8 +++--- .../base/messages/DefaultPlcSubscriptionEvent.java | 10 ++++---- .../messages/items/DefaultByteArrayFieldItem.java | 8 +++--- .../plc4x/java/base/messages/items/FieldItem.java | 2 +- .../org/apache/plc4x/java/base/util/HexUtil.java | 5 ++++ .../java/modbus/netty/Plc4XModbusProtocol.java | 6 ++--- .../java/modbus/util/ModbusPlcFieldHandler.java | 8 +++--- .../plc4x/java/modbus/ManualPlc4XModbusTest.java | 29 ++++++++++++++++++++++ .../apache/plc4x/java/test/TestFieldHandler.java | 5 ++-- 10 files changed, 60 insertions(+), 27 deletions(-) diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java index 101a6ad..bf5900b 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java @@ -172,10 +172,10 @@ public interface PlcReadResponse<T extends PlcReadRequest> extends PlcFieldRespo boolean isValidByteArray(String name, int index); - byte[] getByteArray(String name); + Byte[] getByteArray(String name); - byte[] getByteArray(String name, int index); + Byte[] getByteArray(String name, int index); - Collection<byte[]> getAllByteArrays(String name); + Collection<Byte[]> getAllByteArrays(String name); } diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java index 5cbaf0c..cd2dc47 100644 --- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java +++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java @@ -660,7 +660,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse { } @Override - public byte[] getByteArray(String name) { + public Byte[] getByteArray(String name) { FieldItem fieldInternal = getFieldInternal(name); if (fieldInternal != null) { return fieldInternal.getByteArray(0); @@ -669,7 +669,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse { } @Override - public byte[] getByteArray(String name, int index) { + public Byte[] getByteArray(String name, int index) { FieldItem fieldInternal = getFieldInternal(name); if (fieldInternal != null) { return fieldInternal.getByteArray(index); @@ -678,11 +678,11 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse { } @Override - public Collection<byte[]> getAllByteArrays(String name) { + public Collection<Byte[]> getAllByteArrays(String name) { FieldItem fieldInternal = getFieldInternal(name); if (fieldInternal != null) { int num = fieldInternal.getNumberOfValues(); - List<byte[]> values = new ArrayList<>(num); + List<Byte[]> values = new ArrayList<>(num); for (int i = 0; i < num; i++) { values.add(fieldInternal.getByteArray(i)); } diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java index beb0ef9..7451e00 100644 --- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java +++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java @@ -394,17 +394,17 @@ public class DefaultPlcSubscriptionEvent implements InternalPlcSubscriptionEvent } @Override - public byte[] getByteArray(String name) { - return new byte[0]; + public Byte[] getByteArray(String name) { + return new Byte[0]; } @Override - public byte[] getByteArray(String name, int index) { - return new byte[0]; + public Byte[] getByteArray(String name, int index) { + return new Byte[0]; } @Override - public Collection<byte[]> getAllByteArrays(String name) { + public Collection<Byte[]> getAllByteArrays(String name) { return null; } diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java index 936b32f..4663e46 100644 --- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java +++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java @@ -18,9 +18,9 @@ under the License. */ package org.apache.plc4x.java.base.messages.items; -public class DefaultByteArrayFieldItem extends FieldItem<byte[]> { +public class DefaultByteArrayFieldItem extends FieldItem<Byte[]> { - public DefaultByteArrayFieldItem(byte[]... values) { + public DefaultByteArrayFieldItem(Byte[]... values) { super(values); } @@ -30,11 +30,11 @@ public class DefaultByteArrayFieldItem extends FieldItem<byte[]> { } public boolean isValidByteArray(int index) { - byte[] value = getValue(index); + Byte[] value = getValue(index); return value != null; } - public byte[] getByteArray(int index) { + public Byte[] getByteArray(int index) { return getValue(index); } diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java index e21cd11..2a4acca 100644 --- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java +++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java @@ -147,7 +147,7 @@ public abstract class FieldItem<T> { return false; } - public byte[] getByteArray(int index) { + public Byte[] getByteArray(int index) { return null; } diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/HexUtil.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/HexUtil.java index c145565..40e5680 100644 --- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/HexUtil.java +++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/HexUtil.java @@ -20,6 +20,7 @@ package org.apache.plc4x.java.base.util; import org.apache.commons.io.HexDump; +import org.apache.commons.lang3.ArrayUtils; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -32,6 +33,10 @@ public class HexUtil { * @param bytes to be displayed. * @return hexed string. */ + public static String toHex(Byte[] bytes) { + return toHex(ArrayUtils.toPrimitive(bytes)); + } + public static String toHex(byte[] bytes) { try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { HexDump.dump(bytes, 0, byteArrayOutputStream, 0); diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java index 774368a..ce6be0d 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java @@ -515,12 +515,12 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload, if (readableBytes % 2 != 0) { throw new PlcProtocolException("Readables bytes should even: " + readableBytes); } - List<byte[]> data = new LinkedList<>(); + List<Byte[]> data = new LinkedList<>(); while (byteBuf.readableBytes() > 0) { byte[] register = new byte[2]; byteBuf.readBytes(register); - data.add(register); + data.add(ArrayUtils.toObject(register)); } - return new DefaultByteArrayFieldItem(data.toArray(new byte[0][0])); + return new DefaultByteArrayFieldItem(data.toArray(new Byte[0][0])); } } diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java index 00b653f..f3fb19d 100644 --- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java +++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java @@ -95,20 +95,20 @@ public class ModbusPlcFieldHandler extends DefaultPlcFieldHandler { @Override public FieldItem encodeByteArray(PlcField field, Object[] values) { ModbusField modbusField = (ModbusField) field; - List<byte[]> byteArrays = new LinkedList<>(); + List<Byte[]> byteArrays = new LinkedList<>(); for (Object value : values) { if (value instanceof byte[]) { byte[] byteArray = (byte[]) value; - byteArrays.add(byteArray); + byteArrays.add(ArrayUtils.toObject(byteArray)); } else if (value instanceof Byte[]) { Byte[] byteArray = (Byte[]) value; - byteArrays.add(ArrayUtils.toPrimitive(byteArray)); + byteArrays.add(byteArray); } else { throw new IllegalArgumentException( "Value of type " + value.getClass().getName() + " is not assignable to " + modbusField + " fields."); } } - return new DefaultByteArrayFieldItem(byteArrays.toArray(new byte[0][0])); + return new DefaultByteArrayFieldItem(byteArrays.toArray(new Byte[0][0])); } } diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java index 6c2fab3..21ef508 100644 --- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java +++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java @@ -18,6 +18,7 @@ */ package org.apache.plc4x.java.modbus; +import org.apache.commons.lang3.ArrayUtils; import org.apache.plc4x.java.PlcDriverManager; import org.apache.plc4x.java.api.connection.PlcConnection; import org.apache.plc4x.java.api.connection.PlcReader; @@ -26,6 +27,11 @@ import org.apache.plc4x.java.api.messages.PlcReadResponse; import org.apache.plc4x.java.api.messages.PlcWriteResponse; import org.apache.plc4x.java.base.util.HexUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; +import java.util.Collection; + public class ManualPlc4XModbusTest { public static void main(String... args) { @@ -52,6 +58,29 @@ public class ManualPlc4XModbusTest { } { + // Read an int from 2 registers + PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found")); + + // Just dump the actual values + PlcReadResponse<?> readResponse = reader.read(builder -> builder.addItem("randomRegister", "register:3[2]")).get(); + System.out.println("Response " + readResponse); + Collection<Byte[]> randomRegisters = readResponse.getAllByteArrays("randomRegister"); + randomRegisters.stream() + .map(HexUtil::toHex) + .map(hex -> "Register Value: " + hex) + .forEach(System.out::println); + + // Read an actual int + Byte[] registerBytes = randomRegisters.stream() + .flatMap(Arrays::stream) + .toArray(Byte[]::new); + int readInt = ByteBuffer.wrap(ArrayUtils.toPrimitive(registerBytes)) + .order(ByteOrder.BIG_ENDIAN) + .getInt(); + System.out.println("Read int " + readInt + " from register"); + } + + { PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found")); PlcReadResponse<?> readResponse = reader.read(builder -> builder.addItem("randomCoil", "coil:1[9]")).get(); diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java index be76172..045912c 100644 --- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java +++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java @@ -19,7 +19,6 @@ package org.apache.plc4x.java.test; -import org.apache.commons.lang3.ArrayUtils; import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.model.PlcField; @@ -164,10 +163,10 @@ public class TestFieldHandler implements PlcFieldHandler { public FieldItem encodeByteArray(PlcField field, Object[] values) { TestField testField = (TestField) field; if (testField.getDataType() == byte[].class) { - return new DefaultByteArrayFieldItem(ArrayUtils.toPrimitive((Byte[]) values)); + return new DefaultByteArrayFieldItem(Arrays.stream(values).map(Byte.class::cast).toArray(Byte[]::new)); } if (testField.getDataType() == Byte[].class) { - return new DefaultByteArrayFieldItem(ArrayUtils.toPrimitive((Byte[]) values)); + return new DefaultByteArrayFieldItem((Byte[]) values); } throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName()); }