You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2023/02/23 20:33:50 UTC
[plc4x] 03/03: chore(driver/eip): Continued getting the ParserSerializer tests working in Go for EIP
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch fix/cdutz/reenable-golang-driver-testsuites
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 1f5fbd5f21e988182a79d08f84dd7d268fb6899b
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Feb 23 21:33:35 2023 +0100
chore(driver/eip): Continued getting the ParserSerializer tests working in Go for EIP
---
.../testing/protocols/eip/DriverTestsuite.xml | 2 +-
.../eip/ParserSerializerTestsuiteLittleEndian.xml | 2 +-
.../bacnetip/readwrite/model/BACnetVendorId.go | 32 +++
.../eip/readwrite/model/CIPDataTypeCode.go | 276 ++++++++++++++++++++-
plc4go/spi/utils/WriteBufferByteBased.go | 31 +--
.../java/bacnetip/readwrite/BACnetVendorId.java | 2 +
.../plc4x/java/eip/readwrite/CIPDataTypeCode.java | 27 +-
.../java/eip/base/protocol/EipProtocolLogic.java | 6 +-
.../eip/src/main/resources/protocols/eip/eip.mspec | 28 ++-
.../resources/protocols/eip/DriverTestsuite.xml | 2 +-
.../eip/ParserSerializerTestsuiteLittleEndian.xml | 2 +-
11 files changed, 366 insertions(+), 44 deletions(-)
diff --git a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
index d8e9f8b3c6..66d1049691 100644
--- a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
@@ -376,7 +376,7 @@
<data>
<CIPData>
<dataType>
- <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRING36">672</CIPDataTypeCode>
+ <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRUCTURED">672</CIPDataTypeCode>
</dataType>
<data dataType="byte" bitLength="720">0xce0f2b000000556d6d2c2049206e6f772073656520796f7520696e207468652077697265736861726b20636170747572650000000000000000000000000000000000000000000000000000000000000000000000000000000000</data>
</CIPData>
diff --git a/plc4go/assets/testing/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml b/plc4go/assets/testing/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
index de96f703ad..db0d33ea91 100644
--- a/plc4go/assets/testing/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
+++ b/plc4go/assets/testing/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
@@ -907,7 +907,7 @@
<data>
<CIPData>
<dataType>
- <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRING36">672</CIPDataTypeCode>
+ <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRUCTURED">672</CIPDataTypeCode>
</dataType>
<data dataType="byte" bitLength="720">0xce0f2b000000556d6d2c2049206e6f772073656520796f7520696e207468652077697265736861726b20636170747572650000000000000000000000000000000000000000000000000000000000000000000000000000000000</data>
</CIPData>
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
index 6d10136ee0..ee884e7dbe 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
@@ -1435,6 +1435,8 @@ const (
BACnetVendorId_THING_WAREHOUSELLC BACnetVendorId = 1404
BACnetVendorId_INNOFRIENDS_GMBH BACnetVendorId = 1405
BACnetVendorId_METRONICAKP_SPJ BACnetVendorId = 1406
+ BACnetVendorId_TECHKNAVE BACnetVendorId = 1407
+ BACnetVendorId_ELSNER_ELEKTRONIK BACnetVendorId = 1408
BACnetVendorId_UNKNOWN_VENDOR BACnetVendorId = 0xFFFF
)
@@ -2841,6 +2843,8 @@ func init() {
BACnetVendorId_THING_WAREHOUSELLC,
BACnetVendorId_INNOFRIENDS_GMBH,
BACnetVendorId_METRONICAKP_SPJ,
+ BACnetVendorId_TECHKNAVE,
+ BACnetVendorId_ELSNER_ELEKTRONIK,
BACnetVendorId_UNKNOWN_VENDOR,
}
}
@@ -4659,6 +4663,14 @@ func (e BACnetVendorId) VendorId() uint16 {
{ /* '1406' */
return 1406
}
+ case 1407:
+ { /* '1407' */
+ return 1407
+ }
+ case 1408:
+ { /* '1408' */
+ return 1408
+ }
case 141:
{ /* '141' */
return 141
@@ -10273,6 +10285,14 @@ func (e BACnetVendorId) VendorName() string {
{ /* '1406' */
return "Metronic AKP Sp. J."
}
+ case 1407:
+ { /* '1407' */
+ return "Techknave"
+ }
+ case 1408:
+ { /* '1408' */
+ return "Elsner Elektronik"
+ }
case 141:
{ /* '141' */
return "Yaskawa America, Inc."
@@ -14980,6 +15000,10 @@ func BACnetVendorIdByValue(value uint16) (enum BACnetVendorId, ok bool) {
return BACnetVendorId_INNOFRIENDS_GMBH, true
case 1406:
return BACnetVendorId_METRONICAKP_SPJ, true
+ case 1407:
+ return BACnetVendorId_TECHKNAVE, true
+ case 1408:
+ return BACnetVendorId_ELSNER_ELEKTRONIK, true
case 141:
return BACnetVendorId_YASKAWA_AMERICA_INC, true
case 142:
@@ -17784,6 +17808,10 @@ func BACnetVendorIdByName(value string) (enum BACnetVendorId, ok bool) {
return BACnetVendorId_INNOFRIENDS_GMBH, true
case "METRONICAKP_SPJ":
return BACnetVendorId_METRONICAKP_SPJ, true
+ case "TECHKNAVE":
+ return BACnetVendorId_TECHKNAVE, true
+ case "ELSNER_ELEKTRONIK":
+ return BACnetVendorId_ELSNER_ELEKTRONIK, true
case "YASKAWA_AMERICA_INC":
return BACnetVendorId_YASKAWA_AMERICA_INC, true
case "DEO_SCONTROLSYSTEMS_GMBH":
@@ -20645,6 +20673,10 @@ func (e BACnetVendorId) PLC4XEnumName() string {
return "INNOFRIENDS_GMBH"
case BACnetVendorId_METRONICAKP_SPJ:
return "METRONICAKP_SPJ"
+ case BACnetVendorId_TECHKNAVE:
+ return "TECHKNAVE"
+ case BACnetVendorId_ELSNER_ELEKTRONIK:
+ return "ELSNER_ELEKTRONIK"
case BACnetVendorId_YASKAWA_AMERICA_INC:
return "YASKAWA_AMERICA_INC"
case BACnetVendorId_DEO_SCONTROLSYSTEMS_GMBH:
diff --git a/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go b/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go
index 467236e33b..57065693ef 100644
--- a/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go
+++ b/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go
@@ -36,16 +36,37 @@ type ICIPDataTypeCode interface {
}
const (
- CIPDataTypeCode_BOOL CIPDataTypeCode = 0x00C1
- CIPDataTypeCode_SINT CIPDataTypeCode = 0x00C2
- CIPDataTypeCode_INT CIPDataTypeCode = 0x00C3
- CIPDataTypeCode_DINT CIPDataTypeCode = 0x00C4
- CIPDataTypeCode_LINT CIPDataTypeCode = 0x00C5
- CIPDataTypeCode_REAL CIPDataTypeCode = 0x00CA
- CIPDataTypeCode_DWORD CIPDataTypeCode = 0x00D3
- CIPDataTypeCode_STRUCTURED CIPDataTypeCode = 0x02A0
- CIPDataTypeCode_STRING CIPDataTypeCode = 0x02A0
- CIPDataTypeCode_STRING36 CIPDataTypeCode = 0x02A0
+ CIPDataTypeCode_BOOL CIPDataTypeCode = 0x00C1
+ CIPDataTypeCode_SINT CIPDataTypeCode = 0x00C2
+ CIPDataTypeCode_INT CIPDataTypeCode = 0x00C3
+ CIPDataTypeCode_DINT CIPDataTypeCode = 0x00C4
+ CIPDataTypeCode_LINT CIPDataTypeCode = 0x00C5
+ CIPDataTypeCode_USINT CIPDataTypeCode = 0x00C6
+ CIPDataTypeCode_UINT CIPDataTypeCode = 0x00C7
+ CIPDataTypeCode_UDINT CIPDataTypeCode = 0x00C8
+ CIPDataTypeCode_ULINT CIPDataTypeCode = 0x00C9
+ CIPDataTypeCode_REAL CIPDataTypeCode = 0x00CA
+ CIPDataTypeCode_LREAL CIPDataTypeCode = 0x00CB
+ CIPDataTypeCode_STIME CIPDataTypeCode = 0x00CC
+ CIPDataTypeCode_DATE CIPDataTypeCode = 0x00CD
+ CIPDataTypeCode_TIME_OF_DAY CIPDataTypeCode = 0x00CE
+ CIPDataTypeCode_DATE_AND_TIME CIPDataTypeCode = 0x00CF
+ CIPDataTypeCode_STRING CIPDataTypeCode = 0x00D0
+ CIPDataTypeCode_BYTE CIPDataTypeCode = 0x00D1
+ CIPDataTypeCode_WORD CIPDataTypeCode = 0x00D2
+ CIPDataTypeCode_DWORD CIPDataTypeCode = 0x00D3
+ CIPDataTypeCode_LWORD CIPDataTypeCode = 0x00D3
+ CIPDataTypeCode_STRING2 CIPDataTypeCode = 0x00D5
+ CIPDataTypeCode_FTIME CIPDataTypeCode = 0x00D6
+ CIPDataTypeCode_LTIME CIPDataTypeCode = 0x00D7
+ CIPDataTypeCode_ITIME CIPDataTypeCode = 0x00D8
+ CIPDataTypeCode_STRINGN CIPDataTypeCode = 0x00D9
+ CIPDataTypeCode_SHORT_STRING CIPDataTypeCode = 0x00DA
+ CIPDataTypeCode_TIME CIPDataTypeCode = 0x00DB
+ CIPDataTypeCode_EPATH CIPDataTypeCode = 0x00DC
+ CIPDataTypeCode_ENGUNIT CIPDataTypeCode = 0x00DD
+ CIPDataTypeCode_STRINGI CIPDataTypeCode = 0x00DD
+ CIPDataTypeCode_STRUCTURED CIPDataTypeCode = 0x02A0
)
var CIPDataTypeCodeValues []CIPDataTypeCode
@@ -58,11 +79,32 @@ func init() {
CIPDataTypeCode_INT,
CIPDataTypeCode_DINT,
CIPDataTypeCode_LINT,
+ CIPDataTypeCode_USINT,
+ CIPDataTypeCode_UINT,
+ CIPDataTypeCode_UDINT,
+ CIPDataTypeCode_ULINT,
CIPDataTypeCode_REAL,
+ CIPDataTypeCode_LREAL,
+ CIPDataTypeCode_STIME,
+ CIPDataTypeCode_DATE,
+ CIPDataTypeCode_TIME_OF_DAY,
+ CIPDataTypeCode_DATE_AND_TIME,
+ CIPDataTypeCode_STRING,
+ CIPDataTypeCode_BYTE,
+ CIPDataTypeCode_WORD,
CIPDataTypeCode_DWORD,
+ CIPDataTypeCode_LWORD,
+ CIPDataTypeCode_STRING2,
+ CIPDataTypeCode_FTIME,
+ CIPDataTypeCode_LTIME,
+ CIPDataTypeCode_ITIME,
+ CIPDataTypeCode_STRINGN,
+ CIPDataTypeCode_SHORT_STRING,
+ CIPDataTypeCode_TIME,
+ CIPDataTypeCode_EPATH,
+ CIPDataTypeCode_ENGUNIT,
+ CIPDataTypeCode_STRINGI,
CIPDataTypeCode_STRUCTURED,
- CIPDataTypeCode_STRING,
- CIPDataTypeCode_STRING36,
}
}
@@ -88,14 +130,98 @@ func (e CIPDataTypeCode) Size() uint8 {
{ /* '0X00C5' */
return 8
}
+ case 0x00C6:
+ { /* '0X00C6' */
+ return 1
+ }
+ case 0x00C7:
+ { /* '0X00C7' */
+ return 2
+ }
+ case 0x00C8:
+ { /* '0X00C8' */
+ return 4
+ }
+ case 0x00C9:
+ { /* '0X00C9' */
+ return 8
+ }
case 0x00CA:
{ /* '0X00CA' */
return 4
}
+ case 0x00CB:
+ { /* '0X00CB' */
+ return 8
+ }
+ case 0x00CC:
+ { /* '0X00CC' */
+ return 4
+ }
+ case 0x00CD:
+ { /* '0X00CD' */
+ return 2
+ }
+ case 0x00CE:
+ { /* '0X00CE' */
+ return 4
+ }
+ case 0x00CF:
+ { /* '0X00CF' */
+ return 6
+ }
+ case 0x00D0:
+ { /* '0X00D0' */
+ return 0
+ }
+ case 0x00D1:
+ { /* '0X00D1' */
+ return 1
+ }
+ case 0x00D2:
+ { /* '0X00D2' */
+ return 2
+ }
case 0x00D3:
{ /* '0X00D3' */
return 4
}
+ case 0x00D5:
+ { /* '0X00D5' */
+ return 0
+ }
+ case 0x00D6:
+ { /* '0X00D6' */
+ return 4
+ }
+ case 0x00D7:
+ { /* '0X00D7' */
+ return 8
+ }
+ case 0x00D8:
+ { /* '0X00D8' */
+ return 2
+ }
+ case 0x00D9:
+ { /* '0X00D9' */
+ return 0
+ }
+ case 0x00DA:
+ { /* '0X00DA' */
+ return 0
+ }
+ case 0x00DB:
+ { /* '0X00DB' */
+ return 4
+ }
+ case 0x00DC:
+ { /* '0X00DC' */
+ return 0
+ }
+ case 0x00DD:
+ { /* '0X00DD' */
+ return 0
+ }
case 0x02A0:
{ /* '0X02A0' */
return 88
@@ -127,10 +253,52 @@ func CIPDataTypeCodeByValue(value uint16) (enum CIPDataTypeCode, ok bool) {
return CIPDataTypeCode_DINT, true
case 0x00C5:
return CIPDataTypeCode_LINT, true
+ case 0x00C6:
+ return CIPDataTypeCode_USINT, true
+ case 0x00C7:
+ return CIPDataTypeCode_UINT, true
+ case 0x00C8:
+ return CIPDataTypeCode_UDINT, true
+ case 0x00C9:
+ return CIPDataTypeCode_ULINT, true
case 0x00CA:
return CIPDataTypeCode_REAL, true
+ case 0x00CB:
+ return CIPDataTypeCode_LREAL, true
+ case 0x00CC:
+ return CIPDataTypeCode_STIME, true
+ case 0x00CD:
+ return CIPDataTypeCode_DATE, true
+ case 0x00CE:
+ return CIPDataTypeCode_TIME_OF_DAY, true
+ case 0x00CF:
+ return CIPDataTypeCode_DATE_AND_TIME, true
+ case 0x00D0:
+ return CIPDataTypeCode_STRING, true
+ case 0x00D1:
+ return CIPDataTypeCode_BYTE, true
+ case 0x00D2:
+ return CIPDataTypeCode_WORD, true
case 0x00D3:
return CIPDataTypeCode_DWORD, true
+ case 0x00D5:
+ return CIPDataTypeCode_STRING2, true
+ case 0x00D6:
+ return CIPDataTypeCode_FTIME, true
+ case 0x00D7:
+ return CIPDataTypeCode_LTIME, true
+ case 0x00D8:
+ return CIPDataTypeCode_ITIME, true
+ case 0x00D9:
+ return CIPDataTypeCode_STRINGN, true
+ case 0x00DA:
+ return CIPDataTypeCode_SHORT_STRING, true
+ case 0x00DB:
+ return CIPDataTypeCode_TIME, true
+ case 0x00DC:
+ return CIPDataTypeCode_EPATH, true
+ case 0x00DD:
+ return CIPDataTypeCode_ENGUNIT, true
case 0x02A0:
return CIPDataTypeCode_STRUCTURED, true
}
@@ -149,10 +317,52 @@ func CIPDataTypeCodeByName(value string) (enum CIPDataTypeCode, ok bool) {
return CIPDataTypeCode_DINT, true
case "LINT":
return CIPDataTypeCode_LINT, true
+ case "USINT":
+ return CIPDataTypeCode_USINT, true
+ case "UINT":
+ return CIPDataTypeCode_UINT, true
+ case "UDINT":
+ return CIPDataTypeCode_UDINT, true
+ case "ULINT":
+ return CIPDataTypeCode_ULINT, true
case "REAL":
return CIPDataTypeCode_REAL, true
+ case "LREAL":
+ return CIPDataTypeCode_LREAL, true
+ case "STIME":
+ return CIPDataTypeCode_STIME, true
+ case "DATE":
+ return CIPDataTypeCode_DATE, true
+ case "TIME_OF_DAY":
+ return CIPDataTypeCode_TIME_OF_DAY, true
+ case "DATE_AND_TIME":
+ return CIPDataTypeCode_DATE_AND_TIME, true
+ case "STRING":
+ return CIPDataTypeCode_STRING, true
+ case "BYTE":
+ return CIPDataTypeCode_BYTE, true
+ case "WORD":
+ return CIPDataTypeCode_WORD, true
case "DWORD":
return CIPDataTypeCode_DWORD, true
+ case "STRING2":
+ return CIPDataTypeCode_STRING2, true
+ case "FTIME":
+ return CIPDataTypeCode_FTIME, true
+ case "LTIME":
+ return CIPDataTypeCode_LTIME, true
+ case "ITIME":
+ return CIPDataTypeCode_ITIME, true
+ case "STRINGN":
+ return CIPDataTypeCode_STRINGN, true
+ case "SHORT_STRING":
+ return CIPDataTypeCode_SHORT_STRING, true
+ case "TIME":
+ return CIPDataTypeCode_TIME, true
+ case "EPATH":
+ return CIPDataTypeCode_EPATH, true
+ case "ENGUNIT":
+ return CIPDataTypeCode_ENGUNIT, true
case "STRUCTURED":
return CIPDataTypeCode_STRUCTURED, true
}
@@ -228,10 +438,52 @@ func (e CIPDataTypeCode) PLC4XEnumName() string {
return "DINT"
case CIPDataTypeCode_LINT:
return "LINT"
+ case CIPDataTypeCode_USINT:
+ return "USINT"
+ case CIPDataTypeCode_UINT:
+ return "UINT"
+ case CIPDataTypeCode_UDINT:
+ return "UDINT"
+ case CIPDataTypeCode_ULINT:
+ return "ULINT"
case CIPDataTypeCode_REAL:
return "REAL"
+ case CIPDataTypeCode_LREAL:
+ return "LREAL"
+ case CIPDataTypeCode_STIME:
+ return "STIME"
+ case CIPDataTypeCode_DATE:
+ return "DATE"
+ case CIPDataTypeCode_TIME_OF_DAY:
+ return "TIME_OF_DAY"
+ case CIPDataTypeCode_DATE_AND_TIME:
+ return "DATE_AND_TIME"
+ case CIPDataTypeCode_STRING:
+ return "STRING"
+ case CIPDataTypeCode_BYTE:
+ return "BYTE"
+ case CIPDataTypeCode_WORD:
+ return "WORD"
case CIPDataTypeCode_DWORD:
return "DWORD"
+ case CIPDataTypeCode_STRING2:
+ return "STRING2"
+ case CIPDataTypeCode_FTIME:
+ return "FTIME"
+ case CIPDataTypeCode_LTIME:
+ return "LTIME"
+ case CIPDataTypeCode_ITIME:
+ return "ITIME"
+ case CIPDataTypeCode_STRINGN:
+ return "STRINGN"
+ case CIPDataTypeCode_SHORT_STRING:
+ return "SHORT_STRING"
+ case CIPDataTypeCode_TIME:
+ return "TIME"
+ case CIPDataTypeCode_EPATH:
+ return "EPATH"
+ case CIPDataTypeCode_ENGUNIT:
+ return "ENGUNIT"
case CIPDataTypeCode_STRUCTURED:
return "STRUCTURED"
}
diff --git a/plc4go/spi/utils/WriteBufferByteBased.go b/plc4go/spi/utils/WriteBufferByteBased.go
index b740f0a3ee..506cad0507 100644
--- a/plc4go/spi/utils/WriteBufferByteBased.go
+++ b/plc4go/spi/utils/WriteBufferByteBased.go
@@ -25,6 +25,7 @@ import (
"encoding/binary"
"math"
"math/big"
+ "math/bits"
"regexp"
"strings"
@@ -146,9 +147,8 @@ func (wb *byteWriteBuffer) WriteUint8(_ string, bitLength uint8, value uint8, _
func (wb *byteWriteBuffer) WriteUint16(_ string, bitLength uint8, value uint16, _ ...WithWriterArgs) error {
wb.move(uint(bitLength))
if wb.byteOrder == binary.LittleEndian {
- // TODO: indirection till we have a native LE implementation
- // TODO: validate that this produces the desired result
- return binary.Write(wb.data, wb.byteOrder, value)
+ reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+ return wb.writer.WriteBits(reverseValue, bitLength)
}
return wb.writer.WriteBits(uint64(value), bitLength)
}
@@ -156,9 +156,8 @@ func (wb *byteWriteBuffer) WriteUint16(_ string, bitLength uint8, value uint16,
func (wb *byteWriteBuffer) WriteUint32(_ string, bitLength uint8, value uint32, _ ...WithWriterArgs) error {
wb.move(uint(bitLength))
if wb.byteOrder == binary.LittleEndian {
- // TODO: indirection till we have a native LE implementation
- // TODO: validate that this produces the desired result
- return binary.Write(wb.data, wb.byteOrder, value)
+ reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+ return wb.writer.WriteBits(reverseValue, bitLength)
}
return wb.writer.WriteBits(uint64(value), bitLength)
}
@@ -166,9 +165,8 @@ func (wb *byteWriteBuffer) WriteUint32(_ string, bitLength uint8, value uint32,
func (wb *byteWriteBuffer) WriteUint64(_ string, bitLength uint8, value uint64, _ ...WithWriterArgs) error {
wb.move(uint(bitLength))
if wb.byteOrder == binary.LittleEndian {
- // TODO: indirection till we have a native LE implementation
- // TODO: validate that this produces the desired result
- return binary.Write(wb.data, wb.byteOrder, value)
+ reverseValue := bits.ReverseBytes64(value) >> (64 - bitLength)
+ return wb.writer.WriteBits(reverseValue, bitLength)
}
return wb.writer.WriteBits(value, bitLength)
}
@@ -181,9 +179,8 @@ func (wb *byteWriteBuffer) WriteInt8(_ string, bitLength uint8, value int8, _ ..
func (wb *byteWriteBuffer) WriteInt16(_ string, bitLength uint8, value int16, _ ...WithWriterArgs) error {
wb.move(uint(bitLength))
if wb.byteOrder == binary.LittleEndian {
- // TODO: indirection till we have a native LE implementation
- // TODO: validate that this produces the desired result
- return binary.Write(wb.data, wb.byteOrder, value)
+ reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+ return wb.writer.WriteBits(reverseValue, bitLength)
}
return wb.writer.WriteBits(uint64(value), bitLength)
}
@@ -191,9 +188,8 @@ func (wb *byteWriteBuffer) WriteInt16(_ string, bitLength uint8, value int16, _
func (wb *byteWriteBuffer) WriteInt32(_ string, bitLength uint8, value int32, _ ...WithWriterArgs) error {
wb.move(uint(bitLength))
if wb.byteOrder == binary.LittleEndian {
- // TODO: indirection till we have a native LE implementation
- // TODO: validate that this produces the desired result
- return binary.Write(wb.data, wb.byteOrder, value)
+ reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+ return wb.writer.WriteBits(reverseValue, bitLength)
}
return wb.writer.WriteBits(uint64(value), bitLength)
}
@@ -201,9 +197,8 @@ func (wb *byteWriteBuffer) WriteInt32(_ string, bitLength uint8, value int32, _
func (wb *byteWriteBuffer) WriteInt64(_ string, bitLength uint8, value int64, _ ...WithWriterArgs) error {
wb.move(uint(bitLength))
if wb.byteOrder == binary.LittleEndian {
- // TODO: indirection till we have a native LE implementation
- // TODO: validate that this produces the desired result
- return binary.Write(wb.data, wb.byteOrder, value)
+ reverseValue := bits.ReverseBytes64(uint64(value)) >> (64 - bitLength)
+ return wb.writer.WriteBits(reverseValue, bitLength)
}
return wb.writer.WriteBits(uint64(value), bitLength)
}
diff --git a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
index 3ad63e9cba..3a8b12ea1b 100644
--- a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
+++ b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
@@ -1615,6 +1615,8 @@ public enum BACnetVendorId {
THING_WAREHOUSELLC((int) 1404, (int) 1404, (String) "Thing Warehouse LLC"),
INNOFRIENDS_GMBH((int) 1405, (int) 1405, (String) "Innofriends GmbH"),
METRONICAKP_SPJ((int) 1406, (int) 1406, (String) "Metronic AKP Sp. J."),
+ TECHKNAVE((int) 1407, (int) 1407, (String) "Techknave"),
+ ELSNER_ELEKTRONIK((int) 1408, (int) 1408, (String) "Elsner Elektronik"),
UNKNOWN_VENDOR((int) 0xFFFF, (int) 0xFFFF, (String) "Unknown");
private static final Map<Integer, BACnetVendorId> map;
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java
index a28dd21246..6a0eb9a133 100644
--- a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java
@@ -31,11 +31,32 @@ public enum CIPDataTypeCode {
INT((int) 0X00C3, (short) 2),
DINT((int) 0X00C4, (short) 4),
LINT((int) 0X00C5, (short) 8),
+ USINT((int) 0X00C6, (short) 1),
+ UINT((int) 0X00C7, (short) 2),
+ UDINT((int) 0X00C8, (short) 4),
+ ULINT((int) 0X00C9, (short) 8),
REAL((int) 0X00CA, (short) 4),
+ LREAL((int) 0X00CB, (short) 8),
+ STIME((int) 0X00CC, (short) 4),
+ DATE((int) 0X00CD, (short) 2),
+ TIME_OF_DAY((int) 0X00CE, (short) 4),
+ DATE_AND_TIME((int) 0X00CF, (short) 6),
+ STRING((int) 0X00D0, (short) 0),
+ BYTE((int) 0X00D1, (short) 1),
+ WORD((int) 0X00D2, (short) 2),
DWORD((int) 0X00D3, (short) 4),
- STRUCTURED((int) 0X02A0, (short) 88),
- STRING((int) 0X02A0, (short) 88),
- STRING36((int) 0X02A0, (short) 40);
+ LWORD((int) 0X00D3, (short) 8),
+ STRING2((int) 0X00D5, (short) 0),
+ FTIME((int) 0X00D6, (short) 4),
+ LTIME((int) 0X00D7, (short) 8),
+ ITIME((int) 0X00D8, (short) 2),
+ STRINGN((int) 0X00D9, (short) 0),
+ SHORT_STRING((int) 0X00DA, (short) 0),
+ TIME((int) 0X00DB, (short) 4),
+ EPATH((int) 0X00DC, (short) 0),
+ ENGUNIT((int) 0X00DD, (short) 0),
+ STRINGI((int) 0X00DD, (short) 0),
+ STRUCTURED((int) 0X02A0, (short) 88);
private static final Map<Integer, CIPDataTypeCode> map;
static {
diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/protocol/EipProtocolLogic.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/protocol/EipProtocolLogic.java
index 2a350c25c4..171953116a 100644
--- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/protocol/EipProtocolLogic.java
+++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/protocol/EipProtocolLogic.java
@@ -830,7 +830,6 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha
return new PlcREAL(swap(data.getFloat(0)));
case BOOL:
return new PlcBOOL(data.getBoolean(0));
- case STRING36:
case STRING:
case STRUCTURED: {
short structuredType = Short.reverseBytes(data.getShort(0));
@@ -1244,13 +1243,10 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha
buffer.putLong(value.getLong());
break;
case STRING:
- case STRING36:
+ case STRUCTURED:
buffer.putInt(value.getString().length());
buffer.put(value.getString().getBytes(), 0, value.getString().length());
break;
- case STRUCTURED:
- // Need to handle
- break;
default:
break;
}
diff --git a/protocols/eip/src/main/resources/protocols/eip/eip.mspec b/protocols/eip/src/main/resources/protocols/eip/eip.mspec
index 03ff51373e..c29dd75f82 100644
--- a/protocols/eip/src/main/resources/protocols/eip/eip.mspec
+++ b/protocols/eip/src/main/resources/protocols/eip/eip.mspec
@@ -356,11 +356,35 @@
['0X00C3' INT ['2']]
['0X00C4' DINT ['4']]
['0X00C5' LINT ['8']]
+ ['0X00C6' USINT ['1']]
+ ['0X00C7' UINT ['2']]
+ ['0X00C8' UDINT ['4']]
+ ['0X00C9' ULINT ['8']]
['0X00CA' REAL ['4']]
+ ['0X00CB' LREAL ['8']]
+ ['0X00CC' STIME ['4']] // Synchronous time information
+ ['0X00CD' DATE ['2']]
+ ['0X00CE' TIME_OF_DAY ['4']]
+ ['0X00CF' DATE_AND_TIME ['6']]
+ ['0X00D0' STRING ['0']] // Character string, 1-byte per character, 2-byte length
+ ['0X00D1' BYTE ['1']]
+ ['0X00D2' WORD ['2']]
['0X00D3' DWORD ['4']]
+ ['0X00D3' LWORD ['8']]
+ ['0X00D5' STRING2 ['0']] // Character string, 2-bytes per character
+ ['0X00D6' FTIME ['4']] // Duration - high resolution
+ ['0X00D7' LTIME ['8']] // Duration - long
+ ['0X00D8' ITIME ['2']] // Duration - short
+ ['0X00D9' STRINGN ['0']] // Character string, n-bytes per character
+ ['0X00DA' SHORT_STRING ['0']] // Character string, 1-byte per character, 1-byte length
+ ['0X00DB' TIME ['4']] // Duration - milliseconds
+ ['0X00DC' EPATH ['0']] // CIP path segments
+ ['0X00DD' ENGUNIT ['0']] // Engineering units
+ ['0X00DD' STRINGI ['0']] // International character string
+ // ARRAY
['0X02A0' STRUCTURED ['88']]
- ['0X02A0' STRING ['88']]
- ['0X02A0' STRING36 ['40']]
+ //['0X02A0' STRING ['88']]
+ //['0X02A0' STRING36 ['40']]
//TODO: -1 is not a valid value for uint
//['-1' UNKNOWN ['-1']]
diff --git a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
index d8e9f8b3c6..66d1049691 100644
--- a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
+++ b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
@@ -376,7 +376,7 @@
<data>
<CIPData>
<dataType>
- <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRING36">672</CIPDataTypeCode>
+ <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRUCTURED">672</CIPDataTypeCode>
</dataType>
<data dataType="byte" bitLength="720">0xce0f2b000000556d6d2c2049206e6f772073656520796f7520696e207468652077697265736861726b20636170747572650000000000000000000000000000000000000000000000000000000000000000000000000000000000</data>
</CIPData>
diff --git a/protocols/eip/src/test/resources/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml b/protocols/eip/src/test/resources/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
index de96f703ad..db0d33ea91 100644
--- a/protocols/eip/src/test/resources/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
+++ b/protocols/eip/src/test/resources/protocols/eip/ParserSerializerTestsuiteLittleEndian.xml
@@ -907,7 +907,7 @@
<data>
<CIPData>
<dataType>
- <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRING36">672</CIPDataTypeCode>
+ <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="STRUCTURED">672</CIPDataTypeCode>
</dataType>
<data dataType="byte" bitLength="720">0xce0f2b000000556d6d2c2049206e6f772073656520796f7520696e207468652077697265736861726b20636170747572650000000000000000000000000000000000000000000000000000000000000000000000000000000000</data>
</CIPData>