This is an automated email from the ASF dual-hosted git repository.
hutcheb pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/develop by this push:
new 0900b34e15 fix(plc4j/profinet): Fixed issue with endianess - still
need to specify the rest
0900b34e15 is described below
commit 0900b34e153297eb9b4262f799d49049b1ff7220
Author: Ben Hutcheson <[email protected]>
AuthorDate: Tue Feb 7 10:08:35 2023 +0100
fix(plc4j/profinet): Fixed issue with endianess - still need to specify the
rest
---
.../readwrite/PnIoCm_ModuleDiffBlockApi.java | 32 ++++--
.../PnIoCm_ModuleDiffBlockApi_Module.java | 48 +++++++--
.../PnIoCm_ModuleDiffBlockApi_Submodule.java | 108 ++++++++++++++++-----
.../plc4x/java/profinet/device/ProfinetDevice.java | 3 +
.../java/profinet/device/ProfinetModuleImpl.java | 8 +-
.../resources/protocols/profinet/profinet.mspec | 6 +-
6 files changed, 157 insertions(+), 48 deletions(-)
diff --git
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi.java
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi.java
index 31373dd3c2..13490b7e16 100644
---
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi.java
+++
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi.java
@@ -63,15 +63,24 @@ public class PnIoCm_ModuleDiffBlockApi implements Message {
writeBuffer.pushContext("PnIoCm_ModuleDiffBlockApi");
// Const Field (api)
- writeConstField("api", API, writeUnsignedLong(writeBuffer, 32));
+ writeConstField(
+ "api",
+ API,
+ writeUnsignedLong(writeBuffer, 32),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Implicit Field (numModules) (Used for parsing, but its value is not
stored as it's implicitly
// given by the objects content)
int numModules = (int) (COUNT(getModules()));
- writeImplicitField("numModules", numModules, writeUnsignedInt(writeBuffer,
16));
+ writeImplicitField(
+ "numModules",
+ numModules,
+ writeUnsignedInt(writeBuffer, 16),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Array Field (modules)
- writeComplexTypeArrayField("modules", modules, writeBuffer);
+ writeComplexTypeArrayField(
+ "modules", modules, writeBuffer,
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
writeBuffer.popContext("PnIoCm_ModuleDiffBlockApi");
}
@@ -119,16 +128,25 @@ public class PnIoCm_ModuleDiffBlockApi implements Message
{
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
long api =
- readConstField("api", readUnsignedLong(readBuffer, 32),
PnIoCm_ModuleDiffBlockApi.API);
-
- int numModules = readImplicitField("numModules",
readUnsignedInt(readBuffer, 16));
+ readConstField(
+ "api",
+ readUnsignedLong(readBuffer, 32),
+ PnIoCm_ModuleDiffBlockApi.API,
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+ int numModules =
+ readImplicitField(
+ "numModules",
+ readUnsignedInt(readBuffer, 16),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
List<PnIoCm_ModuleDiffBlockApi_Module> modules =
readCountArrayField(
"modules",
new DataReaderComplexDefault<>(
() ->
PnIoCm_ModuleDiffBlockApi_Module.staticParse(readBuffer), readBuffer),
- numModules);
+ numModules,
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
readBuffer.closeContext("PnIoCm_ModuleDiffBlockApi");
// Create the instance
diff --git
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi_Module.java
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi_Module.java
index ac9b21889e..f568fee4ee 100644
---
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi_Module.java
+++
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi_Module.java
@@ -78,10 +78,18 @@ public class PnIoCm_ModuleDiffBlockApi_Module implements
Message {
writeBuffer.pushContext("PnIoCm_ModuleDiffBlockApi_Module");
// Simple Field (slotNumber)
- writeSimpleField("slotNumber", slotNumber, writeUnsignedInt(writeBuffer,
16));
+ writeSimpleField(
+ "slotNumber",
+ slotNumber,
+ writeUnsignedInt(writeBuffer, 16),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (moduleIdentNumber)
- writeSimpleField("moduleIdentNumber", moduleIdentNumber,
writeUnsignedLong(writeBuffer, 32));
+ writeSimpleField(
+ "moduleIdentNumber",
+ moduleIdentNumber,
+ writeUnsignedLong(writeBuffer, 32),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (moduleState)
writeSimpleEnumField(
@@ -91,15 +99,21 @@ public class PnIoCm_ModuleDiffBlockApi_Module implements
Message {
new DataWriterEnumDefault<>(
PnIoCm_ModuleState::getValue,
PnIoCm_ModuleState::name,
- writeUnsignedInt(writeBuffer, 16)));
+ writeUnsignedInt(writeBuffer, 16)),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Implicit Field (numSubmodules) (Used for parsing, but its value is not
stored as it's
// implicitly given by the objects content)
int numSubmodules = (int) (COUNT(getSubmodules()));
- writeImplicitField("numSubmodules", numSubmodules,
writeUnsignedInt(writeBuffer, 16));
+ writeImplicitField(
+ "numSubmodules",
+ numSubmodules,
+ writeUnsignedInt(writeBuffer, 16),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Array Field (submodules)
- writeComplexTypeArrayField("submodules", submodules, writeBuffer);
+ writeComplexTypeArrayField(
+ "submodules", submodules, writeBuffer,
WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
writeBuffer.popContext("PnIoCm_ModuleDiffBlockApi_Module");
}
@@ -153,25 +167,39 @@ public class PnIoCm_ModuleDiffBlockApi_Module implements
Message {
int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int slotNumber = readSimpleField("slotNumber", readUnsignedInt(readBuffer,
16));
+ int slotNumber =
+ readSimpleField(
+ "slotNumber",
+ readUnsignedInt(readBuffer, 16),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
- long moduleIdentNumber = readSimpleField("moduleIdentNumber",
readUnsignedLong(readBuffer, 32));
+ long moduleIdentNumber =
+ readSimpleField(
+ "moduleIdentNumber",
+ readUnsignedLong(readBuffer, 32),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
PnIoCm_ModuleState moduleState =
readEnumField(
"moduleState",
"PnIoCm_ModuleState",
new DataReaderEnumDefault<>(
- PnIoCm_ModuleState::enumForValue, readUnsignedInt(readBuffer,
16)));
+ PnIoCm_ModuleState::enumForValue, readUnsignedInt(readBuffer,
16)),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
- int numSubmodules = readImplicitField("numSubmodules",
readUnsignedInt(readBuffer, 16));
+ int numSubmodules =
+ readImplicitField(
+ "numSubmodules",
+ readUnsignedInt(readBuffer, 16),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
List<PnIoCm_ModuleDiffBlockApi_Submodule> submodules =
readCountArrayField(
"submodules",
new DataReaderComplexDefault<>(
() ->
PnIoCm_ModuleDiffBlockApi_Submodule.staticParse(readBuffer), readBuffer),
- numSubmodules);
+ numSubmodules,
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
readBuffer.closeContext("PnIoCm_ModuleDiffBlockApi_Module");
// Create the instance
diff --git
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi_Submodule.java
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi_Submodule.java
index b41c4f4068..919bdf7f1c 100644
---
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi_Submodule.java
+++
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ModuleDiffBlockApi_Submodule.java
@@ -120,14 +120,25 @@ public class PnIoCm_ModuleDiffBlockApi_Submodule
implements Message {
writeBuffer.pushContext("PnIoCm_ModuleDiffBlockApi_Submodule");
// Simple Field (subslotNumber)
- writeSimpleField("subslotNumber", subslotNumber,
writeUnsignedInt(writeBuffer, 16));
+ writeSimpleField(
+ "subslotNumber",
+ subslotNumber,
+ writeUnsignedInt(writeBuffer, 16),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (submoduleIdentNumber)
writeSimpleField(
- "submoduleIdentNumber", submoduleIdentNumber,
writeUnsignedLong(writeBuffer, 32));
+ "submoduleIdentNumber",
+ submoduleIdentNumber,
+ writeUnsignedLong(writeBuffer, 32),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (codingUsesIdentInfo)
- writeSimpleField("codingUsesIdentInfo", codingUsesIdentInfo,
writeBoolean(writeBuffer));
+ writeSimpleField(
+ "codingUsesIdentInfo",
+ codingUsesIdentInfo,
+ writeBoolean(writeBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (identInfo)
writeSimpleEnumField(
@@ -135,7 +146,8 @@ public class PnIoCm_ModuleDiffBlockApi_Submodule implements
Message {
"PnIoCm_IdentInfo",
identInfo,
new DataWriterEnumDefault<>(
- PnIoCm_IdentInfo::getValue, PnIoCm_IdentInfo::name,
writeUnsignedByte(writeBuffer, 4)));
+ PnIoCm_IdentInfo::getValue, PnIoCm_IdentInfo::name,
writeUnsignedByte(writeBuffer, 4)),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (arInfo)
writeSimpleEnumField(
@@ -143,19 +155,36 @@ public class PnIoCm_ModuleDiffBlockApi_Submodule
implements Message {
"PnIoCm_ArInfo",
arInfo,
new DataWriterEnumDefault<>(
- PnIoCm_ArInfo::getValue, PnIoCm_ArInfo::name,
writeUnsignedByte(writeBuffer, 4)));
+ PnIoCm_ArInfo::getValue, PnIoCm_ArInfo::name,
writeUnsignedByte(writeBuffer, 4)),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (diagInfoAvailable)
- writeSimpleField("diagInfoAvailable", diagInfoAvailable,
writeBoolean(writeBuffer));
+ writeSimpleField(
+ "diagInfoAvailable",
+ diagInfoAvailable,
+ writeBoolean(writeBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (maintenanceDemanded)
- writeSimpleField("maintenanceDemanded", maintenanceDemanded,
writeBoolean(writeBuffer));
+ writeSimpleField(
+ "maintenanceDemanded",
+ maintenanceDemanded,
+ writeBoolean(writeBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (maintenanceRequired)
- writeSimpleField("maintenanceRequired", maintenanceRequired,
writeBoolean(writeBuffer));
+ writeSimpleField(
+ "maintenanceRequired",
+ maintenanceRequired,
+ writeBoolean(writeBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (qualifiedInfo)
- writeSimpleField("qualifiedInfo", qualifiedInfo,
writeBoolean(writeBuffer));
+ writeSimpleField(
+ "qualifiedInfo",
+ qualifiedInfo,
+ writeBoolean(writeBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
// Simple Field (addInfo)
writeSimpleEnumField(
@@ -163,7 +192,8 @@ public class PnIoCm_ModuleDiffBlockApi_Submodule implements
Message {
"PnIoCm_AddInfo",
addInfo,
new DataWriterEnumDefault<>(
- PnIoCm_AddInfo::getValue, PnIoCm_AddInfo::name,
writeUnsignedByte(writeBuffer, 3)));
+ PnIoCm_AddInfo::getValue, PnIoCm_AddInfo::name,
writeUnsignedByte(writeBuffer, 3)),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
writeBuffer.popContext("PnIoCm_ModuleDiffBlockApi_Submodule");
}
@@ -226,41 +256,71 @@ public class PnIoCm_ModuleDiffBlockApi_Submodule
implements Message {
int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int subslotNumber = readSimpleField("subslotNumber",
readUnsignedInt(readBuffer, 16));
+ int subslotNumber =
+ readSimpleField(
+ "subslotNumber",
+ readUnsignedInt(readBuffer, 16),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
long submoduleIdentNumber =
- readSimpleField("submoduleIdentNumber", readUnsignedLong(readBuffer,
32));
+ readSimpleField(
+ "submoduleIdentNumber",
+ readUnsignedLong(readBuffer, 32),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
- boolean codingUsesIdentInfo = readSimpleField("codingUsesIdentInfo",
readBoolean(readBuffer));
+ boolean codingUsesIdentInfo =
+ readSimpleField(
+ "codingUsesIdentInfo",
+ readBoolean(readBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
PnIoCm_IdentInfo identInfo =
readEnumField(
"identInfo",
"PnIoCm_IdentInfo",
new DataReaderEnumDefault<>(
- PnIoCm_IdentInfo::enumForValue, readUnsignedByte(readBuffer,
4)));
+ PnIoCm_IdentInfo::enumForValue, readUnsignedByte(readBuffer,
4)),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
PnIoCm_ArInfo arInfo =
readEnumField(
"arInfo",
"PnIoCm_ArInfo",
new DataReaderEnumDefault<>(
- PnIoCm_ArInfo::enumForValue, readUnsignedByte(readBuffer, 4)));
-
- boolean diagInfoAvailable = readSimpleField("diagInfoAvailable",
readBoolean(readBuffer));
-
- boolean maintenanceDemanded = readSimpleField("maintenanceDemanded",
readBoolean(readBuffer));
-
- boolean maintenanceRequired = readSimpleField("maintenanceRequired",
readBoolean(readBuffer));
-
- boolean qualifiedInfo = readSimpleField("qualifiedInfo",
readBoolean(readBuffer));
+ PnIoCm_ArInfo::enumForValue, readUnsignedByte(readBuffer, 4)),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+ boolean diagInfoAvailable =
+ readSimpleField(
+ "diagInfoAvailable",
+ readBoolean(readBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+ boolean maintenanceDemanded =
+ readSimpleField(
+ "maintenanceDemanded",
+ readBoolean(readBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+ boolean maintenanceRequired =
+ readSimpleField(
+ "maintenanceRequired",
+ readBoolean(readBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+ boolean qualifiedInfo =
+ readSimpleField(
+ "qualifiedInfo",
+ readBoolean(readBuffer),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
PnIoCm_AddInfo addInfo =
readEnumField(
"addInfo",
"PnIoCm_AddInfo",
new DataReaderEnumDefault<>(
- PnIoCm_AddInfo::enumForValue, readUnsignedByte(readBuffer,
3)));
+ PnIoCm_AddInfo::enumForValue, readUnsignedByte(readBuffer, 3)),
+ WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
readBuffer.closeContext("PnIoCm_ModuleDiffBlockApi_Submodule");
// Create the instance
diff --git
a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevice.java
b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevice.java
index 769c217c8a..e10de6e0b4 100644
---
a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevice.java
+++
b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevice.java
@@ -349,6 +349,9 @@ public class ProfinetDevice implements PlcSubscriber{
ReadBuffer buffer = new
ReadBufferByteBased(cyclicPdu.getDataUnit().getData());
try {
+ if (deviceContext.getModules() == null) {
+ logger.error("HH");
+ }
for (ProfinetModule module : deviceContext.getModules()) {
module.parseTags(tags, deviceContext.getDeviceName(), buffer);
}
diff --git
a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModuleImpl.java
b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModuleImpl.java
index 5063a2fc23..cc987b22cd 100644
---
a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModuleImpl.java
+++
b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModuleImpl.java
@@ -275,8 +275,8 @@ public class ProfinetModuleImpl implements ProfinetModule {
for (ProfinetIoDataInput input :
virtual.getIoData().getInput()) {
for (ProfinetDataItem item :
input.getDataItemList()) {
if (item.isUseAsBits()) {
- for (ProfinetBitDataItem bitItem :
item.getBitDataItem()) {
- String tagName = addressSpace + "." +
this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." +
bitItem.getBitOffset();
+ for (int i = 0; i <
ProfinetDataType.firstEnumForFieldConversion(item.getDataType().toUpperCase()).getDataTypeSize()
* 8; i++) {
+ String tagName = addressSpace + "." +
this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." + i;
browseItems.add(new
DefaultPlcBrowseItem(ProfinetTag.of(tagName + ":BOOL"), tagName, false, false,
true, new HashMap<>(), options));
}
} else {
@@ -318,8 +318,8 @@ public class ProfinetModuleImpl implements ProfinetModule {
for (ProfinetIoDataInput input :
virtual.getIoData().getInput()) {
for (ProfinetDataItem item :
input.getDataItemList()) {
if (item.isUseAsBits()) {
- for (ProfinetBitDataItem bitItem :
item.getBitDataItem()) {
- String tagName = addressSpace + "." +
this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." +
bitItem.getBitOffset();
+ for (int i = 0; i <
ProfinetDataType.firstEnumForFieldConversion(item.getDataType().toUpperCase()).getDataTypeSize()
* 8; i++) {
+ String tagName = addressSpace + "." +
this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." + i;
tags.put(tagName, new
ResponseItem<>(PlcResponseCode.OK, DataItem.staticParse(buffer,
ProfinetDataType.BOOL, 1)));
}
} else {
diff --git
a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec
b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec
index 6cd2a87f18..a2775061ed 100644
--- a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec
+++ b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec
@@ -1122,13 +1122,13 @@
[array PnIoCm_Submodule submodules count
'numSubmodules']
]
-[type PnIoCm_ModuleDiffBlockApi
+[type PnIoCm_ModuleDiffBlockApi byteOrder='BIG_ENDIAN'
[const uint 32 api 0x00000000
]
[implicit uint 16 numModules 'COUNT(modules)'
]
[array PnIoCm_ModuleDiffBlockApi_Module modules count
'numModules']
]
-[type PnIoCm_ModuleDiffBlockApi_Module
+[type PnIoCm_ModuleDiffBlockApi_Module byteOrder='BIG_ENDIAN'
[simple uint 16 slotNumber
]
[simple uint 32 moduleIdentNumber
]
[simple PnIoCm_ModuleState moduleState
]
@@ -1136,7 +1136,7 @@
[array PnIoCm_ModuleDiffBlockApi_Submodule submodules count
'numSubmodules']
]
-[type PnIoCm_ModuleDiffBlockApi_Submodule
+[type PnIoCm_ModuleDiffBlockApi_Submodule byteOrder='BIG_ENDIAN'
[simple uint 16 subslotNumber ]
[simple uint 32 submoduleIdentNumber]
[simple bit codingUsesIdentInfo ]