You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/09/14 13:29:35 UTC

[incubator-plc4x] branch feature/api-redesign-chris-c updated (2587167 -> 4bd85c7)

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

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


    from 2587167  fixed issues with site generation
     new 660f212  cleanup AdsPlcFieldHandler. Still needs fixing.
     new 4bd85c7  fixed compare to messup in AdsPlcFieldHandler

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/plc4x/java/ads/model/AdsDataType.java   |  25 +-
 .../plc4x/java/ads/model/AdsPlcFieldHandler.java   | 287 ++-------------------
 2 files changed, 30 insertions(+), 282 deletions(-)


[incubator-plc4x] 02/02: fixed compare to messup in AdsPlcFieldHandler

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4bd85c72fe1dfc4ce6fd87e50feeaa4f4dbaa648
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Sep 14 15:29:30 2018 +0200

    fixed compare to messup in AdsPlcFieldHandler
---
 .../apache/plc4x/java/ads/model/AdsDataType.java   | 25 ++++++++++++----------
 .../plc4x/java/ads/model/AdsPlcFieldHandler.java   |  4 ++--
 2 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
index e3bcfbf..72da37f 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
@@ -35,15 +35,17 @@ public enum AdsDataType {
     BITARR16(16),
     BITARR32(32),
     INT8(8),
-    INT16(16),
-    INT32(32),
-    INT64(64),
-    UINT8(8),
-    UINT16(16),
-    UINT32(32),
-    UINT64(64),
-    FLOAT(32),
-    DOUBLE(64),
+    INT16(Short.MIN_VALUE, Short.MAX_VALUE, 16),
+    INT32(Integer.MIN_VALUE, Integer.MAX_VALUE, 32),
+    INT64(Long.MIN_VALUE, Long.MAX_VALUE, 64),
+    UINT8(0, Short.MAX_VALUE, 8),
+    UINT16(0, Integer.MAX_VALUE, 16),
+    // TODO: max might be off here
+    UINT32(0, Double.MAX_VALUE, 32),
+    // TODO: max might be off here
+    UINT64(0, Double.MAX_VALUE, 64),
+    FLOAT(Float.MIN_VALUE, Float.MAX_VALUE, 32),
+    DOUBLE(Double.MIN_VALUE, Double.MAX_VALUE, 64),
     // https://infosys.beckhoff.com/english.php?content=../content/1033/tcplccontrol/html/tcplcctrl_plc_data_types_overview.htm&id
     // Standard Data Types
     /**
@@ -148,7 +150,7 @@ public enum AdsDataType {
      * Type	Lower bound	Upper bound	Memory use
      * REAL	~ -3.402823 x 1038	~ 3.402823 x 1038	32 Bit
      */
-    REAL(Float.MAX_VALUE, Float.MAX_VALUE, 32),
+    REAL(Float.MIN_VALUE, Float.MAX_VALUE, 32),
     /**
      * LREAL
      * 64 Bit floating point data type. It is required to represent rational numbers.
@@ -495,8 +497,9 @@ public enum AdsDataType {
 
     private final int targetByteSize;
 
+    // TODO: BYTE.MAX default might not be the best....
     AdsDataType(int memoryUse) {
-        this(-1, -1, memoryUse);
+        this(0, Byte.MAX_VALUE, memoryUse);
     }
 
     AdsDataType(double lowerBound, double upperBound, int memoryUse) {
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
index a7742a0..668f926 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
@@ -837,12 +837,12 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
                         " is not assignable to " + adsField.getAdsDataType().name() + " fields.");
             }
 
-            if (minValue.compareTo(new BigDecimal(floatingPointValues[i])) < 0) {
+            if (minValue.compareTo(new BigDecimal(floatingPointValues[i])) > 0) {
                 throw new IllegalArgumentException(
                     "Value of " + floatingPointValues[i] + " exceeds allowed minimum for type "
                         + adsField.getAdsDataType().name() + " (min " + minValue.toString() + ")");
             }
-            if (maxValue.compareTo(new BigDecimal(floatingPointValues[i])) > 0) {
+            if (maxValue.compareTo(new BigDecimal(floatingPointValues[i])) < 0) {
                 throw new IllegalArgumentException(
                     "Value of " + floatingPointValues[i] + " exceeds allowed maximum for type "
                         + adsField.getAdsDataType().name() + " (max " + maxValue.toString() + ")");


[incubator-plc4x] 01/02: cleanup AdsPlcFieldHandler. Still needs fixing.

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 660f212d350eec4b4ee38cf371f4546817c466ca
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Sep 14 15:12:54 2018 +0200

    cleanup AdsPlcFieldHandler. Still needs fixing.
---
 .../plc4x/java/ads/model/AdsPlcFieldHandler.java   | 287 ++-------------------
 1 file changed, 16 insertions(+), 271 deletions(-)

diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
index bb6e70c..a7742a0 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
@@ -24,8 +24,10 @@ import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
 import org.apache.plc4x.java.base.messages.items.*;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.nio.charset.Charset;
+import java.time.LocalDateTime;
 import java.util.BitSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -661,51 +663,6 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
     private FieldItem internalEncodeBoolean(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        switch (adsField.getAdsDataType()) {
             case BOOL:
             case BYTE:
             case WORD:
@@ -755,118 +712,47 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
 
     private FieldItem internalEncodeInteger(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
-        switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        BigInteger minValue;
-        BigInteger maxValue;
+        BigDecimal minValue = BigDecimal.valueOf(adsField.getAdsDataType().getLowerBound());
+        BigDecimal maxValue = BigDecimal.valueOf(adsField.getAdsDataType().getUpperBound());
         Class<? extends FieldItem> fieldType;
         switch (adsField.getAdsDataType()) {
             case BYTE:
-                minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case WORD:
-                minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case DWORD:
-                minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case SINT:
-                minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case USINT:
-                minValue = BigInteger.valueOf((long) 0);
-                maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE * 2);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case INT:
-                minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case UINT:
-                minValue = BigInteger.valueOf((long) 0);
-                maxValue = BigInteger.valueOf(((long) Short.MAX_VALUE) * 2);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case DINT:
-                minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case UDINT:
-                minValue = BigInteger.valueOf((long) 0);
-                maxValue = BigInteger.valueOf(((long) Integer.MAX_VALUE) * 2);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case LINT:
-                minValue = BigInteger.valueOf(Long.MIN_VALUE);
-                maxValue = BigInteger.valueOf(Long.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case ULINT:
-                minValue = BigInteger.valueOf((long) 0);
-                maxValue = BigInteger.valueOf(Long.MAX_VALUE).multiply(BigInteger.valueOf((long) 2));
                 fieldType = DefaultBigIntegerFieldItem.class;
                 break;
             case INT32:
-                minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case INT64:
-                minValue = BigInteger.valueOf(Long.MIN_VALUE);
-                maxValue = BigInteger.valueOf(Long.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             default:
@@ -882,7 +768,7 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
                         "Value of type " + values[i].getClass().getName() +
                             " is not assignable to " + adsField.getAdsDataType().name() + " fields.");
                 }
-                BigInteger value = BigInteger.valueOf(((Number) values[i]).longValue());
+                BigDecimal value = BigDecimal.valueOf(((Number) values[i]).longValue());
                 if (minValue.compareTo(value) > 0) {
                     throw new IllegalArgumentException(
                         "Value of " + value.toString() + " exceeds allowed minimum for type "
@@ -899,12 +785,12 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
         } else {
             BigInteger[] bigIntegerValues = new BigInteger[values.length];
             for (int i = 0; i < values.length; i++) {
-                BigInteger value;
+                BigDecimal value;
                 if (values[i] instanceof BigInteger) {
-                    value = (BigInteger) values[i];
+                    value = new BigDecimal((BigInteger) values[i]);
                 } else if (((values[i] instanceof Byte) || (values[i] instanceof Short) ||
                     (values[i] instanceof Integer) || (values[i] instanceof Long))) {
-                    value = BigInteger.valueOf(((Number) values[i]).longValue());
+                    value = new BigDecimal(((Number) values[i]).longValue());
                 } else {
                     throw new IllegalArgumentException(
                         "Value of type " + values[i].getClass().getName() +
@@ -920,7 +806,7 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
                         "Value of " + value.toString() + " exceeds allowed maximum for type "
                             + adsField.getAdsDataType().name() + " (max " + maxValue.toString() + ")");
                 }
-                bigIntegerValues[i] = value;
+                bigIntegerValues[i] = value.toBigInteger();
             }
             return new DefaultBigIntegerFieldItem(bigIntegerValues);
         }
@@ -928,63 +814,12 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
 
     private FieldItem internalEncodeFloatingPoint(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
-        switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        Double minValue;
-        Double maxValue;
+        BigDecimal minValue = BigDecimal.valueOf(adsField.getAdsDataType().getLowerBound());
+        BigDecimal maxValue = BigDecimal.valueOf(adsField.getAdsDataType().getUpperBound());
         switch (adsField.getAdsDataType()) {
             case REAL:
-                // Yes this is actually correct, if I set min to Float.MIN_VALUE (0.0 < Float.MIN_VALUE = true)
-                minValue = (double) -Float.MAX_VALUE;
-                maxValue = (double) Float.MAX_VALUE;
                 break;
             case LREAL:
-                // Yes this is actually correct, if I set min to Double.MIN_VALUE (0.0 < Double.MIN_VALUE = true)
-                minValue = -Double.MAX_VALUE;
-                maxValue = Double.MAX_VALUE;
                 break;
             default:
                 throw new IllegalArgumentException(
@@ -1001,12 +836,13 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
                     "Value of type " + values[i].getClass().getName() +
                         " is not assignable to " + adsField.getAdsDataType().name() + " fields.");
             }
-            if (floatingPointValues[i] < minValue) {
+
+            if (minValue.compareTo(new BigDecimal(floatingPointValues[i])) < 0) {
                 throw new IllegalArgumentException(
                     "Value of " + floatingPointValues[i] + " exceeds allowed minimum for type "
                         + adsField.getAdsDataType().name() + " (min " + minValue.toString() + ")");
             }
-            if (floatingPointValues[i] > maxValue) {
+            if (maxValue.compareTo(new BigDecimal(floatingPointValues[i])) > 0) {
                 throw new IllegalArgumentException(
                     "Value of " + floatingPointValues[i] + " exceeds allowed maximum for type "
                         + adsField.getAdsDataType().name() + " (max " + maxValue.toString() + ")");
@@ -1017,56 +853,10 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
 
     private FieldItem internalEncodeString(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
-        switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        int maxLength;
+        double maxLength = adsField.getAdsDataType().getUpperBound();
         boolean encoding16Bit;
         switch (adsField.getAdsDataType()) {
             case STRING:
-                maxLength = 254;
                 encoding16Bit = false;
                 break;
             default:
@@ -1143,55 +933,10 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
     private FieldItem internalEncodeTemporal(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        switch (adsField.getAdsDataType()) {
             case TIME:
             case DATE:
             case DATE_AND_TIME:
-                return new DefaultTimeFieldItem();
+                return new DefaultTimeFieldItem((LocalDateTime[]) values);
             default:
                 throw new IllegalArgumentException(
                     "Cannot assign temporal values to " + adsField.getAdsDataType().name() + " fields.");