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