This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch feature/Beckhoff_ADS_protocol in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
The following commit(s) were added to refs/heads/feature/Beckhoff_ADS_protocol by this push: new af5db36 added calculated headers for convenient API usage af5db36 is described below commit af5db36dab30675da84b80dc9f0c67add2eb7822 Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Wed Feb 7 10:51:52 2018 +0100 added calculated headers for convenient API usage --- .../commands/ADSAddDeviceNotificationRequest.java | 33 ++++++++++ .../commands/ADSAddDeviceNotificationResponse.java | 11 ++++ .../ADSDeleteDeviceNotificationRequest.java | 20 ++++++ .../ADSDeleteDeviceNotificationResponse.java | 11 ++++ .../api/commands/ADSDeviceNotificationRequest.java | 24 +++++++ .../commands/ADSDeviceNotificationResponse.java | 11 ++++ .../ads/api/commands/ADSReadDeviceInfoRequest.java | 21 +++++- .../api/commands/ADSReadDeviceInfoResponse.java | 11 ++++ .../java/ads/api/commands/ADSReadRequest.java | 24 +++++++ .../java/ads/api/commands/ADSReadResponse.java | 11 ++++ .../java/ads/api/commands/ADSReadStateRequest.java | 18 ++++++ .../ads/api/commands/ADSReadStateResponse.java | 11 ++++ .../java/ads/api/commands/ADSReadWriteRequest.java | 29 +++++++++ .../ads/api/commands/ADSReadWriteResponse.java | 11 ++++ .../ads/api/commands/ADSWriteControlRequest.java | 26 ++++++++ .../ads/api/commands/ADSWriteControlResponse.java | 11 ++++ .../java/ads/api/commands/ADSWriteRequest.java | 27 +++++++- .../java/ads/api/commands/ADSWriteResponse.java | 11 ++++ .../api/commands/types/AdsNotificationSample.java | 5 +- .../ads/api/commands/types/AdsStampHeader.java | 5 +- .../plc4x/java/ads/api/generic/AMSHeader.java | 29 +++++---- .../plc4x/java/ads/api/generic/AMSTCPHeader.java | 14 ++-- .../plc4x/java/ads/api/generic/AMSTCPPaket.java | 41 ++++++++---- .../generic/calculated/CalculatedAMSHeader.java | 74 ++++++++++++++++++++++ .../CalculatedAMSTCPHeader.java} | 46 +++++--------- .../plc4x/java/ads/api/generic/types/AMSError.java | 2 + .../plc4x/java/ads/api/util/ByteReadable.java | 7 +- .../{ByteReadable.java => ByteReadableUtils.java} | 16 +++-- .../{ByteReadable.java => LengthSupplier.java} | 10 +-- .../java/org/apache/plc4x/java/ads/ADSDumper.java | 28 ++++---- 30 files changed, 500 insertions(+), 98 deletions(-) diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationRequest.java index 29baa5d..2fdd046 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationRequest.java @@ -19,10 +19,13 @@ package org.apache.plc4x.java.ads.api.commands; import org.apache.plc4x.java.ads.api.commands.types.*; +import org.apache.plc4x.java.ads.api.commands.types.Length; import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.*; +import org.apache.plc4x.java.ads.api.generic.types.Data; import org.apache.plc4x.java.ads.api.util.ByteValue; /** @@ -72,11 +75,41 @@ public class ADSAddDeviceNotificationRequest extends AMSTCPPaket { this.cycleTime = cycleTime; } + public ADSAddDeviceNotificationRequest(AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length, TransmissionMode transmissionMode, MaxDelay maxDelay, CycleTime cycleTime) { + super(amsHeader); + this.indexGroup = indexGroup; + this.indexOffset = indexOffset; + this.length = length; + this.transmissionMode = transmissionMode; + this.maxDelay = maxDelay; + this.cycleTime = cycleTime; + } + + public ADSAddDeviceNotificationRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Data nData, IndexGroup indexGroup, IndexOffset indexOffset, Length length, TransmissionMode transmissionMode, MaxDelay maxDelay, CycleTime cycleTime) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, nData); + this.indexGroup = indexGroup; + this.indexOffset = indexOffset; + this.length = length; + this.transmissionMode = transmissionMode; + this.maxDelay = maxDelay; + this.cycleTime = cycleTime; + } + @Override public ADSData getAdsData() { return buildADSData(indexGroup, indexOffset, length, transmissionMode, maxDelay, cycleTime, reserved); } + @Override + public Command getCommandId() { + return Command.ADS_Add_Device_Notification; + } + + @Override + public State getStateId() { + return State.ADS_REQUEST_TCP; + } + public static class Reserved extends ByteValue { private static final Reserved INSTANCE = new Reserved(); diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationResponse.java index 3701980..94edd27 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationResponse.java @@ -24,6 +24,8 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.Command; +import org.apache.plc4x.java.ads.api.generic.types.State; /** * A notification is created in an ADS device. @@ -51,4 +53,13 @@ public class ADSAddDeviceNotificationResponse extends AMSTCPPaket { return buildADSData(result, notificationHandle); } + @Override + public Command getCommandId() { + return Command.ADS_Add_Device_Notification; + } + + @Override + public State getStateId() { + return State.ADS_RESPONSE_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationRequest.java index d0458c9..f4d6e6d 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationRequest.java @@ -23,6 +23,7 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.*; /** * One before defined notification is deleted in an ADS device. @@ -39,9 +40,28 @@ public class ADSDeleteDeviceNotificationRequest extends AMSTCPPaket { this.notificationHandle = notificationHandle; } + public ADSDeleteDeviceNotificationRequest(AMSHeader amsHeader, NotificationHandle notificationHandle) { + super(amsHeader); + this.notificationHandle = notificationHandle; + } + + public ADSDeleteDeviceNotificationRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Data nData, NotificationHandle notificationHandle) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, nData); + this.notificationHandle = notificationHandle; + } + @Override public ADSData getAdsData() { return buildADSData(notificationHandle); } + @Override + public Command getCommandId() { + return Command.ADS_Delete_Device_Notification; + } + + @Override + public State getStateId() { + return State.ADS_REQUEST_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationResponse.java index bd18dd8..9f68481 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationResponse.java @@ -23,6 +23,8 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.Command; +import org.apache.plc4x.java.ads.api.generic.types.State; /** * One before defined notification is deleted in an ADS device. @@ -44,4 +46,13 @@ public class ADSDeleteDeviceNotificationResponse extends AMSTCPPaket { return buildADSData(result); } + @Override + public Command getCommandId() { + return Command.ADS_Delete_Device_Notification; + } + + @Override + public State getStateId() { + return State.ADS_RESPONSE_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationRequest.java index 2fe8b18..7d9bcf3 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationRequest.java @@ -25,6 +25,7 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.*; /** * Data will carry forward independently from an ADS device to a Client @@ -53,9 +54,32 @@ public class ADSDeviceNotificationRequest extends AMSTCPPaket { this.adsStampHeader = adsStampHeader; } + public ADSDeviceNotificationRequest(AMSHeader amsHeader, Length length, Stamps stamps, AdsStampHeader adsStampHeader) { + super(amsHeader); + this.length = length; + this.stamps = stamps; + this.adsStampHeader = adsStampHeader; + } + + public ADSDeviceNotificationRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Data nData, Length length, Stamps stamps, AdsStampHeader adsStampHeader) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, nData); + this.length = length; + this.stamps = stamps; + this.adsStampHeader = adsStampHeader; + } + @Override public ADSData getAdsData() { return buildADSData(length, stamps, adsStampHeader); } + @Override + public Command getCommandId() { + return Command.ADS_Device_Notification; + } + + @Override + public State getStateId() { + return State.ADS_REQUEST_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationResponse.java index 9d60d37..55c50a0 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationResponse.java @@ -20,6 +20,8 @@ package org.apache.plc4x.java.ads.api.commands; import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.Command; +import org.apache.plc4x.java.ads.api.generic.types.State; /** * Data will carry forward independently from an ADS device to a Client @@ -36,4 +38,13 @@ public class ADSDeviceNotificationResponse extends AMSTCPPaket { return ADSData.EMPTY; } + @Override + public Command getCommandId() { + return Command.ADS_Device_Notification; + } + + @Override + public State getStateId() { + return State.ADS_RESPONSE_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoRequest.java index b03b296..bb07536 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoRequest.java @@ -22,10 +22,11 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.*; /** * Reads the name and the version number of the ADS device. - * + * <p> * No additional data required */ public class ADSReadDeviceInfoRequest extends AMSTCPPaket { @@ -33,8 +34,26 @@ public class ADSReadDeviceInfoRequest extends AMSTCPPaket { super(amstcpHeader, amsHeader); } + public ADSReadDeviceInfoRequest(AMSHeader amsHeader) { + super(amsHeader); + } + + public ADSReadDeviceInfoRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Data nData) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, nData); + } + @Override public ADSData getAdsData() { return ADSData.EMPTY; } + + @Override + public Command getCommandId() { + return Command.ADS_Read_Device_Info; + } + + @Override + public State getStateId() { + return State.ADS_REQUEST_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoResponse.java index 51e45d6..ea345bf 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoResponse.java @@ -23,6 +23,8 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.Command; +import org.apache.plc4x.java.ads.api.generic.types.State; /** * Reads the name and the version number of the ADS device. @@ -63,4 +65,13 @@ public class ADSReadDeviceInfoResponse extends AMSTCPPaket { return buildADSData(result, majorVersion, minorVersion, version, device); } + @Override + public Command getCommandId() { + return Command.ADS_Read_Device_Info; + } + + @Override + public State getStateId() { + return State.ADS_RESPONSE_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadRequest.java index 10cb79a..f5e5c7f 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadRequest.java @@ -25,6 +25,7 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.*; /** * With ADS Read data can be read from an ADS device. The data are addressed by the Index Group and the Index Offset @@ -53,9 +54,32 @@ public class ADSReadRequest extends AMSTCPPaket { this.length = length; } + public ADSReadRequest(AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length) { + super(amsHeader); + this.indexGroup = indexGroup; + this.indexOffset = indexOffset; + this.length = length; + } + + public ADSReadRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Data nData, IndexGroup indexGroup, IndexOffset indexOffset, Length length) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, nData); + this.indexGroup = indexGroup; + this.indexOffset = indexOffset; + this.length = length; + } + @Override public ADSData getAdsData() { return buildADSData(indexGroup, indexOffset, length); } + @Override + public Command getCommandId() { + return Command.ADS_Read; + } + + @Override + public State getStateId() { + return State.ADS_REQUEST_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadResponse.java index a96ced1..8877ef2 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadResponse.java @@ -25,6 +25,8 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.Command; +import org.apache.plc4x.java.ads.api.generic.types.State; /** * With ADS Read data can be read from an ADS device @@ -56,4 +58,13 @@ public class ADSReadResponse extends AMSTCPPaket { return buildADSData(result, length, data); } + @Override + public Command getCommandId() { + return Command.ADS_Read; + } + + @Override + public State getStateId() { + return State.ADS_RESPONSE_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateRequest.java index 4b907ea..1f61a38 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateRequest.java @@ -22,6 +22,7 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.*; /** * Reads the ADS status and the device status of an ADS device. @@ -33,9 +34,26 @@ public class ADSReadStateRequest extends AMSTCPPaket { super(amstcpHeader, amsHeader); } + public ADSReadStateRequest(AMSHeader amsHeader) { + super(amsHeader); + } + + public ADSReadStateRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Data nData) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, nData); + } + @Override public ADSData getAdsData() { return ADSData.EMPTY; } + @Override + public Command getCommandId() { + return Command.ADS_Read_State; + } + + @Override + public State getStateId() { + return State.ADS_REQUEST_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateResponse.java index 85533a4..27cc405 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateResponse.java @@ -23,6 +23,8 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.Command; +import org.apache.plc4x.java.ads.api.generic.types.State; /** * Reads the ADS status and the device status of an ADS device. @@ -44,4 +46,13 @@ public class ADSReadStateResponse extends AMSTCPPaket { return buildADSData(result); } + @Override + public Command getCommandId() { + return Command.ADS_Read_State; + } + + @Override + public State getStateId() { + return State.ADS_RESPONSE_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteRequest.java index 1a137b1..7c6b14c 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteRequest.java @@ -26,6 +26,7 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.*; import org.apache.plc4x.java.ads.api.util.ByteValue; /** @@ -65,6 +66,24 @@ public class ADSReadWriteRequest extends AMSTCPPaket { this.data = data; } + public ADSReadWriteRequest(AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, ReadLength readLength, WriteLength writeLength, Data data) { + super(amsHeader); + this.indexGroup = indexGroup; + this.indexOffset = indexOffset; + this.readLength = readLength; + this.writeLength = writeLength; + this.data = data; + } + + public ADSReadWriteRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, org.apache.plc4x.java.ads.api.generic.types.Data nData, IndexGroup indexGroup, IndexOffset indexOffset, ReadLength readLength, WriteLength writeLength, Data data) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, nData); + this.indexGroup = indexGroup; + this.indexOffset = indexOffset; + this.readLength = readLength; + this.writeLength = writeLength; + this.data = data; + } + @Override public ADSData getAdsData() { return ADSData.EMPTY; @@ -75,4 +94,14 @@ public class ADSReadWriteRequest extends AMSTCPPaket { super(value); } } + + @Override + public Command getCommandId() { + return Command.ADS_Read_Write; + } + + @Override + public State getStateId() { + return State.ADS_REQUEST_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteResponse.java index 85e0cda..0c6ad3e 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteResponse.java @@ -25,6 +25,8 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.Command; +import org.apache.plc4x.java.ads.api.generic.types.State; /** * With ADS Read Write data will be written to an ADS device. Additionally, data can be read from the ADS device. @@ -58,4 +60,13 @@ public class ADSReadWriteResponse extends AMSTCPPaket { return ADSData.EMPTY; } + @Override + public Command getCommandId() { + return Command.ADS_Read_Write; + } + + @Override + public State getStateId() { + return State.ADS_RESPONSE_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlRequest.java index 8ac2fb8..1e26f8b 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlRequest.java @@ -26,6 +26,7 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.*; /** * Changes the ADS status and the device status of an ADS device. @@ -59,9 +60,34 @@ public class ADSWriteControlRequest extends AMSTCPPaket { this.data = data; } + public ADSWriteControlRequest(AMSHeader amsHeader, ADSState adsState, DeviceState deviceState, Length length, Data data) { + super(amsHeader); + this.adsState = adsState; + this.deviceState = deviceState; + this.length = length; + this.data = data; + } + + public ADSWriteControlRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, org.apache.plc4x.java.ads.api.generic.types.Data nData, ADSState adsState, DeviceState deviceState, Length length, Data data) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, nData); + this.adsState = adsState; + this.deviceState = deviceState; + this.length = length; + this.data = data; + } + @Override public ADSData getAdsData() { return buildADSData(adsState, deviceState, length, data); } + @Override + public Command getCommandId() { + return Command.ADS_Write_Control; + } + + @Override + public State getStateId() { + return State.ADS_REQUEST_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlResponse.java index 8e3a0b6..4f8b111 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlResponse.java @@ -23,6 +23,8 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.Command; +import org.apache.plc4x.java.ads.api.generic.types.State; /** * Changes the ADS status and the device status of an ADS device. @@ -43,4 +45,13 @@ public class ADSWriteControlResponse extends AMSTCPPaket { return buildADSData(result); } + @Override + public Command getCommandId() { + return Command.ADS_Write_Control; + } + + @Override + public State getStateId() { + return State.ADS_RESPONSE_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteRequest.java index e6dc483..171c7a0 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteRequest.java @@ -25,7 +25,7 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; -import org.apache.plc4x.java.ads.api.generic.types.Length; +import org.apache.plc4x.java.ads.api.generic.types.*; /** * With ADS Write data can be written to an ADS device. The data are addressed by the Index Group and the Index Offset. @@ -57,9 +57,34 @@ public class ADSWriteRequest extends AMSTCPPaket { this.data = data; } + public ADSWriteRequest(AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length, Data data) { + super(amsHeader); + this.indexGroup = indexGroup; + this.indexOffset = indexOffset; + this.length = length; + this.data = data; + } + + public ADSWriteRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, org.apache.plc4x.java.ads.api.generic.types.Data nData, IndexGroup indexGroup, IndexOffset indexOffset, Length length, Data data) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, nData); + this.indexGroup = indexGroup; + this.indexOffset = indexOffset; + this.length = length; + this.data = data; + } + @Override public ADSData getAdsData() { return buildADSData(indexGroup, indexOffset, length, data); } + @Override + public Command getCommandId() { + return Command.ADS_Write; + } + + @Override + public State getStateId() { + return State.ADS_REQUEST_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteResponse.java index d34a658..84db899 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteResponse.java @@ -23,6 +23,8 @@ import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; +import org.apache.plc4x.java.ads.api.generic.types.Command; +import org.apache.plc4x.java.ads.api.generic.types.State; /** * With ADS Write data can be written to an ADS device. @@ -44,4 +46,13 @@ public class ADSWriteResponse extends AMSTCPPaket { return buildADSData(result); } + @Override + public Command getCommandId() { + return Command.ADS_Write; + } + + @Override + public State getStateId() { + return State.ADS_RESPONSE_TCP; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java index 43f98cd..7b86b05 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java @@ -19,9 +19,10 @@ package org.apache.plc4x.java.ads.api.commands.types; import io.netty.buffer.ByteBuf; -import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; import org.apache.plc4x.java.ads.api.util.ByteReadable; +import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; + public class AdsNotificationSample implements ByteReadable { /** @@ -49,7 +50,7 @@ public class AdsNotificationSample implements ByteReadable { @Override public ByteBuf getByteBuf() { - return AMSTCPPaket.buildByteBuff(notificationHandle, sampleSize, data); + return buildByteBuff(notificationHandle, sampleSize, data); } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java index 70a4a06..f12d8cc 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java @@ -19,9 +19,10 @@ package org.apache.plc4x.java.ads.api.commands.types; import io.netty.buffer.ByteBuf; -import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; import org.apache.plc4x.java.ads.api.util.ByteReadable; +import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; + public class AdsStampHeader implements ByteReadable { /** @@ -49,6 +50,6 @@ public class AdsStampHeader implements ByteReadable { @Override public ByteBuf getByteBuf() { - return AMSTCPPaket.buildByteBuff(timeStamp, samples, adsNotificationSample); + return buildByteBuff(timeStamp, samples, adsNotificationSample); } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java index 4867436..59989d3 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java @@ -22,6 +22,8 @@ import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.ads.api.generic.types.*; import org.apache.plc4x.java.ads.api.util.ByteReadable; +import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; + /** * AMS Header 32 bytes The AMS/TCP-Header contains the addresses of the transmitter and receiver. In addition the AMS error code , the ADS command Id and some other information. */ @@ -29,46 +31,47 @@ public class AMSHeader implements ByteReadable { /** * This is the AMSNetId of the station, for which the packet is intended. Remarks see below. */ - private final AMSNetId targetAmsNetId; + protected final AMSNetId targetAmsNetId; /** * This is the AMSPort of the station, for which the packet is intended. */ - private final AMSPort targetAmsPort; + protected final AMSPort targetAmsPort; /** * This contains the AMSNetId of the station, from which the packet was sent. */ - private final AMSNetId sourceAmsNetId; + protected final AMSNetId sourceAmsNetId; /** * This contains the AMSPort of the station, from which the packet was sent. */ - private final AMSPort sourceAmsPort; + protected final AMSPort sourceAmsPort; /** * 2 bytes. */ - private final Command commandId; - - private final State stateFlags; - + protected final Command commandId; + /** + * 2 bytes. + */ + protected final State stateFlags; /** * 4 bytes Size of the data range. The unit is byte. */ - private final DataLength dataLength; + protected final DataLength dataLength; /** * 4 bytes AMS error number. See ADS Return Codes. */ - private final AMSError code; + protected final AMSError code; /** * 4 bytes Free usable 32 bit array. Usually this array serves to send an Id. This Id makes is possible to assign a received response to a request, which was sent before. */ - private final Invoke invokeId; + protected final Invoke invokeId; /** * bytes Data range. The data range contains the parameter of the considering ADS commands. */ // TODO: check if this is indeed {@link ADSData} and the documentation is just confusing at this point - private final Data nData; + protected final Data nData; public AMSHeader(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Command commandId, State stateFlags, DataLength dataLength, AMSError code, Invoke invokeId, Data nData) { this.targetAmsNetId = targetAmsNetId; @@ -85,7 +88,7 @@ public class AMSHeader implements ByteReadable { @Override public ByteBuf getByteBuf() { - return AMSTCPPaket.buildByteBuff( + return buildByteBuff( targetAmsNetId, targetAmsPort, sourceAmsNetId, diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java index f207c9e..2df6ab1 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java @@ -23,36 +23,36 @@ import org.apache.plc4x.java.ads.api.generic.types.Length; import org.apache.plc4x.java.ads.api.util.ByteReadable; import org.apache.plc4x.java.ads.api.util.ByteValue; +import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; + /** * AMS/TCP Header 6 bytes contains the length of the data packet. */ public class AMSTCPHeader implements ByteReadable { - private final Reserved reserved; + protected final Reserved reserved; - private final Length length; + protected final Length length; - AMSTCPHeader(Length length) { + protected AMSTCPHeader(Length length) { this.reserved = Reserved.CONSTANT; this.length = length; } - // TODO: this should only be used when deserializing. - // TODO: When sending this needs to be calculated public static AMSTCPHeader of(int length) { return new AMSTCPHeader(Length.of(length)); } @Override public ByteBuf getByteBuf() { - return AMSTCPPaket.buildByteBuff(reserved, length); + return buildByteBuff(reserved, length); } /** * Size: 2 bytes * These bytes must be set to 0. */ - private static class Reserved extends ByteValue { + protected static class Reserved extends ByteValue { private static final Reserved CONSTANT = new Reserved(); diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPaket.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPaket.java index 7182fde..2aed1f4 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPaket.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPaket.java @@ -19,24 +19,44 @@ package org.apache.plc4x.java.ads.api.generic; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; +import org.apache.plc4x.java.ads.api.generic.calculated.CalculatedAMSHeader; +import org.apache.plc4x.java.ads.api.generic.calculated.CalculatedAMSTCPHeader; +import org.apache.plc4x.java.ads.api.generic.types.*; import org.apache.plc4x.java.ads.api.util.ByteReadable; +import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; + public abstract class AMSTCPPaket implements ByteReadable { private final AMSTCPHeader amstcpHeader; private final AMSHeader amsHeader; - public AMSTCPPaket(int amstcpHeaderLength, AMSHeader amsHeader) { - this.amstcpHeader = AMSTCPHeader.of(amstcpHeaderLength); + public AMSTCPPaket(AMSTCPHeader amstcpHeader, AMSHeader amsHeader) { + this.amstcpHeader = amstcpHeader; this.amsHeader = amsHeader; } - public AMSTCPPaket(AMSTCPHeader amstcpHeader, AMSHeader amsHeader) { - this.amstcpHeader = amstcpHeader; + public AMSTCPPaket(AMSHeader amsHeader) { + // It is important that we wrap the ads data call as this will initialized in the constructor + // so this value will be null if we call adsData now. + this.amstcpHeader = CalculatedAMSTCPHeader.of(amsHeader, () -> getAdsData().getLength()); this.amsHeader = amsHeader; } + public AMSTCPPaket(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Data nData) { + this.amsHeader = CalculatedAMSHeader.of( + targetAmsNetId, + targetAmsPort, + sourceAmsNetId, + sourceAmsPort, + this::getCommandId, + this::getStateId, + () -> DataLength.of(getAdsData().getLength()), + invokeId, + nData); + this.amstcpHeader = CalculatedAMSTCPHeader.of(amsHeader, () -> getAdsData().getLength()); + } + public AMSTCPHeader getAmstcpHeader() { return amstcpHeader; } @@ -47,6 +67,10 @@ public abstract class AMSTCPPaket implements ByteReadable { public abstract ADSData getAdsData(); + public abstract Command getCommandId(); + + public abstract State getStateId(); + @Override public ByteBuf getByteBuf() { return buildByteBuff(amstcpHeader, amsHeader, getAdsData()); @@ -56,11 +80,4 @@ public abstract class AMSTCPPaket implements ByteReadable { return () -> buildByteBuff(byteReadables); } - public static ByteBuf buildByteBuff(ByteReadable... byteReadables) { - ByteBuf buffer = Unpooled.buffer(); - for (ByteReadable byteReadable : byteReadables) { - buffer.writeBytes(byteReadable.getByteBuf()); - } - return buffer; - } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSHeader.java new file mode 100644 index 0000000..7aeb935 --- /dev/null +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSHeader.java @@ -0,0 +1,74 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.plc4x.java.ads.api.generic.calculated; + +import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.ads.api.generic.AMSHeader; +import org.apache.plc4x.java.ads.api.generic.types.*; + +import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; + +public class CalculatedAMSHeader extends AMSHeader { + + protected final CommandIdSupplier commandIdSupplier; + + protected final StateIdSupplier stateIdSupplier; + + protected final LengthSupplier lengthSupplier; + + protected CalculatedAMSHeader(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, CommandIdSupplier commandIdSupplier, StateIdSupplier stateIdSupplier, LengthSupplier lengthSupplier, Invoke invokeId, Data nData) { + super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, null, null, null, AMSError.NONE, invokeId, nData); + this.commandIdSupplier = commandIdSupplier; + this.stateIdSupplier = stateIdSupplier; + this.lengthSupplier = lengthSupplier; + } + + public static CalculatedAMSHeader of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, CommandIdSupplier commandIdSupplier, StateIdSupplier stateIdSupplier, LengthSupplier lengthSupplier, Invoke invokeId, Data nData) { + return new CalculatedAMSHeader(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, commandIdSupplier, stateIdSupplier, lengthSupplier, invokeId, nData); + } + + @FunctionalInterface + public interface CommandIdSupplier { + Command getCommandId(); + } + + @FunctionalInterface + public interface StateIdSupplier { + State getStateId(); + } + + public interface LengthSupplier { + DataLength getLength(); + } + + @Override + public ByteBuf getByteBuf() { + return buildByteBuff( + targetAmsNetId, + targetAmsPort, + sourceAmsNetId, + sourceAmsPort, + commandIdSupplier.getCommandId(), + stateIdSupplier.getStateId(), + lengthSupplier.getLength(), + code, + invokeId, + nData); + } +} diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSTCPHeader.java similarity index 51% copy from plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java copy to plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSTCPHeader.java index f207c9e..ddbf615 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSTCPHeader.java @@ -16,50 +16,38 @@ specific language governing permissions and limitations under the License. */ -package org.apache.plc4x.java.ads.api.generic; +package org.apache.plc4x.java.ads.api.generic.calculated; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.types.Length; -import org.apache.plc4x.java.ads.api.util.ByteReadable; -import org.apache.plc4x.java.ads.api.util.ByteValue; +import org.apache.plc4x.java.ads.api.util.LengthSupplier; + +import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; /** * AMS/TCP Header 6 bytes contains the length of the data packet. + * This Header is caluclated. Can be used when sending. */ -public class AMSTCPHeader implements ByteReadable { - - private final Reserved reserved; +public class CalculatedAMSTCPHeader extends AMSTCPHeader { - private final Length length; + protected final LengthSupplier[] lengthSupplier; - AMSTCPHeader(Length length) { - this.reserved = Reserved.CONSTANT; - this.length = length; + protected CalculatedAMSTCPHeader(LengthSupplier... lengthSupplier) { + super(null); + this.lengthSupplier = lengthSupplier; } - // TODO: this should only be used when deserializing. - // TODO: When sending this needs to be calculated - public static AMSTCPHeader of(int length) { - return new AMSTCPHeader(Length.of(length)); + public static CalculatedAMSTCPHeader of(LengthSupplier... lengthSupplier) { + return new CalculatedAMSTCPHeader(lengthSupplier); } @Override public ByteBuf getByteBuf() { - return AMSTCPPaket.buildByteBuff(reserved, length); - } - - /** - * Size: 2 bytes - * These bytes must be set to 0. - */ - private static class Reserved extends ByteValue { - - private static final Reserved CONSTANT = new Reserved(); - - private Reserved() { - super((byte) 0x00, (byte) 0x00); - assertLength(2); + long aggregateLength = 0; + for (LengthSupplier supplier : lengthSupplier) { + aggregateLength += supplier.getLength(); } + return buildByteBuff(reserved, Length.of(aggregateLength)); } - } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/types/AMSError.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/types/AMSError.java index ee34a58..7c01eb1 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/types/AMSError.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/types/AMSError.java @@ -24,6 +24,8 @@ public class AMSError extends ByteValue { public static final int NUM_BYTES = 4; + public static final AMSError NONE = of((byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00); + AMSError(byte... values) { super(values); assertLength(NUM_BYTES); diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java index 2b02651..39e08aa 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java @@ -21,11 +21,16 @@ package org.apache.plc4x.java.ads.api.util; import io.netty.buffer.ByteBuf; @FunctionalInterface -public interface ByteReadable { +public interface ByteReadable extends LengthSupplier { default byte[] getBytes() { return getByteBuf().array(); } ByteBuf getByteBuf(); + + default long getLength() { + return getBytes().length; + } + } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadableUtils.java similarity index 68% copy from plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java copy to plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadableUtils.java index 2b02651..02cbd78 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadableUtils.java @@ -19,13 +19,19 @@ package org.apache.plc4x.java.ads.api.util; import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; -@FunctionalInterface -public interface ByteReadable { +public class ByteReadableUtils { - default byte[] getBytes() { - return getByteBuf().array(); + private ByteReadableUtils() { + // Singleton } - ByteBuf getByteBuf(); + public static ByteBuf buildByteBuff(ByteReadable... byteReadables) { + ByteBuf buffer = Unpooled.buffer(); + for (ByteReadable byteReadable : byteReadables) { + buffer.writeBytes(byteReadable.getByteBuf()); + } + return buffer; + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/LengthSupplier.java similarity index 83% copy from plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java copy to plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/LengthSupplier.java index 2b02651..3401054 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteReadable.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/LengthSupplier.java @@ -18,14 +18,8 @@ */ package org.apache.plc4x.java.ads.api.util; -import io.netty.buffer.ByteBuf; - @FunctionalInterface -public interface ByteReadable { - - default byte[] getBytes() { - return getByteBuf().array(); - } +public interface LengthSupplier { - ByteBuf getByteBuf(); + long getLength(); } diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSDumper.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSDumper.java index d5a7630..176f5b8 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSDumper.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSDumper.java @@ -22,9 +22,10 @@ import org.apache.plc4x.java.ads.api.commands.ADSWriteRequest; import org.apache.plc4x.java.ads.api.commands.types.Data; import org.apache.plc4x.java.ads.api.commands.types.IndexGroup; import org.apache.plc4x.java.ads.api.commands.types.IndexOffset; -import org.apache.plc4x.java.ads.api.generic.AMSHeader; -import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; -import org.apache.plc4x.java.ads.api.generic.types.*; +import org.apache.plc4x.java.ads.api.generic.types.AMSNetId; +import org.apache.plc4x.java.ads.api.generic.types.AMSPort; +import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import org.apache.plc4x.java.ads.api.generic.types.Length; import org.pcap4j.core.PcapDumper; import org.pcap4j.core.PcapHandle; import org.pcap4j.core.Pcaps; @@ -50,22 +51,15 @@ public class ADSDumper { PcapDumper dumper = handle.dumpOpen(dumpFile.toAbsolutePath().toString())) { ADSWriteRequest adsWriteRequest = new ADSWriteRequest( - AMSTCPHeader.of(13), - new AMSHeader( - AMSNetId.of("0.0.0.0.0.0"), - AMSPort.of(13), - AMSNetId.of("0.0.0.0.0.0"), - AMSPort.of(13), - Command.ADS_Write, - State.ADS_REQUEST_TCP, - DataLength.of(13), - AMSError.of((byte) 0, (byte) 0, (byte) 0, (byte) 0), - Invoke.of((byte) 0, (byte) 0, (byte) 0, (byte) 0), - org.apache.plc4x.java.ads.api.generic.types.Data.of((byte) 0) - ), + AMSNetId.of("192.168.0.70.1.2"), + AMSPort.of(12), + AMSNetId.of("192.168.0.70.1.1"), + AMSPort.of(14), + Invoke.of((byte) 0, (byte) 0, (byte) 0, (byte) 0), + org.apache.plc4x.java.ads.api.generic.types.Data.of((byte) 0), IndexGroup.of((byte) 0, (byte) 0, (byte) 0, (byte) 0), IndexOffset.of((byte) 0, (byte) 0, (byte) 0, (byte) 0), - Length.of(13), + Length.of(1), Data.of((byte) 0x42) ); -- To stop receiving notification emails like this one, please contact sru...@apache.org.