You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2018/09/04 11:30:20 UTC

[incubator-plc4x] branch feature/api-redesign-chris-c updated: - Finished refactoring the reading of values in s7

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch feature/api-redesign-chris-c
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/feature/api-redesign-chris-c by this push:
     new 8f9e9d8  - Finished refactoring the reading of values in s7
8f9e9d8 is described below

commit 8f9e9d86446aa870b99740f55211a846e7523a4a
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Sep 4 13:30:17 2018 +0200

    - Finished refactoring the reading of values in s7
---
 .../plc4x/java/api/messages/PlcFieldResponse.java  |  1 -
 .../base/messages/items/BigIntegerFieldItem.java   | 55 +++++++++++++++-------
 .../java/base/messages/items/BooleanFieldItem.java |  2 +-
 .../plc4x/java/base/messages/items/FieldItem.java  |  6 +--
 .../messages/items/FloatingPointFieldItem.java     |  2 +-
 .../java/base/messages/items/IntegerFieldItem.java |  7 ++-
 .../java/base/messages/items/StringFieldItem.java  |  2 +-
 .../java/base/messages/items/TimeFieldItem.java    |  2 +-
 .../java/modbus/netty/Plc4XModbusProtocol.java     |  6 +--
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       | 55 ++++++++++++++++++----
 10 files changed, 100 insertions(+), 38 deletions(-)

diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java
index 76cad3b..b4fc2e0 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java
@@ -22,7 +22,6 @@ import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * Base type for all response messages sent as response for a prior request
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java
index b66e122..46de6b6 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java
@@ -18,11 +18,12 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 
 public class BigIntegerFieldItem extends FieldItem<BigInteger> {
 
-    public BigIntegerFieldItem(BigInteger[] values) {
+    public BigIntegerFieldItem(BigInteger... values) {
         super(values);
     }
 
@@ -34,15 +35,16 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
     @Override
     public Boolean getBoolean(int index) {
         if (isValidBoolean(index)) {
-            return getValue(index) != 0L;
+            return getValue(index).compareTo(BigInteger.ZERO) == 0;
         }
         return null;
     }
 
     @Override
     public boolean isValidByte(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Byte.MAX_VALUE) && (value >= Byte.MIN_VALUE);
+        BigInteger value = getValue(index);
+        return (value != null) && (value.compareTo(BigInteger.valueOf(Byte.MAX_VALUE)) < 0) &&
+            (value.compareTo(BigInteger.valueOf(Byte.MIN_VALUE)) > 0);
     }
 
     @Override
@@ -55,8 +57,9 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public boolean isValidShort(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Short.MAX_VALUE) && (value >= Short.MIN_VALUE);
+        BigInteger value = getValue(index);
+        return (value != null) && (value.compareTo(BigInteger.valueOf(Short.MAX_VALUE)) < 0) &&
+            (value.compareTo(BigInteger.valueOf(Short.MIN_VALUE)) > 0);
     }
 
     @Override
@@ -69,32 +72,45 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public boolean isValidInteger(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Integer.MAX_VALUE) && (value >= Integer.MIN_VALUE);
+        BigInteger value = getValue(index);
+        return (value != null) && (value.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) < 0) &&
+            (value.compareTo(BigInteger.valueOf(Integer.MIN_VALUE)) > 0);
     }
 
     @Override
     public Integer getInteger(int index) {
-        return super.getInteger(index);
+        if(isValidInteger(index)) {
+            BigInteger value = getValue(index);
+            return value.intValue();
+        }
+        return null;
     }
 
     @Override
     public boolean isValidLong(int index) {
-        return (getValue(index) != null);
+        BigInteger value = getValue(index);
+        return (value != null) && (value.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0) &&
+            (value.compareTo(BigInteger.valueOf(Long.MIN_VALUE)) > 0);
     }
 
     @Override
     public Long getLong(int index) {
-        if(isValidFloat(index)) {
-            return getValue(index);
+        if(isValidLong(index)) {
+            BigInteger value = getValue(index);
+            return value.longValue();
         }
         return null;
     }
 
     @Override
     public boolean isValidFloat(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
+        BigInteger value = getValue(index);
+        if (value == null) {
+            return false;
+        }
+        BigDecimal decimalValue = new BigDecimal(value);
+        return (decimalValue.compareTo(BigDecimal.valueOf(Float.MAX_VALUE)) < 0) &&
+            (decimalValue.compareTo(BigDecimal.valueOf(Float.MIN_VALUE)) > 0);
     }
 
     @Override
@@ -107,12 +123,17 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public boolean isValidDouble(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Double.MAX_VALUE) && (value >= Double.MIN_VALUE);
+        BigInteger value = getValue(index);
+        if (value == null) {
+            return false;
+        }
+        BigDecimal decimalValue = new BigDecimal(value);
+        return (decimalValue.compareTo(BigDecimal.valueOf(Double.MAX_VALUE)) < 0) &&
+            (decimalValue.compareTo(BigDecimal.valueOf(Double.MIN_VALUE)) > 0);
     }
 
     @Override
-    public BigInteger getDouble(int index) {
+    public Double getDouble(int index) {
         if(isValidDouble(index)) {
             return getValue(index).doubleValue();
         }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java
index db67c0d..183583b 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.java.base.messages.items;
 
 public class BooleanFieldItem extends FieldItem<Boolean> {
 
-    public BooleanFieldItem(Boolean[] values) {
+    public BooleanFieldItem(Boolean... values) {
         super(values);
     }
 
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 cdbdc4e..30b5364 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
@@ -116,10 +116,10 @@ public abstract class FieldItem<T> {
     }
 
     protected T getValue(int index) {
-        if(values.length < index) {
-            return values[index];
+        if (index < 0 || (index >= values.length)) {
+            return null;
         }
-        return null;
+        return values[index];
     }
 
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java
index 57607fc..f2e4dc4 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.java.base.messages.items;
 
 public class FloatingPointFieldItem extends FieldItem<Double> {
 
-    public FloatingPointFieldItem(Double[] values) {
+    public FloatingPointFieldItem(Double... values) {
         super(values);
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java
index 13e15f0..05290a5 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.java.base.messages.items;
 
 public class IntegerFieldItem extends FieldItem<Long> {
 
-    public IntegerFieldItem(Long[] values) {
+    public IntegerFieldItem(Long... values) {
         super(values);
     }
 
@@ -73,7 +73,10 @@ public class IntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public Integer getInteger(int index) {
-        return super.getInteger(index);
+        if(isValidInteger(index)) {
+            return getValue(index).intValue();
+        }
+        return null;
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java
index e695e3d..a2f650e 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.java.base.messages.items;
 
 public class StringFieldItem extends FieldItem<String> {
 
-    public StringFieldItem(String[] values) {
+    public StringFieldItem(String... values) {
         super(values);
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java
index 4e88126..5b01127 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java
@@ -24,7 +24,7 @@ import java.time.LocalTime;
 
 public class TimeFieldItem extends FieldItem<LocalDateTime> {
 
-    public TimeFieldItem(LocalDateTime[] values) {
+    public TimeFieldItem(LocalDateTime... values) {
         super(values);
     }
 
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 86550e0..0c650ea 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
@@ -73,7 +73,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
 
         // TODO: support multiple requests
         if(request.getFieldNames().size() != 1) {
-            throw new PlcNotImplementedException("Only single message supported for now")
+            throw new PlcNotImplementedException("Only single message supported for now");
         }
         // TODO: check if we can map like this. Implication is that we can only work with int, short, byte and boolean
         // TODO: for higher data types float, double etc we might need to split the bytes into chunks
@@ -158,7 +158,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         PlcReadRequest request = (PlcReadRequest) msg.getRequest();
         // TODO: support multiple requests
         if(request.getFieldNames().size() != 1) {
-            throw new PlcNotImplementedException("Only single message supported for now")
+            throw new PlcNotImplementedException("Only single message supported for now");
         }
         // TODO: check if we can map like this. Implication is that we can only work with int, short, byte and boolean
         // TODO: for higher data types float, double etc we might need to split the bytes into chunks
@@ -209,7 +209,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         PlcRequest request = plcRequestContainer.getRequest();
         // TODO: support multiple requests (Shouldn't be needed as the request wouldn't have been sent)
         if(request.getFieldNames().size() != 1) {
-            throw new PlcNotImplementedException("Only single message supported for now")
+            throw new PlcNotImplementedException("Only single message supported for now");
         }
 
         ModbusPdu modbusPdu = msg.getModbusPdu();
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
index af62a65..50cdf83 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
@@ -32,9 +32,7 @@ import org.apache.plc4x.java.base.events.ConnectedEvent;
 import org.apache.plc4x.java.base.messages.DefaultPlcReadResponse;
 import org.apache.plc4x.java.base.messages.DefaultPlcWriteResponse;
 import org.apache.plc4x.java.base.messages.PlcRequestContainer;
-import org.apache.plc4x.java.base.messages.items.BooleanFieldItem;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
-import org.apache.plc4x.java.base.messages.items.FloatingPointFieldItem;
+import org.apache.plc4x.java.base.messages.items.*;
 import org.apache.plc4x.java.s7.model.S7Field;
 import org.apache.plc4x.java.s7.netty.events.S7ConnectedEvent;
 import org.apache.plc4x.java.s7.netty.model.messages.S7Message;
@@ -49,6 +47,7 @@ import org.apache.plc4x.java.s7.netty.model.types.*;
 
 import java.io.IOException;
 import java.math.BigInteger;
+import java.nio.charset.Charset;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -283,8 +282,8 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                     // Bit
                     // -----------------------------------------
                     case BOOL: {
-                        // TODO: Multiple boolean are encoded in one byte ...
-                        fieldItem = new BooleanFieldItem();
+                        byte byteValue = data.readByte();
+                        fieldItem = new BooleanFieldItem(byteValue != 0x00);
                         break;
                     }
                     // -----------------------------------------
@@ -292,18 +291,22 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                     // -----------------------------------------
                     case BYTE: { // 1 byte
                         Long longValue = (long) data.readByte();
+                        // TODO: Implement this ...
                         break;
                     }
                     case WORD: { // 2 byte (16 bit)
                         Long longValue = (long) data.readShort();
+                        // TODO: Implement this ...
                         break;
                     }
                     case DWORD: { // 4 byte (32 bit)
                         Long longValue = (long) data.readInt();
+                        // TODO: Implement this ...
                         break;
                     }
                     case LWORD: { // 8 byte (64 bit)
                         Long longValue = data.readLong();
+                        // TODO: Implement this ...
                         break;
                     }
                     // -----------------------------------------
@@ -312,56 +315,92 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                     // 8 bit:
                     case SINT: {
                         Long longValue = (long) data.readShort();
-
+                        fieldItem = new IntegerFieldItem(longValue);
                         break;
                     }
                     case USINT: {
                         Long longValue = (long) data.readUnsignedShort();
+                        fieldItem = new IntegerFieldItem(longValue);
                         break;
                     }
                     // 16 bit:
                     case INT: {
                         Long longValue = (long) data.readInt();
+                        fieldItem = new IntegerFieldItem(longValue);
                         break;
                     }
                     case UINT: {
                         Long longValue = data.readUnsignedInt();
+                        fieldItem = new IntegerFieldItem(longValue);
                         break;
                     }
                     // 32 bit:
                     case DINT: {
                         Long longValue = data.readLong();
+                        fieldItem = new IntegerFieldItem(longValue);
                         break;
                     }
                     case UDINT: {
                         BigInteger bigIntegerValue = readUnsignedLong(data);
+                        fieldItem = new BigIntegerFieldItem(bigIntegerValue);
                         break;
                     }
                     // 64 bit:
                     case LINT: {
                         BigInteger bigIntegerValue = readSigned64BitInteger(data);
+                        fieldItem = new BigIntegerFieldItem(bigIntegerValue);
                         break;
                     }
                     case ULINT: {
                         BigInteger bigIntegerValue = readUnsigned64BitInteger(data);
+                        fieldItem = new BigIntegerFieldItem(bigIntegerValue);
                         break;
                     }
                     // -----------------------------------------
                     // Floating point values
                     // -----------------------------------------
                     case REAL: {
-                        float floatValue = data.readFloat();
+                        double doubleValue = data.readFloat();
+                        fieldItem = new FloatingPointFieldItem(doubleValue);
                         break;
                     }
                     case LREAL: {
                         double doubleValue = data.readDouble();
+                        fieldItem = new FloatingPointFieldItem(doubleValue);
                         break;
                     }
                     // -----------------------------------------
                     // Characters & Strings
                     // -----------------------------------------
                     case CHAR: { // 1 byte (8 bit)
-                        Long longValue = (long) data.readChar();
+                        // TODO: Double check, if this is ok?
+                        String stringValue = data.readCharSequence(1, Charset.forName("UTF-8")).toString();
+                        fieldItem = new StringFieldItem(stringValue);
+                        break;
+                    }
+                    case WCHAR: { // 2 byte
+                        // TODO: Double check, if this is ok?
+                        String stringValue = data.readCharSequence(2, Charset.forName("UTF-16")).toString();
+                        fieldItem = new StringFieldItem(stringValue);
+                        break;
+                    }
+                    case STRING: {
+                        // Max length ... ignored.
+                        data.readByte();
+                        byte actualLength = data.readByte();
+                        // TODO: Double check, if this is ok?
+                        String stringValue = data.readCharSequence(actualLength, Charset.forName("UTF-8")).toString();
+                        fieldItem = new StringFieldItem(stringValue);
+                        break;
+                    }
+                    case WSTRING: {
+                        // Max length ... ignored.
+                        data.readByte();
+                        byte actualLength = data.readByte();
+                        // TODO: Double check, if this is ok?
+                        String stringValue = data.readCharSequence(
+                            actualLength * 2, Charset.forName("UTF-16")).toString();
+                        fieldItem = new StringFieldItem(stringValue);
                         break;
                     }
                     default: