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 1ec6bea + use length according to datatype + define some more constants 1ec6bea is described below commit 1ec6beac84dfa841f85274a79dc5cf3a567b0719 Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Thu May 24 14:27:07 2018 +0200 + use length according to datatype + define some more constants --- .../java/ads/api/commands/types/AdsState.java | 26 +++++++++++++++++++ .../ads/api/commands/types/TransmissionMode.java | 14 +++++++++++ .../java/ads/connection/AdsTcpPlcConnection.java | 4 +-- .../ads/protocol/util/LittleEndianDecoder.java | 29 ++++++++++++++++++---- 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsState.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsState.java index 9705ddd..2ddeec7 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsState.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsState.java @@ -21,6 +21,7 @@ package org.apache.plc4x.java.ads.api.commands.types; import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.ads.api.util.UnsignedShortLEByteValue; +@SuppressWarnings("unused") // Due to predefined AdsStates public class AdsState extends UnsignedShortLEByteValue { public static final int NUM_BYTES = UnsignedShortLEByteValue.UNSIGNED_SHORT_LE_NUM_BYTES; @@ -56,4 +57,29 @@ public class AdsState extends UnsignedShortLEByteValue { public static AdsState of(String value) { return new AdsState(value); } + + // TODO: defined as enum so we might do this too similar to AdsReturnCode + public static final class DefinedValues { + public static final AdsState ADSSTATE_INVALID = AdsState.of(0); + public static final AdsState ADSSTATE_IDLE = AdsState.of(1); + public static final AdsState ADSSTATE_RESET = AdsState.of(2); + public static final AdsState ADSSTATE_INIT = AdsState.of(3); + public static final AdsState ADSSTATE_START = AdsState.of(4); + public static final AdsState ADSSTATE_RUN = AdsState.of(5); + public static final AdsState ADSSTATE_STOP = AdsState.of(6); + public static final AdsState ADSSTATE_SAVECFG = AdsState.of(7); + public static final AdsState ADSSTATE_LOADCFG = AdsState.of(8); + public static final AdsState ADSSTATE_POWERFAILURE = AdsState.of(9); + public static final AdsState ADSSTATE_POWERGOOD = AdsState.of(10); + public static final AdsState ADSSTATE_ERROR = AdsState.of(11); + public static final AdsState ADSSTATE_SHUTDOWN = AdsState.of(12); + public static final AdsState ADSSTATE_SUSPEND = AdsState.of(13); + public static final AdsState ADSSTATE_RESUME = AdsState.of(14); + public static final AdsState ADSSTATE_CONFIG = AdsState.of(15); + public static final AdsState ADSSTATE_RECONFIG = AdsState.of(16); + public static final AdsState ADSSTATE_STOPPING = AdsState.of(17); + public static final AdsState ADSSTATE_INCOMPATIBLE = AdsState.of(18); + public static final AdsState ADSSTATE_EXCEPTION = AdsState.of(19); + public static final AdsState ADSSTATE_MAXSTATES = AdsState.of(Integer.MAX_VALUE); + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/TransmissionMode.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/TransmissionMode.java index 8f9ae7f..64ae165 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/TransmissionMode.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/TransmissionMode.java @@ -21,6 +21,7 @@ package org.apache.plc4x.java.ads.api.commands.types; import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.ads.api.util.UnsignedIntLEByteValue; +@SuppressWarnings("unused") // Due to predefined TransmissionModes public class TransmissionMode extends UnsignedIntLEByteValue { public static final int NUM_BYTES = UnsignedIntLEByteValue.UNSIGNED_INT_LE_NUM_BYTES; @@ -56,4 +57,17 @@ public class TransmissionMode extends UnsignedIntLEByteValue { public static TransmissionMode of(ByteBuf byteBuf) { return new TransmissionMode(byteBuf); } + + // TODO: defined as enum so we might do this too similar to AdsReturnCode + public static final class DefinedValues { + public static final TransmissionMode ADSTRANS_NOTRANS = TransmissionMode.of(0); + public static final TransmissionMode ADSTRANS_CLIENTCYCLE = TransmissionMode.of(1); + public static final TransmissionMode ADSTRANS_CLIENTONCHA = TransmissionMode.of(2); + public static final TransmissionMode ADSTRANS_SERVERCYCLE = TransmissionMode.of(3); + public static final TransmissionMode ADSTRANS_SERVERONCHA = TransmissionMode.of(4); + public static final TransmissionMode ADSTRANS_SERVERCYCLE2 = TransmissionMode.of(5); + public static final TransmissionMode ADSTRANS_SERVERONCHA2 = TransmissionMode.of(6); + public static final TransmissionMode ADSTRANS_CLIENT1REQ = TransmissionMode.of(10); + public static final TransmissionMode ADSTRANS_MAXMODES = TransmissionMode.of(Integer.MAX_VALUE); + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnection.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnection.java index a32727e..1b47bd7 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnection.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsTcpPlcConnection.java @@ -164,8 +164,8 @@ public class AdsTcpPlcConnection extends AdsAbstractPlcConnection implements Plc Invoke.NONE, indexGroup, indexOffset, - Length.of(1), - TransmissionMode.of(3), + LittleEndianDecoder.getLengthFor(dataType, 1), + TransmissionMode.DefinedValues.ADSTRANS_SERVERCYCLE, MaxDelay.of(0), CycleTime.of(4000000) ); diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java index 4a10066..4c705b2 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java @@ -18,22 +18,41 @@ */ package org.apache.plc4x.java.ads.protocol.util; +import org.apache.plc4x.java.ads.api.commands.types.Length; import org.apache.plc4x.java.ads.api.commands.types.TimeStamp; import org.apache.plc4x.java.api.exceptions.PlcProtocolException; import java.math.BigInteger; -import java.util.Calendar; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; // TODO: we might user ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).putInt(port).asArray() etc public class LittleEndianDecoder { + private static final Map<Class<?>, Long> LENGTH_MAP; + + static { + Map<Class<?>, Long> lengthMap = new ConcurrentHashMap<>(); + lengthMap.put(Boolean.class, 1L); + lengthMap.put(Byte.class, 1L); + lengthMap.put(Short.class, 2L); + lengthMap.put(Integer.class, 4L); + lengthMap.put(Float.class, 4L); + lengthMap.put(Calendar.class, 8L); + LENGTH_MAP = Collections.unmodifiableMap(lengthMap); + } + private LittleEndianDecoder() { // Utility class } + public static Length getLengthFor(Class<?> clazz, long defaultValue) { + if (Calendar.class.isAssignableFrom(clazz)) { + return Length.of(4); + } + return Length.of(LENGTH_MAP.getOrDefault(clazz, defaultValue)); + } + @SuppressWarnings("unchecked") public static <T> List<T> decodeData(Class<T> datatype, byte[] adsData) throws PlcProtocolException { List<Object> result = new LinkedList<>(); @@ -51,7 +70,7 @@ public class LittleEndianDecoder { } else if (datatype == Float.class && length < 4) { safeLengthAdsData = new byte[4]; System.arraycopy(adsData, 0, safeLengthAdsData, 0, length); - } else if (datatype == Calendar.class && length < 8) { + } else if (datatype == Calendar.class || Calendar.class.isAssignableFrom(datatype) && length < 8) { safeLengthAdsData = new byte[8]; System.arraycopy(adsData, 0, safeLengthAdsData, 0, length); } else { -- To stop receiving notification emails like this one, please contact sru...@apache.org.