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 2022/05/17 11:16:07 UTC

[plc4x] branch develop updated: feat(bacnet): implemented BACnetConfirmedServiceRequestCreateObject and BACnetConfirmedServiceRequestDeleteObject

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


The following commit(s) were added to refs/heads/develop by this push:
     new 4a78124dcb feat(bacnet): implemented BACnetConfirmedServiceRequestCreateObject and BACnetConfirmedServiceRequestDeleteObject
4a78124dcb is described below

commit 4a78124dcbc0d4b1e8db88150e1c57e783a34d09
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue May 17 13:16:00 2022 +0200

    feat(bacnet): implemented BACnetConfirmedServiceRequestCreateObject and BACnetConfirmedServiceRequestDeleteObject
    
    + fix: fix issue in plc4go with inline if
---
 .../language/go/GoLanguageTemplateHelper.java      |   8 +-
 .../plc4go/bacnetip/readwrite/ParserHelper.go      |   6 +
 .../plc4go/bacnetip/readwrite/XmlParserHelper.go   |   7 +
 .../BACnetConfirmedServiceRequestCreateObject.go   | 103 +++++-
 ...medServiceRequestCreateObjectObjectSpecifier.go | 374 +++++++++++++++++++++
 .../BACnetConfirmedServiceRequestDeleteObject.go   |  51 ++-
 .../bacnetip/readwrite/model/StaticHelper.go       |   8 +
 .../bacnetip/readwrite/utils/StaticHelper.java     |   7 +
 .../resources/protocols/bacnetip/bacnetip.mspec    |  24 +-
 9 files changed, 574 insertions(+), 14 deletions(-)

diff --git a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index 6dbbda4939..e4c6f6aad1 100644
--- a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -586,9 +586,13 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             Term b = ternaryTerm.getB();
             Term c = ternaryTerm.getC();
             String castExpressionForTypeReference = getCastExpressionForTypeReference(fieldType);
-            return tracer + "utils.InlineIf(" + toExpression(field, new DefaultBooleanTypeReference(), a, parserArguments, serializerArguments, serialize, false) + ", " +
+            String inlineIf = "utils.InlineIf(" + toExpression(field, new DefaultBooleanTypeReference(), a, parserArguments, serializerArguments, serialize, false) + ", " +
                 "func() interface{} {return " + castExpressionForTypeReference + "(" + toExpression(field, fieldType, b, parserArguments, serializerArguments, serialize, false) + ")}, " +
-                "func() interface{} {return " + castExpressionForTypeReference + "(" + toExpression(field, fieldType, c, parserArguments, serializerArguments, serialize, false) + ")}).(" + castExpressionForTypeReference + ")";
+                "func() interface{} {return " + castExpressionForTypeReference + "(" + toExpression(field, fieldType, c, parserArguments, serializerArguments, serialize, false) + ")})";
+            if (fieldType.isNonSimpleTypeReference()) {
+                return tracer.dive("nonsimpletypereference") + castExpressionForTypeReference + "(" + inlineIf + ")";
+            }
+            return tracer + inlineIf + ".(" + castExpressionForTypeReference + ")";
         } else {
             throw new RuntimeException("Unsupported ternary operation type " + ternaryTerm.getOperation());
         }
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
index f726f74087..7d60baf09d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
@@ -340,6 +340,12 @@ func (m BacnetipParserHelper) Parse(typeName string, arguments []string, io util
 		return model.BACnetBinaryPVParse(io, tagNumber)
 	case "ListOfCovNotifications":
 		return model.ListOfCovNotificationsParse(io)
+	case "BACnetConfirmedServiceRequestCreateObjectObjectSpecifier":
+		tagNumber, err := utils.StrToUint8(arguments[0])
+		if err != nil {
+			return nil, errors.Wrap(err, "Error parsing")
+		}
+		return model.BACnetConfirmedServiceRequestCreateObjectObjectSpecifierParse(io, tagNumber)
 	case "Error":
 		return model.ErrorParse(io)
 	case "BACnetAction":
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
index 76fb3efd43..43ccdde26f 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
@@ -389,6 +389,13 @@ func (m BacnetipXmlParserHelper) Parse(typeName string, xmlString string, parser
 		return model.BACnetBinaryPVParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), tagNumber)
 	case "ListOfCovNotifications":
 		return model.ListOfCovNotificationsParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+	case "BACnetConfirmedServiceRequestCreateObjectObjectSpecifier":
+		parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 8)
+		if err != nil {
+			return nil, err
+		}
+		tagNumber := uint8(parsedUint0)
+		return model.BACnetConfirmedServiceRequestCreateObjectObjectSpecifierParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), tagNumber)
 	case "Error":
 		return model.ErrorParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "BACnetAction":
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
index b97499bcb0..67e3f99b98 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
@@ -21,6 +21,8 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
+	"io"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
@@ -28,6 +30,8 @@ import (
 // BACnetConfirmedServiceRequestCreateObject is the data-structure of this message
 type BACnetConfirmedServiceRequestCreateObject struct {
 	*BACnetConfirmedServiceRequest
+	ObjectSpecifier *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier
+	ListOfValues    *BACnetPropertyValues
 
 	// Arguments.
 	ServiceRequestLength uint16
@@ -36,6 +40,10 @@ type BACnetConfirmedServiceRequestCreateObject struct {
 // IBACnetConfirmedServiceRequestCreateObject is the corresponding interface of BACnetConfirmedServiceRequestCreateObject
 type IBACnetConfirmedServiceRequestCreateObject interface {
 	IBACnetConfirmedServiceRequest
+	// GetObjectSpecifier returns ObjectSpecifier (property field)
+	GetObjectSpecifier() *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier
+	// GetListOfValues returns ListOfValues (property field)
+	GetListOfValues() *BACnetPropertyValues
 	// GetLengthInBytes returns the length in bytes
 	GetLengthInBytes() uint16
 	// GetLengthInBits returns the length in bits
@@ -65,9 +73,29 @@ func (m *BACnetConfirmedServiceRequestCreateObject) GetParent() *BACnetConfirmed
 	return m.BACnetConfirmedServiceRequest
 }
 
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestCreateObject) GetObjectSpecifier() *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier {
+	return m.ObjectSpecifier
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObject) GetListOfValues() *BACnetPropertyValues {
+	return m.ListOfValues
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
 // NewBACnetConfirmedServiceRequestCreateObject factory function for BACnetConfirmedServiceRequestCreateObject
-func NewBACnetConfirmedServiceRequestCreateObject(serviceRequestLength uint16) *BACnetConfirmedServiceRequestCreateObject {
+func NewBACnetConfirmedServiceRequestCreateObject(objectSpecifier *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier, listOfValues *BACnetPropertyValues, serviceRequestLength uint16) *BACnetConfirmedServiceRequestCreateObject {
 	_result := &BACnetConfirmedServiceRequestCreateObject{
+		ObjectSpecifier:               objectSpecifier,
+		ListOfValues:                  listOfValues,
 		BACnetConfirmedServiceRequest: NewBACnetConfirmedServiceRequest(serviceRequestLength),
 	}
 	_result.Child = _result
@@ -101,6 +129,14 @@ func (m *BACnetConfirmedServiceRequestCreateObject) GetLengthInBits() uint16 {
 func (m *BACnetConfirmedServiceRequestCreateObject) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
+	// Simple field (objectSpecifier)
+	lengthInBits += m.ObjectSpecifier.GetLengthInBits()
+
+	// Optional Field (listOfValues)
+	if m.ListOfValues != nil {
+		lengthInBits += (*m.ListOfValues).GetLengthInBits()
+	}
+
 	return lengthInBits
 }
 
@@ -117,9 +153,38 @@ func BACnetConfirmedServiceRequestCreateObjectParse(readBuffer utils.ReadBuffer,
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Validation
-	if !(bool((1) == (2))) {
-		return nil, utils.ParseValidationError{"TODO: implement me"}
+	// Simple Field (objectSpecifier)
+	if pullErr := readBuffer.PullContext("objectSpecifier"); pullErr != nil {
+		return nil, pullErr
+	}
+	_objectSpecifier, _objectSpecifierErr := BACnetConfirmedServiceRequestCreateObjectObjectSpecifierParse(readBuffer, uint8(uint8(0)))
+	if _objectSpecifierErr != nil {
+		return nil, errors.Wrap(_objectSpecifierErr, "Error parsing 'objectSpecifier' field")
+	}
+	objectSpecifier := CastBACnetConfirmedServiceRequestCreateObjectObjectSpecifier(_objectSpecifier)
+	if closeErr := readBuffer.CloseContext("objectSpecifier"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Optional Field (listOfValues) (Can be skipped, if a given expression evaluates to false)
+	var listOfValues *BACnetPropertyValues = nil
+	{
+		currentPos = positionAware.GetPos()
+		if pullErr := readBuffer.PullContext("listOfValues"); pullErr != nil {
+			return nil, pullErr
+		}
+		_val, _err := BACnetPropertyValuesParse(readBuffer, uint8(1), CastBACnetObjectType(utils.InlineIf(objectSpecifier.GetIsObjectType(), func() interface{} { return CastBACnetObjectType(objectSpecifier.GetObjectType()) }, func() interface{} { return CastBACnetObjectType(objectSpecifier.GetObjectIdentifier().GetObjectType()) })))
+		switch {
+		case errors.Is(_err, utils.ParseAssertError{}) || errors.Is(_err, io.EOF):
+			readBuffer.Reset(currentPos)
+		case _err != nil:
+			return nil, errors.Wrap(_err, "Error parsing 'listOfValues' field")
+		default:
+			listOfValues = CastBACnetPropertyValues(_val)
+			if closeErr := readBuffer.CloseContext("listOfValues"); closeErr != nil {
+				return nil, closeErr
+			}
+		}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestCreateObject"); closeErr != nil {
@@ -128,6 +193,8 @@ func BACnetConfirmedServiceRequestCreateObjectParse(readBuffer utils.ReadBuffer,
 
 	// Create a partially initialized instance
 	_child := &BACnetConfirmedServiceRequestCreateObject{
+		ObjectSpecifier:               CastBACnetConfirmedServiceRequestCreateObjectObjectSpecifier(objectSpecifier),
+		ListOfValues:                  CastBACnetPropertyValues(listOfValues),
 		BACnetConfirmedServiceRequest: &BACnetConfirmedServiceRequest{},
 	}
 	_child.BACnetConfirmedServiceRequest.Child = _child
@@ -142,6 +209,34 @@ func (m *BACnetConfirmedServiceRequestCreateObject) Serialize(writeBuffer utils.
 			return pushErr
 		}
 
+		// Simple Field (objectSpecifier)
+		if pushErr := writeBuffer.PushContext("objectSpecifier"); pushErr != nil {
+			return pushErr
+		}
+		_objectSpecifierErr := m.ObjectSpecifier.Serialize(writeBuffer)
+		if popErr := writeBuffer.PopContext("objectSpecifier"); popErr != nil {
+			return popErr
+		}
+		if _objectSpecifierErr != nil {
+			return errors.Wrap(_objectSpecifierErr, "Error serializing 'objectSpecifier' field")
+		}
+
+		// Optional Field (listOfValues) (Can be skipped, if the value is null)
+		var listOfValues *BACnetPropertyValues = nil
+		if m.ListOfValues != nil {
+			if pushErr := writeBuffer.PushContext("listOfValues"); pushErr != nil {
+				return pushErr
+			}
+			listOfValues = m.ListOfValues
+			_listOfValuesErr := listOfValues.Serialize(writeBuffer)
+			if popErr := writeBuffer.PopContext("listOfValues"); popErr != nil {
+				return popErr
+			}
+			if _listOfValuesErr != nil {
+				return errors.Wrap(_listOfValuesErr, "Error serializing 'listOfValues' field")
+			}
+		}
+
 		if popErr := writeBuffer.PopContext("BACnetConfirmedServiceRequestCreateObject"); popErr != nil {
 			return popErr
 		}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObjectObjectSpecifier.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObjectObjectSpecifier.go
new file mode 100644
index 0000000000..0a82136573
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObjectObjectSpecifier.go
@@ -0,0 +1,374 @@
+/*
+ * 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"
+	"io"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// BACnetConfirmedServiceRequestCreateObjectObjectSpecifier is the data-structure of this message
+type BACnetConfirmedServiceRequestCreateObjectObjectSpecifier struct {
+	OpeningTag       *BACnetOpeningTag
+	RawObjectType    *BACnetContextTagEnumerated
+	ObjectIdentifier *BACnetContextTagObjectIdentifier
+	ClosingTag       *BACnetClosingTag
+
+	// Arguments.
+	TagNumber uint8
+}
+
+// IBACnetConfirmedServiceRequestCreateObjectObjectSpecifier is the corresponding interface of BACnetConfirmedServiceRequestCreateObjectObjectSpecifier
+type IBACnetConfirmedServiceRequestCreateObjectObjectSpecifier interface {
+	// GetOpeningTag returns OpeningTag (property field)
+	GetOpeningTag() *BACnetOpeningTag
+	// GetRawObjectType returns RawObjectType (property field)
+	GetRawObjectType() *BACnetContextTagEnumerated
+	// GetObjectIdentifier returns ObjectIdentifier (property field)
+	GetObjectIdentifier() *BACnetContextTagObjectIdentifier
+	// GetClosingTag returns ClosingTag (property field)
+	GetClosingTag() *BACnetClosingTag
+	// GetIsObjectType returns IsObjectType (virtual field)
+	GetIsObjectType() bool
+	// GetObjectType returns ObjectType (virtual field)
+	GetObjectType() BACnetObjectType
+	// GetIsObjectIdentifier returns IsObjectIdentifier (virtual field)
+	GetIsObjectIdentifier() bool
+	// GetLengthInBytes returns the length in bytes
+	GetLengthInBytes() uint16
+	// GetLengthInBits returns the length in bits
+	GetLengthInBits() uint16
+	// Serialize serializes this type
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetOpeningTag() *BACnetOpeningTag {
+	return m.OpeningTag
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetRawObjectType() *BACnetContextTagEnumerated {
+	return m.RawObjectType
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetObjectIdentifier() *BACnetContextTagObjectIdentifier {
+	return m.ObjectIdentifier
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetClosingTag() *BACnetClosingTag {
+	return m.ClosingTag
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for virtual fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetIsObjectType() bool {
+	rawObjectType := m.RawObjectType
+	_ = rawObjectType
+	objectIdentifier := m.ObjectIdentifier
+	_ = objectIdentifier
+	return bool(bool((m.GetRawObjectType()) != (nil)))
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetObjectType() BACnetObjectType {
+	rawObjectType := m.RawObjectType
+	_ = rawObjectType
+	objectIdentifier := m.ObjectIdentifier
+	_ = objectIdentifier
+	return BACnetObjectType(MapBACnetObjectType((*m.GetRawObjectType())))
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetIsObjectIdentifier() bool {
+	rawObjectType := m.RawObjectType
+	_ = rawObjectType
+	objectIdentifier := m.ObjectIdentifier
+	_ = objectIdentifier
+	return bool(bool((m.GetObjectIdentifier()) != (nil)))
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewBACnetConfirmedServiceRequestCreateObjectObjectSpecifier factory function for BACnetConfirmedServiceRequestCreateObjectObjectSpecifier
+func NewBACnetConfirmedServiceRequestCreateObjectObjectSpecifier(openingTag *BACnetOpeningTag, rawObjectType *BACnetContextTagEnumerated, objectIdentifier *BACnetContextTagObjectIdentifier, closingTag *BACnetClosingTag, tagNumber uint8) *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier {
+	return &BACnetConfirmedServiceRequestCreateObjectObjectSpecifier{OpeningTag: openingTag, RawObjectType: rawObjectType, ObjectIdentifier: objectIdentifier, ClosingTag: closingTag, TagNumber: tagNumber}
+}
+
+func CastBACnetConfirmedServiceRequestCreateObjectObjectSpecifier(structType interface{}) *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier {
+	if casted, ok := structType.(BACnetConfirmedServiceRequestCreateObjectObjectSpecifier); ok {
+		return &casted
+	}
+	if casted, ok := structType.(*BACnetConfirmedServiceRequestCreateObjectObjectSpecifier); ok {
+		return casted
+	}
+	return nil
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetTypeName() string {
+	return "BACnetConfirmedServiceRequestCreateObjectObjectSpecifier"
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(0)
+
+	// Simple field (openingTag)
+	lengthInBits += m.OpeningTag.GetLengthInBits()
+
+	// Optional Field (rawObjectType)
+	if m.RawObjectType != nil {
+		lengthInBits += (*m.RawObjectType).GetLengthInBits()
+	}
+
+	// A virtual field doesn't have any in- or output.
+
+	// A virtual field doesn't have any in- or output.
+
+	// Optional Field (objectIdentifier)
+	if m.ObjectIdentifier != nil {
+		lengthInBits += (*m.ObjectIdentifier).GetLengthInBits()
+	}
+
+	// A virtual field doesn't have any in- or output.
+
+	// Simple field (closingTag)
+	lengthInBits += m.ClosingTag.GetLengthInBits()
+
+	return lengthInBits
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func BACnetConfirmedServiceRequestCreateObjectObjectSpecifierParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetConfirmedServiceRequestCreateObjectObjectSpecifier, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("BACnetConfirmedServiceRequestCreateObjectObjectSpecifier"); pullErr != nil {
+		return nil, pullErr
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+
+	// Simple Field (openingTag)
+	if pullErr := readBuffer.PullContext("openingTag"); pullErr != nil {
+		return nil, pullErr
+	}
+	_openingTag, _openingTagErr := BACnetContextTagParse(readBuffer, uint8(tagNumber), BACnetDataType(BACnetDataType_OPENING_TAG))
+	if _openingTagErr != nil {
+		return nil, errors.Wrap(_openingTagErr, "Error parsing 'openingTag' field")
+	}
+	openingTag := CastBACnetOpeningTag(_openingTag)
+	if closeErr := readBuffer.CloseContext("openingTag"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Optional Field (rawObjectType) (Can be skipped, if a given expression evaluates to false)
+	var rawObjectType *BACnetContextTagEnumerated = nil
+	{
+		currentPos = positionAware.GetPos()
+		if pullErr := readBuffer.PullContext("rawObjectType"); pullErr != nil {
+			return nil, pullErr
+		}
+		_val, _err := BACnetContextTagParse(readBuffer, uint8(0), BACnetDataType_ENUMERATED)
+		switch {
+		case errors.Is(_err, utils.ParseAssertError{}) || errors.Is(_err, io.EOF):
+			readBuffer.Reset(currentPos)
+		case _err != nil:
+			return nil, errors.Wrap(_err, "Error parsing 'rawObjectType' field")
+		default:
+			rawObjectType = CastBACnetContextTagEnumerated(_val)
+			if closeErr := readBuffer.CloseContext("rawObjectType"); closeErr != nil {
+				return nil, closeErr
+			}
+		}
+	}
+
+	// Virtual field
+	_isObjectType := bool((rawObjectType) != (nil))
+	isObjectType := bool(_isObjectType)
+	_ = isObjectType
+
+	// Virtual field
+	_objectType := MapBACnetObjectType((*rawObjectType))
+	objectType := BACnetObjectType(_objectType)
+	_ = objectType
+
+	// Optional Field (objectIdentifier) (Can be skipped, if a given expression evaluates to false)
+	var objectIdentifier *BACnetContextTagObjectIdentifier = nil
+	{
+		currentPos = positionAware.GetPos()
+		if pullErr := readBuffer.PullContext("objectIdentifier"); pullErr != nil {
+			return nil, pullErr
+		}
+		_val, _err := BACnetContextTagParse(readBuffer, uint8(1), BACnetDataType_BACNET_OBJECT_IDENTIFIER)
+		switch {
+		case errors.Is(_err, utils.ParseAssertError{}) || errors.Is(_err, io.EOF):
+			readBuffer.Reset(currentPos)
+		case _err != nil:
+			return nil, errors.Wrap(_err, "Error parsing 'objectIdentifier' field")
+		default:
+			objectIdentifier = CastBACnetContextTagObjectIdentifier(_val)
+			if closeErr := readBuffer.CloseContext("objectIdentifier"); closeErr != nil {
+				return nil, closeErr
+			}
+		}
+	}
+
+	// Virtual field
+	_isObjectIdentifier := bool((objectIdentifier) != (nil))
+	isObjectIdentifier := bool(_isObjectIdentifier)
+	_ = isObjectIdentifier
+
+	// Validation
+	if !(bool(isObjectType) || bool(isObjectIdentifier)) {
+		return nil, utils.ParseValidationError{"either we need a objectType or a objectIdentifier"}
+	}
+
+	// Simple Field (closingTag)
+	if pullErr := readBuffer.PullContext("closingTag"); pullErr != nil {
+		return nil, pullErr
+	}
+	_closingTag, _closingTagErr := BACnetContextTagParse(readBuffer, uint8(tagNumber), BACnetDataType(BACnetDataType_CLOSING_TAG))
+	if _closingTagErr != nil {
+		return nil, errors.Wrap(_closingTagErr, "Error parsing 'closingTag' field")
+	}
+	closingTag := CastBACnetClosingTag(_closingTag)
+	if closeErr := readBuffer.CloseContext("closingTag"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestCreateObjectObjectSpecifier"); closeErr != nil {
+		return nil, closeErr
+	}
+
+	// Create the instance
+	return NewBACnetConfirmedServiceRequestCreateObjectObjectSpecifier(openingTag, rawObjectType, objectIdentifier, closingTag, tagNumber), nil
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	if pushErr := writeBuffer.PushContext("BACnetConfirmedServiceRequestCreateObjectObjectSpecifier"); pushErr != nil {
+		return pushErr
+	}
+
+	// Simple Field (openingTag)
+	if pushErr := writeBuffer.PushContext("openingTag"); pushErr != nil {
+		return pushErr
+	}
+	_openingTagErr := m.OpeningTag.Serialize(writeBuffer)
+	if popErr := writeBuffer.PopContext("openingTag"); popErr != nil {
+		return popErr
+	}
+	if _openingTagErr != nil {
+		return errors.Wrap(_openingTagErr, "Error serializing 'openingTag' field")
+	}
+
+	// Optional Field (rawObjectType) (Can be skipped, if the value is null)
+	var rawObjectType *BACnetContextTagEnumerated = nil
+	if m.RawObjectType != nil {
+		if pushErr := writeBuffer.PushContext("rawObjectType"); pushErr != nil {
+			return pushErr
+		}
+		rawObjectType = m.RawObjectType
+		_rawObjectTypeErr := rawObjectType.Serialize(writeBuffer)
+		if popErr := writeBuffer.PopContext("rawObjectType"); popErr != nil {
+			return popErr
+		}
+		if _rawObjectTypeErr != nil {
+			return errors.Wrap(_rawObjectTypeErr, "Error serializing 'rawObjectType' field")
+		}
+	}
+	// Virtual field
+	if _isObjectTypeErr := writeBuffer.WriteVirtual("isObjectType", m.GetIsObjectType()); _isObjectTypeErr != nil {
+		return errors.Wrap(_isObjectTypeErr, "Error serializing 'isObjectType' field")
+	}
+	// Virtual field
+	if _objectTypeErr := writeBuffer.WriteVirtual("objectType", m.GetObjectType()); _objectTypeErr != nil {
+		return errors.Wrap(_objectTypeErr, "Error serializing 'objectType' field")
+	}
+
+	// Optional Field (objectIdentifier) (Can be skipped, if the value is null)
+	var objectIdentifier *BACnetContextTagObjectIdentifier = nil
+	if m.ObjectIdentifier != nil {
+		if pushErr := writeBuffer.PushContext("objectIdentifier"); pushErr != nil {
+			return pushErr
+		}
+		objectIdentifier = m.ObjectIdentifier
+		_objectIdentifierErr := objectIdentifier.Serialize(writeBuffer)
+		if popErr := writeBuffer.PopContext("objectIdentifier"); popErr != nil {
+			return popErr
+		}
+		if _objectIdentifierErr != nil {
+			return errors.Wrap(_objectIdentifierErr, "Error serializing 'objectIdentifier' field")
+		}
+	}
+	// Virtual field
+	if _isObjectIdentifierErr := writeBuffer.WriteVirtual("isObjectIdentifier", m.GetIsObjectIdentifier()); _isObjectIdentifierErr != nil {
+		return errors.Wrap(_isObjectIdentifierErr, "Error serializing 'isObjectIdentifier' field")
+	}
+
+	// Simple Field (closingTag)
+	if pushErr := writeBuffer.PushContext("closingTag"); pushErr != nil {
+		return pushErr
+	}
+	_closingTagErr := m.ClosingTag.Serialize(writeBuffer)
+	if popErr := writeBuffer.PopContext("closingTag"); popErr != nil {
+		return popErr
+	}
+	if _closingTagErr != nil {
+		return errors.Wrap(_closingTagErr, "Error serializing 'closingTag' field")
+	}
+
+	if popErr := writeBuffer.PopContext("BACnetConfirmedServiceRequestCreateObjectObjectSpecifier"); popErr != nil {
+		return popErr
+	}
+	return nil
+}
+
+func (m *BACnetConfirmedServiceRequestCreateObjectObjectSpecifier) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	buffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := m.Serialize(buffer); err != nil {
+		return err.Error()
+	}
+	return buffer.GetBox().String()
+}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
index 980c54e102..064c2cc616 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/pkg/errors"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
@@ -28,6 +29,7 @@ import (
 // BACnetConfirmedServiceRequestDeleteObject is the data-structure of this message
 type BACnetConfirmedServiceRequestDeleteObject struct {
 	*BACnetConfirmedServiceRequest
+	ObjectIdentifier *BACnetApplicationTagObjectIdentifier
 
 	// Arguments.
 	ServiceRequestLength uint16
@@ -36,6 +38,8 @@ type BACnetConfirmedServiceRequestDeleteObject struct {
 // IBACnetConfirmedServiceRequestDeleteObject is the corresponding interface of BACnetConfirmedServiceRequestDeleteObject
 type IBACnetConfirmedServiceRequestDeleteObject interface {
 	IBACnetConfirmedServiceRequest
+	// GetObjectIdentifier returns ObjectIdentifier (property field)
+	GetObjectIdentifier() *BACnetApplicationTagObjectIdentifier
 	// GetLengthInBytes returns the length in bytes
 	GetLengthInBytes() uint16
 	// GetLengthInBits returns the length in bits
@@ -65,9 +69,24 @@ func (m *BACnetConfirmedServiceRequestDeleteObject) GetParent() *BACnetConfirmed
 	return m.BACnetConfirmedServiceRequest
 }
 
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestDeleteObject) GetObjectIdentifier() *BACnetApplicationTagObjectIdentifier {
+	return m.ObjectIdentifier
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
 // NewBACnetConfirmedServiceRequestDeleteObject factory function for BACnetConfirmedServiceRequestDeleteObject
-func NewBACnetConfirmedServiceRequestDeleteObject(serviceRequestLength uint16) *BACnetConfirmedServiceRequestDeleteObject {
+func NewBACnetConfirmedServiceRequestDeleteObject(objectIdentifier *BACnetApplicationTagObjectIdentifier, serviceRequestLength uint16) *BACnetConfirmedServiceRequestDeleteObject {
 	_result := &BACnetConfirmedServiceRequestDeleteObject{
+		ObjectIdentifier:              objectIdentifier,
 		BACnetConfirmedServiceRequest: NewBACnetConfirmedServiceRequest(serviceRequestLength),
 	}
 	_result.Child = _result
@@ -101,6 +120,9 @@ func (m *BACnetConfirmedServiceRequestDeleteObject) GetLengthInBits() uint16 {
 func (m *BACnetConfirmedServiceRequestDeleteObject) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
+	// Simple field (objectIdentifier)
+	lengthInBits += m.ObjectIdentifier.GetLengthInBits()
+
 	return lengthInBits
 }
 
@@ -117,9 +139,17 @@ func BACnetConfirmedServiceRequestDeleteObjectParse(readBuffer utils.ReadBuffer,
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Validation
-	if !(bool((1) == (2))) {
-		return nil, utils.ParseValidationError{"TODO: implement me"}
+	// Simple Field (objectIdentifier)
+	if pullErr := readBuffer.PullContext("objectIdentifier"); pullErr != nil {
+		return nil, pullErr
+	}
+	_objectIdentifier, _objectIdentifierErr := BACnetApplicationTagParse(readBuffer)
+	if _objectIdentifierErr != nil {
+		return nil, errors.Wrap(_objectIdentifierErr, "Error parsing 'objectIdentifier' field")
+	}
+	objectIdentifier := CastBACnetApplicationTagObjectIdentifier(_objectIdentifier)
+	if closeErr := readBuffer.CloseContext("objectIdentifier"); closeErr != nil {
+		return nil, closeErr
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestDeleteObject"); closeErr != nil {
@@ -128,6 +158,7 @@ func BACnetConfirmedServiceRequestDeleteObjectParse(readBuffer utils.ReadBuffer,
 
 	// Create a partially initialized instance
 	_child := &BACnetConfirmedServiceRequestDeleteObject{
+		ObjectIdentifier:              CastBACnetApplicationTagObjectIdentifier(objectIdentifier),
 		BACnetConfirmedServiceRequest: &BACnetConfirmedServiceRequest{},
 	}
 	_child.BACnetConfirmedServiceRequest.Child = _child
@@ -142,6 +173,18 @@ func (m *BACnetConfirmedServiceRequestDeleteObject) Serialize(writeBuffer utils.
 			return pushErr
 		}
 
+		// 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")
+		}
+
 		if popErr := writeBuffer.PopContext("BACnetConfirmedServiceRequestDeleteObject"); popErr != nil {
 			return popErr
 		}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
index e6ddbfc15e..aaea839f5a 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
@@ -675,3 +675,11 @@ func MapRejectReason(rawRejectReason uint8, proprietary bool) RejectReason {
 	}
 	return RejectReason(rawRejectReason)
 }
+
+func MapBACnetObjectType(rawObjectType BACnetContextTagEnumerated) BACnetObjectType {
+	baCnetObjectType := BACnetObjectTypeByValue(uint16(rawObjectType.GetActualValue()))
+	if baCnetObjectType == 0 {
+		return BACnetObjectType_VENDOR_PROPRIETARY_VALUE
+	}
+	return baCnetObjectType
+}
diff --git a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/readwrite/utils/StaticHelper.java b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/readwrite/utils/StaticHelper.java
index 88d741b90b..26054eb4b8 100644
--- a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/readwrite/utils/StaticHelper.java
+++ b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/readwrite/utils/StaticHelper.java
@@ -1146,4 +1146,11 @@ public class StaticHelper {
         if (proprietary) return null;
         return RejectReason.enumForValue(rawRejectReason);
     }
+
+    public static BACnetObjectType mapBACnetObjectType(BACnetContextTagEnumerated rawObjectType) {
+        if (rawObjectType == null) return null;
+        BACnetObjectType baCnetObjectType = BACnetObjectType.enumForValue((int) rawObjectType.getActualValue());
+        if (baCnetObjectType == null) return BACnetObjectType.VENDOR_PROPRIETARY_VALUE;
+        return baCnetObjectType;
+    }
 }
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index ea965e109f..db68923382 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -464,12 +464,12 @@
             [optional BACnetConstructedData('3', 'objectIdentifier.objectType', 'propertyIdentifier')      listOfElements      ]
         ]
         ['CREATE_OBJECT' BACnetConfirmedServiceRequestCreateObject
-            // TODO: implement me
-            [validation    '1 == 2'    "TODO: implement me"]
+            [simple       BACnetConfirmedServiceRequestCreateObjectObjectSpecifier('0')                    objectSpecifier     ]
+            [optional     BACnetPropertyValues('1', 'objectSpecifier.isObjectType?objectSpecifier.objectType:objectSpecifier.objectIdentifier.objectType')
+                                                                                                           listOfValues        ]
         ]
         ['DELETE_OBJECT' BACnetConfirmedServiceRequestDeleteObject
-            // TODO: implement me
-            [validation    '1 == 2'    "TODO: implement me"]
+            [simple   BACnetApplicationTagObjectIdentifier                                                 objectIdentifier    ]
         ]
         ['READ_PROPERTY' BACnetConfirmedServiceRequestReadProperty
             [simple   BACnetContextTagObjectIdentifier('0', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')
@@ -644,6 +644,22 @@
     ////
 ]
 
+[type BACnetConfirmedServiceRequestCreateObjectObjectSpecifier(uint 8 tagNumber)
+    [simple     BACnetOpeningTag('tagNumber', 'BACnetDataType.OPENING_TAG')
+                     openingTag                                                                         ]
+    [optional   BACnetContextTagEnumerated('0', 'BACnetDataType.ENUMERATED')
+                     rawObjectType                                                                      ]
+    [virtual    bit  isObjectType   'rawObjectType != null'                                             ]
+    [virtual    BACnetObjectType
+                     objectType     'STATIC_CALL('mapBACnetObjectType', rawObjectType)'                 ]
+    [optional   BACnetContextTagObjectIdentifier('1', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')
+                     objectIdentifier                                                                   ]
+    [virtual    bit  isObjectIdentifier   'objectIdentifier != null'                                    ]
+    [validation 'isObjectType || isObjectIdentifier' "either we need a objectType or a objectIdentifier"]
+    [simple     BACnetClosingTag('tagNumber', 'BACnetDataType.CLOSING_TAG')
+                     closingTag                                                                         ]
+]
+
 [type ListOfCovNotificationsList(uint 8 tagNumber)
     [simple     BACnetOpeningTag('tagNumber', 'BACnetDataType.OPENING_TAG')
                      openingTag                                                                         ]