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/11/30 10:02:15 UTC

[plc4x] branch develop updated (7d41e7c -> aa31014)

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git.


    from 7d41e7c  feat(bacnet): work in BACnetUnconfirmedServiceRequestWhoIs
     new 7006b32  feat(bacnet): implemented I-Have
     new aa31014  fix(bacnet): substract encoding field from length

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../readwrite/model/BACnetCharacterEncoding.go     | 144 ++++++++++++++
 .../bacnetip/readwrite/model/BACnetComplexTag.go   |   2 +-
 .../model/BACnetComplexTagCharacterString.go       |  66 ++++++-
 .../model/BACnetComplexTagObjectIdentifier.go      |  47 ++++-
 .../readwrite/model/BACnetComplexTagOctetString.go |  32 ++--
 .../BACnetConfirmedServiceRequestWriteProperty.go  |   1 -
 .../plc4go/bacnetip/readwrite/model/BACnetTag.go   |  16 +-
 .../model/BACnetTagApplicationBitString.go         |   4 +-
 .../model/BACnetTagApplicationCharacterString.go   |  66 ++++++-
 .../readwrite/model/BACnetTagApplicationDouble.go  |   2 +-
 .../model/BACnetTagApplicationEnumerated.go        |   4 +-
 .../model/BACnetTagApplicationObjectIdentifier.go  |  47 ++++-
 .../model/BACnetTagApplicationOctetString.go       |  32 +++-
 .../readwrite/model/BACnetTagApplicationReal.go    |   2 +-
 .../model/BACnetTagApplicationSignedInteger.go     | 163 ++++++++++++----
 .../model/BACnetTagApplicationUnsignedInteger.go   | 163 ++++++++++++----
 .../model/BACnetUnconfirmedServiceRequestIHave.go  |  99 +++++++++-
 .../model/BACnetUnconfirmedServiceRequestWhoHas.go |   4 -
 .../model/BACnetUnconfirmedServiceRequestWhoIs.go  |   2 -
 .../plc4go/bacnetip/readwrite/model/NPDU.go        |   2 -
 .../knxnetip/readwrite/model/ConnectionResponse.go |   2 -
 .../plc4go/s7/readwrite/model/COTPPacket.go        |   1 -
 .../plc4go/s7/readwrite/model/S7Message.go         |   2 -
 .../resources/protocols/bacnetip/bacnetip.mspec    | 209 +++++++++++++--------
 24 files changed, 889 insertions(+), 223 deletions(-)
 create mode 100644 plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetCharacterEncoding.go

[plc4x] 01/02: feat(bacnet): implemented I-Have

Posted by sr...@apache.org.
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 7006b32d6ac6524abf511d65f4ea5b195a847989
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Nov 30 10:33:46 2021 +0100

    feat(bacnet): implemented I-Have
---
 .../readwrite/model/BACnetCharacterEncoding.go     | 144 ++++++++++++++
 .../bacnetip/readwrite/model/BACnetComplexTag.go   |   2 +-
 .../model/BACnetComplexTagCharacterString.go       |  66 ++++++-
 .../model/BACnetComplexTagObjectIdentifier.go      |  47 ++++-
 .../readwrite/model/BACnetComplexTagOctetString.go |  32 ++--
 .../BACnetConfirmedServiceRequestWriteProperty.go  |   1 -
 .../plc4go/bacnetip/readwrite/model/BACnetTag.go   |  16 +-
 .../model/BACnetTagApplicationBitString.go         |   4 +-
 .../model/BACnetTagApplicationCharacterString.go   |  66 ++++++-
 .../readwrite/model/BACnetTagApplicationDouble.go  |   2 +-
 .../model/BACnetTagApplicationEnumerated.go        |   4 +-
 .../model/BACnetTagApplicationObjectIdentifier.go  |  47 ++++-
 .../model/BACnetTagApplicationOctetString.go       |  32 +++-
 .../readwrite/model/BACnetTagApplicationReal.go    |   2 +-
 .../model/BACnetTagApplicationSignedInteger.go     | 163 ++++++++++++----
 .../model/BACnetTagApplicationUnsignedInteger.go   | 163 ++++++++++++----
 .../model/BACnetUnconfirmedServiceRequestIHave.go  |  99 +++++++++-
 .../model/BACnetUnconfirmedServiceRequestWhoHas.go |   4 -
 .../model/BACnetUnconfirmedServiceRequestWhoIs.go  |   2 -
 .../plc4go/bacnetip/readwrite/model/NPDU.go        |   2 -
 .../knxnetip/readwrite/model/ConnectionResponse.go |   2 -
 .../plc4go/s7/readwrite/model/COTPPacket.go        |   1 -
 .../plc4go/s7/readwrite/model/S7Message.go         |   2 -
 .../resources/protocols/bacnetip/bacnetip.mspec    | 209 +++++++++++++--------
 24 files changed, 889 insertions(+), 223 deletions(-)

diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetCharacterEncoding.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetCharacterEncoding.go
new file mode 100644
index 0000000..2dd4b36
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetCharacterEncoding.go
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+type BACnetCharacterEncoding byte
+
+type IBACnetCharacterEncoding interface {
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+const (
+	BACnetCharacterEncoding_ISO_10646          BACnetCharacterEncoding = 0x0
+	BACnetCharacterEncoding_IBM_Microsoft_DBCS BACnetCharacterEncoding = 0x1
+	BACnetCharacterEncoding_JIS_X_0208         BACnetCharacterEncoding = 0x2
+	BACnetCharacterEncoding_ISO_10646_4        BACnetCharacterEncoding = 0x3
+	BACnetCharacterEncoding_ISO_10646_2        BACnetCharacterEncoding = 0x4
+	BACnetCharacterEncoding_ISO_8859_1         BACnetCharacterEncoding = 0x5
+)
+
+var BACnetCharacterEncodingValues []BACnetCharacterEncoding
+
+func init() {
+	_ = errors.New
+	BACnetCharacterEncodingValues = []BACnetCharacterEncoding{
+		BACnetCharacterEncoding_ISO_10646,
+		BACnetCharacterEncoding_IBM_Microsoft_DBCS,
+		BACnetCharacterEncoding_JIS_X_0208,
+		BACnetCharacterEncoding_ISO_10646_4,
+		BACnetCharacterEncoding_ISO_10646_2,
+		BACnetCharacterEncoding_ISO_8859_1,
+	}
+}
+
+func BACnetCharacterEncodingByValue(value byte) BACnetCharacterEncoding {
+	switch value {
+	case 0x0:
+		return BACnetCharacterEncoding_ISO_10646
+	case 0x1:
+		return BACnetCharacterEncoding_IBM_Microsoft_DBCS
+	case 0x2:
+		return BACnetCharacterEncoding_JIS_X_0208
+	case 0x3:
+		return BACnetCharacterEncoding_ISO_10646_4
+	case 0x4:
+		return BACnetCharacterEncoding_ISO_10646_2
+	case 0x5:
+		return BACnetCharacterEncoding_ISO_8859_1
+	}
+	return 0
+}
+
+func BACnetCharacterEncodingByName(value string) BACnetCharacterEncoding {
+	switch value {
+	case "ISO_10646":
+		return BACnetCharacterEncoding_ISO_10646
+	case "IBM_Microsoft_DBCS":
+		return BACnetCharacterEncoding_IBM_Microsoft_DBCS
+	case "JIS_X_0208":
+		return BACnetCharacterEncoding_JIS_X_0208
+	case "ISO_10646_4":
+		return BACnetCharacterEncoding_ISO_10646_4
+	case "ISO_10646_2":
+		return BACnetCharacterEncoding_ISO_10646_2
+	case "ISO_8859_1":
+		return BACnetCharacterEncoding_ISO_8859_1
+	}
+	return 0
+}
+
+func CastBACnetCharacterEncoding(structType interface{}) BACnetCharacterEncoding {
+	castFunc := func(typ interface{}) BACnetCharacterEncoding {
+		if sBACnetCharacterEncoding, ok := typ.(BACnetCharacterEncoding); ok {
+			return sBACnetCharacterEncoding
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
+func (m BACnetCharacterEncoding) LengthInBits() uint16 {
+	return 8
+}
+
+func (m BACnetCharacterEncoding) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
+func BACnetCharacterEncodingParse(readBuffer utils.ReadBuffer) (BACnetCharacterEncoding, error) {
+	val, err := readBuffer.ReadByte("BACnetCharacterEncoding")
+	if err != nil {
+		return 0, nil
+	}
+	return BACnetCharacterEncodingByValue(val), nil
+}
+
+func (e BACnetCharacterEncoding) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteByte("BACnetCharacterEncoding", byte(e), utils.WithAdditionalStringRepresentation(e.name()))
+}
+
+func (e BACnetCharacterEncoding) name() string {
+	switch e {
+	case BACnetCharacterEncoding_ISO_10646:
+		return "ISO_10646"
+	case BACnetCharacterEncoding_IBM_Microsoft_DBCS:
+		return "IBM_Microsoft_DBCS"
+	case BACnetCharacterEncoding_JIS_X_0208:
+		return "JIS_X_0208"
+	case BACnetCharacterEncoding_ISO_10646_4:
+		return "ISO_10646_4"
+	case BACnetCharacterEncoding_ISO_10646_2:
+		return "ISO_10646_2"
+	case BACnetCharacterEncoding_ISO_8859_1:
+		return "ISO_8859_1"
+	}
+	return ""
+}
+
+func (e BACnetCharacterEncoding) String() string {
+	return e.name()
+}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTag.go
index 84a8266..112b8b9 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTag.go
@@ -232,7 +232,7 @@ func BACnetComplexTagParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8,
 	case dataType == BACnetDataType_OCTET_STRING: // BACnetComplexTagOctetString
 		_parent, typeSwitchError = BACnetComplexTagOctetStringParse(readBuffer, tagNumberArgument, dataType, actualLength)
 	case dataType == BACnetDataType_CHARACTER_STRING: // BACnetComplexTagCharacterString
-		_parent, typeSwitchError = BACnetComplexTagCharacterStringParse(readBuffer, tagNumberArgument, dataType)
+		_parent, typeSwitchError = BACnetComplexTagCharacterStringParse(readBuffer, tagNumberArgument, dataType, actualLength)
 	case dataType == BACnetDataType_BIT_STRING: // BACnetComplexTagBitString
 		_parent, typeSwitchError = BACnetComplexTagBitStringParse(readBuffer, tagNumberArgument, dataType, actualLength)
 	case dataType == BACnetDataType_ENUMERATED: // BACnetComplexTagEnumerated
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagCharacterString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagCharacterString.go
index 85bdb9a..6e24ed8 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagCharacterString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagCharacterString.go
@@ -21,13 +21,17 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
 
 // The data-structure of this message
 type BACnetComplexTagCharacterString struct {
-	Parent *BACnetComplexTag
+	Encoding          BACnetCharacterEncoding
+	Value             string
+	ActualLengthInBit uint16
+	Parent            *BACnetComplexTag
 }
 
 // The corresponding interface
@@ -54,9 +58,11 @@ func (m *BACnetComplexTagCharacterString) InitializeParent(parent *BACnetComplex
 	m.Parent.ExtExtExtLength = extExtExtLength
 }
 
-func NewBACnetComplexTagCharacterString(tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetComplexTag {
+func NewBACnetComplexTagCharacterString(encoding BACnetCharacterEncoding, value string, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetComplexTag {
 	child := &BACnetComplexTagCharacterString{
-		Parent: NewBACnetComplexTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
+		Encoding: encoding,
+		Value:    value,
+		Parent:   NewBACnetComplexTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
 	}
 	child.Parent.Child = child
 	return child.Parent
@@ -92,6 +98,14 @@ func (m *BACnetComplexTagCharacterString) LengthInBits() uint16 {
 func (m *BACnetComplexTagCharacterString) LengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.Parent.ParentLengthInBits())
 
+	// Simple field (encoding)
+	lengthInBits += 8
+
+	// A virtual field doesn't have any in- or output.
+
+	// Simple field (value)
+	lengthInBits += uint16(m.ActualLengthInBit)
+
 	return lengthInBits
 }
 
@@ -99,18 +113,41 @@ func (m *BACnetComplexTagCharacterString) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func BACnetComplexTagCharacterStringParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8, dataType BACnetDataType) (*BACnetComplexTag, error) {
+func BACnetComplexTagCharacterStringParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8, dataType BACnetDataType, actualLength uint32) (*BACnetComplexTag, error) {
 	if pullErr := readBuffer.PullContext("BACnetComplexTagCharacterString"); pullErr != nil {
 		return nil, pullErr
 	}
 
+	// Simple Field (encoding)
+	if pullErr := readBuffer.PullContext("encoding"); pullErr != nil {
+		return nil, pullErr
+	}
+	encoding, _encodingErr := BACnetCharacterEncodingParse(readBuffer)
+	if _encodingErr != nil {
+		return nil, errors.Wrap(_encodingErr, "Error parsing 'encoding' field")
+	}
+	if closeErr := readBuffer.CloseContext("encoding"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Virtual field
+	actualLengthInBit := uint16(actualLength) * uint16(uint16(8))
+
+	// Simple Field (value)
+	value, _valueErr := readBuffer.ReadString("value", uint32(actualLengthInBit))
+	if _valueErr != nil {
+		return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
+	}
+
 	if closeErr := readBuffer.CloseContext("BACnetComplexTagCharacterString"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create a partially initialized instance
 	_child := &BACnetComplexTagCharacterString{
-		Parent: &BACnetComplexTag{},
+		Encoding: encoding,
+		Value:    value,
+		Parent:   &BACnetComplexTag{},
 	}
 	_child.Parent.Child = _child
 	return _child.Parent, nil
@@ -122,6 +159,25 @@ func (m *BACnetComplexTagCharacterString) Serialize(writeBuffer utils.WriteBuffe
 			return pushErr
 		}
 
+		// Simple Field (encoding)
+		if pushErr := writeBuffer.PushContext("encoding"); pushErr != nil {
+			return pushErr
+		}
+		_encodingErr := m.Encoding.Serialize(writeBuffer)
+		if popErr := writeBuffer.PopContext("encoding"); popErr != nil {
+			return popErr
+		}
+		if _encodingErr != nil {
+			return errors.Wrap(_encodingErr, "Error serializing 'encoding' field")
+		}
+
+		// Simple Field (value)
+		value := string(m.Value)
+		_valueErr := writeBuffer.WriteString("value", uint32(m.ActualLengthInBit), "UTF-8", (value))
+		if _valueErr != nil {
+			return errors.Wrap(_valueErr, "Error serializing 'value' field")
+		}
+
 		if popErr := writeBuffer.PopContext("BACnetComplexTagCharacterString"); popErr != nil {
 			return popErr
 		}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagObjectIdentifier.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagObjectIdentifier.go
index b2d291f..c878cdf 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagObjectIdentifier.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagObjectIdentifier.go
@@ -21,13 +21,16 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
 
 // The data-structure of this message
 type BACnetComplexTagObjectIdentifier struct {
-	Parent *BACnetComplexTag
+	ObjectType     uint16
+	InstanceNumber uint32
+	Parent         *BACnetComplexTag
 }
 
 // The corresponding interface
@@ -54,9 +57,11 @@ func (m *BACnetComplexTagObjectIdentifier) InitializeParent(parent *BACnetComple
 	m.Parent.ExtExtExtLength = extExtExtLength
 }
 
-func NewBACnetComplexTagObjectIdentifier(tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetComplexTag {
+func NewBACnetComplexTagObjectIdentifier(objectType uint16, instanceNumber uint32, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetComplexTag {
 	child := &BACnetComplexTagObjectIdentifier{
-		Parent: NewBACnetComplexTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
+		ObjectType:     objectType,
+		InstanceNumber: instanceNumber,
+		Parent:         NewBACnetComplexTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
 	}
 	child.Parent.Child = child
 	return child.Parent
@@ -92,6 +97,12 @@ func (m *BACnetComplexTagObjectIdentifier) LengthInBits() uint16 {
 func (m *BACnetComplexTagObjectIdentifier) LengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.Parent.ParentLengthInBits())
 
+	// Simple field (objectType)
+	lengthInBits += 10
+
+	// Simple field (instanceNumber)
+	lengthInBits += 22
+
 	return lengthInBits
 }
 
@@ -104,13 +115,27 @@ func BACnetComplexTagObjectIdentifierParse(readBuffer utils.ReadBuffer, tagNumbe
 		return nil, pullErr
 	}
 
+	// Simple Field (objectType)
+	objectType, _objectTypeErr := readBuffer.ReadUint16("objectType", 10)
+	if _objectTypeErr != nil {
+		return nil, errors.Wrap(_objectTypeErr, "Error parsing 'objectType' field")
+	}
+
+	// Simple Field (instanceNumber)
+	instanceNumber, _instanceNumberErr := readBuffer.ReadUint32("instanceNumber", 22)
+	if _instanceNumberErr != nil {
+		return nil, errors.Wrap(_instanceNumberErr, "Error parsing 'instanceNumber' field")
+	}
+
 	if closeErr := readBuffer.CloseContext("BACnetComplexTagObjectIdentifier"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create a partially initialized instance
 	_child := &BACnetComplexTagObjectIdentifier{
-		Parent: &BACnetComplexTag{},
+		ObjectType:     objectType,
+		InstanceNumber: instanceNumber,
+		Parent:         &BACnetComplexTag{},
 	}
 	_child.Parent.Child = _child
 	return _child.Parent, nil
@@ -122,6 +147,20 @@ func (m *BACnetComplexTagObjectIdentifier) Serialize(writeBuffer utils.WriteBuff
 			return pushErr
 		}
 
+		// Simple Field (objectType)
+		objectType := uint16(m.ObjectType)
+		_objectTypeErr := writeBuffer.WriteUint16("objectType", 10, (objectType))
+		if _objectTypeErr != nil {
+			return errors.Wrap(_objectTypeErr, "Error serializing 'objectType' field")
+		}
+
+		// Simple Field (instanceNumber)
+		instanceNumber := uint32(m.InstanceNumber)
+		_instanceNumberErr := writeBuffer.WriteUint32("instanceNumber", 22, (instanceNumber))
+		if _instanceNumberErr != nil {
+			return errors.Wrap(_instanceNumberErr, "Error serializing 'instanceNumber' field")
+		}
+
 		if popErr := writeBuffer.PopContext("BACnetComplexTagObjectIdentifier"); popErr != nil {
 			return popErr
 		}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagOctetString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagOctetString.go
index 615da25..418936f 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagOctetString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagOctetString.go
@@ -28,7 +28,7 @@ import (
 
 // The data-structure of this message
 type BACnetComplexTagOctetString struct {
-	TheString         string
+	Value             string
 	ActualLengthInBit uint16
 	Parent            *BACnetComplexTag
 }
@@ -57,10 +57,10 @@ func (m *BACnetComplexTagOctetString) InitializeParent(parent *BACnetComplexTag,
 	m.Parent.ExtExtExtLength = extExtExtLength
 }
 
-func NewBACnetComplexTagOctetString(theString string, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetComplexTag {
+func NewBACnetComplexTagOctetString(value string, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetComplexTag {
 	child := &BACnetComplexTagOctetString{
-		TheString: theString,
-		Parent:    NewBACnetComplexTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
+		Value:  value,
+		Parent: NewBACnetComplexTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
 	}
 	child.Parent.Child = child
 	return child.Parent
@@ -98,7 +98,7 @@ func (m *BACnetComplexTagOctetString) LengthInBitsConditional(lastItem bool) uin
 
 	// A virtual field doesn't have any in- or output.
 
-	// Simple field (theString)
+	// Simple field (value)
 	lengthInBits += uint16(m.ActualLengthInBit)
 
 	return lengthInBits
@@ -116,10 +116,10 @@ func BACnetComplexTagOctetStringParse(readBuffer utils.ReadBuffer, tagNumberArgu
 	// Virtual field
 	actualLengthInBit := uint16(actualLength) * uint16(uint16(8))
 
-	// Simple Field (theString)
-	theString, _theStringErr := readBuffer.ReadString("theString", uint32(actualLengthInBit))
-	if _theStringErr != nil {
-		return nil, errors.Wrap(_theStringErr, "Error parsing 'theString' field")
+	// Simple Field (value)
+	value, _valueErr := readBuffer.ReadString("value", uint32(actualLengthInBit))
+	if _valueErr != nil {
+		return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetComplexTagOctetString"); closeErr != nil {
@@ -128,8 +128,8 @@ func BACnetComplexTagOctetStringParse(readBuffer utils.ReadBuffer, tagNumberArgu
 
 	// Create a partially initialized instance
 	_child := &BACnetComplexTagOctetString{
-		TheString: theString,
-		Parent:    &BACnetComplexTag{},
+		Value:  value,
+		Parent: &BACnetComplexTag{},
 	}
 	_child.Parent.Child = _child
 	return _child.Parent, nil
@@ -141,11 +141,11 @@ func (m *BACnetComplexTagOctetString) Serialize(writeBuffer utils.WriteBuffer) e
 			return pushErr
 		}
 
-		// Simple Field (theString)
-		theString := string(m.TheString)
-		_theStringErr := writeBuffer.WriteString("theString", uint32(m.ActualLengthInBit), "ASCII", (theString))
-		if _theStringErr != nil {
-			return errors.Wrap(_theStringErr, "Error serializing 'theString' field")
+		// Simple Field (value)
+		value := string(m.Value)
+		_valueErr := writeBuffer.WriteString("value", uint32(m.ActualLengthInBit), "ASCII", (value))
+		if _valueErr != nil {
+			return errors.Wrap(_valueErr, "Error serializing 'value' field")
 		}
 
 		if popErr := writeBuffer.PopContext("BACnetComplexTagOctetString"); popErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
index 87f48d7..34140f8 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
@@ -245,7 +245,6 @@ func BACnetConfirmedServiceRequestWritePropertyParse(readBuffer utils.ReadBuffer
 			return nil, pullErr
 		}
 		_val, _err := BACnetTagParse(readBuffer)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'priority' field")
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
index 5f585d5..89a1e3b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
@@ -221,21 +221,21 @@ func BACnetTagParse(readBuffer utils.ReadBuffer) (*BACnetTag, error) {
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0x1: // BACnetTagApplicationBoolean
 		_parent, typeSwitchError = BACnetTagApplicationBooleanParse(readBuffer)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0x2: // BACnetTagApplicationUnsignedInteger
-		_parent, typeSwitchError = BACnetTagApplicationUnsignedIntegerParse(readBuffer, lengthValueType, *extLength)
+		_parent, typeSwitchError = BACnetTagApplicationUnsignedIntegerParse(readBuffer, actualLength)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0x3: // BACnetTagApplicationSignedInteger
-		_parent, typeSwitchError = BACnetTagApplicationSignedIntegerParse(readBuffer, lengthValueType, *extLength)
+		_parent, typeSwitchError = BACnetTagApplicationSignedIntegerParse(readBuffer, actualLength)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0x4: // BACnetTagApplicationReal
-		_parent, typeSwitchError = BACnetTagApplicationRealParse(readBuffer, lengthValueType, *extLength)
+		_parent, typeSwitchError = BACnetTagApplicationRealParse(readBuffer)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0x5: // BACnetTagApplicationDouble
-		_parent, typeSwitchError = BACnetTagApplicationDoubleParse(readBuffer, lengthValueType, *extLength)
+		_parent, typeSwitchError = BACnetTagApplicationDoubleParse(readBuffer)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0x6: // BACnetTagApplicationOctetString
-		_parent, typeSwitchError = BACnetTagApplicationOctetStringParse(readBuffer)
+		_parent, typeSwitchError = BACnetTagApplicationOctetStringParse(readBuffer, actualLength)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0x7: // BACnetTagApplicationCharacterString
-		_parent, typeSwitchError = BACnetTagApplicationCharacterStringParse(readBuffer)
+		_parent, typeSwitchError = BACnetTagApplicationCharacterStringParse(readBuffer, actualLength)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0x8: // BACnetTagApplicationBitString
-		_parent, typeSwitchError = BACnetTagApplicationBitStringParse(readBuffer, lengthValueType, *extLength)
+		_parent, typeSwitchError = BACnetTagApplicationBitStringParse(readBuffer, actualLength)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0x9: // BACnetTagApplicationEnumerated
-		_parent, typeSwitchError = BACnetTagApplicationEnumeratedParse(readBuffer, lengthValueType, *extLength)
+		_parent, typeSwitchError = BACnetTagApplicationEnumeratedParse(readBuffer, actualLength)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0xA: // BACnetTagApplicationDate
 		_parent, typeSwitchError = BACnetTagApplicationDateParse(readBuffer)
 	case tagClass == TagClass_APPLICATION_TAGS && tagNumber == 0xB: // BACnetTagApplicationTime
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
index c990294..a494054 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
@@ -111,7 +111,7 @@ func (m *BACnetTagApplicationBitString) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func BACnetTagApplicationBitStringParse(readBuffer utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
+func BACnetTagApplicationBitStringParse(readBuffer utils.ReadBuffer, actualLength uint32) (*BACnetTag, error) {
 	if pullErr := readBuffer.PullContext("BACnetTagApplicationBitString"); pullErr != nil {
 		return nil, pullErr
 	}
@@ -128,7 +128,7 @@ func BACnetTagApplicationBitStringParse(readBuffer utils.ReadBuffer, lengthValue
 	}
 	// Length array
 	data := make([]int8, 0)
-	_dataLength := utils.InlineIf(bool(bool((lengthValueType) == (5))), func() interface{} { return uint16(uint16(uint16(extLength) - uint16(uint16(1)))) }, func() interface{} { return uint16(uint16(uint16(lengthValueType) - uint16(uint16(1)))) }).(uint16)
+	_dataLength := actualLength
 	_dataEndPos := readBuffer.GetPos() + uint16(_dataLength)
 	for readBuffer.GetPos() < _dataEndPos {
 		_item, _err := readBuffer.ReadInt8("", 8)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
index 114cdbf..ff31f2d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
@@ -21,13 +21,17 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
 
 // The data-structure of this message
 type BACnetTagApplicationCharacterString struct {
-	Parent *BACnetTag
+	Encoding          BACnetCharacterEncoding
+	Value             string
+	ActualLengthInBit uint16
+	Parent            *BACnetTag
 }
 
 // The corresponding interface
@@ -53,9 +57,11 @@ func (m *BACnetTagApplicationCharacterString) InitializeParent(parent *BACnetTag
 	m.Parent.ExtExtExtLength = extExtExtLength
 }
 
-func NewBACnetTagApplicationCharacterString(tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
+func NewBACnetTagApplicationCharacterString(encoding BACnetCharacterEncoding, value string, tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
 	child := &BACnetTagApplicationCharacterString{
-		Parent: NewBACnetTag(tagNumber, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
+		Encoding: encoding,
+		Value:    value,
+		Parent:   NewBACnetTag(tagNumber, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
 	}
 	child.Parent.Child = child
 	return child.Parent
@@ -91,6 +97,14 @@ func (m *BACnetTagApplicationCharacterString) LengthInBits() uint16 {
 func (m *BACnetTagApplicationCharacterString) LengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.Parent.ParentLengthInBits())
 
+	// Simple field (encoding)
+	lengthInBits += 8
+
+	// A virtual field doesn't have any in- or output.
+
+	// Simple field (value)
+	lengthInBits += uint16(m.ActualLengthInBit)
+
 	return lengthInBits
 }
 
@@ -98,18 +112,41 @@ func (m *BACnetTagApplicationCharacterString) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func BACnetTagApplicationCharacterStringParse(readBuffer utils.ReadBuffer) (*BACnetTag, error) {
+func BACnetTagApplicationCharacterStringParse(readBuffer utils.ReadBuffer, actualLength uint32) (*BACnetTag, error) {
 	if pullErr := readBuffer.PullContext("BACnetTagApplicationCharacterString"); pullErr != nil {
 		return nil, pullErr
 	}
 
+	// Simple Field (encoding)
+	if pullErr := readBuffer.PullContext("encoding"); pullErr != nil {
+		return nil, pullErr
+	}
+	encoding, _encodingErr := BACnetCharacterEncodingParse(readBuffer)
+	if _encodingErr != nil {
+		return nil, errors.Wrap(_encodingErr, "Error parsing 'encoding' field")
+	}
+	if closeErr := readBuffer.CloseContext("encoding"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Virtual field
+	actualLengthInBit := uint16(actualLength) * uint16(uint16(8))
+
+	// Simple Field (value)
+	value, _valueErr := readBuffer.ReadString("value", uint32(actualLengthInBit))
+	if _valueErr != nil {
+		return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
+	}
+
 	if closeErr := readBuffer.CloseContext("BACnetTagApplicationCharacterString"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create a partially initialized instance
 	_child := &BACnetTagApplicationCharacterString{
-		Parent: &BACnetTag{},
+		Encoding: encoding,
+		Value:    value,
+		Parent:   &BACnetTag{},
 	}
 	_child.Parent.Child = _child
 	return _child.Parent, nil
@@ -121,6 +158,25 @@ func (m *BACnetTagApplicationCharacterString) Serialize(writeBuffer utils.WriteB
 			return pushErr
 		}
 
+		// Simple Field (encoding)
+		if pushErr := writeBuffer.PushContext("encoding"); pushErr != nil {
+			return pushErr
+		}
+		_encodingErr := m.Encoding.Serialize(writeBuffer)
+		if popErr := writeBuffer.PopContext("encoding"); popErr != nil {
+			return popErr
+		}
+		if _encodingErr != nil {
+			return errors.Wrap(_encodingErr, "Error serializing 'encoding' field")
+		}
+
+		// Simple Field (value)
+		value := string(m.Value)
+		_valueErr := writeBuffer.WriteString("value", uint32(m.ActualLengthInBit), "UTF-8", (value))
+		if _valueErr != nil {
+			return errors.Wrap(_valueErr, "Error serializing 'value' field")
+		}
+
 		if popErr := writeBuffer.PopContext("BACnetTagApplicationCharacterString"); popErr != nil {
 			return popErr
 		}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
index 02dc85b..2f1427a 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
@@ -104,7 +104,7 @@ func (m *BACnetTagApplicationDouble) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func BACnetTagApplicationDoubleParse(readBuffer utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
+func BACnetTagApplicationDoubleParse(readBuffer utils.ReadBuffer) (*BACnetTag, error) {
 	if pullErr := readBuffer.PullContext("BACnetTagApplicationDouble"); pullErr != nil {
 		return nil, pullErr
 	}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
index 1958d02..5d6c54b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
@@ -106,7 +106,7 @@ func (m *BACnetTagApplicationEnumerated) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func BACnetTagApplicationEnumeratedParse(readBuffer utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
+func BACnetTagApplicationEnumeratedParse(readBuffer utils.ReadBuffer, actualLength uint32) (*BACnetTag, error) {
 	if pullErr := readBuffer.PullContext("BACnetTagApplicationEnumerated"); pullErr != nil {
 		return nil, pullErr
 	}
@@ -117,7 +117,7 @@ func BACnetTagApplicationEnumeratedParse(readBuffer utils.ReadBuffer, lengthValu
 	}
 	// Length array
 	data := make([]int8, 0)
-	_dataLength := utils.InlineIf(bool(bool((lengthValueType) == (5))), func() interface{} { return uint16(extLength) }, func() interface{} { return uint16(lengthValueType) }).(uint16)
+	_dataLength := actualLength
 	_dataEndPos := readBuffer.GetPos() + uint16(_dataLength)
 	for readBuffer.GetPos() < _dataEndPos {
 		_item, _err := readBuffer.ReadInt8("", 8)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go
index 5279ded..857d86e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go
@@ -21,13 +21,16 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
 
 // The data-structure of this message
 type BACnetTagApplicationObjectIdentifier struct {
-	Parent *BACnetTag
+	ObjectType     uint16
+	InstanceNumber uint32
+	Parent         *BACnetTag
 }
 
 // The corresponding interface
@@ -53,9 +56,11 @@ func (m *BACnetTagApplicationObjectIdentifier) InitializeParent(parent *BACnetTa
 	m.Parent.ExtExtExtLength = extExtExtLength
 }
 
-func NewBACnetTagApplicationObjectIdentifier(tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
+func NewBACnetTagApplicationObjectIdentifier(objectType uint16, instanceNumber uint32, tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
 	child := &BACnetTagApplicationObjectIdentifier{
-		Parent: NewBACnetTag(tagNumber, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
+		ObjectType:     objectType,
+		InstanceNumber: instanceNumber,
+		Parent:         NewBACnetTag(tagNumber, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
 	}
 	child.Parent.Child = child
 	return child.Parent
@@ -91,6 +96,12 @@ func (m *BACnetTagApplicationObjectIdentifier) LengthInBits() uint16 {
 func (m *BACnetTagApplicationObjectIdentifier) LengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.Parent.ParentLengthInBits())
 
+	// Simple field (objectType)
+	lengthInBits += 10
+
+	// Simple field (instanceNumber)
+	lengthInBits += 22
+
 	return lengthInBits
 }
 
@@ -103,13 +114,27 @@ func BACnetTagApplicationObjectIdentifierParse(readBuffer utils.ReadBuffer) (*BA
 		return nil, pullErr
 	}
 
+	// Simple Field (objectType)
+	objectType, _objectTypeErr := readBuffer.ReadUint16("objectType", 10)
+	if _objectTypeErr != nil {
+		return nil, errors.Wrap(_objectTypeErr, "Error parsing 'objectType' field")
+	}
+
+	// Simple Field (instanceNumber)
+	instanceNumber, _instanceNumberErr := readBuffer.ReadUint32("instanceNumber", 22)
+	if _instanceNumberErr != nil {
+		return nil, errors.Wrap(_instanceNumberErr, "Error parsing 'instanceNumber' field")
+	}
+
 	if closeErr := readBuffer.CloseContext("BACnetTagApplicationObjectIdentifier"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create a partially initialized instance
 	_child := &BACnetTagApplicationObjectIdentifier{
-		Parent: &BACnetTag{},
+		ObjectType:     objectType,
+		InstanceNumber: instanceNumber,
+		Parent:         &BACnetTag{},
 	}
 	_child.Parent.Child = _child
 	return _child.Parent, nil
@@ -121,6 +146,20 @@ func (m *BACnetTagApplicationObjectIdentifier) Serialize(writeBuffer utils.Write
 			return pushErr
 		}
 
+		// Simple Field (objectType)
+		objectType := uint16(m.ObjectType)
+		_objectTypeErr := writeBuffer.WriteUint16("objectType", 10, (objectType))
+		if _objectTypeErr != nil {
+			return errors.Wrap(_objectTypeErr, "Error serializing 'objectType' field")
+		}
+
+		// Simple Field (instanceNumber)
+		instanceNumber := uint32(m.InstanceNumber)
+		_instanceNumberErr := writeBuffer.WriteUint32("instanceNumber", 22, (instanceNumber))
+		if _instanceNumberErr != nil {
+			return errors.Wrap(_instanceNumberErr, "Error serializing 'instanceNumber' field")
+		}
+
 		if popErr := writeBuffer.PopContext("BACnetTagApplicationObjectIdentifier"); popErr != nil {
 			return popErr
 		}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go
index 2a9ee2e..a2195a3 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go
@@ -21,13 +21,16 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
 
 // The data-structure of this message
 type BACnetTagApplicationOctetString struct {
-	Parent *BACnetTag
+	Value             string
+	ActualLengthInBit uint16
+	Parent            *BACnetTag
 }
 
 // The corresponding interface
@@ -53,8 +56,9 @@ func (m *BACnetTagApplicationOctetString) InitializeParent(parent *BACnetTag, ta
 	m.Parent.ExtExtExtLength = extExtExtLength
 }
 
-func NewBACnetTagApplicationOctetString(tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
+func NewBACnetTagApplicationOctetString(value string, tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
 	child := &BACnetTagApplicationOctetString{
+		Value:  value,
 		Parent: NewBACnetTag(tagNumber, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
 	}
 	child.Parent.Child = child
@@ -91,6 +95,11 @@ func (m *BACnetTagApplicationOctetString) LengthInBits() uint16 {
 func (m *BACnetTagApplicationOctetString) LengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.Parent.ParentLengthInBits())
 
+	// A virtual field doesn't have any in- or output.
+
+	// Simple field (value)
+	lengthInBits += uint16(m.ActualLengthInBit)
+
 	return lengthInBits
 }
 
@@ -98,17 +107,27 @@ func (m *BACnetTagApplicationOctetString) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func BACnetTagApplicationOctetStringParse(readBuffer utils.ReadBuffer) (*BACnetTag, error) {
+func BACnetTagApplicationOctetStringParse(readBuffer utils.ReadBuffer, actualLength uint32) (*BACnetTag, error) {
 	if pullErr := readBuffer.PullContext("BACnetTagApplicationOctetString"); pullErr != nil {
 		return nil, pullErr
 	}
 
+	// Virtual field
+	actualLengthInBit := uint16(actualLength) * uint16(uint16(8))
+
+	// Simple Field (value)
+	value, _valueErr := readBuffer.ReadString("value", uint32(actualLengthInBit))
+	if _valueErr != nil {
+		return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
+	}
+
 	if closeErr := readBuffer.CloseContext("BACnetTagApplicationOctetString"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create a partially initialized instance
 	_child := &BACnetTagApplicationOctetString{
+		Value:  value,
 		Parent: &BACnetTag{},
 	}
 	_child.Parent.Child = _child
@@ -121,6 +140,13 @@ func (m *BACnetTagApplicationOctetString) Serialize(writeBuffer utils.WriteBuffe
 			return pushErr
 		}
 
+		// Simple Field (value)
+		value := string(m.Value)
+		_valueErr := writeBuffer.WriteString("value", uint32(m.ActualLengthInBit), "ASCII", (value))
+		if _valueErr != nil {
+			return errors.Wrap(_valueErr, "Error serializing 'value' field")
+		}
+
 		if popErr := writeBuffer.PopContext("BACnetTagApplicationOctetString"); popErr != nil {
 			return popErr
 		}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
index 7bdbe5d..d9cf1b9 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
@@ -104,7 +104,7 @@ func (m *BACnetTagApplicationReal) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func BACnetTagApplicationRealParse(readBuffer utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
+func BACnetTagApplicationRealParse(readBuffer utils.ReadBuffer) (*BACnetTag, error) {
 	if pullErr := readBuffer.PullContext("BACnetTagApplicationReal"); pullErr != nil {
 		return nil, pullErr
 	}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
index 16c23ad..29dcf69 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
@@ -28,8 +28,15 @@ import (
 
 // The data-structure of this message
 type BACnetTagApplicationSignedInteger struct {
-	Data   []int8
-	Parent *BACnetTag
+	ValueInt8  *int8
+	ValueInt16 *int16
+	ValueInt32 *int32
+	ValueInt64 *int64
+	IsInt8     bool
+	IsInt16    bool
+	IsInt32    bool
+	IsInt64    bool
+	Parent     *BACnetTag
 }
 
 // The corresponding interface
@@ -55,10 +62,13 @@ func (m *BACnetTagApplicationSignedInteger) InitializeParent(parent *BACnetTag,
 	m.Parent.ExtExtExtLength = extExtExtLength
 }
 
-func NewBACnetTagApplicationSignedInteger(data []int8, tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
+func NewBACnetTagApplicationSignedInteger(valueInt8 *int8, valueInt16 *int16, valueInt32 *int32, valueInt64 *int64, tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
 	child := &BACnetTagApplicationSignedInteger{
-		Data:   data,
-		Parent: NewBACnetTag(tagNumber, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
+		ValueInt8:  valueInt8,
+		ValueInt16: valueInt16,
+		ValueInt32: valueInt32,
+		ValueInt64: valueInt64,
+		Parent:     NewBACnetTag(tagNumber, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
 	}
 	child.Parent.Child = child
 	return child.Parent
@@ -94,9 +104,32 @@ func (m *BACnetTagApplicationSignedInteger) LengthInBits() uint16 {
 func (m *BACnetTagApplicationSignedInteger) LengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.Parent.ParentLengthInBits())
 
-	// Array field
-	if len(m.Data) > 0 {
-		lengthInBits += 8 * uint16(len(m.Data))
+	// A virtual field doesn't have any in- or output.
+
+	// Optional Field (valueInt8)
+	if m.ValueInt8 != nil {
+		lengthInBits += 8
+	}
+
+	// A virtual field doesn't have any in- or output.
+
+	// Optional Field (valueInt16)
+	if m.ValueInt16 != nil {
+		lengthInBits += 16
+	}
+
+	// A virtual field doesn't have any in- or output.
+
+	// Optional Field (valueInt32)
+	if m.ValueInt32 != nil {
+		lengthInBits += 32
+	}
+
+	// A virtual field doesn't have any in- or output.
+
+	// Optional Field (valueInt64)
+	if m.ValueInt64 != nil {
+		lengthInBits += 64
 	}
 
 	return lengthInBits
@@ -106,28 +139,61 @@ func (m *BACnetTagApplicationSignedInteger) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func BACnetTagApplicationSignedIntegerParse(readBuffer utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
+func BACnetTagApplicationSignedIntegerParse(readBuffer utils.ReadBuffer, actualLength uint32) (*BACnetTag, error) {
 	if pullErr := readBuffer.PullContext("BACnetTagApplicationSignedInteger"); pullErr != nil {
 		return nil, pullErr
 	}
 
-	// Array field (data)
-	if pullErr := readBuffer.PullContext("data", utils.WithRenderAsList(true)); pullErr != nil {
-		return nil, pullErr
+	// Virtual field
+	isInt8 := bool((actualLength) == (1))
+
+	// Optional Field (valueInt8) (Can be skipped, if a given expression evaluates to false)
+	var valueInt8 *int8 = nil
+	if isInt8 {
+		_val, _err := readBuffer.ReadInt8("valueInt8", 8)
+		if _err != nil {
+			return nil, errors.Wrap(_err, "Error parsing 'valueInt8' field")
+		}
+		valueInt8 = &_val
 	}
-	// Length array
-	data := make([]int8, 0)
-	_dataLength := utils.InlineIf(bool(bool((lengthValueType) == (5))), func() interface{} { return uint16(extLength) }, func() interface{} { return uint16(lengthValueType) }).(uint16)
-	_dataEndPos := readBuffer.GetPos() + uint16(_dataLength)
-	for readBuffer.GetPos() < _dataEndPos {
-		_item, _err := readBuffer.ReadInt8("", 8)
+
+	// Virtual field
+	isInt16 := bool((actualLength) == (2))
+
+	// Optional Field (valueInt16) (Can be skipped, if a given expression evaluates to false)
+	var valueInt16 *int16 = nil
+	if isInt16 {
+		_val, _err := readBuffer.ReadInt16("valueInt16", 16)
 		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'data' field")
+			return nil, errors.Wrap(_err, "Error parsing 'valueInt16' field")
 		}
-		data = append(data, _item)
+		valueInt16 = &_val
 	}
-	if closeErr := readBuffer.CloseContext("data", utils.WithRenderAsList(true)); closeErr != nil {
-		return nil, closeErr
+
+	// Virtual field
+	isInt32 := bool((actualLength) == (3))
+
+	// Optional Field (valueInt32) (Can be skipped, if a given expression evaluates to false)
+	var valueInt32 *int32 = nil
+	if isInt32 {
+		_val, _err := readBuffer.ReadInt32("valueInt32", 32)
+		if _err != nil {
+			return nil, errors.Wrap(_err, "Error parsing 'valueInt32' field")
+		}
+		valueInt32 = &_val
+	}
+
+	// Virtual field
+	isInt64 := bool((actualLength) == (4))
+
+	// Optional Field (valueInt64) (Can be skipped, if a given expression evaluates to false)
+	var valueInt64 *int64 = nil
+	if isInt64 {
+		_val, _err := readBuffer.ReadInt64("valueInt64", 64)
+		if _err != nil {
+			return nil, errors.Wrap(_err, "Error parsing 'valueInt64' field")
+		}
+		valueInt64 = &_val
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetTagApplicationSignedInteger"); closeErr != nil {
@@ -136,8 +202,11 @@ func BACnetTagApplicationSignedIntegerParse(readBuffer utils.ReadBuffer, lengthV
 
 	// Create a partially initialized instance
 	_child := &BACnetTagApplicationSignedInteger{
-		Data:   data,
-		Parent: &BACnetTag{},
+		ValueInt8:  valueInt8,
+		ValueInt16: valueInt16,
+		ValueInt32: valueInt32,
+		ValueInt64: valueInt64,
+		Parent:     &BACnetTag{},
 	}
 	_child.Parent.Child = _child
 	return _child.Parent, nil
@@ -149,19 +218,43 @@ func (m *BACnetTagApplicationSignedInteger) Serialize(writeBuffer utils.WriteBuf
 			return pushErr
 		}
 
-		// Array Field (data)
-		if m.Data != nil {
-			if pushErr := writeBuffer.PushContext("data", utils.WithRenderAsList(true)); pushErr != nil {
-				return pushErr
+		// Optional Field (valueInt8) (Can be skipped, if the value is null)
+		var valueInt8 *int8 = nil
+		if m.ValueInt8 != nil {
+			valueInt8 = m.ValueInt8
+			_valueInt8Err := writeBuffer.WriteInt8("valueInt8", 8, *(valueInt8))
+			if _valueInt8Err != nil {
+				return errors.Wrap(_valueInt8Err, "Error serializing 'valueInt8' field")
+			}
+		}
+
+		// Optional Field (valueInt16) (Can be skipped, if the value is null)
+		var valueInt16 *int16 = nil
+		if m.ValueInt16 != nil {
+			valueInt16 = m.ValueInt16
+			_valueInt16Err := writeBuffer.WriteInt16("valueInt16", 16, *(valueInt16))
+			if _valueInt16Err != nil {
+				return errors.Wrap(_valueInt16Err, "Error serializing 'valueInt16' field")
 			}
-			for _, _element := range m.Data {
-				_elementErr := writeBuffer.WriteInt8("", 8, _element)
-				if _elementErr != nil {
-					return errors.Wrap(_elementErr, "Error serializing 'data' field")
-				}
+		}
+
+		// Optional Field (valueInt32) (Can be skipped, if the value is null)
+		var valueInt32 *int32 = nil
+		if m.ValueInt32 != nil {
+			valueInt32 = m.ValueInt32
+			_valueInt32Err := writeBuffer.WriteInt32("valueInt32", 32, *(valueInt32))
+			if _valueInt32Err != nil {
+				return errors.Wrap(_valueInt32Err, "Error serializing 'valueInt32' field")
 			}
-			if popErr := writeBuffer.PopContext("data", utils.WithRenderAsList(true)); popErr != nil {
-				return popErr
+		}
+
+		// Optional Field (valueInt64) (Can be skipped, if the value is null)
+		var valueInt64 *int64 = nil
+		if m.ValueInt64 != nil {
+			valueInt64 = m.ValueInt64
+			_valueInt64Err := writeBuffer.WriteInt64("valueInt64", 64, *(valueInt64))
+			if _valueInt64Err != nil {
+				return errors.Wrap(_valueInt64Err, "Error serializing 'valueInt64' field")
 			}
 		}
 
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
index 41d496b..47c8fe4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
@@ -28,8 +28,15 @@ import (
 
 // The data-structure of this message
 type BACnetTagApplicationUnsignedInteger struct {
-	Data   []int8
-	Parent *BACnetTag
+	ValueUint8  *uint8
+	ValueUint16 *uint16
+	ValueUint32 *uint32
+	ValueUint64 *uint64
+	IsUint8     bool
+	IsUint16    bool
+	IsUint32    bool
+	IsUint64    bool
+	Parent      *BACnetTag
 }
 
 // The corresponding interface
@@ -55,10 +62,13 @@ func (m *BACnetTagApplicationUnsignedInteger) InitializeParent(parent *BACnetTag
 	m.Parent.ExtExtExtLength = extExtExtLength
 }
 
-func NewBACnetTagApplicationUnsignedInteger(data []int8, tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
+func NewBACnetTagApplicationUnsignedInteger(valueUint8 *uint8, valueUint16 *uint16, valueUint32 *uint32, valueUint64 *uint64, tagNumber uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32) *BACnetTag {
 	child := &BACnetTagApplicationUnsignedInteger{
-		Data:   data,
-		Parent: NewBACnetTag(tagNumber, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
+		ValueUint8:  valueUint8,
+		ValueUint16: valueUint16,
+		ValueUint32: valueUint32,
+		ValueUint64: valueUint64,
+		Parent:      NewBACnetTag(tagNumber, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength),
 	}
 	child.Parent.Child = child
 	return child.Parent
@@ -94,9 +104,32 @@ func (m *BACnetTagApplicationUnsignedInteger) LengthInBits() uint16 {
 func (m *BACnetTagApplicationUnsignedInteger) LengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.Parent.ParentLengthInBits())
 
-	// Array field
-	if len(m.Data) > 0 {
-		lengthInBits += 8 * uint16(len(m.Data))
+	// A virtual field doesn't have any in- or output.
+
+	// Optional Field (valueUint8)
+	if m.ValueUint8 != nil {
+		lengthInBits += 8
+	}
+
+	// A virtual field doesn't have any in- or output.
+
+	// Optional Field (valueUint16)
+	if m.ValueUint16 != nil {
+		lengthInBits += 16
+	}
+
+	// A virtual field doesn't have any in- or output.
+
+	// Optional Field (valueUint32)
+	if m.ValueUint32 != nil {
+		lengthInBits += 32
+	}
+
+	// A virtual field doesn't have any in- or output.
+
+	// Optional Field (valueUint64)
+	if m.ValueUint64 != nil {
+		lengthInBits += 64
 	}
 
 	return lengthInBits
@@ -106,28 +139,61 @@ func (m *BACnetTagApplicationUnsignedInteger) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func BACnetTagApplicationUnsignedIntegerParse(readBuffer utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
+func BACnetTagApplicationUnsignedIntegerParse(readBuffer utils.ReadBuffer, actualLength uint32) (*BACnetTag, error) {
 	if pullErr := readBuffer.PullContext("BACnetTagApplicationUnsignedInteger"); pullErr != nil {
 		return nil, pullErr
 	}
 
-	// Array field (data)
-	if pullErr := readBuffer.PullContext("data", utils.WithRenderAsList(true)); pullErr != nil {
-		return nil, pullErr
+	// Virtual field
+	isUint8 := bool((actualLength) == (1))
+
+	// Optional Field (valueUint8) (Can be skipped, if a given expression evaluates to false)
+	var valueUint8 *uint8 = nil
+	if isUint8 {
+		_val, _err := readBuffer.ReadUint8("valueUint8", 8)
+		if _err != nil {
+			return nil, errors.Wrap(_err, "Error parsing 'valueUint8' field")
+		}
+		valueUint8 = &_val
 	}
-	// Length array
-	data := make([]int8, 0)
-	_dataLength := utils.InlineIf(bool(bool((lengthValueType) == (5))), func() interface{} { return uint16(extLength) }, func() interface{} { return uint16(lengthValueType) }).(uint16)
-	_dataEndPos := readBuffer.GetPos() + uint16(_dataLength)
-	for readBuffer.GetPos() < _dataEndPos {
-		_item, _err := readBuffer.ReadInt8("", 8)
+
+	// Virtual field
+	isUint16 := bool((actualLength) == (2))
+
+	// Optional Field (valueUint16) (Can be skipped, if a given expression evaluates to false)
+	var valueUint16 *uint16 = nil
+	if isUint16 {
+		_val, _err := readBuffer.ReadUint16("valueUint16", 16)
 		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'data' field")
+			return nil, errors.Wrap(_err, "Error parsing 'valueUint16' field")
 		}
-		data = append(data, _item)
+		valueUint16 = &_val
 	}
-	if closeErr := readBuffer.CloseContext("data", utils.WithRenderAsList(true)); closeErr != nil {
-		return nil, closeErr
+
+	// Virtual field
+	isUint32 := bool((actualLength) == (3))
+
+	// Optional Field (valueUint32) (Can be skipped, if a given expression evaluates to false)
+	var valueUint32 *uint32 = nil
+	if isUint32 {
+		_val, _err := readBuffer.ReadUint32("valueUint32", 32)
+		if _err != nil {
+			return nil, errors.Wrap(_err, "Error parsing 'valueUint32' field")
+		}
+		valueUint32 = &_val
+	}
+
+	// Virtual field
+	isUint64 := bool((actualLength) == (4))
+
+	// Optional Field (valueUint64) (Can be skipped, if a given expression evaluates to false)
+	var valueUint64 *uint64 = nil
+	if isUint64 {
+		_val, _err := readBuffer.ReadUint64("valueUint64", 64)
+		if _err != nil {
+			return nil, errors.Wrap(_err, "Error parsing 'valueUint64' field")
+		}
+		valueUint64 = &_val
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetTagApplicationUnsignedInteger"); closeErr != nil {
@@ -136,8 +202,11 @@ func BACnetTagApplicationUnsignedIntegerParse(readBuffer utils.ReadBuffer, lengt
 
 	// Create a partially initialized instance
 	_child := &BACnetTagApplicationUnsignedInteger{
-		Data:   data,
-		Parent: &BACnetTag{},
+		ValueUint8:  valueUint8,
+		ValueUint16: valueUint16,
+		ValueUint32: valueUint32,
+		ValueUint64: valueUint64,
+		Parent:      &BACnetTag{},
 	}
 	_child.Parent.Child = _child
 	return _child.Parent, nil
@@ -149,19 +218,43 @@ func (m *BACnetTagApplicationUnsignedInteger) Serialize(writeBuffer utils.WriteB
 			return pushErr
 		}
 
-		// Array Field (data)
-		if m.Data != nil {
-			if pushErr := writeBuffer.PushContext("data", utils.WithRenderAsList(true)); pushErr != nil {
-				return pushErr
+		// Optional Field (valueUint8) (Can be skipped, if the value is null)
+		var valueUint8 *uint8 = nil
+		if m.ValueUint8 != nil {
+			valueUint8 = m.ValueUint8
+			_valueUint8Err := writeBuffer.WriteUint8("valueUint8", 8, *(valueUint8))
+			if _valueUint8Err != nil {
+				return errors.Wrap(_valueUint8Err, "Error serializing 'valueUint8' field")
+			}
+		}
+
+		// Optional Field (valueUint16) (Can be skipped, if the value is null)
+		var valueUint16 *uint16 = nil
+		if m.ValueUint16 != nil {
+			valueUint16 = m.ValueUint16
+			_valueUint16Err := writeBuffer.WriteUint16("valueUint16", 16, *(valueUint16))
+			if _valueUint16Err != nil {
+				return errors.Wrap(_valueUint16Err, "Error serializing 'valueUint16' field")
 			}
-			for _, _element := range m.Data {
-				_elementErr := writeBuffer.WriteInt8("", 8, _element)
-				if _elementErr != nil {
-					return errors.Wrap(_elementErr, "Error serializing 'data' field")
-				}
+		}
+
+		// Optional Field (valueUint32) (Can be skipped, if the value is null)
+		var valueUint32 *uint32 = nil
+		if m.ValueUint32 != nil {
+			valueUint32 = m.ValueUint32
+			_valueUint32Err := writeBuffer.WriteUint32("valueUint32", 32, *(valueUint32))
+			if _valueUint32Err != nil {
+				return errors.Wrap(_valueUint32Err, "Error serializing 'valueUint32' field")
 			}
-			if popErr := writeBuffer.PopContext("data", utils.WithRenderAsList(true)); popErr != nil {
-				return popErr
+		}
+
+		// Optional Field (valueUint64) (Can be skipped, if the value is null)
+		var valueUint64 *uint64 = nil
+		if m.ValueUint64 != nil {
+			valueUint64 = m.ValueUint64
+			_valueUint64Err := writeBuffer.WriteUint64("valueUint64", 64, *(valueUint64))
+			if _valueUint64Err != nil {
+				return errors.Wrap(_valueUint64Err, "Error serializing 'valueUint64' field")
 			}
 		}
 
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go
index 0b043a5..5c265af 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go
@@ -21,13 +21,17 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
 
 // The data-structure of this message
 type BACnetUnconfirmedServiceRequestIHave struct {
-	Parent *BACnetUnconfirmedServiceRequest
+	DeviceIdentifier *BACnetTagApplicationObjectIdentifier
+	ObjectIdentifier *BACnetTagApplicationObjectIdentifier
+	ObjectName       *BACnetTagApplicationCharacterString
+	Parent           *BACnetUnconfirmedServiceRequest
 }
 
 // The corresponding interface
@@ -47,9 +51,12 @@ func (m *BACnetUnconfirmedServiceRequestIHave) ServiceChoice() uint8 {
 func (m *BACnetUnconfirmedServiceRequestIHave) InitializeParent(parent *BACnetUnconfirmedServiceRequest) {
 }
 
-func NewBACnetUnconfirmedServiceRequestIHave() *BACnetUnconfirmedServiceRequest {
+func NewBACnetUnconfirmedServiceRequestIHave(deviceIdentifier *BACnetTagApplicationObjectIdentifier, objectIdentifier *BACnetTagApplicationObjectIdentifier, objectName *BACnetTagApplicationCharacterString) *BACnetUnconfirmedServiceRequest {
 	child := &BACnetUnconfirmedServiceRequestIHave{
-		Parent: NewBACnetUnconfirmedServiceRequest(),
+		DeviceIdentifier: deviceIdentifier,
+		ObjectIdentifier: objectIdentifier,
+		ObjectName:       objectName,
+		Parent:           NewBACnetUnconfirmedServiceRequest(),
 	}
 	child.Parent.Child = child
 	return child.Parent
@@ -85,6 +92,15 @@ func (m *BACnetUnconfirmedServiceRequestIHave) LengthInBits() uint16 {
 func (m *BACnetUnconfirmedServiceRequestIHave) LengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.Parent.ParentLengthInBits())
 
+	// Simple field (deviceIdentifier)
+	lengthInBits += m.DeviceIdentifier.LengthInBits()
+
+	// Simple field (objectIdentifier)
+	lengthInBits += m.ObjectIdentifier.LengthInBits()
+
+	// Simple field (objectName)
+	lengthInBits += m.ObjectName.LengthInBits()
+
 	return lengthInBits
 }
 
@@ -97,13 +113,52 @@ func BACnetUnconfirmedServiceRequestIHaveParse(readBuffer utils.ReadBuffer, len
 		return nil, pullErr
 	}
 
+	// Simple Field (deviceIdentifier)
+	if pullErr := readBuffer.PullContext("deviceIdentifier"); pullErr != nil {
+		return nil, pullErr
+	}
+	deviceIdentifier, _deviceIdentifierErr := BACnetTagParse(readBuffer)
+	if _deviceIdentifierErr != nil {
+		return nil, errors.Wrap(_deviceIdentifierErr, "Error parsing 'deviceIdentifier' field")
+	}
+	if closeErr := readBuffer.CloseContext("deviceIdentifier"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Simple Field (objectIdentifier)
+	if pullErr := readBuffer.PullContext("objectIdentifier"); pullErr != nil {
+		return nil, pullErr
+	}
+	objectIdentifier, _objectIdentifierErr := BACnetTagParse(readBuffer)
+	if _objectIdentifierErr != nil {
+		return nil, errors.Wrap(_objectIdentifierErr, "Error parsing 'objectIdentifier' field")
+	}
+	if closeErr := readBuffer.CloseContext("objectIdentifier"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Simple Field (objectName)
+	if pullErr := readBuffer.PullContext("objectName"); pullErr != nil {
+		return nil, pullErr
+	}
+	objectName, _objectNameErr := BACnetTagParse(readBuffer)
+	if _objectNameErr != nil {
+		return nil, errors.Wrap(_objectNameErr, "Error parsing 'objectName' field")
+	}
+	if closeErr := readBuffer.CloseContext("objectName"); closeErr != nil {
+		return nil, closeErr
+	}
+
 	if closeErr := readBuffer.CloseContext("BACnetUnconfirmedServiceRequestIHave"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create a partially initialized instance
 	_child := &BACnetUnconfirmedServiceRequestIHave{
-		Parent: &BACnetUnconfirmedServiceRequest{},
+		DeviceIdentifier: CastBACnetTagApplicationObjectIdentifier(deviceIdentifier),
+		ObjectIdentifier: CastBACnetTagApplicationObjectIdentifier(objectIdentifier),
+		ObjectName:       CastBACnetTagApplicationCharacterString(objectName),
+		Parent:           &BACnetUnconfirmedServiceRequest{},
 	}
 	_child.Parent.Child = _child
 	return _child.Parent, nil
@@ -115,6 +170,42 @@ func (m *BACnetUnconfirmedServiceRequestIHave) Serialize(writeBuffer utils.Write
 			return pushErr
 		}
 
+		// Simple Field (deviceIdentifier)
+		if pushErr := writeBuffer.PushContext("deviceIdentifier"); pushErr != nil {
+			return pushErr
+		}
+		_deviceIdentifierErr := m.DeviceIdentifier.Serialize(writeBuffer)
+		if popErr := writeBuffer.PopContext("deviceIdentifier"); popErr != nil {
+			return popErr
+		}
+		if _deviceIdentifierErr != nil {
+			return errors.Wrap(_deviceIdentifierErr, "Error serializing 'deviceIdentifier' field")
+		}
+
+		// Simple Field (objectIdentifier)
+		if pushErr := writeBuffer.PushContext("objectIdentifier"); pushErr != nil {
+			return pushErr
+		}
+		_objectIdentifierErr := m.ObjectIdentifier.Serialize(writeBuffer)
+		if popErr := writeBuffer.PopContext("objectIdentifier"); popErr != nil {
+			return popErr
+		}
+		if _objectIdentifierErr != nil {
+			return errors.Wrap(_objectIdentifierErr, "Error serializing 'objectIdentifier' field")
+		}
+
+		// Simple Field (objectName)
+		if pushErr := writeBuffer.PushContext("objectName"); pushErr != nil {
+			return pushErr
+		}
+		_objectNameErr := m.ObjectName.Serialize(writeBuffer)
+		if popErr := writeBuffer.PopContext("objectName"); popErr != nil {
+			return popErr
+		}
+		if _objectNameErr != nil {
+			return errors.Wrap(_objectNameErr, "Error serializing 'objectName' field")
+		}
+
 		if popErr := writeBuffer.PopContext("BACnetUnconfirmedServiceRequestIHave"); popErr != nil {
 			return popErr
 		}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
index 03d8d58..51de058 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
@@ -134,7 +134,6 @@ func BACnetUnconfirmedServiceRequestWhoHasParse(readBuffer utils.ReadBuffer, len
 			return nil, pullErr
 		}
 		_val, _err := BACnetComplexTagParse(readBuffer, uint8(0), BACnetDataType_UNSIGNED_INTEGER)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'deviceInstanceRangeLowLimit' field")
@@ -156,7 +155,6 @@ func BACnetUnconfirmedServiceRequestWhoHasParse(readBuffer utils.ReadBuffer, len
 			return nil, pullErr
 		}
 		_val, _err := BACnetComplexTagParse(readBuffer, uint8(1), BACnetDataType_UNSIGNED_INTEGER)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'deviceInstanceRangeHighLimit' field")
@@ -178,7 +176,6 @@ func BACnetUnconfirmedServiceRequestWhoHasParse(readBuffer utils.ReadBuffer, len
 			return nil, pullErr
 		}
 		_val, _err := BACnetComplexTagParse(readBuffer, uint8(2), BACnetDataType_OCTET_STRING)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'objectIdentifier' field")
@@ -200,7 +197,6 @@ func BACnetUnconfirmedServiceRequestWhoHasParse(readBuffer utils.ReadBuffer, len
 			return nil, pullErr
 		}
 		_val, _err := BACnetComplexTagParse(readBuffer, uint8(3), BACnetDataType_OCTET_STRING)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'objectName' field")
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
index fb42eb9..00e167e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
@@ -120,7 +120,6 @@ func BACnetUnconfirmedServiceRequestWhoIsParse(readBuffer utils.ReadBuffer, len
 			return nil, pullErr
 		}
 		_val, _err := BACnetComplexTagParse(readBuffer, uint8(0), BACnetDataType_UNSIGNED_INTEGER)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'deviceInstanceRangeLowLimit' field")
@@ -142,7 +141,6 @@ func BACnetUnconfirmedServiceRequestWhoIsParse(readBuffer utils.ReadBuffer, len
 			return nil, pullErr
 		}
 		_val, _err := BACnetComplexTagParse(readBuffer, uint8(1), BACnetDataType_UNSIGNED_INTEGER)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'deviceInstanceRangeHighLimit' field")
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
index 600e74a..181e94f 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
@@ -318,7 +318,6 @@ func NPDUParse(readBuffer utils.ReadBuffer, npduLength uint16) (*NPDU, error) {
 			return nil, pullErr
 		}
 		_val, _err := NLMParse(readBuffer, uint16(npduLength)-uint16(uint16(uint16(uint16(uint16(uint16(2))+uint16(uint16(utils.InlineIf(sourceSpecified, func() interface{} { return uint16(uint16(uint16(3)) + uint16((*sourceLength))) }, func() interface{} { return uint16(uint16(0)) }).(uint16))))+uint16(uint16(utils.InlineIf(destinationSpecified, func() interface{} { return uint16(uint16(uint16(3)) + uint16((*destinationLength))) }, func() interface{} { return uint16(uint16(0)) }).(uint16))))+ [...]
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'nlm' field")
@@ -340,7 +339,6 @@ func NPDUParse(readBuffer utils.ReadBuffer, npduLength uint16) (*NPDU, error) {
 			return nil, pullErr
 		}
 		_val, _err := APDUParse(readBuffer, uint16(npduLength)-uint16(uint16(uint16(uint16(uint16(uint16(2))+uint16(uint16(utils.InlineIf(sourceSpecified, func() interface{} { return uint16(uint16(uint16(3)) + uint16((*sourceLength))) }, func() interface{} { return uint16(uint16(0)) }).(uint16))))+uint16(uint16(utils.InlineIf(destinationSpecified, func() interface{} { return uint16(uint16(uint16(3)) + uint16((*destinationLength))) }, func() interface{} { return uint16(uint16(0)) }).(uint16)))) [...]
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'apdu' field")
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
index 24fa745..7c4ba39 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
@@ -148,7 +148,6 @@ func ConnectionResponseParse(readBuffer utils.ReadBuffer) (*KnxNetIpMessage, err
 			return nil, pullErr
 		}
 		_val, _err := HPAIDataEndpointParse(readBuffer)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'hpaiDataEndpoint' field")
@@ -170,7 +169,6 @@ func ConnectionResponseParse(readBuffer utils.ReadBuffer) (*KnxNetIpMessage, err
 			return nil, pullErr
 		}
 		_val, _err := ConnectionResponseDataBlockParse(readBuffer)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'connectionResponseDataBlock' field")
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go b/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
index fc83413..965cd6d 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
@@ -183,7 +183,6 @@ func COTPPacketParse(readBuffer utils.ReadBuffer, cotpLen uint16) (*COTPPacket,
 			return nil, pullErr
 		}
 		_val, _err := S7MessageParse(readBuffer)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'payload' field")
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go b/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go
index 00b0eeb..cd25cfb 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go
@@ -207,7 +207,6 @@ func S7MessageParse(readBuffer utils.ReadBuffer) (*S7Message, error) {
 			return nil, pullErr
 		}
 		_val, _err := S7ParameterParse(readBuffer, messageType)
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'parameter' field")
@@ -229,7 +228,6 @@ func S7MessageParse(readBuffer utils.ReadBuffer) (*S7Message, error) {
 			return nil, pullErr
 		}
 		_val, _err := S7PayloadParse(readBuffer, messageType, (parameter))
-
 		switch {
 		case _err != nil && _err != utils.ParseAssertError:
 			return nil, errors.Wrap(_err, "Error parsing 'payload' field")
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index e57e1cf..f71e317 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -283,6 +283,9 @@
             [simple uint 8 vendorId]
         ]
         ['0x01' BACnetUnconfirmedServiceRequestIHave
+            [simple BACnetTagApplicationObjectIdentifier    deviceIdentifier    ]
+            [simple BACnetTagApplicationObjectIdentifier    objectIdentifier    ]
+            [simple BACnetTagApplicationCharacterString     objectName          ]
         ]
         ['0x02' BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification
         ]
@@ -320,75 +323,6 @@
     ]
 ]
 
-[discriminatedType BACnetComplexTag(uint 4 tagNumberArgument, BACnetDataType dataType)
-    [assert        uint 4           tagNumber                 'tagNumberArgument'                                           ]
-    [assert        TagClass         tagClass                  'TagClass.CONTEXT_SPECIFIC_TAGS'                              ]
-    [simple        uint 3           lengthValueType                                                                         ]
-    [optional      uint 8           extTagNumber              'tagNumber == 15'                                             ]
-    [virtual       uint 8           actualTagNumber           'tagNumber < 15 ? tagNumber : extTagNumber'                   ]
-    [virtual       bit              isPrimitiveAndNotBoolean  '!(lengthValueType == 6) && tagNumber != 1'                   ]
-    [optional      uint 8           extLength        'isPrimitiveAndNotBoolean && lengthValueType == 5'                     ]
-    [optional      uint 16          extExtLength     'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 254' ]
-    [optional      uint 32          extExtExtLength  'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 255' ]
-    [virtual       uint 32          actualLength     'lengthValueType == 5 && extLength == 255 ? extExtExtLength : (lengthValueType == 5 && extLength == 254 ? extExtLength : (lengthValueType == 5 ? extLength : (isPrimitiveAndNotBoolean ? lengthValueType : 0)))']
-    [typeSwitch dataType
-        ['NULL' BACnetComplexTagNull
-        ]
-        ['BOOLEAN' BACnetComplexTagBoolean
-        ]
-        ['UNSIGNED_INTEGER' BACnetComplexTagUnsignedInteger(uint 32 actualLength)
-            [virtual    bit     isUint8     'actualLength == 1' ]
-            [optional   uint  8 valueUint8  'isUint8'           ]
-            [virtual    bit     isUint16    'actualLength == 2' ]
-            [optional   uint 16 valueUint16 'isUint16'          ]
-            [virtual    bit     isUint32    'actualLength == 3' ]
-            [optional   uint 32 valueUint32 'isUint32'          ]
-            [virtual    bit     isUint64    'actualLength == 4' ]
-            [optional   uint 64 valueUint64 'isUint64'          ]
-        ]
-        ['SIGNED_INTEGER' BACnetComplexTagSignedInteger(uint 32 actualLength)
-            [virtual    bit     isInt8     'actualLength == 1'  ]
-            [optional   int 8   valueInt8  'isInt8'             ]
-            [virtual    bit     isInt16    'actualLength == 2'  ]
-            [optional   int 16  valueInt16 'isInt16'            ]
-            [virtual    bit     isInt32    'actualLength == 3'  ]
-            [optional   int 32  valueInt32 'isInt32'            ]
-            [virtual    bit     isInt64    'actualLength == 4'  ]
-            [optional   int 64  valueInt64 'isInt64'            ]
-        ]
-        ['REAL' BACnetComplexTagReal(uint 32 actualLength)
-            [simple     float 32 value]
-        ]
-        ['DOUBLE' BACnetComplexTagDouble(uint 32 actualLength)
-            [simple     float 64 value]
-        ]
-        ['OCTET_STRING' BACnetComplexTagOctetString(uint 32 actualLength)
-            // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
-            [virtual    uint     16                   actualLengthInBit 'actualLength * 8']
-            [simple     vstring 'actualLengthInBit'  theString encoding='"ASCII"']
-        ]
-        ['CHARACTER_STRING' BACnetComplexTagCharacterString
-        ]
-        ['BIT_STRING' BACnetComplexTagBitString(uint 32 actualLength)
-            // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
-            [virtual    uint 16                   actualLengthInBit 'actualLength * 8']
-            [simple     uint  8 unusedBits]
-            [array      int   8 data length 'actualLengthInBit']
-        ]
-        ['ENUMERATED' BACnetComplexTagEnumerated(uint 32 actualLength)
-            // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
-            [virtual    uint     16                   actualLengthInBit 'actualLength * 8']
-            [array int 8 data length 'actualLengthInBit']
-        ]
-        ['DATE' BACnetComplexTagDate
-        ]
-        ['TIME' BACnetComplexTagTime
-        ]
-        ['BACNET_OBJECT_IDENTIFIER' BACnetComplexTagObjectIdentifier
-        ]
-    ]
-]
-
 [discriminatedType BACnetServiceAck
     [discriminator   uint 8 serviceChoice]
     [typeSwitch serviceChoice
@@ -556,8 +490,8 @@
     [discriminator TagClass tagClass                                                    ]
     [simple        uint 3   lengthValueType                                             ]
     [optional      uint 8   extTagNumber    'tagNumber == 15'                           ]
-    [virtual       uint 8    actualTagNumber 'tagNumber < 15 ? tagNumber : extTagNumber' ]
-    [virtual       bit       isPrimitiveAndNotBoolean '!(tagClass == TagClass.CONTEXT_SPECIFIC_TAGS && lengthValueType == 6) && tagNumber != 1']
+    [virtual       uint 8   actualTagNumber 'tagNumber < 15 ? tagNumber : extTagNumber' ]
+    [virtual       bit      isPrimitiveAndNotBoolean '!(tagClass == TagClass.CONTEXT_SPECIFIC_TAGS && lengthValueType == 6) && tagNumber != 1']
     [optional      uint 8   extLength       'isPrimitiveAndNotBoolean && lengthValueType == 5'                     ]
     [optional      uint 16  extExtLength    'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 254' ]
     [optional      uint 32  extExtExtLength 'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 255' ]
@@ -567,34 +501,58 @@
         ]
         ['APPLICATION_TAGS','0x1' BACnetTagApplicationBoolean
         ]
-        ['APPLICATION_TAGS','0x2' BACnetTagApplicationUnsignedInteger (uint 3 lengthValueType, uint 8 extLength)
-            [array int 8 data length '(lengthValueType == 5) ? extLength : lengthValueType']
+        ['APPLICATION_TAGS','0x2' BACnetTagApplicationUnsignedInteger(uint 32 actualLength)
+            [virtual    bit     isUint8     'actualLength == 1' ]
+            [optional   uint  8 valueUint8  'isUint8'           ]
+            [virtual    bit     isUint16    'actualLength == 2' ]
+            [optional   uint 16 valueUint16 'isUint16'          ]
+            [virtual    bit     isUint32    'actualLength == 3' ]
+            [optional   uint 32 valueUint32 'isUint32'          ]
+            [virtual    bit     isUint64    'actualLength == 4' ]
+            [optional   uint 64 valueUint64 'isUint64'          ]
         ]
-        ['APPLICATION_TAGS','0x3' BACnetTagApplicationSignedInteger (uint 3 lengthValueType, uint 8 extLength)
-            [array int 8 data length '(lengthValueType == 5) ? extLength : lengthValueType']
+        ['APPLICATION_TAGS','0x3' BACnetTagApplicationSignedInteger(uint 32 actualLength)
+            [virtual    bit     isInt8     'actualLength == 1'  ]
+            [optional   int 8   valueInt8  'isInt8'             ]
+            [virtual    bit     isInt16    'actualLength == 2'  ]
+            [optional   int 16  valueInt16 'isInt16'            ]
+            [virtual    bit     isInt32    'actualLength == 3'  ]
+            [optional   int 32  valueInt32 'isInt32'            ]
+            [virtual    bit     isInt64    'actualLength == 4'  ]
+            [optional   int 64  valueInt64 'isInt64'            ]
         ]
-        ['APPLICATION_TAGS','0x4' BACnetTagApplicationReal (uint 3 lengthValueType, uint 8 extLength)
+        ['APPLICATION_TAGS','0x4' BACnetTagApplicationReal
             [simple float 32 value]
         ]
-        ['APPLICATION_TAGS','0x5' BACnetTagApplicationDouble (uint 3 lengthValueType, uint 8 extLength)
+        ['APPLICATION_TAGS','0x5' BACnetTagApplicationDouble
             [simple float 64 value]
         ]
-        ['APPLICATION_TAGS','0x6' BACnetTagApplicationOctetString
+        ['APPLICATION_TAGS','0x6' BACnetTagApplicationOctetString(uint 32 actualLength)
+            // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
+            [virtual    uint     16                   actualLengthInBit 'actualLength * 8']
+            [simple     vstring 'actualLengthInBit'  value encoding='"ASCII"']
         ]
-        ['APPLICATION_TAGS','0x7' BACnetTagApplicationCharacterString
+        ['APPLICATION_TAGS','0x7' BACnetTagApplicationCharacterString(uint 32 actualLength)
+            [simple     BACnetCharacterEncoding      encoding]
+            // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
+            [virtual    uint     16                  actualLengthInBit 'actualLength * 8']
+            // TODO: call to string on encoding or add type conversion so we can use the enum above
+            [simple     vstring 'actualLengthInBit'  value encoding='"UTF-8"']
         ]
-        ['APPLICATION_TAGS','0x8' BACnetTagApplicationBitString (uint 3 lengthValueType, uint 8 extLength)
+        ['APPLICATION_TAGS','0x8' BACnetTagApplicationBitString(uint 32 actualLength)
             [simple uint 8 unusedBits]
-            [array int 8 data length '(lengthValueType == 5) ? (extLength - 1) : (lengthValueType - 1)']
+            [array int 8 data length 'actualLength']
         ]
-        ['APPLICATION_TAGS','0x9' BACnetTagApplicationEnumerated (uint 3 lengthValueType, uint 8 extLength)
-            [array int 8 data length '(lengthValueType == 5) ? extLength : lengthValueType']
+        ['APPLICATION_TAGS','0x9' BACnetTagApplicationEnumerated(uint 32 actualLength)
+            [array int 8 data length 'actualLength']
         ]
         ['APPLICATION_TAGS','0xA' BACnetTagApplicationDate
         ]
         ['APPLICATION_TAGS','0xB' BACnetTagApplicationTime
         ]
         ['APPLICATION_TAGS','0xC' BACnetTagApplicationObjectIdentifier
+            [simple     uint    10  objectType]
+            [simple     uint    22  instanceNumber]
         ]
         ['CONTEXT_SPECIFIC_TAGS' BACnetTagContext (uint 4 tagNumber, uint 8 extTagNumber, uint 3 lengthValueType, uint 8 extLength)
             [array int 8 data length '(lengthValueType == 5) ? extLength : lengthValueType']
@@ -602,6 +560,82 @@
     ]
 ]
 
+[discriminatedType BACnetComplexTag(uint 4 tagNumberArgument, BACnetDataType dataType)
+    [assert        uint 4           tagNumber                 'tagNumberArgument'                                           ]
+    [assert        TagClass         tagClass                  'TagClass.CONTEXT_SPECIFIC_TAGS'                              ]
+    [simple        uint 3           lengthValueType                                                                         ]
+    [optional      uint 8           extTagNumber              'tagNumber == 15'                                             ]
+    [virtual       uint 8           actualTagNumber           'tagNumber < 15 ? tagNumber : extTagNumber'                   ]
+    [virtual       bit              isPrimitiveAndNotBoolean  '!(lengthValueType == 6) && tagNumber != 1'                   ]
+    [optional      uint 8           extLength        'isPrimitiveAndNotBoolean && lengthValueType == 5'                     ]
+    [optional      uint 16          extExtLength     'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 254' ]
+    [optional      uint 32          extExtExtLength  'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 255' ]
+    [virtual       uint 32          actualLength     'lengthValueType == 5 && extLength == 255 ? extExtExtLength : (lengthValueType == 5 && extLength == 254 ? extExtLength : (lengthValueType == 5 ? extLength : (isPrimitiveAndNotBoolean ? lengthValueType : 0)))']
+    [typeSwitch dataType
+        ['NULL' BACnetComplexTagNull
+        ]
+        ['BOOLEAN' BACnetComplexTagBoolean
+        ]
+        ['UNSIGNED_INTEGER' BACnetComplexTagUnsignedInteger(uint 32 actualLength)
+            [virtual    bit     isUint8     'actualLength == 1' ]
+            [optional   uint  8 valueUint8  'isUint8'           ]
+            [virtual    bit     isUint16    'actualLength == 2' ]
+            [optional   uint 16 valueUint16 'isUint16'          ]
+            [virtual    bit     isUint32    'actualLength == 3' ]
+            [optional   uint 32 valueUint32 'isUint32'          ]
+            [virtual    bit     isUint64    'actualLength == 4' ]
+            [optional   uint 64 valueUint64 'isUint64'          ]
+        ]
+        ['SIGNED_INTEGER' BACnetComplexTagSignedInteger(uint 32 actualLength)
+            [virtual    bit     isInt8     'actualLength == 1'  ]
+            [optional   int 8   valueInt8  'isInt8'             ]
+            [virtual    bit     isInt16    'actualLength == 2'  ]
+            [optional   int 16  valueInt16 'isInt16'            ]
+            [virtual    bit     isInt32    'actualLength == 3'  ]
+            [optional   int 32  valueInt32 'isInt32'            ]
+            [virtual    bit     isInt64    'actualLength == 4'  ]
+            [optional   int 64  valueInt64 'isInt64'            ]
+        ]
+        ['REAL' BACnetComplexTagReal(uint 32 actualLength)
+            [simple     float 32 value]
+        ]
+        ['DOUBLE' BACnetComplexTagDouble(uint 32 actualLength)
+            [simple     float 64 value]
+        ]
+        ['OCTET_STRING' BACnetComplexTagOctetString(uint 32 actualLength)
+            // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
+            [virtual    uint     16                   actualLengthInBit 'actualLength * 8']
+            [simple     vstring 'actualLengthInBit'  value encoding='"ASCII"']
+        ]
+        ['CHARACTER_STRING' BACnetComplexTagCharacterString(uint 32 actualLength)
+            [simple     BACnetCharacterEncoding      encoding]
+            // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
+            [virtual    uint     16                  actualLengthInBit 'actualLength * 8']
+            // TODO: call to string on encoding or add type conversion so we can use the enum above
+            [simple     vstring 'actualLengthInBit'  value encoding='"UTF-8"']
+        ]
+        ['BIT_STRING' BACnetComplexTagBitString(uint 32 actualLength)
+            // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
+            [virtual    uint 16                   actualLengthInBit 'actualLength * 8']
+            [simple     uint  8 unusedBits]
+            [array      int   8 data length 'actualLengthInBit']
+        ]
+        ['ENUMERATED' BACnetComplexTagEnumerated(uint 32 actualLength)
+            // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
+            [virtual    uint     16                   actualLengthInBit 'actualLength * 8']
+            [array int 8 data length 'actualLengthInBit']
+        ]
+        ['DATE' BACnetComplexTagDate
+        ]
+        ['TIME' BACnetComplexTagTime
+        ]
+        ['BACNET_OBJECT_IDENTIFIER' BACnetComplexTagObjectIdentifier
+            [simple     uint    10  objectType]
+            [simple     uint    22  instanceNumber]
+        ]
+    ]
+]
+
 [enum uint 1 TagClass
     ['0x0' APPLICATION_TAGS]
     ['0x1' CONTEXT_SPECIFIC_TAGS]
@@ -623,6 +657,15 @@
     ['0xC' BACNET_OBJECT_IDENTIFIER]
 ]
 
+[enum byte BACnetCharacterEncoding
+    ['0x0' ISO_10646] // UTF-8
+    ['0x1' IBM_Microsoft_DBCS]
+    ['0x2' JIS_X_0208]
+    ['0x3' ISO_10646_4] // (UCS-4)
+    ['0x4' ISO_10646_2] //(UCS-2)
+    ['0x5' ISO_8859_1]
+]
+
 [enum uint 4 BACnetNetworkType
     ['0x0' ETHERNET]
     ['0x1' ARCNET]

[plc4x] 02/02: fix(bacnet): substract encoding field from length

Posted by sr...@apache.org.
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 aa31014b664430f5517074fdd126c0fa2e9f3f42
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Nov 30 11:02:07 2021 +0100

    fix(bacnet): substract encoding field from length
---
 .../bacnetip/readwrite/model/BACnetComplexTagCharacterString.go       | 2 +-
 .../bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go   | 2 +-
 .../bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec     | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagCharacterString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagCharacterString.go
index 6e24ed8..c074ead 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagCharacterString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetComplexTagCharacterString.go
@@ -131,7 +131,7 @@ func BACnetComplexTagCharacterStringParse(readBuffer utils.ReadBuffer, tagNumber
 	}
 
 	// Virtual field
-	actualLengthInBit := uint16(actualLength) * uint16(uint16(8))
+	actualLengthInBit := uint16(uint16(actualLength)*uint16(uint16(8))) - uint16(uint16(8))
 
 	// Simple Field (value)
 	value, _valueErr := readBuffer.ReadString("value", uint32(actualLengthInBit))
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
index ff31f2d..bbd4c9b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
@@ -130,7 +130,7 @@ func BACnetTagApplicationCharacterStringParse(readBuffer utils.ReadBuffer, actua
 	}
 
 	// Virtual field
-	actualLengthInBit := uint16(actualLength) * uint16(uint16(8))
+	actualLengthInBit := uint16(uint16(actualLength)*uint16(uint16(8))) - uint16(uint16(8))
 
 	// Simple Field (value)
 	value, _valueErr := readBuffer.ReadString("value", uint32(actualLengthInBit))
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index f71e317..5b11715 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -535,7 +535,7 @@
         ['APPLICATION_TAGS','0x7' BACnetTagApplicationCharacterString(uint 32 actualLength)
             [simple     BACnetCharacterEncoding      encoding]
             // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
-            [virtual    uint     16                  actualLengthInBit 'actualLength * 8']
+            [virtual    uint     16                  actualLengthInBit 'actualLength * 8 - 8']
             // TODO: call to string on encoding or add type conversion so we can use the enum above
             [simple     vstring 'actualLengthInBit'  value encoding='"UTF-8"']
         ]
@@ -610,7 +610,7 @@
         ['CHARACTER_STRING' BACnetComplexTagCharacterString(uint 32 actualLength)
             [simple     BACnetCharacterEncoding      encoding]
             // TODO: The reader expects int but uint32 gets mapped to long so even uint32 would easily overflow...
-            [virtual    uint     16                  actualLengthInBit 'actualLength * 8']
+            [virtual    uint     16                  actualLengthInBit 'actualLength * 8 - 8']
             // TODO: call to string on encoding or add type conversion so we can use the enum above
             [simple     vstring 'actualLengthInBit'  value encoding='"UTF-8"']
         ]