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/16 19:34:34 UTC
[plc4x] branch feature/c-code-generation-tagged-unions updated: -
Continued working on the C code generation -- Fixed a lot of little issues.
-- Cleaned up the usage of pointers and no-pointers
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 de9ef6c - Continued working on the C code generation -- Fixed a lot of little issues. -- Cleaned up the usage of pointers and no-pointers
de9ef6c is described below
commit de9ef6c46756b29275ad3e7db59fd5c11fe6f64b
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Jun 16 21:34:25 2020 +0200
- Continued working on the C code generation
-- Fixed a lot of little issues.
-- Cleaned up the usage of pointers and no-pointers
---
.../BaseFreemarkerLanguageTemplateHelper.java | 18 +-
.../plc4x/language/c/CLanguageTemplateHelper.java | 115 ++++-
.../resources/templates/c/pojo-template-c.ftlh | 99 ++--
.../resources/templates/c/pojo-template-h.ftlh | 33 +-
.../generated-sources/modbus/includes/modbus_pdu.h | 8 +-
.../modbus/includes/modbus_serial_adu.h | 2 +-
.../modbus/includes/modbus_tcp_adu.h | 2 +-
.../modbus/src/modbus_constants.c | 6 +-
.../generated-sources/modbus/src/modbus_pdu.c | 560 ++++++++++++++++-----
.../src/modbus_pdu_read_file_record_request_item.c | 12 +-
.../modbus_pdu_read_file_record_response_item.c | 10 +-
.../modbus_pdu_write_file_record_request_item.c | 14 +-
.../modbus_pdu_write_file_record_response_item.c | 14 +-
.../modbus/src/modbus_serial_adu.c | 14 +-
.../generated-sources/modbus/src/modbus_tcp_adu.c | 14 +-
.../generated-sources/s7/includes/cotp_packet.h | 8 +-
.../generated-sources/s7/includes/cotp_parameter.h | 2 +-
.../generated-sources/s7/includes/s7_address.h | 4 +-
.../generated-sources/s7/includes/s7_parameter.h | 6 +-
.../s7/includes/s7_parameter_user_data_item.h | 6 +-
.../generated-sources/s7/includes/s7_payload.h | 8 +-
.../s7/includes/s7_payload_user_data_item.h | 7 +-
.../s7/includes/s7_var_request_parameter_item.h | 2 +-
.../generated-sources/s7/includes/tpkt_packet.h | 2 +-
.../plc4c/generated-sources/s7/src/cotp_packet.c | 106 ++--
.../generated-sources/s7/src/cotp_parameter.c | 44 +-
.../plc4c/generated-sources/s7/src/s7_address.c | 49 +-
.../plc4c/generated-sources/s7/src/s7_message.c | 46 +-
.../plc4c/generated-sources/s7/src/s7_parameter.c | 106 +++-
.../s7/src/s7_parameter_user_data_item.c | 77 ++-
.../plc4c/generated-sources/s7/src/s7_payload.c | 72 ++-
.../s7/src/s7_payload_user_data_item.c | 43 +-
.../s7/src/s7_var_payload_data_item.c | 24 +-
.../s7/src/s7_var_payload_status_item.c | 6 +-
.../s7/src/s7_var_request_parameter_item.c | 15 +-
.../generated-sources/s7/src/szl_data_tree_item.c | 14 +-
sandbox/plc4c/generated-sources/s7/src/szl_id.c | 10 +-
.../plc4c/generated-sources/s7/src/tpkt_packet.c | 10 +-
38 files changed, 1164 insertions(+), 424 deletions(-)
diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index f5ed8b7..7e576a9 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -65,6 +65,17 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
return 16;
}
});
+ builtInFields.put("lastItem", new SimpleTypeReference() {
+ @Override
+ public SimpleBaseType getBaseType() {
+ return SimpleBaseType.BIT;
+ }
+
+ @Override
+ public int getSizeInBits() {
+ return 1;
+ }
+ });
}
public BaseFreemarkerLanguageTemplateHelper(TypeDefinition thisType, String protocolName, String flavorName, Map<String, TypeDefinition> types) {
@@ -209,8 +220,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
return Optional.of(builtInFields.get(propertyName));
}
// Check if the expression root is referencing a field
- final Optional<PropertyField> propertyFieldOptional = baseType.getFields().stream().filter(
- field -> field instanceof PropertyField).map(field -> (PropertyField) field).filter(
+ final Optional<PropertyField> propertyFieldOptional = baseType.getPropertyFields().stream().filter(
propertyField -> propertyField.getName().equals(propertyName)).findFirst();
if(propertyFieldOptional.isPresent()) {
final PropertyField propertyField = propertyFieldOptional.get();
@@ -280,6 +290,10 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
return field instanceof EnumField;
}
+ public boolean isOptionalField(Field field) {
+ return field instanceof OptionalField;
+ }
+
public boolean isSwitchField(Field field) {
return field instanceof SwitchField;
}
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 416fb11..7cec423 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
@@ -118,6 +118,46 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
return getLanguageTypeNameForTypeReference(typeReference);
}
+ public Map<ComplexTypeDefinition, ConstField> getAllConstFields() {
+ Map<ComplexTypeDefinition, ConstField> constFields = new HashMap<>();
+ ((ComplexTypeDefinition) getThisTypeDefinition()).getConstFields().forEach(
+ constField -> constFields.put((ComplexTypeDefinition) getThisTypeDefinition(), constField));
+ if(getSwitchField() != null) {
+ for (DiscriminatedComplexTypeDefinition switchCase : getSwitchField().getCases()) {
+ switchCase.getConstFields().forEach(
+ constField -> constFields.put(switchCase, constField));
+ }
+ }
+ return constFields;
+ }
+
+ /**
+ * If a property references a complex type in an argument, we need to pass that as a pointer,
+ * same with optional fields.
+ *
+ * @param typeDefinition type that contains the property or attribute.
+ * @param propertyName name of the property or attribute
+ * @return true if the access needs to be using pointers
+ */
+ public boolean requiresPointerAccess(ComplexTypeDefinition typeDefinition, String propertyName) {
+ final Optional<NamedField> typeField = typeDefinition.getFields().stream().filter(field -> field instanceof NamedField).map(field -> (NamedField) field).filter(namedField -> namedField.getName().equals(propertyName)).findFirst();
+ // If the property name refers to a field, check if it's an optional field.
+ // If it is, pointer access is required, if not, it's not.
+ if(typeField.isPresent()) {
+ final NamedField namedField = typeField.get();
+ return namedField instanceof OptionalField;
+ }
+ final Optional<Argument> parserArgument = Arrays.stream(typeDefinition.getParserArguments()).filter(argument -> argument.getName().equals(propertyName)).findFirst();
+ // If the property name refers to a parser argument, as soon as it's a complex type,
+ // pointer access is required.
+ if(parserArgument.isPresent()) {
+ return parserArgument.get().getType() instanceof ComplexTypeReference;
+ }
+ // In all other cases, the property might be a built-in constant, so we don't need pointer
+ // access for any of these.
+ return false;
+ }
+
/**
* Converts a given type-reference into a concrete type in C
* If it's a complex type, this is trivial, as the typename then follows the usual pattern.
@@ -365,15 +405,15 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
- public String toParseExpression(Field field, Term term, Argument[] parserArguments) {
- return toExpression(field, term, term1 -> toVariableParseExpression(field, term1, parserArguments));
+ public String toParseExpression(ComplexTypeDefinition baseType, Field field, Term term, Argument[] parserArguments) {
+ return toExpression(baseType, field, term, term1 -> toVariableParseExpression(baseType, field, term1, parserArguments));
}
- public String toSerializationExpression(Field field, Term term, Argument[] parserArguments) {
- return toExpression(field, term, term1 -> toVariableSerializationExpression(field, term1, parserArguments));
+ public String toSerializationExpression(ComplexTypeDefinition baseType, Field field, Term term, Argument[] parserArguments) {
+ return toExpression(baseType, field, term, term1 -> toVariableSerializationExpression(baseType, field, term1, parserArguments));
}
- private String toExpression(Field field, Term term, Function<Term, String> variableExpressionGenerator) {
+ private String toExpression(ComplexTypeDefinition baseType, Field field, Term term, Function<Term, String> variableExpressionGenerator) {
if (term == null) {
return "";
}
@@ -402,11 +442,11 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
Term a = ut.getA();
switch (ut.getOperation()) {
case "!":
- return "!(" + toExpression(field, a, variableExpressionGenerator) + ")";
+ return "!(" + toExpression(baseType, field, a, variableExpressionGenerator) + ")";
case "-":
- return "-(" + toExpression(field, a, variableExpressionGenerator) + ")";
+ return "-(" + toExpression(baseType, field, a, variableExpressionGenerator) + ")";
case "()":
- return "(" + toExpression(field, a, variableExpressionGenerator) + ")";
+ return "(" + toExpression(baseType, field, a, variableExpressionGenerator) + ")";
default:
throw new RuntimeException("Unsupported unary operation type " + ut.getOperation());
}
@@ -417,9 +457,9 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
String operation = bt.getOperation();
switch (operation) {
case "^":
- return "Math.pow((" + toExpression(field, a, variableExpressionGenerator) + "), (" + toExpression(field, b, variableExpressionGenerator) + "))";
+ return "Math.pow((" + toExpression(baseType, field, a, variableExpressionGenerator) + "), (" + toExpression(baseType, field, b, variableExpressionGenerator) + "))";
default:
- return "(" + toExpression(field, a, variableExpressionGenerator) + ") " + operation + " (" + toExpression(field, b, variableExpressionGenerator) + ")";
+ return "(" + toExpression(baseType, field, a, variableExpressionGenerator) + ") " + operation + " (" + toExpression(baseType, field, b, variableExpressionGenerator) + ")";
}
} else if (term instanceof TernaryTerm) {
TernaryTerm tt = (TernaryTerm) term;
@@ -427,7 +467,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
Term a = tt.getA();
Term b = tt.getB();
Term c = tt.getC();
- return "((" + toExpression(field, a, variableExpressionGenerator) + ") ? " + toExpression(field, b, variableExpressionGenerator) + " : " + toExpression(field, c, variableExpressionGenerator) + ")";
+ return "((" + toExpression(baseType, field, a, variableExpressionGenerator) + ") ? " + toExpression(baseType, field, b, variableExpressionGenerator) + " : " + toExpression(baseType, field, c, variableExpressionGenerator) + ")";
} else {
throw new RuntimeException("Unsupported ternary operation type " + tt.getOperation());
}
@@ -436,8 +476,45 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
}
}
- public String toVariableParseExpression(Field field, Term term, Argument[] parserArguments) {
+ public String toVariableParseExpression(ComplexTypeDefinition baseType, Field field, Term term, Argument[] parserArguments) {
VariableLiteral vl = (VariableLiteral) term;
+ if("CAST".equals(vl.getName())) {
+
+ StringBuilder sb = new StringBuilder();
+ if((vl.getArgs() == null) || (vl.getArgs().size() != 2)) {
+ throw new RuntimeException("A CAST expression expects exactly two arguments.");
+ }
+ final VariableLiteral sourceTerm = (VariableLiteral) vl.getArgs().get(0);
+ final VariableLiteral typeTerm = (VariableLiteral) vl.getArgs().get(1);
+ ComplexTypeReference castTypeReference = typeTerm::getName;
+ final TypeDefinition castType = getTypeDefinitionForTypeReference(castTypeReference);
+ // If we're casting to a sub-type of a discriminated value, we got to cast to the parent
+ // type instead and add the name of the sub-type as prefix to the property we're tryging to
+ // access next.
+ String castToType;
+ String restExpression;
+ if(castType.getParentType() != null) {
+ castToType = castType.getParentType().getName();
+ if(vl.getChild() != null) {
+ // Change the name of the property to contain the sub-type-prefix.
+ restExpression = "." + camelCaseToSnakeCase(castType.getName()) + "_" + toVariableExpressionRest(vl.getChild());
+ } else {
+ restExpression = "";
+ }
+ } else {
+ castToType = castType.getName();
+ if(vl.getChild() != null) {
+ restExpression = "." + toVariableExpressionRest(vl.getChild());
+ } else {
+ restExpression = "";
+ }
+ }
+ sb.append("((plc4c_").append(getCTypeName(castToType)).append(") (")
+ .append(requiresPointerAccess(baseType, sourceTerm.getName()) ? "*" : "")
+ .append(toVariableParseExpression(baseType, field, sourceTerm, parserArguments)).append("))")
+ .append(restExpression);
+ return sb.toString();
+ }
// Any name that is full upper-case is considered a function call.
// These are generally defined in the spi file evaluation_helper.c.
// All should have a name prefix "plc4c_spi_evaluation_helper_".
@@ -450,7 +527,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
if (!firstArg) {
sb.append(", ");
}
- sb.append(toParseExpression(field, arg, parserArguments));
+ sb.append(toParseExpression(baseType, field, arg, parserArguments));
firstArg = false;
}
sb.append(")");
@@ -465,11 +542,11 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
// Try to find the type of the addressed property.
final Optional<TypeReference> propertyTypeOptional =
- getTypeReferenceForProperty((ComplexTypeDefinition) getThisTypeDefinition(), name);
+ getTypeReferenceForProperty(baseType, name);
// If we couldn't find the type, we didn't find the property.
if(!propertyTypeOptional.isPresent()) {
- throw new RuntimeException("Could not find property with name '" + name + "' in type " + getThisTypeDefinition().getName());
+ throw new RuntimeException("Could not find property with name '" + name + "' in type " + baseType.getName());
}
final TypeReference propertyType = propertyTypeOptional.get();
@@ -513,7 +590,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
return vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
}
- private String toVariableSerializationExpression(Field field, Term term, Argument[] serialzerArguments) {
+ private String toVariableSerializationExpression(ComplexTypeDefinition baseType, Field field, Term term, Argument[] serialzerArguments) {
VariableLiteral vl = (VariableLiteral) term;
if ("STATIC_CALL".equals(vl.getName())) {
StringBuilder sb = new StringBuilder();
@@ -568,7 +645,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
break;
}
} else {
- sb.append(toVariableSerializationExpression(field, va, null));
+ sb.append(toVariableSerializationExpression(baseType, field, va, null));
}
} else if (arg instanceof StringLiteral) {
sb.append(((StringLiteral) arg).getValue());
@@ -647,7 +724,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
break;
}
} else {
- sb.append(toVariableSerializationExpression(field, va, null));
+ sb.append(toVariableSerializationExpression(baseType, field, va, null));
}
} else if (arg instanceof StringLiteral) {
sb.append(((StringLiteral) arg).getValue());
@@ -700,7 +777,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
}
private String toVariableExpressionRest(VariableLiteral vl) {
- return "get" + WordUtils.capitalize(vl.getName()) + "()" + ((vl.isIndexed() ? "[" + vl.getIndex() + "]" : "") +
+ return camelCaseToSnakeCase(vl.getName()) + ((vl.isIndexed() ? "[" + vl.getIndex() + "]" : "") +
((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : ""));
}
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 6c5fe03..fd097e1 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
@@ -89,16 +89,17 @@ plc4c_${helper.getCTypeName(type.name)}_discriminator plc4c_${helper.getCTypeNam
</#if>
// Parse function.
-plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* buf, <#if type.parserArguments?has_content><#list type.parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !helper.isSimpleTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list>, </#if>plc4c_${helper.getCTypeName(type.name)}** message) {
+plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* buf, <#if type.parserArguments?has_content><#list type.parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !helper.isSimpleTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list>, </#if>plc4c_${helper.getCTypeName(type.name)}** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_${helper.getCTypeName(type.name)}* msg = malloc(sizeof(plc4c_${helper.getCTypeName(type.name)}));
+ (*_message) = malloc(sizeof(plc4c_${helper.getCTypeName(type.name)}));
<#if type.getPropertyFields()?has_content>
</#if>
-<#list type.fields as field>
+<#macro fieldName baseType field><#if baseType != type>${helper.camelCaseToSnakeCase(baseType.name)}_</#if>${helper.camelCaseToSnakeCase(field.name)}</#macro>
+<#macro fieldParser baseType field>
<#switch field.typeName>
<#case "array">
<#assign arrayField = field>
@@ -113,26 +114,37 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
{
<#if helper.isCountArrayField(field)>
// Count array
- uint8_t itemCount = ${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)};
+ uint8_t itemCount = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.parserArguments)};
for(int curItem = 0; curItem < itemCount; curItem++) {
- <#if !helper.isSimpleTypeReference(arrayField.type)>boolean lastItem = curItem == (itemCount - 1);</#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) -->
<#if helper.isSimpleTypeReference(arrayField.type)>
${helper.getLanguageTypeNameForTypeReference(arrayField.type)} value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
+ plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
<#else>
<#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
${helper.getLanguageTypeNameForField(field)}* value = NULL;
- plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${arrayField.name});
+ 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);
+ plc4c_utils_list_insert_head_value(&${arrayField.name}, value);
</#if>
plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
}
<#-- For a length array, we read data till the read position of the buffer reaches a given position -->
<#elseif helper.isLengthArrayField(field)>
// Length array
- uint8_t _${arrayField.name}Length = ${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)};
+ uint8_t _${arrayField.name}Length = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.parserArguments)};
uint8_t ${arrayField.name}EndPos = plc4c_spi_read_get_pos(buf) + _${arrayField.name}Length;
while(plc4c_spi_read_get_pos(buf) < ${arrayField.name}EndPos) {
- plc4c_utils_list_insert_head_value(&${arrayField.name}, <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${field.name})</#if>);
+ <#-- 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)>
+ ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
+ plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
+ <#else>
+ <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
+ ${helper.getLanguageTypeNameForField(field)}* value = NULL;
+ 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);
+ plc4c_utils_list_insert_head_value(&${arrayField.name}, value);
+ </#if>
<#-- After parsing, update the current position, but only if it's needed -->
<#if arrayField.loopExpression.contains("curPos")>
curPos = plc4c_spi_read_get_pos(buf) - startPos;
@@ -141,8 +153,17 @@ 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)>
// Terminated array
- while(!((boolean) (${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}))) {
- plc4c_utils_list_insert_head_value(&${arrayField.name}, <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(arrayField.type, parserArgument?index), true)}) (${helper.toParseExpression(arrayField, parserArgument, type.parserArguments)})<#sep>, </#s [...]
+ while(!((boolean) (${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.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)>
+ ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
+ plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
+ <#else>
+ <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
+ ${helper.getLanguageTypeNameForField(field)}* value = NULL;
+ 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);
+ plc4c_utils_list_insert_head_value(&${arrayField.name}, value);
+ </#if>
<#-- After parsing, update the current position, but only if it's needed -->
<#if arrayField.loopExpression.contains("curPos")>
curPos = plc4c_spi_read_get_pos(buf) - startPos;
@@ -150,6 +171,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
}
</#if>
}
+ (*_message)-><@fieldName baseType=baseType field=arrayField/> = ${arrayField.name};
<#break>
<#case "checksum">
<#assign checksumField = field>
@@ -160,7 +182,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
// Create an array of all the bytes read in this message element so far.
byte[] checksumRawData = plc4c_spi_read_get_bytes(buf, startPos, plc4c_spi_read_get_pos(buf));
${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getReadBufferReadMethodCall(checksumField.type)};
- ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(checksumField, checksumField.checksumExpression, type.parserArguments)});
+ ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, type.parserArguments)});
if(_checksum != _checksumRef) {
return PARSE_ERROR;
// throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
@@ -173,9 +195,9 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
// Const Field (${constField.name})
${helper.getLanguageTypeNameForField(field)} ${constField.name} = ${helper.getReadBufferReadMethodCall(constField.type)};
- if(${constField.name} != ${helper.getCTypeName(type.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case}) {
+ if(${constField.name} != ${helper.getCTypeName(baseType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case}) {
return PARSE_ERROR;
- // throw new ParseException("Expected constant value " + ${type.name}.${constField.name?upper_case} + " but got " + ${constField.name});
+ // throw new ParseException("Expected constant value " + ${helper.getCTypeName(baseType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case} + " but got " + ${constField.name});
}
<#break>
<#case "discriminator">
@@ -190,7 +212,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
// Enum field (${enumField.name})
${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(enumField.type))};
- msg->${helper.camelCaseToSnakeCase(enumField.name)} = ${enumField.name};
+ (*_message)-><@fieldName baseType=baseType field=enumField/> = ${enumField.name};
<#break>
<#case "implicit">
<#assign implicitField = field>
@@ -208,8 +230,8 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#assign manualField = field>
// Manual Field (${manualField.name})
- ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(manualField, manualField.parseExpression, type.parserArguments)});
- msg->${helper.camelCaseToSnakeCase(manualField.name)} = ${manualField.name};
+ ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, manualField, manualField.parseExpression, type.parserArguments)});
+ (*_message)-><@fieldName baseType=baseType field=manualField/> = ${manualField.name};
<#break>
<#case "optional">
<#assign optionalField = field>
@@ -218,26 +240,31 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#if optionalField.conditionExpression.contains("curPos")>
curPos = plc4c_spi_read_get_pos(buf) - startPos;
</#if>
- ${helper.getLanguageTypeNameForField(field)}<#if !helper.isSimpleTypeReference(optionalField.type)>*</#if> ${optionalField.name} = <#if !helper.isSimpleTypeReference(optionalField.type)>NULL<#else>0</#if>;
- if(${helper.toParseExpression(field, optionalField.conditionExpression, type.parserArguments)}) {
+ ${helper.getLanguageTypeNameForField(field)}* ${optionalField.name} = NULL;
+ if(${helper.toParseExpression(baseType, field, optionalField.conditionExpression, type.parserArguments)}) {
+ ${optionalField.name} = malloc(sizeof(${helper.getLanguageTypeNameForField(field)}));
+ if(${optionalField.name} == NULL) {
+ return NO_MEMORY;
+ }
<#if helper.isSimpleTypeReference(optionalField.type)>
- ${optionalField.name} = ${helper.getReadBufferReadMethodCall(optionalField.type)};
+ *${optionalField.name} = ${helper.getReadBufferReadMethodCall(optionalField.type)};
<#else>
- plc4c_${helper.getCTypeName(optionalField.type.name)}* ${field.name} = NULL;
- plc4c_${helper.getCTypeName(optionalField.type.name)}_parse(buf<#if optionalField.params?has_content>, <#list optionalField.params as parserTerm>${helper.toParseExpression(optionalField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, &${field.name});
+ 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>
- msg->${helper.camelCaseToSnakeCase(optionalField.name)} = ${optionalField.name};
+ (*_message)-><@fieldName baseType=baseType field=optionalField/> = ${optionalField.name};
}
<#break>
<#case "padding">
<#assign paddingField = field>
<#assign simpleTypeReference = paddingField.type>
- // Padding Field (${paddingField.name})
- bool _${paddingField.name}NeedsPadding = (bool) ((plc4c_spi_read_has_more(buf, ${helper.getNumBits(paddingField.type)})) && (${helper.toParseExpression(paddingField, paddingField.paddingCondition, type.parserArguments)}));
- if(_${paddingField.name}NeedsPadding) {
- // Just read the padding data and ignore it
- ${helper.getReadBufferReadMethodCall(paddingField.type)};
+ // Padding Field (padding)
+ {
+ bool _needsPadding = (bool) ((plc4c_spi_read_has_more(buf, ${helper.getNumBits(paddingField.type)})) && (${helper.toParseExpression(baseType, paddingField, paddingField.paddingCondition, type.parserArguments)}));
+ if(_needsPadding) {
+ // Just read the padding data and ignore it
+ ${helper.getReadBufferReadMethodCall(paddingField.type)};
+ }
}
<#break>
<#case "reserved">
@@ -261,20 +288,19 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = ${helper.getReadBufferReadMethodCall(simpleField.type)};
<#else>
<#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
- ${helper.getLanguageTypeNameForField(field)}* ${simpleField.name} = NULL;
- plc4c_${helper.getCTypeName(simpleField.type.name)}_parse(buf<#if simpleField.params?has_content>, <#list simpleField.params as parserTerm>${helper.toParseExpression(simpleField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
+ ${helper.getLanguageTypeNameForField(field)} ${simpleField.name};
+ 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>
- msg->${helper.camelCaseToSnakeCase(simpleField.name)} = ${simpleField.name};
+ (*_message)-><@fieldName baseType=baseType field=simpleField/> = ${simpleField.name};
<#break>
<#case "switch">
<#assign switchField = field>
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
<#list switchField.cases as case>
- <#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue><#if case.discriminatorValues?size > 1>(</#if>${helper.toVariableParseExpression(switchField, switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == ${discriminatorValue}<#if case.discriminatorValues?size > 1>)</#if><#sep> && </#sep></#list>) </#if>{ /* ${case.name} */
- <#list case.propertyFields as caseField>
- ${helper.getLanguageTypeNameForField(caseField)}<#if !helper.isSimpleTypeReference(caseField.type)>*</#if> ${caseField.name}<#if field.loopType??>${helper.getLoopExpressionSuffix(caseField)}</#if><#if helper.getLanguageTypeNameForField(caseField) == "plc4c_list"><#elseif !helper.isSimpleTypeReference(caseField.type)> = NULL<#else> = -1</#if>;
- msg->${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)} = ${caseField.name};
+ <#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue><#if case.discriminatorValues?size > 1>(</#if>${helper.toVariableParseExpression(baseType, switchField, switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == ${discriminatorValue}<#if case.discriminatorValues?size > 1>)</#if><#sep> && </#sep></#list>) </#if>{ /* ${case.name} */
+ <#list case.fields as caseField>
+ <@fieldParser baseType=case field=caseField/>
<#sep >
</#list>
@@ -285,9 +311,12 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
<#assign virtualField = field>
// Virtual field (Just declare a local variable so we can access it in the parser)
- ${helper.getLanguageTypeNameForField(field)} ${virtualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(virtualField, virtualField.valueExpression, type.parserArguments)});
+ ${helper.getLanguageTypeNameForField(field)} ${virtualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, virtualField, virtualField.valueExpression, type.parserArguments)});
<#break>
</#switch>
+</#macro>
+<#list type.fields as field>
+<@fieldParser baseType=type field=field />
</#list>
return OK;
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 3acf661..bb86055 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
@@ -25,22 +25,7 @@
<#-- @ftlvariable name="helper" type="org.apache.plc4x.language.c.CLanguageTemplateHelper" -->
<#-- @ftlvariable name="type" type="org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition" -->
<#-- Declare the name and type of variables declared locally inside the template -->
-<#-- @ftlvariable name="arrayField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ArrayField" -->
-<#-- @ftlvariable name="checksumField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ChecksumField" -->
-<#-- @ftlvariable name="constField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ConstField" -->
-<#-- @ftlvariable name="discriminatorField" type="org.apache.plc4x.plugins.codegenerator.types.fields.DiscriminatorField" -->
-<#-- @ftlvariable name="enumField" type="org.apache.plc4x.plugins.codegenerator.types.fields.EnumField" -->
-<#-- @ftlvariable name="implicitField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ImplicitField" -->
-<#-- @ftlvariable name="manualArrayField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ManualArrayField" -->
-<#-- @ftlvariable name="manualField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ManualField" -->
-<#-- @ftlvariable name="optionalField" type="org.apache.plc4x.plugins.codegenerator.types.fields.OptionalField" -->
-<#-- @ftlvariable name="paddingField" type="org.apache.plc4x.plugins.codegenerator.types.fields.PaddingField" -->
-<#-- @ftlvariable name="reservedField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ReservedField" -->
-<#-- @ftlvariable name="simpleField" type="org.apache.plc4x.plugins.codegenerator.types.fields.SimpleField" -->
-<#-- @ftlvariable name="switchField" type="org.apache.plc4x.plugins.codegenerator.types.fields.SwitchField" -->
-<#-- @ftlvariable name="virtualField" type="org.apache.plc4x.plugins.codegenerator.types.fields.VirtualField" -->
-<#-- @ftlvariable name="simpleTypeReference" type="org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference" -->
-<#-- @ftlvariable name="complexTypeReference" type="org.apache.plc4x.plugins.codegenerator.types.references.ComplexTypeReference" -->
+<#-- @ftlvariable name="field" type="org.apache.plc4x.plugins.codegenerator.types.fields.NamedField" -->
<#if !helper.isDiscriminatedChildTypeDefinition(type)>${helper.getIncludesDirectory()?replace(".", "/")}/${helper.camelCaseToSnakeCase(type.name)}.h
/*
Licensed to the Apache Software Foundation (ASF) under one
@@ -110,11 +95,11 @@ plc4c_${helper.getCTypeName(type.name)}_discriminator plc4c_${helper.getCTypeNam
When using const fields, output the constant reference values
as global const values so we can use them elsewhere.
-->
-<#if type.constFields?has_content>
+<#if helper.getAllConstFields()?has_content>
// Constant values.
- <#list type.constFields as field>
-const ${helper.getLanguageTypeNameForField(field)} ${helper.getCTypeName(type.name)?upper_case}_${helper.camelCaseToSnakeCase(field.name)?upper_case} = ${field.referenceValue};
+ <#list helper.getAllConstFields() as parentType, constField>
+const ${helper.getLanguageTypeNameForField(constField)} ${helper.getCTypeName(parentType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case} = ${constField.referenceValue};
</#list>
</#if>
@@ -133,15 +118,21 @@ struct plc4c_${helper.getCTypeName(type.name)} {
<#list field.cases as case>
struct { /* ${case.name} */
<#list case.propertyFields as caseField>
- ${helper.getLanguageTypeNameForField(caseField)}<#if !helper.isSimpleTypeReference(caseField.type)>*</#if> ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)}${helper.getTypeSizeForField(caseField)}<#if field.loopType??>${helper.getLoopExpressionSuffix(caseField)}</#if>;
+ <#if helper.isOptionalField(caseField)>
+ ${helper.getLanguageTypeNameForField(caseField)}* ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)};
+ <#else>
+ ${helper.getLanguageTypeNameForField(caseField)} ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)}${helper.getTypeSizeForField(caseField)}<#if field.loopType??>${helper.getLoopExpressionSuffix(caseField)}</#if>;
+ </#if>
</#list>
};
</#list>
};
<#elseif helper.isEnumField(field)>
${helper.getLanguageTypeNameForField(field)} ${helper.camelCaseToSnakeCase(field.name)};
+ <#elseif helper.isOptionalField(field)>
+ ${helper.getLanguageTypeNameForField(field)}* ${helper.camelCaseToSnakeCase(field.name)};
<#else>
- ${helper.getLanguageTypeNameForField(field)}<#if !helper.isSimpleTypeReference(field.type)>*</#if> ${helper.camelCaseToSnakeCase(field.name)}${helper.getTypeSizeForField(field)}<#if field.loopType??>${helper.getLoopExpressionSuffix(field)}</#if>;
+ ${helper.getLanguageTypeNameForField(field)} ${helper.camelCaseToSnakeCase(field.name)}${helper.getTypeSizeForField(field)}<#if field.loopType??>${helper.getLoopExpressionSuffix(field)}</#if>;
</#if>
</#list>
};
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
index 8623cd7..38877d9 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
@@ -179,16 +179,16 @@ struct plc4c_modbus_read_write_modbus_pdu {
plc4c_list modbus_pdu_read_fifo_queue_response_fifo_value;
};
struct { /* ModbusPDUReadFileRecordRequest */
- plc4c_list* modbus_pdu_read_file_record_request_items;
+ plc4c_list modbus_pdu_read_file_record_request_items;
};
struct { /* ModbusPDUReadFileRecordResponse */
- plc4c_list* modbus_pdu_read_file_record_response_items;
+ plc4c_list modbus_pdu_read_file_record_response_items;
};
struct { /* ModbusPDUWriteFileRecordRequest */
- plc4c_list* modbus_pdu_write_file_record_request_items;
+ plc4c_list modbus_pdu_write_file_record_request_items;
};
struct { /* ModbusPDUWriteFileRecordResponse */
- plc4c_list* modbus_pdu_write_file_record_response_items;
+ plc4c_list modbus_pdu_write_file_record_response_items;
};
struct { /* ModbusPDUReadExceptionStatusRequest */
};
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..cf97b06 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
@@ -32,7 +32,7 @@ struct plc4c_modbus_read_write_modbus_serial_adu {
uint16_t transaction_id;
uint16_t length;
uint8_t address;
- plc4c_modbus_read_write_modbus_pdu* pdu;
+ plc4c_modbus_read_write_modbus_pdu pdu;
};
typedef struct plc4c_modbus_read_write_modbus_serial_adu plc4c_modbus_read_write_modbus_serial_adu;
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..61418c1 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
@@ -35,7 +35,7 @@ struct plc4c_modbus_read_write_modbus_tcp_adu {
uint16_t transaction_identifier;
uint16_t protocol_identifier;
uint8_t unit_identifier;
- plc4c_modbus_read_write_modbus_pdu* pdu;
+ plc4c_modbus_read_write_modbus_pdu pdu;
};
typedef struct plc4c_modbus_read_write_modbus_tcp_adu plc4c_modbus_read_write_modbus_tcp_adu;
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
index 7bf422b..733739a 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
@@ -24,18 +24,18 @@
#include "modbus_constants.h"
// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_constants_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_constants** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_constants_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_constants** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_modbus_read_write_modbus_constants* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_constants));
+ (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_constants));
// Const Field (modbusTcpDefaultPort)
uint16_t modbusTcpDefaultPort = plc4c_spi_read_unsigned_int(buf, 16);
if(modbusTcpDefaultPort != MODBUS_READ_WRITE_MODBUS_CONSTANTS_MODBUS_TCP_DEFAULT_PORT) {
return PARSE_ERROR;
- // throw new ParseException("Expected constant value " + ModbusConstants.MODBUSTCPDEFAULTPORT + " but got " + modbusTcpDefaultPort);
+ // throw new ParseException("Expected constant value " + MODBUS_READ_WRITE_MODBUS_CONSTANTS_MODBUS_TCP_DEFAULT_PORT + " but got " + modbusTcpDefaultPort);
}
return OK;
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
index 8843dd8..3f185c9 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
@@ -107,12 +107,12 @@ plc4c_modbus_read_write_modbus_pdu_discriminator plc4c_modbus_read_write_modbus_
}
// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_pdu** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_pdu** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_modbus_read_write_modbus_pdu* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu));
+ (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu));
// Discriminator Field (error) (Used as input to a switch field)
bool error = plc4c_spi_read_bit(buf);
@@ -122,212 +122,540 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
if(error == true) { /* ModbusPDUError */
- uint8_t exceptionCode = -1;
- msg->modbus_pdu_error_exception_code = exceptionCode;
+
+ // Simple Field (exceptionCode)
+ uint8_t exceptionCode = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->modbus_pdu_error_exception_code = exceptionCode;
} else
if((error == false) && (function == 0x02) && (response == false)) { /* ModbusPDUReadDiscreteInputsRequest */
- uint16_t startingAddress = -1;
- msg->modbus_pdu_read_discrete_inputs_request_starting_address = startingAddress;
- uint16_t quantity = -1;
- msg->modbus_pdu_read_discrete_inputs_request_quantity = quantity;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_discrete_inputs_request_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_discrete_inputs_request_quantity = quantity;
} else
if((error == false) && (function == 0x02) && (response == true)) { /* ModbusPDUReadDiscreteInputsResponse */
- plc4c_list value;
- msg->modbus_pdu_read_discrete_inputs_response_value = value;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (value)
+ plc4c_list value;
+ {
+ // Count array
+ uint8_t itemCount = byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ }
+ }
+ (*_message)->modbus_pdu_read_discrete_inputs_response_value = value;
} else
if((error == false) && (function == 0x01) && (response == false)) { /* ModbusPDUReadCoilsRequest */
- uint16_t startingAddress = -1;
- msg->modbus_pdu_read_coils_request_starting_address = startingAddress;
- uint16_t quantity = -1;
- msg->modbus_pdu_read_coils_request_quantity = quantity;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_coils_request_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_coils_request_quantity = quantity;
} else
if((error == false) && (function == 0x01) && (response == true)) { /* ModbusPDUReadCoilsResponse */
- plc4c_list value;
- msg->modbus_pdu_read_coils_response_value = value;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (value)
+ plc4c_list value;
+ {
+ // Count array
+ uint8_t itemCount = byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ }
+ }
+ (*_message)->modbus_pdu_read_coils_response_value = value;
} else
if((error == false) && (function == 0x05) && (response == false)) { /* ModbusPDUWriteSingleCoilRequest */
- uint16_t address = -1;
- msg->modbus_pdu_write_single_coil_request_address = address;
- uint16_t value = -1;
- msg->modbus_pdu_write_single_coil_request_value = value;
+ // Simple Field (address)
+ uint16_t address = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_single_coil_request_address = address;
+
+
+ // Simple Field (value)
+ uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_single_coil_request_value = value;
} else
if((error == false) && (function == 0x05) && (response == true)) { /* ModbusPDUWriteSingleCoilResponse */
- uint16_t address = -1;
- msg->modbus_pdu_write_single_coil_response_address = address;
- uint16_t value = -1;
- msg->modbus_pdu_write_single_coil_response_value = value;
+ // Simple Field (address)
+ uint16_t address = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_single_coil_response_address = address;
+
+
+ // Simple Field (value)
+ uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_single_coil_response_value = value;
} else
if((error == false) && (function == 0x0F) && (response == false)) { /* ModbusPDUWriteMultipleCoilsRequest */
- uint16_t startingAddress = -1;
- msg->modbus_pdu_write_multiple_coils_request_starting_address = startingAddress;
- uint16_t quantity = -1;
- msg->modbus_pdu_write_multiple_coils_request_quantity = quantity;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_multiple_coils_request_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_multiple_coils_request_quantity = quantity;
+
- plc4c_list value;
- msg->modbus_pdu_write_multiple_coils_request_value = value;
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (value)
+ plc4c_list value;
+ {
+ // Count array
+ uint8_t itemCount = byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ }
+ }
+ (*_message)->modbus_pdu_write_multiple_coils_request_value = value;
} else
if((error == false) && (function == 0x0F) && (response == true)) { /* ModbusPDUWriteMultipleCoilsResponse */
- uint16_t startingAddress = -1;
- msg->modbus_pdu_write_multiple_coils_response_starting_address = startingAddress;
- uint16_t quantity = -1;
- msg->modbus_pdu_write_multiple_coils_response_quantity = quantity;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_multiple_coils_response_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_multiple_coils_response_quantity = quantity;
} else
if((error == false) && (function == 0x04) && (response == false)) { /* ModbusPDUReadInputRegistersRequest */
- uint16_t startingAddress = -1;
- msg->modbus_pdu_read_input_registers_request_starting_address = startingAddress;
- uint16_t quantity = -1;
- msg->modbus_pdu_read_input_registers_request_quantity = quantity;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_input_registers_request_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_input_registers_request_quantity = quantity;
} else
if((error == false) && (function == 0x04) && (response == true)) { /* ModbusPDUReadInputRegistersResponse */
- plc4c_list value;
- msg->modbus_pdu_read_input_registers_response_value = value;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (value)
+ plc4c_list value;
+ {
+ // Count array
+ uint8_t itemCount = byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ }
+ }
+ (*_message)->modbus_pdu_read_input_registers_response_value = value;
} else
if((error == false) && (function == 0x03) && (response == false)) { /* ModbusPDUReadHoldingRegistersRequest */
- uint16_t startingAddress = -1;
- msg->modbus_pdu_read_holding_registers_request_starting_address = startingAddress;
- uint16_t quantity = -1;
- msg->modbus_pdu_read_holding_registers_request_quantity = quantity;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_holding_registers_request_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_holding_registers_request_quantity = quantity;
} else
if((error == false) && (function == 0x03) && (response == true)) { /* ModbusPDUReadHoldingRegistersResponse */
- plc4c_list value;
- msg->modbus_pdu_read_holding_registers_response_value = value;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (value)
+ plc4c_list value;
+ {
+ // Count array
+ uint8_t itemCount = byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ }
+ }
+ (*_message)->modbus_pdu_read_holding_registers_response_value = value;
} else
if((error == false) && (function == 0x06) && (response == false)) { /* ModbusPDUWriteSingleRegisterRequest */
- uint16_t address = -1;
- msg->modbus_pdu_write_single_register_request_address = address;
- uint16_t value = -1;
- msg->modbus_pdu_write_single_register_request_value = value;
+ // Simple Field (address)
+ uint16_t address = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_single_register_request_address = address;
+
+
+ // Simple Field (value)
+ uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_single_register_request_value = value;
} else
if((error == false) && (function == 0x06) && (response == true)) { /* ModbusPDUWriteSingleRegisterResponse */
- uint16_t address = -1;
- msg->modbus_pdu_write_single_register_response_address = address;
- uint16_t value = -1;
- msg->modbus_pdu_write_single_register_response_value = value;
+ // Simple Field (address)
+ uint16_t address = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_single_register_response_address = address;
+
+
+ // Simple Field (value)
+ uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_single_register_response_value = value;
} else
if((error == false) && (function == 0x10) && (response == false)) { /* ModbusPDUWriteMultipleHoldingRegistersRequest */
- uint16_t startingAddress = -1;
- msg->modbus_pdu_write_multiple_holding_registers_request_starting_address = startingAddress;
- uint16_t quantity = -1;
- msg->modbus_pdu_write_multiple_holding_registers_request_quantity = quantity;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_multiple_holding_registers_request_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_multiple_holding_registers_request_quantity = quantity;
+
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
- plc4c_list value;
- msg->modbus_pdu_write_multiple_holding_registers_request_value = value;
+
+ // Array field (value)
+ plc4c_list value;
+ {
+ // Count array
+ uint8_t itemCount = byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ }
+ }
+ (*_message)->modbus_pdu_write_multiple_holding_registers_request_value = value;
} else
if((error == false) && (function == 0x10) && (response == true)) { /* ModbusPDUWriteMultipleHoldingRegistersResponse */
- uint16_t startingAddress = -1;
- msg->modbus_pdu_write_multiple_holding_registers_response_starting_address = startingAddress;
- uint16_t quantity = -1;
- msg->modbus_pdu_write_multiple_holding_registers_response_quantity = quantity;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_multiple_holding_registers_response_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_write_multiple_holding_registers_response_quantity = quantity;
} else
if((error == false) && (function == 0x17) && (response == false)) { /* ModbusPDUReadWriteMultipleHoldingRegistersRequest */
- uint16_t readStartingAddress = -1;
- msg->modbus_pdu_read_write_multiple_holding_registers_request_read_starting_address = readStartingAddress;
- uint16_t readQuantity = -1;
- msg->modbus_pdu_read_write_multiple_holding_registers_request_read_quantity = readQuantity;
+ // Simple Field (readStartingAddress)
+ uint16_t readStartingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_read_starting_address = readStartingAddress;
+
- uint16_t writeStartingAddress = -1;
- msg->modbus_pdu_read_write_multiple_holding_registers_request_write_starting_address = writeStartingAddress;
+ // Simple Field (readQuantity)
+ uint16_t readQuantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_read_quantity = readQuantity;
- uint16_t writeQuantity = -1;
- msg->modbus_pdu_read_write_multiple_holding_registers_request_write_quantity = writeQuantity;
- plc4c_list value;
- msg->modbus_pdu_read_write_multiple_holding_registers_request_value = value;
+ // Simple Field (writeStartingAddress)
+ uint16_t writeStartingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_write_starting_address = writeStartingAddress;
+
+
+ // Simple Field (writeQuantity)
+ uint16_t writeQuantity = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_write_quantity = writeQuantity;
+
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (value)
+ plc4c_list value;
+ {
+ // Count array
+ uint8_t itemCount = byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ }
+ }
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_value = value;
} else
if((error == false) && (function == 0x17) && (response == true)) { /* ModbusPDUReadWriteMultipleHoldingRegistersResponse */
- plc4c_list value;
- msg->modbus_pdu_read_write_multiple_holding_registers_response_value = value;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (value)
+ plc4c_list value;
+ {
+ // Count array
+ uint8_t itemCount = byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ }
+ }
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_response_value = value;
} else
if((error == false) && (function == 0x16) && (response == false)) { /* ModbusPDUMaskWriteHoldingRegisterRequest */
- uint16_t referenceAddress = -1;
- msg->modbus_pdu_mask_write_holding_register_request_reference_address = referenceAddress;
- uint16_t andMask = -1;
- msg->modbus_pdu_mask_write_holding_register_request_and_mask = andMask;
+ // Simple Field (referenceAddress)
+ uint16_t referenceAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_mask_write_holding_register_request_reference_address = referenceAddress;
+
+
+ // Simple Field (andMask)
+ uint16_t andMask = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_mask_write_holding_register_request_and_mask = andMask;
- uint16_t orMask = -1;
- msg->modbus_pdu_mask_write_holding_register_request_or_mask = orMask;
+
+ // Simple Field (orMask)
+ uint16_t orMask = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_mask_write_holding_register_request_or_mask = orMask;
} else
if((error == false) && (function == 0x16) && (response == true)) { /* ModbusPDUMaskWriteHoldingRegisterResponse */
- uint16_t referenceAddress = -1;
- msg->modbus_pdu_mask_write_holding_register_response_reference_address = referenceAddress;
- uint16_t andMask = -1;
- msg->modbus_pdu_mask_write_holding_register_response_and_mask = andMask;
+ // Simple Field (referenceAddress)
+ uint16_t referenceAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_mask_write_holding_register_response_reference_address = referenceAddress;
+
+
+ // Simple Field (andMask)
+ uint16_t andMask = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_mask_write_holding_register_response_and_mask = andMask;
- uint16_t orMask = -1;
- msg->modbus_pdu_mask_write_holding_register_response_or_mask = orMask;
+
+ // Simple Field (orMask)
+ uint16_t orMask = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_mask_write_holding_register_response_or_mask = orMask;
} else
if((error == false) && (function == 0x18) && (response == false)) { /* ModbusPDUReadFifoQueueRequest */
- uint16_t fifoPointerAddress = -1;
- msg->modbus_pdu_read_fifo_queue_request_fifo_pointer_address = fifoPointerAddress;
+
+ // Simple Field (fifoPointerAddress)
+ uint16_t fifoPointerAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_read_fifo_queue_request_fifo_pointer_address = fifoPointerAddress;
} else
if((error == false) && (function == 0x18) && (response == true)) { /* ModbusPDUReadFifoQueueResponse */
- plc4c_list fifoValue;
- msg->modbus_pdu_read_fifo_queue_response_fifo_value = fifoValue;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint16_t byteCount = plc4c_spi_read_unsigned_int(buf, 16);
+
+
+ // Implicit Field (fifoCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint16_t fifoCount = plc4c_spi_read_unsigned_int(buf, 16);
+
+
+ // Array field (fifoValue)
+ plc4c_list fifoValue;
+ {
+ // Count array
+ uint8_t itemCount = fifoCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+ plc4c_utils_list_insert_head_value(&fifoValue, &value);
+ plc4c_utils_list_insert_head_value(&fifoValue, &value);
+ }
+ }
+ (*_message)->modbus_pdu_read_fifo_queue_response_fifo_value = fifoValue;
} else
if((error == false) && (function == 0x14) && (response == false)) { /* ModbusPDUReadFileRecordRequest */
- plc4c_list* items;
- msg->modbus_pdu_read_file_record_request_items = items;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Length array
+ uint8_t _itemsLength = byteCount;
+ uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
+ while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
+ plc4c_list* value = NULL;
+ plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(buf, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ }
+ }
+ (*_message)->modbus_pdu_read_file_record_request_items = items;
} else
if((error == false) && (function == 0x14) && (response == true)) { /* ModbusPDUReadFileRecordResponse */
- plc4c_list* items;
- msg->modbus_pdu_read_file_record_response_items = items;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Length array
+ uint8_t _itemsLength = byteCount;
+ uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
+ while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
+ plc4c_list* value = NULL;
+ plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(buf, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ }
+ }
+ (*_message)->modbus_pdu_read_file_record_response_items = items;
} else
if((error == false) && (function == 0x15) && (response == false)) { /* ModbusPDUWriteFileRecordRequest */
- plc4c_list* items;
- msg->modbus_pdu_write_file_record_request_items = items;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Length array
+ uint8_t _itemsLength = byteCount;
+ uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
+ while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
+ plc4c_list* value = NULL;
+ plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(buf, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ }
+ }
+ (*_message)->modbus_pdu_write_file_record_request_items = items;
} else
if((error == false) && (function == 0x15) && (response == true)) { /* ModbusPDUWriteFileRecordResponse */
- plc4c_list* items;
- msg->modbus_pdu_write_file_record_response_items = items;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Length array
+ uint8_t _itemsLength = byteCount;
+ uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
+ while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
+ plc4c_list* value = NULL;
+ plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(buf, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ }
+ }
+ (*_message)->modbus_pdu_write_file_record_response_items = items;
} else
if((error == false) && (function == 0x07) && (response == false)) { /* ModbusPDUReadExceptionStatusRequest */
} else
if((error == false) && (function == 0x07) && (response == true)) { /* ModbusPDUReadExceptionStatusResponse */
- uint8_t value = -1;
- msg->modbus_pdu_read_exception_status_response_value = value;
+
+ // Simple Field (value)
+ uint8_t value = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->modbus_pdu_read_exception_status_response_value = value;
} else
if((error == false) && (function == 0x08) && (response == false)) { /* ModbusPDUDiagnosticRequest */
- uint16_t status = -1;
- msg->modbus_pdu_diagnostic_request_status = status;
- uint16_t eventCount = -1;
- msg->modbus_pdu_diagnostic_request_event_count = eventCount;
+ // Simple Field (status)
+ uint16_t status = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_diagnostic_request_status = status;
+
+
+ // Simple Field (eventCount)
+ uint16_t eventCount = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_diagnostic_request_event_count = eventCount;
} else
if((error == false) && (function == 0x0C) && (response == false)) { /* ModbusPDUGetComEventLogRequest */
} else
if((error == false) && (function == 0x0C) && (response == true)) { /* ModbusPDUGetComEventLogResponse */
- uint16_t status = -1;
- msg->modbus_pdu_get_com_event_log_response_status = status;
- uint16_t eventCount = -1;
- msg->modbus_pdu_get_com_event_log_response_event_count = eventCount;
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Simple Field (status)
+ uint16_t status = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_get_com_event_log_response_status = status;
+
+
+ // Simple Field (eventCount)
+ uint16_t eventCount = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_get_com_event_log_response_event_count = eventCount;
- uint16_t messageCount = -1;
- msg->modbus_pdu_get_com_event_log_response_message_count = messageCount;
- plc4c_list events;
- msg->modbus_pdu_get_com_event_log_response_events = events;
+ // Simple Field (messageCount)
+ uint16_t messageCount = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->modbus_pdu_get_com_event_log_response_message_count = messageCount;
+
+
+ // Array field (events)
+ plc4c_list events;
+ {
+ // Count array
+ uint8_t itemCount = (byteCount) - (6);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&events, &value);
+ plc4c_utils_list_insert_head_value(&events, &value);
+ }
+ }
+ (*_message)->modbus_pdu_get_com_event_log_response_events = events;
} else
if((error == false) && (function == 0x11) && (response == false)) { /* ModbusPDUReportServerIdRequest */
} else
if((error == false) && (function == 0x11) && (response == true)) { /* ModbusPDUReportServerIdResponse */
- plc4c_list value;
- msg->modbus_pdu_report_server_id_response_value = value;
+
+ // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (value)
+ plc4c_list value;
+ {
+ // Count array
+ uint8_t itemCount = byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ int8_t value = plc4c_spi_read_byte(buf, 8);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ plc4c_utils_list_insert_head_value(&value, &value);
+ }
+ }
+ (*_message)->modbus_pdu_report_server_id_response_value = value;
} else
if((error == false) && (function == 0x2B) && (response == false)) { /* ModbusPDUReadDeviceIdentificationRequest */
} else
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 dde8ef1..c679f76 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
@@ -24,29 +24,29 @@
#include "modbus_pdu_read_file_record_request_item.h"
// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item));
+ (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item));
// Simple Field (referenceType)
uint8_t referenceType = plc4c_spi_read_unsigned_short(buf, 8);
- msg->reference_type = referenceType;
+ (*_message)->reference_type = referenceType;
// Simple Field (fileNumber)
uint16_t fileNumber = plc4c_spi_read_unsigned_int(buf, 16);
- msg->file_number = fileNumber;
+ (*_message)->file_number = fileNumber;
// Simple Field (recordNumber)
uint16_t recordNumber = plc4c_spi_read_unsigned_int(buf, 16);
- msg->record_number = recordNumber;
+ (*_message)->record_number = recordNumber;
// Simple Field (recordLength)
uint16_t recordLength = plc4c_spi_read_unsigned_int(buf, 16);
- msg->record_length = recordLength;
+ (*_message)->record_length = recordLength;
return OK;
}
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 c90b073..6b582e0 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
@@ -24,12 +24,12 @@
#include "modbus_pdu_read_file_record_response_item.h"
// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item));
+ (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item));
// Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -37,7 +37,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
// Simple Field (referenceType)
uint8_t referenceType = plc4c_spi_read_unsigned_short(buf, 8);
- msg->reference_type = referenceType;
+ (*_message)->reference_type = referenceType;
// Array field (data)
plc4c_list data;
@@ -46,9 +46,11 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
uint8_t _dataLength = (dataLength) - (1);
uint8_t dataEndPos = plc4c_spi_read_get_pos(buf) + _dataLength;
while(plc4c_spi_read_get_pos(buf) < dataEndPos) {
- plc4c_utils_list_insert_head_value(&data, plc4c_spi_read_unsigned_int(buf, 16));
+ uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+ plc4c_utils_list_insert_head_value(&data, &value);
}
}
+ (*_message)->data = data;
return OK;
}
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 1ff3404..d1ef483 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
@@ -24,25 +24,25 @@
#include "modbus_pdu_write_file_record_request_item.h"
// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item));
+ (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item));
// Simple Field (referenceType)
uint8_t referenceType = plc4c_spi_read_unsigned_short(buf, 8);
- msg->reference_type = referenceType;
+ (*_message)->reference_type = referenceType;
// Simple Field (fileNumber)
uint16_t fileNumber = plc4c_spi_read_unsigned_int(buf, 16);
- msg->file_number = fileNumber;
+ (*_message)->file_number = fileNumber;
// Simple Field (recordNumber)
uint16_t recordNumber = plc4c_spi_read_unsigned_int(buf, 16);
- msg->record_number = recordNumber;
+ (*_message)->record_number = recordNumber;
// Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
uint16_t recordLength = plc4c_spi_read_unsigned_int(buf, 16);
@@ -54,9 +54,11 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
uint8_t _recordDataLength = (recordLength) * (2);
uint8_t recordDataEndPos = plc4c_spi_read_get_pos(buf) + _recordDataLength;
while(plc4c_spi_read_get_pos(buf) < recordDataEndPos) {
- plc4c_utils_list_insert_head_value(&recordData, plc4c_spi_read_unsigned_int(buf, 16));
+ uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+ plc4c_utils_list_insert_head_value(&recordData, &value);
}
}
+ (*_message)->record_data = recordData;
return OK;
}
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 d577f3e..bbcfc0a 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
@@ -24,25 +24,25 @@
#include "modbus_pdu_write_file_record_response_item.h"
// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item));
+ (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item));
// Simple Field (referenceType)
uint8_t referenceType = plc4c_spi_read_unsigned_short(buf, 8);
- msg->reference_type = referenceType;
+ (*_message)->reference_type = referenceType;
// Simple Field (fileNumber)
uint16_t fileNumber = plc4c_spi_read_unsigned_int(buf, 16);
- msg->file_number = fileNumber;
+ (*_message)->file_number = fileNumber;
// Simple Field (recordNumber)
uint16_t recordNumber = plc4c_spi_read_unsigned_int(buf, 16);
- msg->record_number = recordNumber;
+ (*_message)->record_number = recordNumber;
// Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
uint16_t recordLength = plc4c_spi_read_unsigned_int(buf, 16);
@@ -54,9 +54,11 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
uint8_t _recordDataLength = (recordLength) * (2);
uint8_t recordDataEndPos = plc4c_spi_read_get_pos(buf) + _recordDataLength;
while(plc4c_spi_read_get_pos(buf) < recordDataEndPos) {
- plc4c_utils_list_insert_head_value(&recordData, plc4c_spi_read_unsigned_int(buf, 16));
+ uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+ plc4c_utils_list_insert_head_value(&recordData, &value);
}
}
+ (*_message)->record_data = recordData;
return OK;
}
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 cbfca8d..37bc4cb 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
@@ -24,17 +24,17 @@
#include "modbus_serial_adu.h"
// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_serial_adu** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_serial_adu** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_modbus_read_write_modbus_serial_adu* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_serial_adu));
+ (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_serial_adu));
// Simple Field (transactionId)
uint16_t transactionId = plc4c_spi_read_unsigned_int(buf, 16);
- msg->transaction_id = transactionId;
+ (*_message)->transaction_id = transactionId;
// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
{
@@ -46,16 +46,16 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read
// Simple Field (length)
uint16_t length = plc4c_spi_read_unsigned_int(buf, 16);
- msg->length = length;
+ (*_message)->length = length;
// Simple Field (address)
uint8_t address = plc4c_spi_read_unsigned_short(buf, 8);
- msg->address = address;
+ (*_message)->address = address;
// Simple Field (pdu)
- plc4c_modbus_read_write_modbus_pdu* pdu = NULL;
+ plc4c_modbus_read_write_modbus_pdu pdu;
plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
- msg->pdu = pdu;
+ (*_message)->pdu = pdu;
return OK;
}
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 2f1f058..5756ede 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
@@ -24,23 +24,23 @@
#include "modbus_tcp_adu.h"
// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_tcp_adu** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_tcp_adu** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_modbus_read_write_modbus_tcp_adu* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_tcp_adu));
+ (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_tcp_adu));
// Simple Field (transactionIdentifier)
uint16_t transactionIdentifier = plc4c_spi_read_unsigned_int(buf, 16);
- msg->transaction_identifier = transactionIdentifier;
+ (*_message)->transaction_identifier = transactionIdentifier;
// Const Field (protocolIdentifier)
uint16_t protocolIdentifier = plc4c_spi_read_unsigned_int(buf, 16);
if(protocolIdentifier != MODBUS_READ_WRITE_MODBUS_TCP_ADU_PROTOCOL_IDENTIFIER) {
return PARSE_ERROR;
- // throw new ParseException("Expected constant value " + ModbusTcpADU.PROTOCOLIDENTIFIER + " but got " + protocolIdentifier);
+ // throw new ParseException("Expected constant value " + MODBUS_READ_WRITE_MODBUS_TCP_ADU_PROTOCOL_IDENTIFIER + " but got " + protocolIdentifier);
}
// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -48,12 +48,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_bu
// Simple Field (unitIdentifier)
uint8_t unitIdentifier = plc4c_spi_read_unsigned_short(buf, 8);
- msg->unit_identifier = unitIdentifier;
+ (*_message)->unit_identifier = unitIdentifier;
// Simple Field (pdu)
- plc4c_modbus_read_write_modbus_pdu* pdu = NULL;
+ plc4c_modbus_read_write_modbus_pdu pdu;
plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
- msg->pdu = pdu;
+ (*_message)->pdu = pdu;
return OK;
}
diff --git a/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h b/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
index 53add62..91d4457 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
@@ -61,17 +61,17 @@ struct plc4c_s7_read_write_cotp_packet {
struct { /* COTPPacketConnectionRequest */
uint16_t cotp_packet_connection_request_destination_reference;
uint16_t cotp_packet_connection_request_source_reference;
- plc4c_s7_read_write_cotp_protocol_class* cotp_packet_connection_request_protocol_class;
+ plc4c_s7_read_write_cotp_protocol_class cotp_packet_connection_request_protocol_class;
};
struct { /* COTPPacketConnectionResponse */
uint16_t cotp_packet_connection_response_destination_reference;
uint16_t cotp_packet_connection_response_source_reference;
- plc4c_s7_read_write_cotp_protocol_class* cotp_packet_connection_response_protocol_class;
+ plc4c_s7_read_write_cotp_protocol_class cotp_packet_connection_response_protocol_class;
};
struct { /* COTPPacketDisconnectRequest */
uint16_t cotp_packet_disconnect_request_destination_reference;
uint16_t cotp_packet_disconnect_request_source_reference;
- plc4c_s7_read_write_cotp_protocol_class* cotp_packet_disconnect_request_protocol_class;
+ plc4c_s7_read_write_cotp_protocol_class cotp_packet_disconnect_request_protocol_class;
};
struct { /* COTPPacketDisconnectResponse */
uint16_t cotp_packet_disconnect_response_destination_reference;
@@ -82,7 +82,7 @@ struct plc4c_s7_read_write_cotp_packet {
uint8_t cotp_packet_tpdu_error_reject_cause;
};
};
- plc4c_list* parameters;
+ plc4c_list parameters;
plc4c_s7_read_write_s7_message* payload;
};
typedef struct plc4c_s7_read_write_cotp_packet plc4c_s7_read_write_cotp_packet;
diff --git a/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h b/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
index d739637..62eb8ed 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
@@ -52,7 +52,7 @@ struct plc4c_s7_read_write_cotp_parameter {
/* Properties */
union {
struct { /* COTPParameterTpduSize */
- plc4c_s7_read_write_cotp_tpdu_size* cotp_parameter_tpdu_size_tpdu_size;
+ plc4c_s7_read_write_cotp_tpdu_size cotp_parameter_tpdu_size_tpdu_size;
};
struct { /* COTPParameterCallingTsap */
uint16_t cotp_parameter_calling_tsap_tsap_id;
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_address.h b/sandbox/plc4c/generated-sources/s7/includes/s7_address.h
index 9b166a1..0f5ae1a 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_address.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_address.h
@@ -49,10 +49,10 @@ struct plc4c_s7_read_write_s7_address {
/* Properties */
union {
struct { /* S7AddressAny */
- plc4c_s7_read_write_transport_size* s7_address_any_transport_size;
+ plc4c_s7_read_write_transport_size s7_address_any_transport_size;
uint16_t s7_address_any_number_of_elements;
uint16_t s7_address_any_db_number;
- plc4c_s7_read_write_memory_area* s7_address_any_area;
+ plc4c_s7_read_write_memory_area s7_address_any_area;
uint16_t s7_address_any_byte_address;
unsigned int s7_address_any_bit_address : 3;
};
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
index f3172a4..1e126c7 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
@@ -60,19 +60,19 @@ struct plc4c_s7_read_write_s7_parameter {
uint16_t s7_parameter_setup_communication_pdu_length;
};
struct { /* S7ParameterReadVarRequest */
- plc4c_list* s7_parameter_read_var_request_items;
+ plc4c_list s7_parameter_read_var_request_items;
};
struct { /* S7ParameterReadVarResponse */
uint8_t s7_parameter_read_var_response_num_items;
};
struct { /* S7ParameterWriteVarRequest */
- plc4c_list* s7_parameter_write_var_request_items;
+ plc4c_list s7_parameter_write_var_request_items;
};
struct { /* S7ParameterWriteVarResponse */
uint8_t s7_parameter_write_var_response_num_items;
};
struct { /* S7ParameterUserData */
- plc4c_list* s7_parameter_user_data_items;
+ plc4c_list s7_parameter_user_data_items;
};
};
};
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 9fbbf91..ccdf49b 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
@@ -52,9 +52,9 @@ struct plc4c_s7_read_write_s7_parameter_user_data_item {
unsigned int s7_parameter_user_data_item_cpu_functions_cpu_function_group : 4;
uint8_t s7_parameter_user_data_item_cpu_functions_cpu_subfunction;
uint8_t s7_parameter_user_data_item_cpu_functions_sequence_number;
- uint8_t s7_parameter_user_data_item_cpu_functions_data_unit_reference_number;
- uint8_t s7_parameter_user_data_item_cpu_functions_last_data_unit;
- uint16_t s7_parameter_user_data_item_cpu_functions_error_code;
+ uint8_t* s7_parameter_user_data_item_cpu_functions_data_unit_reference_number;
+ uint8_t* s7_parameter_user_data_item_cpu_functions_last_data_unit;
+ uint16_t* s7_parameter_user_data_item_cpu_functions_error_code;
};
};
};
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h b/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
index 1aa5564..4e893d3 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
@@ -55,16 +55,16 @@ struct plc4c_s7_read_write_s7_payload {
/* Properties */
union {
struct { /* S7PayloadReadVarResponse */
- plc4c_list* s7_payload_read_var_response_items;
+ plc4c_list s7_payload_read_var_response_items;
};
struct { /* S7PayloadWriteVarRequest */
- plc4c_list* s7_payload_write_var_request_items;
+ plc4c_list s7_payload_write_var_request_items;
};
struct { /* S7PayloadWriteVarResponse */
- plc4c_list* s7_payload_write_var_response_items;
+ plc4c_list s7_payload_write_var_response_items;
};
struct { /* S7PayloadUserData */
- plc4c_list* s7_payload_user_data_items;
+ plc4c_list s7_payload_user_data_items;
};
};
};
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 4bbe20b..a3c427c 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
@@ -46,19 +46,22 @@ typedef enum plc4c_s7_read_write_s7_payload_user_data_item_type plc4c_s7_read_wr
// Function to get the discriminator values for a given type.
plc4c_s7_read_write_s7_payload_user_data_item_discriminator plc4c_s7_read_write_s7_payload_user_data_item_get_discriminator(plc4c_s7_read_write_s7_payload_user_data_item_type type);
+// Constant values.
+const uint16_t S7_READ_WRITE_S7_PAYLOAD_USER_DATA_ITEM_CPU_FUNCTION_READ_SZL_RESPONSE_SZL_ITEM_LENGTH = 28;
+
struct plc4c_s7_read_write_s7_payload_user_data_item {
/* This is an abstract type so this property saves the type of this typed union */
plc4c_s7_read_write_s7_payload_user_data_item_type _type;
/* Properties */
plc4c_s7_read_write_data_transport_error_code return_code;
plc4c_s7_read_write_data_transport_size transport_size;
- plc4c_s7_read_write_szl_id* szl_id;
+ plc4c_s7_read_write_szl_id szl_id;
uint16_t szl_index;
union {
struct { /* S7PayloadUserDataItemCpuFunctionReadSzlRequest */
};
struct { /* S7PayloadUserDataItemCpuFunctionReadSzlResponse */
- plc4c_list* s7_payload_user_data_item_cpu_function_read_szl_response_items;
+ plc4c_list s7_payload_user_data_item_cpu_function_read_szl_response_items;
};
};
};
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..0c83ffa 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
@@ -48,7 +48,7 @@ struct plc4c_s7_read_write_s7_var_request_parameter_item {
/* Properties */
union {
struct { /* S7VarRequestParameterItemAddress */
- plc4c_s7_read_write_s7_address* s7_var_request_parameter_item_address_address;
+ plc4c_s7_read_write_s7_address s7_var_request_parameter_item_address_address;
};
};
};
diff --git a/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h b/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
index 1774b50..0976125 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
@@ -33,7 +33,7 @@ const uint8_t S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID = 0x03;
struct plc4c_s7_read_write_tpkt_packet {
/* Properties */
uint8_t protocol_id;
- plc4c_s7_read_write_cotp_packet* payload;
+ plc4c_s7_read_write_cotp_packet payload;
};
typedef struct plc4c_s7_read_write_tpkt_packet plc4c_s7_read_write_tpkt_packet;
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
index 242d9de..189d302 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
@@ -47,12 +47,12 @@ plc4c_s7_read_write_cotp_packet_discriminator plc4c_s7_read_write_cotp_packet_ge
}
// Parse function.
-plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* buf, uint16_t cotpLen, plc4c_s7_read_write_cotp_packet** message) {
+plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* buf, uint16_t cotpLen, plc4c_s7_read_write_cotp_packet** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_cotp_packet* msg = malloc(sizeof(plc4c_s7_read_write_cotp_packet));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_cotp_packet));
// Implicit Field (headerLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -63,55 +63,85 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
if(tpduCode == 0xF0) { /* COTPPacketData */
- bool eot = -1;
- msg->cotp_packet_data_eot = eot;
- unsigned int tpduRef = -1;
- msg->cotp_packet_data_tpdu_ref = tpduRef;
+ // Simple Field (eot)
+ bool eot = plc4c_spi_read_bit(buf);
+ (*_message)->cotp_packet_data_eot = eot;
+
+
+ // Simple Field (tpduRef)
+ unsigned int tpduRef = plc4c_spi_read_unsigned_short(buf, 7);
+ (*_message)->cotp_packet_data_tpdu_ref = tpduRef;
} else
if(tpduCode == 0xE0) { /* COTPPacketConnectionRequest */
- uint16_t destinationReference = -1;
- msg->cotp_packet_connection_request_destination_reference = destinationReference;
- uint16_t sourceReference = -1;
- msg->cotp_packet_connection_request_source_reference = sourceReference;
+ // Simple Field (destinationReference)
+ uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_packet_connection_request_destination_reference = destinationReference;
+
+
+ // Simple Field (sourceReference)
+ uint16_t sourceReference = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_packet_connection_request_source_reference = sourceReference;
- plc4c_s7_read_write_cotp_protocol_class* protocolClass = NULL;
- msg->cotp_packet_connection_request_protocol_class = protocolClass;
+
+ // Enum field (protocolClass)
+ plc4c_s7_read_write_cotp_protocol_class protocolClass = plc4c_spi_read_byte(buf, 8);
+ (*_message)->cotp_packet_connection_request_protocol_class = protocolClass;
} else
if(tpduCode == 0xD0) { /* COTPPacketConnectionResponse */
- uint16_t destinationReference = -1;
- msg->cotp_packet_connection_response_destination_reference = destinationReference;
- uint16_t sourceReference = -1;
- msg->cotp_packet_connection_response_source_reference = sourceReference;
+ // Simple Field (destinationReference)
+ uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_packet_connection_response_destination_reference = destinationReference;
+
+
+ // Simple Field (sourceReference)
+ uint16_t sourceReference = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_packet_connection_response_source_reference = sourceReference;
+
- plc4c_s7_read_write_cotp_protocol_class* protocolClass = NULL;
- msg->cotp_packet_connection_response_protocol_class = protocolClass;
+ // Enum field (protocolClass)
+ plc4c_s7_read_write_cotp_protocol_class protocolClass = plc4c_spi_read_byte(buf, 8);
+ (*_message)->cotp_packet_connection_response_protocol_class = protocolClass;
} else
if(tpduCode == 0x80) { /* COTPPacketDisconnectRequest */
- uint16_t destinationReference = -1;
- msg->cotp_packet_disconnect_request_destination_reference = destinationReference;
- uint16_t sourceReference = -1;
- msg->cotp_packet_disconnect_request_source_reference = sourceReference;
+ // Simple Field (destinationReference)
+ uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_packet_disconnect_request_destination_reference = destinationReference;
- plc4c_s7_read_write_cotp_protocol_class* protocolClass = NULL;
- msg->cotp_packet_disconnect_request_protocol_class = protocolClass;
+
+ // Simple Field (sourceReference)
+ uint16_t sourceReference = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_packet_disconnect_request_source_reference = sourceReference;
+
+
+ // Enum field (protocolClass)
+ plc4c_s7_read_write_cotp_protocol_class protocolClass = plc4c_spi_read_byte(buf, 8);
+ (*_message)->cotp_packet_disconnect_request_protocol_class = protocolClass;
} else
if(tpduCode == 0xC0) { /* COTPPacketDisconnectResponse */
- uint16_t destinationReference = -1;
- msg->cotp_packet_disconnect_response_destination_reference = destinationReference;
- uint16_t sourceReference = -1;
- msg->cotp_packet_disconnect_response_source_reference = sourceReference;
+ // Simple Field (destinationReference)
+ uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_packet_disconnect_response_destination_reference = destinationReference;
+
+
+ // Simple Field (sourceReference)
+ uint16_t sourceReference = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_packet_disconnect_response_source_reference = sourceReference;
} else
if(tpduCode == 0x70) { /* COTPPacketTpduError */
- uint16_t destinationReference = -1;
- msg->cotp_packet_tpdu_error_destination_reference = destinationReference;
- uint8_t rejectCause = -1;
- msg->cotp_packet_tpdu_error_reject_cause = rejectCause;
+ // Simple Field (destinationReference)
+ uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_packet_tpdu_error_destination_reference = destinationReference;
+
+
+ // Simple Field (rejectCause)
+ uint8_t rejectCause = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->cotp_packet_tpdu_error_reject_cause = rejectCause;
}
// Array field (parameters)
@@ -122,18 +152,24 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
uint8_t _parametersLength = (((headerLength) + (1))) - (curPos);
uint8_t parametersEndPos = plc4c_spi_read_get_pos(buf) + _parametersLength;
while(plc4c_spi_read_get_pos(buf) < parametersEndPos) {
- plc4c_utils_list_insert_head_value(¶meters, plc4c_s7_read_write_cotp_parameter_parse(buf, (((headerLength) + (1))) - (curPos), (void*) ¶meters));
+ plc4c_list* value = NULL;
+ plc4c_s7_read_write_cotp_parameter_parse(buf, (((headerLength) + (1))) - (curPos), (void*) &value);
+ plc4c_utils_list_insert_head_value(¶meters, value);
curPos = plc4c_spi_read_get_pos(buf) - startPos;
}
}
+ (*_message)->parameters = parameters;
// Optional Field (payload) (Can be skipped, if a given expression evaluates to false)
curPos = plc4c_spi_read_get_pos(buf) - startPos;
plc4c_s7_read_write_s7_message* payload = NULL;
if((curPos) < (cotpLen)) {
- plc4c_s7_read_write_s7_message* payload = NULL;
+ payload = malloc(sizeof(plc4c_s7_read_write_s7_message));
+ if(payload == NULL) {
+ return NO_MEMORY;
+ }
plc4c_s7_read_write_s7_message_parse(buf, &payload);
- msg->payload = payload;
+ (*_message)->payload = payload;
}
return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
index 50bc779..dfef1a8 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
@@ -45,12 +45,12 @@ plc4c_s7_read_write_cotp_parameter_discriminator plc4c_s7_read_write_cotp_parame
}
// Parse function.
-plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer* buf, uint8_t rest, plc4c_s7_read_write_cotp_parameter** message) {
+plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer* buf, uint8_t rest, plc4c_s7_read_write_cotp_parameter** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_cotp_parameter* msg = malloc(sizeof(plc4c_s7_read_write_cotp_parameter));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_cotp_parameter));
// Discriminator Field (parameterType) (Used as input to a switch field)
uint8_t parameterType = plc4c_spi_read_unsigned_short(buf, 8);
@@ -60,24 +60,44 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
if(parameterType == 0xC0) { /* COTPParameterTpduSize */
- plc4c_s7_read_write_cotp_tpdu_size* tpduSize = NULL;
- msg->cotp_parameter_tpdu_size_tpdu_size = tpduSize;
+
+ // Enum field (tpduSize)
+ plc4c_s7_read_write_cotp_tpdu_size tpduSize = plc4c_spi_read_byte(buf, 8);
+ (*_message)->cotp_parameter_tpdu_size_tpdu_size = tpduSize;
} else
if(parameterType == 0xC1) { /* COTPParameterCallingTsap */
- uint16_t tsapId = -1;
- msg->cotp_parameter_calling_tsap_tsap_id = tsapId;
+
+ // Simple Field (tsapId)
+ uint16_t tsapId = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_parameter_calling_tsap_tsap_id = tsapId;
} else
if(parameterType == 0xC2) { /* COTPParameterCalledTsap */
- uint16_t tsapId = -1;
- msg->cotp_parameter_called_tsap_tsap_id = tsapId;
+
+ // Simple Field (tsapId)
+ uint16_t tsapId = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->cotp_parameter_called_tsap_tsap_id = tsapId;
} else
if(parameterType == 0xC3) { /* COTPParameterChecksum */
- uint8_t crc = -1;
- msg->cotp_parameter_checksum_crc = crc;
+
+ // Simple Field (crc)
+ uint8_t crc = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->cotp_parameter_checksum_crc = crc;
} else
if(parameterType == 0xE0) { /* COTPParameterDisconnectAdditionalInformation */
- plc4c_list data;
- msg->cotp_parameter_disconnect_additional_information_data = data;
+
+ // Array field (data)
+ plc4c_list data;
+ {
+ // Count array
+ uint8_t itemCount = rest;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ uint8_t value = plc4c_spi_read_unsigned_short(buf, 8);
+ plc4c_utils_list_insert_head_value(&data, &value);
+ plc4c_utils_list_insert_head_value(&data, &value);
+ }
+ }
+ (*_message)->cotp_parameter_disconnect_additional_information_data = data;
}
return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_address.c b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
index 9b2967e..27b7895 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_address.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
@@ -37,35 +37,56 @@ plc4c_s7_read_write_s7_address_discriminator plc4c_s7_read_write_s7_address_get_
}
// Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_address_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_address** message) {
+plc4c_return_code plc4c_s7_read_write_s7_address_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_address** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_s7_address* msg = malloc(sizeof(plc4c_s7_read_write_s7_address));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_address));
// Discriminator Field (addressType) (Used as input to a switch field)
uint8_t addressType = plc4c_spi_read_unsigned_short(buf, 8);
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
if(addressType == 0x10) { /* S7AddressAny */
- plc4c_s7_read_write_transport_size* transportSize = NULL;
- msg->s7_address_any_transport_size = transportSize;
- uint16_t numberOfElements = -1;
- msg->s7_address_any_number_of_elements = numberOfElements;
+ // Enum field (transportSize)
+ plc4c_s7_read_write_transport_size transportSize = plc4c_spi_read_byte(buf, 8);
+ (*_message)->s7_address_any_transport_size = transportSize;
- uint16_t dbNumber = -1;
- msg->s7_address_any_db_number = dbNumber;
- plc4c_s7_read_write_memory_area* area = NULL;
- msg->s7_address_any_area = area;
+ // Simple Field (numberOfElements)
+ uint16_t numberOfElements = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->s7_address_any_number_of_elements = numberOfElements;
- uint16_t byteAddress = -1;
- msg->s7_address_any_byte_address = byteAddress;
- unsigned int bitAddress = -1;
- msg->s7_address_any_bit_address = bitAddress;
+ // Simple Field (dbNumber)
+ uint16_t dbNumber = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->s7_address_any_db_number = dbNumber;
+
+
+ // Enum field (area)
+ plc4c_s7_read_write_memory_area area = plc4c_spi_read_byte(buf, 8);
+ (*_message)->s7_address_any_area = area;
+
+
+ // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+ {
+ unsigned int _reserved = plc4c_spi_read_unsigned_short(buf, 5);
+ if(_reserved != 0x00) {
+ printf("Expected constant value '%d' but got '%d' for reserved field.", 0x00, _reserved);
+ }
+ }
+
+
+ // Simple Field (byteAddress)
+ uint16_t byteAddress = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->s7_address_any_byte_address = byteAddress;
+
+
+ // Simple Field (bitAddress)
+ unsigned int bitAddress = plc4c_spi_read_unsigned_byte(buf, 3);
+ (*_message)->s7_address_any_bit_address = bitAddress;
}
return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_message.c b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
index 28056d0..d172a53 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_message.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
@@ -43,19 +43,19 @@ plc4c_s7_read_write_s7_message_discriminator plc4c_s7_read_write_s7_message_get_
}
// Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_message** message) {
+plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_message** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_s7_message* msg = malloc(sizeof(plc4c_s7_read_write_s7_message));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_message));
// Const Field (protocolId)
uint8_t protocolId = plc4c_spi_read_unsigned_short(buf, 8);
if(protocolId != S7_READ_WRITE_S7_MESSAGE_PROTOCOL_ID) {
return PARSE_ERROR;
- // throw new ParseException("Expected constant value " + S7Message.PROTOCOLID + " but got " + protocolId);
+ // throw new ParseException("Expected constant value " + S7_READ_WRITE_S7_MESSAGE_PROTOCOL_ID + " but got " + protocolId);
}
// Discriminator Field (messageType) (Used as input to a switch field)
@@ -71,7 +71,7 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
// Simple Field (tpduReference)
uint16_t tpduReference = plc4c_spi_read_unsigned_int(buf, 16);
- msg->tpdu_reference = tpduReference;
+ (*_message)->tpdu_reference = tpduReference;
// Implicit Field (parameterLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
uint16_t parameterLength = plc4c_spi_read_unsigned_int(buf, 16);
@@ -83,18 +83,26 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
if(messageType == 0x01) { /* S7MessageRequest */
} else
if(messageType == 0x02) { /* S7MessageResponse */
- uint8_t errorClass = -1;
- msg->s7_message_response_error_class = errorClass;
- uint8_t errorCode = -1;
- msg->s7_message_response_error_code = errorCode;
+ // Simple Field (errorClass)
+ uint8_t errorClass = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_message_response_error_class = errorClass;
+
+
+ // Simple Field (errorCode)
+ uint8_t errorCode = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_message_response_error_code = errorCode;
} else
if(messageType == 0x03) { /* S7MessageResponseData */
- uint8_t errorClass = -1;
- msg->s7_message_response_data_error_class = errorClass;
- uint8_t errorCode = -1;
- msg->s7_message_response_data_error_code = errorCode;
+ // Simple Field (errorClass)
+ uint8_t errorClass = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_message_response_data_error_class = errorClass;
+
+
+ // Simple Field (errorCode)
+ uint8_t errorCode = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_message_response_data_error_code = errorCode;
} else
if(messageType == 0x07) { /* S7MessageUserData */
}
@@ -102,17 +110,23 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
// Optional Field (parameter) (Can be skipped, if a given expression evaluates to false)
plc4c_s7_read_write_s7_parameter* parameter = NULL;
if((parameterLength) > (0)) {
- plc4c_s7_read_write_s7_parameter* parameter = NULL;
+ parameter = malloc(sizeof(plc4c_s7_read_write_s7_parameter));
+ if(parameter == NULL) {
+ return NO_MEMORY;
+ }
plc4c_s7_read_write_s7_parameter_parse(buf, messageType, ¶meter);
- msg->parameter = parameter;
+ (*_message)->parameter = parameter;
}
// Optional Field (payload) (Can be skipped, if a given expression evaluates to false)
plc4c_s7_read_write_s7_payload* payload = NULL;
if((payloadLength) > (0)) {
- plc4c_s7_read_write_s7_payload* payload = NULL;
+ payload = malloc(sizeof(plc4c_s7_read_write_s7_payload));
+ if(payload == NULL) {
+ return NO_MEMORY;
+ }
plc4c_s7_read_write_s7_payload_parse(buf, messageType, parameter, &payload);
- msg->payload = payload;
+ (*_message)->payload = payload;
}
return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
index 8f84ef2..6225708 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
@@ -47,46 +47,116 @@ plc4c_s7_read_write_s7_parameter_discriminator plc4c_s7_read_write_s7_parameter_
}
// Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer* buf, uint8_t messageType, plc4c_s7_read_write_s7_parameter** message) {
+plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer* buf, uint8_t messageType, plc4c_s7_read_write_s7_parameter** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_s7_parameter* msg = malloc(sizeof(plc4c_s7_read_write_s7_parameter));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_parameter));
// Discriminator Field (parameterType) (Used as input to a switch field)
uint8_t parameterType = plc4c_spi_read_unsigned_short(buf, 8);
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
if(parameterType == 0xF0) { /* S7ParameterSetupCommunication */
- uint16_t maxAmqCaller = -1;
- msg->s7_parameter_setup_communication_max_amq_caller = maxAmqCaller;
- uint16_t maxAmqCallee = -1;
- msg->s7_parameter_setup_communication_max_amq_callee = maxAmqCallee;
+ // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+ {
+ uint8_t _reserved = plc4c_spi_read_unsigned_short(buf, 8);
+ if(_reserved != 0x00) {
+ printf("Expected constant value '%d' but got '%d' for reserved field.", 0x00, _reserved);
+ }
+ }
+
+
+ // Simple Field (maxAmqCaller)
+ uint16_t maxAmqCaller = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->s7_parameter_setup_communication_max_amq_caller = maxAmqCaller;
+
+
+ // Simple Field (maxAmqCallee)
+ uint16_t maxAmqCallee = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->s7_parameter_setup_communication_max_amq_callee = maxAmqCallee;
- uint16_t pduLength = -1;
- msg->s7_parameter_setup_communication_pdu_length = pduLength;
+
+ // Simple Field (pduLength)
+ uint16_t pduLength = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->s7_parameter_setup_communication_pdu_length = pduLength;
} else
if((parameterType == 0x04) && (messageType == 0x01)) { /* S7ParameterReadVarRequest */
- plc4c_list* items;
- msg->s7_parameter_read_var_request_items = items;
+
+ // Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Count array
+ uint8_t itemCount = numItems;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_list* value = NULL;
+ plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ plc4c_utils_list_insert_head_value(&items, &value);
+ }
+ }
+ (*_message)->s7_parameter_read_var_request_items = items;
} else
if((parameterType == 0x04) && (messageType == 0x03)) { /* S7ParameterReadVarResponse */
- uint8_t numItems = -1;
- msg->s7_parameter_read_var_response_num_items = numItems;
+
+ // Simple Field (numItems)
+ uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_parameter_read_var_response_num_items = numItems;
} else
if((parameterType == 0x05) && (messageType == 0x01)) { /* S7ParameterWriteVarRequest */
- plc4c_list* items;
- msg->s7_parameter_write_var_request_items = items;
+
+ // Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Count array
+ uint8_t itemCount = numItems;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_list* value = NULL;
+ plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ plc4c_utils_list_insert_head_value(&items, &value);
+ }
+ }
+ (*_message)->s7_parameter_write_var_request_items = items;
} else
if((parameterType == 0x05) && (messageType == 0x03)) { /* S7ParameterWriteVarResponse */
- uint8_t numItems = -1;
- msg->s7_parameter_write_var_response_num_items = numItems;
+
+ // Simple Field (numItems)
+ uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_parameter_write_var_response_num_items = numItems;
} else
if((parameterType == 0x00) && (messageType == 0x07)) { /* S7ParameterUserData */
- plc4c_list* items;
- msg->s7_parameter_user_data_items = items;
+
+ // Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Count array
+ uint8_t itemCount = numItems;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_list* value = NULL;
+ plc4c_s7_read_write_s7_parameter_user_data_item_parse(buf, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ plc4c_utils_list_insert_head_value(&items, &value);
+ }
+ }
+ (*_message)->s7_parameter_user_data_items = items;
}
return OK;
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 b6fad93..5512c0c 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
@@ -37,41 +37,82 @@ plc4c_s7_read_write_s7_parameter_user_data_item_discriminator plc4c_s7_read_writ
}
// Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_parameter_user_data_item** message) {
+plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_parameter_user_data_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_s7_parameter_user_data_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_parameter_user_data_item));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_parameter_user_data_item));
// Discriminator Field (itemType) (Used as input to a switch field)
uint8_t itemType = plc4c_spi_read_unsigned_short(buf, 8);
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
if(itemType == 0x12) { /* S7ParameterUserDataItemCPUFunctions */
- uint8_t method = -1;
- msg->s7_parameter_user_data_item_cpu_functions_method = method;
- unsigned int cpuFunctionType = -1;
- msg->s7_parameter_user_data_item_cpu_functions_cpu_function_type = cpuFunctionType;
+ // Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t itemLength = plc4c_spi_read_unsigned_short(buf, 8);
- unsigned int cpuFunctionGroup = -1;
- msg->s7_parameter_user_data_item_cpu_functions_cpu_function_group = cpuFunctionGroup;
- uint8_t cpuSubfunction = -1;
- msg->s7_parameter_user_data_item_cpu_functions_cpu_subfunction = cpuSubfunction;
+ // Simple Field (method)
+ uint8_t method = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_parameter_user_data_item_cpu_functions_method = method;
- uint8_t sequenceNumber = -1;
- msg->s7_parameter_user_data_item_cpu_functions_sequence_number = sequenceNumber;
- uint8_t dataUnitReferenceNumber = -1;
- msg->s7_parameter_user_data_item_cpu_functions_data_unit_reference_number = dataUnitReferenceNumber;
+ // Simple Field (cpuFunctionType)
+ unsigned int cpuFunctionType = plc4c_spi_read_unsigned_byte(buf, 4);
+ (*_message)->s7_parameter_user_data_item_cpu_functions_cpu_function_type = cpuFunctionType;
- uint8_t lastDataUnit = -1;
- msg->s7_parameter_user_data_item_cpu_functions_last_data_unit = lastDataUnit;
- uint16_t errorCode = -1;
- msg->s7_parameter_user_data_item_cpu_functions_error_code = errorCode;
+ // Simple Field (cpuFunctionGroup)
+ unsigned int cpuFunctionGroup = plc4c_spi_read_unsigned_byte(buf, 4);
+ (*_message)->s7_parameter_user_data_item_cpu_functions_cpu_function_group = cpuFunctionGroup;
+
+
+ // Simple Field (cpuSubfunction)
+ uint8_t cpuSubfunction = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_parameter_user_data_item_cpu_functions_cpu_subfunction = cpuSubfunction;
+
+
+ // Simple Field (sequenceNumber)
+ uint8_t sequenceNumber = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_parameter_user_data_item_cpu_functions_sequence_number = sequenceNumber;
+
+
+ // Optional Field (dataUnitReferenceNumber) (Can be skipped, if a given expression evaluates to false)
+ uint8_t* dataUnitReferenceNumber = NULL;
+ if((cpuFunctionType) == (8)) {
+ dataUnitReferenceNumber = malloc(sizeof(uint8_t));
+ if(dataUnitReferenceNumber == NULL) {
+ return NO_MEMORY;
+ }
+ *dataUnitReferenceNumber = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_parameter_user_data_item_cpu_functions_data_unit_reference_number = dataUnitReferenceNumber;
+ }
+
+
+ // Optional Field (lastDataUnit) (Can be skipped, if a given expression evaluates to false)
+ uint8_t* lastDataUnit = NULL;
+ if((cpuFunctionType) == (8)) {
+ lastDataUnit = malloc(sizeof(uint8_t));
+ if(lastDataUnit == NULL) {
+ return NO_MEMORY;
+ }
+ *lastDataUnit = plc4c_spi_read_unsigned_short(buf, 8);
+ (*_message)->s7_parameter_user_data_item_cpu_functions_last_data_unit = lastDataUnit;
+ }
+
+
+ // Optional Field (errorCode) (Can be skipped, if a given expression evaluates to false)
+ uint16_t* errorCode = NULL;
+ if((cpuFunctionType) == (8)) {
+ errorCode = malloc(sizeof(uint16_t));
+ if(errorCode == NULL) {
+ return NO_MEMORY;
+ }
+ *errorCode = plc4c_spi_read_unsigned_int(buf, 16);
+ (*_message)->s7_parameter_user_data_item_cpu_functions_error_code = errorCode;
+ }
}
return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
index e01077e..252097a 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
@@ -43,29 +43,81 @@ plc4c_s7_read_write_s7_payload_discriminator plc4c_s7_read_write_s7_payload_get_
}
// Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* buf, uint8_t messageType, plc4c_s7_read_write_s7_parameter* parameter, plc4c_s7_read_write_s7_payload** message) {
+plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* buf, uint8_t messageType, plc4c_s7_read_write_s7_parameter* parameter, plc4c_s7_read_write_s7_payload** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_s7_payload* msg = malloc(sizeof(plc4c_s7_read_write_s7_payload));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_payload));
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x04) && (messageType == 0x03)) { /* S7PayloadReadVarResponse */
- plc4c_list* items;
- msg->s7_payload_read_var_response_items = items;
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Count array
+ uint8_t itemCount = ((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_read_var_response_num_items;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_list* value = NULL;
+ plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ plc4c_utils_list_insert_head_value(&items, &value);
+ }
+ }
+ (*_message)->s7_payload_read_var_response_items = items;
} else
if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x05) && (messageType == 0x01)) { /* S7PayloadWriteVarRequest */
- plc4c_list* items;
- msg->s7_payload_write_var_request_items = items;
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Count array
+ uint8_t itemCount = plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_write_var_request_items);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_list* value = NULL;
+ plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ plc4c_utils_list_insert_head_value(&items, &value);
+ }
+ }
+ (*_message)->s7_payload_write_var_request_items = items;
} else
if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x05) && (messageType == 0x03)) { /* S7PayloadWriteVarResponse */
- plc4c_list* items;
- msg->s7_payload_write_var_response_items = items;
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Count array
+ uint8_t itemCount = ((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_write_var_response_num_items;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_list* value = NULL;
+ plc4c_s7_read_write_s7_var_payload_status_item_parse(buf, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ plc4c_utils_list_insert_head_value(&items, &value);
+ }
+ }
+ (*_message)->s7_payload_write_var_response_items = items;
} else
if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x00) && (messageType == 0x07)) { /* S7PayloadUserData */
- plc4c_list* items;
- msg->s7_payload_user_data_items = items;
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Count array
+ uint8_t itemCount = plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_user_data_items);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_list* value = NULL;
+ plc4c_s7_read_write_s7_payload_user_data_item_parse(buf, ((plc4c_s7_read_write_s7_parameter_user_data_item) (((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_user_data_items[0])).s7_parameter_user_data_item_cpu_functions_cpu_function_type, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ plc4c_utils_list_insert_head_value(&items, &value);
+ }
+ }
+ (*_message)->s7_payload_user_data_items = items;
}
return OK;
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 06e2cc5..da87ddf 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
@@ -39,40 +39,65 @@ plc4c_s7_read_write_s7_payload_user_data_item_discriminator plc4c_s7_read_write_
}
// Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_read_buffer* buf, unsigned int cpuFunctionType, plc4c_s7_read_write_s7_payload_user_data_item** message) {
+plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_read_buffer* buf, unsigned int cpuFunctionType, plc4c_s7_read_write_s7_payload_user_data_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_s7_payload_user_data_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_payload_user_data_item));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_payload_user_data_item));
// Enum field (returnCode)
plc4c_s7_read_write_data_transport_error_code returnCode = plc4c_spi_read_byte(buf, 8);
- msg->return_code = returnCode;
+ (*_message)->return_code = returnCode;
// Enum field (transportSize)
plc4c_s7_read_write_data_transport_size transportSize = plc4c_spi_read_byte(buf, 8);
- msg->transport_size = transportSize;
+ (*_message)->transport_size = transportSize;
// Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
uint16_t dataLength = plc4c_spi_read_unsigned_int(buf, 16);
// Simple Field (szlId)
- plc4c_s7_read_write_szl_id* szlId = NULL;
+ plc4c_s7_read_write_szl_id szlId;
plc4c_s7_read_write_szl_id_parse(buf, (void*) &szlId);
- msg->szl_id = szlId;
+ (*_message)->szl_id = szlId;
// Simple Field (szlIndex)
uint16_t szlIndex = plc4c_spi_read_unsigned_int(buf, 16);
- msg->szl_index = szlIndex;
+ (*_message)->szl_index = szlIndex;
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
if(cpuFunctionType == 0x04) { /* S7PayloadUserDataItemCpuFunctionReadSzlRequest */
} else
if(cpuFunctionType == 0x08) { /* S7PayloadUserDataItemCpuFunctionReadSzlResponse */
- plc4c_list* items;
- msg->s7_payload_user_data_item_cpu_function_read_szl_response_items = items;
+
+ // Const Field (szlItemLength)
+ uint16_t szlItemLength = plc4c_spi_read_unsigned_int(buf, 16);
+ if(szlItemLength != S7_READ_WRITE_S7_PAYLOAD_USER_DATA_ITEM_CPU_FUNCTION_READ_SZL_RESPONSE_SZL_ITEM_LENGTH) {
+ return PARSE_ERROR;
+ // throw new ParseException("Expected constant value " + S7_READ_WRITE_S7_PAYLOAD_USER_DATA_ITEM_CPU_FUNCTION_READ_SZL_RESPONSE_SZL_ITEM_LENGTH + " but got " + szlItemLength);
+ }
+
+
+ // Implicit Field (szlItemCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint16_t szlItemCount = plc4c_spi_read_unsigned_int(buf, 16);
+
+
+ // Array field (items)
+ plc4c_list items;
+ {
+ // Count array
+ uint8_t itemCount = szlItemCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_list* value = NULL;
+ plc4c_s7_read_write_szl_data_tree_item_parse(buf, (void*) &value);
+ plc4c_utils_list_insert_head_value(&items, value);
+ plc4c_utils_list_insert_head_value(&items, &value);
+ }
+ }
+ (*_message)->s7_payload_user_data_item_cpu_function_read_szl_response_items = items;
}
return OK;
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 c9e9b03..f827c4a 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
@@ -24,25 +24,25 @@
#include "s7_var_payload_data_item.h"
// Parse function.
-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_parse(plc4c_spi_read_buffer* buf, bool lastItem, plc4c_s7_read_write_s7_var_payload_data_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_s7_var_payload_data_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_data_item));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_data_item));
// Enum field (returnCode)
plc4c_s7_read_write_data_transport_error_code returnCode = plc4c_spi_read_byte(buf, 8);
- msg->return_code = returnCode;
+ (*_message)->return_code = returnCode;
// Enum field (transportSize)
plc4c_s7_read_write_data_transport_size transportSize = plc4c_spi_read_byte(buf, 8);
- msg->transport_size = transportSize;
+ (*_message)->transport_size = transportSize;
// Simple Field (dataLength)
uint16_t dataLength = plc4c_spi_read_unsigned_int(buf, 16);
- msg->data_length = dataLength;
+ (*_message)->data_length = dataLength;
// Array field (data)
plc4c_list data;
@@ -53,14 +53,18 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_r
int8_t value = plc4c_spi_read_byte(buf, 8);
plc4c_utils_list_insert_head_value(&data, &value);
+ plc4c_utils_list_insert_head_value(&data, &value);
}
}
+ (*_message)->data = data;
- // Padding Field (pad)
- bool _padNeedsPadding = (bool) ((plc4c_spi_read_has_more(buf, 8)) && ((!(lastItem)) && (((((plc4c_spi_evaluation_helper_count(data)) % (2))) == (1)))));
- if(_padNeedsPadding) {
- // Just read the padding data and ignore it
- plc4c_spi_read_unsigned_short(buf, 8);
+ // Padding Field (padding)
+ {
+ bool _needsPadding = (bool) ((plc4c_spi_read_has_more(buf, 8)) && ((!(lastItem)) && (((((plc4c_spi_evaluation_helper_count(data)) % (2))) == (1)))));
+ if(_needsPadding) {
+ // Just read the padding data and ignore it
+ plc4c_spi_read_unsigned_short(buf, 8);
+ }
}
return OK;
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 ae8ca78..e3bad0d 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
@@ -24,17 +24,17 @@
#include "s7_var_payload_status_item.h"
// Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_var_payload_status_item** message) {
+plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_var_payload_status_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_s7_var_payload_status_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_status_item));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_status_item));
// Enum field (returnCode)
plc4c_s7_read_write_data_transport_error_code returnCode = plc4c_spi_read_byte(buf, 8);
- msg->return_code = returnCode;
+ (*_message)->return_code = returnCode;
return OK;
}
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 c50fbd6..db826a5 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
@@ -37,20 +37,27 @@ plc4c_s7_read_write_s7_var_request_parameter_item_discriminator plc4c_s7_read_wr
}
// Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_var_request_parameter_item** message) {
+plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_var_request_parameter_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_s7_var_request_parameter_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_var_request_parameter_item));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_var_request_parameter_item));
// Discriminator Field (itemType) (Used as input to a switch field)
uint8_t itemType = plc4c_spi_read_unsigned_short(buf, 8);
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
if(itemType == 0x12) { /* S7VarRequestParameterItemAddress */
- plc4c_s7_read_write_s7_address* address = NULL;
- msg->s7_var_request_parameter_item_address_address = address;
+
+ // Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ uint8_t itemLength = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+ // Simple Field (address)
+ plc4c_s7_read_write_s7_address address;
+ plc4c_s7_read_write_s7_address_parse(buf, (void*) &address);
+ (*_message)->s7_var_request_parameter_item_address_address = address;
}
return OK;
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 900598e..a8be5e5 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
@@ -24,17 +24,17 @@
#include "szl_data_tree_item.h"
// Parse function.
-plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_szl_data_tree_item** message) {
+plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_szl_data_tree_item** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_szl_data_tree_item* msg = malloc(sizeof(plc4c_s7_read_write_szl_data_tree_item));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_szl_data_tree_item));
// Simple Field (itemIndex)
uint16_t itemIndex = plc4c_spi_read_unsigned_int(buf, 16);
- msg->item_index = itemIndex;
+ (*_message)->item_index = itemIndex;
// Array field (mlfb)
plc4c_list mlfb;
@@ -45,20 +45,22 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_bu
int8_t value = plc4c_spi_read_byte(buf, 8);
plc4c_utils_list_insert_head_value(&mlfb, &value);
+ plc4c_utils_list_insert_head_value(&mlfb, &value);
}
}
+ (*_message)->mlfb = mlfb;
// Simple Field (moduleTypeId)
uint16_t moduleTypeId = plc4c_spi_read_unsigned_int(buf, 16);
- msg->module_type_id = moduleTypeId;
+ (*_message)->module_type_id = moduleTypeId;
// Simple Field (ausbg)
uint16_t ausbg = plc4c_spi_read_unsigned_int(buf, 16);
- msg->ausbg = ausbg;
+ (*_message)->ausbg = ausbg;
// Simple Field (ausbe)
uint16_t ausbe = plc4c_spi_read_unsigned_int(buf, 16);
- msg->ausbe = ausbe;
+ (*_message)->ausbe = ausbe;
return OK;
}
diff --git a/sandbox/plc4c/generated-sources/s7/src/szl_id.c b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
index 87edb3e..484ba7c 100644
--- a/sandbox/plc4c/generated-sources/s7/src/szl_id.c
+++ b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
@@ -24,25 +24,25 @@
#include "szl_id.h"
// Parse function.
-plc4c_return_code plc4c_s7_read_write_szl_id_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_szl_id** message) {
+plc4c_return_code plc4c_s7_read_write_szl_id_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_szl_id** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_szl_id* msg = malloc(sizeof(plc4c_s7_read_write_szl_id));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_szl_id));
// Enum field (typeClass)
plc4c_s7_read_write_szl_module_type_class typeClass = plc4c_spi_read_byte(buf, 4);
- msg->type_class = typeClass;
+ (*_message)->type_class = typeClass;
// Simple Field (sublistExtract)
unsigned int sublistExtract = plc4c_spi_read_unsigned_byte(buf, 4);
- msg->sublist_extract = sublistExtract;
+ (*_message)->sublist_extract = sublistExtract;
// Enum field (sublistList)
plc4c_s7_read_write_szl_sublist sublistList = plc4c_spi_read_byte(buf, 8);
- msg->sublist_list = sublistList;
+ (*_message)->sublist_list = sublistList;
return OK;
}
diff --git a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
index f8d9206..c83283e 100644
--- a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
@@ -24,19 +24,19 @@
#include "tpkt_packet.h"
// Parse function.
-plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_tpkt_packet** message) {
+plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_tpkt_packet** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(buf);
uint16_t curPos;
// Pointer to the parsed data structure.
- plc4c_s7_read_write_tpkt_packet* msg = malloc(sizeof(plc4c_s7_read_write_tpkt_packet));
+ (*_message) = malloc(sizeof(plc4c_s7_read_write_tpkt_packet));
// Const Field (protocolId)
uint8_t protocolId = plc4c_spi_read_unsigned_short(buf, 8);
if(protocolId != S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID) {
return PARSE_ERROR;
- // throw new ParseException("Expected constant value " + TPKTPacket.PROTOCOLID + " but got " + protocolId);
+ // throw new ParseException("Expected constant value " + S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID + " but got " + protocolId);
}
// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
@@ -51,9 +51,9 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* b
uint16_t len = plc4c_spi_read_unsigned_int(buf, 16);
// Simple Field (payload)
- plc4c_s7_read_write_cotp_packet* payload = NULL;
+ plc4c_s7_read_write_cotp_packet payload;
plc4c_s7_read_write_cotp_packet_parse(buf, (len) - (4), (void*) &payload);
- msg->payload = payload;
+ (*_message)->payload = payload;
return OK;
}