You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/02/07 09:51:56 UTC
[incubator-plc4x] branch feature/Beckhoff_ADS_protocol updated:
added calculated headers for convenient API usage
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 <sr...@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
sruehl@apache.org.