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/17 07:08:06 UTC
[incubator-plc4x] 22/29: cleanup AdsPlcFieldHandler. Still needs
fixing.
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch master
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.");