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.

Reply via email to