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 2021/05/05 14:46:30 UTC
[plc4x] 01/02: plc4go: added byte array support to readers and
writers
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 002bcb34dcb6b0742a1fd8b44d24a005c9ca2bc0
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed May 5 10:48:57 2021 +0200
plc4go: added byte array support to readers and writers
---
.../resources/templates/go/model-template.go.ftlh | 62 ++++++++++---
.../testing/protocols/s7/DriverTestsuite.xml | 73 +--------------
.../protocols/s7/ParserSerializerTestsuite.xml | 101 +++------------------
...COTPParameterDisconnectAdditionalInformation.go | 36 ++------
.../s7/readwrite/model/S7VarPayloadDataItem.go | 36 ++------
.../plc4go/s7/readwrite/model/SzlDataTreeItem.go | 36 ++------
plc4go/internal/plc4go/s7/s7Io_test.go | 91 ++++++++-----------
plc4go/internal/plc4go/spi/utils/ReadBuffer.go | 1 +
.../plc4go/spi/utils/ReadBufferByteBased.go | 13 +++
.../plc4go/spi/utils/ReadBufferJsonBased.go | 85 +++++++++++------
.../plc4go/spi/utils/ReadBufferXmlBased.go | 54 +++++++----
plc4go/internal/plc4go/spi/utils/WriteBuffer.go | 1 +
.../plc4go/spi/utils/WriteBufferBoxBased.go | 9 ++
.../plc4go/spi/utils/WriteBufferByteBased.go | 10 ++
.../plc4go/spi/utils/WriteBufferJsonBased.go | 32 ++++---
.../plc4go/spi/utils/WriteBufferXmlBased.go | 32 ++++---
16 files changed, 290 insertions(+), 382 deletions(-)
diff --git a/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh b/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
index 2e7ddbc..a483dea 100644
--- a/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
@@ -546,17 +546,40 @@ func ${type.name}Parse(io utils.ReadBuffer<#if type.parserArguments?has_content>
<#switch field.typeName>
<#case "array">
<#assign arrayField = field>
+ <#if helper.isSimpleTypeReference(arrayField.type) && helper.getLanguageTypeNameForTypeReference(arrayField.type) == "byte">
+ // Byte Array field (${arrayField.name})
+ <#assign numberOfBytesExpression>
+ <#compress>
+ <#if helper.isCountArrayField(field)>
+ numberOfBytes := int(${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
+ <#elseif helper.isLengthArrayField(field)>
+ numberOfBytes := int(${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
+ <#elseif helper.isTerminatedArrayField(field)>
+ <#-- TODO: we need to find out to implement this-->
+ numberOfBytes := int(${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
+ <#else>
+ <#-- TODO: we should throw a exception here-->
+ numberOfBytes := int(-1)
+ </#if>
+ </#compress>
+ </#assign>
+ ${numberOfBytesExpression}
+ ${arrayField.name}, _readArrayErr := io.ReadByteArray("${arrayField.name}", numberOfBytes)
+ if _readArrayErr != nil {
+ return nil, errors.Wrap(_readArrayErr, "Error parsing '${arrayField.name}' field")<@emitImport import="github.com/pkg/errors" />
+ }
+ <#else>
// Array field (${arrayField.name})
if pullErr := io.PullContext("${arrayField.name}", utils.WithRenderAsList(true)); pullErr != nil {
return nil, pullErr
}
<#-- Only update curPos if the length expression uses it -->
- <#if arrayField.loopExpression.contains("curPos")>
+ <#if arrayField.loopExpression.contains("curPos")>
curPos = io.GetPos() - startPos<@emitImport import="io" />
- </#if>
+ </#if>
<#-- If this is a count array, we can directly initialize an array with the given size -->
- <#if helper.isCountArrayField(field)>
+ <#if helper.isCountArrayField(field)>
// Count array
${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
for curItem := uint16(0); curItem < uint16(${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)}); curItem++ {
@@ -570,7 +593,7 @@ func ${type.name}Parse(io utils.ReadBuffer<#if type.parserArguments?has_content>
${arrayField.name}[curItem] = _item
}
<#-- In all other cases do we have to work with a list, that is later converted to an array -->
- <#elseif helper.isLengthArrayField(field)>
+ <#elseif helper.isLengthArrayField(field)>
<#-- For a length array, we read data till the read position of the buffer reaches a given position -->
// Length array
${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, 0)
@@ -583,12 +606,12 @@ func ${type.name}Parse(io utils.ReadBuffer<#if type.parserArguments?has_content>
}
${arrayField.name} = append(${arrayField.name}, _item)
<#-- After parsing, update the current position, but only if it's needed -->
- <#if arrayField.loopExpression.contains("curPos")>
+ <#if arrayField.loopExpression.contains("curPos")>
curPos = io.GetPos() - startPos<@emitImport import="io" />
- </#if>
+ </#if>
}
<#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
- <#elseif helper.isTerminatedArrayField(field)>
+ <#elseif helper.isTerminatedArrayField(field)>
// Terminated array
${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, 0)
for ;!bool(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}); {
@@ -599,14 +622,15 @@ func ${type.name}Parse(io utils.ReadBuffer<#if type.parserArguments?has_content>
${arrayField.name} = append(${arrayField.name}, _item)
<#-- After parsing, update the current position, but only if it's needed -->
- <#if arrayField.loopExpression.contains("curPos")>
+ <#if arrayField.loopExpression.contains("curPos")>
curPos = io.GetPos() - startPos<@emitImport import="io" />
- </#if>
+ </#if>
}
- </#if>
+ </#if>
if closeErr := io.CloseContext("${arrayField.name}", utils.WithRenderAsList(true)); closeErr != nil {
return nil, closeErr
}
+ </#if>
<#break>
<#case "checksum">
<#assign checksumField = field>
@@ -948,18 +972,25 @@ func (m *${type.name}) Serialize(io utils.WriteBuffer<#if helper.getSerializerAr
// Array Field (${arrayField.name})
if m.${arrayField.name?cap_first} != nil {
+ <#if helper.isSimpleTypeReference(arrayField.type) && helper.getLanguageTypeNameForTypeReference(arrayField.type) == "byte">
+ // Byte Array field (${arrayField.name})
+ _writeArrayErr := io.WriteByteArray("${arrayField.name}", m.${arrayField.name?cap_first})
+ if _writeArrayErr != nil {
+ return errors.Wrap(_writeArrayErr, "Error serializing '${arrayField.name}' field")<@emitImport import="github.com/pkg/errors" />
+ }
+ <#else>
if pushErr := io.PushContext("${arrayField.name}", utils.WithRenderAsList(true)); pushErr != nil {
return pushErr
}
- <#if helper.isComplexTypeReference(arrayField.type) && (helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true))>
+ <#if helper.isComplexTypeReference(arrayField.type) && (helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true))>
itemCount := uint16(len(m.${arrayField.name?cap_first}))
var curItem uint16 = 0
</#if>
for _, _element := range m.${arrayField.name?cap_first} {
- <#if helper.isSimpleTypeReference(arrayField.type)>
- <#assign simpleTypeReference = arrayField.type>
+ <#if helper.isSimpleTypeReference(arrayField.type)>
+ <#assign simpleTypeReference = arrayField.type>
_elementErr := ${helper.getWriteBufferWriteMethodCall("", simpleTypeReference, "_element", field)}
- <#else>
+ <#else>
<#assign complexTypeReference = arrayField.type>
<#if helper.needsVariable(arrayField, "lastItem", true)>
var lastItem bool = curItem == (itemCount - 1)
@@ -969,13 +1000,14 @@ func (m *${type.name}) Serialize(io utils.WriteBuffer<#if helper.getSerializerAr
if _elementErr != nil {
return errors.Wrap(_elementErr, "Error serializing '${arrayField.name}' field")<@emitImport import="github.com/pkg/errors" />
}
- <#if helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true)>
+ <#if helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true)>
curItem++
</#if>
}
if popErr := io.PopContext("${arrayField.name}", utils.WithRenderAsList(true)); popErr != nil {
return popErr
}
+ </#if>
}
<#break>
<#case "checksum">
diff --git a/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml b/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml
index 5ef9e67..9758ca9 100644
--- a/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml
@@ -363,84 +363,21 @@
<items isList="true">
<SzlDataTreeItem>
<itemIndex dataType="uint" bitLength="16">1</itemIndex>
- <mlfb isList="true">
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- </mlfb>
+ <mlfb dataType="byte" bitLength="160">0x36455337203231322d31424433302d3058423020</mlfb>
<moduleTypeId dataType="uint" bitLength="16">8224</moduleTypeId>
<ausbg dataType="uint" bitLength="16">1</ausbg>
<ausbe dataType="uint" bitLength="16">8224</ausbe>
</SzlDataTreeItem>
<SzlDataTreeItem>
<itemIndex dataType="uint" bitLength="16">6</itemIndex>
- <mlfb isList="true">
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- </mlfb>
+ <mlfb dataType="byte" bitLength="160">0x36455337203231322d31424433302d3058423020</mlfb>
<moduleTypeId dataType="uint" bitLength="16">8224</moduleTypeId>
<ausbg dataType="uint" bitLength="16">1</ausbg>
<ausbe dataType="uint" bitLength="16">8224</ausbe>
</SzlDataTreeItem>
<SzlDataTreeItem>
<itemIndex dataType="uint" bitLength="16">7</itemIndex>
- <mlfb isList="true">
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x36</value>
- </mlfb>
+ <mlfb dataType="byte" bitLength="160">0x36455337203231322d31424433302d3058423020</mlfb>
<moduleTypeId dataType="uint" bitLength="16">8224</moduleTypeId>
<ausbg dataType="uint" bitLength="16">22018</ausbg>
<ausbe dataType="uint" bitLength="16">2</ausbe>
@@ -580,9 +517,7 @@
</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true">
</padding>
</S7VarPayloadDataItem>
diff --git a/plc4go/assets/testing/protocols/s7/ParserSerializerTestsuite.xml b/plc4go/assets/testing/protocols/s7/ParserSerializerTestsuite.xml
index f224d32..6464736 100644
--- a/plc4go/assets/testing/protocols/s7/ParserSerializerTestsuite.xml
+++ b/plc4go/assets/testing/protocols/s7/ParserSerializerTestsuite.xml
@@ -384,84 +384,21 @@
<items isList="true">
<SzlDataTreeItem>
<itemIndex dataType="uint" bitLength="16">1</itemIndex>
- <mlfb isList="true">
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x45</value>
- <value dataType="byte" bitLength="8">0x53</value>
- <value dataType="byte" bitLength="8">0x37</value>
- <value dataType="byte" bitLength="8">0x20</value>
- <value dataType="byte" bitLength="8">0x32</value>
- <value dataType="byte" bitLength="8">0x31</value>
- <value dataType="byte" bitLength="8">0x32</value>
- <value dataType="byte" bitLength="8">0x2d</value>
- <value dataType="byte" bitLength="8">0x31</value>
- <value dataType="byte" bitLength="8">0x42</value>
- <value dataType="byte" bitLength="8">0x44</value>
- <value dataType="byte" bitLength="8">0x33</value>
- <value dataType="byte" bitLength="8">0x30</value>
- <value dataType="byte" bitLength="8">0x2d</value>
- <value dataType="byte" bitLength="8">0x30</value>
- <value dataType="byte" bitLength="8">0x58</value>
- <value dataType="byte" bitLength="8">0x42</value>
- <value dataType="byte" bitLength="8">0x30</value>
- <value dataType="byte" bitLength="8">0x20</value>
- </mlfb>
+ <mlfb dataType="byte" bitLength="160">0x36455337203231322d31424433302d3058423020</mlfb>
<moduleTypeId dataType="uint" bitLength="16">8224</moduleTypeId>
<ausbg dataType="uint" bitLength="16">1</ausbg>
<ausbe dataType="uint" bitLength="16">8224</ausbe>
</SzlDataTreeItem>
<SzlDataTreeItem>
<itemIndex dataType="uint" bitLength="16">6</itemIndex>
- <mlfb isList="true">
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x45</value>
- <value dataType="byte" bitLength="8">0x53</value>
- <value dataType="byte" bitLength="8">0x37</value>
- <value dataType="byte" bitLength="8">0x20</value>
- <value dataType="byte" bitLength="8">0x32</value>
- <value dataType="byte" bitLength="8">0x31</value>
- <value dataType="byte" bitLength="8">0x32</value>
- <value dataType="byte" bitLength="8">0x2d</value>
- <value dataType="byte" bitLength="8">0x31</value>
- <value dataType="byte" bitLength="8">0x42</value>
- <value dataType="byte" bitLength="8">0x44</value>
- <value dataType="byte" bitLength="8">0x33</value>
- <value dataType="byte" bitLength="8">0x30</value>
- <value dataType="byte" bitLength="8">0x2d</value>
- <value dataType="byte" bitLength="8">0x30</value>
- <value dataType="byte" bitLength="8">0x58</value>
- <value dataType="byte" bitLength="8">0x42</value>
- <value dataType="byte" bitLength="8">0x30</value>
- <value dataType="byte" bitLength="8">0x20</value>
- </mlfb>
+ <mlfb dataType="byte" bitLength="160">0x36455337203231322d31424433302d3058423020</mlfb>
<moduleTypeId dataType="uint" bitLength="16">8224</moduleTypeId>
<ausbg dataType="uint" bitLength="16">1</ausbg>
<ausbe dataType="uint" bitLength="16">8224</ausbe>
</SzlDataTreeItem>
<SzlDataTreeItem>
<itemIndex dataType="uint" bitLength="16">7</itemIndex>
- <mlfb isList="true">
- <value dataType="byte" bitLength="8">0x36</value>
- <value dataType="byte" bitLength="8">0x45</value>
- <value dataType="byte" bitLength="8">0x53</value>
- <value dataType="byte" bitLength="8">0x37</value>
- <value dataType="byte" bitLength="8">0x20</value>
- <value dataType="byte" bitLength="8">0x32</value>
- <value dataType="byte" bitLength="8">0x31</value>
- <value dataType="byte" bitLength="8">0x32</value>
- <value dataType="byte" bitLength="8">0x2d</value>
- <value dataType="byte" bitLength="8">0x31</value>
- <value dataType="byte" bitLength="8">0x42</value>
- <value dataType="byte" bitLength="8">0x44</value>
- <value dataType="byte" bitLength="8">0x33</value>
- <value dataType="byte" bitLength="8">0x30</value>
- <value dataType="byte" bitLength="8">0x2d</value>
- <value dataType="byte" bitLength="8">0x30</value>
- <value dataType="byte" bitLength="8">0x58</value>
- <value dataType="byte" bitLength="8">0x42</value>
- <value dataType="byte" bitLength="8">0x30</value>
- <value dataType="byte" bitLength="8">0x20</value>
- </mlfb>
+ <mlfb dataType="byte" bitLength="160">0x36455337203231322d31424433302d3058423020</mlfb>
<moduleTypeId dataType="uint" bitLength="16">8224</moduleTypeId>
<ausbg dataType="uint" bitLength="16">22018</ausbg>
<ausbe dataType="uint" bitLength="16">2</ausbe>
@@ -677,9 +614,7 @@
</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true">
<value dataType="uint" bitLength="8">0</value>
</padding>
@@ -694,9 +629,7 @@
</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true">
<value dataType="uint" bitLength="8">0</value>
</padding>
@@ -711,9 +644,7 @@
</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true">
<value dataType="uint" bitLength="8">0</value>
</padding>
@@ -728,9 +659,7 @@
</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true">
</padding>
</S7VarPayloadDataItem>
@@ -936,9 +865,7 @@
</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true">
<value dataType="uint" bitLength="8">0</value>
</padding>
@@ -953,9 +880,7 @@
</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true">
<value dataType="uint" bitLength="8">0</value>
</padding>
@@ -970,9 +895,7 @@
</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true">
<value dataType="uint" bitLength="8">0</value>
</padding>
@@ -987,9 +910,7 @@
</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true">
</padding>
</S7VarPayloadDataItem>
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go b/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
index 2103911..d3d95a8 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
@@ -108,22 +108,11 @@ func COTPParameterDisconnectAdditionalInformationParse(io utils.ReadBuffer, rest
if pullErr := io.PullContext("COTPParameterDisconnectAdditionalInformation"); pullErr != nil {
return nil, pullErr
}
-
- // Array field (data)
- if pullErr := io.PullContext("data", utils.WithRenderAsList(true)); pullErr != nil {
- return nil, pullErr
- }
- // Count array
- data := make([]byte, rest)
- for curItem := uint16(0); curItem < uint16(rest); curItem++ {
- _item, _err := io.ReadByte("")
- if _err != nil {
- return nil, errors.Wrap(_err, "Error parsing 'data' field")
- }
- data[curItem] = _item
- }
- if closeErr := io.CloseContext("data", utils.WithRenderAsList(true)); closeErr != nil {
- return nil, closeErr
+ // Byte Array field (data)
+ numberOfBytes := int(rest)
+ data, _readArrayErr := io.ReadByteArray("data", numberOfBytes)
+ if _readArrayErr != nil {
+ return nil, errors.Wrap(_readArrayErr, "Error parsing 'data' field")
}
if closeErr := io.CloseContext("COTPParameterDisconnectAdditionalInformation"); closeErr != nil {
@@ -147,17 +136,10 @@ func (m *COTPParameterDisconnectAdditionalInformation) Serialize(io utils.WriteB
// Array Field (data)
if m.Data != nil {
- if pushErr := io.PushContext("data", utils.WithRenderAsList(true)); pushErr != nil {
- return pushErr
- }
- for _, _element := range m.Data {
- _elementErr := io.WriteByte("", _element)
- if _elementErr != nil {
- return errors.Wrap(_elementErr, "Error serializing 'data' field")
- }
- }
- if popErr := io.PopContext("data", utils.WithRenderAsList(true)); popErr != nil {
- return popErr
+ // Byte Array field (data)
+ _writeArrayErr := io.WriteByteArray("data", m.Data)
+ if _writeArrayErr != nil {
+ return errors.Wrap(_writeArrayErr, "Error serializing 'data' field")
}
}
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go b/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go
index 3fd8a19..50b1a28 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go
@@ -135,22 +135,11 @@ func S7VarPayloadDataItemParse(io utils.ReadBuffer, lastItem bool) (*S7VarPayloa
if _dataLengthErr != nil {
return nil, errors.Wrap(_dataLengthErr, "Error parsing 'dataLength' field")
}
-
- // Array field (data)
- if pullErr := io.PullContext("data", utils.WithRenderAsList(true)); pullErr != nil {
- return nil, pullErr
- }
- // Count array
- data := make([]byte, utils.InlineIf(transportSize.SizeInBits(), func() uint16 { return uint16(math.Ceil(float64(dataLength) / float64(float64(8.0)))) }, func() uint16 { return uint16(dataLength) }))
- for curItem := uint16(0); curItem < uint16(utils.InlineIf(transportSize.SizeInBits(), func() uint16 { return uint16(math.Ceil(float64(dataLength) / float64(float64(8.0)))) }, func() uint16 { return uint16(dataLength) })); curItem++ {
- _item, _err := io.ReadByte("")
- if _err != nil {
- return nil, errors.Wrap(_err, "Error parsing 'data' field")
- }
- data[curItem] = _item
- }
- if closeErr := io.CloseContext("data", utils.WithRenderAsList(true)); closeErr != nil {
- return nil, closeErr
+ // Byte Array field (data)
+ numberOfBytes := int(utils.InlineIf(transportSize.SizeInBits(), func() uint16 { return uint16(math.Ceil(float64(dataLength) / float64(float64(8.0)))) }, func() uint16 { return uint16(dataLength) }))
+ data, _readArrayErr := io.ReadByteArray("data", numberOfBytes)
+ if _readArrayErr != nil {
+ return nil, errors.Wrap(_readArrayErr, "Error parsing 'data' field")
}
// Padding Field (padding)
@@ -221,17 +210,10 @@ func (m *S7VarPayloadDataItem) Serialize(io utils.WriteBuffer, lastItem bool) er
// Array Field (data)
if m.Data != nil {
- if pushErr := io.PushContext("data", utils.WithRenderAsList(true)); pushErr != nil {
- return pushErr
- }
- for _, _element := range m.Data {
- _elementErr := io.WriteByte("", _element)
- if _elementErr != nil {
- return errors.Wrap(_elementErr, "Error serializing 'data' field")
- }
- }
- if popErr := io.PopContext("data", utils.WithRenderAsList(true)); popErr != nil {
- return popErr
+ // Byte Array field (data)
+ _writeArrayErr := io.WriteByteArray("data", m.Data)
+ if _writeArrayErr != nil {
+ return errors.Wrap(_writeArrayErr, "Error serializing 'data' field")
}
}
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go b/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go
index 08e0013..f035f9a 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go
@@ -108,22 +108,11 @@ func SzlDataTreeItemParse(io utils.ReadBuffer) (*SzlDataTreeItem, error) {
if _itemIndexErr != nil {
return nil, errors.Wrap(_itemIndexErr, "Error parsing 'itemIndex' field")
}
-
- // Array field (mlfb)
- if pullErr := io.PullContext("mlfb", utils.WithRenderAsList(true)); pullErr != nil {
- return nil, pullErr
- }
- // Count array
- mlfb := make([]byte, uint16(20))
- for curItem := uint16(0); curItem < uint16(uint16(20)); curItem++ {
- _item, _err := io.ReadByte("")
- if _err != nil {
- return nil, errors.Wrap(_err, "Error parsing 'mlfb' field")
- }
- mlfb[curItem] = _item
- }
- if closeErr := io.CloseContext("mlfb", utils.WithRenderAsList(true)); closeErr != nil {
- return nil, closeErr
+ // Byte Array field (mlfb)
+ numberOfBytes := int(uint16(20))
+ mlfb, _readArrayErr := io.ReadByteArray("mlfb", numberOfBytes)
+ if _readArrayErr != nil {
+ return nil, errors.Wrap(_readArrayErr, "Error parsing 'mlfb' field")
}
// Simple Field (moduleTypeId)
@@ -166,17 +155,10 @@ func (m *SzlDataTreeItem) Serialize(io utils.WriteBuffer) error {
// Array Field (mlfb)
if m.Mlfb != nil {
- if pushErr := io.PushContext("mlfb", utils.WithRenderAsList(true)); pushErr != nil {
- return pushErr
- }
- for _, _element := range m.Mlfb {
- _elementErr := io.WriteByte("", _element)
- if _elementErr != nil {
- return errors.Wrap(_elementErr, "Error serializing 'mlfb' field")
- }
- }
- if popErr := io.PopContext("mlfb", utils.WithRenderAsList(true)); popErr != nil {
- return popErr
+ // Byte Array field (mlfb)
+ _writeArrayErr := io.WriteByteArray("mlfb", m.Mlfb)
+ if _writeArrayErr != nil {
+ return errors.Wrap(_writeArrayErr, "Error serializing 'mlfb' field")
}
}
diff --git a/plc4go/internal/plc4go/s7/s7Io_test.go b/plc4go/internal/plc4go/s7/s7Io_test.go
index 9e5258c..6f1fe81 100644
--- a/plc4go/internal/plc4go/s7/s7Io_test.go
+++ b/plc4go/internal/plc4go/s7/s7Io_test.go
@@ -139,19 +139,22 @@ func TestS7MessageBytes(t *testing.T) {
║║║║╚═════════════════════════╝║ ║ ╚═════════╝ ║║ ║ ║║║
║║║║ ║ ╚═══════════════════════════╝║ ║ ║║║
║║║║ ╚═════════════════════════════════════════════╝ ║ ║║║
-║║║║╔═S7Payload════════════════════════════════════════════════════════════════════════════╗║ ║║║
-║║║║║╔═S7PayloadReadVarResponse═══════════════════════════════════════════════════════════╗║║ ║║║
-║║║║║║╔═items════════════════════════════════════════════════════════════════════════════╗║║║ ║║║
-║║║║║║║╔═S7VarPayloadDataItem═══════════════════════════════════════════════════════════╗║║║║ ║║║
-║║║║║║║║╔═returnCode══════════════╗╔═transportSize══════╗╔═dataLength╗╔═data═╗╔═padding╗║║║║║ ║║║
-║║║║║║║║║╔═DataTransportErrorCode╗║║╔═DataTransportSize╗║║ 0x0001 1 ║║╔════╗║║ ║║║║║║ ║║║
-║║║║║║║║║║ 0xff 255 OK ║║║║ 0x03 3 BIT ║║╚═══════════╝║║0x01║║╚════════╝║║║║║ ║║║
-║║║║║║║║║╚═══════════════════════╝║║╚══════════════════╝║ ║╚════╝║ ║║║║║ ║║║
-║║║║║║║║╚═════════════════════════╝╚════════════════════╝ ╚══════╝ ║║║║║ ║║║
-║║║║║║║╚════════════════════════════════════════════════════════════════════════════════╝║║║║ ║║║
-║║║║║║╚══════════════════════════════════════════════════════════════════════════════════╝║║║ ║║║
-║║║║║╚════════════════════════════════════════════════════════════════════════════════════╝║║ ║║║
-║║║║╚══════════════════════════════════════════════════════════════════════════════════════╝║ ║║║
+║║║║╔═S7Payload══════════════════════════════════════════════════════════╗ ║ ║║║
+║║║║║╔═S7PayloadReadVarResponse═════════════════════════════════════════╗║ ║ ║║║
+║║║║║║╔═items══════════════════════════════════════════════════════════╗║║ ║ ║║║
+║║║║║║║╔═S7VarPayloadDataItem═════════════════════════════════════════╗║║║ ║ ║║║
+║║║║║║║║╔═returnCode══════════════╗╔═transportSize══════╗╔═dataLength╗║║║║ ║ ║║║
+║║║║║║║║║╔═DataTransportErrorCode╗║║╔═DataTransportSize╗║║ 0x0001 1 ║║║║║ ║ ║║║
+║║║║║║║║║║ 0xff 255 OK ║║║║ 0x03 3 BIT ║║╚═══════════╝║║║║ ║ ║║║
+║║║║║║║║║╚═══════════════════════╝║║╚══════════════════╝║ ║║║║ ║ ║║║
+║║║║║║║║╚═════════════════════════╝╚════════════════════╝ ║║║║ ║ ║║║
+║║║║║║║║╔═data═══════════════════════════════════════╗╔═padding╗ ║║║║ ║ ║║║
+║║║║║║║║║0|01 '. '║║ ║ ║║║║ ║ ║║║
+║║║║║║║║╚════════════════════════════════════════════╝╚════════╝ ║║║║ ║ ║║║
+║║║║║║║╚══════════════════════════════════════════════════════════════╝║║║ ║ ║║║
+║║║║║║╚════════════════════════════════════════════════════════════════╝║║ ║ ║║║
+║║║║║╚══════════════════════════════════════════════════════════════════╝║ ║ ║║║
+║║║║╚════════════════════════════════════════════════════════════════════╝ ║ ║║║
║║║╚════════════════════════════════════════════════════════════════════════════════════════╝ ║║║
║║╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════╝║║
║╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝║
@@ -186,9 +189,9 @@ func TestS7MessageBytes(t *testing.T) {
║║║║╔═returnCode/DataTransportErrorCode════════════╗╔═transportSize/DataTransportSize════════╗╔═dataLength╗║║║║
║║║║║ 0xff 255 OK ║║ 0x03 3 BIT ║║ 0x0001 1 ║║║║║
║║║║╚══════════════════════════════════════════════╝╚════════════════════════════════════════╝╚═══════════╝║║║║
-║║║║╔═data/╗ ║║║║
-║║║║║ 0x01 ║ ║║║║
-║║║║╚══════╝ ║║║║
+║║║║╔═data═══════════════════════════════════════╗ ║║║║
+║║║║║0|01 '. '║ ║║║║
+║║║║╚════════════════════════════════════════════╝ ║║║║
║║║╚═══════════════════════════════════════════════════════════════════════════════════════════════════════╝║║║
║║╚═════════════════════════════════════════════════════════════════════════════════════════════════════════╝║║
║╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════╝║
@@ -246,9 +249,7 @@ func TestS7MessageBytes(t *testing.T) {
<DataTransportSize dataType="uint" bitLength="8" stringRepresentation="BIT">3</DataTransportSize>
</transportSize>
<dataLength dataType="uint" bitLength="16">1</dataLength>
- <data isList="true">
- <value dataType="byte" bitLength="8">0x01</value>
- </data>
+ <data dataType="byte" bitLength="8">0x01</data>
<padding isList="true"></padding>
</S7VarPayloadDataItem>
</items>
@@ -299,16 +300,12 @@ func TestS7MessageBytes(t *testing.T) {
"items": [
{
"S7VarPayloadDataItem": {
- "data": [
- {
- "value": "0x01",
- "value__plc4x_bitLength": 8,
- "value__plc4x_dataType": "byte"
- }
- ],
+ "data": "0x01",
"dataLength": 1,
"dataLength__plc4x_bitLength": 16,
"dataLength__plc4x_dataType": "uint",
+ "data__plc4x_bitLength": 8,
+ "data__plc4x_dataType": "byte",
"padding": [],
"returnCode": {
"DataTransportErrorCode": 255,
@@ -392,15 +389,13 @@ func TestS7MessageBytes(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- {
- // Simple 2 String
+ t.Run("Simple 2 String", func(t *testing.T) {
tt.wantString = strings.Trim(tt.wantString, "\n")
if got := tt.args.debuggable.String(); got != tt.wantString {
t.Errorf("String() = '\n%v\n', want '\n%v\n'", got, tt.wantString)
}
- }
- {
- // Simple 2 Box
+ })
+ t.Run("Simple 2 Box", func(t *testing.T) {
boxWriter := utils.NewBoxedWriteBuffer()
if err := tt.args.debuggable.Serialize(boxWriter); err != nil {
t.Error(err)
@@ -409,20 +404,18 @@ func TestS7MessageBytes(t *testing.T) {
if got := string(boxWriter.GetBox()); got != tt.wantStringSerialized {
t.Errorf("Serialize Boxed() = '\n%v\n', want '\n%v\n'", got, tt.wantStringSerialized)
}
- }
- {
- // Simple 2 Compact Box
+ })
+ t.Run("Simple 2 Compact Box", func(t *testing.T) {
boxWriter := utils.NewBoxedWriteBufferWithOptions(true, true)
if err := tt.args.debuggable.Serialize(boxWriter); err != nil {
t.Error(err)
}
tt.wantStringSerializedCompact = strings.Trim(tt.wantStringSerializedCompact, "\n")
if got := string(boxWriter.GetBox()); got != tt.wantStringSerializedCompact {
- t.Errorf("Serialize Boxed() = '\n%v\n', want '\n%v\n'", got, tt.wantStringSerializedCompact)
+ t.Errorf("Serialize BoxedCompact() = '\n%v\n', want '\n%v\n'", got, tt.wantStringSerializedCompact)
}
- }
- {
- // Simple 2 Xml
+ })
+ t.Run("Simple 2 Xml", func(t *testing.T) {
xmlWriteBuffer := utils.NewXmlWriteBuffer()
if err := tt.args.debuggable.Serialize(xmlWriteBuffer); err != nil {
t.Error(err)
@@ -431,9 +424,8 @@ func TestS7MessageBytes(t *testing.T) {
if got := xmlWriteBuffer.GetXmlString(); got != tt.wantStringXml {
t.Errorf("Serialize Xml() = '\n%v\n', want '\n%v\n'", got, tt.wantStringXml)
}
- }
- {
- // Simple 2 Json
+ })
+ t.Run("Simple 2 Json", func(t *testing.T) {
jsonWriteBuffer := utils.NewJsonWriteBuffer()
if err := tt.args.debuggable.Serialize(jsonWriteBuffer); err != nil {
t.Error(err)
@@ -446,9 +438,8 @@ func TestS7MessageBytes(t *testing.T) {
t.Errorf("Serialize Json() = '\n%v\n', want '\n%v\n'", got, tt.wantStringJson)
}
}
- }
- {
- // Simple Binary Serialize
+ })
+ t.Run("Simple Binary Serialize", func(t *testing.T) {
buffer := utils.NewWriteBuffer()
if err := tt.args.debuggable.Serialize(buffer); err != nil {
t.Error(err)
@@ -457,9 +448,8 @@ func TestS7MessageBytes(t *testing.T) {
if got := utils.Dump(buffer.GetBytes()); !reflect.DeepEqual(got, tt.wantDump) {
t.Errorf("Serialize() = '\n%v\n', want '\n%v\n'", got, tt.wantDump)
}
- }
- {
- // and at least a for xml roundtip
+ })
+ t.Run("xml roundtip", func(t *testing.T) {
reader := strings.NewReader(tt.wantStringXml)
readBuffer := utils.NewXmlReadBuffer(reader)
if got, err := model.TPKTPacketParse(readBuffer); err != nil || !reflect.DeepEqual(got, tt.args.debuggable) {
@@ -469,9 +459,8 @@ func TestS7MessageBytes(t *testing.T) {
t.Errorf("Roundtrip(xml) = '\n%v\n', want '\n%v\n'", got, tt.wantDump)
}
}
- }
- {
- // and at least a for json roundtip
+ })
+ t.Run("json roundtip", func(t *testing.T) {
reader := strings.NewReader(tt.wantStringJson)
readBuffer := utils.NewJsonReadBuffer(reader)
if got, err := model.TPKTPacketParse(readBuffer); err != nil || !reflect.DeepEqual(got, tt.args.debuggable) {
@@ -481,7 +470,7 @@ func TestS7MessageBytes(t *testing.T) {
t.Errorf("Roundtrip(json) = '\n%v\n', want '\n%v\n'", got, tt.wantDump)
}
}
- }
+ })
})
}
}
diff --git a/plc4go/internal/plc4go/spi/utils/ReadBuffer.go b/plc4go/internal/plc4go/spi/utils/ReadBuffer.go
index 75ba278..6c629af 100644
--- a/plc4go/internal/plc4go/spi/utils/ReadBuffer.go
+++ b/plc4go/internal/plc4go/spi/utils/ReadBuffer.go
@@ -32,6 +32,7 @@ type ReadBuffer interface {
PullContext(logicalName string, readerArgs ...WithReaderArgs) error
ReadBit(logicalName string, readerArgs ...WithReaderArgs) (bool, error)
ReadByte(logicalName string, readerArgs ...WithReaderArgs) (byte, error)
+ ReadByteArray(logicalName string, numberOfBytes int, readerArgs ...WithReaderArgs) ([]byte, error)
ReadUint8(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (uint8, error)
ReadUint16(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (uint16, error)
ReadUint32(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (uint32, error)
diff --git a/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go b/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go
index 8f91997..ffb06b5 100644
--- a/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go
+++ b/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go
@@ -116,6 +116,19 @@ func (rb *byteReadBuffer) ReadByte(_ string, _ ...WithReaderArgs) (byte, error)
return rb.reader.ReadByte()
}
+func (rb *byteReadBuffer) ReadByteArray(_ string, numberOfBytes int, _ ...WithReaderArgs) ([]byte, error) {
+ byteArray := make([]byte, numberOfBytes)
+ for i := 0; i < numberOfBytes; i++ {
+ rb.pos += 8
+ readByte, err := rb.reader.ReadByte()
+ if err != nil {
+ return nil, err
+ }
+ byteArray[i] = readByte
+ }
+ return byteArray, nil
+}
+
func (rb *byteReadBuffer) ReadUint8(_ string, bitLength uint8, _ ...WithReaderArgs) (uint8, error) {
rb.pos += uint64(bitLength)
res := uint8(rb.reader.TryReadBits(bitLength))
diff --git a/plc4go/internal/plc4go/spi/utils/ReadBufferJsonBased.go b/plc4go/internal/plc4go/spi/utils/ReadBufferJsonBased.go
index 7e7fc42..de30093 100644
--- a/plc4go/internal/plc4go/spi/utils/ReadBufferJsonBased.go
+++ b/plc4go/internal/plc4go/spi/utils/ReadBufferJsonBased.go
@@ -167,14 +167,40 @@ func (j *jsonReadBuffer) ReadByte(logicalName string, readerArgs ...WithReaderAr
}
}
+func (j *jsonReadBuffer) ReadByteArray(logicalName string, numberOfBytes int, readerArgs ...WithReaderArgs) ([]byte, error) {
+ if j.err != nil {
+ return nil, j.err
+ }
+ logicalName = j.sanitizeLogicalName(logicalName)
+ j.move(uint(numberOfBytes / 8))
+ peek, element := j.getElement(logicalName)
+ if err := j.validateAttr(logicalName, element, "byte", uint(numberOfBytes*8), readerArgs...); err != nil {
+ return nil, err
+ }
+ if value, ok := element[logicalName]; ok {
+ hexString := value.(string)
+ if !strings.HasPrefix(hexString, "0x") {
+ return nil, errors.Errorf("Hex string should start with 0x. Actual value %s", hexString)
+ }
+ hexString = strings.Replace(hexString, "0x", "", 1)
+ decoded, err := hex.DecodeString(hexString)
+ if err != nil {
+ return nil, err
+ }
+ return decoded, nil
+ } else {
+ return nil, errors.Errorf("Required element %s not found in %v", logicalName, peek)
+ }
+}
+
func (j *jsonReadBuffer) ReadUint8(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (uint8, error) {
if j.err != nil {
return 0, j.err
}
logicalName = j.sanitizeLogicalName(logicalName)
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "uint", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "uint", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -189,9 +215,9 @@ func (j *jsonReadBuffer) ReadUint16(logicalName string, bitLength uint8, readerA
return 0, j.err
}
logicalName = j.sanitizeLogicalName(logicalName)
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "uint", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "uint", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -206,9 +232,9 @@ func (j *jsonReadBuffer) ReadUint32(logicalName string, bitLength uint8, readerA
return 0, j.err
}
logicalName = j.sanitizeLogicalName(logicalName)
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "uint", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "uint", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -223,9 +249,9 @@ func (j *jsonReadBuffer) ReadUint64(logicalName string, bitLength uint8, readerA
return 0, j.err
}
logicalName = j.sanitizeLogicalName(logicalName)
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "uint", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "uint", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -240,9 +266,9 @@ func (j *jsonReadBuffer) ReadInt8(logicalName string, bitLength uint8, readerArg
return 0, j.err
}
logicalName = j.sanitizeLogicalName(logicalName)
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "int", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "int", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -257,9 +283,9 @@ func (j *jsonReadBuffer) ReadInt16(logicalName string, bitLength uint8, readerAr
return 0, j.err
}
logicalName = j.sanitizeLogicalName(logicalName)
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "int", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "int", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -274,9 +300,9 @@ func (j *jsonReadBuffer) ReadInt32(logicalName string, bitLength uint8, readerAr
return 0, j.err
}
logicalName = j.sanitizeLogicalName(logicalName)
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "int", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "int", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -291,9 +317,9 @@ func (j *jsonReadBuffer) ReadInt64(logicalName string, bitLength uint8, readerAr
return 0, j.err
}
logicalName = j.sanitizeLogicalName(logicalName)
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "int", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "int", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -311,7 +337,7 @@ func (j *jsonReadBuffer) ReadBigInt(logicalName string, bitLength uint64, reader
logicalName = j.sanitizeLogicalName(logicalName)
peek, element := j.getElement(logicalName)
// TODO: not enough bits
- if err := j.validateAttr(logicalName, element, "int", uint8(bitLength), readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "int", uint(bitLength), readerArgs...); err != nil {
return nil, err
}
newInt := big.NewInt(0)
@@ -332,9 +358,9 @@ func (j *jsonReadBuffer) ReadFloat32(logicalName string, signed bool, exponentBi
if signed {
bitLength += 1
}
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "float", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "float", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -353,9 +379,9 @@ func (j *jsonReadBuffer) ReadFloat64(logicalName string, signed bool, exponentBi
if signed {
bitLength += 1
}
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "float", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "float", uint(bitLength), readerArgs...); err != nil {
return 0, err
}
if value, ok := element[logicalName]; ok {
@@ -374,9 +400,9 @@ func (j *jsonReadBuffer) ReadBigFloat(logicalName string, signed bool, exponentB
if signed {
bitLength += 1
}
- j.move(bitLength)
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "float", bitLength, readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "float", uint(bitLength), readerArgs...); err != nil {
return nil, err
}
newFloat := big.NewFloat(0)
@@ -393,10 +419,9 @@ func (j *jsonReadBuffer) ReadString(logicalName string, bitLength uint32, reader
return "", j.err
}
logicalName = j.sanitizeLogicalName(logicalName)
- // TODO: not enough bits
- j.move(uint8(bitLength))
+ j.move(uint(bitLength))
peek, element := j.getElement(logicalName)
- if err := j.validateAttr(logicalName, element, "string", uint8(bitLength), readerArgs...); err != nil {
+ if err := j.validateAttr(logicalName, element, "string", uint(bitLength), readerArgs...); err != nil {
return "", err
}
if value, ok := element[logicalName]; ok {
@@ -454,11 +479,11 @@ func (j *jsonReadBuffer) getElement(logicalName string) (interface{}, map[string
return peek, element
}
-func (j *jsonReadBuffer) move(bits uint8) {
- j.pos += uint(bits)
+func (j *jsonReadBuffer) move(bits uint) {
+ j.pos += bits
}
-func (j *jsonReadBuffer) validateAttr(logicalName string, element map[string]interface{}, dataType string, bitLength uint8, readerArgs ...WithReaderArgs) error {
+func (j *jsonReadBuffer) validateAttr(logicalName string, element map[string]interface{}, dataType string, bitLength uint, readerArgs ...WithReaderArgs) error {
if !j.doValidateAttr {
return nil
}
@@ -467,7 +492,7 @@ func (j *jsonReadBuffer) validateAttr(logicalName string, element map[string]int
return errors.Errorf("Unexpected %s :%s. Want %s", renderedKeyDataLengthKey, value, dataType)
}
renderedBitLengthKey := fmt.Sprintf("%s__plc4x_%s", logicalName, rwBitLengthKey)
- if value, ok := element[renderedBitLengthKey]; !ok || uint8(value.(float64)) != bitLength {
+ if value, ok := element[renderedBitLengthKey]; !ok || uint(value.(float64)) != bitLength {
return errors.Errorf("Unexpected %s :%d. Want %d", renderedBitLengthKey, value, bitLength)
}
return nil
diff --git a/plc4go/internal/plc4go/spi/utils/ReadBufferXmlBased.go b/plc4go/internal/plc4go/spi/utils/ReadBufferXmlBased.go
index 22df848..2662d58 100644
--- a/plc4go/internal/plc4go/spi/utils/ReadBufferXmlBased.go
+++ b/plc4go/internal/plc4go/spi/utils/ReadBufferXmlBased.go
@@ -104,7 +104,7 @@ func (x *xmlReadBuffer) ReadBit(logicalName string, readerArgs ...WithReaderArgs
func (x *xmlReadBuffer) ReadByte(logicalName string, readerArgs ...WithReaderArgs) (byte, error) {
var value string
- err := x.decode(logicalName, rwBitKey, 1, readerArgs, &value)
+ err := x.decode(logicalName, rwByteKey, 8, readerArgs, &value)
if err != nil {
return 0, err
}
@@ -121,9 +121,28 @@ func (x *xmlReadBuffer) ReadByte(logicalName string, readerArgs ...WithReaderArg
return decoded[0], nil
}
+func (x *xmlReadBuffer) ReadByteArray(logicalName string, numberOfBytes int, readerArgs ...WithReaderArgs) ([]byte, error) {
+ var value string
+ err := x.decode(logicalName, rwByteKey, uint(numberOfBytes/8), readerArgs, &value)
+ if err != nil {
+ return nil, err
+ }
+ hexString := value
+ if !strings.HasPrefix(hexString, "0x") {
+ return nil, errors.Errorf("Hex string should start with 0x. Actual value %s", hexString)
+ }
+ hexString = strings.Replace(hexString, "0x", "", 1)
+ decoded, err := hex.DecodeString(hexString)
+ if err != nil {
+ return nil, err
+ }
+ x.move(uint8(numberOfBytes / 8))
+ return decoded, nil
+}
+
func (x *xmlReadBuffer) ReadUint8(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (uint8, error) {
var value uint8
- err := x.decode(logicalName, rwUintKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwUintKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -133,7 +152,7 @@ func (x *xmlReadBuffer) ReadUint8(logicalName string, bitLength uint8, readerArg
func (x *xmlReadBuffer) ReadUint16(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (uint16, error) {
var value uint16
- err := x.decode(logicalName, rwUintKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwUintKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -143,7 +162,7 @@ func (x *xmlReadBuffer) ReadUint16(logicalName string, bitLength uint8, readerAr
func (x *xmlReadBuffer) ReadUint32(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (uint32, error) {
var value uint32
- err := x.decode(logicalName, rwUintKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwUintKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -153,7 +172,7 @@ func (x *xmlReadBuffer) ReadUint32(logicalName string, bitLength uint8, readerAr
func (x *xmlReadBuffer) ReadUint64(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (uint64, error) {
var value uint64
- err := x.decode(logicalName, rwUintKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwUintKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -163,7 +182,7 @@ func (x *xmlReadBuffer) ReadUint64(logicalName string, bitLength uint8, readerAr
func (x *xmlReadBuffer) ReadInt8(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (int8, error) {
var value int8
- err := x.decode(logicalName, rwIntKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwIntKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -173,7 +192,7 @@ func (x *xmlReadBuffer) ReadInt8(logicalName string, bitLength uint8, readerArgs
func (x *xmlReadBuffer) ReadInt16(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (int16, error) {
var value int16
- err := x.decode(logicalName, rwIntKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwIntKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -183,7 +202,7 @@ func (x *xmlReadBuffer) ReadInt16(logicalName string, bitLength uint8, readerArg
func (x *xmlReadBuffer) ReadInt32(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (int32, error) {
var value int32
- err := x.decode(logicalName, rwIntKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwIntKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -193,7 +212,7 @@ func (x *xmlReadBuffer) ReadInt32(logicalName string, bitLength uint8, readerArg
func (x *xmlReadBuffer) ReadInt64(logicalName string, bitLength uint8, readerArgs ...WithReaderArgs) (int64, error) {
var value int64
- err := x.decode(logicalName, rwIntKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwIntKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -203,8 +222,7 @@ func (x *xmlReadBuffer) ReadInt64(logicalName string, bitLength uint8, readerArg
func (x *xmlReadBuffer) ReadBigInt(logicalName string, bitLength uint64, readerArgs ...WithReaderArgs) (*big.Int, error) {
var value big.Int
- // TODO: bitLength is too short for a big int
- err := x.decode(logicalName, rwIntKey, uint8(bitLength), readerArgs, &value)
+ err := x.decode(logicalName, rwIntKey, uint(bitLength), readerArgs, &value)
if err != nil {
return nil, err
}
@@ -218,7 +236,7 @@ func (x *xmlReadBuffer) ReadFloat32(logicalName string, signed bool, exponentBit
bitLength += 1
}
var value float32
- err := x.decode(logicalName, rwFloatKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwFloatKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -232,7 +250,7 @@ func (x *xmlReadBuffer) ReadFloat64(logicalName string, signed bool, exponentBit
bitLength += 1
}
var value float64
- err := x.decode(logicalName, rwFloatKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwFloatKey, uint(bitLength), readerArgs, &value)
if err != nil {
return 0, err
}
@@ -246,7 +264,7 @@ func (x *xmlReadBuffer) ReadBigFloat(logicalName string, signed bool, exponentBi
bitLength += 1
}
var value big.Float
- err := x.decode(logicalName, rwFloatKey, bitLength, readerArgs, &value)
+ err := x.decode(logicalName, rwFloatKey, uint(bitLength), readerArgs, &value)
if err != nil {
return nil, err
}
@@ -257,7 +275,7 @@ func (x *xmlReadBuffer) ReadBigFloat(logicalName string, signed bool, exponentBi
func (x *xmlReadBuffer) ReadString(logicalName string, bitLength uint32, readerArgs ...WithReaderArgs) (string, error) {
var value string
// TODO: bitlength too short
- err := x.decode(logicalName, rwStringKey, uint8(bitLength), readerArgs, &value)
+ err := x.decode(logicalName, rwStringKey, uint(bitLength), readerArgs, &value)
if err != nil {
return "", err
}
@@ -314,7 +332,7 @@ findTheEndToken:
return endElement, nil
}
-func (x *xmlReadBuffer) decode(logicalName string, dataType string, bitLength uint8, readerArgs []WithReaderArgs, targetValue interface{}) error {
+func (x *xmlReadBuffer) decode(logicalName string, dataType string, bitLength uint, readerArgs []WithReaderArgs, targetValue interface{}) error {
startElement, err := x.travelToNextStartElement()
if err != nil {
return err
@@ -347,7 +365,7 @@ func (x *xmlReadBuffer) validateIfList(readerArgs []WithReaderArgs, startElement
return nil
}
-func (x *xmlReadBuffer) validateStartElement(startElement xml.StartElement, logicalName string, dataType string, bitLength uint8, readerArgs ...WithReaderArgs) error {
+func (x *xmlReadBuffer) validateStartElement(startElement xml.StartElement, logicalName string, dataType string, bitLength uint, readerArgs ...WithReaderArgs) error {
logicalName = x.sanitizeLogicalName(logicalName)
if startElement.Name.Local != logicalName {
return errors.Errorf("unexpected start element '%s'. Expected '%s'", startElement.Name.Local, logicalName)
@@ -357,7 +375,7 @@ func (x *xmlReadBuffer) validateStartElement(startElement xml.StartElement, logi
return nil
}
-func (x *xmlReadBuffer) validateAttr(attr []xml.Attr, dataType string, bitLength uint8, readerArgs ...WithReaderArgs) error {
+func (x *xmlReadBuffer) validateAttr(attr []xml.Attr, dataType string, bitLength uint, _ ...WithReaderArgs) error {
if !x.doValidateAttr {
return nil
}
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBuffer.go b/plc4go/internal/plc4go/spi/utils/WriteBuffer.go
index 47e6d9a..97c95a4 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBuffer.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBuffer.go
@@ -28,6 +28,7 @@ type WriteBuffer interface {
PushContext(logicalName string, writerArgs ...WithWriterArgs) error
WriteBit(logicalName string, value bool, writerArgs ...WithWriterArgs) error
WriteByte(logicalName string, value byte, writerArgs ...WithWriterArgs) error
+ WriteByteArray(logicalName string, data []byte, writerArgs ...WithWriterArgs) error
WriteUint8(logicalName string, bitLength uint8, value uint8, writerArgs ...WithWriterArgs) error
WriteUint16(logicalName string, bitLength uint8, value uint16, writerArgs ...WithWriterArgs) error
WriteUint32(logicalName string, bitLength uint8, value uint32, writerArgs ...WithWriterArgs) error
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBufferBoxBased.go b/plc4go/internal/plc4go/spi/utils/WriteBufferBoxBased.go
index 78c0094..18ababe 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBufferBoxBased.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBufferBoxBased.go
@@ -96,6 +96,15 @@ func (b *boxedWriteBuffer) WriteByte(logicalName string, value byte, writerArgs
return nil
}
+func (b *boxedWriteBuffer) WriteByteArray(logicalName string, data []byte, writerArgs ...WithWriterArgs) error {
+ additionalStringRepresentation := b.extractAdditionalStringRepresentation(upcastWriterArgs(writerArgs...)...)
+ if additionalStringRepresentation != "" {
+ additionalStringRepresentation += "\n"
+ }
+ b.PushBack(BoxString(logicalName, fmt.Sprintf("%s%s", additionalStringRepresentation, Dump(data)), 0))
+ return nil
+}
+
func (b *boxedWriteBuffer) WriteUint8(logicalName string, bitLength uint8, value uint8, writerArgs ...WithWriterArgs) error {
additionalStringRepresentation := b.extractAdditionalStringRepresentation(upcastWriterArgs(writerArgs...)...)
b.PushBack(BoxString(logicalName, fmt.Sprintf("%#0*x %d%s", bitLength/4, value, value, additionalStringRepresentation), 0))
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBufferByteBased.go b/plc4go/internal/plc4go/spi/utils/WriteBufferByteBased.go
index 5c47e92..9e56dd2 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBufferByteBased.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBufferByteBased.go
@@ -101,6 +101,16 @@ func (rb *byteWriteBuffer) WriteByte(_ string, value byte, _ ...WithWriterArgs)
return rb.writer.WriteBits(uint64(value), 8)
}
+func (rb *byteWriteBuffer) WriteByteArray(_ string, data []byte, _ ...WithWriterArgs) error {
+ for _, dataElement := range data {
+ err := rb.writer.WriteBits(uint64(dataElement), 8)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
func (rb *byteWriteBuffer) WriteUint8(_ string, bitLength uint8, value uint8, _ ...WithWriterArgs) error {
return rb.writer.WriteBits(uint64(value), bitLength)
}
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBufferJsonBased.go b/plc4go/internal/plc4go/spi/utils/WriteBufferJsonBased.go
index 9c43522..16619ff 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBufferJsonBased.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBufferJsonBased.go
@@ -104,56 +104,60 @@ func (j *jsonWriteBuffer) WriteByte(logicalName string, value byte, writerArgs .
return j.encodeNode(logicalName, fmt.Sprintf("%#02x", value), j.generateAttr(logicalName, rwByteKey, 8, writerArgs...))
}
+func (j *jsonWriteBuffer) WriteByteArray(logicalName string, data []byte, writerArgs ...WithWriterArgs) error {
+ return j.encodeNode(logicalName, fmt.Sprintf("%#x", data), j.generateAttr(logicalName, rwByteKey, uint(len(data)*8), writerArgs...))
+}
+
func (j *jsonWriteBuffer) WriteUint8(logicalName string, bitLength uint8, value uint8, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwUintKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwUintKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteUint16(logicalName string, bitLength uint8, value uint16, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwUintKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwUintKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteUint32(logicalName string, bitLength uint8, value uint32, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwUintKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwUintKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteUint64(logicalName string, bitLength uint8, value uint64, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwUintKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwUintKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteInt8(logicalName string, bitLength uint8, value int8, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteInt16(logicalName string, bitLength uint8, value int16, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteInt32(logicalName string, bitLength uint8, value int32, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteInt64(logicalName string, bitLength uint8, value int64, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteBigInt(logicalName string, bitLength uint8, value *big.Int, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwIntKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteFloat32(logicalName string, bitLength uint8, value float32, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwFloatKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwFloatKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteFloat64(logicalName string, bitLength uint8, value float64, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwFloatKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwFloatKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteBigFloat(logicalName string, bitLength uint8, value *big.Float, writerArgs ...WithWriterArgs) error {
- return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwFloatKey, bitLength, writerArgs...))
+ return j.encodeNode(logicalName, value, j.generateAttr(logicalName, rwFloatKey, uint(bitLength), writerArgs...))
}
func (j *jsonWriteBuffer) WriteString(logicalName string, bitLength uint8, encoding string, value string, writerArgs ...WithWriterArgs) error {
- attr := j.generateAttr(logicalName, rwStringKey, bitLength, writerArgs...)
+ attr := j.generateAttr(logicalName, rwStringKey, uint(bitLength), writerArgs...)
attr[fmt.Sprintf("%s__plc4x_%s", logicalName, rwEncodingKey)] = encoding
return j.encodeNode(logicalName, value, attr)
}
@@ -235,7 +239,7 @@ func (j *jsonWriteBuffer) encodeNode(logicalName string, value interface{}, attr
}
}
-func (j *jsonWriteBuffer) generateAttr(logicalName string, dataType string, bitLength uint8, writerArgs ...WithWriterArgs) map[string]interface{} {
+func (j *jsonWriteBuffer) generateAttr(logicalName string, dataType string, bitLength uint, writerArgs ...WithWriterArgs) map[string]interface{} {
attr := make(map[string]interface{})
if !j.doRenderAttr {
return attr
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go b/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go
index 5ffeb46..df27b3a 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go
@@ -95,56 +95,60 @@ func (x *xmlWriteBuffer) WriteByte(logicalName string, value byte, writerArgs ..
return x.encodeElement(logicalName, fmt.Sprintf("%#02x", value), x.generateAttr(rwByteKey, 8, writerArgs...), writerArgs...)
}
+func (x *xmlWriteBuffer) WriteByteArray(logicalName string, data []byte, writerArgs ...WithWriterArgs) error {
+ return x.encodeElement(logicalName, fmt.Sprintf("%#02x", data), x.generateAttr(rwByteKey, uint(len(data)*8), writerArgs...), writerArgs...)
+}
+
func (x *xmlWriteBuffer) WriteUint8(logicalName string, bitLength uint8, value uint8, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwUintKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwUintKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteUint16(logicalName string, bitLength uint8, value uint16, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwUintKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwUintKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteUint32(logicalName string, bitLength uint8, value uint32, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwUintKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwUintKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteUint64(logicalName string, bitLength uint8, value uint64, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwUintKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwUintKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteInt8(logicalName string, bitLength uint8, value int8, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteInt16(logicalName string, bitLength uint8, value int16, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteInt32(logicalName string, bitLength uint8, value int32, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteInt64(logicalName string, bitLength uint8, value int64, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteBigInt(logicalName string, bitLength uint8, value *big.Int, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwIntKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteFloat32(logicalName string, bitLength uint8, value float32, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwFloatKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwFloatKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteFloat64(logicalName string, bitLength uint8, value float64, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwFloatKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwFloatKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteBigFloat(logicalName string, bitLength uint8, value *big.Float, writerArgs ...WithWriterArgs) error {
- return x.encodeElement(logicalName, value, x.generateAttr(rwFloatKey, bitLength, writerArgs...), writerArgs...)
+ return x.encodeElement(logicalName, value, x.generateAttr(rwFloatKey, uint(bitLength), writerArgs...), writerArgs...)
}
func (x *xmlWriteBuffer) WriteString(logicalName string, bitLength uint8, encoding string, value string, writerArgs ...WithWriterArgs) error {
- attr := x.generateAttr(rwStringKey, bitLength, writerArgs...)
+ attr := x.generateAttr(rwStringKey, uint(bitLength), writerArgs...)
attr = append(attr, xml.Attr{Name: xml.Name{Local: rwEncodingKey}, Value: encoding})
return x.encodeElement(logicalName, value, attr, writerArgs...)
}
@@ -167,7 +171,7 @@ func (x *xmlWriteBuffer) encodeElement(logicalName string, value interface{}, at
})
}
-func (x *xmlWriteBuffer) generateAttr(dataType string, bitLength uint8, writerArgs ...WithWriterArgs) []xml.Attr {
+func (x *xmlWriteBuffer) generateAttr(dataType string, bitLength uint, writerArgs ...WithWriterArgs) []xml.Attr {
attrs := make([]xml.Attr, 2)
if !x.doRenderAttr {
return attrs