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 2021/10/11 10:30:44 UTC

[plc4x] branch feature/mspec-ng updated: - Worked on the float types

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch feature/mspec-ng
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/mspec-ng by this push:
     new c4ff261  - Worked on the float types
c4ff261 is described below

commit c4ff2615b5fc3577e17b8aa7495ca62e70aba38b
Author: cdutz <ch...@c-ware.de>
AuthorDate: Mon Oct 11 12:30:30 2021 +0200

    - Worked on the float types
---
 .../src/test/resources/mspec.example2              | 54 +++++++++++-----------
 .../plc4x/java/spi/codegen/fields/FieldReader.java |  1 -
 .../spi/codegen/fields/FieldReaderAbstract.java    |  7 ++-
 .../java/spi/codegen/fields/FieldReaderArray.java  | 13 ++++++
 .../spi/codegen/fields/FieldReaderChecksum.java    |  4 ++
 .../java/spi/codegen/fields/FieldReaderConst.java  |  2 +-
 .../java/spi/codegen/fields/FieldReaderEnum.java   |  4 ++
 .../java/spi/codegen/fields/FieldReaderManual.java |  6 +++
 .../spi/codegen/fields/FieldReaderOptional.java    |  4 +-
 9 files changed, 63 insertions(+), 32 deletions(-)

diff --git a/code-generation/protocol-base-mspec/src/test/resources/mspec.example2 b/code-generation/protocol-base-mspec/src/test/resources/mspec.example2
index 1cb6b02..77b6d8b 100644
--- a/code-generation/protocol-base-mspec/src/test/resources/mspec.example2
+++ b/code-generation/protocol-base-mspec/src/test/resources/mspec.example2
@@ -73,8 +73,8 @@
 /*
  * TODO: doesn't compile in java
 [type 'UFloatTypeTest'
-    [simple ufloat 8.23 'ufloatField']
-    [simple ufloat 11.52 'udoubleField']
+    [simple ufloat 32 'ufloatField']
+    [simple ufloat 64 'udoubleField']
 ]
 */
 
@@ -92,8 +92,8 @@
     [simple byte 'byteField']
     [simple int 8 'intField']
     [simple uint 8 'uintField']
-    [simple float 8.23 'floatField']
-    [simple float 11.52 'doubleField']
+    [simple float 32 'floatField']
+    [simple float 64 'doubleField']
     [simple string 8 'stringField' encoding='UTF-8']
 ]
 
@@ -103,16 +103,16 @@
     [abstract bit 'abstractBitField']
     [abstract int 8 'abstractIntField']
     [abstract uint 8 'abstractUintField']
-    [abstract float 8.23 'abstractFloatField']
-    [abstract float 11.52 'abstractDoubleField']
+    [abstract float 32 'abstractFloatField']
+    [abstract float 64 'abstractDoubleField']
     [abstract string 8 'abstractStringField' encoding='UTF-8']
     [typeSwitch 'simpleField'
         ['0' AbstractedType
             [simple bit 'abstractBitField']
             [simple int 8 'abstractIntField']
             [simple uint 8 'abstractUintField']
-            [simple float 8.23 'abstractFloatField']
-            [simple float 11.52 'abstractDoubleField']
+            [simple float 32 'abstractFloatField']
+            [simple float 64 'abstractDoubleField']
             [simple string 8 'abstractStringField' encoding='UTF-8']
         ]
     ]
@@ -124,8 +124,8 @@
     [abstract bit 'abstractBitField']
     [abstract int 8 'abstractIntField']
     [abstract uint 8 'abstractUintField']
-    [abstract float 8.23 'abstractFloatField']
-    [abstract float 11.52 'abstractDoubleField']
+    [abstract float 32 'abstractFloatField']
+    [abstract float 64 'abstractDoubleField']
     [abstract string 8 'abstractStringField' encoding='UTF-8']
     [typeSwitch 'simpleField'
         ['0' AbstractedType
@@ -133,8 +133,8 @@
             [simple bit 'abstractBitField']
             [simple int 8 'abstractIntField']
             [simple uint 8 'abstractUintField']
-            [simple float 8.23 'abstractFloatField']
-            [simple float 11.52 'abstractDoubleField']
+            [simple float 32 'abstractFloatField']
+            [simple float 64 'abstractDoubleField']
             [simple string 8 'abstractStringField' encoding='UTF-8']
         ]
     ]
@@ -144,8 +144,8 @@
     [array bit 'bitField' count      '5']
     [array int 8 'intField' count      '5']
     [array uint 8 'uintField' count      '5']
-    [array float 8.23 'floatField' count      '5']
-    [array float 11.52 'doubleField' count      '5']
+    [array float 32 'floatField' count      '5']
+    [array float 64 'doubleField' count      '5']
     [array string 8 'stringField' count      '5' encoding='UTF-8']
 ]
 
@@ -156,8 +156,8 @@
     //[checksum int 8 'intField' '100']
     //[checksum uint 8 'uintField' '100']
     //Float fields cannot be used as checksums
-    //[checksum float 8.23 'floatField' '100.0f']
-    //[checksum float 11.52 'doubleField' '100.0']
+    //[checksum float 32 'floatField' '100.0f']
+    //[checksum float 64 'doubleField' '100.0']
     //String field cannot be used as a checksum
     //[checksum vstring '11 * 8' 'stringField' '"HELLO TODDY"' encoding='UTF-8']
 //]
@@ -166,8 +166,8 @@
     [const bit 'bitField' 'true']
     [const int 8 'intField' '100']
     [const uint 8 'uintField' '100']
-    [const float 8.23 'floatField' '100.0']
-    [const float 11.52 'doubleField' '100.0']
+    [const float 32 'floatField' '100.0']
+    [const float 64 'doubleField' '100.0']
     [const string 8 'stringField' '"HELLO TODDY"' encoding='UTF-8']
 ]
 
@@ -193,8 +193,8 @@
     [implicit bit 'bitField' 'simpleField > 0']
     [implicit int 8 'intField' 'simpleField']
     [implicit uint 8 'uintField' 'simpleField']
-    [implicit float 8.23 'floatField' 'simpleField']
-    [implicit float 11.52 'doubleField' 'simpleField']
+    [implicit float 32 'floatField' 'simpleField']
+    [implicit float 64 'doubleField' 'simpleField']
     //TODO: String literals can't be used in the expression
     //[implicit string 8 'stringField' 'simpleField > 0 ? "HELLO TODDY" : "BYE TODDY"' encoding='UTF-8']
 ]
@@ -219,8 +219,8 @@
 //    [virtual bit 'virtualBitField' 'simpleField == 0']
 //    [virtual int 8 'virtualIntField' 'simpleField']
 //    [virtual uint 8 'virtualUintField' 'simpleField']
-//    [virtual float 8.23 'virtualFloatField' 'simpleField']
-//    [virtual float 11.52 'virtualDoubleField' 'simpleField']
+//    [virtual float 32 'virtualFloatField' 'simpleField']
+//    [virtual float 64 'virtualDoubleField' 'simpleField']
 //    [virtual string 24 'virtualStringField' 'simpleField']
 //]
 
@@ -230,8 +230,8 @@
 //    [virtual bit 'virtualBitField' 'simpleField == 0']
 //    [virtual int 8 'virtualIntField' 'simpleField']
 //    [virtual uint 8 'virtualUintField' 'simpleField']
-//    [virtual float 8.23 'virtualFloatField' 'simpleField']
-//    [virtual float 11.52 'virtualDoubleField' 'simpleField']
+//    [virtual float 32 'virtualFloatField' 'simpleField']
+//    [virtual float 64 'virtualDoubleField' 'simpleField']
 //    [virtual string 24 'virtualStringField' 'simpleField' encoding='UTF-8']
 //    [typeSwitch 'simpleField'
 //        ['0' DiscriminatedVirtualType
@@ -387,14 +387,14 @@
 ]
 
 //TODO:  C doesn't support non integer switch fields
-//[enum float 8.23 'EnumTypeFloat'
+//[enum float 32 'EnumTypeFloat'
 //    ['100.0' LOW]
 //    ['101.0' MID]
 //    ['102.0' BIG]
 //]
 
 //TODO:  C doesn't support non integer switch fields
-//[enum float 11.52 'EnumTypeDouble'
+//[enum float 64 'EnumTypeDouble'
 //    ['100.0' LOW]
 //    ['101.0' MID]
 //    ['102.0' BIG]
@@ -413,7 +413,7 @@
 //]
 
 //TODO:  Float parameters aren't implemented for constants in enums in C
-//[enum int 8 'EnumTypeAllTest'  [bit 'bitType', int 8 'intType', uint 8 'uintType', float 8.23 'floatType', float 11.52 'doubleType', string '-1' 'stringType', EnumType 'enumType']
+//[enum int 8 'EnumTypeAllTest'  [bit 'bitType', int 8 'intType', uint 8 'uintType', float 32 'floatType', float 64 'doubleType', string '-1' 'stringType', EnumType 'enumType']
 //    ['0x01' BOOL             ['false'      , '1'               , '1'                 , '100.0'                  , '100.0'              , 'BOOL'         , 'BOOL']]
 //    ['0x02' BYTE             ['true'       , '2'               , '2'                 , '101.1'                  , '101.1'              , 'BYTE'         , 'UINT']]
 //]
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReader.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReader.java
index c130ecf..382e3ef 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReader.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReader.java
@@ -19,7 +19,6 @@
 package org.apache.plc4x.java.spi.codegen.fields;
 
 import org.apache.plc4x.java.spi.codegen.FieldCommons;
-import org.apache.plc4x.java.spi.codegen.WithOption;
 import org.apache.plc4x.java.spi.codegen.io.DataReader;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderAbstract.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderAbstract.java
index cd9e3c7..95eea4f 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderAbstract.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderAbstract.java
@@ -24,13 +24,18 @@ import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * This reader should actually never be used as an abstract field never gets read, it only makes sure
+ * abstract accessor methods are generated in the abstract parent type.
+ * @param <T>
+ */
 public class FieldReaderAbstract<T> implements FieldReader<T> {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(FieldReaderAbstract.class);
 
     @Override
     public T readField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
-        return switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+        return null;
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java
index 27ba337..dcca663 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderArray.java
@@ -18,6 +18,7 @@
  */
 package org.apache.plc4x.java.spi.codegen.fields;
 
+import jdk.internal.org.objectweb.asm.TypeReference;
 import org.apache.plc4x.java.spi.codegen.io.DataReader;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
@@ -33,4 +34,16 @@ public class FieldReaderArray<T> implements FieldReader<T> {
         return switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
     }
 
+    public T[] readFieldCount(String logicalName, DataReader<T> dataReader, int count, WithReaderArgs... readerArgs) throws ParseException {
+        return null;
+    }
+
+    public T[] readFieldLength(String logicalName, DataReader<T> dataReader, int length, WithReaderArgs... readerArgs) throws ParseException {
+        return null;
+    }
+
+    public T[] readFieldTerminated(String logicalName, DataReader<T> dataReader, T termination, WithReaderArgs... readerArgs) throws ParseException {
+        return null;
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderChecksum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderChecksum.java
index 10a8dad..ce17bec 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderChecksum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderChecksum.java
@@ -30,6 +30,10 @@ public class FieldReaderChecksum<T> implements FieldReader<T> {
 
     @Override
     public T readField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
+        throw new IllegalStateException("not possible with checksum field");
+    }
+
+    public T readField(String logicalName, DataReader<T> dataReader, T referenceValue, WithReaderArgs... readerArgs) throws ParseException {
         return switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderConst.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderConst.java
index 136418b..f89a0b0 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderConst.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderConst.java
@@ -38,7 +38,7 @@ public class FieldReaderConst<T> implements FieldReader<T> {
     }
 
     public void readConstField(String logicalName, DataReader<T> dataReader, T expectedValue, WithReaderArgs... readerArgs) throws ParseException {
-        T constValue = dataReader.read(logicalName, readerArgs);
+        T constValue = switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
         if (!Objects.equals(constValue, expectedValue)) {
             throw new ParseException("Actual value " + constValue + " doesn't match expected " + expectedValue);
         }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java
index 5761a6f..2225c30 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java
@@ -30,6 +30,10 @@ public class FieldReaderEnum<T> implements FieldReader<T> {
 
     @Override
     public T readField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
+        throw new IllegalStateException("not possible with checksum field");
+    }
+
+    public T readField(String logicalName, DataReader<T> dataReader, String propertyName, WithReaderArgs... readerArgs) throws ParseException {
         return switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderManual.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderManual.java
index dd22f4b..e355007 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderManual.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderManual.java
@@ -24,12 +24,18 @@ import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.function.Function;
+
 public class FieldReaderManual<T> implements FieldReader<T> {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(FieldReaderManual.class);
 
     @Override
     public T readField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
+        throw new IllegalStateException("not possible with checksum field");
+    }
+
+    public T readField(String logicalName, DataReader<T> dataReader, Function parseFunction, Function serializeFunction, Function lengthFunction, WithReaderArgs... readerArgs) throws ParseException {
         return switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderOptional.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderOptional.java
index e770a92..a02ab1c 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderOptional.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderOptional.java
@@ -42,9 +42,9 @@ public class FieldReaderOptional<T> implements FieldReader<T> {
 
         int curPos = dataReader.getPos();
         try {
-            return dataReader.read(logicalName, readerArgs);
+            return switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
         } catch (ParseAssertException e) {
-            LOGGER.trace("Assertion doesnt match for field {}", logicalName, e);
+            LOGGER.debug("Assertion doesnt match for field {}", logicalName, e);
             dataReader.setPos(curPos);
             return null;
         }