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 29e6fc1384 fix(plc4j/profinet): Update for OctetString and 
F_MESSAGETRAILER4BYTE datatypes
29e6fc1384 is described below

commit 29e6fc1384949c4f2ade4274053471582d76cbb7
Author: Ben Hutcheson <[email protected]>
AuthorDate: Fri Mar 31 06:25:19 2023 +0200

    fix(plc4j/profinet): Update for OctetString and F_MESSAGETRAILER4BYTE 
datatypes
---
 .../plc4x/java/profinet/readwrite/DataItem.java    | 290 +++++++++++++++++++++
 .../java/profinet/readwrite/ProfinetDataType.java  |  10 +-
 .../drivers/profinet/src/test/resources/gsdml.xml  |   4 +
 .../main/resources/protocols/profinet/pnio.mspec   |  38 ++-
 4 files changed, 339 insertions(+), 3 deletions(-)

diff --git 
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java
 
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java
index b2ca0430e3..4404c32b75 100644
--- 
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java
+++ 
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java
@@ -72,6 +72,36 @@ public class DataItem {
         }
       }
 
+      return new PlcList(value);
+    } else if (EvaluationHelper.equals(dataType, ProfinetDataType.OCTETSTRING)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // USINT
+
+      // Simple Field (value)
+      Short value = /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.readUnsignedShort("", 8);
+
+      return new PlcUSINT(value);
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.OCTETSTRING)) { // List
+      // Array field (value)
+      // Count array
+      if (numberOfValues > Integer.MAX_VALUE) {
+        throw new ParseException(
+            "Array count of "
+                + (numberOfValues)
+                + " exceeds the maximum allowed count of "
+                + Integer.MAX_VALUE);
+      }
+      List<PlcValue> value;
+      {
+        int itemCount = (int) numberOfValues;
+        value = new LinkedList<>();
+        for (int curItem = 0; curItem < itemCount; curItem++) {
+          value.add(
+              new PlcUINT(
+                  (Short) /*TODO: migrate me*/ /*TODO: migrate me*/
+                      readBuffer.readUnsignedShort("", 8)));
+        }
+      }
+
       return new PlcList(value);
     } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE)
         && EvaluationHelper.equals(numberOfValues, 1)) { // BYTE
@@ -479,6 +509,146 @@ public class DataItem {
         }
       }
 
+      return new PlcList(value);
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.UNICODESTRING8)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+
+      // Simple Field (value)
+      String value = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readString("", 8, WithOption.WithEncoding("UTF-8"));
+
+      return new PlcCHAR(value);
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.UNICODESTRING8)) { // List
+      // Array field (value)
+      // Count array
+      if (numberOfValues > Integer.MAX_VALUE) {
+        throw new ParseException(
+            "Array count of "
+                + (numberOfValues)
+                + " exceeds the maximum allowed count of "
+                + Integer.MAX_VALUE);
+      }
+      List<PlcValue> value;
+      {
+        int itemCount = (int) numberOfValues;
+        value = new LinkedList<>();
+        for (int curItem = 0; curItem < itemCount; curItem++) {
+          value.add(
+              new PlcSTRING(
+                  (String) /*TODO: migrate me*/ /*TODO: migrate me*/
+                      readBuffer.readString("", 8, 
WithOption.WithEncoding("UTF-8"))));
+        }
+      }
+
+      return new PlcList(value);
+    } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+
+      // Simple Field (value)
+      String value = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16"));
+
+      return new PlcCHAR(value);
+    } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)) { 
// List
+      // Array field (value)
+      // Count array
+      if (numberOfValues > Integer.MAX_VALUE) {
+        throw new ParseException(
+            "Array count of "
+                + (numberOfValues)
+                + " exceeds the maximum allowed count of "
+                + Integer.MAX_VALUE);
+      }
+      List<PlcValue> value;
+      {
+        int itemCount = (int) numberOfValues;
+        value = new LinkedList<>();
+        for (int curItem = 0; curItem < itemCount; curItem++) {
+          value.add(
+              new PlcSTRING(
+                  (String) /*TODO: migrate me*/ /*TODO: migrate me*/
+                      readBuffer.readString("", 16, 
WithOption.WithEncoding("UTF-16"))));
+        }
+      }
+
+      return new PlcList(value);
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.VISIBLESTRING)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+
+      // Simple Field (value)
+      String value = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readString("", 8, WithOption.WithEncoding("UTF-8"));
+
+      return new PlcCHAR(value);
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.VISIBLESTRING)) { // List
+      // Array field (value)
+      // Count array
+      if (numberOfValues > Integer.MAX_VALUE) {
+        throw new ParseException(
+            "Array count of "
+                + (numberOfValues)
+                + " exceeds the maximum allowed count of "
+                + Integer.MAX_VALUE);
+      }
+      List<PlcValue> value;
+      {
+        int itemCount = (int) numberOfValues;
+        value = new LinkedList<>();
+        for (int curItem = 0; curItem < itemCount; curItem++) {
+          value.add(
+              new PlcSTRING(
+                  (String) /*TODO: migrate me*/ /*TODO: migrate me*/
+                      readBuffer.readString("", 8, 
WithOption.WithEncoding("UTF-8"))));
+        }
+      }
+
+      return new PlcList(value);
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.F_MESSAGETRAILER4BYTE)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // List
+      // Array field (value)
+      // Count array
+      if ((4) * (8) > Integer.MAX_VALUE) {
+        throw new ParseException(
+            "Array count of "
+                + ((4) * (8))
+                + " exceeds the maximum allowed count of "
+                + Integer.MAX_VALUE);
+      }
+      List<PlcValue> value;
+      {
+        int itemCount = (int) (4) * (8);
+        value = new LinkedList<>();
+        for (int curItem = 0; curItem < itemCount; curItem++) {
+          value.add(
+              new PlcUINT(
+                  (Short) /*TODO: migrate me*/ /*TODO: migrate me*/
+                      readBuffer.readUnsignedShort("", 8)));
+        }
+      }
+
+      return new PlcList(value);
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.F_MESSAGETRAILER4BYTE)) { // List
+      // Array field (value)
+      // Count array
+      if ((numberOfValues) * (32) > Integer.MAX_VALUE) {
+        throw new ParseException(
+            "Array count of "
+                + ((numberOfValues) * (32))
+                + " exceeds the maximum allowed count of "
+                + Integer.MAX_VALUE);
+      }
+      List<PlcValue> value;
+      {
+        int itemCount = (int) (numberOfValues) * (32);
+        value = new LinkedList<>();
+        for (int curItem = 0; curItem < itemCount; curItem++) {
+          value.add(
+              new PlcUINT(
+                  (Short) /*TODO: migrate me*/ /*TODO: migrate me*/
+                      readBuffer.readUnsignedShort("", 8)));
+        }
+      }
+
       return new PlcList(value);
     }
     return null;
@@ -512,6 +682,21 @@ public class DataItem {
         /*TODO: migrate me*/ writeBuffer.writeBit("", (boolean) (value));
       }
 
+    } else if (EvaluationHelper.equals(dataType, ProfinetDataType.OCTETSTRING)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // USINT
+      // Simple Field (value)
+      short value = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) 
(value)).shortValue());
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.OCTETSTRING)) { // List
+      PlcList values = (PlcList) _value;
+
+      for (PlcValue val : ((List<PlcValue>) values.getList())) {
+        Short value = (Short) val.getShort();
+        /*TODO: migrate me*/
+        /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) 
(value)).shortValue());
+      }
+
     } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE)
         && EvaluationHelper.equals(numberOfValues, 1)) { // BYTE
       // Simple Field (value)
@@ -725,6 +910,76 @@ public class DataItem {
         /*TODO: migrate me*/ writeBuffer.writeString(
             "", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
       }
+
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.UNICODESTRING8)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+      // Simple Field (value)
+      String value = (String) _value.getString();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeString(
+          "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.UNICODESTRING8)) { // List
+      PlcList values = (PlcList) _value;
+
+      for (PlcValue val : ((List<PlcValue>) values.getList())) {
+        String value = (String) val.getString();
+        /*TODO: migrate me*/
+        /*TODO: migrate me*/ writeBuffer.writeString(
+            "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+      }
+
+    } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+      // Simple Field (value)
+      String value = (String) _value.getString();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeString(
+          "", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
+    } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)) { 
// List
+      PlcList values = (PlcList) _value;
+
+      for (PlcValue val : ((List<PlcValue>) values.getList())) {
+        String value = (String) val.getString();
+        /*TODO: migrate me*/
+        /*TODO: migrate me*/ writeBuffer.writeString(
+            "", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
+      }
+
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.VISIBLESTRING)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+      // Simple Field (value)
+      String value = (String) _value.getString();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeString(
+          "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.VISIBLESTRING)) { // List
+      PlcList values = (PlcList) _value;
+
+      for (PlcValue val : ((List<PlcValue>) values.getList())) {
+        String value = (String) val.getString();
+        /*TODO: migrate me*/
+        /*TODO: migrate me*/ writeBuffer.writeString(
+            "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+      }
+
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.F_MESSAGETRAILER4BYTE)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // List
+      PlcList values = (PlcList) _value;
+
+      for (PlcValue val : ((List<PlcValue>) values.getList())) {
+        Short value = (Short) val.getShort();
+        /*TODO: migrate me*/
+        /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) 
(value)).shortValue());
+      }
+
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.F_MESSAGETRAILER4BYTE)) { // List
+      PlcList values = (PlcList) _value;
+
+      for (PlcValue val : ((List<PlcValue>) values.getList())) {
+        Short value = (Short) val.getShort();
+        /*TODO: migrate me*/
+        /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) 
(value)).shortValue());
+      }
     }
   }
 
@@ -743,6 +998,13 @@ public class DataItem {
     } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BOOL)) { // 
List
       PlcList values = (PlcList) _value;
       sizeInBits += values.getList().size() * 1;
+    } else if (EvaluationHelper.equals(dataType, ProfinetDataType.OCTETSTRING)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // USINT
+      // Simple Field (value)
+      sizeInBits += 8;
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.OCTETSTRING)) { // List
+      PlcList values = (PlcList) _value;
+      sizeInBits += values.getList().size() * 8;
     } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE)
         && EvaluationHelper.equals(numberOfValues, 1)) { // BYTE
       // Simple Field (value)
@@ -843,6 +1105,34 @@ public class DataItem {
     } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WCHAR)) { // 
List
       PlcList values = (PlcList) _value;
       sizeInBits += values.getList().size() * 16;
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.UNICODESTRING8)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+      // Simple Field (value)
+      sizeInBits += 8;
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.UNICODESTRING8)) { // List
+      PlcList values = (PlcList) _value;
+      sizeInBits += values.getList().size() * 8;
+    } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+      // Simple Field (value)
+      sizeInBits += 16;
+    } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)) { 
// List
+      PlcList values = (PlcList) _value;
+      sizeInBits += values.getList().size() * 16;
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.VISIBLESTRING)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+      // Simple Field (value)
+      sizeInBits += 8;
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.VISIBLESTRING)) { // List
+      PlcList values = (PlcList) _value;
+      sizeInBits += values.getList().size() * 8;
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.F_MESSAGETRAILER4BYTE)
+        && EvaluationHelper.equals(numberOfValues, 1)) { // List
+      PlcList values = (PlcList) _value;
+      sizeInBits += values.getList().size() * 8;
+    } else if (EvaluationHelper.equals(dataType, 
ProfinetDataType.F_MESSAGETRAILER4BYTE)) { // List
+      PlcList values = (PlcList) _value;
+      sizeInBits += values.getList().size() * 8;
     }
     return sizeInBits;
   }
diff --git 
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java
 
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java
index 4b9fae34b1..f41e9335d6 100644
--- 
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java
+++ 
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java
@@ -51,8 +51,14 @@ public enum ProfinetDataType {
   LDATE_AND_TIME((short) 23, (short) 8, (String) "LDATE_AND_TIME"),
   CHAR((short) 24, (short) 1, (String) "CHAR"),
   WCHAR((short) 25, (short) 2, (String) "WCHAR"),
-  STRING((short) 26, (short) 1, (String) "STRING"),
-  WSTRING((short) 27, (short) 2, (String) "WSTRING");
+  UNICODESTRING8((short) 26, (short) 1, (String) "UNICODESTRING8"),
+  WSTRING((short) 27, (short) 2, (String) "WSTRING"),
+  VISIBLESTRING((short) 28, (short) 1, (String) "VISIBLESTRING"),
+  F_MESSAGETRAILER4BYTE((short) 29, (short) 4, (String) 
"F_MESSAGETRAILER4BYTE"),
+  TIMESTAMP((short) 30, (short) 12, (String) "TIMESTAMP"),
+  TIMESTAMPDIFFERENCE((short) 31, (short) 12, (String) "TIMESTAMPDIFFERENCE"),
+  TIMESTAMPDIFFERENCESHORT((short) 32, (short) 8, (String) 
"TIMESTAMPDIFFERENCESHORT"),
+  OCTETSTRING((short) 33, (short) 1, (String) "OCTETSTRING");
   private static final Map<Short, ProfinetDataType> map;
 
   static {
diff --git a/plc4j/drivers/profinet/src/test/resources/gsdml.xml 
b/plc4j/drivers/profinet/src/test/resources/gsdml.xml
index 7631f229cf..4e720bda6f 100644
--- a/plc4j/drivers/profinet/src/test/resources/gsdml.xml
+++ b/plc4j/drivers/profinet/src/test/resources/gsdml.xml
@@ -212,6 +212,10 @@
                      </DataItem>
                      <DataItem DataType="Float32" 
TextId="PLC4X_INPUT_MODULE_INFO_FLOAT"/>
                    </Input>
+                   <Input Consistency="None">
+                     <DataItem Length="15" TextId="Inputs" 
DataType="OctetString" UseAsBits="true" />
+                     <DataItem DataType="Float32" 
TextId="PLC4X_INPUT_MODULE_INFO_FLOAT"/>
+                   </Input>
                  </IOData>
                  <ModuleInfo>
                    <Name TextId="PLC4X_VIRTUAL_INPUT_MODULE_NAME"/>
diff --git 
a/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec 
b/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec
index 991c297130..0d0606a706 100644
--- a/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec
+++ b/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec
@@ -523,6 +523,12 @@
         ['BOOL'      List
             [array    bit     value count 'numberOfValues'     ]
         ]
+        ['OCTETSTRING','1'  USINT
+            [simple uint 8 value]
+        ]
+        ['OCTETSTRING' List
+            [array    uint 8     value count 'numberOfValues' ]
+        ]
         ['BYTE','1'  BYTE
             [simple uint 8 value]
         ]
@@ -610,6 +616,30 @@
         ['WCHAR' List
             [array string 16 value count 'numberOfValues' encoding='"UTF-16"']
         ]
+        ['UNICODESTRING8','1' CHAR
+            [simple string 8 value encoding='"UTF-8"']
+        ]
+        ['UNICODESTRING8' List
+            [array string 8 value count 'numberOfValues' encoding='"UTF-8"']
+        ]
+        ['WSTRING','1' CHAR
+            [simple string 16 value encoding='"UTF-16"']
+        ]
+        ['WSTRING' List
+            [array string 16 value count 'numberOfValues' encoding='"UTF-16"']
+        ]
+        ['VISIBLESTRING','1' CHAR
+            [simple string 8 value encoding='"UTF-8"']
+        ]
+        ['VISIBLESTRING' List
+            [array string 8 value count 'numberOfValues' encoding='"UTF-8"']
+        ]
+        ['F_MESSAGETRAILER4BYTE','1'  List
+            [array    uint 8     value count '4 * 8' ]
+        ]
+        ['F_MESSAGETRAILER4BYTE' List
+            [array    uint 8     value count 'numberOfValues * 32' ]
+        ]
     ]
 ]
 
@@ -639,6 +669,12 @@
     ['23' LDATE_AND_TIME ['8','LDATE_AND_TIME']]
     ['24' CHAR ['1','CHAR']]
     ['25' WCHAR ['2','WCHAR']]
-    ['26' STRING ['1','STRING']]
+    ['26' UNICODESTRING8 ['1','UNICODESTRING8']]
     ['27' WSTRING ['2','WSTRING']]
+    ['28' VISIBLESTRING ['1','VISIBLESTRING']]
+    ['29' F_MESSAGETRAILER4BYTE ['4','F_MESSAGETRAILER4BYTE']]
+    ['30' TIMESTAMP ['12','TIMESTAMP']]
+    ['31' TIMESTAMPDIFFERENCE ['12','TIMESTAMPDIFFERENCE']]
+    ['32' TIMESTAMPDIFFERENCESHORT ['8','TIMESTAMPDIFFERENCESHORT']]
+    ['33' OCTETSTRING ['1','OCTETSTRING']]
 ]

Reply via email to