Skip to content

Commit

Permalink
feat(bacnet): Add util methods in static helper for integer based values
Browse files Browse the repository at this point in the history
  • Loading branch information
sruehl committed Feb 18, 2022
1 parent c22fedf commit ba3154d
Show file tree
Hide file tree
Showing 2 changed files with 221 additions and 0 deletions.
119 changes: 119 additions & 0 deletions plc4go/internal/plc4go/bacnetip/readwrite/model/StaticHelper.go
Original file line number Diff line number Diff line change
Expand Up @@ -371,3 +371,122 @@ func CreateBACnetContextTagObjectIdentifier(tagNum uint8, objectType uint16, ins
result = NewBACnetContextTagObjectIdentifier(payload, header, tagNum, true)
return result.(*BACnetContextTagObjectIdentifier)
}

func CreateBACnetApplicationTagEnumerated(value uint32) *BACnetApplicationTagEnumerated {
length, payload := CreateEnumeratedPayload(value)
header := CreateBACnetTagHeaderBalanced(false, 0x9, length)
var result interface{}
result = NewBACnetApplicationTagEnumerated(payload, header)
return result.(*BACnetApplicationTagEnumerated)
}

func CreateBACnetContextTagEnumerated(tagNumber uint8, value uint32) *BACnetContextTagEnumerated {
length, payload := CreateEnumeratedPayload(value)
header := CreateBACnetTagHeaderBalanced(true, tagNumber, length)
var result interface{}
result = NewBACnetContextTagEnumerated(payload, header, tagNumber, true)
return result.(*BACnetContextTagEnumerated)
}

func CreateEnumeratedPayload(value uint32) (uint32, *BACnetTagPayloadEnumerated) {
var length uint32
switch {
case value < 0x100:
length = 1
case value < 0x10000:
length = 2
case value < 0x1000000:
length = 3
default:
length = 4
}
data := WriteVarUint(value)
payload := NewBACnetTagPayloadEnumerated(data, length)
return length, payload
}

func CreateBACnetApplicationTagUnsignedInteger(value uint32) *BACnetApplicationTagUnsignedInteger {
length, payload := CreateUnsignedPayload(value)
header := CreateBACnetTagHeaderBalanced(false, 0x2, length)
var result interface{}
result = NewBACnetApplicationTagUnsignedInteger(payload, header)
return result.(*BACnetApplicationTagUnsignedInteger)
}

func CreateBACnetContextTagUnsignedInteger(tagNumber uint8, value uint32) *BACnetContextTagUnsignedInteger {
length, payload := CreateUnsignedPayload(value)
header := CreateBACnetTagHeaderBalanced(true, tagNumber, length)
var result interface{}
result = NewBACnetContextTagUnsignedInteger(payload, header, tagNumber, true)
return result.(*BACnetContextTagUnsignedInteger)
}

func CreateUnsignedPayload(value uint32) (uint32, *BACnetTagPayloadUnsignedInteger) {
var length uint32
var valueUint8 *uint8
var valueUint16 *uint16
var valueUint24 *uint32
var valueUint32 *uint32
switch {
case value < 0x100:
length = 1
_valueUint8 := uint8(value)
valueUint8 = &_valueUint8
case value < 0x10000:
length = 2
_valueUint16 := uint16(value)
valueUint16 = &_valueUint16
case value < 0x1000000:
length = 3
_valueUint24 := uint32(value)
valueUint24 = &_valueUint24
default:
length = 4
valueUint32 = &value
}
payload := NewBACnetTagPayloadUnsignedInteger(valueUint8, valueUint16, valueUint24, valueUint32, length)
return length, payload
}

func CreateBACnetApplicationTagSignedInteger(value int32) *BACnetApplicationTagSignedInteger {
length, payload := CreateSignedPayload(value)
header := CreateBACnetTagHeaderBalanced(true, 0x3, length)
var result interface{}
result = NewBACnetApplicationTagSignedInteger(payload, header)
return result.(*BACnetApplicationTagSignedInteger)
}

func CreateBACnetContextTagSignedInteger(tagNumber uint8, value int32) *BACnetContextTagSignedInteger {
length, payload := CreateSignedPayload(value)
header := CreateBACnetTagHeaderBalanced(true, tagNumber, length)
var result interface{}
result = NewBACnetContextTagSignedInteger(payload, header, tagNumber, true)
return result.(*BACnetContextTagSignedInteger)
}

func CreateSignedPayload(value int32) (uint32, *BACnetTagPayloadSignedInteger) {
var length uint32
var valueInt8 *int8
var valueInt16 *int16
var valueInt24 *int32
var valueInt32 *int32
switch {
case value < 0x100:
length = 1
_valueInt8 := int8(value)
valueInt8 = &_valueInt8
case value < 0x10000:
length = 2
_valueInt16 := int16(value)
valueInt16 = &_valueInt16
case value < 0x1000000:
length = 3
_valueInt24 := int32(value)
valueInt24 = &_valueInt24
default:
length = 4
valueInt32 = &value
}
payload := NewBACnetTagPayloadSignedInteger(valueInt8, valueInt16, valueInt24, valueInt32, nil, nil, nil, nil, length)
return length, payload
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package org.apache.plc4x.java.bacnetip.readwrite.utils;

import org.apache.commons.lang3.tuple.Pair;
import org.apache.plc4x.java.bacnetip.readwrite.*;
import org.apache.plc4x.java.spi.generation.ParseException;
import org.apache.plc4x.java.spi.generation.ReadBuffer;
Expand Down Expand Up @@ -345,6 +346,10 @@ public static long parseVarUint(byte[] data) {
return new BigInteger(data).longValue();
}

public static byte[] writeVarUint(long value) {
return BigInteger.valueOf(value).toByteArray();
}

public static BACnetTagHeader createBACnetTagHeaderBalanced(boolean isContext, short id, long value) {
TagClass tagClass = TagClass.APPLICATION_TAGS;
if (isContext) {
Expand Down Expand Up @@ -403,4 +408,101 @@ public static BACnetContextTagObjectIdentifier createBACnetContextTagObjectIdent
return new BACnetContextTagObjectIdentifier(header, payload, (short) tagNum, true);
}

public static BACnetApplicationTagEnumerated createBACnetApplicationTagEnumerated(long value) {
Pair<Long, BACnetTagPayloadEnumerated> lengthPayload = CreateEnumeratedPayload(value);
BACnetTagHeader header = createBACnetTagHeaderBalanced(false, (byte) 0x9, lengthPayload.getLeft());
return new BACnetApplicationTagEnumerated(header, lengthPayload.getRight());
}

public static BACnetContextTagEnumerated CreateBACnetContextTagEnumerated(byte tagNumber, long value) {
Pair<Long, BACnetTagPayloadEnumerated> lengthPayload = CreateEnumeratedPayload(value);
BACnetTagHeader header = createBACnetTagHeaderBalanced(true, tagNumber, lengthPayload.getLeft());
return new BACnetContextTagEnumerated(header, lengthPayload.getRight(), (short) tagNumber, true);
}

public static Pair<Long, BACnetTagPayloadEnumerated> CreateEnumeratedPayload(long value) {
long length;
if (value < 0x100)
length = 1;
else if (value < 0x10000)
length = 2;
else if (value < 0x1000000)
length = 3;
else
length = 4;
byte[] data = writeVarUint(value);
BACnetTagPayloadEnumerated payload = new BACnetTagPayloadEnumerated(data, length);
return Pair.of(length, payload);
}

public static BACnetApplicationTagUnsignedInteger createBACnetApplicationTagUnsignedInteger(long value) {
Pair<Long, BACnetTagPayloadUnsignedInteger> lengthPayload = createUnsignedPayload(value);
BACnetTagHeader header = createBACnetTagHeaderBalanced(false, (byte) 0x2, lengthPayload.getLeft());
return new BACnetApplicationTagUnsignedInteger(header, lengthPayload.getRight());
}

public static BACnetContextTagUnsignedInteger createBACnetContextTagUnsignedInteger(byte tagNumber, long value) {
Pair<Long, BACnetTagPayloadUnsignedInteger> lengthPayload = createUnsignedPayload(value);
BACnetTagHeader header = createBACnetTagHeaderBalanced(true, tagNumber, lengthPayload.getLeft());
return new BACnetContextTagUnsignedInteger(header, lengthPayload.getRight(), (short) tagNumber, true);
}

public static Pair<Long, BACnetTagPayloadUnsignedInteger> createUnsignedPayload(long value) {
long length;
Short valueUint8 = null;
Integer valueUint16 = null;
Long valueUint24 = null;
Long valueUint32 = null;
if (value < 0x100) {
length = 1;
valueUint8 = (short) value;
} else if (value < 0x10000) {
length = 2;
valueUint16 = (int) value;
} else if (value < 0x1000000) {
length = 3;
valueUint24 = value;
} else {
length = 4;
valueUint32 = value;
}
BACnetTagPayloadUnsignedInteger payload = new BACnetTagPayloadUnsignedInteger(valueUint8, valueUint16, valueUint24, valueUint32, length);
return Pair.of(length, payload);
}

public static BACnetApplicationTagSignedInteger createBACnetApplicationTagSignedInteger(long value) {
Pair<Long, BACnetTagPayloadSignedInteger> lengthPayload = createSignedPayload(value);
BACnetTagHeader header = createBACnetTagHeaderBalanced(false, (byte) 0x3, lengthPayload.getLeft());
return new BACnetApplicationTagSignedInteger(header, lengthPayload.getRight());
}

public static BACnetContextTagSignedInteger createBACnetContextTagSignedInteger(short tagNumber, long value) {
Pair<Long, BACnetTagPayloadSignedInteger> lengthPayload = createSignedPayload(value);
BACnetTagHeader header = createBACnetTagHeaderBalanced(false, (byte) tagNumber, lengthPayload.getLeft());
return new BACnetContextTagSignedInteger(header, lengthPayload.getRight(), tagNumber, true);
}

public static Pair<Long, BACnetTagPayloadSignedInteger> createSignedPayload(long value) {
long length;
Byte valueInt8 = null;
Short valueInt16 = null;
Integer valueInt24 = null;
Integer valueInt32 = null;
if (value < 0x100) {
length = 1;
valueInt8 = (byte) value;
} else if (value < 0x10000) {
length = 2;
valueInt16 = (short) value;
} else if (value < 0x1000000) {
length = 3;
valueInt24 = (int) value;
} else {
length = 4;
valueInt32 = (int) value;
}
BACnetTagPayloadSignedInteger payload = new BACnetTagPayloadSignedInteger(valueInt8, valueInt16, valueInt24, valueInt32, null, null, null, null, length);
return Pair.of(length, payload);
}

}

0 comments on commit ba3154d

Please sign in to comment.