You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/06/22 15:06:49 UTC
[plc4x] branch feature/c-code-generation-tagged-unions updated: -
Finished implementing the implicit fields - Fixed the generation of the
padding code (which used the "serializer"-arg "lastItem") - Added skeletons
for the lengthInBytes code.
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/c-code-generation-tagged-unions
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/feature/c-code-generation-tagged-unions by this push:
new d9e7b3b - Finished implementing the implicit fields - Fixed the generation of the padding code (which used the "serializer"-arg "lastItem") - Added skeletons for the lengthInBytes code.
d9e7b3b is described below
commit d9e7b3b7155207aff7cf24a8aa2abe0099f79281
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Mon Jun 22 17:06:36 2020 +0200
- Finished implementing the implicit fields
- Fixed the generation of the padding code (which used the "serializer"-arg "lastItem")
- Added skeletons for the lengthInBytes code.
---
.../plc4x/language/c/CLanguageTemplateHelper.java | 59 +++++++++++++---------
.../resources/templates/c/pojo-template-c.ftlh | 54 ++++++++++++--------
.../resources/templates/c/pojo-template-h.ftlh | 6 ++-
.../modbus/includes/modbus_constants.h | 4 ++
.../generated-sources/modbus/includes/modbus_pdu.h | 4 ++
.../modbus_pdu_read_file_record_request_item.h | 4 ++
.../modbus_pdu_read_file_record_response_item.h | 4 ++
.../modbus_pdu_write_file_record_request_item.h | 4 ++
.../modbus_pdu_write_file_record_response_item.h | 4 ++
.../modbus/includes/modbus_serial_adu.h | 4 ++
.../modbus/includes/modbus_tcp_adu.h | 4 ++
.../modbus/src/modbus_constants.c | 9 ++++
.../generated-sources/modbus/src/modbus_pdu.c | 9 ++++
.../src/modbus_pdu_read_file_record_request_item.c | 9 ++++
.../modbus_pdu_read_file_record_response_item.c | 13 +++++
.../modbus_pdu_write_file_record_request_item.c | 13 +++++
.../modbus_pdu_write_file_record_response_item.c | 13 +++++
.../modbus/src/modbus_serial_adu.c | 9 ++++
.../generated-sources/modbus/src/modbus_tcp_adu.c | 12 +++++
.../generated-sources/s7/includes/cotp_packet.h | 4 ++
.../generated-sources/s7/includes/cotp_parameter.h | 4 ++
.../generated-sources/s7/includes/s7_address.h | 4 ++
.../generated-sources/s7/includes/s7_message.h | 4 ++
.../generated-sources/s7/includes/s7_parameter.h | 4 ++
.../s7/includes/s7_parameter_user_data_item.h | 4 ++
.../generated-sources/s7/includes/s7_payload.h | 4 ++
.../s7/includes/s7_payload_user_data_item.h | 4 ++
.../s7/includes/s7_var_payload_data_item.h | 6 ++-
.../s7/includes/s7_var_payload_status_item.h | 4 ++
.../s7/includes/s7_var_request_parameter_item.h | 4 ++
.../s7/includes/szl_data_tree_item.h | 4 ++
.../plc4c/generated-sources/s7/includes/szl_id.h | 4 ++
.../generated-sources/s7/includes/tpkt_packet.h | 4 ++
.../plc4c/generated-sources/s7/src/cotp_packet.c | 13 +++++
.../generated-sources/s7/src/cotp_parameter.c | 12 +++++
.../plc4c/generated-sources/s7/src/s7_address.c | 9 ++++
.../plc4c/generated-sources/s7/src/s7_message.c | 15 ++++++
.../plc4c/generated-sources/s7/src/s7_parameter.c | 9 ++++
.../s7/src/s7_parameter_user_data_item.c | 9 ++++
.../plc4c/generated-sources/s7/src/s7_payload.c | 9 ++++
.../s7/src/s7_payload_user_data_item.c | 12 +++++
.../s7/src/s7_var_payload_data_item.c | 14 ++++-
.../s7/src/s7_var_payload_status_item.c | 9 ++++
.../s7/src/s7_var_request_parameter_item.c | 9 ++++
.../generated-sources/s7/src/szl_data_tree_item.c | 10 ++++
sandbox/plc4c/generated-sources/s7/src/szl_id.c | 9 ++++
.../plc4c/generated-sources/s7/src/tpkt_packet.c | 12 +++++
47 files changed, 397 insertions(+), 50 deletions(-)
diff --git a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
index 90465a2..b90d7f7 100644
--- a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
+++ b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
@@ -472,7 +472,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
}
if (term instanceof Literal) {
if (term instanceof NullLiteral) {
- return "null";
+ return "NULL";
} else if (term instanceof BooleanLiteral) {
return Boolean.toString(((BooleanLiteral) term).getValue());
} else if (term instanceof NumericLiteral) {
@@ -481,8 +481,24 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
return "\"" + ((StringLiteral) term).getValue() + "\"";
} else if (term instanceof VariableLiteral) {
VariableLiteral variableLiteral = (VariableLiteral) term;
+ if(variableLiteral.contains("lengthInBytes")) {
+ ComplexTypeDefinition lengthType;
+ String lengthExpression;
+ if(variableLiteral.getName().equals("lengthInBytes")) {
+ lengthType = baseType;
+ lengthExpression = "_message";
+ } else {
+ final Optional<TypeReference> typeReferenceForProperty = getTypeReferenceForProperty(baseType, variableLiteral.getName());
+ if(!typeReferenceForProperty.isPresent()) {
+ throw new RuntimeException("Unknown type for property " + variableLiteral.getName());
+ }
+ lengthType = (ComplexTypeDefinition) getTypeDefinitionForTypeReference(typeReferenceForProperty.get());
+ lengthExpression = variableExpressionGenerator.apply(term);
+ }
+ return "plc4c_" + getCTypeName(lengthType.getName()) + "_length_in_bytes(" + lengthExpression + ")";
+ }
// If this literal references an Enum type, then we have to output it differently.
- if (getTypeDefinitions().get(variableLiteral.getName()) instanceof EnumTypeDefinition) {
+ else if (getTypeDefinitions().get(variableLiteral.getName()) instanceof EnumTypeDefinition) {
return variableLiteral.getName() + "." + variableLiteral.getChild().getName();
} else {
return variableExpressionGenerator.apply(term);
@@ -715,29 +731,9 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
sb.append(")");
return sb.toString();
}
- // Discriminator values have to be handled a little differently.
- /*else if(vl.getName().equals("DISCRIMINATOR_VALUES")) {
- final String typeName = getLanguageTypeNameForSpecType(field.getType());
- switch (typeName) {
- case "byte":
- return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).byteValue()";
- case "short":
- return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).shortValue()";
- case "int":
- return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).intValue()";
- case "long":
- return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).longValue()";
- case "float":
- return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).floatValue()";
- case "double":
- return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).doubleValue()";
- default:
- return "_value.getDiscriminatorValues()[" + vl.getIndex() + "]";
- }
- }*/
// All uppercase names are not fields, but utility methods.
else if (vl.getName().equals(vl.getName().toUpperCase())) {
- StringBuilder sb = new StringBuilder(vl.getName());
+ StringBuilder sb = new StringBuilder("plc4c_spi_evaluation_helper_" + vl.getName().toLowerCase());
if (vl.getArgs() != null) {
sb.append("(");
boolean firstArg = true;
@@ -842,7 +838,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
return "";
}
} else {
- StringBuilder sb = new StringBuilder("_value");
+ StringBuilder sb = new StringBuilder("_message->");
appendVariableExpressionRest(sb, vl);
return sb.toString();
}
@@ -856,7 +852,8 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
} else {
sb.append(camelCaseToSnakeCase(vl.getName()));
}
- if(vl.getChild() != null) {
+ // Suppress any "lengthInBytes" properties as these are handled differently in C
+ if((vl.getChild() != null) && !vl.getChild().getName().equals("lengthInBytes")) {
sb.append(".");
appendVariableExpressionRest(sb, vl.getChild());
}
@@ -886,4 +883,16 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
}
}
+ public List<Argument> getSerializerArguments(Argument[] arguments) {
+ List<Argument> serializerArguments = new LinkedList<>();
+ if(arguments != null) {
+ for (Argument argument : arguments) {
+ if ("lastItem".equals(argument.getName())) {
+ serializerArguments.add(argument);
+ }
+ }
+ }
+ return serializerArguments;
+ }
+
}
diff --git a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
index 6ff6ba9..e02c82a 100644
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
@@ -117,7 +117,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#if indentContent> </#if> {
<#if helper.isCountArrayField(field)>
<#if indentContent> </#if> // Count array
-<#if indentContent> </#if> uint8_t itemCount = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.parserArguments)};
+<#if indentContent> </#if> uint8_t itemCount = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, baseType.parserArguments)};
<#if indentContent> </#if> for(int curItem = 0; curItem < itemCount; curItem++) {
<#if indentContent> </#if> <#if !helper.isSimpleTypeReference(arrayField.type)>bool lastItem = curItem == (itemCount - 1);</#if>
<#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
@@ -127,7 +127,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#else>
<#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)}* _value = NULL;
-<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, baseType.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
<#if indentContent> </#if> if(_res != OK) {
<#if indentContent> </#if> return _res;
<#if indentContent> </#if> }
@@ -137,7 +137,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#-- For a length array, we read data till the read position of the buffer reaches a given position -->
<#elseif helper.isLengthArrayField(field)>
<#if indentContent> </#if> // Length array
-<#if indentContent> </#if> uint8_t _${arrayField.name}Length = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.parserArguments)};
+<#if indentContent> </#if> uint8_t _${arrayField.name}Length = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, baseType.parserArguments)};
<#if indentContent> </#if> uint8_t ${arrayField.name}EndPos = plc4c_spi_read_get_pos(buf) + _${arrayField.name}Length;
<#if indentContent> </#if> while(plc4c_spi_read_get_pos(buf) < ${arrayField.name}EndPos) {
<#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
@@ -147,7 +147,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#else>
<#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)}* _value = NULL;
-<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, baseType.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
<#if indentContent> </#if> if(_res != OK) {
<#if indentContent> </#if> return _res;
<#if indentContent> </#if> }
@@ -161,7 +161,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
<#elseif helper.isTerminatedArrayField(field)>
<#if indentContent> </#if> // Terminated array
-<#if indentContent> </#if> while(!((boolean) (${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.parserArguments)}))) {
+<#if indentContent> </#if> while(!((boolean) (${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, baseType.parserArguments)}))) {
<#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
<#if helper.isSimpleTypeReference(arrayField.type)>
<#if indentContent> </#if> ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} _value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
@@ -169,7 +169,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#else>
<#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)}* _value = NULL;
-<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, baseType.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
<#if indentContent> </#if> if(_res != OK) {
<#if indentContent> </#if> return _res;
<#if indentContent> </#if> }
@@ -193,7 +193,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#if indentContent> </#if> // Create an array of all the bytes read in this message element so far.
<#if indentContent> </#if> byte[] checksumRawData = plc4c_spi_read_get_bytes(buf, startPos, plc4c_spi_read_get_pos(buf));
<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getReadBufferReadMethodCall(checksumField.type)};
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, type.parserArguments)});
+<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, baseType.parserArguments)});
<#if indentContent> </#if> if(_checksum != _checksumRef) {
<#if indentContent> </#if> return PARSE_ERROR;
<#if indentContent> </#if> // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
@@ -241,7 +241,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#assign manualField = field>
<#if indentContent> </#if> // Manual Field (${manualField.name})<#-- check if complex -->
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, manualField, manualField.parseExpression, type.parserArguments)});
+<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, manualField, manualField.parseExpression, baseType.parserArguments)});
<#if indentContent> </#if> (*_message)-><@fieldName baseType=baseType field=manualField/> = ${manualField.name};
<#break>
<#case "optional">
@@ -252,7 +252,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#if indentContent> </#if> curPos = plc4c_spi_read_get_pos(buf) - startPos;
</#if>
<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)}* ${optionalField.name} = NULL;
-<#if indentContent> </#if> if(${helper.toParseExpression(baseType, field, optionalField.conditionExpression, type.parserArguments)}) {
+<#if indentContent> </#if> if(${helper.toParseExpression(baseType, field, optionalField.conditionExpression, baseType.parserArguments)}) {
<#if indentContent> </#if> ${optionalField.name} = malloc(sizeof(${helper.getLanguageTypeNameForField(field)}));
<#if indentContent> </#if> if(${optionalField.name} == NULL) {
<#if indentContent> </#if> return NO_MEMORY;
@@ -260,7 +260,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#if helper.isSimpleTypeReference(optionalField.type)>
<#if indentContent> </#if> *${optionalField.name} = ${helper.getReadBufferReadMethodCall(optionalField.type)};
<#else>
-<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(optionalField.type.name)}_parse(buf<#if optionalField.params?has_content>, <#list optionalField.params as parserTerm>${helper.toParseExpression(baseType, optionalField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, &${optionalField.name});
+<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(optionalField.type.name)}_parse(buf<#if optionalField.params?has_content>, <#list optionalField.params as parserTerm>${helper.toParseExpression(baseType, optionalField, parserTerm, baseType.parserArguments)}<#sep>, </#sep></#list></#if>, &${optionalField.name});
<#if indentContent> </#if> if(_res != OK) {
<#if indentContent> </#if> return _res;
<#if indentContent> </#if> }
@@ -274,7 +274,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#if indentContent> </#if> // Padding Field (padding)
<#if indentContent> </#if> {
-<#if indentContent> </#if> bool _needsPadding = (bool) ((plc4c_spi_read_has_more(buf, ${helper.getNumBits(paddingField.type)})) && (${helper.toParseExpression(baseType, paddingField, paddingField.paddingCondition, type.parserArguments)}));
+<#if indentContent> </#if> bool _needsPadding = (bool) ((plc4c_spi_read_has_more(buf, ${helper.getNumBits(paddingField.type)})) && (${helper.toParseExpression(baseType, paddingField, paddingField.paddingCondition, baseType.parserArguments)}));
<#if indentContent> </#if> if(_needsPadding) {
<#if indentContent> </#if> // Just read the padding data and ignore it
<#if indentContent> </#if> ${helper.getReadBufferReadMethodCall(paddingField.type)};
@@ -303,7 +303,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#else>
<#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)}* ${simpleField.name};
-<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(simpleField.type.name)}_parse(buf<#if simpleField.params?has_content>, <#list simpleField.params as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
+<#if indentContent> </#if> plc4c_return_code _res = plc4c_${helper.getCTypeName(simpleField.type.name)}_parse(buf<#if simpleField.params?has_content>, <#list simpleField.params as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, baseType.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
<#if indentContent> </#if> if(_res != OK) {
<#if indentContent> </#if> return _res;
<#if indentContent> </#if> }
@@ -328,7 +328,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#assign virtualField = field>
<#if indentContent> </#if> // Virtual field (Just declare a local variable so we can access it in the parser)
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${virtualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, virtualField, virtualField.valueExpression, type.parserArguments)});
+<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${virtualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, virtualField, virtualField.valueExpression, baseType.parserArguments)});
<#break>
</#switch>
</#macro>
@@ -339,7 +339,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
return OK;
}
-plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* buf, plc4c_${helper.getCTypeName(type.name)}* _message) {
+plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* buf, plc4c_${helper.getCTypeName(type.name)}* _message<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)} ${parserArgument.name}<#sep>, </#sep></#list></#if>) {
<#macro fieldSerializer baseType field indentContent>
<#switch field.typeName>
<#case "array">
@@ -349,6 +349,8 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_wr
<#if indentContent> </#if> {
<#if indentContent> </#if> uint8_t itemCount = plc4c_utils_list_size(_message-><@fieldName baseType=baseType field=arrayField/>);
<#if indentContent> </#if> for(int curItem = 0; curItem < itemCount; curItem++) {
+ <#-- When parsing simple types, there is nothing that could require the "lastItem" -->
+<#if !helper.isSimpleTypeReference(arrayField.type)><#if indentContent> </#if> bool lastItem = curItem == (itemCount - 1);</#if>
<#if indentContent> </#if> ${helper.getLanguageTypeNameForTypeReference(arrayField.type)}* _value = (${helper.getLanguageTypeNameForTypeReference(arrayField.type)}*) plc4c_utils_list_get_value(_message-><@fieldName baseType=baseType field=arrayField/>, curItem);
<#if helper.isSimpleTypeReference(arrayField.type)>
<#if indentContent> </#if> ${helper.getWriteBufferWriteMethodCall(arrayField.type, "*_value")};
@@ -370,7 +372,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_wr
<#if indentContent> </#if> // Create an array of all the bytes read in this message element so far.
<#if indentContent> </#if> byte[] checksumRawData = plc4c_spi_read_get_bytes(buf, startPos, plc4c_spi_read_get_pos(buf));
<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getReadBufferReadMethodCall(checksumField.type)};
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, type.parserArguments)});
+<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, baseType.parserArguments)});
<#if indentContent> </#if> if(_checksum != _checksumRef) {
<#if indentContent> </#if> return PARSE_ERROR;
<#if indentContent> </#if> // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
@@ -397,18 +399,18 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_wr
<#if indentContent> </#if> // Enum field (${enumField.name})
<#if indentContent> </#if> ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "_message->" + helper.camelCaseToSnakeCase(enumField.name))};
<#break>
- <#--case "implicit">
+ <#case "implicit">
<#assign implicitField = field>
<#assign simpleTypeReference = implicitField.type>
<#if indentContent> </#if> // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = ${helper.getReadBufferReadMethodCall(implicitField.type)};
+<#if indentContent> </#if> ${helper.getWriteBufferWriteMethodCall(implicitField.type, helper.toSerializationExpression(baseType, implicitField, implicitField.serializeExpression, baseType.parserArguments))};
<#break>
<#case "manualArray">
<#assign manualArrayField = field>
- <- TODO: Implement ->
- <#break-->
+ <#-- TODO: Implement -->
+ <#break>
<#case "manual">
<#assign manualField = field>
@@ -448,10 +450,11 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_wr
<#if indentContent> </#if> // Padding Field (padding)
<#if indentContent> </#if> {
-<#if indentContent> </#if> bool _needsPadding = (bool) ((plc4c_spi_read_has_more(buf, ${helper.getNumBits(paddingField.type)})) && (${helper.toParseExpression(baseType, paddingField, paddingField.paddingCondition, type.parserArguments)}));
+ <#-- We're replacing the "lastItem" with 'false' here as the item itself can't know if it is the last -->
+<#if indentContent> </#if> bool _needsPadding = (bool) (${helper.toSerializationExpression(baseType, paddingField, paddingField.paddingCondition, baseType.parserArguments)});
<#if indentContent> </#if> if(_needsPadding) {
<#if indentContent> </#if> // Just output the default padding data
-<#if indentContent> </#if> ${helper.getWriteBufferWriteMethodCall(paddingField.type, helper.toParseExpression(baseType, paddingField, paddingField.paddingValue, type.parserArguments))};
+<#if indentContent> </#if> ${helper.getWriteBufferWriteMethodCall(paddingField.type, helper.toParseExpression(baseType, paddingField, paddingField.paddingValue, baseType.parserArguments))};
<#if indentContent> </#if> }
<#if indentContent> </#if> }
<#break>
@@ -501,5 +504,14 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_wr
return OK;
}
+
+uint8_t plc4c_${helper.getCTypeName(type.name)}_length_in_bytes(plc4c_${helper.getCTypeName(type.name)}* message) {
+ return plc4c_${helper.getCTypeName(type.name)}_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_${helper.getCTypeName(type.name)}_length_in_bits(plc4c_${helper.getCTypeName(type.name)}* message) {
+ return 0;
+}
+
</#if>
</#outputformat>
\ No newline at end of file
diff --git a/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh b/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh
index e390c73..4e8cfbe 100644
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh
@@ -148,7 +148,11 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#--
Define the serialize-method for elements of this tpye
-->
-plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* buf, plc4c_${helper.getCTypeName(type.name)}* message);
+plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* buf, plc4c_${helper.getCTypeName(type.name)}* message<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)} ${parserArgument.name}<#sep>, </#sep></#list></#if>);
+
+uint8_t plc4c_${helper.getCTypeName(type.name)}_length_in_bytes(plc4c_${helper.getCTypeName(type.name)}* message);
+
+uint8_t plc4c_${helper.getCTypeName(type.name)}_length_in_bits(plc4c_${helper.getCTypeName(type.name)}* message);
#ifdef __cplusplus
}
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_constants.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_constants.h
index 86c511e..99d71ec 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_constants.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_constants.h
@@ -39,6 +39,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_constants_parse(plc4c_spi_read_
plc4c_return_code plc4c_modbus_read_write_modbus_constants_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_constants* message);
+uint8_t plc4c_modbus_read_write_modbus_constants_length_in_bytes(plc4c_modbus_read_write_modbus_constants* message);
+
+uint8_t plc4c_modbus_read_write_modbus_constants_length_in_bits(plc4c_modbus_read_write_modbus_constants* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
index b71cbe2..c1259a0 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
@@ -224,6 +224,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu* message);
+uint8_t plc4c_modbus_read_write_modbus_pdu_length_in_bytes(plc4c_modbus_read_write_modbus_pdu* message);
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4c_modbus_read_write_modbus_pdu* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_request_item.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_request_item.h
index f5fb10e..1272e13 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_request_item.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_request_item.h
@@ -39,6 +39,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_it
plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* message);
+uint8_t plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_length_in_bytes(plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* message);
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_length_in_bits(plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_response_item.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_response_item.h
index b1d8fe9..f377f04 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_response_item.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_response_item.h
@@ -37,6 +37,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* message);
+uint8_t plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_length_in_bytes(plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* message);
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_length_in_bits(plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_request_item.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_request_item.h
index c5a33f9..539e8c3 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_request_item.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_request_item.h
@@ -39,6 +39,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* message);
+uint8_t plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_length_in_bytes(plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* message);
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_length_in_bits(plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_response_item.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_response_item.h
index 6f95ed3..9f7b890 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_response_item.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_response_item.h
@@ -39,6 +39,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* message);
+uint8_t plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_length_in_bytes(plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* message);
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_length_in_bits(plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
index 308c722..b97447a 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
@@ -40,6 +40,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read
plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_serial_adu* message);
+uint8_t plc4c_modbus_read_write_modbus_serial_adu_length_in_bytes(plc4c_modbus_read_write_modbus_serial_adu* message);
+
+uint8_t plc4c_modbus_read_write_modbus_serial_adu_length_in_bits(plc4c_modbus_read_write_modbus_serial_adu* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
index aa3ae1f..7421b0f 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
@@ -43,6 +43,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_bu
plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_tcp_adu* message);
+uint8_t plc4c_modbus_read_write_modbus_tcp_adu_length_in_bytes(plc4c_modbus_read_write_modbus_tcp_adu* message);
+
+uint8_t plc4c_modbus_read_write_modbus_tcp_adu_length_in_bits(plc4c_modbus_read_write_modbus_tcp_adu* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
index ac7c426..dcad751 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
@@ -51,3 +51,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_constants_serialize(plc4c_spi_w
return OK;
}
+
+uint8_t plc4c_modbus_read_write_modbus_constants_length_in_bytes(plc4c_modbus_read_write_modbus_constants* message) {
+ return plc4c_modbus_read_write_modbus_constants_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_modbus_read_write_modbus_constants_length_in_bits(plc4c_modbus_read_write_modbus_constants* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
index afa5165..9108fc7 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
@@ -808,3 +808,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_b
return OK;
}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_length_in_bytes(plc4c_modbus_read_write_modbus_pdu* message) {
+ return plc4c_modbus_read_write_modbus_pdu_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4c_modbus_read_write_modbus_pdu* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
index 431ba3d..bc2846a 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
@@ -81,3 +81,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_it
return OK;
}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_length_in_bytes(plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* message) {
+ return plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_length_in_bits(plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
index 66875ca..c0ddce7 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
@@ -62,6 +62,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* _message) {
+ // Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_short(buf, 8, (((plc4c_spi_evaluation_helper_count(_message->data)) * (2))) + (1));
+
// Simple Field (referenceType)
{
uint8_t _value = _message->reference_type;
@@ -72,6 +75,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
{
uint8_t itemCount = plc4c_utils_list_size(_message->data);
for(int curItem = 0; curItem < itemCount; curItem++) {
+
uint16_t* _value = (uint16_t*) plc4c_utils_list_get_value(_message->data, curItem);
plc4c_spi_write_unsigned_int(buf, 16, *_value);
}
@@ -79,3 +83,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
return OK;
}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_length_in_bytes(plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* message) {
+ return plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_length_in_bits(plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
index 05f1fc4..a044dec 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
@@ -88,10 +88,14 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
plc4c_spi_write_unsigned_int(buf, 16, _value);
}
+ // Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_int(buf, 16, (((plc4c_spi_evaluation_helper_count(_message->record_data)) * (2))) / (2));
+
// Array field (recordData)
{
uint8_t itemCount = plc4c_utils_list_size(_message->record_data);
for(int curItem = 0; curItem < itemCount; curItem++) {
+
uint16_t* _value = (uint16_t*) plc4c_utils_list_get_value(_message->record_data, curItem);
plc4c_spi_write_unsigned_int(buf, 16, *_value);
}
@@ -99,3 +103,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
return OK;
}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_length_in_bytes(plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* message) {
+ return plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_length_in_bits(plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
index 53f5586..9f6e743 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
@@ -88,10 +88,14 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
plc4c_spi_write_unsigned_int(buf, 16, _value);
}
+ // Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_int(buf, 16, (((plc4c_spi_evaluation_helper_count(_message->record_data)) * (2))) / (2));
+
// Array field (recordData)
{
uint8_t itemCount = plc4c_utils_list_size(_message->record_data);
for(int curItem = 0; curItem < itemCount; curItem++) {
+
uint16_t* _value = (uint16_t*) plc4c_utils_list_get_value(_message->record_data, curItem);
plc4c_spi_write_unsigned_int(buf, 16, *_value);
}
@@ -99,3 +103,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
return OK;
}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_length_in_bytes(plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* message) {
+ return plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_length_in_bits(plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
index 8ceab24..1eacc60 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
@@ -99,3 +99,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_serialize(plc4c_spi_
return OK;
}
+
+uint8_t plc4c_modbus_read_write_modbus_serial_adu_length_in_bytes(plc4c_modbus_read_write_modbus_serial_adu* message) {
+ return plc4c_modbus_read_write_modbus_serial_adu_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_modbus_read_write_modbus_serial_adu_length_in_bits(plc4c_modbus_read_write_modbus_serial_adu* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
index ef298ce..d90ad88 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
@@ -74,6 +74,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_serialize(plc4c_spi_wri
// Const Field (protocolIdentifier)
plc4c_spi_write_unsigned_int(buf, 16, MODBUS_READ_WRITE_MODBUS_TCP_ADU_PROTOCOL_IDENTIFIER);
+ // Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_int(buf, 16, (plc4c_modbus_read_write_modbus_pdu_length_in_bytes(_message->pdu)) + (1));
+
// Simple Field (unitIdentifier)
{
uint8_t _value = _message->unit_identifier;
@@ -91,3 +94,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_serialize(plc4c_spi_wri
return OK;
}
+
+uint8_t plc4c_modbus_read_write_modbus_tcp_adu_length_in_bytes(plc4c_modbus_read_write_modbus_tcp_adu* message) {
+ return plc4c_modbus_read_write_modbus_tcp_adu_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_modbus_read_write_modbus_tcp_adu_length_in_bits(plc4c_modbus_read_write_modbus_tcp_adu* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h b/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
index c1c1ca0..a39142d 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
@@ -91,6 +91,10 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
plc4c_return_code plc4c_s7_read_write_cotp_packet_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_cotp_packet* message);
+uint8_t plc4c_s7_read_write_cotp_packet_length_in_bytes(plc4c_s7_read_write_cotp_packet* message);
+
+uint8_t plc4c_s7_read_write_cotp_packet_length_in_bits(plc4c_s7_read_write_cotp_packet* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h b/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
index 11c9b00..ce54f97 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
@@ -74,6 +74,10 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer
plc4c_return_code plc4c_s7_read_write_cotp_parameter_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_cotp_parameter* message);
+uint8_t plc4c_s7_read_write_cotp_parameter_length_in_bytes(plc4c_s7_read_write_cotp_parameter* message);
+
+uint8_t plc4c_s7_read_write_cotp_parameter_length_in_bits(plc4c_s7_read_write_cotp_parameter* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_address.h b/sandbox/plc4c/generated-sources/s7/includes/s7_address.h
index 0f5ae1a..3dd232f 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_address.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_address.h
@@ -64,6 +64,10 @@ plc4c_return_code plc4c_s7_read_write_s7_address_parse(plc4c_spi_read_buffer* bu
plc4c_return_code plc4c_s7_read_write_s7_address_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_address* message);
+uint8_t plc4c_s7_read_write_s7_address_length_in_bytes(plc4c_s7_read_write_s7_address* message);
+
+uint8_t plc4c_s7_read_write_s7_address_length_in_bits(plc4c_s7_read_write_s7_address* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_message.h b/sandbox/plc4c/generated-sources/s7/includes/s7_message.h
index a92a3ce..05cd4ec 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_message.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_message.h
@@ -78,6 +78,10 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
plc4c_return_code plc4c_s7_read_write_s7_message_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_message* message);
+uint8_t plc4c_s7_read_write_s7_message_length_in_bytes(plc4c_s7_read_write_s7_message* message);
+
+uint8_t plc4c_s7_read_write_s7_message_length_in_bits(plc4c_s7_read_write_s7_message* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
index f3172a4..5590c4f 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
@@ -82,6 +82,10 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer*
plc4c_return_code plc4c_s7_read_write_s7_parameter_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_parameter* message);
+uint8_t plc4c_s7_read_write_s7_parameter_length_in_bytes(plc4c_s7_read_write_s7_parameter* message);
+
+uint8_t plc4c_s7_read_write_s7_parameter_length_in_bits(plc4c_s7_read_write_s7_parameter* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter_user_data_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter_user_data_item.h
index ccdf49b..f47dce6 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter_user_data_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter_user_data_item.h
@@ -64,6 +64,10 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_parse(plc4c_sp
plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_parameter_user_data_item* message);
+uint8_t plc4c_s7_read_write_s7_parameter_user_data_item_length_in_bytes(plc4c_s7_read_write_s7_parameter_user_data_item* message);
+
+uint8_t plc4c_s7_read_write_s7_parameter_user_data_item_length_in_bits(plc4c_s7_read_write_s7_parameter_user_data_item* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h b/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
index 1aa5564..f5879da 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
@@ -74,6 +74,10 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
plc4c_return_code plc4c_s7_read_write_s7_payload_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_payload* message);
+uint8_t plc4c_s7_read_write_s7_payload_length_in_bytes(plc4c_s7_read_write_s7_payload* message);
+
+uint8_t plc4c_s7_read_write_s7_payload_length_in_bits(plc4c_s7_read_write_s7_payload* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h
index aa7e30e..e24685f 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h
@@ -71,6 +71,10 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_
plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_payload_user_data_item* message);
+uint8_t plc4c_s7_read_write_s7_payload_user_data_item_length_in_bytes(plc4c_s7_read_write_s7_payload_user_data_item* message);
+
+uint8_t plc4c_s7_read_write_s7_payload_user_data_item_length_in_bits(plc4c_s7_read_write_s7_payload_user_data_item* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h
index e24bb56..ed9c478 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h
@@ -39,7 +39,11 @@ typedef struct plc4c_s7_read_write_s7_var_payload_data_item plc4c_s7_read_write_
plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_read_buffer* buf, bool lastItem, plc4c_s7_read_write_s7_var_payload_data_item** message);
-plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_payload_data_item* message);
+plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_payload_data_item* message, bool lastItem);
+
+uint8_t plc4c_s7_read_write_s7_var_payload_data_item_length_in_bytes(plc4c_s7_read_write_s7_var_payload_data_item* message);
+
+uint8_t plc4c_s7_read_write_s7_var_payload_data_item_length_in_bits(plc4c_s7_read_write_s7_var_payload_data_item* message);
#ifdef __cplusplus
}
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_status_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_status_item.h
index 500f464..b9b73fd 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_status_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_status_item.h
@@ -37,6 +37,10 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_parse(plc4c_spi
plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_payload_status_item* message);
+uint8_t plc4c_s7_read_write_s7_var_payload_status_item_length_in_bytes(plc4c_s7_read_write_s7_var_payload_status_item* message);
+
+uint8_t plc4c_s7_read_write_s7_var_payload_status_item_length_in_bits(plc4c_s7_read_write_s7_var_payload_status_item* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h
index eb442d3..0d05c95 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h
@@ -58,6 +58,10 @@ plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4c_
plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_request_parameter_item* message);
+uint8_t plc4c_s7_read_write_s7_var_request_parameter_item_length_in_bytes(plc4c_s7_read_write_s7_var_request_parameter_item* message);
+
+uint8_t plc4c_s7_read_write_s7_var_request_parameter_item_length_in_bits(plc4c_s7_read_write_s7_var_request_parameter_item* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/szl_data_tree_item.h b/sandbox/plc4c/generated-sources/s7/includes/szl_data_tree_item.h
index 2913626..a38dfcb 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/szl_data_tree_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/szl_data_tree_item.h
@@ -40,6 +40,10 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_bu
plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_szl_data_tree_item* message);
+uint8_t plc4c_s7_read_write_szl_data_tree_item_length_in_bytes(plc4c_s7_read_write_szl_data_tree_item* message);
+
+uint8_t plc4c_s7_read_write_szl_data_tree_item_length_in_bits(plc4c_s7_read_write_szl_data_tree_item* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/szl_id.h b/sandbox/plc4c/generated-sources/s7/includes/szl_id.h
index 8ca6e44..91645e1 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/szl_id.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/szl_id.h
@@ -40,6 +40,10 @@ plc4c_return_code plc4c_s7_read_write_szl_id_parse(plc4c_spi_read_buffer* buf, p
plc4c_return_code plc4c_s7_read_write_szl_id_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_szl_id* message);
+uint8_t plc4c_s7_read_write_szl_id_length_in_bytes(plc4c_s7_read_write_szl_id* message);
+
+uint8_t plc4c_s7_read_write_szl_id_length_in_bits(plc4c_s7_read_write_szl_id* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h b/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
index 1774b50..ab3849e 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
@@ -41,6 +41,10 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* b
plc4c_return_code plc4c_s7_read_write_tpkt_packet_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_tpkt_packet* message);
+uint8_t plc4c_s7_read_write_tpkt_packet_length_in_bytes(plc4c_s7_read_write_tpkt_packet* message);
+
+uint8_t plc4c_s7_read_write_tpkt_packet_length_in_bits(plc4c_s7_read_write_tpkt_packet* message);
+
#ifdef __cplusplus
}
#endif
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
index 21f6a2e..92dd782 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
@@ -203,6 +203,9 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
plc4c_return_code plc4c_s7_read_write_cotp_packet_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_cotp_packet* _message) {
+ // Implicit Field (headerLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_short(buf, 8, (plc4c_s7_read_write_cotp_packet_length_in_bytes(_message)) - ((((((((_message->payload) != (NULL))) ? plc4c_s7_read_write_s7_message_length_in_bytes(_message->payload) : 0))) + (1))));
+
// Discriminator Field (tpduCode)
plc4c_spi_write_unsigned_short(buf, 8, plc4c_s7_read_write_cotp_packet_get_discriminator(_message->_type).tpduCode);
@@ -210,6 +213,7 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_serialize(plc4c_spi_write_buff
{
uint8_t itemCount = plc4c_utils_list_size(_message->parameters);
for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
plc4c_s7_read_write_cotp_parameter* _value = (plc4c_s7_read_write_cotp_parameter*) plc4c_utils_list_get_value(_message->parameters, curItem);
plc4c_return_code _res = plc4c_s7_read_write_cotp_parameter_serialize(buf, (void*) &_value);
if(_res != OK) {
@@ -229,3 +233,12 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_serialize(plc4c_spi_write_buff
return OK;
}
+
+uint8_t plc4c_s7_read_write_cotp_packet_length_in_bytes(plc4c_s7_read_write_cotp_packet* message) {
+ return plc4c_s7_read_write_cotp_packet_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_cotp_packet_length_in_bits(plc4c_s7_read_write_cotp_packet* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
index 7bd3d68..5bb8998 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
@@ -119,5 +119,17 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_serialize(plc4c_spi_write_b
// Discriminator Field (parameterType)
plc4c_spi_write_unsigned_short(buf, 8, plc4c_s7_read_write_cotp_parameter_get_discriminator(_message->_type).parameterType);
+ // Implicit Field (parameterLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_short(buf, 8, (plc4c_s7_read_write_cotp_parameter_length_in_bytes(_message)) - (2));
+
return OK;
}
+
+uint8_t plc4c_s7_read_write_cotp_parameter_length_in_bytes(plc4c_s7_read_write_cotp_parameter* message) {
+ return plc4c_s7_read_write_cotp_parameter_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_cotp_parameter_length_in_bits(plc4c_s7_read_write_cotp_parameter* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_address.c b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
index 96ee216..a807011 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_address.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
@@ -109,3 +109,12 @@ plc4c_return_code plc4c_s7_read_write_s7_address_serialize(plc4c_spi_write_buffe
return OK;
}
+
+uint8_t plc4c_s7_read_write_s7_address_length_in_bytes(plc4c_s7_read_write_s7_address* message) {
+ return plc4c_s7_read_write_s7_address_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_s7_address_length_in_bits(plc4c_s7_read_write_s7_address* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_message.c b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
index 655464d..d340177 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_message.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
@@ -161,6 +161,12 @@ plc4c_return_code plc4c_s7_read_write_s7_message_serialize(plc4c_spi_write_buffe
plc4c_spi_write_unsigned_int(buf, 16, _value);
}
+ // Implicit Field (parameterLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_int(buf, 16, (((_message->parameter) != (NULL)) ? plc4c_s7_read_write_s7_parameter_length_in_bytes(_message->parameter) : 0));
+
+ // Implicit Field (payloadLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_int(buf, 16, (((_message->payload) != (NULL)) ? plc4c_s7_read_write_s7_payload_length_in_bytes(_message->payload) : 0));
+
// Optional Field (parameter)
if(_message->parameter != NULL) {
plc4c_s7_read_write_s7_parameter* _value = _message->parameter;
@@ -181,3 +187,12 @@ plc4c_return_code plc4c_s7_read_write_s7_message_serialize(plc4c_spi_write_buffe
return OK;
}
+
+uint8_t plc4c_s7_read_write_s7_message_length_in_bytes(plc4c_s7_read_write_s7_message* message) {
+ return plc4c_s7_read_write_s7_message_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_s7_message_length_in_bits(plc4c_s7_read_write_s7_message* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
index bde2a93..476ffab 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
@@ -199,3 +199,12 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_serialize(plc4c_spi_write_buf
return OK;
}
+
+uint8_t plc4c_s7_read_write_s7_parameter_length_in_bytes(plc4c_s7_read_write_s7_parameter* message) {
+ return plc4c_s7_read_write_s7_parameter_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_s7_parameter_length_in_bits(plc4c_s7_read_write_s7_parameter* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
index 0aa12d9..4d8a73f 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
@@ -137,3 +137,12 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_serialize(plc4
return OK;
}
+
+uint8_t plc4c_s7_read_write_s7_parameter_user_data_item_length_in_bytes(plc4c_s7_read_write_s7_parameter_user_data_item* message) {
+ return plc4c_s7_read_write_s7_parameter_user_data_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_s7_parameter_user_data_item_length_in_bits(plc4c_s7_read_write_s7_parameter_user_data_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
index e7d87ff..e42b204 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
@@ -154,3 +154,12 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_serialize(plc4c_spi_write_buffe
return OK;
}
+
+uint8_t plc4c_s7_read_write_s7_payload_length_in_bytes(plc4c_s7_read_write_s7_payload* message) {
+ return plc4c_s7_read_write_s7_payload_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_s7_payload_length_in_bits(plc4c_s7_read_write_s7_payload* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
index f55aab4..5dbf4e0 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
@@ -124,6 +124,9 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4c_
// Enum field (transportSize)
plc4c_spi_write_byte(buf, 8, _message->transport_size);
+ // Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_int(buf, 16, (plc4c_s7_read_write_s7_payload_user_data_item_length_in_bytes(_message)) - (4));
+
// Simple Field (szlId)
{
plc4c_s7_read_write_szl_id* _value = _message->szl_id;
@@ -141,3 +144,12 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4c_
return OK;
}
+
+uint8_t plc4c_s7_read_write_s7_payload_user_data_item_length_in_bytes(plc4c_s7_read_write_s7_payload_user_data_item* message) {
+ return plc4c_s7_read_write_s7_payload_user_data_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_s7_payload_user_data_item_length_in_bits(plc4c_s7_read_write_s7_payload_user_data_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
index 59e6868..6a651dc 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
@@ -75,7 +75,7 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_r
return OK;
}
-plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_payload_data_item* _message) {
+plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_payload_data_item* _message, bool lastItem) {
// Enum field (returnCode)
plc4c_spi_write_byte(buf, 8, _message->return_code);
@@ -93,6 +93,7 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_s
{
uint8_t itemCount = plc4c_utils_list_size(_message->data);
for(int curItem = 0; curItem < itemCount; curItem++) {
+
int8_t* _value = (int8_t*) plc4c_utils_list_get_value(_message->data, curItem);
plc4c_spi_write_byte(buf, 8, *_value);
}
@@ -100,7 +101,7 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_s
// Padding Field (padding)
{
- bool _needsPadding = (bool) ((plc4c_spi_read_has_more(buf, 8)) && ((!(lastItem)) && (((((plc4c_spi_evaluation_helper_count(data)) % (2))) == (1)))));
+ bool _needsPadding = (bool) ((!(lastItem)) && (((((plc4c_spi_evaluation_helper_count(_message->data)) % (2))) == (1))));
if(_needsPadding) {
// Just output the default padding data
plc4c_spi_write_unsigned_short(buf, 8, 0);
@@ -109,3 +110,12 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_s
return OK;
}
+
+uint8_t plc4c_s7_read_write_s7_var_payload_data_item_length_in_bytes(plc4c_s7_read_write_s7_var_payload_data_item* message) {
+ return plc4c_s7_read_write_s7_var_payload_data_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_s7_var_payload_data_item_length_in_bits(plc4c_s7_read_write_s7_var_payload_data_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
index 34b888a..226c282 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
@@ -48,3 +48,12 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_serialize(plc4c
return OK;
}
+
+uint8_t plc4c_s7_read_write_s7_var_payload_status_item_length_in_bytes(plc4c_s7_read_write_s7_var_payload_status_item* message) {
+ return plc4c_s7_read_write_s7_var_payload_status_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_s7_var_payload_status_item_length_in_bits(plc4c_s7_read_write_s7_var_payload_status_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
index cda6c09..6ed0990 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
@@ -78,3 +78,12 @@ plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_serialize(pl
return OK;
}
+
+uint8_t plc4c_s7_read_write_s7_var_request_parameter_item_length_in_bytes(plc4c_s7_read_write_s7_var_request_parameter_item* message) {
+ return plc4c_s7_read_write_s7_var_request_parameter_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_s7_var_request_parameter_item_length_in_bits(plc4c_s7_read_write_s7_var_request_parameter_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c b/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
index d9d6bd2..668b31a 100644
--- a/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
@@ -82,6 +82,7 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_serialize(plc4c_spi_wri
{
uint8_t itemCount = plc4c_utils_list_size(_message->mlfb);
for(int curItem = 0; curItem < itemCount; curItem++) {
+
int8_t* _value = (int8_t*) plc4c_utils_list_get_value(_message->mlfb, curItem);
plc4c_spi_write_byte(buf, 8, *_value);
}
@@ -107,3 +108,12 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_serialize(plc4c_spi_wri
return OK;
}
+
+uint8_t plc4c_s7_read_write_szl_data_tree_item_length_in_bytes(plc4c_s7_read_write_szl_data_tree_item* message) {
+ return plc4c_s7_read_write_szl_data_tree_item_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_szl_data_tree_item_length_in_bits(plc4c_s7_read_write_szl_data_tree_item* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/szl_id.c b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
index c642548..6d41b5d 100644
--- a/sandbox/plc4c/generated-sources/s7/src/szl_id.c
+++ b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
@@ -65,3 +65,12 @@ plc4c_return_code plc4c_s7_read_write_szl_id_serialize(plc4c_spi_write_buffer* b
return OK;
}
+
+uint8_t plc4c_s7_read_write_szl_id_length_in_bytes(plc4c_s7_read_write_szl_id* message) {
+ return plc4c_s7_read_write_szl_id_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_szl_id_length_in_bits(plc4c_s7_read_write_szl_id* message) {
+ return 0;
+}
+
diff --git a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
index d9df4bd..51c8255 100644
--- a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
@@ -71,6 +71,9 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_serialize(plc4c_spi_write_buff
// Reserved Field
plc4c_spi_write_unsigned_short(buf, 8, 0x00);
+ // Implicit Field (len) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ plc4c_spi_write_unsigned_int(buf, 16, (plc4c_s7_read_write_cotp_packet_length_in_bytes(_message->payload)) + (4));
+
// Simple Field (payload)
{
plc4c_s7_read_write_cotp_packet* _value = _message->payload;
@@ -82,3 +85,12 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_serialize(plc4c_spi_write_buff
return OK;
}
+
+uint8_t plc4c_s7_read_write_tpkt_packet_length_in_bytes(plc4c_s7_read_write_tpkt_packet* message) {
+ return plc4c_s7_read_write_tpkt_packet_length_in_bits(message) / 8;
+}
+
+uint8_t plc4c_s7_read_write_tpkt_packet_length_in_bits(plc4c_s7_read_write_tpkt_packet* message) {
+ return 0;
+}
+