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

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


The following commit(s) were added to refs/heads/feature/implement-df1-driver 
by this push:
     new c8b5e5d  - Added some additional field types:   - "checksum" (throws 
error during parsing, if the checksum is invalid)   - "padding" (allows adding 
additional padding bytes if a condition evaluates to true) - Started 
implementing field types:   - "manual" (Like a simple field, but we have full 
control over the parsing and serialization)   - "manualArray" (Like a array 
field, but we have full control over the parsing and serialization) - Renamed 
some of the field types:   - "field [...]
c8b5e5d is described below

commit c8b5e5d917f8047274590f1cc12971b93881a51b
Author: Christofer Dutz <[email protected]>
AuthorDate: Thu Aug 8 14:00:16 2019 +0200

    - Added some additional field types:
      - "checksum" (throws error during parsing, if the checksum is invalid)
      - "padding" (allows adding additional padding bytes if a condition 
evaluates to true)
    - Started implementing field types:
      - "manual" (Like a simple field, but we have full control over the 
parsing and serialization)
      - "manualArray" (Like a array field, but we have full control over the 
parsing and serialization)
    - Renamed some of the field types:
      - "field" -> "simple"
      - "arrayField" -> "array"
      - "optionalField" -> "optional"
---
 .../main/resources/templates/java/io-template.ftlh |  51 ++++-
 .../resources/templates/java/pojo-template.ftlh    |  30 +++
 .../plugins/codegenerator/language/mspec/MSpec.g4  |  88 +++++----
 .../mspec/model/fields/DefaultChecksumField.java   |  54 ++++++
 .../model/fields/DefaultManualArrayField.java      |  75 ++++++++
 .../mspec/model/fields/DefaultManualField.java     |  62 +++++++
 .../mspec/model/fields/DefaultPaddingField.java    |  62 +++++++
 .../mspec/parser/MessageFormatListener.java        | 147 +++++++++++----
 .../org/apache/plc4x/protocol/df1/Df1Protocol.java |   2 +-
 .../protocols/df1/{protocol.mspec => df1.mspec}    |  18 +-
 .../resources/protocols/knxnetip/knxnetip.mspec    | 206 ++++++++++-----------
 .../org/apache/plc4x/protocol/s7/S7Protocol.java   |   2 +-
 .../protocols/s7/{protocol.mspec => s7.mspec}      | 123 ++++++------
 .../org/apache/plc4x/java/df1/util/DF1Utils.java   | 145 +++++++--------
 .../java/org/apache/plc4x/protocol/df1/IOTest.java |   8 +-
 .../main/resources/protocols/df1/protocol.mspec    | 122 ++++++------
 16 files changed, 791 insertions(+), 404 deletions(-)

diff --git 
a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh 
b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
index 82a8056..e89daa6 100644
--- 
a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
+++ 
b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
@@ -133,6 +133,15 @@ public class ${typeName}IO implements 
MessageIO<${typeName}<#if helper.isDiscrim
             </#if>
         </#if>
         <#break>
+    <#case "checksum">
+
+        // Checksum Field
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = 
io.${helper.getReadMethodName(field.type)}(${field.type.size});
+        ${helper.getLanguageTypeNameForField(field)} _${field.name}Ref = 
(${helper.getLanguageTypeNameForField(field)}) 
(${helper.toDeserializationExpression(field.checksumExpression, 
type.parserArguments)});
+        if(${field.name} != _${field.name}Ref) {
+            throw new ParseException("Checksum verification failed. Expected " 
+ _${field.name}Ref + " but got " + ${field.name});
+        }
+        <#break>
     <#case "const">
 
         // Const Field
@@ -151,6 +160,14 @@ public class ${typeName}IO implements 
MessageIO<${typeName}<#if helper.isDiscrim
         // Implicit Field (Used for parsing, but it's value is not stored as 
it's implicitly given by the objects content)
         ${helper.getLanguageTypeNameForField(field)} ${field.name} = 
io.${helper.getReadMethodName(field.type)}(${field.type.size});
         <#break>
+    <#case "manualArray">
+
+        <#-- TODO: Implement this -->
+        <#break>
+    <#case "manual">
+
+        <#-- TODO: Implement this -->
+        <#break>
     <#case "optional">
 
         // Optional Field (Can be skipped, if a given expression evaluates to 
false)
@@ -159,6 +176,15 @@ public class ${typeName}IO implements 
MessageIO<${typeName}<#if helper.isDiscrim
             ${field.name} = <#if 
helper.isSimpleType(field.type)>io.${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name?uncap_first}IO.parse(io);</#if>;
         }
         <#break>
+    <#case "padding">
+
+        // Padding Field
+        boolean _${field.name}NeedsPadding = (boolean) 
(${helper.toDeserializationExpression(field.paddingCondition, 
type.parserArguments)});
+        if(_${field.name}NeedsPadding) {
+            // Just read the padding data and ignore it
+            io.${helper.getReadBufferReadMethodCall(field.type)};
+        }
+        <#break>
     <#case "reserved">
 
         // Reserved Field (Compartmentalized so the "reserved" variable can't 
leak)
@@ -221,6 +247,12 @@ public class ${typeName}IO implements 
MessageIO<${typeName}<#if helper.isDiscrim
             }
         }
         <#break>
+    <#case "checksum">
+
+        // Checksum Field (Calculated)
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = 
(${helper.getLanguageTypeNameForField(field)}) 
(${helper.toSerializationExpression(field.checksumExpression, 
type.parserArguments)});
+        io.${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name 
+ ")")?no_esc};
+        <#break>
     <#case "const">
 
         // Const Field
@@ -242,6 +274,14 @@ public class ${typeName}IO implements 
MessageIO<${typeName}<#if helper.isDiscrim
         ${helper.getLanguageTypeNameForField(field)} ${field.name} = 
(${helper.getLanguageTypeNameForField(field)}) 
(${helper.toSerializationExpression(field.serializationExpression, 
type.parserArguments)});
         io.${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name 
+ ")")?no_esc};
         <#break>
+    <#case "manualArray">
+
+        <#-- TODO: Implement this -->
+        <#break>
+    <#case "manual">
+
+        <#-- TODO: Implement this -->
+        <#break>
     <#case "optional">
 
         // Optional Field (Can be skipped, if the value is null)
@@ -255,9 +295,18 @@ public class ${typeName}IO implements 
MessageIO<${typeName}<#if helper.isDiscrim
             </#if>
         }
         <#break>
+    <#case "padding">
+
+        // Padding Field
+        boolean _${field.name}NeedsPadding = (boolean) 
(${helper.toSerializationExpression(field.paddingCondition, 
type.parserArguments)});
+        if(_${field.name}NeedsPadding) {
+            ${helper.getLanguageTypeNameForField(field)} 
_${field.name}PaddingValue = (${helper.getLanguageTypeNameForField(field)}) 
(${helper.toSerializationExpression(field.paddingValue, type.parserArguments)});
+            io.${helper.getWriteBufferReadMethodCall(field.type, "(_" + 
field.name + "PaddingValue)")?no_esc};
+        }
+        <#break>
     <#case "reserved">
 
-        // Reserved Field.
+        // Reserved Field
         io.${helper.getWriteBufferReadMethodCall(field.type, 
field.referenceValue)};
         <#break>
     <#case "simple">
diff --git 
a/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
 
b/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
index d8df6ef..31e0cb9 100644
--- 
a/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
+++ 
b/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
@@ -62,6 +62,7 @@ public<#if type.abstract> abstract</#if> class 
${typeName}<#if type.parentType??
     public static final ${helper.getLanguageTypeNameForField(field)} 
${field.name?upper_case} = ${field.referenceValue};
 </#list>
 </#if>
+<#-- Prpoerty fields are fields that require a property in the pojo -->
 <#if type.propertyFields?has_content>
 
     // Properties.
@@ -71,6 +72,7 @@ public<#if type.abstract> abstract</#if> class 
${typeName}<#if type.parentType??
 </#if>
 
     @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
+    <#-- getAllPropertyFields() returns not only the property fields of this 
type but also of it's parents -->
     public ${typeName}(<#list type.getAllPropertyFields() as 
field>@JsonProperty("${field.name}") 
${helper.getLanguageTypeNameForField(field)}<#if field.lengthType??>[]</#if> 
${field.name}<#sep>, </#sep></#list>) {
 <#if type.getParentPropertyFields()?has_content>
         super(<#list type.getParentPropertyFields() as 
field>${field.name}<#sep>, </#sep></#list>);
@@ -114,6 +116,11 @@ public<#if type.abstract> abstract</#if> class 
${typeName}<#if type.parentType??
         }
         </#if>
         <#break>
+    <#case "checksum">
+
+        // Checksum Field (${field.name})
+        lengthInBits += ${field.type.size};
+        <#break>
     <#case "const">
 
         // Const Field (${field.name})
@@ -129,6 +136,22 @@ public<#if type.abstract> abstract</#if> class 
${typeName}<#if type.parentType??
         // Implicit Field (${field.name})
         lengthInBits += ${field.type.size};
         <#break>
+    <#case "manualArray">
+
+        // Manual Array Field (${field.name})
+        <#if helper.isSimpleType(field.type)>
+        lengthInBits += ${field.type.size} * ${field.name}.length;
+        <#else>
+        for(SizeAware element : ${field.name}) {
+            lengthInBits += element.getLengthInBytes() * 8;
+        }
+        </#if>
+        <#break>
+    <#case "manual">
+
+        // Manual Field (${field.name})
+        lengthInBits += ${field.type.size};
+        <#break>
     <#case "optional">
 
         // Optional Field (${field.name})
@@ -136,6 +159,13 @@ public<#if type.abstract> abstract</#if> class 
${typeName}<#if type.parentType??
             lengthInBits += ${field.type.size};
         }
         <#break>
+    <#case "padding">
+
+        // Padding Field (${field.name})
+        if((boolean) 
(${helper.toDeserializationExpression(field.paddingCondition, 
type.parserArguments)})) {
+            lengthInBits += ${field.type.size};
+        }
+        <#break>
     <#case "reserved">
 
         // Reserved Field
diff --git 
a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
 
b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
index 3b50253..e88c327 100644
--- 
a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
+++ 
b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
@@ -28,8 +28,8 @@ complexTypeDefinition
  ;
 
 complexType
- : K_TYPE name=idExpression (LBRACKET params=argumentList RBRACKET)? 
fieldDefinition+
- | K_DISCRIMINATED_TYPE name=idExpression (LBRACKET params=argumentList 
RBRACKET)? fieldDefinition+
+ : 'type' name=idExpression (LBRACKET params=argumentList RBRACKET)? 
fieldDefinition+
+ | 'discriminatedType' name=idExpression (LBRACKET params=argumentList 
RBRACKET)? fieldDefinition+
  ;
 
 
@@ -39,45 +39,65 @@ fieldDefinition
 
 field
  : arrayField
+ | checksumField
  | constField
  | discriminatorField
- | simpleField
  | implicitField
+ | manualArrayField
+ | manualField
  | optionalField
+ | paddingField
  | reservedField
+ | simpleField
  | typeSwitchField
  ;
 
 arrayField
- : K_ARRAY type=typeReference name=idExpression lengthType=arrayType 
lengthExpression=expression
+ : 'array' type=typeReference name=idExpression lengthType=arrayType 
lengthExpression=expression
+ ;
+
+checksumField
+ : 'checksum' type=dataType name=idExpression checksumExpression=expression
  ;
 
 constField
- : K_CONST type=dataType name=idExpression expected=expression
+ : 'const' type=dataType name=idExpression expected=expression
  ;
 
 discriminatorField
- : K_DISCRIMINATOR type=dataType name=idExpression
+ : 'discriminator' type=dataType name=idExpression
  ;
 
-simpleField
- : K_FIELD type=typeReference name=idExpression
+implicitField
+ : 'implicit' type=dataType name=idExpression 
serializationExpression=expression
  ;
 
-implicitField
- : K_IMPLICIT type=dataType name=idExpression 
serializationExpression=expression
+manualArrayField
+ : 'manualArray' type=typeReference name=idExpression lengthType=arrayType 
lengthExpression=expression serializationExpression=expression 
deserializationExpression=expression
+ ;
+
+manualField
+ : 'manual' type=typeReference name=idExpression 
serializationExpression=expression deserializationExpression=expression
  ;
 
 optionalField
- : K_OPTIONAL_FIELD type=typeReference name=idExpression condition=expression
+ : 'optional' type=typeReference name=idExpression condition=expression
+ ;
+
+paddingField
+ : 'padding' type=dataType name=idExpression paddingValue=expression 
paddingCondition=expression
  ;
 
 reservedField
- : K_RESERVED type=dataType expected=expression
+ : 'reserved' type=dataType expected=expression
+ ;
+
+simpleField
+ : 'simple' type=typeReference name=idExpression
  ;
 
 typeSwitchField
- : K_TYPE_SWITCH discriminators=multipleExpressions caseStatement*
+ : 'typeSwitch' discriminators=multipleExpressions caseStatement*
  ;
 
 
@@ -91,11 +111,11 @@ caseStatement
  ;
 
 dataType
- : base=K_BIT
- | base=K_INT size=INTEGER_LITERAL
- | base=K_UINT size=INTEGER_LITERAL
- | base=K_FLOAT size=INTEGER_LITERAL
- | base=K_STRING
+ : base='bit'
+ | base='int' size=INTEGER_LITERAL
+ | base='uint' size=INTEGER_LITERAL
+ | base='float' size=INTEGER_LITERAL
+ | base='string'
  ;
 
 argument
@@ -146,9 +166,9 @@ fragment HexDigit
 ;
 
 arrayType
- : K_COUNT
- | K_LENGTH
- | K_TERMINATED
+ : 'count'
+ | 'length'
+ | 'terminated'
  ;
 
 idExpression
@@ -156,31 +176,6 @@ idExpression
  ;
 
 fragment K_COMMENT : '<--';
-K_ARRAY : 'arrayField';
-K_CONST : 'const';
-K_CONTEXT : 'context';
-K_DISCRIMINATED_TYPE : 'discriminatedType';
-K_DISCRIMINATOR : 'discriminator';
-K_EMBEDDED : 'embedded';
-K_FIELD : 'field';
-K_IMPLICIT : 'implicit';
-K_OPTIONAL_FIELD : 'optionalField';
-K_RESERVED : 'reserved';
-K_TYPE : 'type';
-K_TYPE_SWITCH : 'typeSwitch';
-
-K_COUNT : 'count';
-K_LENGTH : 'length';
-K_TERMINATED : 'terminated';
-
-K_BIT : 'bit';
-K_INT : 'int';
-K_UINT : 'uint';
-K_FLOAT : 'float';
-K_UINT5 : 'uint5';
-K_UINT8 : 'uint8';
-K_UINT16 : 'uint16';
-K_STRING: 'string';
 
 TICK : '\'';
 TIMES : 'x';
@@ -198,6 +193,7 @@ BinaryOperator
  | '<'
  | '>='
  | '<='
+ | '%'
  ;
 
 ZERO : '0';
diff --git 
a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
new file mode 100644
index 0000000..77214fd
--- /dev/null
+++ 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
@@ -0,0 +1,54 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
+
+import org.apache.plc4x.plugins.codegenerator.types.fields.ChecksumField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
+
+public class DefaultChecksumField implements ChecksumField {
+
+    private final TypeReference type;
+    private final String name;
+    private final Term checksumExpression;
+
+    public DefaultChecksumField(TypeReference type, String name, Term 
checksumExpression) {
+        this.type = type;
+        this.name = name;
+        this.checksumExpression = checksumExpression;
+    }
+
+    public TypeReference getType() {
+        return type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Term getChecksumExpression() {
+        return checksumExpression;
+    }
+
+    public Term[] getParams() {
+        return new Term[0];
+    }
+
+}
diff --git 
a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
new file mode 100644
index 0000000..c90bef1
--- /dev/null
+++ 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
@@ -0,0 +1,75 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
+
+import org.apache.plc4x.plugins.codegenerator.types.fields.ManualArrayField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
+
+public class DefaultManualArrayField implements ManualArrayField {
+
+    private final TypeReference type;
+    private final String name;
+    private final LengthType lengthType;
+    private final Term lengthExpression;
+    private final Term serializationExpression;
+    private final Term deserializationExpression;
+    private final Term[] params;
+
+    public DefaultManualArrayField(TypeReference type, String name, LengthType 
lengthType, Term lengthExpression, Term serializationExpression, Term 
deserializationExpression, Term[] params) {
+        this.type = type;
+        this.name = name;
+        this.lengthType = lengthType;
+        this.lengthExpression = lengthExpression;
+        this.serializationExpression = serializationExpression;
+        this.deserializationExpression = deserializationExpression;
+        this.params = params;
+    }
+
+    public TypeReference getType() {
+        return type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public LengthType getLengthType() {
+        return lengthType;
+    }
+
+    public Term getLengthExpression() {
+        return lengthExpression;
+    }
+
+    public Term getSerializationExpression() {
+        return serializationExpression;
+    }
+
+    public Term getDeserializationExpression() {
+        return deserializationExpression;
+    }
+
+    @Override
+    public Term[] getParams() {
+        return params;
+    }
+
+}
diff --git 
a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
new file mode 100644
index 0000000..fb9276f
--- /dev/null
+++ 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
@@ -0,0 +1,62 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
+
+import org.apache.plc4x.plugins.codegenerator.types.fields.ManualField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
+
+public class DefaultManualField implements ManualField {
+
+    private final TypeReference type;
+    private final String name;
+    private final Term serializationExpression;
+    private final Term deserializationExpression;
+    private final Term[] params;
+
+    public DefaultManualField(TypeReference type, String name, Term 
serializationExpression, Term deserializationExpression, Term[] params) {
+        this.type = type;
+        this.name = name;
+        this.serializationExpression = serializationExpression;
+        this.deserializationExpression = deserializationExpression;
+        this.params = params;
+    }
+
+    public TypeReference getType() {
+        return type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Term getSerializationExpression() {
+        return serializationExpression;
+    }
+
+    public Term getDeserializationExpression() {
+        return deserializationExpression;
+    }
+
+    public Term[] getParams() {
+        return params;
+    }
+
+}
diff --git 
a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
new file mode 100644
index 0000000..43f40e3
--- /dev/null
+++ 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
@@ -0,0 +1,62 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
+
+import org.apache.plc4x.plugins.codegenerator.types.fields.PaddingField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
+
+public class DefaultPaddingField implements PaddingField {
+
+    private final TypeReference type;
+    private final String name;
+    private final Term paddingValue;
+    private final Term paddingCondition;
+    private final Term[] params;
+
+    public DefaultPaddingField(TypeReference type, String name, Term 
paddingValue, Term paddingCondition, Term[] params) {
+        this.type = type;
+        this.name = name;
+        this.paddingValue = paddingValue;
+        this.paddingCondition = paddingCondition;
+        this.params = params;
+    }
+
+    public TypeReference getType() {
+        return type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Term getPaddingValue() {
+        return paddingValue;
+    }
+
+    public Term getPaddingCondition() {
+        return paddingCondition;
+    }
+
+    public Term[] getParams() {
+        return params;
+    }
+
+}
diff --git 
a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index aeec697..4d616e8 100644
--- 
a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ 
b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -33,17 +33,20 @@ import 
org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefin
 import 
org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.fields.ArrayField;
 import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
+import org.apache.plc4x.plugins.codegenerator.types.fields.ManualArrayField;
 import org.apache.plc4x.plugins.codegenerator.types.fields.SwitchField;
 import 
org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.io.InputStream;
+import java.nio.charset.Charset;
 import java.util.*;
 
 public class MessageFormatListener extends MSpecBaseListener {
 
-    private Stack<List<Field>> parserContexts;
+    private Deque<List<Field>> parserContexts;
+
     private Map<String, ComplexTypeDefinition> complexTypes;
 
     public Map<String, ComplexTypeDefinition> getComplexTypes() {
@@ -52,7 +55,7 @@ public class MessageFormatListener extends MSpecBaseListener {
 
     @Override
     public void enterFile(MSpecParser.FileContext ctx) {
-        parserContexts = new Stack<>();
+        parserContexts = new LinkedList<>();
         complexTypes = new HashMap<>();
     }
 
@@ -93,23 +96,26 @@ public class MessageFormatListener extends 
MSpecBaseListener {
     public void enterArrayField(MSpecParser.ArrayFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = ctx.name.id.getText();
-        ArrayField.LengthType lengthType;
-        if(ctx.lengthType.K_COUNT() != null) {
-            lengthType = ArrayField.LengthType.COUNT;
-        } else if(ctx.lengthType.K_LENGTH() != null){
-            lengthType = ArrayField.LengthType.LENGTH;
-        } else if(ctx.lengthType.K_TERMINATED() != null) {
-            lengthType = ArrayField.LengthType.TERMINATED;
-        } else {
-            throw new RuntimeException("Unsupported lenghtType for 
arrayField");
-        }
+        ArrayField.LengthType lengthType = 
ArrayField.LengthType.valueOf(ctx.lengthType.getText().toUpperCase());
         String lengthExpressionString = ctx.lengthExpression.expr.getText();
-        InputStream inputStream = 
IOUtils.toInputStream(lengthExpressionString);
-        ExpressionStringParser parser = new ExpressionStringParser();
-        Term lengthExpression =  parser.parse(inputStream);
+        Term lengthExpression =  getExpressionTerm(lengthExpressionString);
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) 
ctx.parent.parent);
         Field field = new DefaultArrayField(type, name, lengthType, 
lengthExpression, params);
-        parserContexts.peek().add(field);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
+    }
+
+    @Override
+    public void enterChecksumField(MSpecParser.ChecksumFieldContext ctx) {
+        SimpleTypeReference type = getSimpleTypeReference(ctx.type);
+        String name = ctx.name.id.getText();
+        String checksumExpressionString = 
ctx.checksumExpression.expr.getText();
+        Term checksumExpression = getExpressionTerm(checksumExpressionString);
+        Field field = new DefaultChecksumField(type, name, checksumExpression);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
     }
 
     @Override
@@ -118,7 +124,9 @@ public class MessageFormatListener extends 
MSpecBaseListener {
         String name = ctx.name.id.getText();
         String expected = ctx.expected.expr.getText();
         Field field = new DefaultConstField(type, name, expected);
-        parserContexts.peek().add(field);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
     }
 
     @Override
@@ -126,28 +134,55 @@ public class MessageFormatListener extends 
MSpecBaseListener {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         Field field = new DefaultDiscriminatorField(type, name);
-        parserContexts.peek().add(field);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
     }
 
     @Override
-    public void enterSimpleField(MSpecParser.SimpleFieldContext ctx) {
+    public void enterImplicitField(MSpecParser.ImplicitFieldContext ctx) {
+        SimpleTypeReference type = getSimpleTypeReference(ctx.type);
+        String name = ctx.name.id.getText();
+        String serializationExpressionString = 
ctx.serializationExpression.expr.getText();
+        Term serializationExpression = 
getExpressionTerm(serializationExpressionString);
+        Field field = new DefaultImplicitField(type, name, 
serializationExpression);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
+    }
+
+    @Override
+    public void enterManualArrayField(MSpecParser.ManualArrayFieldContext ctx) 
{
         TypeReference type = getTypeReference(ctx.type);
         String name = ctx.name.id.getText();
+        ManualArrayField.LengthType lengthType = 
ManualArrayField.LengthType.valueOf(
+            ctx.lengthType.getText().toUpperCase());
+        String lengthExpressionString = ctx.lengthExpression.expr.getText();
+        Term lengthExpression =  getExpressionTerm(lengthExpressionString);
+        String serializationExpressionString = 
ctx.serializationExpression.expr.getText();
+        Term serializationExpression = 
getExpressionTerm(serializationExpressionString);
+        String deserializationExpressionString = 
ctx.deserializationExpression.expr.getText();
+        Term deserializationExpression = 
getExpressionTerm(deserializationExpressionString);
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) 
ctx.parent.parent);
-        Field field = new DefaultSimpleField(type, name, params);
-        parserContexts.peek().add(field);
+        Field field = new DefaultManualArrayField(type, name, lengthType, 
lengthExpression, serializationExpression, deserializationExpression, params);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
     }
 
     @Override
-    public void enterImplicitField(MSpecParser.ImplicitFieldContext ctx) {
-        SimpleTypeReference type = getSimpleTypeReference(ctx.type);
+    public void enterManualField(MSpecParser.ManualFieldContext ctx) {
+        TypeReference type = getTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         String serializationExpressionString = 
ctx.serializationExpression.expr.getText();
-        InputStream inputStream = 
IOUtils.toInputStream(serializationExpressionString);
-        ExpressionStringParser parser = new ExpressionStringParser();
-        Term serializationExpression =  parser.parse(inputStream);
-        Field field = new DefaultImplicitField(type, name, 
serializationExpression);
-        parserContexts.peek().add(field);
+        Term serializationExpression = 
getExpressionTerm(serializationExpressionString);
+        String deserializationExpressionString = 
ctx.deserializationExpression.expr.getText();
+        Term deserializationExpression = 
getExpressionTerm(deserializationExpressionString);
+        Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) 
ctx.parent.parent);
+        Field field = new DefaultManualField(type, name, 
serializationExpression, deserializationExpression, params);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
     }
 
     @Override
@@ -155,12 +190,27 @@ public class MessageFormatListener extends 
MSpecBaseListener {
         TypeReference type = getTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         String conditionExpressionString = ctx.condition.expr.getText();
-        InputStream inputStream = 
IOUtils.toInputStream(conditionExpressionString);
-        ExpressionStringParser parser = new ExpressionStringParser();
-        Term conditionExpression =  parser.parse(inputStream);
+        Term conditionExpression = 
getExpressionTerm(conditionExpressionString);
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) 
ctx.parent.parent);
         Field field = new DefaultOptionalField(type, name, 
conditionExpression, params);
-        parserContexts.peek().add(field);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
+    }
+
+    @Override
+    public void enterPaddingField(MSpecParser.PaddingFieldContext ctx) {
+        SimpleTypeReference type = getSimpleTypeReference(ctx.type);
+        String name = ctx.name.id.getText();
+        String paddingValueString = ctx.paddingValue.expr.getText();
+        Term paddingValue = getExpressionTerm(paddingValueString);
+        String paddingConditionString = ctx.paddingCondition.expr.getText();
+        Term paddingCondition = getExpressionTerm(paddingConditionString);
+        Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) 
ctx.parent.parent);
+        Field field = new DefaultPaddingField(type, name, paddingValue, 
paddingCondition, params);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
     }
 
     @Override
@@ -168,7 +218,20 @@ public class MessageFormatListener extends 
MSpecBaseListener {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String expected = ctx.expected.expr.getText();
         Field field = new DefaultReservedField(type, expected);
-        parserContexts.peek().add(field);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
+    }
+
+    @Override
+    public void enterSimpleField(MSpecParser.SimpleFieldContext ctx) {
+        TypeReference type = getTypeReference(ctx.type);
+        String name = ctx.name.id.getText();
+        Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) 
ctx.parent.parent);
+        Field field = new DefaultSimpleField(type, name, params);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
     }
 
     @Override
@@ -178,8 +241,10 @@ public class MessageFormatListener extends 
MSpecBaseListener {
         for(int i = 0; i < numDiscriminators; i++) {
             discriminatorNames[i] = 
ctx.discriminators.expression().get(i).expr.getText();
         }
-        DefaultSwitchField switchField = new 
DefaultSwitchField(discriminatorNames);
-        parserContexts.peek().add(switchField);
+        DefaultSwitchField field = new DefaultSwitchField(discriminatorNames);
+        if(parserContexts.peek() != null) {
+            parserContexts.peek().add(field);
+        }
     }
 
     @Override
@@ -222,11 +287,11 @@ public class MessageFormatListener extends 
MSpecBaseListener {
         complexTypes.put(typeName, type);
     }
 
-    /*@Override
-    public void exitExpression(MSpecParser.ExpressionContext ctx) {
-        MSpecParser.InnerExpressionContext expressionContext = 
ctx.innerExpression();
-        super.exitExpression(ctx);
-    }*/
+    private Term getExpressionTerm(String expressionString) {
+        InputStream inputStream = IOUtils.toInputStream(expressionString, 
Charset.defaultCharset());
+        ExpressionStringParser parser = new ExpressionStringParser();
+        return  parser.parse(inputStream);
+    }
 
     private TypeReference getTypeReference(MSpecParser.TypeReferenceContext 
ctx) {
         if(ctx.simpleTypeReference != null) {
@@ -285,7 +350,7 @@ public class MessageFormatListener extends 
MSpecBaseListener {
     }
 
     private Term parseExpression(String expressionString) {
-        InputStream inputStream = IOUtils.toInputStream(expressionString);
+        InputStream inputStream = IOUtils.toInputStream(expressionString, 
Charset.defaultCharset());
         ExpressionStringParser parser = new ExpressionStringParser();
         return parser.parse(inputStream);
     }
diff --git 
a/protocols/df1/src/main/java/org/apache/plc4x/protocol/df1/Df1Protocol.java 
b/protocols/df1/src/main/java/org/apache/plc4x/protocol/df1/Df1Protocol.java
index aa34abe..7032892 100644
--- a/protocols/df1/src/main/java/org/apache/plc4x/protocol/df1/Df1Protocol.java
+++ b/protocols/df1/src/main/java/org/apache/plc4x/protocol/df1/Df1Protocol.java
@@ -36,7 +36,7 @@ public class Df1Protocol implements Protocol {
 
     @Override
     public Map<String, ComplexTypeDefinition> getTypeDefinitions() throws 
GenerationException {
-        InputStream schemaInputStream = 
Df1Protocol.class.getResourceAsStream("/protocols/df1/protocol.mspec");
+        InputStream schemaInputStream = 
Df1Protocol.class.getResourceAsStream("/protocols/df1/df1.mspec");
         if(schemaInputStream == null) {
             throw new GenerationException("Error loading message-format schema 
for protocol '" + getName() + "'");
         }
diff --git a/protocols/df1/src/main/resources/protocols/df1/protocol.mspec 
b/protocols/df1/src/main/resources/protocols/df1/df1.mspec
similarity index 71%
rename from protocols/df1/src/main/resources/protocols/df1/protocol.mspec
rename to protocols/df1/src/main/resources/protocols/df1/df1.mspec
index 5e997fb..7d927a6 100644
--- a/protocols/df1/src/main/resources/protocols/df1/protocol.mspec
+++ b/protocols/df1/src/main/resources/protocols/df1/df1.mspec
@@ -22,12 +22,12 @@
     [discriminator    uint 8       'symbolType']
     [typeSwitch 'symbolType'
         ['0x02' DF1SymbolMessageFrame
-            [field    uint 8       'destinationAddress']
-            [field    uint 8       'sourceAddress']
-            [field    DF1Command   'command']
+            [simple   uint 8       'destinationAddress']
+            [simple   uint 8       'sourceAddress']
+            [simple   DF1Command   'command']
             [const    uint 8       'messageEnd' '0x10']
             [const    uint 8       'endTransaction' '0x03']
-            [implicit uint 16      'crc' 
'STATIC_CALL("org.apache.plc4x.java.df1.util.DF1Utils.CRCCheck", value)']
+            [checksum uint 16      'crc' 
'STATIC_CALL("org.apache.plc4x.java.df1.util.DF1Utils.crcCheck", 
destinationAddress, sourceAddress, command)']
         ]
         ['0x06' DF1SymbolMessageFrameACK
         ]
@@ -38,15 +38,15 @@
 
 [discriminatedType 'DF1Command'
     [discriminator uint 8  'commandCode']
-    [field    uint 8       'status']
-    [field    uint 16      'transactionCounter']
+    [simple    uint 8       'status']
+    [simple    uint 16      'transactionCounter']
     [typeSwitch 'commandCode'
         ['0x01' DF1UnprotectedReadRequest
-            [field uint 16    'address']
-            [field uint 8     'size']
+            [simple uint 16    'address']
+            [simple uint 8     'size']
         ]
         ['0x41' DF1UnprotectedReadResponse
-            [arrayField uint 8 'data' terminated 
'STATIC_CALL("org.apache.plc4x.java.df1.util.DF1Utils.dataTerminate", io)']
+            [array  uint 8 'data' terminated 
'STATIC_CALL("org.apache.plc4x.java.df1.util.DF1Utils.dataTerminate", io)']
         ]
     ]
 ]
diff --git 
a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec 
b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
index 30ffe2a..23b5f0e 100644
--- a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
+++ b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
@@ -24,62 +24,62 @@
     [implicit      uint 16 'totalLength' 'lengthInBytes']
     [typeSwitch 'msgType'
         ['0x0201' SearchRequest
-            [field HPAIDiscoveryEndpoint 'hpaiIDiscoveryEndpoint']
+            [simple HPAIDiscoveryEndpoint 'hpaiIDiscoveryEndpoint']
         ]
         ['0x0202' SearchResponse
-            [field HPAIControlEndpoint 'hpaiControlEndpoint']
-            [field DIBDeviceInfo       'dibDeviceInfo']
-            [field DIBSuppSvcFamilies  'dibSuppSvcFamilies']
+            [simple HPAIControlEndpoint 'hpaiControlEndpoint']
+            [simple DIBDeviceInfo       'dibDeviceInfo']
+            [simple DIBSuppSvcFamilies  'dibSuppSvcFamilies']
         ]
         ['0x0203' DescriptionRequest
-            [field HPAIControlEndpoint 'hpaiControlEndpoint']
+            [simple HPAIControlEndpoint 'hpaiControlEndpoint']
         ]
         ['0x0204' DescriptionResponse
-            [field DIBDeviceInfo       'dibDeviceInfo']
-            [field DIBSuppSvcFamilies  'dibSuppSvcFamilies']
+            [simple DIBDeviceInfo       'dibDeviceInfo']
+            [simple DIBSuppSvcFamilies  'dibSuppSvcFamilies']
         ]
         ['0x0205' ConnectionRequest
-            [field HPAIDiscoveryEndpoint        'hpaiDiscoveryEndpoint']
-            [field HPAIDataEndpoint             'hpaiDataEndpoint']
-            [field ConnectionRequestInformation 'connectionRequestInformation']
+            [simple HPAIDiscoveryEndpoint        'hpaiDiscoveryEndpoint']
+            [simple HPAIDataEndpoint             'hpaiDataEndpoint']
+            [simple ConnectionRequestInformation 
'connectionRequestInformation']
         ]
         ['0x0206' ConnectionResponse
-            [field uint 8 'communicationChannelId']
-            [field uint 8 'status']
-            [field HPAIDataEndpoint            'hpaiDataEndpoint']
-            [field ConnectionResponseDataBlock 'connectionResponseDataBlock']
+            [simple uint 8 'communicationChannelId']
+            [simple uint 8 'status']
+            [simple HPAIDataEndpoint            'hpaiDataEndpoint']
+            [simple ConnectionResponseDataBlock 'connectionResponseDataBlock']
         ]
         ['0x0207' ConnectionStateRequest
-            [field    uint 8 'communicationChannelId']
+            [simple   uint 8 'communicationChannelId']
             [reserved uint 8 '0x00']
-            [field HPAIControlEndpoint 'hpaiControlEndpoint']
+            [simple   HPAIControlEndpoint 'hpaiControlEndpoint']
         ]
         ['0x0208' ConnectionStateResponse
-            [field uint 8 'communicationChannelId']
-            [field uint 8 'status']
+            [simple uint 8 'communicationChannelId']
+            [simple uint 8 'status']
         ]
         ['0x0209' DisconnectRequest
-            [field    uint 8 'communicationChannelId']
+            [simple   uint 8 'communicationChannelId']
             [reserved uint 8 '0x00']
-            [field HPAIControlEndpoint 'hpaiControlEndpoint']
+            [simple   HPAIControlEndpoint 'hpaiControlEndpoint']
         ]
         ['0x020A' DisconnectResponse
-            [field uint 8 'communicationChannelId']
-            [field uint 8 'status']
+            [simple uint 8 'communicationChannelId']
+            [simple uint 8 'status']
         ]
         ['0x0310' DeviceConfigurationRequest [uint 16 'totalLength']
-            [field DeviceConfigurationRequestDataBlock 
'deviceConfigurationRequestDataBlock']
-            [field CEMI                                'cemi' ['totalLength - 
(6 + deviceConfigurationRequestDataBlock.lengthInBytes)']]
+            [simple DeviceConfigurationRequestDataBlock 
'deviceConfigurationRequestDataBlock']
+            [simple CEMI                                'cemi' ['totalLength - 
(6 + deviceConfigurationRequestDataBlock.lengthInBytes)']]
         ]
         ['0x0311' DeviceConfigurationAck
-            [field DeviceConfigurationAckDataBlock 
'deviceConfigurationAckDataBlock']
+            [simple DeviceConfigurationAckDataBlock 
'deviceConfigurationAckDataBlock']
         ]
         ['0x0420' TunnelingRequest [uint 16 'totalLength']
-            [field TunnelingRequestDataBlock 'tunnelingRequestDataBlock']
-            [field CEMI                      'cemi' ['totalLength - (6 + 
tunnelingRequestDataBlock.lengthInBytes)']]
+            [simple TunnelingRequestDataBlock 'tunnelingRequestDataBlock']
+            [simple CEMI                      'cemi' ['totalLength - (6 + 
tunnelingRequestDataBlock.lengthInBytes)']]
         ]
         ['0x0421' TunnelingResponse
-            [field TunnelingResponseDataBlock 'tunnelingResponseDataBlock']
+            [simple TunnelingResponseDataBlock 'tunnelingResponseDataBlock']
         ]
         ['0x0530' RoutingIndication
         ]
@@ -88,42 +88,42 @@
 
 [type 'HPAIDiscoveryEndpoint'
     [implicit uint 8    'structureLength' 'lengthInBytes']
-    [field    uint 8    'hostProtocolCode']
-    [field    IPAddress 'ipAddress']
-    [field    uint 16   'ipPort']
+    [simple   uint 8    'hostProtocolCode']
+    [simple   IPAddress 'ipAddress']
+    [simple   uint 16   'ipPort']
 ]
 
 [type 'HPAIControlEndpoint'
     [implicit uint 8    'structureLength' 'lengthInBytes']
-    [field    uint 8    'hostProtocolCode']
-    [field    IPAddress 'ipAddress']
-    [field    uint 16   'ipPort']
+    [simple   uint 8    'hostProtocolCode']
+    [simple   IPAddress 'ipAddress']
+    [simple   uint 16   'ipPort']
 ]
 
 [type 'DIBDeviceInfo'
-    [implicit   uint 8       'structureLength' 'lengthInBytes']
-    [field      uint 8       'descriptionType']
-    [field      uint 8       'knxMedium']
-    [field      DeviceStatus 'deviceStatus']
-    [field      KNXAddress   'knxAddress']
-    [field      ProjectInstallationIdentifier 'projectInstallationIdentifier']
-    [arrayField uint 8       'knxNetIpDeviceSerialNumber' count '6']
-    [field      IPAddress    'knxNetIpDeviceMulticastAddress']
-    [field      MACAddress   'knxNetIpDeviceMacAddress']
-    [arrayField uint 8       'deviceFriendlyName'         count '30']
+    [implicit uint 8       'structureLength' 'lengthInBytes']
+    [simple   uint 8       'descriptionType']
+    [simple   uint 8       'knxMedium']
+    [simple   DeviceStatus 'deviceStatus']
+    [simple   KNXAddress   'knxAddress']
+    [simple   ProjectInstallationIdentifier 'projectInstallationIdentifier']
+    [array    uint 8       'knxNetIpDeviceSerialNumber' count '6']
+    [simple   IPAddress    'knxNetIpDeviceMulticastAddress']
+    [simple   MACAddress   'knxNetIpDeviceMacAddress']
+    [array    uint 8       'deviceFriendlyName'         count '30']
 ]
 
 [type 'DIBSuppSvcFamilies'
-    [implicit   uint 8       'structureLength' 'lengthInBytes']
-    [field      uint 8       'descriptionType']
-    [arrayField ServiceId    'serviceIds' count '3']
+    [implicit uint 8       'structureLength' 'lengthInBytes']
+    [simple   uint 8       'descriptionType']
+    [array    ServiceId    'serviceIds' count '3']
 ]
 
 [type 'HPAIDataEndpoint'
     [implicit uint 8    'structureLength' 'lengthInBytes']
-    [field    uint 8    'hostProtocolCode']
-    [field    IPAddress 'ipAddress']
-    [field    uint 16   'ipPort']
+    [simple   uint 8    'hostProtocolCode']
+    [simple   IPAddress 'ipAddress']
+    [simple   uint 16   'ipPort']
 ]
 
 [discriminatedType 'ConnectionRequestInformation'
@@ -133,7 +133,7 @@
         ['0x03' ConnectionRequestInformationDeviceManagement
         ]
         ['0x04' ConnectionRequestInformationTunnelConnection
-            [field    uint 8    'knxLayer']
+            [simple   uint 8    'knxLayer']
             [reserved uint 8    '0x00']
         ]
     ]
@@ -146,74 +146,74 @@
         ['0x03' ConnectionResponseDataBlockDeviceManagement
         ]
         ['0x04' ConnectionResponseDataBlockTunnelConnection
-            [field         KNXAddress 'knxAddress']
+            [simple KNXAddress 'knxAddress']
         ]
     ]
 ]
 
 [type 'DeviceConfigurationRequestDataBlock'
     [implicit uint 8 'structureLength' 'lengthInBytes']
-    [field    uint 8 'communicationChannelId']
-    [field    uint 8 'sequenceCounter']
+    [simple   uint 8 'communicationChannelId']
+    [simple   uint 8 'sequenceCounter']
     [reserved uint 8 '0x00']
 ]
 
 [type 'DeviceConfigurationAckDataBlock'
     [implicit uint 8 'structureLength' 'lengthInBytes']
-    [field    uint 8 'communicationChannelId']
-    [field    uint 8 'sequenceCounter']
-    [field    uint 8 'status']
+    [simple   uint 8 'communicationChannelId']
+    [simple   uint 8 'sequenceCounter']
+    [simple   uint 8 'status']
 ]
 
 [type 'TunnelingRequestDataBlock'
     [implicit uint 8 'structureLength' 'lengthInBytes']
-    [field    uint 8 'communicationChannelId']
-    [field    uint 8 'sequenceCounter']
+    [simple   uint 8 'communicationChannelId']
+    [simple   uint 8 'sequenceCounter']
     [reserved uint 8 '0x00']
 ]
 
 [type 'TunnelingResponseDataBlock'
     [implicit uint 8 'structureLength' 'lengthInBytes']
-    [field    uint 8 'communicationChannelId']
-    [field    uint 8 'sequenceCounter']
-    [field    uint 8 'status']
+    [simple   uint 8 'communicationChannelId']
+    [simple   uint 8 'sequenceCounter']
+    [simple   uint 8 'status']
 ]
 
 [type 'IPAddress'
-    [arrayField uint 8 'addr' count '4']
+    [array uint 8 'addr' count '4']
 ]
 
 [type 'MACAddress'
-    [arrayField uint 8 'addr' count '6']
+    [array uint 8 'addr' count '6']
 ]
 
 [type 'KNXAddress'
-    [field uint 4 'mainGroup']
-    [field uint 4 'middleGroup']
-    [field uint 8 'subGroup']
+    [simple uint 4 'mainGroup']
+    [simple uint 4 'middleGroup']
+    [simple uint 8 'subGroup']
 ]
 
 [type 'DeviceStatus'
     [reserved uint 7 '0x00']
-    [field    bit    'programMode']
+    [simple   bit    'programMode']
 ]
 
 [type 'ProjectInstallationIdentifier'
-    [field uint 8 'projectNumber']
-    [field uint 8 'installationNumber']
+    [simple uint 8 'projectNumber']
+    [simple uint 8 'installationNumber']
 ]
 
 [discriminatedType 'ServiceId'
     [discriminator uint 8 'serviceType']
     [typeSwitch 'serviceType'
         ['0x02' KnxNetIpCore
-            [field uint 8 'version']
+            [simple uint 8 'version']
         ]
         ['0x03' KnxNetIpDeviceManagement
-            [field uint 8 'version']
+            [simple uint 8 'version']
         ]
         ['0x04' KnxNetIpTunneling
-            [field uint 8 'version']
+            [simple uint 8 'version']
         ]
     ]
 ]
@@ -233,9 +233,9 @@
         ['0x29' CEMILDataInd
         ]
         ['0x2B' CEMILBusmonInd
-            [field      uint 8                    
'additionalInformationLength']
-            [arrayField CEMIAdditionalInformation 'additionalInformation' 
length 'additionalInformationLength']
-            [arrayField uint 8                    'rawFrame'              
count  'size - (additionalInformationLength + 2)']
+            [simple uint 8                    'additionalInformationLength']
+            [array  CEMIAdditionalInformation 'additionalInformation' length 
'additionalInformationLength']
+            [array  uint 8                    'rawFrame'              count  
'size - (additionalInformationLength + 2)']
         ]
         ['0x2D' CEMILRawInd
         ]
@@ -245,18 +245,18 @@
         ]
 
         ['0xFC' CEMIMPropReadReq
-            [field uint 16 'interfaceObjectType']
-            [field uint  8 'objectInstance']
-            [field uint  8 'propertyId']
-            [field uint  4 'numberOfElements']
-            [field uint 12 'startIndex']
+            [simple uint 16 'interfaceObjectType']
+            [simple uint  8 'objectInstance']
+            [simple uint  8 'propertyId']
+            [simple uint  4 'numberOfElements']
+            [simple uint 12 'startIndex']
         ]
         ['0xFB' CEMIMPropReadCon
-            [field uint 16 'interfaceObjectType']
-            [field uint  8 'objectInstance']
-            [field uint  8 'propertyId']
-            [field uint  4 'numberOfElements']
-            [field uint 12 'startIndex']
+            [simple uint 16 'interfaceObjectType']
+            [simple uint  8 'objectInstance']
+            [simple uint  8 'propertyId']
+            [simple uint  4 'numberOfElements']
+            [simple uint 12 'startIndex']
         ]
     ]
 ]
@@ -266,36 +266,36 @@
     [typeSwitch 'additionalInformationType'
         ['0x03' CEMIAdditionalInformationBusmonitorInfo
             [implicit uint 8 'len' '1']
-            [field    bit    'frameErrorFlag']
-            [field    bit    'bitErrorFlag']
-            [field    bit    'parityErrorFlag']
-            [field    bit    'unknownFlag']
-            [field    bit    'lostFlag']
-            [field    uint 3 'sequenceNumber']
+            [simple    bit    'frameErrorFlag']
+            [simple    bit    'bitErrorFlag']
+            [simple    bit    'parityErrorFlag']
+            [simple    bit    'unknownFlag']
+            [simple    bit    'lostFlag']
+            [simple    uint 3 'sequenceNumber']
         ]
         ['0x04' CEMIAdditionalInformationRelativeTimestamp
             [implicit uint 8  'len' '2']
-            [field RelativeTimestamp 'relativeTimestamp']
+            [simple   RelativeTimestamp 'relativeTimestamp']
         ]
     ]
 ]
 
 [type 'CEMIControlField1'
-    [field    bit    'standardFrame']
+    [simple   bit    'standardFrame']
     [reserved uint 1 '0x00']
-    [field    bit    'doNotRepeat']
-    [field    bit    'broadcast']
-    [field    uint 2 'priority']
-    [field    bit    'ackRequested']
-    [field    bit    'error']
+    [simple   bit    'doNotRepeat']
+    [simple   bit    'broadcast']
+    [simple   uint 2 'priority']
+    [simple   bit    'ackRequested']
+    [simple   bit    'error']
 ]
 
 [type 'CEMIControlField2'
-    [field    bit    'groupAddress']
-    [field    uint 3 'hopCount']
-    [field    uint 3 'extendedFrameFormat']
+    [simple   bit    'groupAddress']
+    [simple   uint 3 'hopCount']
+    [simple   uint 3 'extendedFrameFormat']
 ]
 
 [type 'RelativeTimestamp'
-    [field    uint 16 'timestamp']
+    [simple   uint 16 'timestamp']
 ]
diff --git 
a/protocols/s7/src/main/java/org/apache/plc4x/protocol/s7/S7Protocol.java 
b/protocols/s7/src/main/java/org/apache/plc4x/protocol/s7/S7Protocol.java
index c8d576c..8bab5a8 100644
--- a/protocols/s7/src/main/java/org/apache/plc4x/protocol/s7/S7Protocol.java
+++ b/protocols/s7/src/main/java/org/apache/plc4x/protocol/s7/S7Protocol.java
@@ -36,7 +36,7 @@ public class S7Protocol implements Protocol {
 
     @Override
     public Map<String, ComplexTypeDefinition> getTypeDefinitions() throws 
GenerationException {
-        InputStream schemaInputStream = 
S7Protocol.class.getResourceAsStream("/protocols/s7/protocol.mspec");
+        InputStream schemaInputStream = 
S7Protocol.class.getResourceAsStream("/protocols/s7/s7.mspec");
         if(schemaInputStream == null) {
             throw new GenerationException("Error loading message-format schema 
for protocol '" + getName() + "'");
         }
diff --git a/protocols/s7/src/main/resources/protocols/s7/protocol.mspec 
b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
similarity index 58%
rename from protocols/s7/src/main/resources/protocols/s7/protocol.mspec
rename to protocols/s7/src/main/resources/protocols/s7/s7.mspec
index 55b3679..be9e6f4 100644
--- a/protocols/s7/src/main/resources/protocols/s7/protocol.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -25,7 +25,7 @@
     [const    uint 8     'protocolId' '0x03']
     [reserved uint 8     '0x00']
     [implicit uint 16    'len'        'payload.lengthInBytes + 4']
-    [field    COTPPacket 'payload']
+    [simple   COTPPacket 'payload']
 ]
 
 ////////////////////////////////////////////////////////////////
@@ -37,54 +37,54 @@
     [discriminator uint 8 'tpduCode']
     [typeSwitch 'tpduCode'
         ['0xF0' COTPPacketData
-            [field bit    'eot']
-            [field uint 7 'tpduRef']
+            [simple bit    'eot']
+            [simple uint 7 'tpduRef']
         ]
         ['0xE0' COTPPacketConnectionRequest
-            [field uint 16 'destinationReference']
-            [field uint 16 'sourceReference']
-            [field uint 8  'protocolClass']
+            [simple uint 16 'destinationReference']
+            [simple uint 16 'sourceReference']
+            [simple uint 8  'protocolClass']
         ]
         ['0xD0' COTPPacketConnectionResponse
-            [field uint 16 'destinationReference']
-            [field uint 16 'sourceReference']
-            [field uint 8  'protocolClass']
+            [simple uint 16 'destinationReference']
+            [simple uint 16 'sourceReference']
+            [simple uint 8  'protocolClass']
         ]
         ['0x80' COTPPacketDisconnectRequest
-            [field uint 16 'destinationReference']
-            [field uint 16 'sourceReference']
-            [field uint 8  'protocolClass']
+            [simple uint 16 'destinationReference']
+            [simple uint 16 'sourceReference']
+            [simple uint 8  'protocolClass']
         ]
         ['0xC0' COTPPacketDisconnectResponse
-            [field uint 16 'destinationReference']
-            [field uint 16 'sourceReference']
+            [simple uint 16 'destinationReference']
+            [simple uint 16 'sourceReference']
         ]
         ['0x70' COTPPacketTpduError
-            [field uint 16 'destinationReference']
-            [field uint 8  'rejectCause']
+            [simple uint 16 'destinationReference']
+            [simple uint 8  'rejectCause']
         ]
     ]
-    [arrayField COTPParameter 'parameters' length '(headerLength + 1) - 
curPos' ['(headerLength + 1) - curPos']]
-    [field      S7Message     'payload']
+    [array  COTPParameter 'parameters' length '(headerLength + 1) - curPos' 
['(headerLength + 1) - curPos']]
+    [simple S7Message     'payload']
 ]
 
 [discriminatedType 'COTPParameter' [uint 8 'rest']
     [discriminator uint 8 'parameterType']
     [typeSwitch 'parameterType'
         ['0xC0' COTPParameterTpduSize
-            [field uint 8 'tpduSize']
+            [simple uint 8 'tpduSize']
         ]
         ['0xC1' COTPParameterCallingTsap
-            [field uint 16 'tsapId']
+            [simple uint 16 'tsapId']
         ]
         ['0xC2' COTPParameterCalledTsap
-            [field uint 16 'tsapId']
+            [simple uint 16 'tsapId']
         ]
         ['0xC3' COTPParameterChecksum
-            [field uint 8 'checksum']
+            [simple uint 8 'crc']
         ]
         ['0xE0' COTPParameterDisconnectAdditionalInformation
-            [arrayField uint 8 'data' count 'rest']
+            [array  uint 8 'data' count 'rest']
         ]
     ]
 ]
@@ -97,21 +97,21 @@
     [const         uint 8  'protocolId'      '0x32']
     [discriminator uint 8  'messageType']
     [reserved      uint 16 '0x0000']
-    [field         uint 16 'tpduReference']
+    [simple        uint 16 'tpduReference']
     [implicit      uint 16 'parameterLength' 'parameter.lengthInBytes']
     [implicit      uint 16 'payloadLength'   'payload.lengthInBytes']
     [typeSwitch 'messageType'
         ['0x01' S7MessageRequest
         ]
         ['0x03' S7MessageResponse
-            [field uint 8 'errorClass']
-            [field uint 8 'errorCode']
+            [simple uint 8 'errorClass']
+            [simple uint 8 'errorCode']
         ]
         ['0x07' S7MessageUserData
         ]
     ]
-    [field S7Parameter 'parameter' ['messageType']]
-    [field S7Payload   'payload'   ['messageType', 'parameter']]
+    [simple S7Parameter 'parameter' ['messageType']]
+    [simple S7Payload   'payload'   ['messageType', 'parameter']]
 ]
 
 ////////////////////////////////////////////////////////////////
@@ -122,27 +122,27 @@
     [typeSwitch 'parameterType','messageType'
         ['0xF0' S7ParameterSetupCommunication
             [reserved uint 8  '0x00']
-            [field    uint 16 'maxAmqCaller']
-            [field    uint 16 'maxAmqCallee']
-            [field    uint 16 'pduLength']
+            [simple   uint 16 'maxAmqCaller']
+            [simple   uint 16 'maxAmqCallee']
+            [simple   uint 16 'pduLength']
         ]
         ['0x04','0x01' S7ParameterReadVarRequest
-            [implicit   uint 8                    'numItems' 'COUNT(items)']
-            [arrayField S7VarRequestParameterItem 'items'    count 'numItems']
+            [implicit uint 8                    'numItems' 'COUNT(items)']
+            [array    S7VarRequestParameterItem 'items'    count 'numItems']
         ]
         ['0x04','0x03' S7ParameterReadVarResponse
-            [field uint 8 'numItems']
+            [simple uint 8 'numItems']
         ]
         ['0x05','0x01' S7ParameterWriteVarRequest
-            [implicit   uint 8                    'numItems' 'COUNT(items)']
-            [arrayField S7VarRequestParameterItem 'items'    count 'numItems']
+            [implicit uint 8                    'numItems' 'COUNT(items)']
+            [array    S7VarRequestParameterItem 'items'    count 'numItems']
         ]
         ['0x05','0x03' S7ParameterWriteVarResponse
-            [field uint 8 'numItems']
+            [simple uint 8 'numItems']
         ]
         ['0x00','0x07' S7ParameterUserData
-            [implicit   uint 8       'numItems' 'COUNT(items)']
-            [arrayField UserDataItem 'items' count 'numItems']
+            [implicit uint 8       'numItems' 'COUNT(items)']
+            [array    UserDataItem 'items' count 'numItems']
         ]
     ]
 ]
@@ -152,7 +152,7 @@
     [typeSwitch 'parameterItemType'
         ['0x12' S7VarRequestParameterItemAddress
             [implicit uint 8    'addressLength' 'address.lengthInBytes']
-            [field    S7Address 'address']
+            [simple   S7Address 'address']
         ]
     ]
 ]
@@ -161,13 +161,13 @@
     [discriminator uint 8 'addressType']
     [typeSwitch 'addressType'
         ['0x10' S7AddressAny
-            [field    uint 8  'transportSize']
-            [field    uint 16 'numberOfElements']
-            [field    uint 16 'dbNumber']
-            [field    uint 8  'area']
+            [simple   uint 8  'transportSize']
+            [simple   uint 16 'numberOfElements']
+            [simple   uint 16 'dbNumber']
+            [simple   uint 8  'area']
             [reserved uint 5  '0x00']
-            [field    uint 16 'byteAddress']
-            [field    uint 3  'bitAddress']
+            [simple   uint 16 'byteAddress']
+            [simple   uint 3  'bitAddress']
         ]
     ]
 ]
@@ -177,13 +177,13 @@
     [discriminator uint 8 'itemType']
     [typeSwitch 'itemType'
         ['0x12' UserDataItemCPUFunctions
-            [implicit      uint 8  'parameterLength' 'lengthInBytes']
-            [field         uint 16 'cpuFunctionType']
-            [field         uint 8  'subFunctionGroup']
-            [field         uint 8  'sequenceNumber']
-            [optionalField uint 8  'dataUnitReferenceNumber' 'parameterLength 
== 8']
-            [optionalField uint 8  'lastDataUnit' 'parameterLength == 8']
-            [optionalField uint 8  'errorCode' 'parameterLength == 8']
+            [implicit uint 8  'parameterLength' 'lengthInBytes']
+            [simple   uint 16 'cpuFunctionType']
+            [simple   uint 8  'subFunctionGroup']
+            [simple   uint 8  'sequenceNumber']
+            [optional uint 8  'dataUnitReferenceNumber' 'parameterLength == 8']
+            [optional uint 8  'lastDataUnit' 'parameterLength == 8']
+            [optional uint 8  'errorCode' 'parameterLength == 8']
         ]
     ]
 ]
@@ -196,13 +196,13 @@
         ['0xF0' S7PayloadSetupCommunication]
         ['0x04','0x01' S7PayloadReadVarRequest]
         ['0x04','0x03' S7PayloadReadVarResponse
-            [arrayField S7VarPayloadDataItem 'items' count 'CAST(parameter, 
S7ParameterReadVarResponse).numItems']
+            [array S7VarPayloadDataItem 'items' count 'CAST(parameter, 
S7ParameterReadVarResponse).numItems']
         ]
         ['0x05','0x01' S7PayloadWriteVarRequest
-            [arrayField S7VarPayloadDataItem 'items' count 
'COUNT(CAST(parameter, S7ParameterWriteVarRequest).items)']
+            [array S7VarPayloadDataItem 'items' count 'COUNT(CAST(parameter, 
S7ParameterWriteVarRequest).items)']
         ]
         ['0x05','0x03' S7PayloadWriteVarResponse
-            [arrayField S7VarPayloadStatusItem 'items' count 'CAST(parameter, 
S7ParameterWriteVarResponse).numItems']
+            [array S7VarPayloadStatusItem 'items' count 'CAST(parameter, 
S7ParameterWriteVarResponse).numItems']
         ]
         ['0x00','0x07' S7PayloadUserData
         ]
@@ -210,12 +210,13 @@
 ]
 
 [type 'S7VarPayloadDataItem'
-    [field      uint 8  'returnCode']
-    [field      uint 8  'transportSize']
-    [field      uint 16 'dataLength']
-    [arrayField uint 8  'data' count 'dataLength']
+    [simple  uint 8  'returnCode']
+    [simple  uint 8  'transportSize']
+    [simple  uint 16 'dataLength']
+    [array   uint 8  'data' count 'dataLength']
+    [padding uint 8  'pad' '0x00' 'dataLength % 2 == 1']
 ]
 
 [type 'S7VarPayloadStatusItem'
-    [field uint 8 'returnCode']
+    [simple uint 8 'returnCode']
 ]
\ No newline at end of file
diff --git 
a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/util/DF1Utils.java
 
b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/util/DF1Utils.java
index 1d36d65..6d87c77 100644
--- 
a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/util/DF1Utils.java
+++ 
b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/util/DF1Utils.java
@@ -18,97 +18,90 @@
  */
 package org.apache.plc4x.java.df1.util;
 
-import org.apache.plc4x.java.df1.DF1Symbol;
-import org.apache.plc4x.java.df1.DF1SymbolMessageFrame;
-import org.apache.plc4x.java.df1.DF1UnprotectedReadRequest;
-import org.apache.plc4x.java.df1.DF1UnprotectedReadResponse;
+import org.apache.plc4x.java.df1.*;
 import org.apache.plc4x.java.utils.ParseException;
 import org.apache.plc4x.java.utils.ReadBuffer;
 import org.apache.plc4x.java.utils.WriteBuffer;
 
 public class DF1Utils {
 
-    public static short CRCCheck(Object... args) {
-        DF1Symbol symbol = (DF1Symbol) args[0];
-        if(symbol instanceof DF1SymbolMessageFrame) {
-            DF1SymbolMessageFrame messageFrame = (DF1SymbolMessageFrame) 
symbol;
+    public static short crcCheck(Object... args) {
+        short destinationAddress = (short) args[0];
+        short sourceAddress = (short) args[1];
+        DF1Command command = (DF1Command) args[2];
+        short commandDiscriminatorValues = (short) 
command.getDiscriminatorValues()[0];
+        short status = command.getStatus();
+        int transactionCounter = command.getTransactionCounter();
+        if(command instanceof DF1UnprotectedReadRequest) {
+            try {
+                DF1UnprotectedReadRequest unprotectedReadRequest = 
(DF1UnprotectedReadRequest) command;
+                WriteBuffer writeBuffer = new WriteBuffer(10, false);
+                writeBuffer.writeUnsignedShort(8, destinationAddress);
+                writeBuffer.writeUnsignedShort(8, sourceAddress);
+                writeBuffer.writeUnsignedShort(8, commandDiscriminatorValues);
+                writeBuffer.writeUnsignedShort(8, status);
+                writeBuffer.writeUnsignedInt(16, (short) transactionCounter);
+                writeBuffer.writeUnsignedInt(16, (short) 
unprotectedReadRequest.getAddress());
+                writeBuffer.writeUnsignedShort(8, (byte) 
unprotectedReadRequest.getSize());
+                writeBuffer.writeUnsignedShort(8, (byte) 0x03);
 
-            short destinationAddress = messageFrame.getDestinationAddress();
-            short sourceAddress = messageFrame.getSourceAddress();
-            short commandDiscriminatorValues = (short) 
messageFrame.getCommand().getDiscriminatorValues()[0];
-            short status = messageFrame.getCommand().getStatus();
-            int   counter = messageFrame.getCommand().getTransactionCounter();
-            if(messageFrame.getCommand() instanceof DF1UnprotectedReadRequest) 
{
-                DF1UnprotectedReadRequest unprotectedReadRequestCommand = 
(DF1UnprotectedReadRequest) messageFrame.getCommand();
-                try {
-                    WriteBuffer writeBuffer = new WriteBuffer(10, false);
-                    writeBuffer.writeUnsignedShort(8, destinationAddress);
-                    writeBuffer.writeUnsignedShort(8, sourceAddress);
-                    writeBuffer.writeUnsignedShort(8, 
commandDiscriminatorValues);
-                    writeBuffer.writeUnsignedShort(8, status);
-                    writeBuffer.writeUnsignedInt(16, (short) counter);
-                    writeBuffer.writeUnsignedInt(16, (short) 
unprotectedReadRequestCommand.getAddress());
-                    writeBuffer.writeUnsignedShort(8, (byte) 
unprotectedReadRequestCommand.getSize());
-                    writeBuffer.writeUnsignedShort(8, (byte) 0x03);
+                byte[] data = writeBuffer.getData();
 
-                    byte[] data = writeBuffer.getData();
+                int tmp = 0;
+                int crcL, crcR;
 
-                    int tmp = 0;
-                    int crcL, crcR;
-
-                    for (int newByte : data) {
-                        crcL = tmp >> 8;
-                        crcR = tmp & 0xFF;
-                        tmp = (crcL << 8) + (newByte ^ crcR);
-                        for (int j=0; j<8; j++)
-                            if (tmp % 2 == 1) {     // check if LSB shifted 
out is 1 or 0
-                                tmp = tmp >> 1;
-                                tmp = tmp ^ 0xA001;
-                            } else {
-                                tmp = tmp >> 1;
-                            }
-                    }
-
-                    return (short) tmp;
-                } catch (ParseException e) {
-                    throw new RuntimeException("Something wen't wrong during 
the CRC check", e);
+                for (int newByte : data) {
+                    crcL = tmp >> 8;
+                    crcR = tmp & 0xFF;
+                    tmp = (crcL << 8) + (newByte ^ crcR);
+                    for (int j=0; j<8; j++)
+                        if (tmp % 2 == 1) {     // check if LSB shifted out is 
1 or 0
+                            tmp = tmp >> 1;
+                            tmp = tmp ^ 0xA001;
+                        } else {
+                            tmp = tmp >> 1;
+                        }
                 }
-            } else if(messageFrame.getCommand() instanceof 
DF1UnprotectedReadResponse) {
-                DF1UnprotectedReadResponse unprotectedReadResponseCommand = 
(DF1UnprotectedReadResponse) messageFrame.getCommand();
-                try {
-                    WriteBuffer writeBuffer = new WriteBuffer(10, false);
-                    writeBuffer.writeUnsignedShort(8, destinationAddress);
-                    writeBuffer.writeUnsignedShort(8, sourceAddress);
-                    writeBuffer.writeUnsignedShort(8, 
commandDiscriminatorValues);
-                    writeBuffer.writeUnsignedShort(8, status);
-                    writeBuffer.writeUnsignedInt(16, (short) counter);
-                    for (short data : 
unprotectedReadResponseCommand.getData()) {
-                        writeBuffer.writeUnsignedShort(8,  data);
-                    }
-                    writeBuffer.writeUnsignedShort(8, (byte) 0x03);
 
-                    byte[] data = writeBuffer.getData();
+                return (short) tmp;
+            } catch (ParseException e) {
+                throw new RuntimeException("Something wen't wrong during the 
CRC check", e);
+            }
+        } else if(command instanceof DF1UnprotectedReadResponse) {
+            DF1UnprotectedReadResponse unprotectedReadResponseCommand = 
(DF1UnprotectedReadResponse) command;
+            try {
+                WriteBuffer writeBuffer = new WriteBuffer(10, false);
+                writeBuffer.writeUnsignedShort(8, destinationAddress);
+                writeBuffer.writeUnsignedShort(8, sourceAddress);
+                writeBuffer.writeUnsignedShort(8, commandDiscriminatorValues);
+                writeBuffer.writeUnsignedShort(8, status);
+                writeBuffer.writeUnsignedInt(16, (short) transactionCounter);
+                for (short data : unprotectedReadResponseCommand.getData()) {
+                    writeBuffer.writeUnsignedShort(8,  data);
+                }
+                writeBuffer.writeUnsignedShort(8, (byte) 0x03);
 
-                    int tmp = 0;
-                    int crcL, crcR;
+                byte[] data = writeBuffer.getData();
 
-                    for (int newByte : data) {
-                        crcL = tmp >> 8;
-                        crcR = tmp & 0xFF;
-                        tmp = (crcL << 8) + (newByte ^ crcR);
-                        for (int j=0; j<8; j++)
-                            if (tmp % 2 == 1) {     // check if LSB shifted 
out is 1 or 0
-                                tmp = tmp >> 1;
-                                tmp = tmp ^ 0xA001;
-                            } else {
-                                tmp = tmp >> 1;
-                            }
-                    }
+                int tmp = 0;
+                int crcL, crcR;
 
-                    return (short) tmp;
-                } catch (ParseException e) {
-                    throw new RuntimeException("Something wen't wrong during 
the CRC check", e);
+                for (int newByte : data) {
+                    crcL = tmp >> 8;
+                    crcR = tmp & 0xFF;
+                    tmp = (crcL << 8) + (newByte ^ crcR);
+                    for (int j=0; j<8; j++)
+                        if (tmp % 2 == 1) {     // check if LSB shifted out is 
1 or 0
+                            tmp = tmp >> 1;
+                            tmp = tmp ^ 0xA001;
+                        } else {
+                            tmp = tmp >> 1;
+                        }
                 }
+
+                return (short) tmp;
+            } catch (ParseException e) {
+                throw new RuntimeException("Something wen't wrong during the 
CRC check", e);
             }
         }
 
diff --git 
a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/IOTest.java
 
b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/IOTest.java
index 18543cc..b79ef43 100644
--- 
a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/IOTest.java
+++ 
b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/IOTest.java
@@ -31,9 +31,9 @@ public class IOTest {
 
     @Test
     public void testXml() throws Exception {
-        byte[] rData = Hex.decodeHex("10020A0941000100FFFF1003473D");
+        byte[] rData = Hex.decodeHex("10020900010001001100021003546F");
         ObjectMapper mapper = new XmlMapper().enableDefaultTyping();
-        ReadBuffer rBuf = new ReadBuffer(rData);
+        ReadBuffer rBuf = new ReadBuffer(rData, false);
         DF1Symbol symbol = new DF1SymbolIO().parse(rBuf);
         String xml = 
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(symbol);
         System.out.println(xml);
@@ -43,9 +43,9 @@ public class IOTest {
 
     @Test
     public void testJson() throws Exception {
-        byte[] rData = Hex.decodeHex("10020900010001001100021003ABE2");
+        byte[] rData = Hex.decodeHex("10020A0941000100FFFF1003DFB9");
         ObjectMapper mapper = new ObjectMapper().enableDefaultTyping();
-        ReadBuffer rBuf = new ReadBuffer(rData);
+        ReadBuffer rBuf = new ReadBuffer(rData, false);
         DF1Symbol symbol = new DF1SymbolIO().parse(rBuf);
         String json = 
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(symbol);
         System.out.println(json);
diff --git 
a/sandbox/test-java-s7-driver/src/main/resources/protocols/df1/protocol.mspec 
b/sandbox/test-java-s7-driver/src/main/resources/protocols/df1/protocol.mspec
index 734216d..6b5749d 100644
--- 
a/sandbox/test-java-s7-driver/src/main/resources/protocols/df1/protocol.mspec
+++ 
b/sandbox/test-java-s7-driver/src/main/resources/protocols/df1/protocol.mspec
@@ -26,7 +26,7 @@
     [reserved uint 8     '0x00']
     [reserved uint 8     '0x00']
     [implicit uint 16    'len'        'payload.lengthInBytes + 4']
-    [field    COTPPacket 'payload']
+    [simple   COTPPacket 'payload']
 ]
 
 ////////////////////////////////////////////////////////////////
@@ -38,54 +38,54 @@
     [discriminator uint 8 'tpduCode']
     [typeSwitch 'tpduCode'
         ['0xF0' COTPPacketData
-            [field bit    'eot']
-            [field uint 7 'tpduRef']
+            [simple bit    'eot']
+            [simple uint 7 'tpduRef']
         ]
         ['0xE0' COTPPacketConnectionRequest
-            [field uint 16 'destinationReference']
-            [field uint 16 'sourceReference']
-            [field uint 8  'protocolClass']
+            [simple uint 16 'destinationReference']
+            [simple uint 16 'sourceReference']
+            [simple uint 8  'protocolClass']
         ]
         ['0xD0' COTPPacketConnectionResponse
-            [field uint 16 'destinationReference']
-            [field uint 16 'sourceReference']
-            [field uint 8  'protocolClass']
+            [simple uint 16 'destinationReference']
+            [simple uint 16 'sourceReference']
+            [simple uint 8  'protocolClass']
         ]
         ['0x80' COTPPacketDisconnectRequest
-            [field uint 16 'destinationReference']
-            [field uint 16 'sourceReference']
-            [field uint 8  'protocolClass']
+            [simple uint 16 'destinationReference']
+            [simple uint 16 'sourceReference']
+            [simple uint 8  'protocolClass']
         ]
         ['0xC0' COTPPacketDisconnectResponse
-            [field uint 16 'destinationReference']
-            [field uint 16 'sourceReference']
+            [simple uint 16 'destinationReference']
+            [simple uint 16 'sourceReference']
         ]
         ['0x70' COTPPacketTpduError
-            [field uint 16 'destinationReference']
-            [field uint 8  'rejectCause']
+            [simple uint 16 'destinationReference']
+            [simple uint 8  'rejectCause']
         ]
     ]
-    [arrayField COTPParameter 'parameters' length '(headerLength + 1) - 
curPos' ['(headerLength + 1) - curPos']]
-    [field      S7Message     'payload']
+    [array  COTPParameter 'parameters' length '(headerLength + 1) - curPos' 
['(headerLength + 1) - curPos']]
+    [simple S7Message     'payload']
 ]
 
 [discriminatedType 'COTPParameter' [uint 8 'rest']
     [discriminator uint 8 'parameterType']
     [typeSwitch 'parameterType'
         ['0xC0' COTPParameterTpduSize
-            [field uint 8 'tpduSize']
+            [simple uint 8 'tpduSize']
         ]
         ['0xC1' COTPParameterCallingTsap
-            [field uint 16 'tsapId']
+            [simple uint 16 'tsapId']
         ]
         ['0xC2' COTPParameterCalledTsap
-            [field uint 16 'tsapId']
+            [simple uint 16 'tsapId']
         ]
         ['0xC3' COTPParameterChecksum
-            [field uint 8 'checksum']
+            [simple uint 8 'checksum']
         ]
         ['0xE0' COTPParameterDisconnectAdditionalInformation
-            [arrayField uint 8 'data' count 'rest']
+            [array  uint 8 'data' count 'rest']
         ]
     ]
 ]
@@ -98,21 +98,21 @@
     [const         uint 8  'protocolId'      '0x32']
     [discriminator uint 8  'messageType']
     [reserved      uint 16 '0x0000']
-    [field         uint 16 'tpduReference']
+    [simple        uint 16 'tpduReference']
     [implicit      uint 16 'parameterLength' 'parameter.lengthInBytes']
     [implicit      uint 16 'payloadLength'   'payload.lengthInBytes']
     [typeSwitch 'messageType'
         ['0x01' S7MessageRequest
         ]
         ['0x03' S7MessageResponse
-            [field uint 8 'errorClass']
-            [field uint 8 'errorCode']
+            [simple uint 8 'errorClass']
+            [simple uint 8 'errorCode']
         ]
         ['0x07' S7MessageUserData
         ]
     ]
-    [field S7Parameter 'parameter' ['messageType']]
-    [field S7Payload   'payload'   ['messageType', 'parameter']]
+    [simple S7Parameter 'parameter' ['messageType']]
+    [simple S7Payload   'payload'   ['messageType', 'parameter']]
 ]
 
 ////////////////////////////////////////////////////////////////
@@ -123,27 +123,27 @@
     [typeSwitch 'parameterType','messageType'
         ['0xF0' S7ParameterSetupCommunication
             [reserved uint 8  '0x00']
-            [field    uint 16 'maxAmqCaller']
-            [field    uint 16 'maxAmqCallee']
-            [field    uint 16 'pduLength']
+            [simple   uint 16 'maxAmqCaller']
+            [simple   uint 16 'maxAmqCallee']
+            [simple   uint 16 'pduLength']
         ]
         ['0x04','0x01' S7ParameterReadVarRequest
-            [implicit   uint 8                    'numItems' 'COUNT(items)']
-            [arrayField S7VarRequestParameterItem 'items'    count 'numItems']
+            [implicit uint 8                    'numItems' 'COUNT(items)']
+            [array    S7VarRequestParameterItem 'items'    count 'numItems']
         ]
         ['0x04','0x03' S7ParameterReadVarResponse
-            [field uint 8 'numItems']
+            [simple uint 8 'numItems']
         ]
         ['0x05','0x01' S7ParameterWriteVarRequest
-            [implicit   uint 8                    'numItems' 'COUNT(items)']
-            [arrayField S7VarRequestParameterItem 'items'    count 'numItems']
+            [implicit uint 8                    'numItems' 'COUNT(items)']
+            [array    S7VarRequestParameterItem 'items'    count 'numItems']
         ]
         ['0x05','0x03' S7ParameterWriteVarResponse
-            [field uint 8 'numItems']
+            [simple uint 8 'numItems']
         ]
         ['0x00','0x07' S7ParameterUserData
-            [implicit   uint 8       'numItems' 'COUNT(items)']
-            [arrayField UserDataItem 'items' count 'numItems']
+            [implicit uint 8       'numItems' 'COUNT(items)']
+            [array    UserDataItem 'items' count 'numItems']
         ]
     ]
 ]
@@ -153,7 +153,7 @@
     [typeSwitch 'parameterItemType'
         ['0x12' S7VarRequestParameterItemAddress
             [implicit uint 8    'addressLength' 'address.lengthInBytes']
-            [field    S7Address 'address']
+            [simple   S7Address 'address']
         ]
     ]
 ]
@@ -162,13 +162,13 @@
     [discriminator uint 8 'addressType']
     [typeSwitch 'addressType'
         ['0x10' S7AddressAny
-            [field    uint 8  'transportSize']
-            [field    uint 16 'numberOfElements']
-            [field    uint 16 'dbNumber']
-            [field    uint 8  'area']
+            [simple   uint 8  'transportSize']
+            [simple   uint 16 'numberOfElements']
+            [simple   uint 16 'dbNumber']
+            [simple   uint 8  'area']
             [reserved uint 5  '0x00']
-            [field    uint 16 'byteAddress']
-            [field    uint 3  'bitAddress']
+            [simple   uint 16 'byteAddress']
+            [simple   uint 3  'bitAddress']
         ]
     ]
 ]
@@ -178,13 +178,13 @@
     [discriminator uint 8 'itemType']
     [typeSwitch 'itemType'
         ['0x12' UserDataItemCPUFunctions
-            [implicit      uint 8  'parameterLength' 'lengthInBytes']
-            [field         uint 16 'cpuFunctionType']
-            [field         uint 8  'subFunctionGroup']
-            [field         uint 8  'sequenceNumber']
-            [optionalField uint 8  'dataUnitReferenceNumber' 'parameterLength 
== 8']
-            [optionalField uint 8  'lastDataUnit' 'parameterLength == 8']
-            [optionalField uint 8  'errorCode' 'parameterLength == 8']
+            [implicit uint 8  'parameterLength' 'lengthInBytes']
+            [simple   uint 16 'cpuFunctionType']
+            [simple   uint 8  'subFunctionGroup']
+            [simple   uint 8  'sequenceNumber']
+            [optional uint 8  'dataUnitReferenceNumber' 'parameterLength == 8']
+            [optional uint 8  'lastDataUnit' 'parameterLength == 8']
+            [optional uint 8  'errorCode' 'parameterLength == 8']
         ]
     ]
 ]
@@ -197,13 +197,13 @@
         ['0xF0' S7PayloadSetupCommunication]
         ['0x04','0x01' S7PayloadReadVarRequest]
         ['0x04','0x03' S7PayloadReadVarResponse
-            [arrayField S7VarPayloadDataItem 'items' count 'CAST(parameter, 
S7ParameterReadVarResponse).numItems']
+            [array S7VarPayloadDataItem 'items' count 'CAST(parameter, 
S7ParameterReadVarResponse).numItems']
         ]
         ['0x05','0x01' S7PayloadWriteVarRequest
-            [arrayField S7VarPayloadDataItem 'items' count 
'COUNT(CAST(parameter, S7ParameterWriteVarRequest).items)']
+            [array S7VarPayloadDataItem 'items' count 'COUNT(CAST(parameter, 
S7ParameterWriteVarRequest).items)']
         ]
         ['0x05','0x03' S7PayloadWriteVarResponse
-            [arrayField S7VarPayloadStatusItem 'items' count 'CAST(parameter, 
S7ParameterWriteVarResponse).numItems']
+            [array S7VarPayloadStatusItem 'items' count 'CAST(parameter, 
S7ParameterWriteVarResponse).numItems']
         ]
         ['0x00','0x07' S7PayloadUserData
         ]
@@ -211,12 +211,12 @@
 ]
 
 [type 'S7VarPayloadDataItem'
-    [field      uint 8  'returnCode']
-    [field      uint 8  'transportSize']
-    [field      uint 16 'dataLength']
-    [arrayField uint 8  'data' count 'dataLength']
+    [simple uint 8  'returnCode']
+    [simple uint 8  'transportSize']
+    [simple uint 16 'dataLength']
+    [array  uint 8  'data' count 'dataLength']
 ]
 
 [type 'S7VarPayloadStatusItem'
-    [field uint 8 'returnCode']
+    [simple uint 8 'returnCode']
 ]
\ No newline at end of file

Reply via email to