You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2021/10/23 16:47:00 UTC
[plc4x] branch feature/mspec-ng updated: - Fixed enums in simple
fileds - Continued refactoring Array fields to Lists - Started fixing the
AB-ETH and ADS driver after this change - Refactored the ADS driver to use
byte[] instead of Lists of "int 8"
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/mspec-ng
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/feature/mspec-ng by this push:
new 41adae9 - Fixed enums in simple fileds - Continued refactoring Array fields to Lists - Started fixing the AB-ETH and ADS driver after this change - Refactored the ADS driver to use byte[] instead of Lists of "int 8"
41adae9 is described below
commit 41adae91d13f19a2171c206b9308d07a45743c8b
Author: cdutz <ch...@c-ware.de>
AuthorDate: Sat Oct 23 18:46:50 2021 +0200
- Fixed enums in simple fileds
- Continued refactoring Array fields to Lists
- Started fixing the AB-ETH and ADS driver after this change
- Refactored the ADS driver to use byte[] instead of Lists of "int 8"
---
.../resources/templates/java/io-template.java.ftlh | 29 ++---
.../templates/java/pojo-template.java.ftlh | 14 +--
.../java/abeth/protocol/AbEthProtocolLogic.java | 34 +++---
.../java/abeth/protocol/Plc4xAbEthProtocol.java | 36 +++---
.../plc4x/java/ads/protocol/AdsProtocolLogic.java | 11 +-
.../java/spi/codegen/fields/FieldReaderArray.java | 9 +-
.../java/spi/generation/ReadBufferXmlBased.java | 3 +-
.../resources/protocols/ads/ads-discovery.mspec | 6 +-
.../ads/src/main/resources/protocols/ads/ads.mspec | 14 +--
.../resources/protocols/ads/DriverTestsuite.xml | 131 ++-------------------
.../protocols/ads/ParserSerializerTestsuite.xml | 51 +-------
11 files changed, 91 insertions(+), 247 deletions(-)
diff --git a/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
index 37cc0f6..1c294dd 100644
--- a/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
@@ -154,12 +154,12 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
<#assign numberOfBytesExpression>
<#compress>
<#if field.isCountArrayField()>
- int numberOfBytes = ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
+ int numberOfBytes = (int) ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
<#elseif field.isLengthArrayField()>
- int numberOfBytes = ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
+ int numberOfBytes = (int) ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
<#elseif field.isTerminatedArrayField()>
<#-- TODO: we need to find out to implement this-->
- int numberOfBytes := ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
+ int numberOfBytes := (int) ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)};
<#else>
<#-- TODO: we should throw a exception here-->
int numberOfBytes := -1
@@ -177,20 +177,17 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
<#-- If this is a count array, we can directly initialize an array with the given size -->
<#if field.isCountArrayField()>
// Count array
- Object ${arrayField.name}Object = readCountArrayField(${helper.getLanguageTypeNameForField(field)}.class, "${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)});
- ${helper.getLanguageTypeNameForField(field)}[] ${arrayField.name} = (${helper.getLanguageTypeNameForField(field)}[]) ${arrayField.name}Object;
+ List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> ${arrayField.name} = readCountArrayField("${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)});
<#-- In all other cases do we have to work with a list, that is later converted to an array -->
<#else>
<#-- For a length array, we read data till the read position of the buffer reaches a given position -->
<#if field.isLengthArrayField()>
// Length array
- Object ${arrayField.name}Object = readLengthArrayField(${helper.getLanguageTypeNameForField(field)}.class, "${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)});
- ${helper.getLanguageTypeNameForField(field)}[] ${arrayField.name} = (${helper.getLanguageTypeNameForField(field)}[]) ${arrayField.name}Object;
+ List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> ${arrayField.name} = readLengthArrayField("${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)});
<#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
<#elseif field.isTerminatedArrayField()>
// Terminated array
- Object ${arrayField.name}Object = readTerminatedArrayField(${helper.getLanguageTypeNameForField(field)}.class, "${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, () -> ((boolean) (${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)})));
- ${helper.getLanguageTypeNameForField(field)}[] ${arrayField.name} = (${helper.getLanguageTypeNameForField(field)}[]) ${arrayField.name}Object;
+ List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> ${arrayField.name} = readTerminatedArrayField("${arrayField.name}", ${helper.getDataReaderCall(arrayField.type)}, () -> ((boolean) (${helper.toParseExpression(arrayField, arrayField.loopExpression, parserArguments)})));
</#if>
</#if>
</#if>
@@ -259,7 +256,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
<#assign typedField = field.asTypedField().orElseThrow()>
<#assign namedField = field.asNamedField().orElseThrow()>
- // Enum field (${enumField.name})
+ // ${field.typeName?cap_first} field (${enumField.name})
${helper.getLanguageTypeNameForField(field)} ${namedField.name} = read${field.typeName?cap_first}Field("${namedField.name}", "${helper.getTypeDefinitionForTypeReference(enumField.type).name}", new DataReaderEnumDefault<>(${helper.getTypeDefinitionForTypeReference(enumField.type).name}::firstEnumForField${enumField.fieldName?cap_first}, ${helper.getDataReaderCall(helper.getEnumBaseTypeReference(enumField.type))}));
<#break>
<#case "implicit">
@@ -372,7 +369,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
<#assign namedField = field.asNamedField().orElseThrow()>
// ${field.typeName?cap_first} Field (${namedField.name})
- ${helper.getLanguageTypeNameForField(field)} ${namedField.name} = read${field.typeName?cap_first}Field("${namedField.name}", ${helper.getDataReaderCall(typedField.type)});
+ ${helper.getLanguageTypeNameForField(field)} ${namedField.name} = <#if helper.isEnumTypeReference(typedField.type)>readEnumField("${namedField.name}", "${helper.getLanguageTypeNameForField(field)}", ${helper.getDataReaderCall(typedField.type)});<#else>read${field.typeName?cap_first}Field("${namedField.name}", ${helper.getDataReaderCall(typedField.type)});</#if>
<#break>
<#-- TODO: Port this -->
<#case "switch">
@@ -468,7 +465,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
writeBuffer.writeByteArray("${arrayField.name}", _value.get${arrayField.name?cap_first}());
<#else>
writeBuffer.pushContext("${arrayField.name}", WithReaderWriterArgs.WithRenderAsList(true));
- int itemCount = (int) _value.get${arrayField.name?cap_first}().length;
+ int itemCount = (int) _value.get${arrayField.name?cap_first}().size();
int curItem = 0;
for(${helper.getLanguageTypeNameForField(arrayField)} element : _value.get${arrayField.name?cap_first}()) {
<#if helper.isSimpleTypeReference(arrayField.type)>
@@ -651,7 +648,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
<#if type.isDiscriminatedParentTypeDefinition()>
public static interface ${type.name}Builder {
- ${type.name} build(<#list type.propertyFields as field>${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name}<#sep>, </#sep></#list>);
+ ${type.name} build(<#list type.propertyFields as field><#if field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name}<#sep>, </#sep></#list>);
}
</#if>
@@ -659,17 +656,17 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
public static class ${type.name}Builder implements ${type.parentType.name}IO.${type.parentType.name}Builder {
<#if type.propertyFields?has_content>
<#list type.propertyFields as field>
- private final ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name};
+ private final <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name};
</#list>
</#if>
- public ${type.name}Builder(<#list type.propertyFields as field>${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name}<#sep>, </#sep></#list>) {
+ public ${type.name}Builder(<#list type.propertyFields as field><#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name}<#sep>, </#sep></#list>) {
<#list type.propertyFields as field>
this.${field.name} = ${field.name};
</#list>
}
- public ${type.name} build(<#list type.parentType.asComplexTypeDefinition().orElseThrow().propertyFields as field>${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name}<#sep>, </#sep></#list>) {
+ public ${type.name} build(<#list type.parentType.asComplexTypeDefinition().orElseThrow().propertyFields as field><#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name}<#sep>, </#sep></#list>) {
return new ${type.name}(<#list type.allPropertyFields as field>${field.name}<#sep>, </#sep></#list>);
}
}
diff --git a/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
index e34be2e..b3e66c4 100644
--- a/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
@@ -116,12 +116,12 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
// Properties.
<#list type.propertyFields as field>
- private final ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name};
+ private final <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name};
</#list>
</#if>
<#-- getAllPropertyFields() returns not only the property fields of this type but also of it's parents -->
- public ${type.name}(<#list type.getAllPropertyFields() as field>${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name}<#sep>, </#sep></#list>) {
+ public ${type.name}(<#list type.getAllPropertyFields() as field><#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> ${field.name}<#sep>, </#sep></#list>) {
<#if type.getParentPropertyFields()?has_content>
super(<#list type.getParentPropertyFields() as field>${field.name}<#sep>, </#sep></#list>);
</#if>
@@ -131,18 +131,18 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
}
<#list type.abstractFields as field>
- public abstract ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.asNamedField().orElseThrow().name?cap_first}();
+ public abstract <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> get${field.asNamedField().orElseThrow().name?cap_first}();
</#list>
<#list type.propertyFields as field>
- public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}() {
+ public <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> get${field.name?cap_first}() {
return ${field.name};
}
</#list>
<#list type.virtualFields as field>
<#if !type.isDiscriminatorField(field.name)>
- public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}() {
+ public <#if field.loopType?? && field.type.isByteBased()>byte[]<#elseif field.loopType??>List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}><#else>${helper.getLanguageTypeNameForField(field)}</#if> get${field.name?cap_first}() {
<#if helper.getLanguageTypeNameForField(field) = 'String'>
return ${helper.getLanguageTypeNameForField(field)}.valueOf(${helper.toAccessExpression(field, field.valueExpression, parserArguments)});
<#else>
@@ -175,12 +175,12 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
if(${arrayField.name} != null) {
<#if helper.isSimpleTypeReference(arrayField.type)>
<#assign simpleTypeReference = arrayField.type.asSimpleTypeReference().orElseThrow()>
- lengthInBits += ${simpleTypeReference.sizeInBits} * ${arrayField.name}.length;
+ lengthInBits += ${simpleTypeReference.sizeInBits} * ${arrayField.name}.<#if arrayField.type.isByteBased()>length<#else>size()</#if>;
<#elseif arrayField.isCountArrayField()>
int i=0;
<#assign complexTypeReference = arrayField.type.asComplexTypeReference().orElseThrow()>
for(${complexTypeReference.name} element : ${arrayField.name}) {
- boolean last = ++i >= ${arrayField.name}.length;
+ boolean last = ++i >= ${arrayField.name}.size();
lengthInBits += element.getLengthInBitsConditional(last);
}
<#else>
diff --git a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java
index d4c7c44..6f43499 100644
--- a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java
+++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java
@@ -39,7 +39,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.Duration;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicInteger;
@@ -49,8 +51,8 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
private static final Logger logger = LoggerFactory.getLogger(AbEthProtocolLogic.class);
public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000);
- private static final short[] emptySenderContext = new short[] {(short) 0x00 ,(short) 0x00 ,(short) 0x00,
- (short) 0x00,(short) 0x00,(short) 0x00, (short) 0x00,(short) 0x00};
+ private static final List<Short> emptySenderContext = Arrays.asList((short) 0x00 ,(short) 0x00 ,(short) 0x00,
+ (short) 0x00,(short) 0x00,(short) 0x00, (short) 0x00,(short) 0x00);
private AbEthConfiguration configuration;
@@ -153,9 +155,9 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
case INTEGER: // output as single bytes
if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
- short[] data = df1PTLR.getData();
- if(data.length == 1) {
- plcValue = new PlcINT(data[0]);
+ List<Short> data = df1PTLR.getData();
+ if(data.size() == 1) {
+ plcValue = new PlcINT(data.get(0));
} else {
plcValue = IEC61131ValueHandler.of(data);
}
@@ -164,33 +166,33 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
case WORD:
if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
- short[] data = df1PTLR.getData();
- if (((data[1]>> 7) & 1) == 0) {
- plcValue = IEC61131ValueHandler.of((data[1] << 8) + data[0]); // positive number
+ List<Short> data = df1PTLR.getData();
+ if (((data.get(1)>> 7) & 1) == 0) {
+ plcValue = IEC61131ValueHandler.of((data.get(1) << 8) + data.get(0)); // positive number
} else {
- plcValue = IEC61131ValueHandler.of((((~data[1] & 0b01111111) << 8) + (~(data[0]-1) & 0b11111111)) * -1); // negative number
+ plcValue = IEC61131ValueHandler.of((((~data.get(1) & 0b01111111) << 8) + (~(data.get(0)-1) & 0b11111111)) * -1); // negative number
}
}
break;
case DWORD:
if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
- short[] data = df1PTLR.getData();
- if (((data[3]>> 7) & 1) == 0) {
- plcValue = IEC61131ValueHandler.of((data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0]); // positive number
+ List<Short> data = df1PTLR.getData();
+ if (((data.get(3)>> 7) & 1) == 0) {
+ plcValue = IEC61131ValueHandler.of((data.get(3) << 24) + (data.get(2) << 16) + (data.get(1) << 8) + data.get(0)); // positive number
} else {
- plcValue = IEC61131ValueHandler.of((((~data[3] & 0b01111111) << 24) + ((~(data[2]-1) & 0b11111111) << 16)+ ((~(data[1]-1) & 0b11111111) << 8) + (~(data[0]-1) & 0b11111111)) * -1); // negative number
+ plcValue = IEC61131ValueHandler.of((((~data.get(3) & 0b01111111) << 24) + ((~(data.get(2)-1) & 0b11111111) << 16)+ ((~(data.get(1)-1) & 0b11111111) << 8) + (~(data.get(0)-1) & 0b11111111)) * -1); // negative number
}
}
break;
case SINGLEBIT:
if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
- short[] data = df1PTLR.getData();
+ List<Short> data = df1PTLR.getData();
if (field.getBitNumber() < 8) {
- plcValue = IEC61131ValueHandler.of((data[0] & (1 << field.getBitNumber())) != 0); // read from first byte
+ plcValue = IEC61131ValueHandler.of((data.get(0) & (1 << field.getBitNumber())) != 0); // read from first byte
} else {
- plcValue = IEC61131ValueHandler.of((data[1] & (1 << (field.getBitNumber() - 8) )) != 0); // read from second byte
+ plcValue = IEC61131ValueHandler.of((data.get(1) & (1 << (field.getBitNumber() - 8) )) != 0); // read from second byte
}
}
break;
diff --git a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
index e7705cd..3541035 100644
--- a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
+++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
@@ -39,9 +39,7 @@ import org.apache.plc4x.java.spi.values.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
@Deprecated
@@ -50,8 +48,8 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
private static final Logger logger = LoggerFactory.getLogger(Plc4xAbEthProtocol.class);
private static final AtomicInteger transactionCounterGenerator = new AtomicInteger(10);
- private static final short[] emptySenderContext = new short[] {(short) 0x00 ,(short) 0x00 ,(short) 0x00,
- (short) 0x00,(short) 0x00,(short) 0x00, (short) 0x00,(short) 0x00};
+ private static final List<Short> emptySenderContext = Arrays.asList((short) 0x00 ,(short) 0x00 ,(short) 0x00,
+ (short) 0x00,(short) 0x00,(short) 0x00, (short) 0x00,(short) 0x00);
private long sessionHandle;
private Map<Integer, PlcRequestContainer> requests;
@@ -176,9 +174,9 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
case INTEGER: // output as single bytes
if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
- short[] data = df1PTLR.getData();
- if(data.length == 1) {
- plcValue = new PlcINT(data[0]);
+ List<Short> data = df1PTLR.getData();
+ if(data.size() == 1) {
+ plcValue = new PlcINT(data.get(0));
} else {
plcValue = IEC61131ValueHandler.of(data);
}
@@ -187,33 +185,33 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
case WORD:
if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
- short[] data = df1PTLR.getData();
- if (((data[1]>> 7) & 1) == 0) {
- plcValue = IEC61131ValueHandler.of((data[1] << 8) + data[0]); // positive number
+ List<Short> data = df1PTLR.getData();
+ if (((data.get(1)>> 7) & 1) == 0) {
+ plcValue = IEC61131ValueHandler.of((data.get(1) << 8) + data.get(0)); // positive number
} else {
- plcValue = IEC61131ValueHandler.of((((~data[1] & 0b01111111) << 8) + (~(data[0]-1) & 0b11111111)) * -1); // negative number
+ plcValue = IEC61131ValueHandler.of((((~data.get(1) & 0b01111111) << 8) + (~(data.get(0)-1) & 0b11111111)) * -1); // negative number
}
}
break;
case DWORD:
if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
- short[] data = df1PTLR.getData();
- if (((data[3]>> 7) & 1) == 0) {
- plcValue = IEC61131ValueHandler.of((data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0]); // positive number
+ List<Short> data = df1PTLR.getData();
+ if (((data.get(3)>> 7) & 1) == 0) {
+ plcValue = IEC61131ValueHandler.of((data.get(3) << 24) + (data.get(2) << 16) + (data.get(1) << 8) + data.get(0)); // positive number
} else {
- plcValue = IEC61131ValueHandler.of((((~data[3] & 0b01111111) << 24) + ((~(data[2]-1) & 0b11111111) << 16)+ ((~(data[1]-1) & 0b11111111) << 8) + (~(data[0]-1) & 0b11111111)) * -1); // negative number
+ plcValue = IEC61131ValueHandler.of((((~data.get(3) & 0b01111111) << 24) + ((~(data.get(2)-1) & 0b11111111) << 16)+ ((~(data.get(1)-1) & 0b11111111) << 8) + (~(data.get(0)-1) & 0b11111111)) * -1); // negative number
}
}
break;
case SINGLEBIT:
if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
- short[] data = df1PTLR.getData();
+ List<Short> data = df1PTLR.getData();
if (field.getBitNumber() < 8) {
- plcValue = IEC61131ValueHandler.of((data[0] & (1 << field.getBitNumber())) != 0); // read from first byte
+ plcValue = IEC61131ValueHandler.of((data.get(0) & (1 << field.getBitNumber())) != 0); // read from first byte
} else {
- plcValue = IEC61131ValueHandler.of((data[1] & (1 << (field.getBitNumber() - 8) )) != 0); // read from second byte
+ plcValue = IEC61131ValueHandler.of((data.get(1) & (1 << (field.getBitNumber() - 8) )) != 0); // read from second byte
}
}
break;
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
index cb0a6b8..55f8490 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
@@ -48,10 +48,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.Duration;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
@@ -240,7 +237,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
directAdsFields.stream().map(directAdsField -> new AdsMultiRequestItemRead(
directAdsField.getIndexGroup(), directAdsField.getIndexOffset(),
(directAdsField.getAdsDataType().getNumBytes() * directAdsField.getNumberOfElements())))
- .toArray(AdsMultiRequestItem[]::new), null);
+ .collect(Collectors.toList()), null);
AmsPacket amsPacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
@@ -503,7 +500,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
directAdsFields.stream().map(directAdsField -> new AdsMultiRequestItemWrite(
directAdsField.getIndexGroup(), directAdsField.getIndexOffset(),
((long) directAdsField.getAdsDataType().getNumBytes() * directAdsField.getNumberOfElements())))
- .toArray(AdsMultiRequestItem[]::new), writeBuffer);
+ .collect(Collectors.toList()), writeBuffer);
AmsPacket amsPacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
@@ -690,7 +687,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
symbolicAdsFields.size(), expectedResponseDataSize, symbolicAdsFields.stream().map(symbolicAdsField ->
new AdsMultiRequestItemReadWrite(ReservedIndexGroups.ADSIGRP_SYM_HNDBYNAME.getValue(), 0,
4, symbolicAdsField.getSymbolicAddress().length())
- ).toArray(AdsMultiRequestItem[]::new), addressData);
+ ).collect(Collectors.toList()), addressData);
AmsPacket amsPacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
CommandId.ADS_READ_WRITE, DEFAULT_COMMAND_STATE, 0, getInvokeId(), adsData);
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java
index 251d305..d245103 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java
@@ -49,7 +49,7 @@ public class FieldReaderArray<T> implements FieldReader<T> {
int itemCount = Math.max(0, (int) count);
List<T> result = new ArrayList<>(itemCount);
for (int curItem = 0; curItem < itemCount; curItem++) {
- result.set(curItem, dataReader.read("", readerArgs));
+ result.add(dataReader.read("", readerArgs));
}
dataReader.closeContext(logicalName, readerArgs);
return result;
@@ -59,8 +59,9 @@ public class FieldReaderArray<T> implements FieldReader<T> {
// Ensure we have the render as list argument present
readerArgs = ArrayUtils.add(readerArgs, WithReaderWriterArgs.WithRenderAsList(true));
dataReader.pullContext(logicalName, readerArgs);
- List<T> result = new LinkedList<>();
- while (dataReader.getPos() < length) {
+ int startPos = dataReader.getPos();
+ List<T> result = new ArrayList<>();
+ while (dataReader.getPos() < startPos + length) {
result.add(dataReader.read("", readerArgs));
}
dataReader.closeContext(logicalName, readerArgs);
@@ -71,7 +72,7 @@ public class FieldReaderArray<T> implements FieldReader<T> {
// Ensure we have the render as list argument present
readerArgs = ArrayUtils.add(readerArgs, WithReaderWriterArgs.WithRenderAsList(true));
dataReader.pullContext(logicalName, readerArgs);
- List<T> result = new LinkedList<>();
+ List<T> result = new ArrayList<>();
while (!termination.get()) {
result.add(dataReader.read("", readerArgs));
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java
index c08d465..f1c58bc 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java
@@ -111,7 +111,8 @@ public class ReadBufferXmlBased implements ReadBuffer, BufferCommons {
hexString = hexString.substring(2);
byte[] bytes = new byte[numberOfBytes];
for (int i = 0; i < hexString.length(); i = i + 2) {
- bytes[i / 2] = Byte.parseByte(hexString.substring(i, i + 2), 16);
+ // Without this hack, we can't parse values such as "0x80" into a byte.
+ bytes[i / 2] = (byte) Short.parseShort(hexString.substring(i, i + 2), 16);
}
return bytes;
}
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec b/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
index d8a6f15..1542275 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
@@ -24,9 +24,9 @@
[discriminatedType 'AdsDiscovery' byteOrder='"BIG_ENDIAN"'
[const uint 32 'header' '0x03661471L']
[reserved uint 32 '0x00000000L']
- [enum Operation 'operation']
+ [simple Operation 'operation']
[reserved uint 16 '0x0000']
- [enum Direction 'direction']
+ [simple Direction 'direction']
[typeSwitch 'operation', 'direction'
['DISCOVERY', 'REQUEST' DiscoveryRequest
[simple AmsNetId 'amsNetId']
@@ -63,7 +63,7 @@
[reserved uint 16 '0x1027']
[reserved uint 16 '0x0100']
[reserved uint 32 '0x00000100']
- [enum RouteStatus 'status']
+ [simple RouteStatus 'status']
[reserved uint 24 '0x000000']
]
]
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads.mspec b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
index c4eb99c..4b8221a 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@ -206,7 +206,7 @@
// Build 2 bytes Build number
[simple uint 16 'version']
// Name 16 bytes Name of ADS device
- [array int 8 'device' count '16']
+ [array byte 'device' count '16']
]
['ADS_READ', 'false' AdsReadRequest
@@ -223,7 +223,7 @@
// 4 bytes Length of data which are supplied back.
[implicit uint 32 'length' 'COUNT(data)']
// n bytes Data which are supplied back.
- [array int 8 'data' count 'length']
+ [array byte 'data' count 'length']
]
['ADS_WRITE', 'false' AdsWriteRequest
@@ -234,7 +234,7 @@
// 4 bytes Length of the data (in bytes) which should be written.
[implicit uint 32 'length' 'COUNT(data)']
// n bytes Data which are written in the ADS device.
- [array int 8 'data' count 'length']
+ [array byte 'data' count 'length']
]
['ADS_WRITE', 'true' AdsWriteResponse
// 4 bytes ADS error number
@@ -259,7 +259,7 @@
// 4 bytes Length of data in byte.
[implicit uint 32 'length' 'COUNT(data)']
// n bytes Additional data which are sent to the ADS device
- [array int 8 'data' count 'length']
+ [array byte 'data' count 'length']
]
['ADS_WRITE_CONTROL', 'true' AdsWriteControlResponse
// 4 bytes ADS error number
@@ -321,7 +321,7 @@
// Only if the indexGroup implies a sum-read response, will the indexOffset indicate the number of elements. (ADSIGRP_MULTIPLE_READ, ADSIGRP_MULTIPLE_WRITE, ADSIGRP_MULTIPLE_READ_WRITE)
[array AdsMultiRequestItem('indexGroup') 'items' count '((indexGroup == 61568) || (indexGroup == 61569) || (indexGroup == 61570)) ? indexOffset : 0']
// n bytes Data which are written in the ADS device.
- [array int 8 'data' count 'writeLength - (COUNT(items) * 12)']
+ [array byte 'data' count 'writeLength - (COUNT(items) * 12)']
]
['ADS_READ_WRITE', 'true' AdsReadWriteResponse
// 4 bytes ADS error number
@@ -329,7 +329,7 @@
// 4 bytes Length of data in byte.
[implicit uint 32 'length' 'COUNT(data)']
// n bytes Additional data which are sent to the ADS device
- [array int 8 'data' count 'length']
+ [array byte 'data' count 'length']
]
]
]
@@ -383,7 +383,7 @@
// 4 Bytes Size of data range in bytes.
[simple uint 32 'sampleSize']
// n Bytes Data
- [array int 8 'data' count 'sampleSize']
+ [array byte 'data' count 'sampleSize']
]
[dataIo 'DataItem' (vstring 'dataFormatName', int 32 'stringLength')
diff --git a/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml b/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
index bb509cb..77443ba 100644
--- a/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
+++ b/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
@@ -178,9 +178,7 @@
<ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">1</length>
- <data isList="true">
- <value dataType="int" bitLength="8">1</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
</AdsReadResponse>
</AdsData>
</data>
@@ -308,8 +306,7 @@
</AdsMultiRequestItemRead>
</AdsMultiRequestItem>
</items>
- <data isList="true">
- </data>
+ <data dataType="byte" bitLength="0">0x</data>
</AdsReadWriteRequest>
</AdsData>
</data>
@@ -373,18 +370,7 @@
<ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">10</length>
- <data isList="true">
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">1</value>
- <value dataType="int" bitLength="8">1</value>
- </data>
+ <data dataType="byte" bitLength="80">0x00000000000000000101</data>
</AdsReadWriteResponse>
</AdsData>
</data>
@@ -509,34 +495,7 @@
<writeLength dataType="uint" bitLength="32">26</writeLength>
<items isList="true">
</items>
- <data isList="true">
- <value dataType="int" bitLength="8">109</value>
- <value dataType="int" bitLength="8">97</value>
- <value dataType="int" bitLength="8">105</value>
- <value dataType="int" bitLength="8">110</value>
- <value dataType="int" bitLength="8">46</value>
- <value dataType="int" bitLength="8">102</value>
- <value dataType="int" bitLength="8">95</value>
- <value dataType="int" bitLength="8">116</value>
- <value dataType="int" bitLength="8">114</value>
- <value dataType="int" bitLength="8">105</value>
- <value dataType="int" bitLength="8">103</value>
- <value dataType="int" bitLength="8">68</value>
- <value dataType="int" bitLength="8">97</value>
- <value dataType="int" bitLength="8">116</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">105</value>
- <value dataType="int" bitLength="8">71</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">108</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">115</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">110</value>
- <value dataType="int" bitLength="8">46</value>
- <value dataType="int" bitLength="8">77</value>
- <value dataType="int" bitLength="8">0</value>
- </data>
+ <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
</AdsReadWriteRequest>
</AdsData>
</data>
@@ -599,12 +558,7 @@
<ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">4</length>
- <data isList="true">
- <value dataType="int" bitLength="8">1</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">-128</value>
- <value dataType="int" bitLength="8">27</value>
- </data>
+ <data dataType="byte" bitLength="32">0x0100801b</data>
</AdsReadWriteResponse>
</AdsData>
</data>
@@ -728,18 +682,7 @@
<ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">10</length>
- <data isList="true">
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">1</value>
- <value dataType="int" bitLength="8">1</value>
- </data>
+ <data dataType="byte" bitLength="80">0x00000000000000000101</data>
</AdsReadResponse>
</AdsData>
</data>
@@ -848,34 +791,7 @@
<writeLength dataType="uint" bitLength="32">26</writeLength>
<items isList="true">
</items>
- <data isList="true">
- <value dataType="int" bitLength="8">109</value>
- <value dataType="int" bitLength="8">97</value>
- <value dataType="int" bitLength="8">105</value>
- <value dataType="int" bitLength="8">110</value>
- <value dataType="int" bitLength="8">46</value>
- <value dataType="int" bitLength="8">102</value>
- <value dataType="int" bitLength="8">95</value>
- <value dataType="int" bitLength="8">116</value>
- <value dataType="int" bitLength="8">114</value>
- <value dataType="int" bitLength="8">105</value>
- <value dataType="int" bitLength="8">103</value>
- <value dataType="int" bitLength="8">68</value>
- <value dataType="int" bitLength="8">97</value>
- <value dataType="int" bitLength="8">116</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">105</value>
- <value dataType="int" bitLength="8">71</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">108</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">115</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">110</value>
- <value dataType="int" bitLength="8">46</value>
- <value dataType="int" bitLength="8">77</value>
- <value dataType="int" bitLength="8">0</value>
- </data>
+ <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
</AdsReadWriteRequest>
</AdsData>
</data>
@@ -938,12 +854,7 @@
<ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">4</length>
- <data isList="true">
- <value dataType="int" bitLength="8">1</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">-128</value>
- <value dataType="int" bitLength="8">27</value>
- </data>
+ <data dataType="byte" bitLength="32">0x0100801b</data>
</AdsReadWriteResponse>
</AdsData>
</data>
@@ -1068,18 +979,7 @@
<ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">10</length>
- <data isList="true">
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">1</value>
- <value dataType="int" bitLength="8">1</value>
- </data>
+ <data dataType="byte" bitLength="80">0x00000000000000000101</data>
</AdsReadResponse>
</AdsData>
</data>
@@ -1238,18 +1138,7 @@
<ReturnCode dataType="uint" bitLength="32">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">10</length>
- <data isList="true">
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">1</value>
- <value dataType="int" bitLength="8">1</value>
- </data>
+ <data dataType="byte" bitLength="80">0x00000000000000000101</data>
</AdsReadResponse>
</AdsData>
</data>
diff --git a/protocols/ads/src/test/resources/protocols/ads/ParserSerializerTestsuite.xml b/protocols/ads/src/test/resources/protocols/ads/ParserSerializerTestsuite.xml
index 8f6e507..3e38fcc 100644
--- a/protocols/ads/src/test/resources/protocols/ads/ParserSerializerTestsuite.xml
+++ b/protocols/ads/src/test/resources/protocols/ads/ParserSerializerTestsuite.xml
@@ -151,9 +151,7 @@
<ReturnCode dataType="uint" bitLength="32" stringRepresentation="OK">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">1</length>
- <data isList="true">
- <value dataType="int" bitLength="8">1</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
</AdsReadResponse>
</AdsData>
</data>
@@ -224,34 +222,7 @@
<writeLength dataType="uint" bitLength="32">26</writeLength>
<items isList="true">
</items>
- <data isList="true">
- <value dataType="int" bitLength="8">109</value>
- <value dataType="int" bitLength="8">97</value>
- <value dataType="int" bitLength="8">105</value>
- <value dataType="int" bitLength="8">110</value>
- <value dataType="int" bitLength="8">46</value>
- <value dataType="int" bitLength="8">102</value>
- <value dataType="int" bitLength="8">95</value>
- <value dataType="int" bitLength="8">116</value>
- <value dataType="int" bitLength="8">114</value>
- <value dataType="int" bitLength="8">105</value>
- <value dataType="int" bitLength="8">103</value>
- <value dataType="int" bitLength="8">68</value>
- <value dataType="int" bitLength="8">97</value>
- <value dataType="int" bitLength="8">116</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">105</value>
- <value dataType="int" bitLength="8">71</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">108</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">115</value>
- <value dataType="int" bitLength="8">101</value>
- <value dataType="int" bitLength="8">110</value>
- <value dataType="int" bitLength="8">46</value>
- <value dataType="int" bitLength="8">77</value>
- <value dataType="int" bitLength="8">0</value>
- </data>
+ <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
</AdsReadWriteRequest>
</AdsData>
</data>
@@ -320,12 +291,7 @@
<ReturnCode dataType="uint" bitLength="32" stringRepresentation="OK">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">4</length>
- <data isList="true">
- <value dataType="int" bitLength="8">1</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">-128</value>
- <value dataType="int" bitLength="8">27</value>
- </data>
+ <data dataType="byte" bitLength="32">0x0100801b</data>
</AdsReadWriteResponse>
</AdsData>
</data>
@@ -461,9 +427,7 @@
<ReturnCode dataType="uint" bitLength="32" stringRepresentation="OK">0</ReturnCode>
</result>
<length dataType="uint" bitLength="32">1</length>
- <data isList="true">
- <value dataType="int" bitLength="8">1</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
</AdsReadResponse>
</AdsData>
</data>
@@ -531,12 +495,7 @@
<indexGroup dataType="uint" bitLength="32">61446</indexGroup>
<indexOffset dataType="uint" bitLength="32">0</indexOffset>
<length dataType="uint" bitLength="32">4</length>
- <data isList="true">
- <value dataType="int" bitLength="8">1</value>
- <value dataType="int" bitLength="8">0</value>
- <value dataType="int" bitLength="8">-128</value>
- <value dataType="int" bitLength="8">27</value>
- </data>
+ <data dataType="byte" bitLength="32">0x0100801b</data>
</AdsWriteRequest>
</AdsData>
</data>