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/13 13:39:41 UTC
[plc4x] branch develop updated (b20817f22d -> 4bdd42af1c)
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 b20817f22d doc: Updated the link to where the EtherNet/IP Spec can be purchased.
new fd1d2db79d test(plc4j/bacnet): added method to get a particular BVLC by package number
new 6b6a8fdcf6 fix(plc4j/codegen): make writers for complex and enum null safe
new c75c2f05bf feat(bacnet): implemented PrivateTransfer
new ddfad995ae feat(bacnet): implemented read range
new 592c76d044 fix(bacnet): fix support for segmented requests
new 4bdd42af1c fix(bacnet): fixed several bugs
The 6 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:
.gitignore | 1 +
.../protocols/bacnet/ParserSerializerTestsuite.xml | 29 +
.../plc4go/bacnetip/readwrite/ParserHelper.go | 20 +-
.../plc4go/bacnetip/readwrite/XmlParserHelper.go | 23 +-
.../readwrite/model/APDUConfirmedRequest.go | 122 +-
...firmedServiceRequestConfirmedPrivateTransfer.go | 139 ++-
...tConfirmedServiceRequestConfirmedTextMessage.go | 5 +
.../BACnetConfirmedServiceRequestReadRange.go | 191 ++-
...BACnetConfirmedServiceRequestReadRangeRange.go} | 90 +-
...firmedServiceRequestReadRangeRangeByPosition.go | 234 ++++
...ServiceRequestReadRangeRangeBySequenceNumber.go | 234 ++++
...tConfirmedServiceRequestReadRangeRangeByTime.go | 234 ++++
.../model/BACnetConstructedDataElement.go | 5 +
.../model/BACnetConstructedDataEventTimestamps.go | 14 +-
.../bacnetip/readwrite/model/BACnetDateTime.go | 85 +-
...eStampEnclosed.go => BACnetDateTimeEnclosed.go} | 94 +-
...EventTransitionBits.go => BACnetResultFlags.go} | 96 +-
.../BACnetServiceAckConfirmedPrivateTransfer.go | 140 ++-
.../readwrite/model/BACnetServiceAckReadRange.go | 320 ++++-
.../model/BACnetTagPayloadSignedInteger.go | 5 +
.../model/BACnetTagPayloadUnsignedInteger.go | 5 +
.../readwrite/model/BACnetTimeStampDateTime.go | 14 +-
...rmedServiceRequestUnconfirmedPrivateTransfer.go | 22 +-
.../bacnetip/readwrite/model/StaticHelper.go | 3 +
.../bacnetip/readwrite/utils/StaticHelper.java | 3 +
.../plc4x/java/bacnetip/RandomPackagesTest.java | 1288 ++------------------
.../spi/codegen/fields/FieldReaderVirtual.java | 2 +-
.../spi/codegen/io/DataWriterComplexDefault.java | 11 +-
.../java/spi/codegen/io/DataWriterEnumDefault.java | 8 +
.../resources/protocols/bacnetip/bacnetip.mspec | 127 +-
.../protocols/bacnet/ParserSerializerTestsuite.xml | 29 +
31 files changed, 2096 insertions(+), 1497 deletions(-)
copy plc4go/internal/plc4go/bacnetip/readwrite/model/{BACnetConfirmedServiceRequestAtomicReadFileStreamOrRecord.go => BACnetConfirmedServiceRequestReadRangeRange.go} (60%)
create mode 100644 plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRangeByPosition.go
create mode 100644 plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber.go
create mode 100644 plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRangeByTime.go
copy plc4go/internal/plc4go/bacnetip/readwrite/model/{BACnetTimeStampEnclosed.go => BACnetDateTimeEnclosed.go} (59%)
copy plc4go/internal/plc4go/bacnetip/readwrite/model/{BACnetEventTransitionBits.go => BACnetResultFlags.go} (57%)
[plc4x] 06/06: fix(bacnet): fixed several bugs
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 4bdd42af1ca7b4977faeb6ba4ab52e47f4c1971c
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 13 15:39:29 2022 +0200
fix(bacnet): fixed several bugs
+ fixed private transfer using wrong data types
+ plc4j double parsing should work now
+ fixed parsing of zero length integers
+ other minor stuff that fails the test
---
...firmedServiceRequestConfirmedPrivateTransfer.go | 18 +-
.../model/BACnetConstructedDataElement.go | 5 +
.../BACnetServiceAckConfirmedPrivateTransfer.go | 18 +-
.../model/BACnetTagPayloadSignedInteger.go | 5 +
.../model/BACnetTagPayloadUnsignedInteger.go | 5 +
...rmedServiceRequestUnconfirmedPrivateTransfer.go | 18 +-
.../bacnetip/readwrite/model/StaticHelper.go | 3 +
.../bacnetip/readwrite/utils/StaticHelper.java | 3 +
.../plc4x/java/bacnetip/RandomPackagesTest.java | 393 +++------------------
.../spi/codegen/fields/FieldReaderVirtual.java | 2 +-
.../resources/protocols/bacnetip/bacnetip.mspec | 21 +-
11 files changed, 115 insertions(+), 376 deletions(-)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
index e86efb4f1b..00a1bb0c49 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
@@ -32,7 +32,7 @@ type BACnetConfirmedServiceRequestConfirmedPrivateTransfer struct {
*BACnetConfirmedServiceRequest
VendorId *BACnetContextTagUnsignedInteger
ServiceNumber *BACnetContextTagUnsignedInteger
- ServiceParameters *BACnetPropertyValues
+ ServiceParameters *BACnetConstructedData
// Arguments.
ServiceRequestLength uint16
@@ -46,7 +46,7 @@ type IBACnetConfirmedServiceRequestConfirmedPrivateTransfer interface {
// GetServiceNumber returns ServiceNumber (property field)
GetServiceNumber() *BACnetContextTagUnsignedInteger
// GetServiceParameters returns ServiceParameters (property field)
- GetServiceParameters() *BACnetPropertyValues
+ GetServiceParameters() *BACnetConstructedData
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -89,7 +89,7 @@ func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetServiceNumber
return m.ServiceNumber
}
-func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetServiceParameters() *BACnetPropertyValues {
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetServiceParameters() *BACnetConstructedData {
return m.ServiceParameters
}
@@ -99,7 +99,7 @@ func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetServiceParame
///////////////////////////////////////////////////////////
// NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer factory function for BACnetConfirmedServiceRequestConfirmedPrivateTransfer
-func NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer(vendorId *BACnetContextTagUnsignedInteger, serviceNumber *BACnetContextTagUnsignedInteger, serviceParameters *BACnetPropertyValues, serviceRequestLength uint16) *BACnetConfirmedServiceRequestConfirmedPrivateTransfer {
+func NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer(vendorId *BACnetContextTagUnsignedInteger, serviceNumber *BACnetContextTagUnsignedInteger, serviceParameters *BACnetConstructedData, serviceRequestLength uint16) *BACnetConfirmedServiceRequestConfirmedPrivateTransfer {
_result := &BACnetConfirmedServiceRequestConfirmedPrivateTransfer{
VendorId: vendorId,
ServiceNumber: serviceNumber,
@@ -189,20 +189,20 @@ func BACnetConfirmedServiceRequestConfirmedPrivateTransferParse(readBuffer utils
}
// Optional Field (serviceParameters) (Can be skipped, if a given expression evaluates to false)
- var serviceParameters *BACnetPropertyValues = nil
+ var serviceParameters *BACnetConstructedData = nil
{
currentPos = readBuffer.GetPos()
if pullErr := readBuffer.PullContext("serviceParameters"); pullErr != nil {
return nil, pullErr
}
- _val, _err := BACnetPropertyValuesParse(readBuffer, uint8(2), BACnetObjectType_VENDOR_PROPRIETARY_VALUE)
+ _val, _err := BACnetConstructedDataParse(readBuffer, uint8(2), BACnetObjectType_VENDOR_PROPRIETARY_VALUE, DummyPropertyIdentifier())
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 'serviceParameters' field")
default:
- serviceParameters = CastBACnetPropertyValues(_val)
+ serviceParameters = CastBACnetConstructedData(_val)
if closeErr := readBuffer.CloseContext("serviceParameters"); closeErr != nil {
return nil, closeErr
}
@@ -217,7 +217,7 @@ func BACnetConfirmedServiceRequestConfirmedPrivateTransferParse(readBuffer utils
_child := &BACnetConfirmedServiceRequestConfirmedPrivateTransfer{
VendorId: CastBACnetContextTagUnsignedInteger(vendorId),
ServiceNumber: CastBACnetContextTagUnsignedInteger(serviceNumber),
- ServiceParameters: CastBACnetPropertyValues(serviceParameters),
+ ServiceParameters: CastBACnetConstructedData(serviceParameters),
BACnetConfirmedServiceRequest: &BACnetConfirmedServiceRequest{},
}
_child.BACnetConfirmedServiceRequest.Child = _child
@@ -255,7 +255,7 @@ func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) Serialize(writeB
}
// Optional Field (serviceParameters) (Can be skipped, if the value is null)
- var serviceParameters *BACnetPropertyValues = nil
+ var serviceParameters *BACnetConstructedData = nil
if m.ServiceParameters != nil {
if pushErr := writeBuffer.PushContext("serviceParameters"); pushErr != nil {
return pushErr
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
index dbe1423b80..ccdb680701 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
@@ -231,6 +231,11 @@ func BACnetConstructedDataElementParse(readBuffer utils.ReadBuffer, objectType B
isContextTag := bool(_isContextTag)
_ = isContextTag
+ // Validation
+ if !(bool(!(isContextTag)) || bool(bool(bool(isContextTag) && bool(bool((peekedTagHeader.GetLengthValueType()) != (0x7)))))) {
+ return nil, utils.ParseAssertError{"unexpected closing tag"}
+ }
+
// Optional Field (applicationTag) (Can be skipped, if a given expression evaluates to false)
var applicationTag *BACnetApplicationTag = nil
if isApplicationTag {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
index cc1ad6455b..1c0eacfba9 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
@@ -32,7 +32,7 @@ type BACnetServiceAckConfirmedPrivateTransfer struct {
*BACnetServiceAck
VendorId *BACnetContextTagUnsignedInteger
ServiceNumber *BACnetContextTagUnsignedInteger
- ResultBlock *BACnetPropertyValues
+ ResultBlock *BACnetConstructedData
// Arguments.
ServiceRequestLength uint16
@@ -46,7 +46,7 @@ type IBACnetServiceAckConfirmedPrivateTransfer interface {
// GetServiceNumber returns ServiceNumber (property field)
GetServiceNumber() *BACnetContextTagUnsignedInteger
// GetResultBlock returns ResultBlock (property field)
- GetResultBlock() *BACnetPropertyValues
+ GetResultBlock() *BACnetConstructedData
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -88,7 +88,7 @@ func (m *BACnetServiceAckConfirmedPrivateTransfer) GetServiceNumber() *BACnetCon
return m.ServiceNumber
}
-func (m *BACnetServiceAckConfirmedPrivateTransfer) GetResultBlock() *BACnetPropertyValues {
+func (m *BACnetServiceAckConfirmedPrivateTransfer) GetResultBlock() *BACnetConstructedData {
return m.ResultBlock
}
@@ -98,7 +98,7 @@ func (m *BACnetServiceAckConfirmedPrivateTransfer) GetResultBlock() *BACnetPrope
///////////////////////////////////////////////////////////
// NewBACnetServiceAckConfirmedPrivateTransfer factory function for BACnetServiceAckConfirmedPrivateTransfer
-func NewBACnetServiceAckConfirmedPrivateTransfer(vendorId *BACnetContextTagUnsignedInteger, serviceNumber *BACnetContextTagUnsignedInteger, resultBlock *BACnetPropertyValues, serviceRequestLength uint16) *BACnetServiceAckConfirmedPrivateTransfer {
+func NewBACnetServiceAckConfirmedPrivateTransfer(vendorId *BACnetContextTagUnsignedInteger, serviceNumber *BACnetContextTagUnsignedInteger, resultBlock *BACnetConstructedData, serviceRequestLength uint16) *BACnetServiceAckConfirmedPrivateTransfer {
_result := &BACnetServiceAckConfirmedPrivateTransfer{
VendorId: vendorId,
ServiceNumber: serviceNumber,
@@ -188,20 +188,20 @@ func BACnetServiceAckConfirmedPrivateTransferParse(readBuffer utils.ReadBuffer,
}
// Optional Field (resultBlock) (Can be skipped, if a given expression evaluates to false)
- var resultBlock *BACnetPropertyValues = nil
+ var resultBlock *BACnetConstructedData = nil
{
currentPos = readBuffer.GetPos()
if pullErr := readBuffer.PullContext("resultBlock"); pullErr != nil {
return nil, pullErr
}
- _val, _err := BACnetPropertyValuesParse(readBuffer, uint8(2), BACnetObjectType_VENDOR_PROPRIETARY_VALUE)
+ _val, _err := BACnetConstructedDataParse(readBuffer, uint8(2), BACnetObjectType_VENDOR_PROPRIETARY_VALUE, DummyPropertyIdentifier())
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 'resultBlock' field")
default:
- resultBlock = CastBACnetPropertyValues(_val)
+ resultBlock = CastBACnetConstructedData(_val)
if closeErr := readBuffer.CloseContext("resultBlock"); closeErr != nil {
return nil, closeErr
}
@@ -216,7 +216,7 @@ func BACnetServiceAckConfirmedPrivateTransferParse(readBuffer utils.ReadBuffer,
_child := &BACnetServiceAckConfirmedPrivateTransfer{
VendorId: CastBACnetContextTagUnsignedInteger(vendorId),
ServiceNumber: CastBACnetContextTagUnsignedInteger(serviceNumber),
- ResultBlock: CastBACnetPropertyValues(resultBlock),
+ ResultBlock: CastBACnetConstructedData(resultBlock),
BACnetServiceAck: &BACnetServiceAck{},
}
_child.BACnetServiceAck.Child = _child
@@ -254,7 +254,7 @@ func (m *BACnetServiceAckConfirmedPrivateTransfer) Serialize(writeBuffer utils.W
}
// Optional Field (resultBlock) (Can be skipped, if the value is null)
- var resultBlock *BACnetPropertyValues = nil
+ var resultBlock *BACnetConstructedData = nil
if m.ResultBlock != nil {
if pushErr := writeBuffer.PushContext("resultBlock"); pushErr != nil {
return pushErr
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadSignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadSignedInteger.go
index a1c32af164..514ec0eeb1 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadSignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadSignedInteger.go
@@ -546,6 +546,11 @@ func BACnetTagPayloadSignedIntegerParse(readBuffer utils.ReadBuffer, actualLengt
valueInt64 = &_val
}
+ // Validation
+ if !(bool(bool(bool(bool(bool(bool(bool(isInt8) || bool(isInt16)) || bool(isInt24)) || bool(isInt32)) || bool(isInt40)) || bool(isInt48)) || bool(isInt56)) || bool(isInt64)) {
+ return nil, utils.ParseAssertError{"unmapped integer length"}
+ }
+
// Virtual field
_actualValue := utils.InlineIf(isInt8, func() interface{} { return uint64((*valueInt8)) }, func() interface{} {
return uint64(uint64(utils.InlineIf(isInt16, func() interface{} { return uint64((*valueInt16)) }, func() interface{} {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadUnsignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadUnsignedInteger.go
index 2a3d67bef4..4f911ebda4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadUnsignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadUnsignedInteger.go
@@ -546,6 +546,11 @@ func BACnetTagPayloadUnsignedIntegerParse(readBuffer utils.ReadBuffer, actualLen
valueUint64 = &_val
}
+ // Validation
+ if !(bool(bool(bool(bool(bool(bool(bool(isUint8) || bool(isUint16)) || bool(isUint24)) || bool(isUint32)) || bool(isUint40)) || bool(isUint48)) || bool(isUint56)) || bool(isUint64)) {
+ return nil, utils.ParseAssertError{"unmapped integer length"}
+ }
+
// Virtual field
_actualValue := utils.InlineIf(isUint8, func() interface{} { return uint64((*valueUint8)) }, func() interface{} {
return uint64(uint64(utils.InlineIf(isUint16, func() interface{} { return uint64((*valueUint16)) }, func() interface{} {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
index aaa7cc8c9d..38f543fdd4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
@@ -32,7 +32,7 @@ type BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer struct {
*BACnetUnconfirmedServiceRequest
VendorId *BACnetContextTagUnsignedInteger
ServiceNumber *BACnetContextTagUnsignedInteger
- ServiceParameters *BACnetPropertyValues
+ ServiceParameters *BACnetConstructedData
// Arguments.
ServiceRequestLength uint16
@@ -46,7 +46,7 @@ type IBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer interface {
// GetServiceNumber returns ServiceNumber (property field)
GetServiceNumber() *BACnetContextTagUnsignedInteger
// GetServiceParameters returns ServiceParameters (property field)
- GetServiceParameters() *BACnetPropertyValues
+ GetServiceParameters() *BACnetConstructedData
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -89,7 +89,7 @@ func (m *BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer) GetServiceNu
return m.ServiceNumber
}
-func (m *BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer) GetServiceParameters() *BACnetPropertyValues {
+func (m *BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer) GetServiceParameters() *BACnetConstructedData {
return m.ServiceParameters
}
@@ -99,7 +99,7 @@ func (m *BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer) GetServicePa
///////////////////////////////////////////////////////////
// NewBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer factory function for BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer
-func NewBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer(vendorId *BACnetContextTagUnsignedInteger, serviceNumber *BACnetContextTagUnsignedInteger, serviceParameters *BACnetPropertyValues, serviceRequestLength uint16) *BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer {
+func NewBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer(vendorId *BACnetContextTagUnsignedInteger, serviceNumber *BACnetContextTagUnsignedInteger, serviceParameters *BACnetConstructedData, serviceRequestLength uint16) *BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer {
_result := &BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer{
VendorId: vendorId,
ServiceNumber: serviceNumber,
@@ -189,20 +189,20 @@ func BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(readBuffer u
}
// Optional Field (serviceParameters) (Can be skipped, if a given expression evaluates to false)
- var serviceParameters *BACnetPropertyValues = nil
+ var serviceParameters *BACnetConstructedData = nil
{
currentPos = readBuffer.GetPos()
if pullErr := readBuffer.PullContext("serviceParameters"); pullErr != nil {
return nil, pullErr
}
- _val, _err := BACnetPropertyValuesParse(readBuffer, uint8(2), BACnetObjectType_VENDOR_PROPRIETARY_VALUE)
+ _val, _err := BACnetConstructedDataParse(readBuffer, uint8(2), BACnetObjectType_VENDOR_PROPRIETARY_VALUE, DummyPropertyIdentifier())
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 'serviceParameters' field")
default:
- serviceParameters = CastBACnetPropertyValues(_val)
+ serviceParameters = CastBACnetConstructedData(_val)
if closeErr := readBuffer.CloseContext("serviceParameters"); closeErr != nil {
return nil, closeErr
}
@@ -217,7 +217,7 @@ func BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(readBuffer u
_child := &BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer{
VendorId: CastBACnetContextTagUnsignedInteger(vendorId),
ServiceNumber: CastBACnetContextTagUnsignedInteger(serviceNumber),
- ServiceParameters: CastBACnetPropertyValues(serviceParameters),
+ ServiceParameters: CastBACnetConstructedData(serviceParameters),
BACnetUnconfirmedServiceRequest: &BACnetUnconfirmedServiceRequest{},
}
_child.BACnetUnconfirmedServiceRequest.Child = _child
@@ -255,7 +255,7 @@ func (m *BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer) Serialize(wr
}
// Optional Field (serviceParameters) (Can be skipped, if the value is null)
- var serviceParameters *BACnetPropertyValues = nil
+ var serviceParameters *BACnetConstructedData = nil
if m.ServiceParameters != nil {
if pushErr := writeBuffer.PushContext("serviceParameters"); pushErr != nil {
return pushErr
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
index a1d5d780ac..d8080acea7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
@@ -298,6 +298,9 @@ func GuessDataType(objectType BACnetObjectType, propertyIdentifier *BACnetContex
}
func ParseVarUint(data []byte) uint32 {
+ if len(data) == 0 {
+ return 0
+ }
bigInt := big.NewInt(0)
return uint32(bigInt.SetBytes(data).Uint64())
}
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 019caba981..47e7a3c573 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
@@ -802,6 +802,9 @@ public class StaticHelper {
}
public static long parseVarUint(byte[] data) {
+ if (data.length == 0) {
+ return 0;
+ }
return new BigInteger(data).longValue();
}
diff --git a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
index 83c139d73f..39876b62c9 100644
--- a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
+++ b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
@@ -1586,11 +1586,17 @@ public class RandomPackagesTest {
return List.of(pcapEvaluator.parseEmAll());
}
+ @Disabled("Glorious Siemens implementation is a bit all over the place")
@TestFactory
@DisplayName("Tower333 lighting 5min IP")
Collection<DynamicNode> Tower333_lighting_5min_IP() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("Tower333%20lighting%205min%20IP.pcap", BACNET_BPF_FILTER_UDP);
- return List.of(pcapEvaluator.parseEmAll());
+ return List.of(pcapEvaluator.parseEmAll(
+ // TODO: this is a broken message which should be ignored but also it results in a java heap space error so we should take care of that
+ 7,
+ // TODO: this is a broken message which should be ignored but also it results in a java heap space error so we should take care of that
+ 14
+ ));
}
@TestFactory
@@ -1903,14 +1909,14 @@ public class RandomPackagesTest {
assertNotNull(baCnetServiceAckReadProperty);
assertEquals(BACnetObjectType.DEVICE, baCnetServiceAckReadProperty.getObjectIdentifier().getObjectType());
assertEquals(BACnetPropertyIdentifier.PROTOCOL_VERSION, baCnetServiceAckReadProperty.getPropertyIdentifier().getPropertyIdentifier());
- // TODO:
+ // TODO: finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
DynamicTest.dynamicTest("No. 2 - Complex-ACK readProperty[155] device,42222 protocol-conformance-class",
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO: finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
pcapEvaluator.parseFrom(3,
@@ -2129,13 +2135,13 @@ public class RandomPackagesTest {
Collection<DynamicNode> bacnet_stack_services() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("bacnet-stack-services.cap", BACNET_BPF_FILTER_UDP);
return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
+ // Malformed Package
56,
- // TODO: check broken parsing
+ // Malformed Package
58,
- // TODO: check broken parsing
+ // Malformed Package
60,
- // TODO: check broken parsing
+ // Malformed Package
62
));
}
@@ -2200,56 +2206,56 @@ public class RandomPackagesTest {
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO:finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
DynamicTest.dynamicTest("No. 22 - Unconfirmed-REQ unconfirmedCOVNotification device,1 accumulator,22 present-value status-flags",
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO:finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
DynamicTest.dynamicTest("No. 23 - Unconfirmed-REQ unconfirmedCOVNotification device,1 binary-input,217 present-value status-flags",
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO:finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
DynamicTest.dynamicTest("No. 24 - Unconfirmed-REQ unconfirmedCOVNotification device,1 accumulator,21 present-value status-flags",
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO:finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
DynamicTest.dynamicTest("No. 25 - Unconfirmed-REQ unconfirmedCOVNotification device,1 binary-input,217 present-value status-flags",
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO:finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
DynamicTest.dynamicTest("No. 26 - Unconfirmed-REQ unconfirmedCOVNotification device,1 binary-output,1 present-value status-flags",
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO:finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
DynamicTest.dynamicTest("No. 26 - Unconfirmed-REQ unconfirmedEventNotification device,1 binary-output,1",
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO:finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
DynamicTest.dynamicTest("No. 28 - Unconfirmed-REQ unconfirmedCOVNotification device,1 accumulator,22 present-value status-flags",
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO:finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
})
);
@@ -2324,7 +2330,7 @@ public class RandomPackagesTest {
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO:finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
pcapEvaluator.parseFrom(2)
@@ -2379,10 +2385,7 @@ public class RandomPackagesTest {
@DisplayName("eventLog_ReadRange")
Collection<DynamicNode> eventLog_ReadRange() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("eventLog_ReadRange.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 1
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@@ -2535,10 +2538,7 @@ public class RandomPackagesTest {
@DisplayName("log-buffer_readRange")
Collection<DynamicNode> log_buffer_readRange() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("log-buffer_readRange.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 1
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@@ -2778,12 +2778,7 @@ public class RandomPackagesTest {
@DisplayName("plugfest-2011-siemens-1")
Collection<DynamicNode> plugfest_2011_siemens_1() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("plugfest-2011-siemens-1.pcap", BACNET_BPF_FILTER_UDP);
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 1599,
- // TODO: check broken parsing
- 1677
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@@ -2809,306 +2804,37 @@ public class RandomPackagesTest {
@DisplayName("plugfest-delta-2")
Collection<DynamicNode> plugfest_delta_2() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("plugfest-delta-2.cap", BACNET_BPF_FILTER_UDP);
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 9817,
- // TODO: check broken parsing
- 9819,
- // TODO: check broken parsing
- 9829,
- // TODO: check broken parsing
- 9851,
- // TODO: check broken parsing
- 9860,
- // TODO: check broken parsing
- 9876,
- // TODO: check broken parsing
- 9897,
- // TODO: check broken parsing
- 9908,
- // TODO: check broken parsing
- 9923,
- // TODO: check broken parsing
- 9946,
- // TODO: check broken parsing
- 9955,
- // TODO: check broken parsing
- 9970,
- // TODO: check broken parsing
- 9993,
- // TODO: check broken parsing
- 10002,
- // TODO: check broken parsing
- 10017,
- // TODO: check broken parsing
- 10036,
- // TODO: check broken parsing
- 10047,
- // TODO: check broken parsing
- 10061,
- // TODO: check broken parsing
- 10717,
- // TODO: check broken parsing
- 11038,
- // TODO: check broken parsing
- 12101,
- // TODO: check broken parsing
- 12950,
- // TODO: check broken parsing
- 13267,
- // TODO: check broken parsing
- 13755,
- // TODO: check broken parsing
- 13777,
- // TODO: check broken parsing
- 13787,
- // TODO: check broken parsing
- 13802,
- // TODO: check broken parsing
- 13821,
- // TODO: check broken parsing
- 13830,
- // TODO: check broken parsing
- 13845,
- // TODO: check broken parsing
- 13867,
- // TODO: check broken parsing
- 13876,
- // TODO: check broken parsing
- 13918,
- // TODO: check broken parsing
- 13920,
- // TODO: check broken parsing
- 13929,
- // TODO: check broken parsing
- 13931,
- // TODO: check broken parsing
- 13940,
- // TODO: check broken parsing
- 13942,
- // TODO: check broken parsing
- 13951,
- // TODO: check broken parsing
- 13953
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@DisplayName("plugfest-delta-2b")
Collection<DynamicNode> plugfest_delta_2b() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("plugfest-delta-2b.cap", BACNET_BPF_FILTER_UDP);
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 93,
- // TODO: check broken parsing
- 95,
- // TODO: check broken parsing
- 97,
- // TODO: check broken parsing
- 129,
- // TODO: check broken parsing
- 169,
- // TODO: check broken parsing
- 278,
- // TODO: check broken parsing
- 280,
- // TODO: check broken parsing
- 289,
- // TODO: check broken parsing
- 291,
- // TODO: check broken parsing
- 300,
- // TODO: check broken parsing
- 302,
- // TODO: check broken parsing
- 311,
- // TODO: check broken parsing
- 313,
- // TODO: check broken parsing
- 1985,
- // TODO: check broken parsing
- 6298,
- // TODO: check broken parsing
- 6300,
- // TODO: check broken parsing
- 6318,
- // TODO: check broken parsing
- 6320,
- // TODO: check broken parsing
- 6329,
- // TODO: check broken parsing
- 6331,
- // TODO: check broken parsing
- 6374,
- // TODO: check broken parsing
- 6376,
- // TODO: check broken parsing
- 6387,
- // TODO: check broken parsing
- 6389,
- // TODO: check broken parsing
- 6411,
- // TODO: check broken parsing
- 6413,
- // TODO: check broken parsing
- 6425,
- // TODO: check broken parsing
- 6427,
- // TODO: check broken parsing
- 6439,
- // TODO: check broken parsing
- 6441,
- // TODO: check broken parsing
- 6462,
- // TODO: check broken parsing
- 6464,
- // TODO: check broken parsing
- 6473,
- // TODO: check broken parsing
- 6475,
- // TODO: check broken parsing
- 9148,
- // TODO: check broken parsing
- 9152,
- // TODO: check broken parsing
- 9153,
- // TODO: check broken parsing
- 9154,
- // TODO: check broken parsing
- 9155,
- // TODO: check broken parsing
- 9156,
- // TODO: check broken parsing
- 9159,
- // TODO: check broken parsing
- 9160,
- // TODO: check broken parsing
- 9161,
- // TODO: check broken parsing
- 9162,
- // TODO: check broken parsing
- 9163,
- // TODO: check broken parsing
- 9312,
- // TODO: check broken parsing
- 9314,
- // TODO: check broken parsing
- 9316,
- // TODO: check broken parsing
- 9345,
- // TODO: check broken parsing
- 9415,
- // TODO: check broken parsing
- 9417,
- // TODO: check broken parsing
- 9426,
- // TODO: check broken parsing
- 9428,
- // TODO: check broken parsing
- 9437,
- // TODO: check broken parsing
- 9439,
- // TODO: check broken parsing
- 9448,
- // TODO: check broken parsing
- 9450,
- // TODO: check broken parsing
- 9467,
- // TODO: check broken parsing
- 9469,
- // TODO: check broken parsing
- 9481,
- // TODO: check broken parsing
- 9483,
- // TODO: check broken parsing
- 9492,
- // TODO: check broken parsing
- 9481,
- // TODO: check broken parsing
- 9483,
- // TODO: check broken parsing
- 9492,
- // TODO: check broken parsing
- 9494,
- // TODO: check broken parsing
- 9536,
- // TODO: check broken parsing
- 9538,
- // TODO: check broken parsing
- 9688,
- // TODO: check broken parsing
- 10488,
- // TODO: check broken parsing
- 10490,
- // TODO: check broken parsing
- 10492,
- // TODO: check broken parsing
- 10521,
- // TODO: check broken parsing
- 10559
- ));
+ return List.of(
+ pcapEvaluator.parseEmAll(
+ // TODO: fix broken error mapping
+ 129,
+ // TODO: fix broken error mapping
+ 169,
+ // TODO: fix broken error mapping
+ 1985,
+ // TODO: fix broken error mapping
+ 9345,
+ // TODO: fix broken error mapping
+ 9688,
+ // TODO: fix broken error mapping
+ 10521,
+ // TODO: fix broken error mapping
+ 10559
+ ));
}
@TestFactory
@DisplayName("plugfest-tridium-1")
Collection<DynamicNode> plugfest_tridium_1() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("plugfest-tridium-1.pcap", BACNET_BPF_FILTER_UDP);
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 2312,
- // TODO: check broken parsing
- 2317,
- // TODO: check broken parsing
- 2322,
- // TODO: check broken parsing
- 2330,
- // TODO: check broken parsing
- 2346,
- // TODO: check broken parsing
- 2351,
- // TODO: check broken parsing
- 2354,
- // TODO: check broken parsing
- 2357,
- // TODO: check broken parsing
- 2361,
- // TODO: check broken parsing
- 2363,
- // TODO: check broken parsing
- 2366,
- // TODO: check broken parsing
- 2369,
- // TODO: check broken parsing
- 2371,
- // TODO: check broken parsing
- 2375,
- // TODO: check broken parsing
- 2378,
- // TODO: check broken parsing
- 2381,
- // TODO: check broken parsing
- 2511,
- // TODO: check broken parsing
- 2513,
- // TODO: check broken parsing
- 2515,
- // TODO: check broken parsing
- 2518,
- // TODO: check broken parsing
- 2707,
- // TODO: check broken parsing
- 2711,
- // TODO: check broken parsing
- 2726,
- // TODO: check broken parsing
- 2729,
- // TODO: check broken parsing
- 2732,
- // TODO: check broken parsing
- 2734,
- // TODO: check broken parsing
- 2736
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@@ -5019,14 +4745,14 @@ public class RandomPackagesTest {
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO: finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
DynamicTest.dynamicTest("No. 2 - Complex-ACK readProperty[ 1] load-control,0 expected-shed-level",
() -> {
BVLC bvlc = pcapEvaluator.nextBVLC();
dump(bvlc);
- // TODO:
+ // TODO: finish me
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
pcapEvaluator.parseFrom(3)
@@ -5558,7 +5284,6 @@ public class RandomPackagesTest {
protected final PcapHandle pcapHandle;
// maps timestamp to package number
protected final Map<Timestamp, Integer> timestampToPackageNumberMap;
- protected final Map<Integer, Packet> packageMap;
// maps read package (index) to package number
protected final List<Integer> packageNumbers;
protected final int maxPackages;
@@ -5572,17 +5297,13 @@ public class RandomPackagesTest {
String toParse = DownloadAndCache(pcapFile);
LOGGER.info("Reading {}", toParse);
PcapHandle intermediateHandle = getHandle(toParse);
- packageMap = new HashMap<>();
int packageNumber = 0;
if (filter != null) {
// In case of filtering we need to read all packages
LOGGER.info("Building timestamp number map");
timestampToPackageNumberMap = new HashMap<>();
- Packet packet;
- while ((packet = intermediateHandle.getNextPacket()) != null) {
- int currentPackageNumber = ++packageNumber;
- packageMap.put(currentPackageNumber, packet);
- timestampToPackageNumberMap.put(intermediateHandle.getTimestamp(), currentPackageNumber);
+ while (intermediateHandle.getNextPacket() != null) {
+ timestampToPackageNumberMap.put(intermediateHandle.getTimestamp(), ++packageNumber);
}
intermediateHandle.close();
// Count package numbers now
@@ -5601,10 +5322,8 @@ public class RandomPackagesTest {
} else {
timestampToPackageNumberMap = null;
packageNumbers = null;
- Packet packet;
- while ((packet = intermediateHandle.getNextPacket()) != null) {
- int currentPackageNumber = ++packageNumber;
- packageMap.put(currentPackageNumber, packet);
+ while (intermediateHandle.getNextPacket() != null) {
+ packageNumber++;
}
intermediateHandle.close();
intermediateHandle = getHandle(toParse);
@@ -5640,10 +5359,6 @@ public class RandomPackagesTest {
return nextBVLC(null);
}
- public BVLC getBVLC(int packageNumber) throws ParseException {
- return getBvlc(packageMap.get(packageNumber));
- }
-
public BVLC nextBVLC(Integer ensurePackageNumber) throws NotOpenException, ParseException {
Packet packet = nextPacket();
if (packet == null) {
@@ -5676,13 +5391,7 @@ public class RandomPackagesTest {
try {
return BVLC.staticParse(new ReadBufferByteBased(rawData));
} catch (ParseException e) {
- throw new ParseException(String.format("Caught at current package number: %d. Packages read so far %d" +
- "" +
- "\n\n,\n" +
- " // TODO: check broken parsing\n" +
- " " + readPackages +
- "" +
- "", currentPackageNumber, readPackages), e);
+ throw new ParseException(String.format("Caught at current package number: %d. Packages read so far %d", currentPackageNumber, readPackages), e);
}
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderVirtual.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderVirtual.java
index 4f8f535edd..28d9e15d55 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderVirtual.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderVirtual.java
@@ -68,7 +68,7 @@ public class FieldReaderVirtual<T> implements FieldCommons {
} else if (type == float.class) {
Number valueExpressionNumber = (Number) valueExpression;
return (T) (Float) valueExpressionNumber.floatValue();
- } else if (type == Double.class) {
+ } else if (type == double.class) {
Number valueExpressionNumber = (Number) valueExpression;
return (T) (Double) valueExpressionNumber.doubleValue();
} else {
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index e569ba246f..e03887d2e7 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -466,7 +466,8 @@
['CONFIRMED_PRIVATE_TRANSFER' BACnetConfirmedServiceRequestConfirmedPrivateTransfer
[simple BACnetContextTagUnsignedInteger('0', 'BACnetDataType.UNSIGNED_INTEGER') vendorId ]// TODO: vendor list?
[simple BACnetContextTagUnsignedInteger('1', 'BACnetDataType.UNSIGNED_INTEGER') serviceNumber ]
- [optional BACnetPropertyValues('2', 'BACnetObjectType.VENDOR_PROPRIETARY_VALUE') serviceParameters ] //TODO: what should we use as object identifier here?
+ // TODO: temporary dummy property identifier... get rid of that
+ [optional BACnetConstructedData('2', 'BACnetObjectType.VENDOR_PROPRIETARY_VALUE', 'STATIC_CALL("dummyPropertyIdentifier")') serviceParameters ]
]
['CONFIRMED_TEXT_MESSAGE' BACnetConfirmedServiceRequestConfirmedTextMessage
// TODO: implement me
@@ -757,7 +758,8 @@
['UNCONFIRMED_PRIVATE_TRANSFER' BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer
[simple BACnetContextTagUnsignedInteger('0', 'BACnetDataType.UNSIGNED_INTEGER') vendorId ]// TODO: vendor list?
[simple BACnetContextTagUnsignedInteger('1', 'BACnetDataType.UNSIGNED_INTEGER') serviceNumber ]
- [optional BACnetPropertyValues('2', 'BACnetObjectType.VENDOR_PROPRIETARY_VALUE') serviceParameters ] //TODO: what should we use as object identifier here?
+ // TODO: temporary dummy property identifier... get rid of that
+ [optional BACnetConstructedData('2', 'BACnetObjectType.VENDOR_PROPRIETARY_VALUE', 'STATIC_CALL("dummyPropertyIdentifier")') serviceParameters ]
]
['UNCONFIRMED_TEXT_MESSAGE' BACnetUnconfirmedServiceRequestUnconfirmedTextMessage
// TODO: implement me
@@ -952,7 +954,8 @@
['CONFIRMED_PRIVATE_TRANSFER' BACnetServiceAckConfirmedPrivateTransfer
[simple BACnetContextTagUnsignedInteger('0', 'BACnetDataType.UNSIGNED_INTEGER') vendorId ]// TODO: vendor list?
[simple BACnetContextTagUnsignedInteger('1', 'BACnetDataType.UNSIGNED_INTEGER') serviceNumber ]
- [optional BACnetPropertyValues('2', 'BACnetObjectType.VENDOR_PROPRIETARY_VALUE') resultBlock ] //TODO: what should we use as object identifier here?
+ // TODO: temporary dummy property identifier... get rid of that
+ [optional BACnetConstructedData('2', 'BACnetObjectType.VENDOR_PROPRIETARY_VALUE', 'STATIC_CALL("dummyPropertyIdentifier")') resultBlock ]
]
['CONFIRMED_TEXT_MESSAGE' BACnetServiceAckConfirmedTextMessage
// TODO: implement me
@@ -1913,6 +1916,7 @@
[optional uint 56 valueUint56 'isUint56' ]
[virtual bit isUint64 'actualLength == 8' ]
[optional uint 64 valueUint64 'isUint64' ]
+ [validation 'isUint8 || isUint16 || isUint24 || isUint32 || isUint40 || isUint48 || isUint56 || isUint64' "unmapped integer length"]
[virtual uint 64 actualValue 'isUint8?valueUint8:(isUint16?valueUint16:(isUint24?valueUint24:(isUint32?valueUint32:(isUint40?valueUint40:(isUint48?valueUint48:(isUint56?valueUint56:valueUint64))))))']
]
@@ -1933,6 +1937,7 @@
[optional int 56 valueInt56 'isInt56' ]
[virtual bit isInt64 'actualLength == 8' ]
[optional int 64 valueInt64 'isInt64' ]
+ [validation 'isInt8 || isInt16 || isInt24 || isInt32 || isInt40 || isInt48 || isInt56 || isInt64' "unmapped integer length"]
[virtual uint 64 actualValue 'isInt8?valueInt8:(isInt16?valueInt16:(isInt24?valueInt24:(isInt32?valueInt32:(isInt40?valueInt40:(isInt48?valueInt48:(isInt56?valueInt56:valueInt64))))))']
]
@@ -2561,15 +2566,19 @@
peekedTagHeader ]
[virtual uint 8 peekedTagNumber 'peekedTagHeader.actualTagNumber']
[virtual bit isApplicationTag 'peekedTagHeader.tagClass == TagClass.APPLICATION_TAGS' ]
- [virtual bit isConstructedData '!isApplicationTag && peekedTagHeader.lengthValueType == 0x6' ]
+ [virtual bit isConstructedData '!isApplicationTag && peekedTagHeader.lengthValueType == 0x6' ]
[virtual bit isContextTag '!isConstructedData && !isApplicationTag' ]
+ [validation '!isContextTag || (isContextTag && peekedTagHeader.lengthValueType != 0x7)'
+ "unexpected closing tag" ]
[optional BACnetApplicationTag
applicationTag 'isApplicationTag' ]
- [optional BACnetContextTag('peekedTagNumber', 'STATIC_CALL("guessDataType", objectType, propertyIdentifier)')
+ [optional BACnetContextTag('peekedTagNumber',
+ 'STATIC_CALL("guessDataType", objectType, propertyIdentifier)')
contextTag 'isContextTag' ]
[optional BACnetConstructedData('peekedTagNumber', 'objectType', 'propertyIdentifier')
constructedData 'isConstructedData' ]
- [validation 'isApplicationTag || isContextTag || isConstructedData' "BACnetConstructedDataElement could not parse anything"]
+ [validation 'isApplicationTag || isContextTag || isConstructedData'
+ "BACnetConstructedDataElement could not parse anything" ]
]
[enum uint 16 BVLCResultCode
[plc4x] 01/06: test(plc4j/bacnet): added method to get a particular BVLC by package number
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 fd1d2db79d13f6b23133cb7ed22788a5dffb8ec8
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 13 10:32:50 2022 +0200
test(plc4j/bacnet): added method to get a particular BVLC by package number
---
.../plc4x/java/bacnetip/RandomPackagesTest.java | 25 +++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
index d86c0ee577..fcfd0837f2 100644
--- a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
+++ b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
@@ -3845,7 +3845,7 @@ public class RandomPackagesTest {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("plugfest-tridium-1.pcap", BACNET_BPF_FILTER_UDP);
return List.of(pcapEvaluator.parseEmAll(
// TODO: check broken parsing
- 2312 ,
+ 2312,
// TODO: check broken parsing
2317,
// TODO: check broken parsing
@@ -6348,6 +6348,7 @@ public class RandomPackagesTest {
protected final PcapHandle pcapHandle;
// maps timestamp to package number
protected final Map<Timestamp, Integer> timestampToPackageNumberMap;
+ protected final Map<Integer, Packet> packageMap;
// maps read package (index) to package number
protected final List<Integer> packageNumbers;
protected final int maxPackages;
@@ -6361,13 +6362,17 @@ public class RandomPackagesTest {
String toParse = DownloadAndCache(pcapFile);
LOGGER.info("Reading {}", toParse);
PcapHandle intermediateHandle = getHandle(toParse);
+ packageMap = new HashMap<>();
int packageNumber = 0;
if (filter != null) {
// In case of filtering we need to read all packages
LOGGER.info("Building timestamp number map");
timestampToPackageNumberMap = new HashMap<>();
- while (intermediateHandle.getNextPacket() != null) {
- timestampToPackageNumberMap.put(intermediateHandle.getTimestamp(), ++packageNumber);
+ Packet packet;
+ while ((packet = intermediateHandle.getNextPacket()) != null) {
+ int currentPackageNumber = ++packageNumber;
+ packageMap.put(currentPackageNumber, packet);
+ timestampToPackageNumberMap.put(intermediateHandle.getTimestamp(), currentPackageNumber);
}
intermediateHandle.close();
// Count package numbers now
@@ -6386,8 +6391,10 @@ public class RandomPackagesTest {
} else {
timestampToPackageNumberMap = null;
packageNumbers = null;
- while (intermediateHandle.getNextPacket() != null) {
- packageNumber++;
+ Packet packet;
+ while ((packet = intermediateHandle.getNextPacket()) != null) {
+ int currentPackageNumber = ++packageNumber;
+ packageMap.put(currentPackageNumber, packet);
}
intermediateHandle.close();
intermediateHandle = getHandle(toParse);
@@ -6423,6 +6430,10 @@ public class RandomPackagesTest {
return nextBVLC(null);
}
+ public BVLC getBVLC(int packageNumber) throws ParseException {
+ return getBvlc(packageMap.get(packageNumber));
+ }
+
public BVLC nextBVLC(Integer ensurePackageNumber) throws NotOpenException, ParseException {
Packet packet = nextPacket();
if (packet == null) {
@@ -6443,6 +6454,10 @@ public class RandomPackagesTest {
throw new IllegalArgumentException("Could not find package with package number " + ensurePackageNumber);
}
}
+ return getBvlc(packet);
+ }
+
+ private BVLC getBvlc(Packet packet) throws ParseException {
UdpPacket udpPacket = packet.get(UdpPacket.class);
assumeTrue(udpPacket != null, "nextBVLC assumes a UDP Packet. If non is there it might by LLC");
LOGGER.info("Handling UDP\n{}", udpPacket);
[plc4x] 03/06: feat(bacnet): implemented PrivateTransfer
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 c75c2f05bf7e7288010d9f573211bf38027782bb
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 13 11:20:54 2022 +0200
feat(bacnet): implemented PrivateTransfer
---
.gitignore | 1 +
...firmedServiceRequestConfirmedPrivateTransfer.go | 139 +++++++++++++++++++-
...tConfirmedServiceRequestConfirmedTextMessage.go | 5 +
.../BACnetServiceAckConfirmedPrivateTransfer.go | 140 ++++++++++++++++++++-
...rmedServiceRequestUnconfirmedPrivateTransfer.go | 4 +-
.../resources/protocols/bacnetip/bacnetip.mspec | 14 ++-
6 files changed, 292 insertions(+), 11 deletions(-)
diff --git a/.gitignore b/.gitignore
index 46be4cf264..e54141d807 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
*.iml
.vscode/**
.java-version
+.attach_pid*
# Sensitive or high-churn files:
.idea/**/dataSources/
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
index 836d4a4cbe..e86efb4f1b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.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,9 @@ import (
// BACnetConfirmedServiceRequestConfirmedPrivateTransfer is the data-structure of this message
type BACnetConfirmedServiceRequestConfirmedPrivateTransfer struct {
*BACnetConfirmedServiceRequest
+ VendorId *BACnetContextTagUnsignedInteger
+ ServiceNumber *BACnetContextTagUnsignedInteger
+ ServiceParameters *BACnetPropertyValues
// Arguments.
ServiceRequestLength uint16
@@ -36,6 +41,12 @@ type BACnetConfirmedServiceRequestConfirmedPrivateTransfer struct {
// IBACnetConfirmedServiceRequestConfirmedPrivateTransfer is the corresponding interface of BACnetConfirmedServiceRequestConfirmedPrivateTransfer
type IBACnetConfirmedServiceRequestConfirmedPrivateTransfer interface {
IBACnetConfirmedServiceRequest
+ // GetVendorId returns VendorId (property field)
+ GetVendorId() *BACnetContextTagUnsignedInteger
+ // GetServiceNumber returns ServiceNumber (property field)
+ GetServiceNumber() *BACnetContextTagUnsignedInteger
+ // GetServiceParameters returns ServiceParameters (property field)
+ GetServiceParameters() *BACnetPropertyValues
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -65,9 +76,34 @@ func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetParent() *BAC
return m.BACnetConfirmedServiceRequest
}
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetVendorId() *BACnetContextTagUnsignedInteger {
+ return m.VendorId
+}
+
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetServiceNumber() *BACnetContextTagUnsignedInteger {
+ return m.ServiceNumber
+}
+
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetServiceParameters() *BACnetPropertyValues {
+ return m.ServiceParameters
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
// NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer factory function for BACnetConfirmedServiceRequestConfirmedPrivateTransfer
-func NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer(serviceRequestLength uint16) *BACnetConfirmedServiceRequestConfirmedPrivateTransfer {
+func NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer(vendorId *BACnetContextTagUnsignedInteger, serviceNumber *BACnetContextTagUnsignedInteger, serviceParameters *BACnetPropertyValues, serviceRequestLength uint16) *BACnetConfirmedServiceRequestConfirmedPrivateTransfer {
_result := &BACnetConfirmedServiceRequestConfirmedPrivateTransfer{
+ VendorId: vendorId,
+ ServiceNumber: serviceNumber,
+ ServiceParameters: serviceParameters,
BACnetConfirmedServiceRequest: NewBACnetConfirmedServiceRequest(serviceRequestLength),
}
_result.Child = _result
@@ -101,6 +137,17 @@ func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetLengthInBits(
func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) GetLengthInBitsConditional(lastItem bool) uint16 {
lengthInBits := uint16(m.GetParentLengthInBits())
+ // Simple field (vendorId)
+ lengthInBits += m.VendorId.GetLengthInBits()
+
+ // Simple field (serviceNumber)
+ lengthInBits += m.ServiceNumber.GetLengthInBits()
+
+ // Optional Field (serviceParameters)
+ if m.ServiceParameters != nil {
+ lengthInBits += (*m.ServiceParameters).GetLengthInBits()
+ }
+
return lengthInBits
}
@@ -115,12 +162,62 @@ func BACnetConfirmedServiceRequestConfirmedPrivateTransferParse(readBuffer utils
currentPos := readBuffer.GetPos()
_ = currentPos
+ // Simple Field (vendorId)
+ if pullErr := readBuffer.PullContext("vendorId"); pullErr != nil {
+ return nil, pullErr
+ }
+ _vendorId, _vendorIdErr := BACnetContextTagParse(readBuffer, uint8(uint8(0)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
+ if _vendorIdErr != nil {
+ return nil, errors.Wrap(_vendorIdErr, "Error parsing 'vendorId' field")
+ }
+ vendorId := CastBACnetContextTagUnsignedInteger(_vendorId)
+ if closeErr := readBuffer.CloseContext("vendorId"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Simple Field (serviceNumber)
+ if pullErr := readBuffer.PullContext("serviceNumber"); pullErr != nil {
+ return nil, pullErr
+ }
+ _serviceNumber, _serviceNumberErr := BACnetContextTagParse(readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
+ if _serviceNumberErr != nil {
+ return nil, errors.Wrap(_serviceNumberErr, "Error parsing 'serviceNumber' field")
+ }
+ serviceNumber := CastBACnetContextTagUnsignedInteger(_serviceNumber)
+ if closeErr := readBuffer.CloseContext("serviceNumber"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Optional Field (serviceParameters) (Can be skipped, if a given expression evaluates to false)
+ var serviceParameters *BACnetPropertyValues = nil
+ {
+ currentPos = readBuffer.GetPos()
+ if pullErr := readBuffer.PullContext("serviceParameters"); pullErr != nil {
+ return nil, pullErr
+ }
+ _val, _err := BACnetPropertyValuesParse(readBuffer, uint8(2), BACnetObjectType_VENDOR_PROPRIETARY_VALUE)
+ 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 'serviceParameters' field")
+ default:
+ serviceParameters = CastBACnetPropertyValues(_val)
+ if closeErr := readBuffer.CloseContext("serviceParameters"); closeErr != nil {
+ return nil, closeErr
+ }
+ }
+ }
+
if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestConfirmedPrivateTransfer"); closeErr != nil {
return nil, closeErr
}
// Create a partially initialized instance
_child := &BACnetConfirmedServiceRequestConfirmedPrivateTransfer{
+ VendorId: CastBACnetContextTagUnsignedInteger(vendorId),
+ ServiceNumber: CastBACnetContextTagUnsignedInteger(serviceNumber),
+ ServiceParameters: CastBACnetPropertyValues(serviceParameters),
BACnetConfirmedServiceRequest: &BACnetConfirmedServiceRequest{},
}
_child.BACnetConfirmedServiceRequest.Child = _child
@@ -133,6 +230,46 @@ func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) Serialize(writeB
return pushErr
}
+ // Simple Field (vendorId)
+ if pushErr := writeBuffer.PushContext("vendorId"); pushErr != nil {
+ return pushErr
+ }
+ _vendorIdErr := m.VendorId.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("vendorId"); popErr != nil {
+ return popErr
+ }
+ if _vendorIdErr != nil {
+ return errors.Wrap(_vendorIdErr, "Error serializing 'vendorId' field")
+ }
+
+ // Simple Field (serviceNumber)
+ if pushErr := writeBuffer.PushContext("serviceNumber"); pushErr != nil {
+ return pushErr
+ }
+ _serviceNumberErr := m.ServiceNumber.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("serviceNumber"); popErr != nil {
+ return popErr
+ }
+ if _serviceNumberErr != nil {
+ return errors.Wrap(_serviceNumberErr, "Error serializing 'serviceNumber' field")
+ }
+
+ // Optional Field (serviceParameters) (Can be skipped, if the value is null)
+ var serviceParameters *BACnetPropertyValues = nil
+ if m.ServiceParameters != nil {
+ if pushErr := writeBuffer.PushContext("serviceParameters"); pushErr != nil {
+ return pushErr
+ }
+ serviceParameters = m.ServiceParameters
+ _serviceParametersErr := serviceParameters.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("serviceParameters"); popErr != nil {
+ return popErr
+ }
+ if _serviceParametersErr != nil {
+ return errors.Wrap(_serviceParametersErr, "Error serializing 'serviceParameters' field")
+ }
+ }
+
if popErr := writeBuffer.PopContext("BACnetConfirmedServiceRequestConfirmedPrivateTransfer"); popErr != nil {
return popErr
}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
index b9bac88ebf..45c9c57808 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
@@ -115,6 +115,11 @@ func BACnetConfirmedServiceRequestConfirmedTextMessageParse(readBuffer utils.Rea
currentPos := readBuffer.GetPos()
_ = currentPos
+ // Validation
+ if !(bool((1) == (2))) {
+ return nil, utils.ParseAssertError{"TODO: implement me"}
+ }
+
if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestConfirmedTextMessage"); closeErr != nil {
return nil, closeErr
}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
index 737b830e0e..cc1ad6455b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.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,9 @@ import (
// BACnetServiceAckConfirmedPrivateTransfer is the data-structure of this message
type BACnetServiceAckConfirmedPrivateTransfer struct {
*BACnetServiceAck
+ VendorId *BACnetContextTagUnsignedInteger
+ ServiceNumber *BACnetContextTagUnsignedInteger
+ ResultBlock *BACnetPropertyValues
// Arguments.
ServiceRequestLength uint16
@@ -36,6 +41,12 @@ type BACnetServiceAckConfirmedPrivateTransfer struct {
// IBACnetServiceAckConfirmedPrivateTransfer is the corresponding interface of BACnetServiceAckConfirmedPrivateTransfer
type IBACnetServiceAckConfirmedPrivateTransfer interface {
IBACnetServiceAck
+ // GetVendorId returns VendorId (property field)
+ GetVendorId() *BACnetContextTagUnsignedInteger
+ // GetServiceNumber returns ServiceNumber (property field)
+ GetServiceNumber() *BACnetContextTagUnsignedInteger
+ // GetResultBlock returns ResultBlock (property field)
+ GetResultBlock() *BACnetPropertyValues
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -64,9 +75,34 @@ func (m *BACnetServiceAckConfirmedPrivateTransfer) GetParent() *BACnetServiceAck
return m.BACnetServiceAck
}
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetServiceAckConfirmedPrivateTransfer) GetVendorId() *BACnetContextTagUnsignedInteger {
+ return m.VendorId
+}
+
+func (m *BACnetServiceAckConfirmedPrivateTransfer) GetServiceNumber() *BACnetContextTagUnsignedInteger {
+ return m.ServiceNumber
+}
+
+func (m *BACnetServiceAckConfirmedPrivateTransfer) GetResultBlock() *BACnetPropertyValues {
+ return m.ResultBlock
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
// NewBACnetServiceAckConfirmedPrivateTransfer factory function for BACnetServiceAckConfirmedPrivateTransfer
-func NewBACnetServiceAckConfirmedPrivateTransfer(serviceRequestLength uint16) *BACnetServiceAckConfirmedPrivateTransfer {
+func NewBACnetServiceAckConfirmedPrivateTransfer(vendorId *BACnetContextTagUnsignedInteger, serviceNumber *BACnetContextTagUnsignedInteger, resultBlock *BACnetPropertyValues, serviceRequestLength uint16) *BACnetServiceAckConfirmedPrivateTransfer {
_result := &BACnetServiceAckConfirmedPrivateTransfer{
+ VendorId: vendorId,
+ ServiceNumber: serviceNumber,
+ ResultBlock: resultBlock,
BACnetServiceAck: NewBACnetServiceAck(serviceRequestLength),
}
_result.Child = _result
@@ -100,6 +136,17 @@ func (m *BACnetServiceAckConfirmedPrivateTransfer) GetLengthInBits() uint16 {
func (m *BACnetServiceAckConfirmedPrivateTransfer) GetLengthInBitsConditional(lastItem bool) uint16 {
lengthInBits := uint16(m.GetParentLengthInBits())
+ // Simple field (vendorId)
+ lengthInBits += m.VendorId.GetLengthInBits()
+
+ // Simple field (serviceNumber)
+ lengthInBits += m.ServiceNumber.GetLengthInBits()
+
+ // Optional Field (resultBlock)
+ if m.ResultBlock != nil {
+ lengthInBits += (*m.ResultBlock).GetLengthInBits()
+ }
+
return lengthInBits
}
@@ -114,9 +161,51 @@ func BACnetServiceAckConfirmedPrivateTransferParse(readBuffer utils.ReadBuffer,
currentPos := readBuffer.GetPos()
_ = currentPos
- // Validation
- if !(bool((1) == (2))) {
- return nil, utils.ParseAssertError{"TODO: implement me"}
+ // Simple Field (vendorId)
+ if pullErr := readBuffer.PullContext("vendorId"); pullErr != nil {
+ return nil, pullErr
+ }
+ _vendorId, _vendorIdErr := BACnetContextTagParse(readBuffer, uint8(uint8(0)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
+ if _vendorIdErr != nil {
+ return nil, errors.Wrap(_vendorIdErr, "Error parsing 'vendorId' field")
+ }
+ vendorId := CastBACnetContextTagUnsignedInteger(_vendorId)
+ if closeErr := readBuffer.CloseContext("vendorId"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Simple Field (serviceNumber)
+ if pullErr := readBuffer.PullContext("serviceNumber"); pullErr != nil {
+ return nil, pullErr
+ }
+ _serviceNumber, _serviceNumberErr := BACnetContextTagParse(readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
+ if _serviceNumberErr != nil {
+ return nil, errors.Wrap(_serviceNumberErr, "Error parsing 'serviceNumber' field")
+ }
+ serviceNumber := CastBACnetContextTagUnsignedInteger(_serviceNumber)
+ if closeErr := readBuffer.CloseContext("serviceNumber"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Optional Field (resultBlock) (Can be skipped, if a given expression evaluates to false)
+ var resultBlock *BACnetPropertyValues = nil
+ {
+ currentPos = readBuffer.GetPos()
+ if pullErr := readBuffer.PullContext("resultBlock"); pullErr != nil {
+ return nil, pullErr
+ }
+ _val, _err := BACnetPropertyValuesParse(readBuffer, uint8(2), BACnetObjectType_VENDOR_PROPRIETARY_VALUE)
+ 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 'resultBlock' field")
+ default:
+ resultBlock = CastBACnetPropertyValues(_val)
+ if closeErr := readBuffer.CloseContext("resultBlock"); closeErr != nil {
+ return nil, closeErr
+ }
+ }
}
if closeErr := readBuffer.CloseContext("BACnetServiceAckConfirmedPrivateTransfer"); closeErr != nil {
@@ -125,6 +214,9 @@ func BACnetServiceAckConfirmedPrivateTransferParse(readBuffer utils.ReadBuffer,
// Create a partially initialized instance
_child := &BACnetServiceAckConfirmedPrivateTransfer{
+ VendorId: CastBACnetContextTagUnsignedInteger(vendorId),
+ ServiceNumber: CastBACnetContextTagUnsignedInteger(serviceNumber),
+ ResultBlock: CastBACnetPropertyValues(resultBlock),
BACnetServiceAck: &BACnetServiceAck{},
}
_child.BACnetServiceAck.Child = _child
@@ -137,6 +229,46 @@ func (m *BACnetServiceAckConfirmedPrivateTransfer) Serialize(writeBuffer utils.W
return pushErr
}
+ // Simple Field (vendorId)
+ if pushErr := writeBuffer.PushContext("vendorId"); pushErr != nil {
+ return pushErr
+ }
+ _vendorIdErr := m.VendorId.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("vendorId"); popErr != nil {
+ return popErr
+ }
+ if _vendorIdErr != nil {
+ return errors.Wrap(_vendorIdErr, "Error serializing 'vendorId' field")
+ }
+
+ // Simple Field (serviceNumber)
+ if pushErr := writeBuffer.PushContext("serviceNumber"); pushErr != nil {
+ return pushErr
+ }
+ _serviceNumberErr := m.ServiceNumber.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("serviceNumber"); popErr != nil {
+ return popErr
+ }
+ if _serviceNumberErr != nil {
+ return errors.Wrap(_serviceNumberErr, "Error serializing 'serviceNumber' field")
+ }
+
+ // Optional Field (resultBlock) (Can be skipped, if the value is null)
+ var resultBlock *BACnetPropertyValues = nil
+ if m.ResultBlock != nil {
+ if pushErr := writeBuffer.PushContext("resultBlock"); pushErr != nil {
+ return pushErr
+ }
+ resultBlock = m.ResultBlock
+ _resultBlockErr := resultBlock.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("resultBlock"); popErr != nil {
+ return popErr
+ }
+ if _resultBlockErr != nil {
+ return errors.Wrap(_resultBlockErr, "Error serializing 'resultBlock' field")
+ }
+ }
+
if popErr := writeBuffer.PopContext("BACnetServiceAckConfirmedPrivateTransfer"); popErr != nil {
return popErr
}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
index 0562a8c1a6..aaa7cc8c9d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
@@ -166,7 +166,7 @@ func BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(readBuffer u
if pullErr := readBuffer.PullContext("vendorId"); pullErr != nil {
return nil, pullErr
}
- _vendorId, _vendorIdErr := BACnetContextTagParse(readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
+ _vendorId, _vendorIdErr := BACnetContextTagParse(readBuffer, uint8(uint8(0)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
if _vendorIdErr != nil {
return nil, errors.Wrap(_vendorIdErr, "Error parsing 'vendorId' field")
}
@@ -179,7 +179,7 @@ func BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(readBuffer u
if pullErr := readBuffer.PullContext("serviceNumber"); pullErr != nil {
return nil, pullErr
}
- _serviceNumber, _serviceNumberErr := BACnetContextTagParse(readBuffer, uint8(uint8(2)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
+ _serviceNumber, _serviceNumberErr := BACnetContextTagParse(readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
if _serviceNumberErr != nil {
return nil, errors.Wrap(_serviceNumberErr, "Error parsing 'serviceNumber' field")
}
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index 12434045ed..96aa64c6ce 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -456,8 +456,13 @@
]
['CONFIRMED_PRIVATE_TRANSFER' BACnetConfirmedServiceRequestConfirmedPrivateTransfer
+ [simple BACnetContextTagUnsignedInteger('0', 'BACnetDataType.UNSIGNED_INTEGER') vendorId ]// TODO: vendor list?
+ [simple BACnetContextTagUnsignedInteger('1', 'BACnetDataType.UNSIGNED_INTEGER') serviceNumber ]
+ [optional BACnetPropertyValues('2', 'BACnetObjectType.VENDOR_PROPRIETARY_VALUE') serviceParameters ] //TODO: what should we use as object identifier here?
]
['CONFIRMED_TEXT_MESSAGE' BACnetConfirmedServiceRequestConfirmedTextMessage
+ // TODO: implement me
+ [validation '1 == 2' "TODO: implement me"]
]
['REINITIALIZE_DEVICE' BACnetConfirmedServiceRequestReinitializeDevice
[simple BACnetContextTagDeviceState('0', 'BACnetDataType.BACNET_DEVICE_STATE') reinitializedStateOfDevice ]
@@ -717,8 +722,8 @@
[optional BACnetNotificationParameters('12', 'eventObjectIdentifier.objectType') eventValues ]
]
['UNCONFIRMED_PRIVATE_TRANSFER' BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer
- [simple BACnetContextTagUnsignedInteger('1', 'BACnetDataType.UNSIGNED_INTEGER') vendorId ]// TODO: vendor list?
- [simple BACnetContextTagUnsignedInteger('2', 'BACnetDataType.UNSIGNED_INTEGER') serviceNumber ]
+ [simple BACnetContextTagUnsignedInteger('0', 'BACnetDataType.UNSIGNED_INTEGER') vendorId ]// TODO: vendor list?
+ [simple BACnetContextTagUnsignedInteger('1', 'BACnetDataType.UNSIGNED_INTEGER') serviceNumber ]
[optional BACnetPropertyValues('2', 'BACnetObjectType.VENDOR_PROPRIETARY_VALUE') serviceParameters ] //TODO: what should we use as object identifier here?
]
['UNCONFIRMED_TEXT_MESSAGE' BACnetUnconfirmedServiceRequestUnconfirmedTextMessage
@@ -907,8 +912,9 @@
[validation '1 == 2' "TODO: implement me"]
]
['CONFIRMED_PRIVATE_TRANSFER' BACnetServiceAckConfirmedPrivateTransfer
- // TODO: implement me
- [validation '1 == 2' "TODO: implement me"]
+ [simple BACnetContextTagUnsignedInteger('0', 'BACnetDataType.UNSIGNED_INTEGER') vendorId ]// TODO: vendor list?
+ [simple BACnetContextTagUnsignedInteger('1', 'BACnetDataType.UNSIGNED_INTEGER') serviceNumber ]
+ [optional BACnetPropertyValues('2', 'BACnetObjectType.VENDOR_PROPRIETARY_VALUE') resultBlock ] //TODO: what should we use as object identifier here?
]
['CONFIRMED_TEXT_MESSAGE' BACnetServiceAckConfirmedTextMessage
// TODO: implement me
[plc4x] 04/06: feat(bacnet): implemented read range
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 ddfad995ae93cb33cdd61860c9b0b967ecf254e7
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 13 11:58:32 2022 +0200
feat(bacnet): implemented read range
---
.../plc4go/bacnetip/readwrite/ParserHelper.go | 20 +-
.../plc4go/bacnetip/readwrite/XmlParserHelper.go | 23 +-
.../BACnetConfirmedServiceRequestReadRange.go | 191 +++++++++++-
.../BACnetConfirmedServiceRequestReadRangeRange.go | 286 +++++++++++++++++
...firmedServiceRequestReadRangeRangeByPosition.go | 234 ++++++++++++++
...ServiceRequestReadRangeRangeBySequenceNumber.go | 234 ++++++++++++++
...tConfirmedServiceRequestReadRangeRangeByTime.go | 234 ++++++++++++++
.../model/BACnetConstructedDataEventTimestamps.go | 14 +-
.../bacnetip/readwrite/model/BACnetDateTime.go | 85 +----
...BACnetDateTime.go => BACnetDateTimeEnclosed.go} | 129 +++-----
.../bacnetip/readwrite/model/BACnetResultFlags.go | 219 +++++++++++++
.../readwrite/model/BACnetServiceAckReadRange.go | 320 ++++++++++++++++++-
.../readwrite/model/BACnetTimeStampDateTime.go | 14 +-
.../plc4x/java/bacnetip/RandomPackagesTest.java | 346 ++++-----------------
.../resources/protocols/bacnetip/bacnetip.mspec | 69 +++-
15 files changed, 1922 insertions(+), 496 deletions(-)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
index 85ffd86fd0..f6456281b1 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
@@ -146,6 +146,12 @@ func (m BacnetipParserHelper) Parse(typeName string, arguments []string, io util
return model.BACnetTimeStampEnclosedParse(io, tagNumber)
case "BACnetSegmentation":
return model.BACnetSegmentationParse(io)
+ case "BACnetResultFlags":
+ tagNumber, err := utils.StrToUint8(arguments[0])
+ if err != nil {
+ return nil, errors.Wrap(err, "Error parsing")
+ }
+ return model.BACnetResultFlagsParse(io, tagNumber)
case "BACnetTagPayloadTime":
return model.BACnetTagPayloadTimeParse(io)
case "BACnetConfirmedServiceRequestReinitializeDeviceEnableDisable":
@@ -172,6 +178,12 @@ func (m BacnetipParserHelper) Parse(typeName string, arguments []string, io util
return model.BACnetConfirmedServiceRequestAtomicReadFileStreamOrRecordParse(io)
case "BVLC":
return model.BVLCParse(io)
+ case "BACnetDateTimeEnclosed":
+ tagNumber, err := utils.StrToUint8(arguments[0])
+ if err != nil {
+ return nil, errors.Wrap(err, "Error parsing")
+ }
+ return model.BACnetDateTimeEnclosedParse(io, tagNumber)
case "BACnetTagPayloadObjectIdentifier":
return model.BACnetTagPayloadObjectIdentifierParse(io)
case "BVLCBroadcastDistributionTableEntry":
@@ -180,11 +192,7 @@ func (m BacnetipParserHelper) Parse(typeName string, arguments []string, io util
objectType := model.BACnetObjectTypeByName(arguments[0])
return model.BACnetPropertyWriteDefinitionParse(io, objectType)
case "BACnetDateTime":
- tagNumber, err := utils.StrToUint8(arguments[0])
- if err != nil {
- return nil, errors.Wrap(err, "Error parsing")
- }
- return model.BACnetDateTimeParse(io, tagNumber)
+ return model.BACnetDateTimeParse(io)
case "APDU":
apduLength, err := utils.StrToUint16(arguments[0])
if err != nil {
@@ -200,6 +208,8 @@ func (m BacnetipParserHelper) Parse(typeName string, arguments []string, io util
return nil, errors.Wrap(err, "Error parsing")
}
return model.BACnetTagPayloadCharacterStringParse(io, actualLength)
+ case "BACnetConfirmedServiceRequestReadRangeRange":
+ return model.BACnetConfirmedServiceRequestReadRangeRangeParse(io)
case "BACnetError":
return model.BACnetErrorParse(io)
case "BACnetTimeStamp":
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
index eeaeb48fcd..5dae9ba0a3 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
@@ -171,6 +171,13 @@ func (m BacnetipXmlParserHelper) Parse(typeName string, xmlString string, parser
return model.BACnetTimeStampEnclosedParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), tagNumber)
case "BACnetSegmentation":
return model.BACnetSegmentationParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+ case "BACnetResultFlags":
+ parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 8)
+ if err != nil {
+ return nil, err
+ }
+ tagNumber := uint8(parsedUint0)
+ return model.BACnetResultFlagsParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), tagNumber)
case "BACnetTagPayloadTime":
return model.BACnetTagPayloadTimeParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
case "BACnetConfirmedServiceRequestReinitializeDeviceEnableDisable":
@@ -200,6 +207,13 @@ func (m BacnetipXmlParserHelper) Parse(typeName string, xmlString string, parser
return model.BACnetConfirmedServiceRequestAtomicReadFileStreamOrRecordParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
case "BVLC":
return model.BVLCParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+ case "BACnetDateTimeEnclosed":
+ parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 8)
+ if err != nil {
+ return nil, err
+ }
+ tagNumber := uint8(parsedUint0)
+ return model.BACnetDateTimeEnclosedParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), tagNumber)
case "BACnetTagPayloadObjectIdentifier":
return model.BACnetTagPayloadObjectIdentifierParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
case "BVLCBroadcastDistributionTableEntry":
@@ -208,12 +222,7 @@ func (m BacnetipXmlParserHelper) Parse(typeName string, xmlString string, parser
objectType := model.BACnetObjectTypeByName(parserArguments[0])
return model.BACnetPropertyWriteDefinitionParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), objectType)
case "BACnetDateTime":
- parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 8)
- if err != nil {
- return nil, err
- }
- tagNumber := uint8(parsedUint0)
- return model.BACnetDateTimeParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), tagNumber)
+ return model.BACnetDateTimeParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
case "APDU":
parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 16)
if err != nil {
@@ -231,6 +240,8 @@ func (m BacnetipXmlParserHelper) Parse(typeName string, xmlString string, parser
}
actualLength := uint32(parsedUint0)
return model.BACnetTagPayloadCharacterStringParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), actualLength)
+ case "BACnetConfirmedServiceRequestReadRangeRange":
+ return model.BACnetConfirmedServiceRequestReadRangeRangeParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
case "BACnetError":
return model.BACnetErrorParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
case "BACnetTimeStamp":
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
index ec7096124b..807ffaf6c4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.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,10 @@ import (
// BACnetConfirmedServiceRequestReadRange is the data-structure of this message
type BACnetConfirmedServiceRequestReadRange struct {
*BACnetConfirmedServiceRequest
+ ObjectIdentifier *BACnetContextTagObjectIdentifier
+ PropertyIdentifier *BACnetContextTagPropertyIdentifier
+ PropertyArrayIndex *BACnetContextTagUnsignedInteger
+ ReadRange *BACnetConfirmedServiceRequestReadRangeRange
// Arguments.
ServiceRequestLength uint16
@@ -36,6 +42,14 @@ type BACnetConfirmedServiceRequestReadRange struct {
// IBACnetConfirmedServiceRequestReadRange is the corresponding interface of BACnetConfirmedServiceRequestReadRange
type IBACnetConfirmedServiceRequestReadRange interface {
IBACnetConfirmedServiceRequest
+ // GetObjectIdentifier returns ObjectIdentifier (property field)
+ GetObjectIdentifier() *BACnetContextTagObjectIdentifier
+ // GetPropertyIdentifier returns PropertyIdentifier (property field)
+ GetPropertyIdentifier() *BACnetContextTagPropertyIdentifier
+ // GetPropertyArrayIndex returns PropertyArrayIndex (property field)
+ GetPropertyArrayIndex() *BACnetContextTagUnsignedInteger
+ // GetReadRange returns ReadRange (property field)
+ GetReadRange() *BACnetConfirmedServiceRequestReadRangeRange
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -65,9 +79,39 @@ func (m *BACnetConfirmedServiceRequestReadRange) GetParent() *BACnetConfirmedSer
return m.BACnetConfirmedServiceRequest
}
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestReadRange) GetObjectIdentifier() *BACnetContextTagObjectIdentifier {
+ return m.ObjectIdentifier
+}
+
+func (m *BACnetConfirmedServiceRequestReadRange) GetPropertyIdentifier() *BACnetContextTagPropertyIdentifier {
+ return m.PropertyIdentifier
+}
+
+func (m *BACnetConfirmedServiceRequestReadRange) GetPropertyArrayIndex() *BACnetContextTagUnsignedInteger {
+ return m.PropertyArrayIndex
+}
+
+func (m *BACnetConfirmedServiceRequestReadRange) GetReadRange() *BACnetConfirmedServiceRequestReadRangeRange {
+ return m.ReadRange
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
// NewBACnetConfirmedServiceRequestReadRange factory function for BACnetConfirmedServiceRequestReadRange
-func NewBACnetConfirmedServiceRequestReadRange(serviceRequestLength uint16) *BACnetConfirmedServiceRequestReadRange {
+func NewBACnetConfirmedServiceRequestReadRange(objectIdentifier *BACnetContextTagObjectIdentifier, propertyIdentifier *BACnetContextTagPropertyIdentifier, propertyArrayIndex *BACnetContextTagUnsignedInteger, readRange *BACnetConfirmedServiceRequestReadRangeRange, serviceRequestLength uint16) *BACnetConfirmedServiceRequestReadRange {
_result := &BACnetConfirmedServiceRequestReadRange{
+ ObjectIdentifier: objectIdentifier,
+ PropertyIdentifier: propertyIdentifier,
+ PropertyArrayIndex: propertyArrayIndex,
+ ReadRange: readRange,
BACnetConfirmedServiceRequest: NewBACnetConfirmedServiceRequest(serviceRequestLength),
}
_result.Child = _result
@@ -101,6 +145,22 @@ func (m *BACnetConfirmedServiceRequestReadRange) GetLengthInBits() uint16 {
func (m *BACnetConfirmedServiceRequestReadRange) GetLengthInBitsConditional(lastItem bool) uint16 {
lengthInBits := uint16(m.GetParentLengthInBits())
+ // Simple field (objectIdentifier)
+ lengthInBits += m.ObjectIdentifier.GetLengthInBits()
+
+ // Simple field (propertyIdentifier)
+ lengthInBits += m.PropertyIdentifier.GetLengthInBits()
+
+ // Optional Field (propertyArrayIndex)
+ if m.PropertyArrayIndex != nil {
+ lengthInBits += (*m.PropertyArrayIndex).GetLengthInBits()
+ }
+
+ // Optional Field (readRange)
+ if m.ReadRange != nil {
+ lengthInBits += (*m.ReadRange).GetLengthInBits()
+ }
+
return lengthInBits
}
@@ -115,9 +175,72 @@ func BACnetConfirmedServiceRequestReadRangeParse(readBuffer utils.ReadBuffer, se
currentPos := readBuffer.GetPos()
_ = currentPos
- // Validation
- if !(bool((1) == (2))) {
- return nil, utils.ParseAssertError{"TODO: implement me"}
+ // Simple Field (objectIdentifier)
+ if pullErr := readBuffer.PullContext("objectIdentifier"); pullErr != nil {
+ return nil, pullErr
+ }
+ _objectIdentifier, _objectIdentifierErr := BACnetContextTagParse(readBuffer, uint8(uint8(0)), BACnetDataType(BACnetDataType_BACNET_OBJECT_IDENTIFIER))
+ if _objectIdentifierErr != nil {
+ return nil, errors.Wrap(_objectIdentifierErr, "Error parsing 'objectIdentifier' field")
+ }
+ objectIdentifier := CastBACnetContextTagObjectIdentifier(_objectIdentifier)
+ if closeErr := readBuffer.CloseContext("objectIdentifier"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Simple Field (propertyIdentifier)
+ if pullErr := readBuffer.PullContext("propertyIdentifier"); pullErr != nil {
+ return nil, pullErr
+ }
+ _propertyIdentifier, _propertyIdentifierErr := BACnetContextTagParse(readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_BACNET_PROPERTY_IDENTIFIER))
+ if _propertyIdentifierErr != nil {
+ return nil, errors.Wrap(_propertyIdentifierErr, "Error parsing 'propertyIdentifier' field")
+ }
+ propertyIdentifier := CastBACnetContextTagPropertyIdentifier(_propertyIdentifier)
+ if closeErr := readBuffer.CloseContext("propertyIdentifier"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Optional Field (propertyArrayIndex) (Can be skipped, if a given expression evaluates to false)
+ var propertyArrayIndex *BACnetContextTagUnsignedInteger = nil
+ {
+ currentPos = readBuffer.GetPos()
+ if pullErr := readBuffer.PullContext("propertyArrayIndex"); pullErr != nil {
+ return nil, pullErr
+ }
+ _val, _err := BACnetContextTagParse(readBuffer, uint8(2), BACnetDataType_UNSIGNED_INTEGER)
+ 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 'propertyArrayIndex' field")
+ default:
+ propertyArrayIndex = CastBACnetContextTagUnsignedInteger(_val)
+ if closeErr := readBuffer.CloseContext("propertyArrayIndex"); closeErr != nil {
+ return nil, closeErr
+ }
+ }
+ }
+
+ // Optional Field (readRange) (Can be skipped, if a given expression evaluates to false)
+ var readRange *BACnetConfirmedServiceRequestReadRangeRange = nil
+ {
+ currentPos = readBuffer.GetPos()
+ if pullErr := readBuffer.PullContext("readRange"); pullErr != nil {
+ return nil, pullErr
+ }
+ _val, _err := BACnetConfirmedServiceRequestReadRangeRangeParse(readBuffer)
+ 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 'readRange' field")
+ default:
+ readRange = CastBACnetConfirmedServiceRequestReadRangeRange(_val)
+ if closeErr := readBuffer.CloseContext("readRange"); closeErr != nil {
+ return nil, closeErr
+ }
+ }
}
if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestReadRange"); closeErr != nil {
@@ -126,6 +249,10 @@ func BACnetConfirmedServiceRequestReadRangeParse(readBuffer utils.ReadBuffer, se
// Create a partially initialized instance
_child := &BACnetConfirmedServiceRequestReadRange{
+ ObjectIdentifier: CastBACnetContextTagObjectIdentifier(objectIdentifier),
+ PropertyIdentifier: CastBACnetContextTagPropertyIdentifier(propertyIdentifier),
+ PropertyArrayIndex: CastBACnetContextTagUnsignedInteger(propertyArrayIndex),
+ ReadRange: CastBACnetConfirmedServiceRequestReadRangeRange(readRange),
BACnetConfirmedServiceRequest: &BACnetConfirmedServiceRequest{},
}
_child.BACnetConfirmedServiceRequest.Child = _child
@@ -138,6 +265,62 @@ func (m *BACnetConfirmedServiceRequestReadRange) Serialize(writeBuffer utils.Wri
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")
+ }
+
+ // Simple Field (propertyIdentifier)
+ if pushErr := writeBuffer.PushContext("propertyIdentifier"); pushErr != nil {
+ return pushErr
+ }
+ _propertyIdentifierErr := m.PropertyIdentifier.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("propertyIdentifier"); popErr != nil {
+ return popErr
+ }
+ if _propertyIdentifierErr != nil {
+ return errors.Wrap(_propertyIdentifierErr, "Error serializing 'propertyIdentifier' field")
+ }
+
+ // Optional Field (propertyArrayIndex) (Can be skipped, if the value is null)
+ var propertyArrayIndex *BACnetContextTagUnsignedInteger = nil
+ if m.PropertyArrayIndex != nil {
+ if pushErr := writeBuffer.PushContext("propertyArrayIndex"); pushErr != nil {
+ return pushErr
+ }
+ propertyArrayIndex = m.PropertyArrayIndex
+ _propertyArrayIndexErr := propertyArrayIndex.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("propertyArrayIndex"); popErr != nil {
+ return popErr
+ }
+ if _propertyArrayIndexErr != nil {
+ return errors.Wrap(_propertyArrayIndexErr, "Error serializing 'propertyArrayIndex' field")
+ }
+ }
+
+ // Optional Field (readRange) (Can be skipped, if the value is null)
+ var readRange *BACnetConfirmedServiceRequestReadRangeRange = nil
+ if m.ReadRange != nil {
+ if pushErr := writeBuffer.PushContext("readRange"); pushErr != nil {
+ return pushErr
+ }
+ readRange = m.ReadRange
+ _readRangeErr := readRange.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("readRange"); popErr != nil {
+ return popErr
+ }
+ if _readRangeErr != nil {
+ return errors.Wrap(_readRangeErr, "Error serializing 'readRange' field")
+ }
+ }
+
if popErr := writeBuffer.PopContext("BACnetConfirmedServiceRequestReadRange"); popErr != nil {
return popErr
}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRange.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRange.go
new file mode 100644
index 0000000000..857252fc90
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRange.go
@@ -0,0 +1,286 @@
+/*
+ * 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.
+
+// BACnetConfirmedServiceRequestReadRangeRange is the data-structure of this message
+type BACnetConfirmedServiceRequestReadRangeRange struct {
+ PeekedTagHeader *BACnetTagHeader
+ OpeningTag *BACnetOpeningTag
+ ClosingTag *BACnetClosingTag
+ Child IBACnetConfirmedServiceRequestReadRangeRangeChild
+}
+
+// IBACnetConfirmedServiceRequestReadRangeRange is the corresponding interface of BACnetConfirmedServiceRequestReadRangeRange
+type IBACnetConfirmedServiceRequestReadRangeRange interface {
+ // GetPeekedTagHeader returns PeekedTagHeader (property field)
+ GetPeekedTagHeader() *BACnetTagHeader
+ // GetOpeningTag returns OpeningTag (property field)
+ GetOpeningTag() *BACnetOpeningTag
+ // GetClosingTag returns ClosingTag (property field)
+ GetClosingTag() *BACnetClosingTag
+ // GetPeekedTagNumber returns PeekedTagNumber (virtual field)
+ GetPeekedTagNumber() uint8
+ // 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
+}
+
+type IBACnetConfirmedServiceRequestReadRangeRangeParent interface {
+ SerializeParent(writeBuffer utils.WriteBuffer, child IBACnetConfirmedServiceRequestReadRangeRange, serializeChildFunction func() error) error
+ GetTypeName() string
+}
+
+type IBACnetConfirmedServiceRequestReadRangeRangeChild interface {
+ Serialize(writeBuffer utils.WriteBuffer) error
+ InitializeParent(parent *BACnetConfirmedServiceRequestReadRangeRange, peekedTagHeader *BACnetTagHeader, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag)
+ GetParent() *BACnetConfirmedServiceRequestReadRangeRange
+
+ GetTypeName() string
+ IBACnetConfirmedServiceRequestReadRangeRange
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) GetPeekedTagHeader() *BACnetTagHeader {
+ return m.PeekedTagHeader
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) GetOpeningTag() *BACnetOpeningTag {
+ return m.OpeningTag
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) GetClosingTag() *BACnetClosingTag {
+ return m.ClosingTag
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for virtual fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) GetPeekedTagNumber() uint8 {
+ return uint8(m.GetPeekedTagHeader().GetActualTagNumber())
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewBACnetConfirmedServiceRequestReadRangeRange factory function for BACnetConfirmedServiceRequestReadRangeRange
+func NewBACnetConfirmedServiceRequestReadRangeRange(peekedTagHeader *BACnetTagHeader, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) *BACnetConfirmedServiceRequestReadRangeRange {
+ return &BACnetConfirmedServiceRequestReadRangeRange{PeekedTagHeader: peekedTagHeader, OpeningTag: openingTag, ClosingTag: closingTag}
+}
+
+func CastBACnetConfirmedServiceRequestReadRangeRange(structType interface{}) *BACnetConfirmedServiceRequestReadRangeRange {
+ if casted, ok := structType.(BACnetConfirmedServiceRequestReadRangeRange); ok {
+ return &casted
+ }
+ if casted, ok := structType.(*BACnetConfirmedServiceRequestReadRangeRange); ok {
+ return casted
+ }
+ if casted, ok := structType.(IBACnetConfirmedServiceRequestReadRangeRangeChild); ok {
+ return casted.GetParent()
+ }
+ return nil
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) GetTypeName() string {
+ return "BACnetConfirmedServiceRequestReadRangeRange"
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) GetLengthInBits() uint16 {
+ return m.GetLengthInBitsConditional(false)
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) GetLengthInBitsConditional(lastItem bool) uint16 {
+ return m.Child.GetLengthInBits()
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) GetParentLengthInBits() uint16 {
+ lengthInBits := uint16(0)
+
+ // Simple field (openingTag)
+ lengthInBits += m.OpeningTag.GetLengthInBits()
+
+ // A virtual field doesn't have any in- or output.
+
+ // Simple field (closingTag)
+ lengthInBits += m.ClosingTag.GetLengthInBits()
+
+ return lengthInBits
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) GetLengthInBytes() uint16 {
+ return m.GetLengthInBits() / 8
+}
+
+func BACnetConfirmedServiceRequestReadRangeRangeParse(readBuffer utils.ReadBuffer) (*BACnetConfirmedServiceRequestReadRangeRange, error) {
+ if pullErr := readBuffer.PullContext("BACnetConfirmedServiceRequestReadRangeRange"); pullErr != nil {
+ return nil, pullErr
+ }
+ currentPos := readBuffer.GetPos()
+ _ = currentPos
+
+ // Peek Field (peekedTagHeader)
+ currentPos = readBuffer.GetPos()
+ if pullErr := readBuffer.PullContext("peekedTagHeader"); pullErr != nil {
+ return nil, pullErr
+ }
+ peekedTagHeader, _ := BACnetTagHeaderParse(readBuffer)
+ readBuffer.Reset(currentPos)
+
+ // Simple Field (openingTag)
+ if pullErr := readBuffer.PullContext("openingTag"); pullErr != nil {
+ return nil, pullErr
+ }
+ _openingTag, _openingTagErr := BACnetContextTagParse(readBuffer, uint8(peekedTagHeader.GetActualTagNumber()), 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
+ }
+
+ // Virtual field
+ _peekedTagNumber := peekedTagHeader.GetActualTagNumber()
+ peekedTagNumber := uint8(_peekedTagNumber)
+ _ = peekedTagNumber
+
+ // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+ type BACnetConfirmedServiceRequestReadRangeRangeChild interface {
+ InitializeParent(*BACnetConfirmedServiceRequestReadRangeRange, *BACnetTagHeader, *BACnetOpeningTag, *BACnetClosingTag)
+ GetParent() *BACnetConfirmedServiceRequestReadRangeRange
+ }
+ var _child BACnetConfirmedServiceRequestReadRangeRangeChild
+ var typeSwitchError error
+ switch {
+ case peekedTagNumber == 0x3: // BACnetConfirmedServiceRequestReadRangeRangeByPosition
+ _child, typeSwitchError = BACnetConfirmedServiceRequestReadRangeRangeByPositionParse(readBuffer)
+ case peekedTagNumber == 0x6: // BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber
+ _child, typeSwitchError = BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumberParse(readBuffer)
+ case peekedTagNumber == 0x7: // BACnetConfirmedServiceRequestReadRangeRangeByTime
+ _child, typeSwitchError = BACnetConfirmedServiceRequestReadRangeRangeByTimeParse(readBuffer)
+ default:
+ // TODO: return actual type
+ typeSwitchError = errors.New("Unmapped type")
+ }
+ if typeSwitchError != nil {
+ return nil, errors.Wrap(typeSwitchError, "Error parsing sub-type for type-switch.")
+ }
+
+ // Simple Field (closingTag)
+ if pullErr := readBuffer.PullContext("closingTag"); pullErr != nil {
+ return nil, pullErr
+ }
+ _closingTag, _closingTagErr := BACnetContextTagParse(readBuffer, uint8(peekedTagHeader.GetActualTagNumber()), 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("BACnetConfirmedServiceRequestReadRangeRange"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Finish initializing
+ _child.InitializeParent(_child.GetParent(), peekedTagHeader, openingTag, closingTag)
+ return _child.GetParent(), nil
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) Serialize(writeBuffer utils.WriteBuffer) error {
+ return m.Child.Serialize(writeBuffer)
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) SerializeParent(writeBuffer utils.WriteBuffer, child IBACnetConfirmedServiceRequestReadRangeRange, serializeChildFunction func() error) error {
+ if pushErr := writeBuffer.PushContext("BACnetConfirmedServiceRequestReadRangeRange"); 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")
+ }
+ // Virtual field
+ if _peekedTagNumberErr := writeBuffer.WriteVirtual("peekedTagNumber", m.GetPeekedTagNumber()); _peekedTagNumberErr != nil {
+ return errors.Wrap(_peekedTagNumberErr, "Error serializing 'peekedTagNumber' field")
+ }
+
+ // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+ if _typeSwitchErr := serializeChildFunction(); _typeSwitchErr != nil {
+ return errors.Wrap(_typeSwitchErr, "Error serializing sub-type 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("BACnetConfirmedServiceRequestReadRangeRange"); popErr != nil {
+ return popErr
+ }
+ return nil
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRange) 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/BACnetConfirmedServiceRequestReadRangeRangeByPosition.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRangeByPosition.go
new file mode 100644
index 0000000000..60c51ce912
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRangeByPosition.go
@@ -0,0 +1,234 @@
+/*
+ * 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.
+
+// BACnetConfirmedServiceRequestReadRangeRangeByPosition is the data-structure of this message
+type BACnetConfirmedServiceRequestReadRangeRangeByPosition struct {
+ *BACnetConfirmedServiceRequestReadRangeRange
+ ReferenceIndex *BACnetApplicationTagUnsignedInteger
+ Count *BACnetApplicationTagSignedInteger
+}
+
+// IBACnetConfirmedServiceRequestReadRangeRangeByPosition is the corresponding interface of BACnetConfirmedServiceRequestReadRangeRangeByPosition
+type IBACnetConfirmedServiceRequestReadRangeRangeByPosition interface {
+ IBACnetConfirmedServiceRequestReadRangeRange
+ // GetReferenceIndex returns ReferenceIndex (property field)
+ GetReferenceIndex() *BACnetApplicationTagUnsignedInteger
+ // GetCount returns Count (property field)
+ GetCount() *BACnetApplicationTagSignedInteger
+ // 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 discriminator values.
+///////////////////////
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) InitializeParent(parent *BACnetConfirmedServiceRequestReadRangeRange, peekedTagHeader *BACnetTagHeader, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) {
+ m.BACnetConfirmedServiceRequestReadRangeRange.PeekedTagHeader = peekedTagHeader
+ m.BACnetConfirmedServiceRequestReadRangeRange.OpeningTag = openingTag
+ m.BACnetConfirmedServiceRequestReadRangeRange.ClosingTag = closingTag
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) GetParent() *BACnetConfirmedServiceRequestReadRangeRange {
+ return m.BACnetConfirmedServiceRequestReadRangeRange
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) GetReferenceIndex() *BACnetApplicationTagUnsignedInteger {
+ return m.ReferenceIndex
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) GetCount() *BACnetApplicationTagSignedInteger {
+ return m.Count
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewBACnetConfirmedServiceRequestReadRangeRangeByPosition factory function for BACnetConfirmedServiceRequestReadRangeRangeByPosition
+func NewBACnetConfirmedServiceRequestReadRangeRangeByPosition(referenceIndex *BACnetApplicationTagUnsignedInteger, count *BACnetApplicationTagSignedInteger, peekedTagHeader *BACnetTagHeader, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) *BACnetConfirmedServiceRequestReadRangeRangeByPosition {
+ _result := &BACnetConfirmedServiceRequestReadRangeRangeByPosition{
+ ReferenceIndex: referenceIndex,
+ Count: count,
+ BACnetConfirmedServiceRequestReadRangeRange: NewBACnetConfirmedServiceRequestReadRangeRange(peekedTagHeader, openingTag, closingTag),
+ }
+ _result.Child = _result
+ return _result
+}
+
+func CastBACnetConfirmedServiceRequestReadRangeRangeByPosition(structType interface{}) *BACnetConfirmedServiceRequestReadRangeRangeByPosition {
+ if casted, ok := structType.(BACnetConfirmedServiceRequestReadRangeRangeByPosition); ok {
+ return &casted
+ }
+ if casted, ok := structType.(*BACnetConfirmedServiceRequestReadRangeRangeByPosition); ok {
+ return casted
+ }
+ if casted, ok := structType.(BACnetConfirmedServiceRequestReadRangeRange); ok {
+ return CastBACnetConfirmedServiceRequestReadRangeRangeByPosition(casted.Child)
+ }
+ if casted, ok := structType.(*BACnetConfirmedServiceRequestReadRangeRange); ok {
+ return CastBACnetConfirmedServiceRequestReadRangeRangeByPosition(casted.Child)
+ }
+ return nil
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) GetTypeName() string {
+ return "BACnetConfirmedServiceRequestReadRangeRangeByPosition"
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) GetLengthInBits() uint16 {
+ return m.GetLengthInBitsConditional(false)
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) GetLengthInBitsConditional(lastItem bool) uint16 {
+ lengthInBits := uint16(m.GetParentLengthInBits())
+
+ // Simple field (referenceIndex)
+ lengthInBits += m.ReferenceIndex.GetLengthInBits()
+
+ // Simple field (count)
+ lengthInBits += m.Count.GetLengthInBits()
+
+ return lengthInBits
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) GetLengthInBytes() uint16 {
+ return m.GetLengthInBits() / 8
+}
+
+func BACnetConfirmedServiceRequestReadRangeRangeByPositionParse(readBuffer utils.ReadBuffer) (*BACnetConfirmedServiceRequestReadRangeRangeByPosition, error) {
+ if pullErr := readBuffer.PullContext("BACnetConfirmedServiceRequestReadRangeRangeByPosition"); pullErr != nil {
+ return nil, pullErr
+ }
+ currentPos := readBuffer.GetPos()
+ _ = currentPos
+
+ // Simple Field (referenceIndex)
+ if pullErr := readBuffer.PullContext("referenceIndex"); pullErr != nil {
+ return nil, pullErr
+ }
+ _referenceIndex, _referenceIndexErr := BACnetApplicationTagParse(readBuffer)
+ if _referenceIndexErr != nil {
+ return nil, errors.Wrap(_referenceIndexErr, "Error parsing 'referenceIndex' field")
+ }
+ referenceIndex := CastBACnetApplicationTagUnsignedInteger(_referenceIndex)
+ if closeErr := readBuffer.CloseContext("referenceIndex"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Simple Field (count)
+ if pullErr := readBuffer.PullContext("count"); pullErr != nil {
+ return nil, pullErr
+ }
+ _count, _countErr := BACnetApplicationTagParse(readBuffer)
+ if _countErr != nil {
+ return nil, errors.Wrap(_countErr, "Error parsing 'count' field")
+ }
+ count := CastBACnetApplicationTagSignedInteger(_count)
+ if closeErr := readBuffer.CloseContext("count"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestReadRangeRangeByPosition"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Create a partially initialized instance
+ _child := &BACnetConfirmedServiceRequestReadRangeRangeByPosition{
+ ReferenceIndex: CastBACnetApplicationTagUnsignedInteger(referenceIndex),
+ Count: CastBACnetApplicationTagSignedInteger(count),
+ BACnetConfirmedServiceRequestReadRangeRange: &BACnetConfirmedServiceRequestReadRangeRange{},
+ }
+ _child.BACnetConfirmedServiceRequestReadRangeRange.Child = _child
+ return _child, nil
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) Serialize(writeBuffer utils.WriteBuffer) error {
+ ser := func() error {
+ if pushErr := writeBuffer.PushContext("BACnetConfirmedServiceRequestReadRangeRangeByPosition"); pushErr != nil {
+ return pushErr
+ }
+
+ // Simple Field (referenceIndex)
+ if pushErr := writeBuffer.PushContext("referenceIndex"); pushErr != nil {
+ return pushErr
+ }
+ _referenceIndexErr := m.ReferenceIndex.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("referenceIndex"); popErr != nil {
+ return popErr
+ }
+ if _referenceIndexErr != nil {
+ return errors.Wrap(_referenceIndexErr, "Error serializing 'referenceIndex' field")
+ }
+
+ // Simple Field (count)
+ if pushErr := writeBuffer.PushContext("count"); pushErr != nil {
+ return pushErr
+ }
+ _countErr := m.Count.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("count"); popErr != nil {
+ return popErr
+ }
+ if _countErr != nil {
+ return errors.Wrap(_countErr, "Error serializing 'count' field")
+ }
+
+ if popErr := writeBuffer.PopContext("BACnetConfirmedServiceRequestReadRangeRangeByPosition"); popErr != nil {
+ return popErr
+ }
+ return nil
+ }
+ return m.SerializeParent(writeBuffer, m, ser)
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByPosition) 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/BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber.go
new file mode 100644
index 0000000000..c99d17519d
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber.go
@@ -0,0 +1,234 @@
+/*
+ * 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.
+
+// BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber is the data-structure of this message
+type BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber struct {
+ *BACnetConfirmedServiceRequestReadRangeRange
+ ReferenceSequenceNumber *BACnetApplicationTagUnsignedInteger
+ Count *BACnetApplicationTagSignedInteger
+}
+
+// IBACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber is the corresponding interface of BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber
+type IBACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber interface {
+ IBACnetConfirmedServiceRequestReadRangeRange
+ // GetReferenceSequenceNumber returns ReferenceSequenceNumber (property field)
+ GetReferenceSequenceNumber() *BACnetApplicationTagUnsignedInteger
+ // GetCount returns Count (property field)
+ GetCount() *BACnetApplicationTagSignedInteger
+ // 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 discriminator values.
+///////////////////////
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) InitializeParent(parent *BACnetConfirmedServiceRequestReadRangeRange, peekedTagHeader *BACnetTagHeader, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) {
+ m.BACnetConfirmedServiceRequestReadRangeRange.PeekedTagHeader = peekedTagHeader
+ m.BACnetConfirmedServiceRequestReadRangeRange.OpeningTag = openingTag
+ m.BACnetConfirmedServiceRequestReadRangeRange.ClosingTag = closingTag
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) GetParent() *BACnetConfirmedServiceRequestReadRangeRange {
+ return m.BACnetConfirmedServiceRequestReadRangeRange
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) GetReferenceSequenceNumber() *BACnetApplicationTagUnsignedInteger {
+ return m.ReferenceSequenceNumber
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) GetCount() *BACnetApplicationTagSignedInteger {
+ return m.Count
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewBACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber factory function for BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber
+func NewBACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber(referenceSequenceNumber *BACnetApplicationTagUnsignedInteger, count *BACnetApplicationTagSignedInteger, peekedTagHeader *BACnetTagHeader, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber {
+ _result := &BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber{
+ ReferenceSequenceNumber: referenceSequenceNumber,
+ Count: count,
+ BACnetConfirmedServiceRequestReadRangeRange: NewBACnetConfirmedServiceRequestReadRangeRange(peekedTagHeader, openingTag, closingTag),
+ }
+ _result.Child = _result
+ return _result
+}
+
+func CastBACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber(structType interface{}) *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber {
+ if casted, ok := structType.(BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber); ok {
+ return &casted
+ }
+ if casted, ok := structType.(*BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber); ok {
+ return casted
+ }
+ if casted, ok := structType.(BACnetConfirmedServiceRequestReadRangeRange); ok {
+ return CastBACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber(casted.Child)
+ }
+ if casted, ok := structType.(*BACnetConfirmedServiceRequestReadRangeRange); ok {
+ return CastBACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber(casted.Child)
+ }
+ return nil
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) GetTypeName() string {
+ return "BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber"
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) GetLengthInBits() uint16 {
+ return m.GetLengthInBitsConditional(false)
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) GetLengthInBitsConditional(lastItem bool) uint16 {
+ lengthInBits := uint16(m.GetParentLengthInBits())
+
+ // Simple field (referenceSequenceNumber)
+ lengthInBits += m.ReferenceSequenceNumber.GetLengthInBits()
+
+ // Simple field (count)
+ lengthInBits += m.Count.GetLengthInBits()
+
+ return lengthInBits
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) GetLengthInBytes() uint16 {
+ return m.GetLengthInBits() / 8
+}
+
+func BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumberParse(readBuffer utils.ReadBuffer) (*BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber, error) {
+ if pullErr := readBuffer.PullContext("BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber"); pullErr != nil {
+ return nil, pullErr
+ }
+ currentPos := readBuffer.GetPos()
+ _ = currentPos
+
+ // Simple Field (referenceSequenceNumber)
+ if pullErr := readBuffer.PullContext("referenceSequenceNumber"); pullErr != nil {
+ return nil, pullErr
+ }
+ _referenceSequenceNumber, _referenceSequenceNumberErr := BACnetApplicationTagParse(readBuffer)
+ if _referenceSequenceNumberErr != nil {
+ return nil, errors.Wrap(_referenceSequenceNumberErr, "Error parsing 'referenceSequenceNumber' field")
+ }
+ referenceSequenceNumber := CastBACnetApplicationTagUnsignedInteger(_referenceSequenceNumber)
+ if closeErr := readBuffer.CloseContext("referenceSequenceNumber"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Simple Field (count)
+ if pullErr := readBuffer.PullContext("count"); pullErr != nil {
+ return nil, pullErr
+ }
+ _count, _countErr := BACnetApplicationTagParse(readBuffer)
+ if _countErr != nil {
+ return nil, errors.Wrap(_countErr, "Error parsing 'count' field")
+ }
+ count := CastBACnetApplicationTagSignedInteger(_count)
+ if closeErr := readBuffer.CloseContext("count"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Create a partially initialized instance
+ _child := &BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber{
+ ReferenceSequenceNumber: CastBACnetApplicationTagUnsignedInteger(referenceSequenceNumber),
+ Count: CastBACnetApplicationTagSignedInteger(count),
+ BACnetConfirmedServiceRequestReadRangeRange: &BACnetConfirmedServiceRequestReadRangeRange{},
+ }
+ _child.BACnetConfirmedServiceRequestReadRangeRange.Child = _child
+ return _child, nil
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) Serialize(writeBuffer utils.WriteBuffer) error {
+ ser := func() error {
+ if pushErr := writeBuffer.PushContext("BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber"); pushErr != nil {
+ return pushErr
+ }
+
+ // Simple Field (referenceSequenceNumber)
+ if pushErr := writeBuffer.PushContext("referenceSequenceNumber"); pushErr != nil {
+ return pushErr
+ }
+ _referenceSequenceNumberErr := m.ReferenceSequenceNumber.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("referenceSequenceNumber"); popErr != nil {
+ return popErr
+ }
+ if _referenceSequenceNumberErr != nil {
+ return errors.Wrap(_referenceSequenceNumberErr, "Error serializing 'referenceSequenceNumber' field")
+ }
+
+ // Simple Field (count)
+ if pushErr := writeBuffer.PushContext("count"); pushErr != nil {
+ return pushErr
+ }
+ _countErr := m.Count.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("count"); popErr != nil {
+ return popErr
+ }
+ if _countErr != nil {
+ return errors.Wrap(_countErr, "Error serializing 'count' field")
+ }
+
+ if popErr := writeBuffer.PopContext("BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber"); popErr != nil {
+ return popErr
+ }
+ return nil
+ }
+ return m.SerializeParent(writeBuffer, m, ser)
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber) 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/BACnetConfirmedServiceRequestReadRangeRangeByTime.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRangeByTime.go
new file mode 100644
index 0000000000..f18bfa6892
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRangeRangeByTime.go
@@ -0,0 +1,234 @@
+/*
+ * 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.
+
+// BACnetConfirmedServiceRequestReadRangeRangeByTime is the data-structure of this message
+type BACnetConfirmedServiceRequestReadRangeRangeByTime struct {
+ *BACnetConfirmedServiceRequestReadRangeRange
+ ReferenceTime *BACnetDateTime
+ Count *BACnetApplicationTagSignedInteger
+}
+
+// IBACnetConfirmedServiceRequestReadRangeRangeByTime is the corresponding interface of BACnetConfirmedServiceRequestReadRangeRangeByTime
+type IBACnetConfirmedServiceRequestReadRangeRangeByTime interface {
+ IBACnetConfirmedServiceRequestReadRangeRange
+ // GetReferenceTime returns ReferenceTime (property field)
+ GetReferenceTime() *BACnetDateTime
+ // GetCount returns Count (property field)
+ GetCount() *BACnetApplicationTagSignedInteger
+ // 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 discriminator values.
+///////////////////////
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) InitializeParent(parent *BACnetConfirmedServiceRequestReadRangeRange, peekedTagHeader *BACnetTagHeader, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) {
+ m.BACnetConfirmedServiceRequestReadRangeRange.PeekedTagHeader = peekedTagHeader
+ m.BACnetConfirmedServiceRequestReadRangeRange.OpeningTag = openingTag
+ m.BACnetConfirmedServiceRequestReadRangeRange.ClosingTag = closingTag
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) GetParent() *BACnetConfirmedServiceRequestReadRangeRange {
+ return m.BACnetConfirmedServiceRequestReadRangeRange
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) GetReferenceTime() *BACnetDateTime {
+ return m.ReferenceTime
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) GetCount() *BACnetApplicationTagSignedInteger {
+ return m.Count
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewBACnetConfirmedServiceRequestReadRangeRangeByTime factory function for BACnetConfirmedServiceRequestReadRangeRangeByTime
+func NewBACnetConfirmedServiceRequestReadRangeRangeByTime(referenceTime *BACnetDateTime, count *BACnetApplicationTagSignedInteger, peekedTagHeader *BACnetTagHeader, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag) *BACnetConfirmedServiceRequestReadRangeRangeByTime {
+ _result := &BACnetConfirmedServiceRequestReadRangeRangeByTime{
+ ReferenceTime: referenceTime,
+ Count: count,
+ BACnetConfirmedServiceRequestReadRangeRange: NewBACnetConfirmedServiceRequestReadRangeRange(peekedTagHeader, openingTag, closingTag),
+ }
+ _result.Child = _result
+ return _result
+}
+
+func CastBACnetConfirmedServiceRequestReadRangeRangeByTime(structType interface{}) *BACnetConfirmedServiceRequestReadRangeRangeByTime {
+ if casted, ok := structType.(BACnetConfirmedServiceRequestReadRangeRangeByTime); ok {
+ return &casted
+ }
+ if casted, ok := structType.(*BACnetConfirmedServiceRequestReadRangeRangeByTime); ok {
+ return casted
+ }
+ if casted, ok := structType.(BACnetConfirmedServiceRequestReadRangeRange); ok {
+ return CastBACnetConfirmedServiceRequestReadRangeRangeByTime(casted.Child)
+ }
+ if casted, ok := structType.(*BACnetConfirmedServiceRequestReadRangeRange); ok {
+ return CastBACnetConfirmedServiceRequestReadRangeRangeByTime(casted.Child)
+ }
+ return nil
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) GetTypeName() string {
+ return "BACnetConfirmedServiceRequestReadRangeRangeByTime"
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) GetLengthInBits() uint16 {
+ return m.GetLengthInBitsConditional(false)
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) GetLengthInBitsConditional(lastItem bool) uint16 {
+ lengthInBits := uint16(m.GetParentLengthInBits())
+
+ // Simple field (referenceTime)
+ lengthInBits += m.ReferenceTime.GetLengthInBits()
+
+ // Simple field (count)
+ lengthInBits += m.Count.GetLengthInBits()
+
+ return lengthInBits
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) GetLengthInBytes() uint16 {
+ return m.GetLengthInBits() / 8
+}
+
+func BACnetConfirmedServiceRequestReadRangeRangeByTimeParse(readBuffer utils.ReadBuffer) (*BACnetConfirmedServiceRequestReadRangeRangeByTime, error) {
+ if pullErr := readBuffer.PullContext("BACnetConfirmedServiceRequestReadRangeRangeByTime"); pullErr != nil {
+ return nil, pullErr
+ }
+ currentPos := readBuffer.GetPos()
+ _ = currentPos
+
+ // Simple Field (referenceTime)
+ if pullErr := readBuffer.PullContext("referenceTime"); pullErr != nil {
+ return nil, pullErr
+ }
+ _referenceTime, _referenceTimeErr := BACnetDateTimeParse(readBuffer)
+ if _referenceTimeErr != nil {
+ return nil, errors.Wrap(_referenceTimeErr, "Error parsing 'referenceTime' field")
+ }
+ referenceTime := CastBACnetDateTime(_referenceTime)
+ if closeErr := readBuffer.CloseContext("referenceTime"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Simple Field (count)
+ if pullErr := readBuffer.PullContext("count"); pullErr != nil {
+ return nil, pullErr
+ }
+ _count, _countErr := BACnetApplicationTagParse(readBuffer)
+ if _countErr != nil {
+ return nil, errors.Wrap(_countErr, "Error parsing 'count' field")
+ }
+ count := CastBACnetApplicationTagSignedInteger(_count)
+ if closeErr := readBuffer.CloseContext("count"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestReadRangeRangeByTime"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Create a partially initialized instance
+ _child := &BACnetConfirmedServiceRequestReadRangeRangeByTime{
+ ReferenceTime: CastBACnetDateTime(referenceTime),
+ Count: CastBACnetApplicationTagSignedInteger(count),
+ BACnetConfirmedServiceRequestReadRangeRange: &BACnetConfirmedServiceRequestReadRangeRange{},
+ }
+ _child.BACnetConfirmedServiceRequestReadRangeRange.Child = _child
+ return _child, nil
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) Serialize(writeBuffer utils.WriteBuffer) error {
+ ser := func() error {
+ if pushErr := writeBuffer.PushContext("BACnetConfirmedServiceRequestReadRangeRangeByTime"); pushErr != nil {
+ return pushErr
+ }
+
+ // Simple Field (referenceTime)
+ if pushErr := writeBuffer.PushContext("referenceTime"); pushErr != nil {
+ return pushErr
+ }
+ _referenceTimeErr := m.ReferenceTime.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("referenceTime"); popErr != nil {
+ return popErr
+ }
+ if _referenceTimeErr != nil {
+ return errors.Wrap(_referenceTimeErr, "Error serializing 'referenceTime' field")
+ }
+
+ // Simple Field (count)
+ if pushErr := writeBuffer.PushContext("count"); pushErr != nil {
+ return pushErr
+ }
+ _countErr := m.Count.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("count"); popErr != nil {
+ return popErr
+ }
+ if _countErr != nil {
+ return errors.Wrap(_countErr, "Error serializing 'count' field")
+ }
+
+ if popErr := writeBuffer.PopContext("BACnetConfirmedServiceRequestReadRangeRangeByTime"); popErr != nil {
+ return popErr
+ }
+ return nil
+ }
+ return m.SerializeParent(writeBuffer, m, ser)
+}
+
+func (m *BACnetConfirmedServiceRequestReadRangeRangeByTime) 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/BACnetConstructedDataEventTimestamps.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataEventTimestamps.go
index 480d032a63..148c5e4e24 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataEventTimestamps.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataEventTimestamps.go
@@ -31,7 +31,7 @@ type BACnetConstructedDataEventTimestamps struct {
*BACnetConstructedData
ToOffnormal *BACnetContextTagTime
ToFault *BACnetContextTagUnsignedInteger
- ToNormal *BACnetDateTime
+ ToNormal *BACnetDateTimeEnclosed
// Arguments.
TagNumber uint8
@@ -46,7 +46,7 @@ type IBACnetConstructedDataEventTimestamps interface {
// GetToFault returns ToFault (property field)
GetToFault() *BACnetContextTagUnsignedInteger
// GetToNormal returns ToNormal (property field)
- GetToNormal() *BACnetDateTime
+ GetToNormal() *BACnetDateTimeEnclosed
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -91,7 +91,7 @@ func (m *BACnetConstructedDataEventTimestamps) GetToFault() *BACnetContextTagUns
return m.ToFault
}
-func (m *BACnetConstructedDataEventTimestamps) GetToNormal() *BACnetDateTime {
+func (m *BACnetConstructedDataEventTimestamps) GetToNormal() *BACnetDateTimeEnclosed {
return m.ToNormal
}
@@ -101,7 +101,7 @@ func (m *BACnetConstructedDataEventTimestamps) GetToNormal() *BACnetDateTime {
///////////////////////////////////////////////////////////
// NewBACnetConstructedDataEventTimestamps factory function for BACnetConstructedDataEventTimestamps
-func NewBACnetConstructedDataEventTimestamps(toOffnormal *BACnetContextTagTime, toFault *BACnetContextTagUnsignedInteger, toNormal *BACnetDateTime, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag, tagNumber uint8, propertyIdentifierArgument BACnetContextTagPropertyIdentifier) *BACnetConstructedDataEventTimestamps {
+func NewBACnetConstructedDataEventTimestamps(toOffnormal *BACnetContextTagTime, toFault *BACnetContextTagUnsignedInteger, toNormal *BACnetDateTimeEnclosed, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag, tagNumber uint8, propertyIdentifierArgument BACnetContextTagPropertyIdentifier) *BACnetConstructedDataEventTimestamps {
_result := &BACnetConstructedDataEventTimestamps{
ToOffnormal: toOffnormal,
ToFault: toFault,
@@ -192,11 +192,11 @@ func BACnetConstructedDataEventTimestampsParse(readBuffer utils.ReadBuffer, tagN
if pullErr := readBuffer.PullContext("toNormal"); pullErr != nil {
return nil, pullErr
}
- _toNormal, _toNormalErr := BACnetDateTimeParse(readBuffer, uint8(uint8(2)))
+ _toNormal, _toNormalErr := BACnetDateTimeEnclosedParse(readBuffer, uint8(uint8(2)))
if _toNormalErr != nil {
return nil, errors.Wrap(_toNormalErr, "Error parsing 'toNormal' field")
}
- toNormal := CastBACnetDateTime(_toNormal)
+ toNormal := CastBACnetDateTimeEnclosed(_toNormal)
if closeErr := readBuffer.CloseContext("toNormal"); closeErr != nil {
return nil, closeErr
}
@@ -209,7 +209,7 @@ func BACnetConstructedDataEventTimestampsParse(readBuffer utils.ReadBuffer, tagN
_child := &BACnetConstructedDataEventTimestamps{
ToOffnormal: CastBACnetContextTagTime(toOffnormal),
ToFault: CastBACnetContextTagUnsignedInteger(toFault),
- ToNormal: CastBACnetDateTime(toNormal),
+ ToNormal: CastBACnetDateTimeEnclosed(toNormal),
BACnetConstructedData: &BACnetConstructedData{},
}
_child.BACnetConstructedData.Child = _child
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTime.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTime.go
index 3c085021f6..79bf1e101e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTime.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTime.go
@@ -28,25 +28,16 @@ import (
// BACnetDateTime is the data-structure of this message
type BACnetDateTime struct {
- OpeningTag *BACnetOpeningTag
- DateValue *BACnetApplicationTagDate
- TimeValue *BACnetApplicationTagTime
- ClosingTag *BACnetClosingTag
-
- // Arguments.
- TagNumber uint8
+ DateValue *BACnetApplicationTagDate
+ TimeValue *BACnetApplicationTagTime
}
// IBACnetDateTime is the corresponding interface of BACnetDateTime
type IBACnetDateTime interface {
- // GetOpeningTag returns OpeningTag (property field)
- GetOpeningTag() *BACnetOpeningTag
// GetDateValue returns DateValue (property field)
GetDateValue() *BACnetApplicationTagDate
// GetTimeValue returns TimeValue (property field)
GetTimeValue() *BACnetApplicationTagTime
- // GetClosingTag returns ClosingTag (property field)
- GetClosingTag() *BACnetClosingTag
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -60,10 +51,6 @@ type IBACnetDateTime interface {
/////////////////////// Accessors for property fields.
///////////////////////
-func (m *BACnetDateTime) GetOpeningTag() *BACnetOpeningTag {
- return m.OpeningTag
-}
-
func (m *BACnetDateTime) GetDateValue() *BACnetApplicationTagDate {
return m.DateValue
}
@@ -72,18 +59,14 @@ func (m *BACnetDateTime) GetTimeValue() *BACnetApplicationTagTime {
return m.TimeValue
}
-func (m *BACnetDateTime) GetClosingTag() *BACnetClosingTag {
- return m.ClosingTag
-}
-
///////////////////////
///////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
// NewBACnetDateTime factory function for BACnetDateTime
-func NewBACnetDateTime(openingTag *BACnetOpeningTag, dateValue *BACnetApplicationTagDate, timeValue *BACnetApplicationTagTime, closingTag *BACnetClosingTag, tagNumber uint8) *BACnetDateTime {
- return &BACnetDateTime{OpeningTag: openingTag, DateValue: dateValue, TimeValue: timeValue, ClosingTag: closingTag, TagNumber: tagNumber}
+func NewBACnetDateTime(dateValue *BACnetApplicationTagDate, timeValue *BACnetApplicationTagTime) *BACnetDateTime {
+ return &BACnetDateTime{DateValue: dateValue, TimeValue: timeValue}
}
func CastBACnetDateTime(structType interface{}) *BACnetDateTime {
@@ -107,18 +90,12 @@ func (m *BACnetDateTime) GetLengthInBits() uint16 {
func (m *BACnetDateTime) GetLengthInBitsConditional(lastItem bool) uint16 {
lengthInBits := uint16(0)
- // Simple field (openingTag)
- lengthInBits += m.OpeningTag.GetLengthInBits()
-
// Simple field (dateValue)
lengthInBits += m.DateValue.GetLengthInBits()
// Simple field (timeValue)
lengthInBits += m.TimeValue.GetLengthInBits()
- // Simple field (closingTag)
- lengthInBits += m.ClosingTag.GetLengthInBits()
-
return lengthInBits
}
@@ -126,26 +103,13 @@ func (m *BACnetDateTime) GetLengthInBytes() uint16 {
return m.GetLengthInBits() / 8
}
-func BACnetDateTimeParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetDateTime, error) {
+func BACnetDateTimeParse(readBuffer utils.ReadBuffer) (*BACnetDateTime, error) {
if pullErr := readBuffer.PullContext("BACnetDateTime"); pullErr != nil {
return nil, pullErr
}
currentPos := readBuffer.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
- }
-
// Simple Field (dateValue)
if pullErr := readBuffer.PullContext("dateValue"); pullErr != nil {
return nil, pullErr
@@ -172,25 +136,12 @@ func BACnetDateTimeParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetD
return nil, closeErr
}
- // 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("BACnetDateTime"); closeErr != nil {
return nil, closeErr
}
// Create the instance
- return NewBACnetDateTime(openingTag, dateValue, timeValue, closingTag, tagNumber), nil
+ return NewBACnetDateTime(dateValue, timeValue), nil
}
func (m *BACnetDateTime) Serialize(writeBuffer utils.WriteBuffer) error {
@@ -198,18 +149,6 @@ func (m *BACnetDateTime) Serialize(writeBuffer utils.WriteBuffer) error {
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")
- }
-
// Simple Field (dateValue)
if pushErr := writeBuffer.PushContext("dateValue"); pushErr != nil {
return pushErr
@@ -234,18 +173,6 @@ func (m *BACnetDateTime) Serialize(writeBuffer utils.WriteBuffer) error {
return errors.Wrap(_timeValueErr, "Error serializing 'timeValue' 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("BACnetDateTime"); popErr != nil {
return popErr
}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTime.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTimeEnclosed.go
similarity index 53%
copy from plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTime.go
copy to plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTimeEnclosed.go
index 3c085021f6..1e6fa49919 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTime.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetDateTimeEnclosed.go
@@ -26,25 +26,22 @@ import (
// Code generated by code-generation. DO NOT EDIT.
-// BACnetDateTime is the data-structure of this message
-type BACnetDateTime struct {
- OpeningTag *BACnetOpeningTag
- DateValue *BACnetApplicationTagDate
- TimeValue *BACnetApplicationTagTime
- ClosingTag *BACnetClosingTag
+// BACnetDateTimeEnclosed is the data-structure of this message
+type BACnetDateTimeEnclosed struct {
+ OpeningTag *BACnetOpeningTag
+ DateTimeValue *BACnetDateTime
+ ClosingTag *BACnetClosingTag
// Arguments.
TagNumber uint8
}
-// IBACnetDateTime is the corresponding interface of BACnetDateTime
-type IBACnetDateTime interface {
+// IBACnetDateTimeEnclosed is the corresponding interface of BACnetDateTimeEnclosed
+type IBACnetDateTimeEnclosed interface {
// GetOpeningTag returns OpeningTag (property field)
GetOpeningTag() *BACnetOpeningTag
- // GetDateValue returns DateValue (property field)
- GetDateValue() *BACnetApplicationTagDate
- // GetTimeValue returns TimeValue (property field)
- GetTimeValue() *BACnetApplicationTagTime
+ // GetDateTimeValue returns DateTimeValue (property field)
+ GetDateTimeValue() *BACnetDateTime
// GetClosingTag returns ClosingTag (property field)
GetClosingTag() *BACnetClosingTag
// GetLengthInBytes returns the length in bytes
@@ -60,19 +57,15 @@ type IBACnetDateTime interface {
/////////////////////// Accessors for property fields.
///////////////////////
-func (m *BACnetDateTime) GetOpeningTag() *BACnetOpeningTag {
+func (m *BACnetDateTimeEnclosed) GetOpeningTag() *BACnetOpeningTag {
return m.OpeningTag
}
-func (m *BACnetDateTime) GetDateValue() *BACnetApplicationTagDate {
- return m.DateValue
+func (m *BACnetDateTimeEnclosed) GetDateTimeValue() *BACnetDateTime {
+ return m.DateTimeValue
}
-func (m *BACnetDateTime) GetTimeValue() *BACnetApplicationTagTime {
- return m.TimeValue
-}
-
-func (m *BACnetDateTime) GetClosingTag() *BACnetClosingTag {
+func (m *BACnetDateTimeEnclosed) GetClosingTag() *BACnetClosingTag {
return m.ClosingTag
}
@@ -81,40 +74,37 @@ func (m *BACnetDateTime) GetClosingTag() *BACnetClosingTag {
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
-// NewBACnetDateTime factory function for BACnetDateTime
-func NewBACnetDateTime(openingTag *BACnetOpeningTag, dateValue *BACnetApplicationTagDate, timeValue *BACnetApplicationTagTime, closingTag *BACnetClosingTag, tagNumber uint8) *BACnetDateTime {
- return &BACnetDateTime{OpeningTag: openingTag, DateValue: dateValue, TimeValue: timeValue, ClosingTag: closingTag, TagNumber: tagNumber}
+// NewBACnetDateTimeEnclosed factory function for BACnetDateTimeEnclosed
+func NewBACnetDateTimeEnclosed(openingTag *BACnetOpeningTag, dateTimeValue *BACnetDateTime, closingTag *BACnetClosingTag, tagNumber uint8) *BACnetDateTimeEnclosed {
+ return &BACnetDateTimeEnclosed{OpeningTag: openingTag, DateTimeValue: dateTimeValue, ClosingTag: closingTag, TagNumber: tagNumber}
}
-func CastBACnetDateTime(structType interface{}) *BACnetDateTime {
- if casted, ok := structType.(BACnetDateTime); ok {
+func CastBACnetDateTimeEnclosed(structType interface{}) *BACnetDateTimeEnclosed {
+ if casted, ok := structType.(BACnetDateTimeEnclosed); ok {
return &casted
}
- if casted, ok := structType.(*BACnetDateTime); ok {
+ if casted, ok := structType.(*BACnetDateTimeEnclosed); ok {
return casted
}
return nil
}
-func (m *BACnetDateTime) GetTypeName() string {
- return "BACnetDateTime"
+func (m *BACnetDateTimeEnclosed) GetTypeName() string {
+ return "BACnetDateTimeEnclosed"
}
-func (m *BACnetDateTime) GetLengthInBits() uint16 {
+func (m *BACnetDateTimeEnclosed) GetLengthInBits() uint16 {
return m.GetLengthInBitsConditional(false)
}
-func (m *BACnetDateTime) GetLengthInBitsConditional(lastItem bool) uint16 {
+func (m *BACnetDateTimeEnclosed) GetLengthInBitsConditional(lastItem bool) uint16 {
lengthInBits := uint16(0)
// Simple field (openingTag)
lengthInBits += m.OpeningTag.GetLengthInBits()
- // Simple field (dateValue)
- lengthInBits += m.DateValue.GetLengthInBits()
-
- // Simple field (timeValue)
- lengthInBits += m.TimeValue.GetLengthInBits()
+ // Simple field (dateTimeValue)
+ lengthInBits += m.DateTimeValue.GetLengthInBits()
// Simple field (closingTag)
lengthInBits += m.ClosingTag.GetLengthInBits()
@@ -122,12 +112,12 @@ func (m *BACnetDateTime) GetLengthInBitsConditional(lastItem bool) uint16 {
return lengthInBits
}
-func (m *BACnetDateTime) GetLengthInBytes() uint16 {
+func (m *BACnetDateTimeEnclosed) GetLengthInBytes() uint16 {
return m.GetLengthInBits() / 8
}
-func BACnetDateTimeParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetDateTime, error) {
- if pullErr := readBuffer.PullContext("BACnetDateTime"); pullErr != nil {
+func BACnetDateTimeEnclosedParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetDateTimeEnclosed, error) {
+ if pullErr := readBuffer.PullContext("BACnetDateTimeEnclosed"); pullErr != nil {
return nil, pullErr
}
currentPos := readBuffer.GetPos()
@@ -146,29 +136,16 @@ func BACnetDateTimeParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetD
return nil, closeErr
}
- // Simple Field (dateValue)
- if pullErr := readBuffer.PullContext("dateValue"); pullErr != nil {
+ // Simple Field (dateTimeValue)
+ if pullErr := readBuffer.PullContext("dateTimeValue"); pullErr != nil {
return nil, pullErr
}
- _dateValue, _dateValueErr := BACnetApplicationTagParse(readBuffer)
- if _dateValueErr != nil {
- return nil, errors.Wrap(_dateValueErr, "Error parsing 'dateValue' field")
+ _dateTimeValue, _dateTimeValueErr := BACnetDateTimeParse(readBuffer)
+ if _dateTimeValueErr != nil {
+ return nil, errors.Wrap(_dateTimeValueErr, "Error parsing 'dateTimeValue' field")
}
- dateValue := CastBACnetApplicationTagDate(_dateValue)
- if closeErr := readBuffer.CloseContext("dateValue"); closeErr != nil {
- return nil, closeErr
- }
-
- // Simple Field (timeValue)
- if pullErr := readBuffer.PullContext("timeValue"); pullErr != nil {
- return nil, pullErr
- }
- _timeValue, _timeValueErr := BACnetApplicationTagParse(readBuffer)
- if _timeValueErr != nil {
- return nil, errors.Wrap(_timeValueErr, "Error parsing 'timeValue' field")
- }
- timeValue := CastBACnetApplicationTagTime(_timeValue)
- if closeErr := readBuffer.CloseContext("timeValue"); closeErr != nil {
+ dateTimeValue := CastBACnetDateTime(_dateTimeValue)
+ if closeErr := readBuffer.CloseContext("dateTimeValue"); closeErr != nil {
return nil, closeErr
}
@@ -185,16 +162,16 @@ func BACnetDateTimeParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetD
return nil, closeErr
}
- if closeErr := readBuffer.CloseContext("BACnetDateTime"); closeErr != nil {
+ if closeErr := readBuffer.CloseContext("BACnetDateTimeEnclosed"); closeErr != nil {
return nil, closeErr
}
// Create the instance
- return NewBACnetDateTime(openingTag, dateValue, timeValue, closingTag, tagNumber), nil
+ return NewBACnetDateTimeEnclosed(openingTag, dateTimeValue, closingTag, tagNumber), nil
}
-func (m *BACnetDateTime) Serialize(writeBuffer utils.WriteBuffer) error {
- if pushErr := writeBuffer.PushContext("BACnetDateTime"); pushErr != nil {
+func (m *BACnetDateTimeEnclosed) Serialize(writeBuffer utils.WriteBuffer) error {
+ if pushErr := writeBuffer.PushContext("BACnetDateTimeEnclosed"); pushErr != nil {
return pushErr
}
@@ -210,28 +187,16 @@ func (m *BACnetDateTime) Serialize(writeBuffer utils.WriteBuffer) error {
return errors.Wrap(_openingTagErr, "Error serializing 'openingTag' field")
}
- // Simple Field (dateValue)
- if pushErr := writeBuffer.PushContext("dateValue"); pushErr != nil {
- return pushErr
- }
- _dateValueErr := m.DateValue.Serialize(writeBuffer)
- if popErr := writeBuffer.PopContext("dateValue"); popErr != nil {
- return popErr
- }
- if _dateValueErr != nil {
- return errors.Wrap(_dateValueErr, "Error serializing 'dateValue' field")
- }
-
- // Simple Field (timeValue)
- if pushErr := writeBuffer.PushContext("timeValue"); pushErr != nil {
+ // Simple Field (dateTimeValue)
+ if pushErr := writeBuffer.PushContext("dateTimeValue"); pushErr != nil {
return pushErr
}
- _timeValueErr := m.TimeValue.Serialize(writeBuffer)
- if popErr := writeBuffer.PopContext("timeValue"); popErr != nil {
+ _dateTimeValueErr := m.DateTimeValue.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("dateTimeValue"); popErr != nil {
return popErr
}
- if _timeValueErr != nil {
- return errors.Wrap(_timeValueErr, "Error serializing 'timeValue' field")
+ if _dateTimeValueErr != nil {
+ return errors.Wrap(_dateTimeValueErr, "Error serializing 'dateTimeValue' field")
}
// Simple Field (closingTag)
@@ -246,13 +211,13 @@ func (m *BACnetDateTime) Serialize(writeBuffer utils.WriteBuffer) error {
return errors.Wrap(_closingTagErr, "Error serializing 'closingTag' field")
}
- if popErr := writeBuffer.PopContext("BACnetDateTime"); popErr != nil {
+ if popErr := writeBuffer.PopContext("BACnetDateTimeEnclosed"); popErr != nil {
return popErr
}
return nil
}
-func (m *BACnetDateTime) String() string {
+func (m *BACnetDateTimeEnclosed) String() string {
if m == nil {
return "<nil>"
}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetResultFlags.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetResultFlags.go
new file mode 100644
index 0000000000..0359d4d1a2
--- /dev/null
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetResultFlags.go
@@ -0,0 +1,219 @@
+/*
+ * 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.
+
+// BACnetResultFlags is the data-structure of this message
+type BACnetResultFlags struct {
+ RawBits *BACnetContextTagBitString
+
+ // Arguments.
+ TagNumber uint8
+}
+
+// IBACnetResultFlags is the corresponding interface of BACnetResultFlags
+type IBACnetResultFlags interface {
+ // GetRawBits returns RawBits (property field)
+ GetRawBits() *BACnetContextTagBitString
+ // GetFirstItem returns FirstItem (virtual field)
+ GetFirstItem() bool
+ // GetLastItem returns LastItem (virtual field)
+ GetLastItem() bool
+ // GetMoreItems returns MoreItems (virtual field)
+ GetMoreItems() 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 *BACnetResultFlags) GetRawBits() *BACnetContextTagBitString {
+ return m.RawBits
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for virtual fields.
+///////////////////////
+
+func (m *BACnetResultFlags) GetFirstItem() bool {
+ return bool(m.GetRawBits().GetPayload().GetData()[0])
+}
+
+func (m *BACnetResultFlags) GetLastItem() bool {
+ return bool(m.GetRawBits().GetPayload().GetData()[1])
+}
+
+func (m *BACnetResultFlags) GetMoreItems() bool {
+ return bool(m.GetRawBits().GetPayload().GetData()[2])
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewBACnetResultFlags factory function for BACnetResultFlags
+func NewBACnetResultFlags(rawBits *BACnetContextTagBitString, tagNumber uint8) *BACnetResultFlags {
+ return &BACnetResultFlags{RawBits: rawBits, TagNumber: tagNumber}
+}
+
+func CastBACnetResultFlags(structType interface{}) *BACnetResultFlags {
+ if casted, ok := structType.(BACnetResultFlags); ok {
+ return &casted
+ }
+ if casted, ok := structType.(*BACnetResultFlags); ok {
+ return casted
+ }
+ return nil
+}
+
+func (m *BACnetResultFlags) GetTypeName() string {
+ return "BACnetResultFlags"
+}
+
+func (m *BACnetResultFlags) GetLengthInBits() uint16 {
+ return m.GetLengthInBitsConditional(false)
+}
+
+func (m *BACnetResultFlags) GetLengthInBitsConditional(lastItem bool) uint16 {
+ lengthInBits := uint16(0)
+
+ // Simple field (rawBits)
+ lengthInBits += m.RawBits.GetLengthInBits()
+
+ // A virtual field doesn't have any in- or output.
+
+ // A virtual field doesn't have any in- or output.
+
+ // A virtual field doesn't have any in- or output.
+
+ return lengthInBits
+}
+
+func (m *BACnetResultFlags) GetLengthInBytes() uint16 {
+ return m.GetLengthInBits() / 8
+}
+
+func BACnetResultFlagsParse(readBuffer utils.ReadBuffer, tagNumber uint8) (*BACnetResultFlags, error) {
+ if pullErr := readBuffer.PullContext("BACnetResultFlags"); pullErr != nil {
+ return nil, pullErr
+ }
+ currentPos := readBuffer.GetPos()
+ _ = currentPos
+
+ // Simple Field (rawBits)
+ if pullErr := readBuffer.PullContext("rawBits"); pullErr != nil {
+ return nil, pullErr
+ }
+ _rawBits, _rawBitsErr := BACnetContextTagParse(readBuffer, uint8(tagNumber), BACnetDataType(BACnetDataType_BIT_STRING))
+ if _rawBitsErr != nil {
+ return nil, errors.Wrap(_rawBitsErr, "Error parsing 'rawBits' field")
+ }
+ rawBits := CastBACnetContextTagBitString(_rawBits)
+ if closeErr := readBuffer.CloseContext("rawBits"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Virtual field
+ _firstItem := rawBits.GetPayload().GetData()[0]
+ firstItem := bool(_firstItem)
+ _ = firstItem
+
+ // Virtual field
+ _lastItem := rawBits.GetPayload().GetData()[1]
+ lastItem := bool(_lastItem)
+ _ = lastItem
+
+ // Virtual field
+ _moreItems := rawBits.GetPayload().GetData()[2]
+ moreItems := bool(_moreItems)
+ _ = moreItems
+
+ if closeErr := readBuffer.CloseContext("BACnetResultFlags"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Create the instance
+ return NewBACnetResultFlags(rawBits, tagNumber), nil
+}
+
+func (m *BACnetResultFlags) Serialize(writeBuffer utils.WriteBuffer) error {
+ if pushErr := writeBuffer.PushContext("BACnetResultFlags"); pushErr != nil {
+ return pushErr
+ }
+
+ // Simple Field (rawBits)
+ if pushErr := writeBuffer.PushContext("rawBits"); pushErr != nil {
+ return pushErr
+ }
+ _rawBitsErr := m.RawBits.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("rawBits"); popErr != nil {
+ return popErr
+ }
+ if _rawBitsErr != nil {
+ return errors.Wrap(_rawBitsErr, "Error serializing 'rawBits' field")
+ }
+ // Virtual field
+ if _firstItemErr := writeBuffer.WriteVirtual("firstItem", m.GetFirstItem()); _firstItemErr != nil {
+ return errors.Wrap(_firstItemErr, "Error serializing 'firstItem' field")
+ }
+ // Virtual field
+ if _lastItemErr := writeBuffer.WriteVirtual("lastItem", m.GetLastItem()); _lastItemErr != nil {
+ return errors.Wrap(_lastItemErr, "Error serializing 'lastItem' field")
+ }
+ // Virtual field
+ if _moreItemsErr := writeBuffer.WriteVirtual("moreItems", m.GetMoreItems()); _moreItemsErr != nil {
+ return errors.Wrap(_moreItemsErr, "Error serializing 'moreItems' field")
+ }
+
+ if popErr := writeBuffer.PopContext("BACnetResultFlags"); popErr != nil {
+ return popErr
+ }
+ return nil
+}
+
+func (m *BACnetResultFlags) 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/BACnetServiceAckReadRange.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go
index ccc3da9cfd..c45a5b9e8c 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.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,13 @@ import (
// BACnetServiceAckReadRange is the data-structure of this message
type BACnetServiceAckReadRange struct {
*BACnetServiceAck
+ ObjectIdentifier *BACnetContextTagObjectIdentifier
+ PropertyIdentifier *BACnetContextTagPropertyIdentifier
+ PropertyArrayIndex *BACnetContextTagUnsignedInteger
+ ResultFlags *BACnetResultFlags
+ ItemCount *BACnetContextTagUnsignedInteger
+ ItemData *BACnetConstructedData
+ FirstSequenceNumber *BACnetContextTagUnsignedInteger
// Arguments.
ServiceRequestLength uint16
@@ -36,6 +45,20 @@ type BACnetServiceAckReadRange struct {
// IBACnetServiceAckReadRange is the corresponding interface of BACnetServiceAckReadRange
type IBACnetServiceAckReadRange interface {
IBACnetServiceAck
+ // GetObjectIdentifier returns ObjectIdentifier (property field)
+ GetObjectIdentifier() *BACnetContextTagObjectIdentifier
+ // GetPropertyIdentifier returns PropertyIdentifier (property field)
+ GetPropertyIdentifier() *BACnetContextTagPropertyIdentifier
+ // GetPropertyArrayIndex returns PropertyArrayIndex (property field)
+ GetPropertyArrayIndex() *BACnetContextTagUnsignedInteger
+ // GetResultFlags returns ResultFlags (property field)
+ GetResultFlags() *BACnetResultFlags
+ // GetItemCount returns ItemCount (property field)
+ GetItemCount() *BACnetContextTagUnsignedInteger
+ // GetItemData returns ItemData (property field)
+ GetItemData() *BACnetConstructedData
+ // GetFirstSequenceNumber returns FirstSequenceNumber (property field)
+ GetFirstSequenceNumber() *BACnetContextTagUnsignedInteger
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -64,10 +87,55 @@ func (m *BACnetServiceAckReadRange) GetParent() *BACnetServiceAck {
return m.BACnetServiceAck
}
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *BACnetServiceAckReadRange) GetObjectIdentifier() *BACnetContextTagObjectIdentifier {
+ return m.ObjectIdentifier
+}
+
+func (m *BACnetServiceAckReadRange) GetPropertyIdentifier() *BACnetContextTagPropertyIdentifier {
+ return m.PropertyIdentifier
+}
+
+func (m *BACnetServiceAckReadRange) GetPropertyArrayIndex() *BACnetContextTagUnsignedInteger {
+ return m.PropertyArrayIndex
+}
+
+func (m *BACnetServiceAckReadRange) GetResultFlags() *BACnetResultFlags {
+ return m.ResultFlags
+}
+
+func (m *BACnetServiceAckReadRange) GetItemCount() *BACnetContextTagUnsignedInteger {
+ return m.ItemCount
+}
+
+func (m *BACnetServiceAckReadRange) GetItemData() *BACnetConstructedData {
+ return m.ItemData
+}
+
+func (m *BACnetServiceAckReadRange) GetFirstSequenceNumber() *BACnetContextTagUnsignedInteger {
+ return m.FirstSequenceNumber
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
// NewBACnetServiceAckReadRange factory function for BACnetServiceAckReadRange
-func NewBACnetServiceAckReadRange(serviceRequestLength uint16) *BACnetServiceAckReadRange {
+func NewBACnetServiceAckReadRange(objectIdentifier *BACnetContextTagObjectIdentifier, propertyIdentifier *BACnetContextTagPropertyIdentifier, propertyArrayIndex *BACnetContextTagUnsignedInteger, resultFlags *BACnetResultFlags, itemCount *BACnetContextTagUnsignedInteger, itemData *BACnetConstructedData, firstSequenceNumber *BACnetContextTagUnsignedInteger, serviceRequestLength uint16) *BACnetServiceAckReadRange {
_result := &BACnetServiceAckReadRange{
- BACnetServiceAck: NewBACnetServiceAck(serviceRequestLength),
+ ObjectIdentifier: objectIdentifier,
+ PropertyIdentifier: propertyIdentifier,
+ PropertyArrayIndex: propertyArrayIndex,
+ ResultFlags: resultFlags,
+ ItemCount: itemCount,
+ ItemData: itemData,
+ FirstSequenceNumber: firstSequenceNumber,
+ BACnetServiceAck: NewBACnetServiceAck(serviceRequestLength),
}
_result.Child = _result
return _result
@@ -100,6 +168,33 @@ func (m *BACnetServiceAckReadRange) GetLengthInBits() uint16 {
func (m *BACnetServiceAckReadRange) GetLengthInBitsConditional(lastItem bool) uint16 {
lengthInBits := uint16(m.GetParentLengthInBits())
+ // Simple field (objectIdentifier)
+ lengthInBits += m.ObjectIdentifier.GetLengthInBits()
+
+ // Simple field (propertyIdentifier)
+ lengthInBits += m.PropertyIdentifier.GetLengthInBits()
+
+ // Optional Field (propertyArrayIndex)
+ if m.PropertyArrayIndex != nil {
+ lengthInBits += (*m.PropertyArrayIndex).GetLengthInBits()
+ }
+
+ // Simple field (resultFlags)
+ lengthInBits += m.ResultFlags.GetLengthInBits()
+
+ // Simple field (itemCount)
+ lengthInBits += m.ItemCount.GetLengthInBits()
+
+ // Optional Field (itemData)
+ if m.ItemData != nil {
+ lengthInBits += (*m.ItemData).GetLengthInBits()
+ }
+
+ // Optional Field (firstSequenceNumber)
+ if m.FirstSequenceNumber != nil {
+ lengthInBits += (*m.FirstSequenceNumber).GetLengthInBits()
+ }
+
return lengthInBits
}
@@ -114,9 +209,119 @@ func BACnetServiceAckReadRangeParse(readBuffer utils.ReadBuffer, serviceRequestL
currentPos := readBuffer.GetPos()
_ = currentPos
- // Validation
- if !(bool((1) == (2))) {
- return nil, utils.ParseAssertError{"TODO: implement me"}
+ // Simple Field (objectIdentifier)
+ if pullErr := readBuffer.PullContext("objectIdentifier"); pullErr != nil {
+ return nil, pullErr
+ }
+ _objectIdentifier, _objectIdentifierErr := BACnetContextTagParse(readBuffer, uint8(uint8(0)), BACnetDataType(BACnetDataType_BACNET_OBJECT_IDENTIFIER))
+ if _objectIdentifierErr != nil {
+ return nil, errors.Wrap(_objectIdentifierErr, "Error parsing 'objectIdentifier' field")
+ }
+ objectIdentifier := CastBACnetContextTagObjectIdentifier(_objectIdentifier)
+ if closeErr := readBuffer.CloseContext("objectIdentifier"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Simple Field (propertyIdentifier)
+ if pullErr := readBuffer.PullContext("propertyIdentifier"); pullErr != nil {
+ return nil, pullErr
+ }
+ _propertyIdentifier, _propertyIdentifierErr := BACnetContextTagParse(readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_BACNET_PROPERTY_IDENTIFIER))
+ if _propertyIdentifierErr != nil {
+ return nil, errors.Wrap(_propertyIdentifierErr, "Error parsing 'propertyIdentifier' field")
+ }
+ propertyIdentifier := CastBACnetContextTagPropertyIdentifier(_propertyIdentifier)
+ if closeErr := readBuffer.CloseContext("propertyIdentifier"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Optional Field (propertyArrayIndex) (Can be skipped, if a given expression evaluates to false)
+ var propertyArrayIndex *BACnetContextTagUnsignedInteger = nil
+ {
+ currentPos = readBuffer.GetPos()
+ if pullErr := readBuffer.PullContext("propertyArrayIndex"); pullErr != nil {
+ return nil, pullErr
+ }
+ _val, _err := BACnetContextTagParse(readBuffer, uint8(2), BACnetDataType_UNSIGNED_INTEGER)
+ 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 'propertyArrayIndex' field")
+ default:
+ propertyArrayIndex = CastBACnetContextTagUnsignedInteger(_val)
+ if closeErr := readBuffer.CloseContext("propertyArrayIndex"); closeErr != nil {
+ return nil, closeErr
+ }
+ }
+ }
+
+ // Simple Field (resultFlags)
+ if pullErr := readBuffer.PullContext("resultFlags"); pullErr != nil {
+ return nil, pullErr
+ }
+ _resultFlags, _resultFlagsErr := BACnetResultFlagsParse(readBuffer, uint8(uint8(3)))
+ if _resultFlagsErr != nil {
+ return nil, errors.Wrap(_resultFlagsErr, "Error parsing 'resultFlags' field")
+ }
+ resultFlags := CastBACnetResultFlags(_resultFlags)
+ if closeErr := readBuffer.CloseContext("resultFlags"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Simple Field (itemCount)
+ if pullErr := readBuffer.PullContext("itemCount"); pullErr != nil {
+ return nil, pullErr
+ }
+ _itemCount, _itemCountErr := BACnetContextTagParse(readBuffer, uint8(uint8(4)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
+ if _itemCountErr != nil {
+ return nil, errors.Wrap(_itemCountErr, "Error parsing 'itemCount' field")
+ }
+ itemCount := CastBACnetContextTagUnsignedInteger(_itemCount)
+ if closeErr := readBuffer.CloseContext("itemCount"); closeErr != nil {
+ return nil, closeErr
+ }
+
+ // Optional Field (itemData) (Can be skipped, if a given expression evaluates to false)
+ var itemData *BACnetConstructedData = nil
+ {
+ currentPos = readBuffer.GetPos()
+ if pullErr := readBuffer.PullContext("itemData"); pullErr != nil {
+ return nil, pullErr
+ }
+ _val, _err := BACnetConstructedDataParse(readBuffer, uint8(5), objectIdentifier.GetObjectType(), propertyIdentifier)
+ 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 'itemData' field")
+ default:
+ itemData = CastBACnetConstructedData(_val)
+ if closeErr := readBuffer.CloseContext("itemData"); closeErr != nil {
+ return nil, closeErr
+ }
+ }
+ }
+
+ // Optional Field (firstSequenceNumber) (Can be skipped, if a given expression evaluates to false)
+ var firstSequenceNumber *BACnetContextTagUnsignedInteger = nil
+ {
+ currentPos = readBuffer.GetPos()
+ if pullErr := readBuffer.PullContext("firstSequenceNumber"); pullErr != nil {
+ return nil, pullErr
+ }
+ _val, _err := BACnetContextTagParse(readBuffer, uint8(2), BACnetDataType_UNSIGNED_INTEGER)
+ 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 'firstSequenceNumber' field")
+ default:
+ firstSequenceNumber = CastBACnetContextTagUnsignedInteger(_val)
+ if closeErr := readBuffer.CloseContext("firstSequenceNumber"); closeErr != nil {
+ return nil, closeErr
+ }
+ }
}
if closeErr := readBuffer.CloseContext("BACnetServiceAckReadRange"); closeErr != nil {
@@ -125,7 +330,14 @@ func BACnetServiceAckReadRangeParse(readBuffer utils.ReadBuffer, serviceRequestL
// Create a partially initialized instance
_child := &BACnetServiceAckReadRange{
- BACnetServiceAck: &BACnetServiceAck{},
+ ObjectIdentifier: CastBACnetContextTagObjectIdentifier(objectIdentifier),
+ PropertyIdentifier: CastBACnetContextTagPropertyIdentifier(propertyIdentifier),
+ PropertyArrayIndex: CastBACnetContextTagUnsignedInteger(propertyArrayIndex),
+ ResultFlags: CastBACnetResultFlags(resultFlags),
+ ItemCount: CastBACnetContextTagUnsignedInteger(itemCount),
+ ItemData: CastBACnetConstructedData(itemData),
+ FirstSequenceNumber: CastBACnetContextTagUnsignedInteger(firstSequenceNumber),
+ BACnetServiceAck: &BACnetServiceAck{},
}
_child.BACnetServiceAck.Child = _child
return _child, nil
@@ -137,6 +349,102 @@ func (m *BACnetServiceAckReadRange) Serialize(writeBuffer utils.WriteBuffer) err
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")
+ }
+
+ // Simple Field (propertyIdentifier)
+ if pushErr := writeBuffer.PushContext("propertyIdentifier"); pushErr != nil {
+ return pushErr
+ }
+ _propertyIdentifierErr := m.PropertyIdentifier.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("propertyIdentifier"); popErr != nil {
+ return popErr
+ }
+ if _propertyIdentifierErr != nil {
+ return errors.Wrap(_propertyIdentifierErr, "Error serializing 'propertyIdentifier' field")
+ }
+
+ // Optional Field (propertyArrayIndex) (Can be skipped, if the value is null)
+ var propertyArrayIndex *BACnetContextTagUnsignedInteger = nil
+ if m.PropertyArrayIndex != nil {
+ if pushErr := writeBuffer.PushContext("propertyArrayIndex"); pushErr != nil {
+ return pushErr
+ }
+ propertyArrayIndex = m.PropertyArrayIndex
+ _propertyArrayIndexErr := propertyArrayIndex.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("propertyArrayIndex"); popErr != nil {
+ return popErr
+ }
+ if _propertyArrayIndexErr != nil {
+ return errors.Wrap(_propertyArrayIndexErr, "Error serializing 'propertyArrayIndex' field")
+ }
+ }
+
+ // Simple Field (resultFlags)
+ if pushErr := writeBuffer.PushContext("resultFlags"); pushErr != nil {
+ return pushErr
+ }
+ _resultFlagsErr := m.ResultFlags.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("resultFlags"); popErr != nil {
+ return popErr
+ }
+ if _resultFlagsErr != nil {
+ return errors.Wrap(_resultFlagsErr, "Error serializing 'resultFlags' field")
+ }
+
+ // Simple Field (itemCount)
+ if pushErr := writeBuffer.PushContext("itemCount"); pushErr != nil {
+ return pushErr
+ }
+ _itemCountErr := m.ItemCount.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("itemCount"); popErr != nil {
+ return popErr
+ }
+ if _itemCountErr != nil {
+ return errors.Wrap(_itemCountErr, "Error serializing 'itemCount' field")
+ }
+
+ // Optional Field (itemData) (Can be skipped, if the value is null)
+ var itemData *BACnetConstructedData = nil
+ if m.ItemData != nil {
+ if pushErr := writeBuffer.PushContext("itemData"); pushErr != nil {
+ return pushErr
+ }
+ itemData = m.ItemData
+ _itemDataErr := itemData.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("itemData"); popErr != nil {
+ return popErr
+ }
+ if _itemDataErr != nil {
+ return errors.Wrap(_itemDataErr, "Error serializing 'itemData' field")
+ }
+ }
+
+ // Optional Field (firstSequenceNumber) (Can be skipped, if the value is null)
+ var firstSequenceNumber *BACnetContextTagUnsignedInteger = nil
+ if m.FirstSequenceNumber != nil {
+ if pushErr := writeBuffer.PushContext("firstSequenceNumber"); pushErr != nil {
+ return pushErr
+ }
+ firstSequenceNumber = m.FirstSequenceNumber
+ _firstSequenceNumberErr := firstSequenceNumber.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("firstSequenceNumber"); popErr != nil {
+ return popErr
+ }
+ if _firstSequenceNumberErr != nil {
+ return errors.Wrap(_firstSequenceNumberErr, "Error serializing 'firstSequenceNumber' field")
+ }
+ }
+
if popErr := writeBuffer.PopContext("BACnetServiceAckReadRange"); popErr != nil {
return popErr
}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTimeStampDateTime.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTimeStampDateTime.go
index b69a67b9ec..02b75b40b2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTimeStampDateTime.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTimeStampDateTime.go
@@ -29,14 +29,14 @@ import (
// BACnetTimeStampDateTime is the data-structure of this message
type BACnetTimeStampDateTime struct {
*BACnetTimeStamp
- DateTimeValue *BACnetDateTime
+ DateTimeValue *BACnetDateTimeEnclosed
}
// IBACnetTimeStampDateTime is the corresponding interface of BACnetTimeStampDateTime
type IBACnetTimeStampDateTime interface {
IBACnetTimeStamp
// GetDateTimeValue returns DateTimeValue (property field)
- GetDateTimeValue() *BACnetDateTime
+ GetDateTimeValue() *BACnetDateTimeEnclosed
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -68,7 +68,7 @@ func (m *BACnetTimeStampDateTime) GetParent() *BACnetTimeStamp {
/////////////////////// Accessors for property fields.
///////////////////////
-func (m *BACnetTimeStampDateTime) GetDateTimeValue() *BACnetDateTime {
+func (m *BACnetTimeStampDateTime) GetDateTimeValue() *BACnetDateTimeEnclosed {
return m.DateTimeValue
}
@@ -78,7 +78,7 @@ func (m *BACnetTimeStampDateTime) GetDateTimeValue() *BACnetDateTime {
///////////////////////////////////////////////////////////
// NewBACnetTimeStampDateTime factory function for BACnetTimeStampDateTime
-func NewBACnetTimeStampDateTime(dateTimeValue *BACnetDateTime, peekedTagHeader *BACnetTagHeader) *BACnetTimeStampDateTime {
+func NewBACnetTimeStampDateTime(dateTimeValue *BACnetDateTimeEnclosed, peekedTagHeader *BACnetTagHeader) *BACnetTimeStampDateTime {
_result := &BACnetTimeStampDateTime{
DateTimeValue: dateTimeValue,
BACnetTimeStamp: NewBACnetTimeStamp(peekedTagHeader),
@@ -135,11 +135,11 @@ func BACnetTimeStampDateTimeParse(readBuffer utils.ReadBuffer) (*BACnetTimeStamp
if pullErr := readBuffer.PullContext("dateTimeValue"); pullErr != nil {
return nil, pullErr
}
- _dateTimeValue, _dateTimeValueErr := BACnetDateTimeParse(readBuffer, uint8(uint8(2)))
+ _dateTimeValue, _dateTimeValueErr := BACnetDateTimeEnclosedParse(readBuffer, uint8(uint8(2)))
if _dateTimeValueErr != nil {
return nil, errors.Wrap(_dateTimeValueErr, "Error parsing 'dateTimeValue' field")
}
- dateTimeValue := CastBACnetDateTime(_dateTimeValue)
+ dateTimeValue := CastBACnetDateTimeEnclosed(_dateTimeValue)
if closeErr := readBuffer.CloseContext("dateTimeValue"); closeErr != nil {
return nil, closeErr
}
@@ -150,7 +150,7 @@ func BACnetTimeStampDateTimeParse(readBuffer utils.ReadBuffer) (*BACnetTimeStamp
// Create a partially initialized instance
_child := &BACnetTimeStampDateTime{
- DateTimeValue: CastBACnetDateTime(dateTimeValue),
+ DateTimeValue: CastBACnetDateTimeEnclosed(dateTimeValue),
BACnetTimeStamp: &BACnetTimeStamp{},
}
_child.BACnetTimeStamp.Child = _child
diff --git a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
index fcfd0837f2..d1c523562e 100644
--- a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
+++ b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
@@ -859,12 +859,12 @@ public class RandomPackagesTest {
assertEquals(1, baCnetConfirmedServiceRequestConfirmedEventNotification.getEventObjectIdentifier().getInstanceNumber());
{
BACnetTimeStampDateTime timestamp = (BACnetTimeStampDateTime) baCnetConfirmedServiceRequestConfirmedEventNotification.getTimestamp().getTimestamp();
- BACnetTagPayloadDate payload = timestamp.getDateTimeValue().getDateValue().getPayload();
+ BACnetTagPayloadDate payload = timestamp.getDateTimeValue().getDateTimeValue().getDateValue().getPayload();
assertEquals(2008, payload.getYear());
assertEquals(5, payload.getMonth());
assertEquals(2, payload.getDayOfMonth());
assertEquals(5, payload.getDayOfWeek());
- BACnetTagPayloadTime baCnetTagPayloadTime = timestamp.getDateTimeValue().getTimeValue().getPayload();
+ BACnetTagPayloadTime baCnetTagPayloadTime = timestamp.getDateTimeValue().getDateTimeValue().getTimeValue().getPayload();
assertEquals(11, baCnetTagPayloadTime.getHour());
assertEquals(11, baCnetTagPayloadTime.getMinute());
assertEquals(30, baCnetTagPayloadTime.getSecond());
@@ -1094,70 +1094,38 @@ public class RandomPackagesTest {
@DisplayName("DRI%20CAVE%20log%20udp-0168-20081216-1117-03")
Collection<DynamicNode> DRI_CAVE_log_udp_0168_20081216_1117_03() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("DRI%20CAVE%20log%20udp-0168-20081216-1117-03.cap");
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: missing parsing
- 3,
- // TODO: missing parsing
- 30,
- // TODO: missing parsing
- 46,
- // TODO: missing parsing
- 55,
- // TODO: missing parsing
- 60,
- // TODO: missing parsing
- 86,
- // TODO: missing parsing
- 87,
- // TODO: missing parsing
- 92,
- // TODO: missing parsing
- 94,
- // TODO: missing parsing
- 95,
- // TODO: missing parsing
- 99,
- // TODO: missing parsing
- 102,
- // TODO: missing parsing
- 104,
- // TODO: missing parsing
- 105,
- // TODO: missing parsing
- 110,
- // TODO: missing parsing
- 111,
- // TODO: missing parsing
- 120,
- // TODO: missing parsing
- 127,
- // TODO: missing parsing
- 131,
- // TODO: missing parsing
- 134,
- // TODO: missing parsing
- 138,
- // TODO: missing parsing
- 140,
- // TODO: missing parsing
- 142,
- // TODO: missing parsing
- 143,
- // TODO: missing parsing
- 147,
- // TODO: missing parsing
- 151,
- // TODO: missing parsing
- 152,
- // TODO: missing parsing
- 200,
- // TODO: missing parsing
- 207,
- // TODO: missing parsing
- 215,
- // TODO: missing parsing
- 241
- ));
+ return List.of(
+ pcapEvaluator.parseEmAll(
+ // incomplete captured package (size limit 100)
+ 86,
+ // broken package
+ 87,
+ // incomplete captured package (size limit 100)
+ 94,
+ // broken package
+ 95,
+ // incomplete captured package (size limit 100)
+ 104,
+ // broken package
+ 105,
+ // incomplete captured package (size limit 100)
+ 110,
+ // broken package
+ 111,
+ // broken package
+ 140,
+ // incomplete captured package (size limit 100)
+ 142,
+ // broken package
+ 143,
+ // broken package
+ 147,
+ // incomplete captured package (size limit 100)
+ 151,
+ // broken package
+ 152
+ )
+ );
}
@TestFactory
@@ -1188,14 +1156,14 @@ public class RandomPackagesTest {
assertEquals(3000016, baCnetConfirmedServiceRequestConfirmedEventNotification.getEventObjectIdentifier().getInstanceNumber());
{
BACnetTimeStampDateTime timestamp = (BACnetTimeStampDateTime) baCnetConfirmedServiceRequestConfirmedEventNotification.getTimestamp().getTimestamp();
- assertEquals(2005, timestamp.getDateTimeValue().getDateValue().getPayload().getYear());
- assertEquals(12, timestamp.getDateTimeValue().getDateValue().getPayload().getMonth());
- assertEquals(8, timestamp.getDateTimeValue().getDateValue().getPayload().getDayOfMonth());
- assertEquals(4, timestamp.getDateTimeValue().getDateValue().getPayload().getDayOfWeek());
- assertEquals(14, timestamp.getDateTimeValue().getTimeValue().getPayload().getHour());
- assertEquals(12, timestamp.getDateTimeValue().getTimeValue().getPayload().getMinute());
- assertEquals(49, timestamp.getDateTimeValue().getTimeValue().getPayload().getSecond());
- assertEquals(0, timestamp.getDateTimeValue().getTimeValue().getPayload().getFractional());
+ assertEquals(2005, timestamp.getDateTimeValue().getDateTimeValue().getDateValue().getPayload().getYear());
+ assertEquals(12, timestamp.getDateTimeValue().getDateTimeValue().getDateValue().getPayload().getMonth());
+ assertEquals(8, timestamp.getDateTimeValue().getDateTimeValue().getDateValue().getPayload().getDayOfMonth());
+ assertEquals(4, timestamp.getDateTimeValue().getDateTimeValue().getDateValue().getPayload().getDayOfWeek());
+ assertEquals(14, timestamp.getDateTimeValue().getDateTimeValue().getTimeValue().getPayload().getHour());
+ assertEquals(12, timestamp.getDateTimeValue().getDateTimeValue().getTimeValue().getPayload().getMinute());
+ assertEquals(49, timestamp.getDateTimeValue().getDateTimeValue().getTimeValue().getPayload().getSecond());
+ assertEquals(0, timestamp.getDateTimeValue().getDateTimeValue().getTimeValue().getPayload().getFractional());
}
{
assertEquals(1, baCnetConfirmedServiceRequestConfirmedEventNotification.getNotificationClass().getPayload().getActualValue().longValue());
@@ -1311,9 +1279,7 @@ public class RandomPackagesTest {
Collection<DynamicNode> PrivateTransferError_octetstring() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("PrivateTransferError-octetstring.cap");
return List.of(pcapEvaluator.parseEmAll(
- 3,
- 4,
- // TODO: check broken parsing
+ // TODO: repair error parsing as this seems to be all over the place
7
));
}
@@ -1323,7 +1289,7 @@ public class RandomPackagesTest {
Collection<DynamicNode> PrivateTransferError() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("PrivateTransferError.cap");
return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
+ // TODO: repair error parsing as this seems to be all over the place
1
));
}
@@ -1561,22 +1527,14 @@ public class RandomPackagesTest {
@DisplayName("TC51103_BTL-9.21.1.X3_bool_ext_3")
Collection<DynamicNode> TC51103_BTL_9_21_1_X3_bool_ext_3() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("TC51103_BTL-9.21.1.X3_bool_ext_3.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- //TODO: check parsing
- 11
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@DisplayName("TC51103_BTL-9.21.1.X3_int_ext_1")
Collection<DynamicNode> TC51103_BTL_9_21_1_X3_int_ext_1() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("TC51103_BTL-9.21.1.X3_int_ext_1.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 15,
- // TODO: check broken parsing
- 17
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@@ -1597,13 +1555,7 @@ public class RandomPackagesTest {
@DisplayName("TestRun5 - Internal side of Router")
Collection<DynamicNode> TestRun5___Internal_side_of_Router() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("TestRun5%20-%20Internal%20side%20of%20Router.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- 3,
- 4,
- 51,
- 52,
- 117
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@@ -1617,21 +1569,7 @@ public class RandomPackagesTest {
@DisplayName("TestRun8 - Internal side of Router")
Collection<DynamicNode> TestRun8___Internal_side_of_Router() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("TestRun8%20-%20Internal%20side%20of%20Router.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- 1,
- 4,
- 5,
- 13,
- 14,
- 15,
- 20,
- 25,
- 205,
- 206,
- 350,
- 351,
- 451
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@@ -1659,32 +1597,21 @@ public class RandomPackagesTest {
@DisplayName("TrendLogMultipleReadRange")
Collection<DynamicNode> TrendLogMultipleReadRange() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("TrendLogMultipleReadRange.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 1
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@DisplayName("TrendLogMultipleReadRange2")
Collection<DynamicNode> TrendLogMultipleReadRange2() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("TrendLogMultipleReadRange2.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 1
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@DisplayName("TrendLogMultipleReadRange3")
Collection<DynamicNode> TrendLogMultipleReadRange3() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("TrendLogMultipleReadRange3.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 3,
- // TODO: check broken parsing
- 14
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@@ -1692,142 +1619,8 @@ public class RandomPackagesTest {
Collection<DynamicNode> TrendLogMultipleReadRangeSimple() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("TrendLogMultipleReadRangeSimple.pcap");
return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 1,
- // TODO: check broken parsing
- 148,
- // TODO: check broken parsing
- 151,
- // TODO: check broken parsing
- 164,
- // TODO: check broken parsing
- 174,
- // TODO: check broken parsing
- 197,
- // TODO: check broken parsing
- 205,
- // TODO: check broken parsing
- 210,
- // TODO: check broken parsing
- 260,
- // TODO: check broken parsing
- 267,
- // TODO: check broken parsing
- 270,
- // TODO: check broken parsing
- 273,
- // TODO: check broken parsing
- 276,
- // TODO: check broken parsing
- 290,
- // TODO: check broken parsing
- 317,
- // TODO: check broken parsing
- 334,
- // TODO: check broken parsing
- 337,
- // TODO: check broken parsing
- 371,
- // TODO: check broken parsing
- 412,
- // TODO: check broken parsing
- 439,
- // TODO: check broken parsing
- 448,
- // TODO: check broken parsing
- 452,
- // TODO: check broken parsing
- 464,
- // TODO: check broken parsing
- 471,
- // TODO: check broken parsing
- 478,
- // TODO: check broken parsing
- 483,
- // TODO: check broken parsing
- 507,
- // TODO: check broken parsing
- 519,
- // TODO: check broken parsing
- 528,
- // TODO: check broken parsing
- 531,
- // TODO: check broken parsing
- 534,
- // TODO: check broken parsing
- 539,
- // TODO: check broken parsing
- 544,
- // TODO: check broken parsing
- 553,
- // TODO: check broken parsing
- 556,
- // TODO: check broken parsing
- 559,
- // TODO: check broken parsing
- 564,
- // TODO: check broken parsing
- 570,
- // TODO: check broken parsing
- 577,
- // TODO: check broken parsing
- 582,
- // TODO: check broken parsing
- 587,
- // TODO: check broken parsing
- 611,
- // TODO: check broken parsing
- 633,
- // TODO: check broken parsing
- 650,
- // TODO: check broken parsing
- 655,
- // TODO: check broken parsing
- 659,
- // TODO: check broken parsing
- 662,
- // TODO: check broken parsing
- 668,
- // TODO: check broken parsing
- 681,
- // TODO: check broken parsing
- 688,
- // TODO: check broken parsing
- 699,
- // TODO: check broken parsing
- 702,
- // TODO: check broken parsing
- 712,
- // TODO: check broken parsing
- 713,
- // TODO: check broken parsing
- 720,
- // TODO: check broken parsing
- 728,
- // TODO: check broken parsing
- 731,
- // TODO: check broken parsing
- 736,
- // TODO: check broken parsing
- 741,
- // TODO: check broken parsing
- 749,
- // TODO: check broken parsing
- 759,
- // TODO: check broken parsing
- 764,
- // TODO: check broken parsing
- 770,
- // TODO: check broken parsing
- 775,
- // TODO: check broken parsing
- 783,
- // TODO: check broken parsing
- 796,
- // TODO: check broken parsing
- 804,
- // TODO: check broken parsing
- 807
+ // TODO: fix error handling as it is all over the place
+ 478
));
}
@@ -1835,36 +1628,7 @@ public class RandomPackagesTest {
@DisplayName("TrendLogMultipleUsage")
Collection<DynamicNode> TrendLogMultipleUsage() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("TrendLogMultipleUsage.pcap");
- return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
- 1,
- // TODO: check broken parsing
- 11,
- // TODO: check broken parsing
- 13,
- // TODO: check broken parsing
- 17,
- // TODO: check broken parsing
- 27,
- // TODO: check broken parsing
- 29,
- // TODO: check broken parsing
- 37,
- // TODO: check broken parsing
- 42,
- // TODO: check broken parsing
- 45,
- // TODO: check broken parsing
- 51,
- // TODO: check broken parsing
- 54,
- // TODO: check broken parsing
- 61,
- // TODO: check broken parsing
- 63,
- // TODO: check broken parsing
- 68
- ));
+ return List.of(pcapEvaluator.parseEmAll());
}
@TestFactory
@@ -3252,6 +3016,7 @@ public class RandomPackagesTest {
.extracting(BACnetConstructedDataEventTimestamps::getToNormal)
.satisfies(baCnetDateTime ->
assertThat(baCnetDateTime)
+ .extracting(BACnetDateTimeEnclosed::getDateTimeValue)
.extracting(BACnetDateTime::getDateValue)
.extracting(BACnetApplicationTagDate::getPayload)
.extracting(BACnetTagPayloadDate::getYearIsWildcard, BACnetTagPayloadDate::getMonthIsWildcard, BACnetTagPayloadDate::getDayOfMonthIsWildcard, BACnetTagPayloadDate::getDayOfWeekIsWildcard)
@@ -3259,6 +3024,7 @@ public class RandomPackagesTest {
)
.satisfies(baCnetDateTime ->
assertThat(baCnetDateTime)
+ .extracting(BACnetDateTimeEnclosed::getDateTimeValue)
.extracting(BACnetDateTime::getTimeValue)
.extracting(BACnetApplicationTagTime::getPayload)
.extracting(BACnetTagPayloadTime::getFractionalIsWildcard, BACnetTagPayloadTime::getMinuteIsWildcard, BACnetTagPayloadTime::getSecondIsWildcard, BACnetTagPayloadTime::getFractionalIsWildcard)
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index 96aa64c6ce..f73e99fa40 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -427,8 +427,11 @@
'serviceRequestLength' ]
]
['READ_RANGE' BACnetConfirmedServiceRequestReadRange
- // TODO: implement me
- [validation '1 == 2' "TODO: implement me"]
+ [simple BACnetContextTagObjectIdentifier('0', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER') objectIdentifier ]
+ [simple BACnetContextTagPropertyIdentifier('1', 'BACnetDataType.BACNET_PROPERTY_IDENTIFIER') propertyIdentifier ]
+ [optional BACnetContextTagUnsignedInteger('2', 'BACnetDataType.UNSIGNED_INTEGER') propertyArrayIndex ]
+ // TODO: this attribute should be named range but this is a keyword in golang (so at this point we should build a language translator which makes keywords safe)
+ [optional BACnetConfirmedServiceRequestReadRangeRange readRange ]
]
['WRITE_PROPERTY' BACnetConfirmedServiceRequestWriteProperty
[simple BACnetContextTagObjectIdentifier('0', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER') objectIdentifier ]
@@ -644,6 +647,31 @@
closingTag ]
]
+[type BACnetConfirmedServiceRequestReadRangeRange
+ [peek BACnetTagHeader
+ peekedTagHeader ]
+ [simple BACnetOpeningTag('peekedTagHeader.actualTagNumber', 'BACnetDataType.OPENING_TAG')
+ openingTag ]
+ [virtual uint 8 peekedTagNumber 'peekedTagHeader.actualTagNumber']
+ [typeSwitch peekedTagNumber
+ ['0x3' BACnetConfirmedServiceRequestReadRangeRangeByPosition
+ [simple BACnetApplicationTagUnsignedInteger referenceIndex ]
+ [simple BACnetApplicationTagSignedInteger count ]
+ ]
+ ['0x6' BACnetConfirmedServiceRequestReadRangeRangeBySequenceNumber
+ [simple BACnetApplicationTagUnsignedInteger referenceSequenceNumber ]
+ [simple BACnetApplicationTagSignedInteger count ]
+ ]
+ ['0x7' BACnetConfirmedServiceRequestReadRangeRangeByTime
+ [simple BACnetDateTime referenceTime ]
+ [simple BACnetApplicationTagSignedInteger count ]
+ ]
+ ]
+ [simple BACnetClosingTag('peekedTagHeader.actualTagNumber', 'BACnetDataType.CLOSING_TAG')
+ closingTag
+ ]
+]
+
[type BACnetPropertyWriteDefinition(BACnetObjectType objectType)
[simple BACnetContextTagPropertyIdentifier('0', 'BACnetDataType.BACNET_PROPERTY_IDENTIFIER')
propertyIdentifier ]
@@ -889,8 +917,13 @@
'serviceRequestLength' ]
]
['READ_RANGE' BACnetServiceAckReadRange
- // TODO: implement me
- [validation '1 == 2' "TODO: implement me"]
+ [simple BACnetContextTagObjectIdentifier('0', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER') objectIdentifier ]
+ [simple BACnetContextTagPropertyIdentifier('1', 'BACnetDataType.BACNET_PROPERTY_IDENTIFIER') propertyIdentifier ]
+ [optional BACnetContextTagUnsignedInteger('2', 'BACnetDataType.UNSIGNED_INTEGER') propertyArrayIndex ]
+ [simple BACnetResultFlags('3') resultFlags ]
+ [simple BACnetContextTagUnsignedInteger('4', 'BACnetDataType.UNSIGNED_INTEGER') itemCount ]
+ [optional BACnetConstructedData('5', 'objectIdentifier.objectType', 'propertyIdentifier') itemData ]
+ [optional BACnetContextTagUnsignedInteger('2', 'BACnetDataType.UNSIGNED_INTEGER') firstSequenceNumber ]
]
['WRITE_PROPERTY' BACnetServiceAckWriteProperty
// TODO: implement me
@@ -1071,6 +1104,16 @@
closingTag ]
]
+// TODO: this is a enum so we should build a static call which maps a enum (could be solved by using only the tag header with a length validation and the enum itself)
+[type BACnetResultFlags(uint 8 tagNumber)
+ [simple BACnetContextTagBitString('tagNumber', 'BACnetDataType.BIT_STRING')
+ rawBits
+ ]
+ [virtual bit firstItem 'rawBits.payload.data[0]']
+ [virtual bit lastItem 'rawBits.payload.data[1]']
+ [virtual bit moreItems 'rawBits.payload.data[2]']
+]
+
[type BACnetServiceAckAtomicReadFileStreamOrRecord
[peek BACnetTagHeader
peekedTagHeader
@@ -1538,7 +1581,7 @@
]
]
['2' BACnetTimeStampDateTime
- [simple BACnetDateTime('2')
+ [simple BACnetDateTimeEnclosed('2')
dateTimeValue
]
]
@@ -1568,16 +1611,22 @@
]
]
-[type BACnetDateTime(uint 8 tagNumber)
- [simple BACnetOpeningTag('tagNumber', 'BACnetDataType.OPENING_TAG')
- openingTag
- ]
+[type BACnetDateTime
[simple BACnetApplicationTagDate
dateValue
]
[simple BACnetApplicationTagTime
timeValue
]
+]
+
+[type BACnetDateTimeEnclosed(uint 8 tagNumber)
+ [simple BACnetOpeningTag('tagNumber', 'BACnetDataType.OPENING_TAG')
+ openingTag
+ ]
+ [simple BACnetDateTime
+ dateTimeValue
+ ]
[simple BACnetClosingTag('tagNumber', 'BACnetDataType.CLOSING_TAG')
closingTag
]
@@ -2143,7 +2192,7 @@
toOffnormal ]
[simple BACnetContextTagUnsignedInteger('1', 'BACnetDataType.UNSIGNED_INTEGER')
toFault ]
- [simple BACnetDateTime('2')
+ [simple BACnetDateTimeEnclosed('2')
toNormal ]
]
//[*, 'EVENT_TYPE' BACnetConstructedDataEventType]
[plc4x] 05/06: fix(bacnet): fix support for segmented requests
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 592c76d0442ba264eb9c93b3b008d34a25cb6071
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 13 12:32:20 2022 +0200
fix(bacnet): fix support for segmented requests
---
.../protocols/bacnet/ParserSerializerTestsuite.xml | 29 ++
.../readwrite/model/APDUConfirmedRequest.go | 122 ++++-
.../plc4x/java/bacnetip/RandomPackagesTest.java | 564 +--------------------
.../resources/protocols/bacnetip/bacnetip.mspec | 27 +-
.../protocols/bacnet/ParserSerializerTestsuite.xml | 29 ++
5 files changed, 180 insertions(+), 591 deletions(-)
diff --git a/plc4go/assets/testing/protocols/bacnet/ParserSerializerTestsuite.xml b/plc4go/assets/testing/protocols/bacnet/ParserSerializerTestsuite.xml
index 50377ac7f3..acb809d72f 100644
--- a/plc4go/assets/testing/protocols/bacnet/ParserSerializerTestsuite.xml
+++ b/plc4go/assets/testing/protocols/bacnet/ParserSerializerTestsuite.xml
@@ -996,6 +996,7 @@ make -f demo/object/ai</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -1258,6 +1259,7 @@ make -f awf.mak</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -1523,6 +1525,7 @@ make -f bacstr.mak</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -1785,6 +1788,7 @@ make -f crc.mak clean</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -2048,6 +2052,7 @@ make -f demo/object/lsp.</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -2314,6 +2319,7 @@ make</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -2581,6 +2587,7 @@ make -f tsm.mak cle</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -2841,6 +2848,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -3274,6 +3282,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReinitializeDevice>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -3717,6 +3726,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReadProperty>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -4160,6 +4170,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReadProperty>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -4603,6 +4614,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReadProperty>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -5670,6 +5682,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestWriteProperty>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -6124,6 +6137,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -6532,6 +6546,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -6885,6 +6900,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7000,6 +7016,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7115,6 +7132,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7230,6 +7248,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7487,6 +7506,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7699,6 +7719,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -8311,6 +8332,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReinitializeDevice>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -8517,6 +8539,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReinitializeDevice>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -8732,6 +8755,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestAtomicReadFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -9079,6 +9103,7 @@ Test "BACnet Applicat</value>
</BACnetConfirmedServiceRequestAtomicReadFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -9431,6 +9456,7 @@ Test "BACnet I-Am":
</BACnetConfirmedServiceRequestAtomicReadFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -9780,6 +9806,7 @@ Test "BACnet ReadProperty":
</BACnetConfirmedServiceRequestAtomicReadFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -10138,6 +10165,7 @@ Test "BACnet Applicat</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -10331,6 +10359,7 @@ Test "BACnet Applicat</value>
</BACnetConfirmedServiceRequestReadPropertyMultiple>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
index 87f96f10ad..217c051e71 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
@@ -23,6 +23,7 @@ import (
"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
+ "io"
)
// Code generated by code-generation. DO NOT EDIT.
@@ -39,6 +40,8 @@ type APDUConfirmedRequest struct {
SequenceNumber *uint8
ProposedWindowSize *uint8
ServiceRequest *BACnetConfirmedServiceRequest
+ SegmentServiceChoice *uint8
+ Segment []byte
// Arguments.
ApduLength uint16
@@ -65,6 +68,10 @@ type IAPDUConfirmedRequest interface {
GetProposedWindowSize() *uint8
// GetServiceRequest returns ServiceRequest (property field)
GetServiceRequest() *BACnetConfirmedServiceRequest
+ // GetSegmentServiceChoice returns SegmentServiceChoice (property field)
+ GetSegmentServiceChoice() *uint8
+ // GetSegment returns Segment (property field)
+ GetSegment() []byte
// GetLengthInBytes returns the length in bytes
GetLengthInBytes() uint16
// GetLengthInBits returns the length in bits
@@ -134,13 +141,21 @@ func (m *APDUConfirmedRequest) GetServiceRequest() *BACnetConfirmedServiceReques
return m.ServiceRequest
}
+func (m *APDUConfirmedRequest) GetSegmentServiceChoice() *uint8 {
+ return m.SegmentServiceChoice
+}
+
+func (m *APDUConfirmedRequest) GetSegment() []byte {
+ return m.Segment
+}
+
///////////////////////
///////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
// NewAPDUConfirmedRequest factory function for APDUConfirmedRequest
-func NewAPDUConfirmedRequest(segmentedMessage bool, moreFollows bool, segmentedResponseAccepted bool, maxSegmentsAccepted MaxSegmentsAccepted, maxApduLengthAccepted MaxApduLengthAccepted, invokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceRequest *BACnetConfirmedServiceRequest, apduLength uint16) *APDUConfirmedRequest {
+func NewAPDUConfirmedRequest(segmentedMessage bool, moreFollows bool, segmentedResponseAccepted bool, maxSegmentsAccepted MaxSegmentsAccepted, maxApduLengthAccepted MaxApduLengthAccepted, invokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceRequest *BACnetConfirmedServiceRequest, segmentServiceChoice *uint8, segment []byte, apduLength uint16) *APDUConfirmedRequest {
_result := &APDUConfirmedRequest{
SegmentedMessage: segmentedMessage,
MoreFollows: moreFollows,
@@ -151,6 +166,8 @@ func NewAPDUConfirmedRequest(segmentedMessage bool, moreFollows bool, segmentedR
SequenceNumber: sequenceNumber,
ProposedWindowSize: proposedWindowSize,
ServiceRequest: serviceRequest,
+ SegmentServiceChoice: segmentServiceChoice,
+ Segment: segment,
APDU: NewAPDU(apduLength),
}
_result.Child = _result
@@ -215,8 +232,20 @@ func (m *APDUConfirmedRequest) GetLengthInBitsConditional(lastItem bool) uint16
lengthInBits += 8
}
- // Simple field (serviceRequest)
- lengthInBits += m.ServiceRequest.GetLengthInBits()
+ // Optional Field (serviceRequest)
+ if m.ServiceRequest != nil {
+ lengthInBits += (*m.ServiceRequest).GetLengthInBits()
+ }
+
+ // Optional Field (segmentServiceChoice)
+ if m.SegmentServiceChoice != nil {
+ lengthInBits += 8
+ }
+
+ // Array field
+ if len(m.Segment) > 0 {
+ lengthInBits += 8 * uint16(len(m.Segment))
+ }
return lengthInBits
}
@@ -320,17 +349,45 @@ func APDUConfirmedRequestParse(readBuffer utils.ReadBuffer, apduLength uint16) (
proposedWindowSize = &_val
}
- // Simple Field (serviceRequest)
- if pullErr := readBuffer.PullContext("serviceRequest"); pullErr != nil {
- return nil, pullErr
+ // Optional Field (serviceRequest) (Can be skipped, if a given expression evaluates to false)
+ var serviceRequest *BACnetConfirmedServiceRequest = nil
+ if !(segmentedMessage) {
+ currentPos = readBuffer.GetPos()
+ if pullErr := readBuffer.PullContext("serviceRequest"); pullErr != nil {
+ return nil, pullErr
+ }
+ _val, _err := BACnetConfirmedServiceRequestParse(readBuffer, uint16(apduLength)-uint16(uint16(uint16(uint16(4))+uint16(uint16(utils.InlineIf(segmentedMessage, func() interface{} { return uint16(uint16(2)) }, func() interface{} { return uint16(uint16(0)) }).(uint16))))))
+ 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 'serviceRequest' field")
+ default:
+ serviceRequest = CastBACnetConfirmedServiceRequest(_val)
+ if closeErr := readBuffer.CloseContext("serviceRequest"); closeErr != nil {
+ return nil, closeErr
+ }
+ }
}
- _serviceRequest, _serviceRequestErr := BACnetConfirmedServiceRequestParse(readBuffer, uint16(uint16(apduLength)-uint16(uint16(uint16(uint16(4))+uint16(uint16(utils.InlineIf(segmentedMessage, func() interface{} { return uint16(uint16(2)) }, func() interface{} { return uint16(uint16(0)) }).(uint16)))))))
- if _serviceRequestErr != nil {
- return nil, errors.Wrap(_serviceRequestErr, "Error parsing 'serviceRequest' field")
+
+ // Optional Field (segmentServiceChoice) (Can be skipped, if a given expression evaluates to false)
+ var segmentServiceChoice *uint8 = nil
+ if bool(segmentedMessage) && bool(bool((*sequenceNumber) != (0))) {
+ _val, _err := readBuffer.ReadUint8("segmentServiceChoice", 8)
+ if _err != nil {
+ return nil, errors.Wrap(_err, "Error parsing 'segmentServiceChoice' field")
+ }
+ segmentServiceChoice = &_val
}
- serviceRequest := CastBACnetConfirmedServiceRequest(_serviceRequest)
- if closeErr := readBuffer.CloseContext("serviceRequest"); closeErr != nil {
- return nil, closeErr
+ // Byte Array field (segment)
+ numberOfBytessegment := int(utils.InlineIf(segmentedMessage, func() interface{} {
+ return uint16(uint16(utils.InlineIf(bool(bool((apduLength) > (0))), func() interface{} {
+ return uint16(uint16(uint16(apduLength) - uint16(uint16(utils.InlineIf(bool(bool((*sequenceNumber) != (0))), func() interface{} { return uint16(uint16(6)) }, func() interface{} { return uint16(uint16(5)) }).(uint16)))))
+ }, func() interface{} { return uint16(uint16(0)) }).(uint16)))
+ }, func() interface{} { return uint16(uint16(0)) }).(uint16))
+ segment, _readArrayErr := readBuffer.ReadByteArray("segment", numberOfBytessegment)
+ if _readArrayErr != nil {
+ return nil, errors.Wrap(_readArrayErr, "Error parsing 'segment' field")
}
if closeErr := readBuffer.CloseContext("APDUConfirmedRequest"); closeErr != nil {
@@ -348,6 +405,8 @@ func APDUConfirmedRequestParse(readBuffer utils.ReadBuffer, apduLength uint16) (
SequenceNumber: sequenceNumber,
ProposedWindowSize: proposedWindowSize,
ServiceRequest: CastBACnetConfirmedServiceRequest(serviceRequest),
+ SegmentServiceChoice: segmentServiceChoice,
+ Segment: segment,
APDU: &APDU{},
}
_child.APDU.Child = _child
@@ -440,16 +499,39 @@ func (m *APDUConfirmedRequest) Serialize(writeBuffer utils.WriteBuffer) error {
}
}
- // Simple Field (serviceRequest)
- if pushErr := writeBuffer.PushContext("serviceRequest"); pushErr != nil {
- return pushErr
+ // Optional Field (serviceRequest) (Can be skipped, if the value is null)
+ var serviceRequest *BACnetConfirmedServiceRequest = nil
+ if m.ServiceRequest != nil {
+ if pushErr := writeBuffer.PushContext("serviceRequest"); pushErr != nil {
+ return pushErr
+ }
+ serviceRequest = m.ServiceRequest
+ _serviceRequestErr := serviceRequest.Serialize(writeBuffer)
+ if popErr := writeBuffer.PopContext("serviceRequest"); popErr != nil {
+ return popErr
+ }
+ if _serviceRequestErr != nil {
+ return errors.Wrap(_serviceRequestErr, "Error serializing 'serviceRequest' field")
+ }
}
- _serviceRequestErr := m.ServiceRequest.Serialize(writeBuffer)
- if popErr := writeBuffer.PopContext("serviceRequest"); popErr != nil {
- return popErr
+
+ // Optional Field (segmentServiceChoice) (Can be skipped, if the value is null)
+ var segmentServiceChoice *uint8 = nil
+ if m.SegmentServiceChoice != nil {
+ segmentServiceChoice = m.SegmentServiceChoice
+ _segmentServiceChoiceErr := writeBuffer.WriteUint8("segmentServiceChoice", 8, *(segmentServiceChoice))
+ if _segmentServiceChoiceErr != nil {
+ return errors.Wrap(_segmentServiceChoiceErr, "Error serializing 'segmentServiceChoice' field")
+ }
}
- if _serviceRequestErr != nil {
- return errors.Wrap(_serviceRequestErr, "Error serializing 'serviceRequest' field")
+
+ // Array Field (segment)
+ if m.Segment != nil {
+ // Byte Array field (segment)
+ _writeArrayErr := writeBuffer.WriteByteArray("segment", m.Segment)
+ if _writeArrayErr != nil {
+ return errors.Wrap(_writeArrayErr, "Error serializing 'segment' field")
+ }
}
if popErr := writeBuffer.PopContext("APDUConfirmedRequest"); popErr != nil {
diff --git a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
index d1c523562e..83c139d73f 100644
--- a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
+++ b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
@@ -1914,565 +1914,9 @@ public class RandomPackagesTest {
assumeTrue(false, "not properly implemented. Check manually and add asserts");
}),
pcapEvaluator.parseFrom(3,
- // TODO: check broken parsing
- 1169,
- // TODO: check broken parsing
- 1171,
- // TODO: check broken parsing
- 1174,
- // TODO: check broken parsing
- 1176,
- // TODO: check broken parsing
- 1179,
- // TODO: check broken parsing
- 1181,
- // TODO: check broken parsing
- 1185,
- // TODO: check broken parsing
- 1187,
- // TODO: check broken parsing
- 1190,
- // TODO: check broken parsing
- 1192,
- // TODO: check broken parsing
- 1195,
- // TODO: check broken parsing
- 1197,
- // TODO: check broken parsing
- 2273,
- // TODO: check broken parsing
- 2275,
- // TODO: check broken parsing
- 2278,
- // TODO: check broken parsing
- 2280,
- // TODO: check broken parsing
- 2283,
- // TODO: check broken parsing
- 2285,
- // TODO: check broken parsing
- 2288,
- // TODO: check broken parsing
- 2290,
- // TODO: check broken parsing
- 2293,
- // TODO: check broken parsing
- 2295,
- // TODO: check broken parsing
- 2298,
- // TODO: check broken parsing
- 2300,
- // TODO: check broken parsing
- 2382,
- // TODO: check broken parsing
- 2384,
- // TODO: check broken parsing
- 2387,
- // TODO: check broken parsing
- 2389,
- // TODO: check broken parsing
- 2392,
- // TODO: check broken parsing
- 2394,
- // TODO: check broken parsing
- 2397,
- // TODO: check broken parsing
- 2399,
- // TODO: check broken parsing
- 2402,
- // TODO: check broken parsing
- 2404,
- // TODO: check broken parsing
- 2407,
- // TODO: check broken parsing
- 2409,
- // TODO: check broken parsing
- 3652,
- // TODO: check broken parsing
- 3654,
- // TODO: check broken parsing
- 3658,
- // TODO: check broken parsing
- 3660,
- // TODO: check broken parsing
- 3665,
- // TODO: check broken parsing
- 3669,
- // TODO: check broken parsing
- 3673,
- // TODO: check broken parsing
- 3675,
- // TODO: check broken parsing
- 3684,
- // TODO: check broken parsing
- 3688,
- // TODO: check broken parsing
- 3696,
- // TODO: check broken parsing
- 3679,
- // TODO: check broken parsing
- 4743,
- // TODO: check broken parsing
- 4745,
- // TODO: check broken parsing
- 4749,
- // TODO: check broken parsing
- 4753,
- // TODO: check broken parsing
- 4758,
- // TODO: check broken parsing
- 4760,
- // TODO: check broken parsing
- 4765,
- // TODO: check broken parsing
- 4767,
- // TODO: check broken parsing
- 4774,
- // TODO: check broken parsing
- 4777,
- // TODO: check broken parsing
- 4780,
- // TODO: check broken parsing
- 4782,
- // TODO: check broken parsing
- 5639,
- // TODO: check broken parsing
- 5641,
- // TODO: check broken parsing
- 5646,
- // TODO: check broken parsing
- 5648,
- // TODO: check broken parsing
- 5653,
- // TODO: check broken parsing
- 5655,
- // TODO: check broken parsing
- 5660,
- // TODO: check broken parsing
- 5662,
- // TODO: check broken parsing
- 5667,
- // TODO: check broken parsing
- 5669,
- // TODO: check broken parsing
- 5676,
- // TODO: check broken parsing
- 5678,
- // TODO: check broken parsing
- 6538,
- // TODO: check broken parsing
- 6540,
- // TODO: check broken parsing
- 6545,
- // TODO: check broken parsing
- 6547,
- // TODO: check broken parsing
- 6552,
- // TODO: check broken parsing
- 6554,
- // TODO: check broken parsing
- 6559,
- // TODO: check broken parsing
- 6561,
- // TODO: check broken parsing
- 6565,
- // TODO: check broken parsing
- 6567,
- // TODO: check broken parsing
- 6571,
- // TODO: check broken parsing
- 6576,
- // TODO: check broken parsing
- 7436,
- // TODO: check broken parsing
- 7438,
- // TODO: check broken parsing
- 7444,
- // TODO: check broken parsing
- 7448,
- // TODO: check broken parsing
- 7452,
- // TODO: check broken parsing
- 7454,
- // TODO: check broken parsing
- 7458,
- // TODO: check broken parsing
- 7460,
- // TODO: check broken parsing
- 7465,
- // TODO: check broken parsing
- 7467,
- // TODO: check broken parsing
- 7472,
- // TODO: check broken parsing
- 7474,
- // TODO: check broken parsing
- 8340,
- // TODO: check broken parsing
- 8343,
- // TODO: check broken parsing
- 8347,
- // TODO: check broken parsing
- 8351,
- // TODO: check broken parsing
- 8358,
- // TODO: check broken parsing
- 8362,
- // TODO: check broken parsing
- 8367,
- // TODO: check broken parsing
- 8369,
- // TODO: check broken parsing
- 8374,
- // TODO: check broken parsing
- 8378,
- // TODO: check broken parsing
- 8383,
- // TODO: check broken parsing
- 8385,
- // TODO: check broken parsing
- 9263,
- // TODO: check broken parsing
- 9265,
- // TODO: check broken parsing
- 9270,
- // TODO: check broken parsing
- 9272,
- // TODO: check broken parsing
- 9277,
- // TODO: check broken parsing
- 9279,
- // TODO: check broken parsing
- 9286,
- // TODO: check broken parsing
- 9288,
- // TODO: check broken parsing
- 9292,
- // TODO: check broken parsing
- 9294,
- // TODO: check broken parsing
- 9297,
- // TODO: check broken parsing
- 9299,
- // TODO: check broken parsing
- 9627,
- // TODO: check broken parsing
- 9629,
- // TODO: check broken parsing
- 9632,
- // TODO: check broken parsing
- 9634,
- // TODO: check broken parsing
- 9637,
- // TODO: check broken parsing
- 9639,
- // TODO: check broken parsing
- 9642,
- // TODO: check broken parsing
- 9644,
- // TODO: check broken parsing
- 9647,
- // TODO: check broken parsing
- 9649,
- // TODO: check broken parsing
- 9652,
- // TODO: check broken parsing
- 9654,
- // TODO: check broken parsing
- 9734,
- // TODO: check broken parsing
- 9736,
- // TODO: check broken parsing
- 9739,
- // TODO: check broken parsing
- 9741,
- // TODO: check broken parsing
- 9746,
- // TODO: check broken parsing
- 9748,
- // TODO: check broken parsing
- 9751,
- // TODO: check broken parsing
- 9753,
- // TODO: check broken parsing
- 9756,
- // TODO: check broken parsing
- 9758,
- // TODO: check broken parsing
- 9761,
- // TODO: check broken parsing
- 9763,
- // TODO: check broken parsing
- 9831,
- // TODO: check broken parsing
- 9833,
- // TODO: check broken parsing
- 9836,
- // TODO: check broken parsing
- 9838,
- // TODO: check broken parsing
- 9841,
- // TODO: check broken parsing
- 9843,
- // TODO: check broken parsing
- 9846,
- // TODO: check broken parsing
- 9848,
- // TODO: check broken parsing
- 9851,
- // TODO: check broken parsing
- 9853,
- // TODO: check broken parsing
- 9856,
- // TODO: check broken parsing
- 9858,
- // TODO: check broken parsing
- 9950,
- // TODO: check broken parsing
- 9952,
- // TODO: check broken parsing
- 9955,
- // TODO: check broken parsing
- 9957,
- // TODO: check broken parsing
- 9960,
- // TODO: check broken parsing
- 9962,
- // TODO: check broken parsing
- 9965,
- // TODO: check broken parsing
- 9967,
- // TODO: check broken parsing
- 9970,
- // TODO: check broken parsing
- 9972,
- // TODO: check broken parsing
- 9975,
- // TODO: check broken parsing
- 9977,
- // TODO: check broken parsing
- 14057,
- // TODO: check broken parsing
- 14059,
- // TODO: check broken parsing
- 14062,
- // TODO: check broken parsing
- 14064,
- // TODO: check broken parsing
- 14067,
- // TODO: check broken parsing
- 14069,
- // TODO: check broken parsing
- 14072,
- // TODO: check broken parsing
- 14074,
- // TODO: check broken parsing
- 14077,
- // TODO: check broken parsing
- 14079,
- // TODO: check broken parsing
- 14084,
- // TODO: check broken parsing
- 14086,
- // TODO: check broken parsing
- 14089,
- // TODO: check broken parsing
- 14091,
- // TODO: check broken parsing
- 24044,
- // TODO: check broken parsing
- 24046,
- // TODO: check broken parsing
- 24049,
- // TODO: check broken parsing
- 24051,
- // TODO: check broken parsing
- 24054,
- // TODO: check broken parsing
- 24056,
- // TODO: check broken parsing
- 24061,
- // TODO: check broken parsing
- 24063,
- // TODO: check broken parsing
- 24260,
- // TODO: check broken parsing
- 24262,
- // TODO: check broken parsing
- 24265,
- // TODO: check broken parsing
- 24267,
- // TODO: check broken parsing
- 24270,
- // TODO: check broken parsing
- 24272,
- // TODO: check broken parsing
- 24275,
- // TODO: check broken parsing
- 24277,
- // TODO: check broken parsing
- 24525,
- // TODO: check broken parsing
- 24527,
- // TODO: check broken parsing
- 24530,
- // TODO: check broken parsing
- 24532,
- // TODO: check broken parsing
- 24537,
- // TODO: check broken parsing
- 24539,
- // TODO: check broken parsing
- 24542,
- // TODO: check broken parsing
- 24544,
- // TODO: check broken parsing
- 24625,
- // TODO: check broken parsing
- 24627,
- // TODO: check broken parsing
- 24630,
- // TODO: check broken parsing
- 24632,
- // TODO: check broken parsing
- 24635,
- // TODO: check broken parsing
- 24637,
- // TODO: check broken parsing
- 24640,
- // TODO: check broken parsing
- 24642,
- // TODO: check broken parsing
- 24725,
- // TODO: check broken parsing
- 24727,
- // TODO: check broken parsing
- 24730,
- // TODO: check broken parsing
- 24732,
- // TODO: check broken parsing
- 24735,
- // TODO: check broken parsing
- 24737,
- // TODO: check broken parsing
- 24740,
- // TODO: check broken parsing
- 24742,
- // TODO: check broken parsing
- 24813,
- // TODO: check broken parsing
- 24815,
- // TODO: check broken parsing
- 24818,
- // TODO: check broken parsing
- 24820,
- // TODO: check broken parsing
- 24823,
- // TODO: check broken parsing
- 24825,
- // TODO: check broken parsing
- 24828,
- // TODO: check broken parsing
- 24830,
- // TODO: check broken parsing
- 24919,
- // TODO: check broken parsing
- 24921,
- // TODO: check broken parsing
- 24924,
- // TODO: check broken parsing
- 24926,
- // TODO: check broken parsing
- 24929,
- // TODO: check broken parsing
- 24931,
- // TODO: check broken parsing
- 24936,
- // TODO: check broken parsing
- 24938,
- // TODO: check broken parsing
- 25014,
- // TODO: check broken parsing
- 25016,
- // TODO: check broken parsing
- 25019,
- // TODO: check broken parsing
- 25021,
- // TODO: check broken parsing
- 25024,
- // TODO: check broken parsing
- 25026,
- // TODO: check broken parsing
- 25029,
- // TODO: check broken parsing
- 25031,
- // TODO: check broken parsing
- 25119,
- // TODO: check broken parsing
- 25121,
- // TODO: check broken parsing
- 25124,
- // TODO: check broken parsing
- 25126,
- // TODO: check broken parsing
- 25129,
- // TODO: check broken parsing
- 25131,
- // TODO: check broken parsing
- 25134,
- // TODO: check broken parsing
- 25136,
- // TODO: check broken parsing
- 25219,
- // TODO: check broken parsing
- 25221,
- // TODO: check broken parsing
- 25224,
- // TODO: check broken parsing
- 25226,
- // TODO: check broken parsing
- 25229,
- // TODO: check broken parsing
- 25231,
- // TODO: check broken parsing
- 25234,
- // TODO: check broken parsing
- 25236,
- // TODO: check broken parsing
- 25323,
- // TODO: check broken parsing
- 25325,
- // TODO: check broken parsing
- 25328,
- // TODO: check broken parsing
- 25330,
- // TODO: check broken parsing
- 25333,
- // TODO: check broken parsing
- 25335,
- // TODO: check broken parsing
- 25338,
- // TODO: check broken parsing
- 25340,
- // TODO: check broken parsing
- 25514,
- // TODO: check broken parsing
- 25516,
- // TODO: check broken parsing
- 25519,
- // TODO: check broken parsing
- 25521,
- // TODO: check broken parsing
- 25524,
- // TODO: check broken parsing
- 25526,
- // TODO: check broken parsing
- 25530,
- // TODO: check broken parsing
- 25532,
- // TODO: check broken parsing
+ // TODO: fix: error handling as this seems all over the place
26972,
- // TODO: check broken parsing
+ // TODO: fix: error handling as this seems all over the place
27012
)
);
@@ -2483,9 +1927,9 @@ public class RandomPackagesTest {
Collection<DynamicNode> alerton_plugfest_3() throws Exception {
TestPcapEvaluator pcapEvaluator = pcapEvaluator("alerton-plugfest-3.cap", BACNET_BPF_FILTER_UDP);
return List.of(pcapEvaluator.parseEmAll(
- // TODO: check broken parsing
+ // TODO: fix: error handling as this seems all over the place
1622,
- // TODO: check broken parsing
+ // TODO: fix: error handling as this seems all over the place
1638
));
}
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index f73e99fa40..e569ba246f 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -200,19 +200,24 @@
[discriminator uint 4 apduType]
[typeSwitch apduType
['0x0' APDUConfirmedRequest
- [simple bit segmentedMessage ]
- [simple bit moreFollows ]
- [simple bit segmentedResponseAccepted ]
- [reserved uint 2 '0' ]
+ [simple bit segmentedMessage ]
+ [simple bit moreFollows ]
+ [simple bit segmentedResponseAccepted ]
+ [reserved uint 2 '0' ]
[simple MaxSegmentsAccepted
- maxSegmentsAccepted ]
+ maxSegmentsAccepted ]
[simple MaxApduLengthAccepted
- maxApduLengthAccepted ]
- [simple uint 8 invokeId ]
- [optional uint 8 sequenceNumber 'segmentedMessage' ]
- [optional uint 8 proposedWindowSize 'segmentedMessage' ]
- [simple BACnetConfirmedServiceRequest('apduLength - (4 + (segmentedMessage ? 2 : 0))')
- serviceRequest ]
+ maxApduLengthAccepted ]
+ [simple uint 8 invokeId ]
+ [optional uint 8 sequenceNumber 'segmentedMessage' ]
+ [optional uint 8 proposedWindowSize 'segmentedMessage' ]
+ [optional BACnetConfirmedServiceRequest('apduLength - (4 + (segmentedMessage ? 2 : 0))')
+ serviceRequest '!segmentedMessage' ]
+ // TODO: maybe we should put this in the discriminated types below
+ [optional uint 8 segmentServiceChoice 'segmentedMessage && sequenceNumber != 0']
+ [array byte segment
+ length
+ 'segmentedMessage?((apduLength>0)?(apduLength - ((sequenceNumber != 0)?6:5)):0):0'
]
['0x1' APDUUnconfirmedRequest
[reserved uint 4 '0' ]
diff --git a/protocols/bacnetip/src/test/resources/protocols/bacnet/ParserSerializerTestsuite.xml b/protocols/bacnetip/src/test/resources/protocols/bacnet/ParserSerializerTestsuite.xml
index 50377ac7f3..acb809d72f 100644
--- a/protocols/bacnetip/src/test/resources/protocols/bacnet/ParserSerializerTestsuite.xml
+++ b/protocols/bacnetip/src/test/resources/protocols/bacnet/ParserSerializerTestsuite.xml
@@ -996,6 +996,7 @@ make -f demo/object/ai</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -1258,6 +1259,7 @@ make -f awf.mak</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -1523,6 +1525,7 @@ make -f bacstr.mak</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -1785,6 +1788,7 @@ make -f crc.mak clean</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -2048,6 +2052,7 @@ make -f demo/object/lsp.</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -2314,6 +2319,7 @@ make</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -2581,6 +2587,7 @@ make -f tsm.mak cle</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -2841,6 +2848,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -3274,6 +3282,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReinitializeDevice>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -3717,6 +3726,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReadProperty>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -4160,6 +4170,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReadProperty>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -4603,6 +4614,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReadProperty>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -5670,6 +5682,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestWriteProperty>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -6124,6 +6137,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -6532,6 +6546,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -6885,6 +6900,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7000,6 +7016,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7115,6 +7132,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7230,6 +7248,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7487,6 +7506,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -7699,6 +7719,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestDeviceCommunicationControl>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -8311,6 +8332,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReinitializeDevice>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -8517,6 +8539,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestReinitializeDevice>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -8732,6 +8755,7 @@ make -f wp.mak clean</value>
</BACnetConfirmedServiceRequestAtomicReadFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -9079,6 +9103,7 @@ Test "BACnet Applicat</value>
</BACnetConfirmedServiceRequestAtomicReadFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -9431,6 +9456,7 @@ Test "BACnet I-Am":
</BACnetConfirmedServiceRequestAtomicReadFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -9780,6 +9806,7 @@ Test "BACnet ReadProperty":
</BACnetConfirmedServiceRequestAtomicReadFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -10138,6 +10165,7 @@ Test "BACnet Applicat</value>
</BACnetConfirmedServiceRequestAtomicWriteFile>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
@@ -10331,6 +10359,7 @@ Test "BACnet Applicat</value>
</BACnetConfirmedServiceRequestReadPropertyMultiple>
</BACnetConfirmedServiceRequest>
</serviceRequest>
+ <segment dataType="byte" bitLength="0">0x</segment>
</APDUConfirmedRequest>
</APDU>
</apdu>
[plc4x] 02/06: fix(plc4j/codegen): make writers for complex and enum null safe
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 6b6a8fdcf65a87769e7914409d94ccaad2421f32
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 13 11:01:02 2022 +0200
fix(plc4j/codegen): make writers for complex and enum null safe
---
.../plc4x/java/spi/codegen/io/DataWriterComplexDefault.java | 11 ++++++++++-
.../plc4x/java/spi/codegen/io/DataWriterEnumDefault.java | 8 ++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterComplexDefault.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterComplexDefault.java
index 26bddffbf7..b60970fb29 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterComplexDefault.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterComplexDefault.java
@@ -20,9 +20,14 @@ package org.apache.plc4x.java.spi.codegen.io;
import org.apache.commons.lang3.StringUtils;
import org.apache.plc4x.java.spi.generation.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class DataWriterComplexDefault<T extends Message> implements DataWriterComplex<T> {
+ private static final Logger LOGGER = LoggerFactory.getLogger(DataWriterComplexDefault.class);
+
+
protected final WriteBuffer writeBuffer;
public DataWriterComplexDefault(WriteBuffer writeBuffer) {
@@ -55,7 +60,11 @@ public class DataWriterComplexDefault<T extends Message> implements DataWriterCo
if (hasLogicalName) {
writeBuffer.pushContext(logicalName);
}
- value.serialize(writeBuffer);
+ if (value != null) {
+ value.serialize(writeBuffer);
+ } else {
+ LOGGER.warn("Trying to serialize null value for {}", logicalName);
+ }
if (hasLogicalName) {
writeBuffer.popContext(logicalName);
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterEnumDefault.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterEnumDefault.java
index 855e3064aa..8887bdd693 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterEnumDefault.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterEnumDefault.java
@@ -23,11 +23,15 @@ import org.apache.plc4x.java.spi.generation.ByteOrder;
import org.apache.plc4x.java.spi.generation.SerializationException;
import org.apache.plc4x.java.spi.generation.WithReaderWriterArgs;
import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.function.Function;
public class DataWriterEnumDefault<T, I> implements DataWriterEnum<T> {
+ private static final Logger LOGGER = LoggerFactory.getLogger(DataWriterEnumDefault.class);
+
private final Function<T, I> enumSerializer;
private final Function<T, String> enumNamer;
private final DataWriter<I> dataWriter;
@@ -54,6 +58,10 @@ public class DataWriterEnumDefault<T, I> implements DataWriterEnum<T> {
}
public void write(String logicalName, T value, Function<T, I> enumSerializer, Function<T, String> enumNamer, DataWriter<I> rawWriter, WithWriterArgs... writerArgs) throws SerializationException {
+ if (value == null) {
+ LOGGER.warn("Trying to serialize null value for {}", logicalName);
+ return;
+ }
final I rawValue = enumSerializer.apply(value);
rawWriter.write(logicalName, rawValue, ArrayUtils.addAll(writerArgs, WithReaderWriterArgs.WithAdditionalStringRepresentation(enumNamer.apply(value))));
}