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 2022/02/15 18:14:20 UTC
[plc4x] branch feature/plc4c-proxy-protocol created (now e22858f)
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a change to branch feature/plc4c-proxy-protocol
in repository https://gitbox.apache.org/repos/asf/plc4x.git.
at e22858f Temp (No longer works)
This branch includes the following new commits:
new e22858f Temp (No longer works)
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[plc4x] 01/01: Temp (No longer works)
Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/plc4c-proxy-protocol
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit e22858f567f55023af196c07130607352b5f1412
Author: cdutz <ch...@c-ware.de>
AuthorDate: Tue Feb 15 19:14:04 2022 +0100
Temp (No longer works)
---
.../BaseFreemarkerLanguageTemplateHelper.java | 3 -
.../plc4x/language/c/CLanguageTemplateHelper.java | 38 +-
.../resources/templates/c/data-io-template.c.ftlh | 206 +-
.../resources/templates/c/data-io-template.h.ftlh | 6 +-
.../resources/templates/c/enum-template.c.ftlh | 35 +-
.../resources/templates/c/enum-template.h.ftlh | 4 +-
.../resources/templates/c/pojo-template.c.ftlh | 696 ++---
.../resources/templates/c/pojo-template.h.ftlh | 6 +-
code-generation/language-cs/pom.xml | 2 +-
.../resources/templates/cs/model-template.cs.ftlh | 2 +-
.../resources/templates/go/model-template.go.ftlh | 4 +-
.../templates/java/model-template.java.ftlh | 2 +-
.../definitions/DefaultDataIoTypeDefinition.java | 6 +-
plc4c/README.md | 9 +-
.../parser-serializer-testcase-generator.xsl | 149 +
plc4c/drivers/CMakeLists.txt | 1 +
plc4c/drivers/modbus/CMakeLists.txt | 24 +-
.../modbus/test/modbus_test.c} | 20 +-
plc4c/drivers/{s7 => plc4x}/CMakeLists.txt | 45 +-
.../plc4x/include/plc4c/driver_plc4x.h} | 29 +-
.../include/plc4c/driver_plc4x_encode_decode.h} | 25 +-
.../plc4x/include/plc4c/driver_plc4x_packets.h | 59 +
.../drivers/plc4x/include/plc4c/driver_plc4x_sm.h | 49 +
.../plc4x/include/plc4c/driver_plc4x_static.h} | 23 +-
plc4c/drivers/plc4x/src/driver_plc4x.c | 62 +
.../plc4x/src/driver_plc4x_encode_decode.c} | 18 +-
plc4c/drivers/plc4x/src/driver_plc4x_packets.c | 330 +++
plc4c/drivers/plc4x/src/driver_plc4x_sm_connect.c | 143 +
.../drivers/plc4x/src/driver_plc4x_sm_disconnect.c | 75 +
plc4c/drivers/plc4x/src/driver_plc4x_sm_read.c | 248 ++
plc4c/drivers/plc4x/src/driver_plc4x_sm_write.c | 232 ++
.../plc4x/src/driver_plc4x_static.c} | 19 +-
.../plc4x/test/plc4x_test.c} | 20 +-
plc4c/drivers/s7/CMakeLists.txt | 2 +
plc4c/drivers/s7/src/driver_s7_packets.c | 1 -
plc4c/drivers/s7/src/driver_s7_sm_read.c | 6 +-
plc4c/drivers/s7/test/s7_test.c | 218 +-
plc4c/examples/CMakeLists.txt | 1 +
.../{ => hello-world-plc4x}/CMakeLists.txt | 27 +-
.../src/hello_world_plc4x_loopback.c | 349 +++
plc4c/generated-sources/modbus/include/data_item.h | 6 +-
.../modbus/include/modbus_constants.h | 1 -
.../modbus/include/modbus_data_type.h | 4 +-
.../modbus/include/modbus_error_code.h | 4 +-
.../modbus/include/modbus_tcp_adu.h | 1 -
plc4c/generated-sources/modbus/src/data_item.c | 272 +-
.../modbus/src/modbus_constants.c | 3 +-
.../modbus/src/modbus_data_type.c | 137 +-
.../modbus/src/modbus_error_code.c | 67 +-
plc4c/generated-sources/modbus/src/modbus_pdu.c | 2955 ++++++++++----------
.../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 | 16 +-
.../modbus_pdu_write_file_record_response_item.c | 16 +-
.../modbus/src/modbus_serial_adu.c | 12 +-
.../generated-sources/modbus/src/modbus_tcp_adu.c | 19 +-
.../modbus/test/ParserSerializerTestsuite.c | 279 ++
.../include/plc4x_constants.h} | 27 +-
.../tpkt_packet.h => plc4x/include/plc4x_field.h} | 30 +-
.../include/plc4x_field_request.h} | 30 +-
.../plc4x/include/plc4x_field_response.h | 60 +
.../plc4x/include/plc4x_field_value_request.h | 62 +
.../plc4x/include/plc4x_field_value_response.h | 64 +
.../plc4x/include/plc4x_message.h | 114 +
.../plc4x/include/plc4x_request_type.h | 75 +
.../plc4x/include/plc4x_response_code.h | 74 +
.../plc4x/include/plc4x_return_code.h | 74 +
.../data_item.h => plc4x/include/plc4x_value.h} | 18 +-
.../plc4x/include/plc4x_value_type.h | 88 +
.../src/plc4x_constants.c} | 37 +-
plc4c/generated-sources/plc4x/src/plc4x_field.c | 126 +
.../src/plc4x_field_request.c} | 31 +-
.../plc4x/src/plc4x_field_response.c | 92 +
.../plc4x/src/plc4x_field_value_request.c | 110 +
.../plc4x/src/plc4x_field_value_response.c | 128 +
plc4c/generated-sources/plc4x/src/plc4x_message.c | 680 +++++
.../plc4x/src/plc4x_request_type.c | 207 ++
.../plc4x/src/plc4x_response_code.c | 197 ++
.../plc4x/src/plc4x_return_code.c | 197 ++
plc4c/generated-sources/plc4x/src/plc4x_value.c | 409 +++
.../generated-sources/plc4x/src/plc4x_value_type.c | 337 +++
.../plc4x/test/ParserSerializerTestsuite.c | 359 +++
.../include/alarm_message_ack_object_push_type.h | 1 -
.../s7/include/alarm_message_object_ack_type.h | 2 -
.../s7/include/alarm_message_object_push_type.h | 1 -
.../s7/include/alarm_message_object_query_type.h | 1 -
.../s7/include/alarm_message_query_type.h | 1 -
.../s7/include/alarm_state_type.h | 4 +-
plc4c/generated-sources/s7/include/alarm_type.h | 4 +-
.../s7/include/cotp_protocol_class.h | 4 +-
.../generated-sources/s7/include/cotp_tpdu_size.h | 4 +-
.../s7/include/cpu_subscribe_events.h | 4 +-
plc4c/generated-sources/s7/include/data_item.h | 6 +-
.../s7/include/data_transport_error_code.h | 4 +-
.../s7/include/data_transport_size.h | 4 +-
plc4c/generated-sources/s7/include/device_group.h | 4 +-
plc4c/generated-sources/s7/include/event_type.h | 4 +-
plc4c/generated-sources/s7/include/memory_area.h | 4 +-
.../s7/include/mode_transition_type.h | 4 +-
plc4c/generated-sources/s7/include/query_type.h | 4 +-
.../s7/include/s7_data_alarm_message.h | 2 -
plc4c/generated-sources/s7/include/s7_message.h | 1 -
.../s7/include/s7_payload_user_data_item.h | 6 +-
.../generated-sources/s7/include/syntax_id_type.h | 4 +-
.../s7/include/szl_module_type_class.h | 4 +-
plc4c/generated-sources/s7/include/szl_sublist.h | 4 +-
plc4c/generated-sources/s7/include/tpkt_packet.h | 1 -
.../generated-sources/s7/include/transport_size.h | 4 +-
.../s7/src/alarm_message_ack_object_push_type.c | 25 +-
.../s7/src/alarm_message_ack_push_type.c | 9 +-
.../s7/src/alarm_message_ack_response_type.c | 6 +-
.../s7/src/alarm_message_ack_type.c | 6 +-
.../s7/src/alarm_message_object_ack_type.c | 25 +-
.../s7/src/alarm_message_object_push_type.c | 31 +-
.../s7/src/alarm_message_object_query_type.c | 27 +-
.../s7/src/alarm_message_push_type.c | 9 +-
.../s7/src/alarm_message_query_type.c | 23 +-
plc4c/generated-sources/s7/src/alarm_state_type.c | 51 +-
plc4c/generated-sources/s7/src/alarm_type.c | 39 +-
.../s7/src/associated_value_type.c | 17 +-
plc4c/generated-sources/s7/src/cotp_packet.c | 74 +-
plc4c/generated-sources/s7/src/cotp_parameter.c | 30 +-
.../generated-sources/s7/src/cotp_protocol_class.c | 47 +-
plc4c/generated-sources/s7/src/cotp_tpdu_size.c | 55 +-
.../s7/src/cpu_subscribe_events.c | 43 +-
plc4c/generated-sources/s7/src/data_item.c | 150 +-
.../s7/src/data_transport_error_code.c | 51 +-
.../generated-sources/s7/src/data_transport_size.c | 57 +-
plc4c/generated-sources/s7/src/date_and_time.c | 24 +-
plc4c/generated-sources/s7/src/device_group.c | 39 +-
plc4c/generated-sources/s7/src/event_type.c | 43 +-
plc4c/generated-sources/s7/src/memory_area.c | 65 +-
.../s7/src/mode_transition_type.c | 63 +-
plc4c/generated-sources/s7/src/query_type.c | 39 +-
plc4c/generated-sources/s7/src/s7_address.c | 29 +-
.../s7/src/s7_data_alarm_message.c | 339 ++-
plc4c/generated-sources/s7/src/s7_message.c | 45 +-
plc4c/generated-sources/s7/src/s7_parameter.c | 722 +++--
.../s7/src/s7_parameter_user_data_item.c | 38 +-
plc4c/generated-sources/s7/src/s7_payload.c | 4 +-
.../s7/src/s7_payload_user_data_item.c | 1832 ++++++------
.../s7/src/s7_var_payload_data_item.c | 23 +-
.../s7/src/s7_var_payload_status_item.c | 7 +-
.../s7/src/s7_var_request_parameter_item.c | 17 +-
plc4c/generated-sources/s7/src/state.c | 24 +-
plc4c/generated-sources/s7/src/syntax_id_type.c | 79 +-
.../generated-sources/s7/src/szl_data_tree_item.c | 12 +-
plc4c/generated-sources/s7/src/szl_id.c | 17 +-
.../s7/src/szl_module_type_class.c | 43 +-
plc4c/generated-sources/s7/src/szl_sublist.c | 103 +-
plc4c/generated-sources/s7/src/tpkt_packet.c | 13 +-
plc4c/generated-sources/s7/src/transport_size.c | 131 +-
.../s7/test/ParserSerializerTestsuite.c | 479 ++++
plc4c/pom.xml | 109 +-
plc4c/spi/CMakeLists.txt | 2 +-
plc4c/spi/include/plc4c/spi/evaluation_helper.h | 2 +
plc4c/spi/include/plc4c/spi/types_private.h | 2 +-
plc4c/spi/src/data.c | 44 +-
plc4c/spi/src/evaluation_helper.c | 5 +
plc4c/spi/src/read_buffer.c | 4 +-
plc4c/spi/src/write_buffer.c | 8 +-
plc4c/spi/test/utils/test_utils.c | 49 +
plc4c/spi/test/write_buffer_test.c | 90 +-
.../discovery/hello_world_plc4go_knx_discovery.go | 8 +-
plc4go/go.mod | 2 +
plc4go/go.sum | 4 +-
plc4j/utils/test-generator/pom.xml | 6 +-
pom.xml | 1 -
.../main/resources/protocols/plc4x/v0/plc4x.mspec | 18 +-
.../s7/src/main/resources/protocols/s7/s7.mspec | 2 +-
170 files changed, 11790 insertions(+), 4291 deletions(-)
diff --git a/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index 18a009a..f76ad56 100644
--- a/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -315,9 +315,6 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
String discriminatorName = variableLiteral.getDiscriminatorName();
final TypeReference typeReference = typeRefRetriever.apply(variableLiteral.getName());
Optional<TypeReference> discriminatorType = typeReference.getDiscriminatorType(variableLiteral);
- if (discriminatorType.isEmpty()) {
- throw new RuntimeException("no type for " + discriminatorName);
- }
discriminatorTypes.put(discriminatorName, discriminatorType.orElse(null));
}
return discriminatorTypes;
diff --git a/code-generation/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java b/code-generation/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
index 0d627dd..f417b92 100644
--- a/code-generation/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
+++ b/code-generation/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
@@ -121,7 +121,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
if (typeReference.isComplexTypeReference()) {
final TypeDefinition typeDefinition = getTypeDefinitionForTypeReference(typeReference);
if (typeDefinition instanceof DataIoTypeDefinition) {
- return "plc4c_data*";
+ return "plc4c_data";
}
}
return getLanguageTypeNameForTypeReference(typeReference);
@@ -364,6 +364,10 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
@Override
public String getReadBufferReadMethodCall(SimpleTypeReference simpleTypeReference, String valueString, TypedField field) {
+ return getReadBufferReadMethodCall(thisType, simpleTypeReference, valueString, field);
+ }
+
+ public String getReadBufferReadMethodCall(TypeDefinition baseType, SimpleTypeReference simpleTypeReference, String valueString, TypedField field) {
switch (simpleTypeReference.getBaseType()) {
case BIT:
return "plc4c_spi_read_bit(readBuffer, (bool*) " + valueString + ")";
@@ -415,6 +419,10 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
}
String encoding = ((StringLiteral) encodingTerm).getValue();
String length = Integer.toString(simpleTypeReference.getSizeInBits());
+ if (simpleTypeReference.getBaseType() == SimpleTypeReference.SimpleBaseType.VSTRING) {
+ VstringTypeReference vstringTypeReference = (VstringTypeReference) simpleTypeReference;
+ length = toParseExpression(baseType, field, vstringTypeReference.getLengthExpression(), null);
+ }
return "plc4c_spi_read_string(readBuffer, " + length + ", \"" +
encoding + "\"" + ", (char**) " + valueString + ")";
default:
@@ -424,6 +432,10 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
@Override
public String getWriteBufferWriteMethodCall(SimpleTypeReference simpleTypeReference, String fieldName, TypedField field) {
+ return getWriteBufferWriteMethodCall(thisType, simpleTypeReference, fieldName, field);
+ }
+
+ public String getWriteBufferWriteMethodCall(TypeDefinition baseType, SimpleTypeReference simpleTypeReference, String fieldName, TypedField field) {
switch (simpleTypeReference.getBaseType()) {
case BIT:
return "plc4c_spi_write_bit(writeBuffer, " + fieldName + ")";
@@ -475,6 +487,10 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
}
String encoding = ((StringLiteral) encodingTerm).getValue();
String length = Integer.toString(simpleTypeReference.getSizeInBits());
+ if (simpleTypeReference.getBaseType() == SimpleTypeReference.SimpleBaseType.VSTRING) {
+ VstringTypeReference vstringTypeReference = (VstringTypeReference) simpleTypeReference;
+ length = toParseExpression(baseType, field, vstringTypeReference.getLengthExpression(), null);
+ }
return "plc4c_spi_write_string(writeBuffer, " + length + ", \"" +
encoding + "\", " + fieldName + ")";
default:
@@ -527,6 +543,12 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
return toParseExpression(baseType, field, term, parserArguments);
}
+ public String toDataIoParseExpression(TypeDefinition baseType, Field field, Term term, List<Argument> parserArguments) {
+ final List<Argument> arguments = new ArrayList<>(parserArguments);
+ arguments.add(new DefaultArgument(new DefaultComplexTypeReference("plc4c_data", Collections.emptyList()),"_value"));
+ return toExpression(baseType, field, term, variableLiteral -> toVariableParseExpression(baseType, field, variableLiteral, new ArrayList<>(arguments)));
+ }
+
public String toParseExpression(TypeDefinition baseType, Field field, Term term, List<Argument> parserArguments) {
return toExpression(baseType, field, term, variableLiteral -> toVariableParseExpression(baseType, field, variableLiteral, parserArguments));
}
@@ -702,8 +724,16 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
propertyTypeOptional = Optional.of(argument.getType());
}
}
- if (propertyTypeOptional.isEmpty()) {
- throw new FreemarkerException("Could not find property with name '" + name + "' in type " + baseType.getName());
+ if(propertyTypeOptional.isEmpty()) {
+ // In data-io we add "_value" arguments artificially.
+ for (Argument parserArgument : parserArguments) {
+ if(parserArgument.getName().equals(name)) {
+ propertyTypeOptional = Optional.of(parserArgument.getType());
+ }
+ }
+ if(propertyTypeOptional.isEmpty()) {
+ throw new FreemarkerException("Could not find property with name '" + name + "' in type " + baseType.getName());
+ }
}
}
@@ -740,7 +770,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
else if (propertyTypeDefinition instanceof EnumTypeDefinition) {
return getCTypeName(propertyTypeDefinition.getName()) +
"_get_" + camelCaseToSnakeCase(variableLiteral.getChild().get().getName()) +
- "(*" + variableLiteral.getName() + ")";
+ "(" + variableLiteral.getName() + ")";
}
// Else ... generate a simple access path.
StringBuilder sb = new StringBuilder(variableLiteral.getName());
diff --git a/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh b/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh
index c59fe39..7bf1dba 100644
--- a/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh
@@ -55,6 +55,7 @@
#include "${helper.camelCaseToSnakeCase(type.name)}.h"
// Code generated by code-generation. DO NOT EDIT.
+<#macro fieldName baseType field>${helper.getFieldName(baseType, field)}</#macro>
<#-- TODO: the code below implies that parserArguments will be null if not present... not pretty -->
<#if type.parserArguments.isPresent()><#assign parserArguments=type.parserArguments.orElseThrow()></#if>
@@ -214,8 +215,9 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
<#if case.name == "BitString">
*data_item = plc4c_data_create_${helper.getLanguageTypeNameForField(field)}_bit_string_data(${simpleField.name});
+ <#elseif case.name == "STRING">
+ *data_item = plc4c_data_create_string_data(strlen(${simpleField.name}), ${simpleField.name});
<#else>
- // Hurz
*data_item = plc4c_data_create_${helper.getLanguageTypeNameForField(field)}_data(${simpleField.name});
</#if>
@@ -228,19 +230,211 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
return OK;
}
-plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data** data_item) {
+plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data* data_item) {
plc4c_return_code _res = OK;
- return OK;
+ <#list type.switchField.cases as case>
+ <#if case.discriminatorValueTerms?has_content>if(<#list case.discriminatorValueTerms as discriminatorValueTerm><#if case.discriminatorValueTerms?size > 1>(</#if><#if helper.discriminatorValueNeedsStringEqualityCheck(type.switchField.discriminatorExpressions[discriminatorValueTerm?index])>strcmp(${helper.toDataIoParseExpression(type, null, type.switchField.discriminatorExpressions[discriminatorValueTerm?index], parserArguments)}, ${helper.toDataIoParseExpression(null, null, discrimin [...]
+ <#list case.fields as field>
+ <#switch field.typeName>
+ <#case "array">
+ <#assign arrayField = field.asArrayField().orElseThrow()>
+
+ // Array Field (${arrayField.name})
+ <#break>
+ <#case "const">
+ <#assign constField = field.asConstField().orElseThrow()>
+ <#assign simpleTypeReference = constField.type.asSimpleTypeReference().orElseThrow()>
+
+ // Const Field (${constField.name})
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ <#break>
+ <#case "enum">
+ <#assign enumField = field.asEnumField().orElseThrow()>
+
+ // Enum field (${enumField.name})
+ lengthInBits += ${helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName).sizeInBits};
+ <#break>
+ <#case "implicit">
+ <#assign implicitField = field.asImplicitField().orElseThrow()>
+ <#assign simpleTypeReference = implicitField.type.asSimpleTypeReference().orElseThrow()>
+
+ // Implicit Field (${implicitField.name})
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=case field=implicitField/>) * 8;
+ <#else>
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ </#if>
+ <#break>
+ <#case "manual">
+ <#assign manualField = field.asManualField().orElseThrow()>
+
+ // Manual Field (${manualField.name})
+ lengthInBits += ${helper.toDataIoParseExpression(case, manualField, manualField.lengthExpression, parserArguments)};
+ <#break>
+ <#case "optional">
+ <#assign optionalField = field.asOptionalField().orElseThrow()>
+
+ // Optional Field (${optionalField.name})
+ if(_message-><@fieldName baseType=case field=optionalField/> != NULL) {
+ <#if optionalField.type.isSimpleTypeReference()>
+ <#assign simpleTypeReference = optionalField.type.asSimpleTypeReference().orElseThrow()>
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=case field=optionalField/>) * 8;
+ <#else>
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ </#if>
+ <#else>
+ lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(optionalField)}(_message-><@fieldName baseType=case field=optionalField/>);
+ </#if>
+ }
+ <#break>
+ <#case "padding">
+ <#assign paddingField = field.asPaddingField().orElseThrow()>
+ <#assign simpleTypeReference = paddingField.type.asSimpleTypeReference().orElseThrow()>
+
+ // Padding Field (padding)
+ int _needsPadding = (int) (${helper.toDataIoParseExpression(case, paddingField, paddingField.paddingCondition, parserArguments)?replace("lastItem", "false")});
+ while(_needsPadding-- > 0) {
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ }
+ <#break>
+ <#case "reserved">
+ <#assign reservedField=field.asReservedField().orElseThrow()>
+ <#assign simpleTypeReference = reservedField.type.asSimpleTypeReference().orElseThrow()>
+
+ // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ <#break>
+ <#case "simple">
+ <#assign simpleField=field.asSimpleField().orElseThrow()>
+
+ // Simple Field (${simpleField.name})
+ <#if simpleField.type.isSimpleTypeReference()>
+ <#assign simpleTypeReference = simpleField.type.asSimpleTypeReference().orElseThrow()>
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=case field=simpleField/>) * 8;
+ <#else>
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ </#if>
+ <#else>
+ lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(simpleField)}(<#if helper.isEnumTypeReference(simpleField.type)>&</#if>_message-><@fieldName baseType=case field=simpleField/>);
+ </#if>
+ <#break>
+ <#default>
+
+ // Intentionally break the build in all not-expected field types
+ raise(SIGSEGV);
+ </#switch>
+ </#list>
+ }<#sep> else </#sep></#list>
+
+ return OK;
}
-uint16_t ${helper.getCTypeName(type.name)}_length_in_bytes(plc4c_data* data_item) {
- return ${helper.getCTypeName(type.name)}_length_in_bits(data_item) / 8;
+uint16_t ${helper.getCTypeName(type.name)}_length_in_bytes(plc4c_data* _value<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !parserArgument.type.isSimpleTypeReference() && !helper.isEnumTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list></#if>) {
+ return ${helper.getCTypeName(type.name)}_length_in_bits(_value<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${parserArgument.name}<#sep>, </#list></#if>) / 8;
}
-uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(plc4c_data* data_item) {
+uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(plc4c_data* _value<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !parserArgument.type.isSimpleTypeReference() && !helper.isEnumTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list></#if>) {
uint16_t lengthInBits = 0;
+ <#list type.switchField.cases as case>
+ <#if case.discriminatorValueTerms?has_content>if(<#list case.discriminatorValueTerms as discriminatorValueTerm><#if case.discriminatorValueTerms?size > 1>(</#if><#if helper.discriminatorValueNeedsStringEqualityCheck(type.switchField.discriminatorExpressions[discriminatorValueTerm?index])>strcmp(${helper.toDataIoParseExpression(type, null, type.switchField.discriminatorExpressions[discriminatorValueTerm?index], parserArguments)}, ${helper.toDataIoParseExpression(null, null, discrimin [...]
+ <#list case.fields as field>
+ <#switch field.typeName>
+ <#case "array">
+ <#assign arrayField = field.asArrayField().orElseThrow()>
+
+ // Array Field (${arrayField.name})
+ <#break>
+ <#case "const">
+ <#assign constField = field.asConstField().orElseThrow()>
+ <#assign simpleTypeReference = constField.type.asSimpleTypeReference().orElseThrow()>
+
+ // Const Field (${constField.name})
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ <#break>
+ <#case "enum">
+ <#assign enumField = field.asEnumField().orElseThrow()>
+
+ // Enum field (${enumField.name})
+ lengthInBits += ${helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName).sizeInBits};
+ <#break>
+ <#case "implicit">
+ <#assign implicitField = field.asImplicitField().orElseThrow()>
+ <#assign simpleTypeReference = implicitField.type.asSimpleTypeReference().orElseThrow()>
+
+ // Implicit Field (${implicitField.name})
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=case field=implicitField/>) * 8;
+ <#else>
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ </#if>
+ <#break>
+ <#case "manual">
+ <#assign manualField = field.asManualField().orElseThrow()>
+
+ // Manual Field (${manualField.name})
+ lengthInBits += ${helper.toDataIoParseExpression(case, manualField, manualField.lengthExpression, parserArguments)};
+ <#break>
+ <#case "optional">
+ <#assign optionalField = field.asOptionalField().orElseThrow()>
+
+ // Optional Field (${optionalField.name})
+ if(_message-><@fieldName baseType=case field=optionalField/> != NULL) {
+ <#if optionalField.type.isSimpleTypeReference()>
+ <#assign simpleTypeReference = optionalField.type.asSimpleTypeReference().orElseThrow()>
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=case field=optionalField/>) * 8;
+ <#else>
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ </#if>
+ <#else>
+ lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(optionalField)}(_message-><@fieldName baseType=case field=optionalField/>);
+ </#if>
+ }
+ <#break>
+ <#case "padding">
+ <#assign paddingField = field.asPaddingField().orElseThrow()>
+ <#assign simpleTypeReference = paddingField.type.asSimpleTypeReference().orElseThrow()>
+
+ // Padding Field (padding)
+ int _needsPadding = (int) (${helper.toDataIoParseExpression(case, paddingField, paddingField.paddingCondition, parserArguments)?replace("lastItem", "false")});
+ while(_needsPadding-- > 0) {
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ }
+ <#break>
+ <#case "reserved">
+ <#assign reservedField=field.asReservedField().orElseThrow()>
+ <#assign simpleTypeReference = reservedField.type.asSimpleTypeReference().orElseThrow()>
+
+ // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ <#break>
+ <#case "simple">
+ <#assign simpleField=field.asSimpleField().orElseThrow()>
+
+ // Simple Field (${simpleField.name})
+ <#if simpleField.type.isSimpleTypeReference()>
+ <#assign simpleTypeReference = simpleField.type.asSimpleTypeReference().orElseThrow()>
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=case field=simpleField/>) * 8;
+ <#else>
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ </#if>
+ <#else>
+ lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(simpleField)}(<#if helper.isEnumTypeReference(simpleField.type)>&</#if>_message-><@fieldName baseType=case field=simpleField/>);
+ </#if>
+ <#break>
+ <#default>
+
+ // Intentionally break the build in all not-expected field types
+ raise(SIGSEGV);
+ </#switch>
+ </#list>
+ }<#sep> else </#sep></#list>
+
return lengthInBits;
}
diff --git a/code-generation/language-c/src/main/resources/templates/c/data-io-template.h.ftlh b/code-generation/language-c/src/main/resources/templates/c/data-io-template.h.ftlh
index dc8592b..adcb234 100644
--- a/code-generation/language-c/src/main/resources/templates/c/data-io-template.h.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/data-io-template.h.ftlh
@@ -80,11 +80,11 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
<#--
Define the serialize-method for elements of this tpye
-->
-plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data** data_item);
+plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data* data_item);
-uint16_t ${helper.getCTypeName(type.name)}_length_in_bytes(plc4c_data* data_item);
+uint16_t ${helper.getCTypeName(type.name)}_length_in_bytes(plc4c_data* _value<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !parserArgument.type.isSimpleTypeReference() && !helper.isEnumTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list></#if>);
-uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(plc4c_data* data_item);
+uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(plc4c_data* _value<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !parserArgument.type.isSimpleTypeReference() && !helper.isEnumTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list></#if>);
#ifdef __cplusplus
}
diff --git a/code-generation/language-c/src/main/resources/templates/c/enum-template.c.ftlh b/code-generation/language-c/src/main/resources/templates/c/enum-template.c.ftlh
index 343c4be..bdb4c84 100644
--- a/code-generation/language-c/src/main/resources/templates/c/enum-template.c.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/enum-template.c.ftlh
@@ -61,17 +61,33 @@ ${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_null() {
return ${helper.getCTypeName(type.name)}_null_const;
}
-// Parse function.
-plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* readBuffer, ${helper.getCTypeName(type.name)}** _message) {
- plc4c_return_code _res = OK;
+${helper.getLanguageTypeNameForTypeReference(type.type)} ${helper.getCTypeName(type.name)}_get_value(${helper.getCTypeName(type.name)} value) {
+ switch(value) {
+ <#list type.enumValues as enumValue>
+ case ${helper.getCTypeName(type.name)}_${enumValue.name}:
+ return (${helper.getLanguageTypeNameForTypeReference(type.type)}) ${enumValue.value};
+ </#list>
+ }
+ return 0;
+}
- // Allocate enough memory to contain this data structure.
- (*_message) = malloc(sizeof(${helper.getCTypeName(type.name)}));
- if(*_message == NULL) {
- return NO_MEMORY;
+${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_for_value(${helper.getLanguageTypeNameForTypeReference(type.type)} value) {
+ switch(value) {
+ <#list type.enumValues as enumValue>
+ case (${helper.getLanguageTypeNameForTypeReference(type.type)}) ${enumValue.value}:
+ return ${helper.getCTypeName(type.name)}_${enumValue.name};
+ </#list>
}
+ return 0;
+}
+
+ // Parse function.
+plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* readBuffer, ${helper.getCTypeName(type.name)}* _message) {
+ plc4c_return_code _res = OK;
- _res = ${helper.getReadBufferReadMethodCall(type.type.asSimpleTypeReference().orElseThrow(), "*_message", null)?no_esc};
+ ${helper.getLanguageTypeNameForTypeReference(type.type)} value;
+ _res = ${helper.getReadBufferReadMethodCall(type.type.asSimpleTypeReference().orElseThrow(), "&value", null)?no_esc};
+ *_message = ${helper.getCTypeName(type.name)}_for_value(value);
return _res;
}
@@ -79,7 +95,8 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* writeBuffer, ${helper.getCTypeName(type.name)}* _message) {
plc4c_return_code _res = OK;
- _res = ${helper.getWriteBufferWriteMethodCall(type.type.asSimpleTypeReference().orElseThrow(), "*_message", null)?no_esc};
+ ${helper.getLanguageTypeNameForTypeReference(type.type)} value = ${helper.getCTypeName(type.name)}_get_value(*_message);
+ _res = ${helper.getWriteBufferWriteMethodCall(type.type.asSimpleTypeReference().orElseThrow(), "value", null)?no_esc};
return _res;
}
diff --git a/code-generation/language-c/src/main/resources/templates/c/enum-template.h.ftlh b/code-generation/language-c/src/main/resources/templates/c/enum-template.h.ftlh
index 6a5a00b..3438e07 100644
--- a/code-generation/language-c/src/main/resources/templates/c/enum-template.h.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/enum-template.h.ftlh
@@ -80,13 +80,15 @@ ${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_null();
<#--
Define the parse-method for elements of this tpye
-->
-plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* readBuffer, ${helper.getCTypeName(type.name)}** message);
+plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* readBuffer, ${helper.getCTypeName(type.name)}* message);
<#--
Define the serialize-method for elements of this tpye
-->
plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* writeBuffer, ${helper.getCTypeName(type.name)}* message);
+${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_for_value(${helper.getLanguageTypeNameForTypeReference(type.type)} value);
+
${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_value_of(char* value_string);
int ${helper.getCTypeName(type.name)}_num_values();
diff --git a/code-generation/language-c/src/main/resources/templates/c/pojo-template.c.ftlh b/code-generation/language-c/src/main/resources/templates/c/pojo-template.c.ftlh
index 419de41..37dcaae 100644
--- a/code-generation/language-c/src/main/resources/templates/c/pojo-template.c.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/pojo-template.c.ftlh
@@ -102,7 +102,7 @@ ${helper.getLanguageTypeNameForField(constField)} ${helper.getCTypeName(parentTy
</#if>
// Parse function.
-plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* readBuffer, <#if parserArguments?has_content><#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !parserArgument.type.isSimpleTypeReference()>*</#if> ${parserArgument.name}<#sep>, </#list>, </#if>${helper.getCTypeName(type.name)}** _message) {
+plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* readBuffer, <#if parserArguments?has_content><#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !parserArgument.type.isSimpleTypeReference() && !helper.isEnumTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list>, </#if>${helper.getCTypeName(type.name)}** _message) {
uint16_t startPos = plc4c_spi_read_get_pos(readBuffer);
plc4c_return_code _res = OK;
@@ -122,123 +122,123 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
<#assign arrayField = field.asArrayField().orElseThrow()>
<#-- @ftlvariable name="field" type="org.apache.plc4x.plugins.codegenerator.types.fields.ArrayField" -->
-<#if indentContent> </#if> // Array field (${arrayField.name})
+ // Array field (${arrayField.name})
<#-- In all other cases do we have to work with a list, that is later converted to an array -->
-<#if indentContent> </#if> plc4c_list* ${arrayField.name} = NULL;
-<#if indentContent> </#if> plc4c_utils_list_create(&${arrayField.name});
-<#if indentContent> </#if> if(${arrayField.name} == NULL) {
-<#if indentContent> </#if> return NO_MEMORY;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> {
+ plc4c_list* ${arrayField.name} = NULL;
+ plc4c_utils_list_create(&${arrayField.name});
+ if(${arrayField.name} == NULL) {
+ return NO_MEMORY;
+ }
+ {
<#if field.isCountArrayField()>
-<#if indentContent> </#if> // Count array
-<#if indentContent> </#if> uint16_t itemCount = (uint16_t) ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, parserArguments)};
-<#if indentContent> </#if> for(int curItem = 0; curItem < itemCount; curItem++) {
-<#if indentContent> </#if> <#if !arrayField.type.isSimpleTypeReference()>bool lastItem = curItem == (itemCount - 1);</#if>
+ // Count array
+ uint16_t itemCount = (uint16_t) ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, parserArguments)};
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ <#if !arrayField.type.isSimpleTypeReference()>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 arrayField.type.isSimpleTypeReference()>
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForTypeReference(arrayField.type)}* _value = malloc(sizeof(${helper.getLanguageTypeNameForTypeReference(arrayField.type)}));
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(arrayField.type, "_value", field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
+ ${helper.getLanguageTypeNameForTypeReference(arrayField.type)}* _value = malloc(sizeof(${helper.getLanguageTypeNameForTypeReference(arrayField.type)}));
+ _res = ${helper.getReadBufferReadMethodCall(baseType, arrayField.type.asSimpleTypeReference().orElseThrow(), "_value", arrayField)};
+ if(_res != OK) {
+ return _res;
+ }
+ 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) -->
-<#if indentContent> </#if> ${helper.getCTypeName(arrayField.type.name)}* _value = NULL;
-<#if indentContent> </#if> _res = ${helper.getCTypeName(arrayField.type.name)}_parse(readBuffer<#if arrayField.type.isComplexTypeReference() && arrayField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list arrayField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
+ ${helper.getCTypeName(arrayField.type.asComplexTypeReference().orElseThrow().name)}* _value = NULL;
+ _res = ${helper.getCTypeName(arrayField.type.asComplexTypeReference().orElseThrow().name)}_parse(readBuffer<#if arrayField.type.isComplexTypeReference() && arrayField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list arrayField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+ if(_res != OK) {
+ return _res;
+ }
+ plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
</#if>
-<#if indentContent> </#if> }
+ }
<#-- For a length array, we read data till the read position of the buffer reaches a given position -->
<#elseif arrayField.isLengthArrayField()>
-<#if indentContent> </#if> // Length array
-<#if indentContent> </#if> uint8_t _${arrayField.name}Length = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, parserArguments)};
-<#if indentContent> </#if> uint8_t ${arrayField.name}EndPos = plc4c_spi_read_get_pos(readBuffer) + _${arrayField.name}Length;
-<#if indentContent> </#if> while(plc4c_spi_read_get_pos(readBuffer) < ${arrayField.name}EndPos) {
+ // Length array
+ uint8_t _${arrayField.name}Length = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, parserArguments)};
+ uint8_t ${arrayField.name}EndPos = plc4c_spi_read_get_pos(readBuffer) + _${arrayField.name}Length;
+ while(plc4c_spi_read_get_pos(readBuffer) < ${arrayField.name}EndPos) {
<#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
<#if arrayField.type.isSimpleTypeReference()>
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} _value = ${helper.getNullValueForTypeReference(arrayField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(arrayField.type, "&_value", arrayField)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> plc4c_utils_list_insert_head_value(${arrayField.name}, &_value);
+ ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} _value = ${helper.getNullValueForTypeReference(arrayField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, arrayField.type.asSimpleTypeReference().orElseThrow(), "&_value", arrayField)};
+ if(_res != OK) {
+ return _res;
+ }
+ 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) -->
-<#if indentContent> </#if> ${helper.getCTypeName(arrayField.type.name)}* _value = NULL;
-<#if indentContent> </#if> _res = ${helper.getCTypeName(arrayField.type.name)}_parse(readBuffer<#if arrayField.type.isComplexTypeReference() && arrayField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list arrayField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
+ ${helper.getCTypeName(arrayField.type.asComplexTypeReference().orElseThrow().name)}* _value = NULL;
+ _res = ${helper.getCTypeName(arrayField.type.asComplexTypeReference().orElseThrow().name)}_parse(readBuffer<#if arrayField.type.isComplexTypeReference() && arrayField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list arrayField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+ if(_res != OK) {
+ return _res;
+ }
+ plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
</#if>
<#-- After parsing, update the current position, but only if it's needed -->
-<#if indentContent> </#if> }
+ }
<#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
<#elseif arrayField.isTerminatedArrayField()>
-<#if indentContent> </#if> // Terminated array
-<#if indentContent> </#if> while(!((boolean) (${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, parserArguments)}))) {
+ // Terminated array
+ while(!((boolean) (${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, parserArguments)}))) {
<#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
<#if arrayField.type.isSimpleTypeReference()>
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} _value = ${helper.getNullValueForTypeReference(arrayField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(arrayField.type, "&_value", field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> plc4c_utils_list_insert_head_value(${arrayField.name}, &_value);
+ ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} _value = ${helper.getNullValueForTypeReference(arrayField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, arrayField.type.asSimpleTypeReference().orElseThrow(), "&_value", arrayField)};
+ if(_res != OK) {
+ return _res;
+ }
+ 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) -->
-<#if indentContent> </#if> ${helper.getCTypeName(arrayField.type.name)}* _value = NULL;
-<#if indentContent> </#if> _res = ${helper.getCTypeName(arrayField.type.name)}_parse(readBuffer<#if arrayField.type.isComplexTypeReference() && arrayField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list arrayField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
+ ${helper.getCTypeName(arrayField.type.asComplexTypeReference().orElseThrow().name)}* _value = NULL;
+ _res = ${helper.getCTypeName(arrayField.type.asComplexTypeReference().orElseThrow().name)}_parse(readBuffer<#if arrayField.type.isComplexTypeReference() && arrayField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list arrayField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+ if(_res != OK) {
+ return _res;
+ }
+ plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
</#if>
<#-- After parsing, update the current position, but only if it's needed -->
-<#if indentContent> </#if> }
+ }
</#if>
-<#if indentContent> </#if> }
-<#if indentContent> </#if> (*_message)-><@fieldName baseType=baseType field=arrayField/> = ${arrayField.name};
+ }
+ (*_message)-><@fieldName baseType=baseType field=arrayField/> = ${arrayField.name};
<#break>
<#case "checksum">
<#assign checksumField = field.asChecksumField().orElseThrow()>
<#assign simpleTypeReference = checksumField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Checksum Field (${checksumField.name})
-<#if indentContent> </#if> {
-<#if indentContent> </#if> // Create an array of all the bytes read in this message element so far.
-<#if indentContent> </#if> unsigned char checksumRawData[] = plc4c_spi_read_get_bytes(readBuffer, startPos, plc4c_spi_read_get_pos(readBuffer));
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getNullValueForTypeReference(checksumField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(checksumField.type, "&_checksumRef", field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, parserArguments)});
-<#if indentContent> </#if> if(_checksum != _checksumRef) {
-<#if indentContent> </#if> return PARSE_ERROR;
-<#if indentContent> </#if> // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
+ // Checksum Field (${checksumField.name})
+ {
+ // Create an array of all the bytes read in this message element so far.
+ unsigned char checksumRawData[] = plc4c_spi_read_get_bytes(readBuffer, startPos, plc4c_spi_read_get_pos(readBuffer));
+ ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getNullValueForTypeReference(checksumField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, checksumField.type.asSimpleTypeReference().orElseThrow(), "&_checksumRef", checksumField)};
+ if(_res != OK) {
+ return _res;
+ }
+ ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, parserArguments)});
+ if(_checksum != _checksumRef) {
+ return PARSE_ERROR;
+ // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
+ }
+ }
<#break>
<#case "const">
<#assign constField = field.asConstField().orElseThrow()>
<#assign simpleTypeReference = constField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Const Field (${constField.name})
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${constField.name} = ${helper.getNullValueForTypeReference(constField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(constField.type, "&" + constField.name, field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> if(${constField.name} != ${helper.getCTypeName(baseType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case}()) {
-<#if indentContent> </#if> return PARSE_ERROR;
-<#if indentContent> </#if> // throw new ParseException("Expected constant value " + ${helper.getCTypeName(baseType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case} + " but got " + ${constField.name});
-<#if indentContent> </#if> }
+ // Const Field (${constField.name})
+ ${helper.getLanguageTypeNameForField(field)} ${constField.name} = ${helper.getNullValueForTypeReference(constField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, constField.type.asSimpleTypeReference().orElseThrow(), "&" + constField.name, constField)};
+ if(_res != OK) {
+ return _res;
+ }
+ if(${constField.name} != ${helper.getCTypeName(baseType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case}()) {
+ return PARSE_ERROR;
+ // 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">
<#assign discriminatorField = field.asDiscriminatorField().orElseThrow()>
@@ -246,43 +246,45 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
<#if discriminatorField.type.isSimpleTypeReference()>
<#assign simpleTypeReference = discriminatorField.type>
-<#if indentContent> </#if> // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${discriminatorField.name} = ${helper.getNullValueForTypeReference(discriminatorField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(discriminatorField.type, "&" + discriminatorField.name, field)};
+ // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
+ ${helper.getLanguageTypeNameForField(field)} ${discriminatorField.name} = ${helper.getNullValueForTypeReference(discriminatorField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, discriminatorField.type.asSimpleTypeReference().orElseThrow(), "&" + discriminatorField.name, discriminatorField)};
<#elseif helper.isEnumField(field)>
<#assign simpleTypeReference = discriminatorField.type>
-<#if indentContent> </#if> enum ${helper.getLanguageTypeNameForTypeReference(discriminatorField.type)} ${discriminatorField.name};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(discriminatorField.type), "&${discriminatorField.name}", field)};
+ ${helper.getLanguageTypeNameForTypeReference(discriminatorField.type)} ${discriminatorField.name};
+ ${helper.getLanguageTypeNameForTypeReference(helper.getEnumBaseTypeReference(discriminatorField.type))} ${discriminatorField.name}_raw_value;
+ _res = ${helper.getReadBufferReadMethodCall(baseType, helper.getEnumBaseTypeReference(discriminatorField.type), "&${discriminatorField.name}_raw_value", discriminatorField)};
+ ${discriminatorField.name} = ${helper.getLanguageTypeNameForTypeReference(discriminatorField.type)}_for_value(${discriminatorField.name}_raw_value);
</#if>
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
+ if(_res != OK) {
+ return _res;
+ }
<#break>
<#case "enum">
<#assign enumField = field.asEnumField().orElseThrow()>
-<#if indentContent> </#if> // Enum field (${enumField.name})
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getNullValueForTypeReference(enumField.type)};
-<#if indentContent> </#if> {
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForTypeReference(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName))} _constantValue = ${helper.getNullValueForTypeReference(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName))};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), "&_constantValue", field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> ${enumField.name} = ${helper.getLanguageTypeNameForTypeReference(enumField.type)}_get_first_enum_for_field_${helper.camelCaseToSnakeCase(enumField.fieldName)}(_constantValue);
-<#if indentContent> </#if> }
-<#if indentContent> </#if> (*_message)-><@fieldName baseType=baseType field=enumField/> = ${enumField.name};
+ // Enum field (${enumField.name})
+ ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getNullValueForTypeReference(enumField.type)};
+ {
+ ${helper.getLanguageTypeNameForTypeReference(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName))} _constantValue = ${helper.getNullValueForTypeReference(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName))};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), "&_constantValue", enumField)};
+ if(_res != OK) {
+ return _res;
+ }
+ ${enumField.name} = ${helper.getLanguageTypeNameForTypeReference(enumField.type)}_get_first_enum_for_field_${helper.camelCaseToSnakeCase(enumField.fieldName)}(_constantValue);
+ }
+ (*_message)-><@fieldName baseType=baseType field=enumField/> = ${enumField.name};
<#break>
<#case "implicit">
<#assign implicitField = field.asImplicitField().orElseThrow()>
<#assign simpleTypeReference = implicitField.type>
-<#if indentContent> </#if> // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = ${helper.getNullValueForTypeReference(implicitField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(implicitField.type, "&" + implicitField.name, field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
+ // Implicit Field (${implicitField.name}) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ ${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = ${helper.getNullValueForTypeReference(implicitField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, implicitField.type.asSimpleTypeReference().orElseThrow(), "&" + implicitField.name, implicitField)};
+ if(_res != OK) {
+ return _res;
+ }
<#break>
<#case "manualArray">
<#assign manualArrayField = field.asManualArrayField().orElseThrow()>
@@ -292,99 +294,132 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
<#case "manual">
<#assign manualField = field.asManualField().orElseThrow()>
-<#if indentContent> </#if> // Manual Field (${manualField.name})<#-- check if complex -->
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, manualField, manualField.parseExpression, parserArguments)});
-<#if indentContent> </#if> (*_message)-><@fieldName baseType=baseType field=manualField/> = ${manualField.name};
+ // Manual Field (${manualField.name})<#-- check if complex -->
+ ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, manualField, manualField.parseExpression, parserArguments)});
+ (*_message)-><@fieldName baseType=baseType field=manualField/> = ${manualField.name};
<#break>
<#case "optional">
<#assign optionalField = field.asOptionalField().orElseThrow()>
-<#if indentContent> </#if> // Optional Field (${optionalField.name}) (Can be skipped, if a given expression evaluates to false)
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)}* ${optionalField.name} = NULL;
+ // Optional Field (${optionalField.name}) (Can be skipped, if a given expression evaluates to false)
+ ${helper.getLanguageTypeNameForField(field)}* ${optionalField.name} = NULL;
<#if optionalField.conditionExpression.present>
-<#if indentContent> </#if> if(${helper.toParseExpression(baseType, field, optionalField.conditionExpression.get(), parserArguments)}) {
+ if(${helper.toParseExpression(baseType, field, optionalField.conditionExpression.get(), parserArguments)}) {
</#if>
<#if optionalField.type.isSimpleTypeReference()>
-<#if indentContent> </#if> ${optionalField.name} = malloc(sizeof(${helper.getLanguageTypeNameForField(field)}));
-<#if indentContent> </#if> if(${optionalField.name} == NULL) {
-<#if indentContent> </#if> return NO_MEMORY;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> *${optionalField.name} = ${helper.getNullValueForTypeReference(optionalField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(optionalField.type, optionalField.name, field)};
+ ${optionalField.name} = malloc(sizeof(${helper.getLanguageTypeNameForField(field)}));
+ if(${optionalField.name} == NULL) {
+ return NO_MEMORY;
+ }
+ *${optionalField.name} = ${helper.getNullValueForTypeReference(optionalField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, optionalField.type.asSimpleTypeReference().orElseThrow(), optionalField.name, optionalField)};
<#else>
-<#if indentContent> </#if> _res = ${helper.getCTypeName(optionalField.type.name)}_parse(readBuffer<#if optionalField.type.isComplexTypeReference() && optionalField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list optionalField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, optionalField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, &${optionalField.name});
+ _res = ${helper.getCTypeName(optionalField.type.asComplexTypeReference().orElseThrow().name)}_parse(readBuffer<#if optionalField.type.isComplexTypeReference() && optionalField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list optionalField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, optionalField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, &${optionalField.name});
</#if>
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> (*_message)-><@fieldName baseType=baseType field=optionalField/> = ${optionalField.name};
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)-><@fieldName baseType=baseType field=optionalField/> = ${optionalField.name};
<#if optionalField.conditionExpression.present>
-<#if indentContent> </#if> } else {
-<#if indentContent> </#if> (*_message)-><@fieldName baseType=baseType field=optionalField/> = NULL;
-<#if indentContent> </#if> }
+ } else {
+ (*_message)-><@fieldName baseType=baseType field=optionalField/> = NULL;
+ }
</#if>
<#break>
<#case "padding">
<#assign paddingField = field.asPaddingField().orElseThrow()>
<#assign simpleTypeReference = paddingField.type>
-<#if indentContent> </#if> // Padding Field (padding)
-<#if indentContent> </#if> {
-<#if indentContent> </#if> int _timesPadding = (int) ((plc4c_spi_read_has_more(readBuffer, ${helper.getNumBits(paddingField.type)})) && (${helper.toParseExpression(baseType, paddingField, paddingField.paddingCondition, parserArguments)}));
-<#if indentContent> </#if> while (_timesPadding-- > 0) {
-<#if indentContent> </#if> // Just read the padding data and ignore it
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _paddingValue = ${helper.getNullValueForTypeReference(paddingField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(paddingField.type, "&_paddingValue", field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
+ // Padding Field (padding)
+ {
+ int _timesPadding = (int) ((plc4c_spi_read_has_more(readBuffer, ${helper.getNumBits(paddingField.type.asSimpleTypeReference().orElseThrow())})) && (${helper.toParseExpression(baseType, paddingField, paddingField.paddingCondition, parserArguments)}));
+ while (_timesPadding-- > 0) {
+ // Just read the padding data and ignore it
+ ${helper.getLanguageTypeNameForField(field)} _paddingValue = ${helper.getNullValueForTypeReference(paddingField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, paddingField.type.asSimpleTypeReference().orElseThrow(), "&_paddingValue", paddingField)};
+ if(_res != OK) {
+ return _res;
+ }
+ }
+ }
<#break>
<#case "reserved">
<#assign reservedField = field.asReservedField().orElseThrow()>
<#assign simpleTypeReference = reservedField.type>
-<#if indentContent> </#if> // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
-<#if indentContent> </#if> {
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _reserved = ${helper.getNullValueForTypeReference(reservedField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(reservedField.type, "&_reserved", field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> if(_reserved != ${reservedField.referenceValue}) {
-<#if indentContent> </#if> printf("Expected constant value '%d' but got '%d' for reserved field.", ${reservedField.referenceValue}, _reserved);
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
+ // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+ {
+ ${helper.getLanguageTypeNameForField(field)} _reserved = ${helper.getNullValueForTypeReference(reservedField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, reservedField.type.asSimpleTypeReference().orElseThrow(), "&_reserved", reservedField)};
+ if(_res != OK) {
+ return _res;
+ }
+ if(_reserved != ${reservedField.referenceValue}) {
+ printf("Expected constant value '%d' but got '%d' for reserved field.", ${reservedField.referenceValue}, _reserved);
+ }
+ }
<#break>
<#case "simple">
<#assign simpleField = field.asSimpleField().orElseThrow()>
-<#if indentContent> </#if> // Simple Field (${simpleField.name})
+ // Simple Field (${simpleField.name})
<#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
<#if simpleField.type.isSimpleTypeReference()>
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = ${helper.getNullValueForTypeReference(simpleField.type)};
-<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(simpleField.type, "&" + simpleField.name, field)};
+ ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = ${helper.getNullValueForTypeReference(simpleField.type)};
+ _res = ${helper.getReadBufferReadMethodCall(baseType, simpleField.type.asSimpleTypeReference().orElseThrow(), "&" + simpleField.name, simpleField)};
+ <#elseif helper.isEnumTypeReference(simpleField.type)>
+ <#-- 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};
+ _res = ${helper.getCTypeName(simpleField.type.asComplexTypeReference().orElseThrow().name)}_parse(readBuffer<#if simpleField.type.isComplexTypeReference() && simpleField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list simpleField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
<#else>
<#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)}* ${simpleField.name};
-<#if indentContent> </#if> _res = ${helper.getCTypeName(simpleField.type.name)}_parse(readBuffer<#if simpleField.type.isComplexTypeReference() && simpleField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list simpleField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
+ ${helper.getLanguageTypeNameForField(field)}* ${simpleField.name};
+ _res = ${helper.getCTypeName(simpleField.type.asComplexTypeReference().orElseThrow().name)}_parse(readBuffer<#if simpleField.type.isComplexTypeReference() && simpleField.type.asComplexTypeReference().get().getParams().isPresent()>, <#list simpleField.type.asComplexTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
</#if>
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> (*_message)-><@fieldName baseType=baseType field=simpleField/> = <#if helper.isEnumTypeReference(simpleField.type)>*</#if>${simpleField.name};
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)-><@fieldName baseType=baseType field=simpleField/> = ${simpleField.name};
<#break>
<#case "switch">
<#assign switchField = field.asSwitchField().orElseThrow()>
-<#if indentContent> </#if> // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+ // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
<#list switchField.cases as case>
- <#if !helper.getDiscriminatorTypes()[field.discriminatorExpressions[0].name].isComplexTypeReference()>
-<#if indentContent> </#if> <#if case.discriminatorValueTerms?has_content>if(<#list case.discriminatorValueTerms as discriminatorValueTerm><#if case.discriminatorValueTerms?size > 1>(</#if>${helper.toVariableParseExpression(baseType, switchField, switchField.discriminatorExpressions[discriminatorValueTerm?index].asLiteral().orElseThrow().asVariableLiteral().orElseThrow(), parserArguments)} == ${helper.toParseExpression(type, null, discriminatorValueTerm, parserArguments)}<#if case.di [...]
- <#else>
-<#if indentContent> </#if> <#if case.discriminatorValueTerms?has_content>if(<#list case.discriminatorValueTerms as discriminatorValueTerm><#if case.discriminatorValueTerms?size > 1>(</#if>${helper.toVariableParseExpression(baseType, switchField, switchField.discriminatorExpressions[discriminatorValueTerm?index].asLiteral().orElseThrow().asVariableLiteral().orElseThrow(), parserArguments)} == ${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[switchField.disc [...]
- </#if>
+<@compress single_line=true>
+ <#--if helper.getDiscriminatorTypes()[switchField.discriminatorExpressions[0].name]?has_content && !helper.getDiscriminatorTypes()[switchField.discriminatorExpressions[0].name].isComplexTypeReference()>
+ <#if case.discriminatorValueTerms?has_content>
+ if(
+ <#list case.discriminatorValueTerms as discriminatorValueTerm>
+ <#if case.discriminatorValueTerms?size > 1>(</#if>
+ ${helper.toVariableParseExpression(baseType, switchField, switchField.discriminatorExpressions[discriminatorValueTerm?index].asLiteral().orElseThrow().asVariableLiteral().orElseThrow(), parserArguments)} == ${helper.toParseExpression(type, null, discriminatorValueTerm, parserArguments)}
+ <#if case.discriminatorValueTerms?size > 1>)</#if>
+ <#sep> && </#sep>
+ </#list>
+ )
+ </#if>
+ { /* ${case.name} */
+ <#else-->
+ <#if case.discriminatorValueTerms?has_content>
+ if(
+ <#list case.discriminatorValueTerms as discriminatorValueTerm>
+ <#if case.discriminatorValueTerms?size > 1>(</#if>
+ <#assign discriminatorExpression=switchField.discriminatorExpressions[discriminatorValueTerm?index].asLiteral().orElseThrow().asVariableLiteral().orElseThrow()>
+ <#assign discriminatorType=helper.getDiscriminatorTypes()[discriminatorExpression.discriminatorName]>
+ ${helper.toVariableParseExpression(baseType, switchField, discriminatorExpression, parserArguments)} ==
+ <#if helper.isEnumTypeReference(discriminatorType)>
+ ${helper.getLanguageTypeNameForTypeReference(discriminatorType)}_${helper.toParseExpression(switchField, discriminatorType, discriminatorValueTerm, parserArguments)}
+ <#else>
+ ${helper.toParseExpression(switchField, discriminatorType, discriminatorValueTerm, parserArguments)}
+ </#if>
+ <#if case.discriminatorValueTerms?size > 1>)</#if>
+ <#sep> && </#sep>
+ </#list>)
+ </#if>
+ { /* ${case.name} */
+ <#--/#if-->
+</...@compress>
+
<#if baseType.isDiscriminatedChildTypeDefinition()>
<#assign discriminatedChildType = type.asDiscriminatedComplexTypeDefinition().orElseThrow()>
// Accessors for discriminator values.
@@ -392,20 +427,20 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
${discriminatorName}
</#list>
</#if>
-<#if indentContent> </#if> (*_message)->_type = ${helper.getCTypeName(type.name)}_type_${helper.getCTypeName(case.name)};
+ (*_message)->_type = ${helper.getCTypeName(type.name)}_type_${helper.getCTypeName(case.name)};
<#list case.fields as caseField>
-<#if indentContent> </#if> <@fieldParser baseType=case field=caseField indentContent=true/>
+ <@fieldParser baseType=case field=caseField indentContent=true/>
<#sep >
</#list>
-<#if indentContent> </#if> }<#sep> else </#sep>
+ }<#sep> else </#sep>
</#list>
<#break>
<#case "virtual">
<#assign virtualField = field.asVirtualField().orElseThrow()>
-<#if indentContent> </#if> // Virtual field (Just declare a local variable so we can access it in the parser)
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${virtualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, virtualField, virtualField.valueExpression, parserArguments)});
+ // 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(baseType, virtualField, virtualField.valueExpression, parserArguments)});
<#break>
</#switch>
</#macro>
@@ -428,163 +463,176 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
<#case "array">
<#assign arrayField = field.asArrayField().orElseThrow()>
-<#if indentContent> </#if> // Array field (${arrayField.name})
-<#if indentContent> </#if> {
-<#if indentContent> </#if> uint8_t itemCount = plc4c_utils_list_size(_message-><@fieldName baseType=baseType field=arrayField/>);
-<#if indentContent> </#if> for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (${arrayField.name})
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message-><@fieldName baseType=baseType field=arrayField/>);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
<#-- When parsing simple types, there is nothing that could require the "lastItem" -->
-<#if !arrayField.type.isSimpleTypeReference()><#if indentContent> </#if> bool lastItem = curItem == (itemCount - 1);</#if>
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForTypeReference(arrayField.type)}* _value = (${helper.getLanguageTypeNameForTypeReference(arrayField.type)}*) plc4c_utils_list_get_value(_message-><@fieldName baseType=baseType field=arrayField/>, curItem);
+<#if !arrayField.type.isSimpleTypeReference()> bool lastItem = curItem == (itemCount - 1);</#if>
+ ${helper.getLanguageTypeNameForTypeReference(arrayField.type)}* _value = (${helper.getLanguageTypeNameForTypeReference(arrayField.type)}*) plc4c_utils_list_get_value(_message-><@fieldName baseType=baseType field=arrayField/>, curItem);
<#if arrayField.type.isSimpleTypeReference()>
-<#if indentContent> </#if> ${helper.getWriteBufferWriteMethodCall(arrayField.type, "*_value", field)};
+ ${helper.getWriteBufferWriteMethodCall(baseType, arrayField.type.asSimpleTypeReference().orElseThrow(), "*_value", arrayField)};
<#else>
-<#if indentContent> </#if> _res = ${helper.getCTypeName(arrayField.type.name)}_serialize(writeBuffer, (void*) _value<#--#if helper.getSerializerTerms(field.params.orElse(null))?has_content>, <#list helper.getSerializerTerms(field.params.orElse(null)) as serializerTerm>${helper.toSerializationExpression(baseType, field, serializerTerm, parserArguments)}<#sep>, </#sep></#list></#if-->);
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
+ _res = ${helper.getCTypeName(arrayField.type.asComplexTypeReference().orElseThrow().name)}_serialize(writeBuffer, (void*) _value<#--#if helper.getSerializerTerms(field.params.orElse(null))?has_content>, <#list helper.getSerializerTerms(field.params.orElse(null)) as serializerTerm>${helper.toSerializationExpression(baseType, field, serializerTerm, parserArguments)}<#sep>, </#sep></#list></#if-->);
+ if(_res != OK) {
+ return _res;
+ }
</#if>
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
+ }
+ }
<#break>
<#case "checksum">
- <#assign checksumField = field>
- <#assign simpleTypeReference = checksumField.type>
-
-<#if indentContent> </#if> // Checksum Field (${checksumField.name})
-<#if indentContent> </#if> {
-<#if indentContent> </#if> // Create an array of all the bytes read in this message element so far.
-<#if indentContent> </#if> unsigned char checksumRawData[] = plc4c_spi_read_get_bytes(writeBuffer, startPos, plc4c_spi_read_get_pos(writeBuffer));
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getReadBufferReadMethodCall(checksumField.type, field)};
-<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, parserArguments)});
-<#if indentContent> </#if> if(_checksum != _checksumRef) {
-<#if indentContent> </#if> return PARSE_ERROR;
-<#if indentContent> </#if> // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
+ <#assign checksumField = field.asChecksumField().orElseThrow()>
+ <#assign simpleTypeReference = checksumField.type.asSimpleTypeReference().orElseThrow()>
+
+ // Checksum Field (${checksumField.name})
+ {
+ // Create an array of all the bytes read in this message element so far.
+ unsigned char checksumRawData[] = plc4c_spi_read_get_bytes(writeBuffer, startPos, plc4c_spi_read_get_pos(writeBuffer));
+ <#-- TODO: Fix this -->
+ ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getReadBufferReadMethodCall(baseType, simpleTypeReference, "hurz", checksumField)};
+ ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, parserArguments)});
+ if(_checksum != _checksumRef) {
+ return PARSE_ERROR;
+ // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
+ }
+ }
<#break>
<#case "const">
- <#assign constField = field>
- <#assign simpleTypeReference = constField.type>
+ <#assign constField = field.asConstField().orElseThrow()>
+ <#assign simpleTypeReference = constField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Const Field (${constField.name})
-<#if indentContent> </#if> ${helper.getWriteBufferWriteMethodCall(constField.type, helper.getCTypeName(baseType.name)?upper_case + "_" + helper.camelCaseToSnakeCase(constField.name)?upper_case + "()", field)};
+ // Const Field (${constField.name})
+ ${helper.getLanguageTypeNameForField(field)} ${constField.name} = ${helper.getCTypeName(baseType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case}();
+ ${helper.getWriteBufferWriteMethodCall(baseType, simpleTypeReference, constField.name, constField)};
<#break>
<#case "discriminator">
- <#assign discriminatorField = field>
+ <#assign discriminatorField = field.asDiscriminatorField().orElseThrow()>
<#if helper.isEnumField(field)>
-<#if indentContent> </#if> // Enumerated Discriminator Field (${discriminatorField.name})
-<#if indentContent> </#if> ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(discriminatorField.type), helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name, field)};
+ // Enumerated Discriminator Field (${discriminatorField.name})
+ ${helper.getLanguageTypeNameForField(field)} ${discriminatorField.name} = ${helper.getCTypeName(baseType.name)}_get_discriminator(_message->_type).${discriminatorField.name};
+ ${helper.getLanguageTypeNameForField(field)}_serialize(writeBuffer, &${discriminatorField.name});
<#else>
- <#assign simpleTypeReference = discriminatorField.type>
+ <#assign simpleTypeReference = discriminatorField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Discriminator Field (${discriminatorField.name})
-<#if indentContent> </#if> ${helper.getWriteBufferWriteMethodCall(discriminatorField.type, helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name, field)};
+ // Discriminator Field (${discriminatorField.name})
+ ${helper.getLanguageTypeNameForField(field)} ${discriminatorField.name} = ${helper.getCTypeName(baseType.name)}_get_discriminator(_message->_type).${discriminatorField.name};
+ ${helper.getWriteBufferWriteMethodCall(baseType, simpleTypeReference, discriminatorField.name, discriminatorField)};
</#if>
<#break>
<#case "enum">
<#assign enumField = field.asEnumField().orElseThrow()>
-<#if indentContent> </#if> // Enum field (${enumField.name})
-<#if indentContent> </#if> _res = ${helper.getWriteBufferWriteMethodCall(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), helper.getLanguageTypeNameForTypeReference(enumField.type) + "_get_" + helper.camelCaseToSnakeCase(enumField.fieldName) + "(_message->" + helper.getFieldName(baseType, enumField) + ")", field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
+ // Enum field (${enumField.name})
+ ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getLanguageTypeNameForTypeReference(enumField.type)}_get_${helper.camelCaseToSnakeCase(enumField.fieldName)}(_message->${helper.getFieldName(baseType, enumField)});
+ _res = ${helper.getWriteBufferWriteMethodCall(baseType, helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), enumField.name, enumField)};
+ if(_res != OK) {
+ return _res;
+ }
<#break>
<#case "implicit">
<#assign implicitField = field.asImplicitField().orElseThrow()>
<#assign simpleTypeReference = implicitField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-<#if indentContent> </#if> _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.toSerializationExpression(baseType, implicitField, implicitField.serializeExpression, parserArguments), field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
+ // Implicit Field (${implicitField.name}) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ ${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = ${helper.toSerializationExpression(baseType, implicitField, implicitField.serializeExpression, parserArguments)};
+ _res = ${helper.getWriteBufferWriteMethodCall(baseType, simpleTypeReference, implicitField.name, implicitField)};
+ if(_res != OK) {
+ return _res;
+ }
<#break>
<#case "manualArray">
- <#assign manualArrayField = field>
+ <#assign manualArrayField = field.asArrayField().orElseThrow()>
+ <#assign simpleTypeReference = manualArrayField.type.asSimpleTypeReference().orElseThrow()>
<#-- TODO: Implement -->
<#break>
<#case "manual">
<#assign manualField = field.asManualField().orElseThrow()>
-<#if indentContent> </#if> // Manual Field (${manualField.name})<#if indentContent> </#if> {
-<#if indentContent> </#if> _res = ${helper.toSerializationExpression(baseType, manualField, manualField.serializeExpression, parserArguments)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
+ // Manual Field (${manualField.name}) {
+ ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = ${helper.toSerializationExpression(baseType, manualField, manualField.serializeExpression, parserArguments)};
+ _res = ${helper.getWriteBufferWriteMethodCall(baseType, simpleTypeReference, manualField.name, manualField)};
+ if(_res != OK) {
+ return _res;
+ }
<#break>
<#case "optional">
<#assign optionalField = field.asOptionalField().orElseThrow()>
-<#if indentContent> </#if> // Optional Field (${optionalField.name})
-<#if indentContent> </#if> if(_message-><@fieldName baseType=baseType field=optionalField/> != NULL) {
+ // Optional Field (${optionalField.name})
+ ${helper.getLanguageTypeNameForField(field)}* ${optionalField.name} = _message->${helper.getFieldName(baseType, optionalField)};
+ if(_message-><@fieldName baseType=baseType field=optionalField/> != NULL) {
<#if optionalField.type.isSimpleTypeReference()>
-<#if indentContent> </#if> _res = ${helper.getWriteBufferWriteMethodCall(optionalField.type.asSimpleTypeReference().orElseThrow(), "*_message->" + helper.getFieldName(baseType, optionalField), field)};
+ <#assign simpleTypeReference = optionalField.type.asSimpleTypeReference().orElseThrow()>
+ _res = ${helper.getWriteBufferWriteMethodCall(baseType, simpleTypeReference, "*" + optionalField.name, optionalField)};
<#else>
-<#if indentContent> </#if> _res = ${helper.getCTypeName(optionalField.type.asComplexTypeReference().orElseThrow().name)}_serialize(writeBuffer, _message-><@fieldName baseType=baseType field=optionalField/>);
+ <#assign complexTypeReference = optionalField.type.asComplexTypeReference().orElseThrow()>
+ _res = ${helper.getCTypeName(complexTypeReference.name)}_serialize(writeBuffer, ${optionalField.name});
</#if>
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
+ if(_res != OK) {
+ return _res;
+ }
+ }
<#break>
<#case "padding">
<#assign paddingField = field.asPaddingField().orElseThrow()>
<#assign simpleTypeReference = paddingField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Padding Field (padding)
-<#if indentContent> </#if> {
+ // Padding Field (padding)
+ {
<#-- We're replacing the "lastItem" with 'false' here as the item itself can't know if it is the last -->
-<#if indentContent> </#if> int _timesPadding = (int) (${helper.toSerializationExpression(baseType, paddingField, paddingField.paddingCondition, parserArguments)});
-<#if indentContent> </#if> while (_timesPadding-- > 0) {
-<#if indentContent> </#if> // Just output the default padding data
-<#if indentContent> </#if> _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.toParseExpression(baseType, paddingField, paddingField.paddingValue, parserArguments), field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
+ int _timesPadding = (int) (${helper.toSerializationExpression(baseType, paddingField, paddingField.paddingCondition, parserArguments)});
+ while (_timesPadding-- > 0) {
+ // Just output the default padding data
+ _res = ${helper.getWriteBufferWriteMethodCall(baseType, simpleTypeReference, helper.toParseExpression(baseType, paddingField, paddingField.paddingValue, parserArguments), paddingField)};
+ if(_res != OK) {
+ return _res;
+ }
+ }
+ }
<#break>
<#case "reserved">
<#assign reservedField = field.asReservedField().orElseThrow()>
<#assign simpleTypeReference = reservedField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Reserved Field
-<#if indentContent> </#if> _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, reservedField.referenceValue, field)};
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
+ // Reserved Field
+ _res = ${helper.getWriteBufferWriteMethodCall(baseType, simpleTypeReference, reservedField.referenceValue, reservedField)};
+ if(_res != OK) {
+ return _res;
+ }
<#break>
<#case "simple">
<#assign simpleField = field.asSimpleField().orElseThrow()>
-<#if indentContent> </#if> // Simple Field (${simpleField.name})
+ // Simple Field (${simpleField.name})
<#if simpleField.type.isSimpleTypeReference()>
-<#if indentContent> </#if> _res = ${helper.getWriteBufferWriteMethodCall(simpleField.type, "_message->" + helper.getFieldName(baseType, simpleField), field)};
+ ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = _message->${helper.getFieldName(baseType, simpleField)};
+ _res = ${helper.getWriteBufferWriteMethodCall(baseType, simpleField.type.asSimpleTypeReference().orElseThrow(), simpleField.name, simpleField)};
<#else>
-<#if indentContent> </#if> _res = ${helper.getCTypeName(simpleField.type.name)}_serialize(writeBuffer, <#if helper.isEnumTypeReference(simpleField.type)>&</#if>_message-><@fieldName baseType=baseType field=simpleField/>);
+ ${helper.getLanguageTypeNameForField(field)}<#if !helper.isEnumTypeReference(simpleField.type)>*</#if> ${simpleField.name} = _message->${helper.getFieldName(baseType, simpleField)};
+ _res = ${helper.getCTypeName(simpleField.type.asComplexTypeReference().orElseThrow().name)}_serialize(writeBuffer, <#if helper.isEnumTypeReference(simpleField.type)>&</#if>${simpleField.name});
</#if>
-<#if indentContent> </#if> if(_res != OK) {
-<#if indentContent> </#if> return _res;
-<#if indentContent> </#if> }
+ if(_res != OK) {
+ return _res;
+ }
<#break>
<#case "switch">
<#assign switchField = field.asSwitchField().orElseThrow()>
-<#if indentContent> </#if> // Switch Field (Depending of the current type, serialize the sub-type elements)
-<#if indentContent> </#if> switch(_message->_type) {
+ // Switch Field (Depending on the current type, serialize the sub-type elements)
+ switch(_message->_type) {
<#list switchField.cases as case>
-<#if indentContent> </#if> case ${helper.getCTypeName(type.name)}_type_${helper.getCTypeName(case.name)}: {
+ case ${helper.getCTypeName(type.name)}_type_${helper.getCTypeName(case.name)}: {
<#list case.fields as caseField>
<@fieldSerializer baseType=case field=caseField indentContent=true/>
</#list>
-<#if indentContent> </#if> break;
-<#if indentContent> </#if> }
+ break;
+ }
</#list>
-<#if indentContent> </#if> }
+ }
<#break>
</#switch>
</#macro>
@@ -608,140 +656,152 @@ uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(${helper.getCTypeName(
<#case "array">
<#assign arrayField = field.asArrayField().orElseThrow()>
-<#if indentContent> </#if> // Array field
+ // Array field
<#if arrayField.type.isSimpleTypeReference()>
- <#assign simpleTypeReference = arrayField.type>
-<#if indentContent> </#if> lengthInBits += ${simpleTypeReference.sizeInBits} * plc4c_utils_list_size(_message-><@fieldName baseType=baseType field=arrayField/>);
+ <#assign simpleTypeReference = arrayField.type.asSimpleTypeReference().orElseThrow()>
+ lengthInBits += ${simpleTypeReference.sizeInBits} * plc4c_utils_list_size(_message-><@fieldName baseType=baseType field=arrayField/>);
<#else>
-<#if indentContent> </#if> if(_message-><@fieldName baseType=baseType field=arrayField/> != NULL) {
-<#if indentContent> </#if> plc4c_list_element* curElement = _message-><@fieldName baseType=baseType field=arrayField/>->tail;
-<#if indentContent> </#if> while (curElement != NULL) {
-<#if indentContent> </#if> lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(arrayField)}((${helper.getLanguageTypeNameForTypeReference(arrayField.type)}*) curElement->value);
-<#if indentContent> </#if> curElement = curElement->next;
-<#if indentContent> </#if> }
-<#if indentContent> </#if> }
+ if(_message-><@fieldName baseType=baseType field=arrayField/> != NULL) {
+ plc4c_list_element* curElement = _message-><@fieldName baseType=baseType field=arrayField/>->tail;
+ while (curElement != NULL) {
+ lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(arrayField)}((${helper.getLanguageTypeNameForTypeReference(arrayField.type)}*) curElement->value);
+ curElement = curElement->next;
+ }
+ }
</#if>
<#break>
<#case "checksum">
<#assign checksumField = field.asChecksumField().orElseThrow()>
- <#assign simpleTypeReference = checksumField.type>
+ <#assign simpleTypeReference = checksumField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Checksum Field (checksum)
-<#if indentContent> </#if> lengthInBits += ${simpleTypeReference.sizeInBits};
+ // Checksum Field (checksum)
+ lengthInBits += ${simpleTypeReference.sizeInBits};
<#break>
<#case "const">
<#assign constField = field.asConstField().orElseThrow()>
- <#assign simpleTypeReference = constField.type>
+ <#assign simpleTypeReference = constField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Const Field (${constField.name})
-<#if indentContent> </#if> lengthInBits += ${simpleTypeReference.sizeInBits};
+ // Const Field (${constField.name})
+ lengthInBits += ${simpleTypeReference.sizeInBits};
<#break>
<#case "discriminator">
<#assign discriminatorField = field.asDiscriminatorField().orElseThrow()>
-<#if indentContent> </#if> // Discriminator Field (${discriminatorField.name})
+ // Discriminator Field (${discriminatorField.name})
<#if discriminatorField.type.isSimpleTypeReference()>
<#assign simpleTypeReference = discriminatorField.type.asSimpleTypeReference().orElseThrow()>
- <#if helper.getLanguageTypeNameForTypeReference(discriminatorField.type) = "String">
-<#if indentContent> </#if> lengthInBits += ${helper.toParseExpression(type, discriminatorField, simpleTypeReference.getLengthExpression(), parserArguments)};
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=baseType field=discriminatorField/>) * 8;
<#else>
-<#if indentContent> </#if> lengthInBits += ${simpleTypeReference.sizeInBits};
+ lengthInBits += ${simpleTypeReference.sizeInBits};
</#if>
<#elseif helper.isEnumField(field)>
-<#if indentContent> </#if> lengthInBits += ${helper.getEnumBaseTypeReference(discriminatorField.type).sizeInBits};
+ lengthInBits += ${helper.getEnumBaseTypeReference(discriminatorField.type).sizeInBits};
<#else>
-<#if indentContent> </#if> lengthInBits += ${discriminatorField.name}.getLengthInBits();
+ lengthInBits += ${discriminatorField.name}.getLengthInBits();
</#if>
<#break>
<#case "enum">
<#assign enumField = field.asEnumField().orElseThrow()>
-<#if indentContent> </#if> // Enum Field (${enumField.name})
-<#if indentContent> </#if> lengthInBits += ${helper.getEnumBaseTypeReference(enumField.type).sizeInBits};
+ // Enum Field (${enumField.name})
+ lengthInBits += ${helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName).sizeInBits};
<#break>
<#case "implicit">
<#assign implicitField = field.asImplicitField().orElseThrow()>
<#assign simpleTypeReference = implicitField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Implicit Field (${implicitField.name})
-<#if indentContent> </#if> lengthInBits += ${simpleTypeReference.sizeInBits};
+ // Implicit Field (${implicitField.name})
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=baseType field=implicitField/>) * 8;
+ <#else>
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ </#if>
<#break>
<#case "manualArray">
- <#assign manualArrayField = field>
+ <#assign manualArrayField = field.asManualArrayField().orElseThrow()>
-<#if indentContent> </#if> // Manual Array Field (${manualArrayField.name})
-<#if indentContent> </#if> lengthInBits += ${helper.toParseExpression(type, manualArrayField, manualArrayField.lengthExpression, parserArguments)};
+ // Manual Array Field (${manualArrayField.name})
+ lengthInBits += ${helper.toParseExpression(type, manualArrayField, manualArrayField.lengthExpression, parserArguments)};
<#break>
<#case "manual">
<#assign manualField = field.asManualField().orElseThrow()>
-<#if indentContent> </#if> // Manual Field (${manualField.name})
-<#if indentContent> </#if> lengthInBits += ${helper.toParseExpression(type, manualField, manualField.lengthExpression, parserArguments)};
+ // Manual Field (${manualField.name})
+ lengthInBits += ${helper.toParseExpression(type, manualField, manualField.lengthExpression, parserArguments)};
<#break>
<#case "optional">
<#assign optionalField = field.asOptionalField().orElseThrow()>
-<#if indentContent> </#if> // Optional Field (${optionalField.name})
-<#if indentContent> </#if> if(_message-><@fieldName baseType=baseType field=optionalField/> != NULL) {
+ // Optional Field (${optionalField.name})
+ if(_message-><@fieldName baseType=baseType field=optionalField/> != NULL) {
<#if optionalField.type.isSimpleTypeReference()>
- <#assign simpleTypeReference = optionalField.type>
-<#if indentContent> </#if> lengthInBits += ${simpleTypeReference.sizeInBits};
+ <#assign simpleTypeReference = optionalField.type.asSimpleTypeReference().orElseThrow()>
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=baseType field=optionalField/>) * 8;
+ <#else>
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ </#if>
<#else>
-<#if indentContent> </#if> lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(optionalField)}(_message-><@fieldName baseType=baseType field=optionalField/>);
+ lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(optionalField)}(_message-><@fieldName baseType=baseType field=optionalField/>);
</#if>
-<#if indentContent> </#if> }
+ }
<#break>
<#case "padding">
<#assign paddingField = field.asPaddingField().orElseThrow()>
- <#assign simpleTypeReference = paddingField.type>
+ <#assign simpleTypeReference = paddingField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Padding Field (padding)
+ // Padding Field (padding)
<#-- We're replacing the "lastItem" with 'false' here as the item itself can't know if it is the last -->
-<#if indentContent> </#if> int _needsPadding = (int) (${helper.toSerializationExpression(type, paddingField, paddingField.paddingCondition, parserArguments)?replace("lastItem", "false")});
-<#if indentContent> </#if> while(_needsPadding-- > 0) {
-<#if indentContent> </#if> lengthInBits += ${simpleTypeReference.sizeInBits};
-<#if indentContent> </#if> }
+ int _needsPadding = (int) (${helper.toSerializationExpression(type, paddingField, paddingField.paddingCondition, parserArguments)?replace("lastItem", "false")});
+ while(_needsPadding-- > 0) {
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ }
<#break>
<#case "reserved">
<#assign reservedField = field.asReservedField().orElseThrow()>
- <#assign simpleTypeReference = reservedField.type>
+ <#assign simpleTypeReference = reservedField.type.asSimpleTypeReference().orElseThrow()>
-<#if indentContent> </#if> // Reserved Field (reserved)
-<#if indentContent> </#if> lengthInBits += ${simpleTypeReference.sizeInBits};
+ // Reserved Field (reserved)
+ lengthInBits += ${simpleTypeReference.sizeInBits};
<#break>
<#case "simple">
<#assign simpleField = field.asSimpleField().orElseThrow()>
-<#if indentContent> </#if> // Simple field (${simpleField.name})
+ // Simple field (${simpleField.name})
<#if simpleField.type.isSimpleTypeReference()>
- <#assign simpleTypeReference = simpleField.type>
-<#if indentContent> </#if> lengthInBits += ${simpleTypeReference.sizeInBits};
+ <#assign simpleTypeReference = simpleField.type.asSimpleTypeReference().orElseThrow()>
+ <#if simpleTypeReference.isVstringTypeReference()>
+ lengthInBits += plc4c_spi_evaluation_helper_str_len(_message-><@fieldName baseType=baseType field=simpleField/>) * 8;
+ <#else>
+ lengthInBits += ${simpleTypeReference.sizeInBits};
+ </#if>
<#else>
-<#if indentContent> </#if> lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(simpleField)}(<#if helper.isEnumTypeReference(simpleField.type)>&</#if>_message-><@fieldName baseType=baseType field=simpleField/>);
+ lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(simpleField)}(<#if helper.isEnumTypeReference(simpleField.type)>&</#if>_message-><@fieldName baseType=baseType field=simpleField/>);
</#if>
<#break>
<#case "switch">
<#assign switchField = field.asSwitchField().orElseThrow()>
-<#if indentContent> </#if> // Depending of the current type, add the length of sub-type elements ...
-<#if indentContent> </#if> switch(_message->_type) {
+ // Depending on the current type, add the length of sub-type elements ...
+ switch(_message->_type) {
<#list switchField.cases as case>
-<#if indentContent> </#if> case ${helper.getCTypeName(type.name)}_type_${helper.getCTypeName(case.name)}: {
+ case ${helper.getCTypeName(type.name)}_type_${helper.getCTypeName(case.name)}: {
<#list case.fields as caseField>
<@fieldSize baseType=case field=caseField indentContent=true/>
<#sep >
</#list>
-<#if indentContent> </#if> break;
-<#if indentContent> </#if> }
+ break;
+ }
</#list>
-<#if indentContent> </#if> }
+ }
<#break>
<#case "virtual">
<#assign virtualField = field.asVirtualField().orElseThrow()>
-<#if indentContent> </#if> // A virtual field doesn't have any in- or output.
+ // A virtual field doesn't have any in- or output.
<#break>
</#switch>
</#macro>
diff --git a/code-generation/language-c/src/main/resources/templates/c/pojo-template.h.ftlh b/code-generation/language-c/src/main/resources/templates/c/pojo-template.h.ftlh
index b8681e3..6ef18f4 100644
--- a/code-generation/language-c/src/main/resources/templates/c/pojo-template.h.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/pojo-template.h.ftlh
@@ -154,13 +154,13 @@ struct ${helper.getCTypeName(type.name)} {
</#if>
</#list>
};
- <#elseif (field.type.isSimpleTypeReference() || helper.isEnumField(field)) && !field.isOptionalField() && !field.isArrayField() && !field.isManualArrayField()>
+ <#elseif (field.type.isSimpleTypeReference() || helper.isEnumField(field)) && !field.isConstField() && !field.isOptionalField() && !field.isArrayField() && !field.isManualArrayField()>
<#assign namedField = field.asNamedField().orElseThrow()>
${helper.getLanguageTypeNameForField(field)} ${helper.camelCaseToSnakeCase(namedField.name)}${helper.getTypeSizeForField(field.asTypedField().orElseThrow())}<#if field.loopType??>${helper.getLoopExpressionSuffix(field.asTypedField().orElseThrow())}</#if>;
<#elseif field.isArrayField() || field.isManualArrayField()>
<#assign namedField = field.asNamedField().orElseThrow()>
plc4c_list* ${helper.camelCaseToSnakeCase(namedField.name)};
- <#else>
+ <#elseif !field.isConstField()>
<#assign namedField = field.asNamedField().orElseThrow()>
${helper.getLanguageTypeNameForField(field)}* ${helper.camelCaseToSnakeCase(namedField.name)};
</#if>
@@ -174,7 +174,7 @@ ${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_null();
<#--
Define the parse-method for elements of this tpye
-->
-plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* readBuffer, <#if parserArguments?has_content><#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !parserArgument.type.isSimpleTypeReference()>*</#if> ${parserArgument.name}<#sep>, </#list>, </#if>${helper.getCTypeName(type.name)}** message);
+plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* readBuffer, <#if parserArguments?has_content><#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !parserArgument.type.isSimpleTypeReference() && !helper.isEnumTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list>, </#if>${helper.getCTypeName(type.name)}** message);
<#--
Define the serialize-method for elements of this tpye
diff --git a/code-generation/language-cs/pom.xml b/code-generation/language-cs/pom.xml
index b0e951d..f4836c2 100644
--- a/code-generation/language-cs/pom.xml
+++ b/code-generation/language-cs/pom.xml
@@ -19,7 +19,7 @@
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build>
+ <modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.plc4x</groupId>
diff --git a/code-generation/language-cs/src/main/resources/templates/cs/model-template.cs.ftlh b/code-generation/language-cs/src/main/resources/templates/cs/model-template.cs.ftlh
index 0616a5b..fb17fab 100644
--- a/code-generation/language-cs/src/main/resources/templates/cs/model-template.cs.ftlh
+++ b/code-generation/language-cs/src/main/resources/templates/cs/model-template.cs.ftlh
@@ -215,7 +215,7 @@ namespace org.apache.plc4net.drivers.${protocolName?replace("-", "")}.${outputFl
<#assign typedField = field.asTypedField().orElseThrow()>
<#assign namedField = field.asNamedField().orElseThrow()>
- // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ // Implicit Field (${implicitField.name}) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
<#- Implicit field values might be used in expressions, in order to avoid problems, we generate a temporary variable with the given name. ->
${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(implicitField, implicitField.type, implicitField.serializeExpression, parserArguments)});
writeImplicitField("${namedField.name}", ${implicitField.name}, ${helper.getDataWriterCall(typedField.type, namedField.name)});
diff --git a/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh b/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh
index 17a0f2c..2397823 100644
--- a/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh
+++ b/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh
@@ -960,7 +960,7 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
<#assign implicitField = field.asImplicitField().orElseThrow()>
<#assign simpleTypeReference = implicitField.type.asSimpleTypeReference().orElseThrow()>
- // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ // Implicit Field (${implicitField.name}) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
${implicitField.name}, _${implicitField.name}Err := ${helper.getReadBufferReadMethodCall(implicitField.name, simpleTypeReference, implicitField)}
_ = ${implicitField.name}
if _${implicitField.name}Err != nil {
@@ -1584,7 +1584,7 @@ func (m *${type.name}) Serialize(writeBuffer utils.WriteBuffer) error {
<#assign implicitField = field.asImplicitField().orElseThrow()>
<#assign simpleTypeReference = implicitField.type.asSimpleTypeReference().orElseThrow()>
- // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ // Implicit Field (${implicitField.name}) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
${implicitField.name} := ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(implicitField, implicitField.type, implicitField.serializeExpression, parserArguments)})
_${implicitField.name}Err := ${helper.getWriteBufferWriteMethodCall(implicitField.name, simpleTypeReference, "(" + implicitField.name + ")", implicitField)}
if _${implicitField.name}Err != nil {
diff --git a/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh
index 7e686ce..41cfdd4 100644
--- a/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh
@@ -286,7 +286,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
<#assign typedField = field.asTypedField().orElseThrow()>
<#assign namedField = field.asNamedField().orElseThrow()>
- // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ // Implicit Field (${implicitField.name}) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
<#-- Implicit field values might be used in expressions, in order to avoid problems, we generate a temporary variable with the given name. -->
${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(implicitField, implicitField.type, implicitField.serializeExpression, parserArguments)});
writeImplicitField("${namedField.name}", ${implicitField.name}, ${helper.getDataWriterCall(typedField.type, namedField.name)});
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
index ecd8549..ea24e10 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
@@ -21,14 +21,12 @@ package org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions;
import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
import org.apache.plc4x.plugins.codegenerator.types.definitions.DataIoTypeDefinition;
-import org.apache.plc4x.plugins.codegenerator.types.fields.SwitchField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.*;
import org.apache.plc4x.plugins.codegenerator.types.references.DefaultComplexTypeReference;
import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
public class DefaultDataIoTypeDefinition extends DefaultTypeDefinition implements DataIoTypeDefinition {
diff --git a/plc4c/README.md b/plc4c/README.md
index 2d3510b..98a67e4 100644
--- a/plc4c/README.md
+++ b/plc4c/README.md
@@ -37,5 +37,10 @@ In the settings select the `Build type` = `Debug`, `Toolchain` = `Use Default`.
Leave the rest unchanged (which is actually empty).
-After saving you can select the `Test` profile in the `Configurations` Drop-Down.
-After that is selected, the tests should be available.
+After saving, you can select the `Test` profile in the `Configurations` Drop-Down.
+After that is selected, the tests should be available.
+
+If you like to switch between building the full project with IntelliJ and the PLC4X part in CLion, it is recommendable to configure CLion to place the CMake related stuff in the `target` directory.
+You can do this by opening the `Settings...` dialog, then in `Build, Execution, Deployment ...` select `CMake` and in `Build directory` simply enter `target`.
+This way the settings are not located outside the target directory and interfere with the maven build.
+The only thing you have to keep in mind, is that if you did a maven build, you need to select `Reload CMake Project` on the `CMakeList.txt` file in the `plc4c` root directory in order to recreate the CLion configuration.
diff --git a/plc4c/build-utils/parser-serializer-testcase-generator.xsl b/plc4c/build-utils/parser-serializer-testcase-generator.xsl
new file mode 100644
index 0000000..ead8388
--- /dev/null
+++ b/plc4c/build-utils/parser-serializer-testcase-generator.xsl
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:test="https://plc4x.apache.org/schemas/parser-serializer-testsuite.xsd"
+ exclude-result-prefixes="xs"
+ version="2.0">
+
+ <xsl:output omit-xml-declaration="yes" />
+
+ <xsl:template match="/test:testsuite">
+ <xsl:variable name="protocolName" select="protocolName/text()"/>
+ <xsl:variable name="outputFlavor" select="outputFlavor/text()"/>
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+
+// Code generated by code-generation. DO NOT EDIT.
+
+#include <xsl:value-of disable-output-escaping="yes" select="'<'"/>unity.h<xsl:value-of disable-output-escaping="yes" select="'>'"/>
+
+#include "plc4c/spi/read_buffer.h"
+#include "plc4c/spi/write_buffer.h"
+<xsl:for-each-group select="/test:testsuite/testcase/root-type" group-by="text()">
+ <xsl:variable name="rootTypeName">
+ <xsl:call-template name="getRootTypeName">
+ <xsl:with-param name="name" select="current-grouping-key()"/>
+ </xsl:call-template>
+ </xsl:variable>
+#include "<xsl:value-of select="$rootTypeName"/>.h"
+</xsl:for-each-group>
+
+void internal_assert_arrays_equal(uint8_t* expected_array, uint8_t* actual_array, uint8_t num_bytes);
+
+ <xsl:for-each select="testcase">
+ <xsl:variable name="testName">
+ <xsl:call-template name="getTestName">
+ <xsl:with-param name="protocolName" select="$protocolName"/>
+ <xsl:with-param name="outputFlavor" select="$outputFlavor"/>
+ <xsl:with-param name="testNode" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="rootTypeName">
+ <xsl:call-template name="getRootTypeName">
+ <xsl:with-param name="name" select="normalize-space(root-type)"/>
+ </xsl:call-template>
+ </xsl:variable>
+void <xsl:value-of select="normalize-space($testName)"/>() {
+ <xsl:variable name="testData">
+ <xsl:call-template name="getTestData">
+ <xsl:with-param name="rawData" select="raw"/>
+ </xsl:call-template>
+ </xsl:variable>
+ uint8_t payload[] = {
+ <xsl:value-of select="$testData"/>
+ };
+ uint16_t payload_size = sizeof(payload);
+
+ // Create a new read_buffer instance
+ plc4c_spi_read_buffer* read_buffer;
+ plc4c_return_code return_code =
+ plc4c_spi_read_buffer_create(payload, payload_size, <xsl:value-of disable-output-escaping="yes" select="'&'"/>read_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error creating read buffer");
+ }
+
+ plc4c_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>_<xsl:value-of select="$rootTypeName"/>* message = NULL;
+ return_code = plc4c_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>_<xsl:value-of select="$rootTypeName"/>_parse(read_buffer, <xsl:value-of disable-output-escaping="yes" select="'&'"/>message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error error parsing tpkt packet");
+ }
+
+ plc4c_spi_write_buffer* write_buffer;
+ return_code = plc4c_spi_write_buffer_create(payload_size, <xsl:value-of disable-output-escaping="yes" select="'&'"/>write_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error writing to buffer");
+ }
+
+ return_code = plc4c_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>_<xsl:value-of select="$rootTypeName"/>_serialize(write_buffer, message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error serializing");
+ }
+
+ internal_assert_arrays_equal(payload, write_buffer-<xsl:value-of disable-output-escaping="yes" select="'>'"/>data, payload_size);
+
+ printf("Success");
+}
+ </xsl:for-each>
+
+
+void parser_serializer_test_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>(void) {
+ <xsl:for-each select="testcase">
+ <xsl:variable name="testName">
+ <xsl:call-template name="getTestName">
+ <xsl:with-param name="protocolName" select="$protocolName"/>
+ <xsl:with-param name="outputFlavor" select="$outputFlavor"/>
+ <xsl:with-param name="testNode" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ RUN_TEST(<xsl:value-of select="$testName"/>);
+ </xsl:for-each>
+}
+ </xsl:template>
+
+ <xsl:template name="getTestName">
+ <xsl:param name="protocolName"/>
+ <xsl:param name="outputFlavor"/>
+ <xsl:param name="testNode"/>
+ parser_serializer_test_<xsl:value-of select="replace(lower-case($protocolName), ' ', '_')"/>_<xsl:value-of select="replace(replace(lower-case($outputFlavor), ' ', '_'), '-', '_')"/>_<xsl:value-of select="translate(replace(lower-case($testNode/name), ' ', '_'), '()', '')"/>
+ </xsl:template>
+
+ <xsl:template name="getRootTypeName">
+ <xsl:param name="name"/>
+ <xsl:analyze-string select="$name" regex="(.+)([A-Z][a-z].*)">
+ <xsl:matching-substring>
+ <xsl:variable name="restName">
+ <xsl:call-template name="getRootTypeName">
+ <xsl:with-param name="name" select="regex-group(2)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="lower-case(regex-group(1))"/>_<xsl:value-of select="$restName"/>
+ </xsl:matching-substring>
+ <xsl:non-matching-substring>
+ <xsl:value-of select="lower-case($name)"/>
+ </xsl:non-matching-substring>
+ </xsl:analyze-string>
+ </xsl:template>
+
+ <xsl:template name="getTestData">
+ <xsl:param name="rawData"/>
+ <xsl:variable name="normalizedRawData" select="normalize-space($rawData)"/>
+ <xsl:for-each select="0 to (string-length($normalizedRawData) - 1) idiv 2">0x<xsl:value-of select="substring($normalizedRawData, (. * 2) + 1, 2)"/><xsl:if test="position() != last()">, </xsl:if></xsl:for-each>
+ </xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/plc4c/drivers/CMakeLists.txt b/plc4c/drivers/CMakeLists.txt
index a37d896..8c18ba6 100644
--- a/plc4c/drivers/CMakeLists.txt
+++ b/plc4c/drivers/CMakeLists.txt
@@ -18,5 +18,6 @@
]]
add_subdirectory(modbus)
+add_subdirectory(plc4x)
add_subdirectory(s7)
add_subdirectory(simulated)
diff --git a/plc4c/drivers/modbus/CMakeLists.txt b/plc4c/drivers/modbus/CMakeLists.txt
index 925035b..c5738c8 100644
--- a/plc4c/drivers/modbus/CMakeLists.txt
+++ b/plc4c/drivers/modbus/CMakeLists.txt
@@ -33,4 +33,26 @@ add_library(plc4c-driver-modbus
src/driver_modbus_sm_write.c
${generatedSources} include/plc4c/driver_modbus_static.h)
-target_link_libraries(plc4c-driver-modbus plc4c-spi ${CMAKE_DL_LIBS})
\ No newline at end of file
+target_link_libraries(plc4c-driver-modbus plc4c-spi ${CMAKE_DL_LIBS})
+
+if (BUILD_PHASE STREQUAL test-compile)
+ add_executable(plc4c-driver-modbus-test
+ test/modbus_test.c
+ ../../spi/test/utils/test_utils.c
+ ../../generated-sources/modbus/test/ParserSerializerTestsuite.c
+ )
+
+ IF (NOT WIN32)
+ target_link_libraries(plc4c-driver-modbus-test
+ plc4c-driver-modbus
+ unity
+ m
+ )
+ ELSE()
+ target_link_libraries(plc4c-driver-modbus-test
+ plc4c-driver-modbus
+ unity
+ )
+ ENDIF()
+ add_test(NAME plc4c-driver-modbus-test COMMAND plc4c-driver-modbus-test)
+endif ()
\ No newline at end of file
diff --git a/plc4c/spi/include/plc4c/spi/evaluation_helper.h b/plc4c/drivers/modbus/test/modbus_test.c
similarity index 65%
copy from plc4c/spi/include/plc4c/spi/evaluation_helper.h
copy to plc4c/drivers/modbus/test/modbus_test.c
index c07be76..cfee709 100644
--- a/plc4c/spi/include/plc4c/spi/evaluation_helper.h
+++ b/plc4c/drivers/modbus/test/modbus_test.c
@@ -16,19 +16,19 @@
* specific language governing permissions and limitations
* under the License.
*/
-#ifndef PLC4C_SPI_EVALUATION_HELPER_H_
-#define PLC4C_SPI_EVALUATION_HELPER_H_
+#include <unity.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <plc4c/utils/list.h>
+void parser_serializer_test_modbus_read_write();
-bool plc4c_spi_evaluation_helper_equals(int a, int b);
+void setUp(void) {}
-double plc4c_spi_evaluation_helper_ceil(double a);
+void tearDown(void) {}
-uint8_t plc4c_spi_evaluation_helper_count(plc4c_list* a);
+int main(void) {
+ UNITY_BEGIN();
-uint8_t plc4c_spi_evaluation_helper_array_size_in_bytes(plc4c_list* a);
+ // Execute the auto-generated serializer/parser tests.
+ parser_serializer_test_modbus_read_write();
-#endif // PLC4C_SPI_EVALUATION_HELPER_H_
+ return UNITY_END();
+}
\ No newline at end of file
diff --git a/plc4c/drivers/s7/CMakeLists.txt b/plc4c/drivers/plc4x/CMakeLists.txt
similarity index 54%
copy from plc4c/drivers/s7/CMakeLists.txt
copy to plc4c/drivers/plc4x/CMakeLists.txt
index 3f76524..38dc50c 100644
--- a/plc4c/drivers/s7/CMakeLists.txt
+++ b/plc4c/drivers/plc4x/CMakeLists.txt
@@ -18,41 +18,42 @@
]]
include_directories("include" "../../api/include" "../../spi/include"
- "../../generated-sources/s7/include")
+ "../../generated-sources/plc4x/include")
# Add the generated sources
-file(GLOB generatedSources "../../generated-sources/s7/src/*.c")
-
-add_library(plc4c-driver-s7
- src/driver_s7.c
- src/driver_s7_encode_decode.c
- src/driver_s7_packets.c
- src/driver_s7_sm_connect.c
- src/driver_s7_sm_disconnect.c
- src/driver_s7_sm_read.c
- src/driver_s7_sm_write.c
- ${generatedSources} include/plc4c/driver_s7_static.h src/driver_s7_static.c)
-
-target_link_libraries(plc4c-driver-s7
+file(GLOB generatedSources "../../generated-sources/plc4x/src/*.c")
+
+add_library(plc4c-driver-plc4x
+ src/driver_plc4x.c
+ src/driver_plc4x_encode_decode.c
+ src/driver_plc4x_packets.c
+ src/driver_plc4x_sm_connect.c
+ src/driver_plc4x_sm_disconnect.c
+ src/driver_plc4x_sm_read.c
+ src/driver_plc4x_sm_write.c
+ ${generatedSources})
+
+target_link_libraries(plc4c-driver-plc4x
plc4c-spi)
if (BUILD_PHASE STREQUAL test-compile)
- add_executable(plc4c-driver-s7-test
- test/s7_address_parser_test.c
- test/s7_test.c
+ add_executable(plc4c-driver-plc4x-test
+ test/plc4x_test.c
+ ../../spi/test/utils/test_utils.c
+ ../../generated-sources/plc4x/test/ParserSerializerTestsuite.c
)
IF (NOT WIN32)
- target_link_libraries(plc4c-driver-s7-test
- plc4c-driver-s7
+ target_link_libraries(plc4c-driver-plc4x-test
+ plc4c-driver-plc4x
unity
m
)
ELSE()
- target_link_libraries(plc4c-driver-s7-test
- plc4c-driver-s7
+ target_link_libraries(plc4c-driver-plc4x-test
+ plc4c-driver-plc4x
unity
)
ENDIF()
- add_test(NAME plc4c-driver-s7-test COMMAND plc4c-driver-s7-test)
+ add_test(NAME plc4c-driver-plc4x-test COMMAND plc4c-driver-plc4x-test)
endif ()
\ No newline at end of file
diff --git a/plc4c/spi/include/plc4c/spi/evaluation_helper.h b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x.h
similarity index 61%
copy from plc4c/spi/include/plc4c/spi/evaluation_helper.h
copy to plc4c/drivers/plc4x/include/plc4c/driver_plc4x.h
index c07be76..f0bd947 100644
--- a/plc4c/spi/include/plc4c/spi/evaluation_helper.h
+++ b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x.h
@@ -16,19 +16,30 @@
* specific language governing permissions and limitations
* under the License.
*/
-#ifndef PLC4C_SPI_EVALUATION_HELPER_H_
-#define PLC4C_SPI_EVALUATION_HELPER_H_
+#ifndef PLC4C_DRIVER_PLC4X_H_
+#define PLC4C_DRIVER_PLC4X_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <plc4c/types.h>
#include <stdint.h>
-#include <stdbool.h>
-#include <plc4c/utils/list.h>
+#include <time.h>
-bool plc4c_spi_evaluation_helper_equals(int a, int b);
+#include "../../../../spi/include/plc4c/spi/read_buffer.h"
-double plc4c_spi_evaluation_helper_ceil(double a);
+struct plc4c_driver_plc4x_config {
+ char* remote_connection_string;
+ uint32_t request_timeout;
-uint8_t plc4c_spi_evaluation_helper_count(plc4c_list* a);
+ uint16_t connection_id;
+ uint16_t request_id;
+};
+typedef struct plc4c_driver_plc4x_config plc4c_driver_plc4x_config;
-uint8_t plc4c_spi_evaluation_helper_array_size_in_bytes(plc4c_list* a);
+plc4c_driver *plc4c_driver_plc4x_create();
-#endif // PLC4C_SPI_EVALUATION_HELPER_H_
+#ifdef __cplusplus
+}
+#endif
+#endif // PLC4C_DRIVER_PLC4X_H_
\ No newline at end of file
diff --git a/plc4c/spi/include/plc4c/spi/evaluation_helper.h b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_encode_decode.h
similarity index 65%
copy from plc4c/spi/include/plc4c/spi/evaluation_helper.h
copy to plc4c/drivers/plc4x/include/plc4c/driver_plc4x_encode_decode.h
index c07be76..e812765 100644
--- a/plc4c/spi/include/plc4c/spi/evaluation_helper.h
+++ b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_encode_decode.h
@@ -16,19 +16,20 @@
* specific language governing permissions and limitations
* under the License.
*/
-#ifndef PLC4C_SPI_EVALUATION_HELPER_H_
-#define PLC4C_SPI_EVALUATION_HELPER_H_
+#ifndef PLC4C_DRIVER_PLC4X_ENCODE_DECODE_H_
+#define PLC4C_DRIVER_PLC4X_ENCODE_DECODE_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
-#include <stdint.h>
-#include <stdbool.h>
-#include <plc4c/utils/list.h>
+#include <stdlib.h>
-bool plc4c_spi_evaluation_helper_equals(int a, int b);
+#include "plc4c/driver_plc4x.h"
-double plc4c_spi_evaluation_helper_ceil(double a);
+plc4c_return_code plc4c_driver_plc4x_encode_address(
+ char* address, void** item);
-uint8_t plc4c_spi_evaluation_helper_count(plc4c_list* a);
-
-uint8_t plc4c_spi_evaluation_helper_array_size_in_bytes(plc4c_list* a);
-
-#endif // PLC4C_SPI_EVALUATION_HELPER_H_
+#ifdef __cplusplus
+}
+#endif
+#endif // PLC4C_DRIVER_PLC4X_ENCODE_DECODE_H_
\ No newline at end of file
diff --git a/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_packets.h b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_packets.h
new file mode 100644
index 0000000..4ca78b0
--- /dev/null
+++ b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_packets.h
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#ifndef PLC4C_DRIVER_PLC4X_PACKETS_H_
+#define PLC4C_DRIVER_PLC4X_PACKETS_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <plc4c/types.h>
+
+#include "plc4x_message.h"
+#include "plc4c/driver_plc4x.h"
+
+plc4c_return_code plc4c_driver_plc4x_send_packet(
+ plc4c_connection* connection, plc4c_plc4x_read_write_plc4x_message* packet);
+
+plc4c_return_code plc4c_driver_plc4x_receive_packet(
+ plc4c_connection* connection, plc4c_plc4x_read_write_plc4x_message** packet);
+void plc4c_driver_plc4x_destroy_packet(
+ plc4c_plc4x_read_write_plc4x_message* packet);
+
+plc4c_return_code plc4c_driver_plc4x_create_connection_request(
+ plc4c_driver_plc4x_config* configuration,
+ plc4c_plc4x_read_write_plc4x_message** connect_request_packet);
+void plc4c_driver_plc4x_destroy_connection_request(
+ plc4c_plc4x_read_write_plc4x_message* packet);
+
+plc4c_return_code plc4c_driver_plc4x_create_plc4x_read_request(
+ plc4c_read_request* read_request,
+ plc4c_plc4x_read_write_plc4x_message** plc4x_read_request_packet);
+void plc4c_driver_plc4x_destroy_plc4x_read_request(
+ plc4c_plc4x_read_write_plc4x_message* packet);
+
+plc4c_return_code plc4c_driver_plc4x_create_plc4x_write_request(
+ plc4c_write_request* write_request,
+ plc4c_plc4x_read_write_plc4x_message** plc4x_write_request_packet);
+void plc4c_driver_plc4x_destroy_plc4x_write_request(
+ plc4c_plc4x_read_write_plc4x_message* packet);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // PLC4C_DRIVER_PLC4X_PACKETS_H_
\ No newline at end of file
diff --git a/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_sm.h b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_sm.h
new file mode 100644
index 0000000..7ecdfe8
--- /dev/null
+++ b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_sm.h
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#ifndef PLC4C_DRIVER_PLC4X_SM_H_
+#define PLC4C_DRIVER_PLC4X_SM_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <plc4c/types.h>
+#include <plc4c/spi/types_private.h>
+
+plc4c_return_code plc4c_driver_plc4x_connect_function(
+ plc4c_connection* connection, plc4c_system_task** task);
+
+plc4c_return_code plc4c_driver_plc4x_disconnect_function(
+ plc4c_connection* connection, plc4c_system_task** task);
+
+plc4c_return_code plc4c_driver_plc4x_read_function(
+ plc4c_read_request_execution* read_request_execution,
+ plc4c_system_task** task);
+void plc4c_driver_plc4x_free_read_request(plc4c_read_request* request);
+void plc4c_driver_plc4x_free_read_response(plc4c_read_response* response);
+
+plc4c_return_code plc4c_driver_plc4x_write_function(
+ plc4c_write_request_execution* write_request_execution,
+ plc4c_system_task** task);
+void plc4c_driver_plc4x_free_write_request(plc4c_write_request* request);
+void plc4c_driver_plc4x_free_write_response(plc4c_write_response* response);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // PLC4C_DRIVER_PLC4X_SM_H_
\ No newline at end of file
diff --git a/plc4c/spi/include/plc4c/spi/evaluation_helper.h b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h
similarity index 65%
copy from plc4c/spi/include/plc4c/spi/evaluation_helper.h
copy to plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h
index c07be76..c8290d7 100644
--- a/plc4c/spi/include/plc4c/spi/evaluation_helper.h
+++ b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h
@@ -16,19 +16,18 @@
* specific language governing permissions and limitations
* under the License.
*/
-#ifndef PLC4C_SPI_EVALUATION_HELPER_H_
-#define PLC4C_SPI_EVALUATION_HELPER_H_
-#include <stdint.h>
-#include <stdbool.h>
-#include <plc4c/utils/list.h>
+#ifndef PLC4C_DRIVER_PLC4X_STATIC_H
+#define PLC4C_DRIVER_PLC4X_STATIC_H
-bool plc4c_spi_evaluation_helper_equals(int a, int b);
+#include <plc4c/spi/read_buffer.h>
+#include <plc4c/spi/write_buffer.h>
+#include <time.h>
-double plc4c_spi_evaluation_helper_ceil(double a);
-
-uint8_t plc4c_spi_evaluation_helper_count(plc4c_list* a);
-
-uint8_t plc4c_spi_evaluation_helper_array_size_in_bytes(plc4c_list* a);
+/*
+ *
+ * Static functions
+ *
+ */
-#endif // PLC4C_SPI_EVALUATION_HELPER_H_
+#endif // PLC4C_DRIVER_PLC4X_STATIC_H
diff --git a/plc4c/drivers/plc4x/src/driver_plc4x.c b/plc4c/drivers/plc4x/src/driver_plc4x.c
new file mode 100644
index 0000000..850cb75
--- /dev/null
+++ b/plc4c/drivers/plc4x/src/driver_plc4x.c
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "plc4c/driver_plc4x.h"
+
+#include "plc4c/driver_plc4x_encode_decode.h"
+#include "plc4c/driver_plc4x_sm.h"
+
+plc4c_return_code plc4c_driver_plc4x_configure_function(plc4c_list* parameters,
+ void** configuration) {
+ plc4c_driver_plc4x_config* plc4x_config = malloc(sizeof(plc4c_driver_plc4x_config));
+ if (plc4x_config == NULL) {
+ return NO_MEMORY;
+ }
+
+ // Initialize the parts that the user can influence.
+ plc4x_config->remote_connection_string = NULL;
+ plc4x_config->request_timeout = 5000;
+
+ // TODO: Apply the values from the parameters.
+
+ *configuration = plc4x_config;
+ return OK;
+}
+
+plc4c_driver* plc4c_driver_plc4x_create() {
+ plc4c_driver* driver = (plc4c_driver*)malloc(sizeof(plc4c_driver));
+ driver->protocol_code = "plc4c";
+ driver->protocol_name = "PLC4X (Proxy-Protocol)";
+ driver->default_transport_code = "tcp";
+ driver->parse_address_function = &plc4c_driver_plc4x_encode_address;
+ driver->configure_function = &plc4c_driver_plc4x_configure_function;
+ driver->connect_function = &plc4c_driver_plc4x_connect_function;
+ driver->disconnect_function = &plc4c_driver_plc4x_disconnect_function;
+ driver->read_function = &plc4c_driver_plc4x_read_function;
+ driver->write_function = &plc4c_driver_plc4x_write_function;
+ driver->subscribe_function = NULL;
+ driver->unsubscribe_function = NULL;
+ driver->free_read_request_function = &plc4c_driver_plc4x_free_read_request;
+ driver->free_write_request_function = &plc4c_driver_plc4x_free_write_request;
+ driver->free_read_response_function = &plc4c_driver_plc4x_free_read_response;
+ driver->free_write_response_function = &plc4c_driver_plc4x_free_write_response;
+ driver->free_subscription_response_function = NULL;
+ driver->free_unsubscription_response_function = NULL;
+ return driver;
+}
diff --git a/plc4c/spi/include/plc4c/spi/evaluation_helper.h b/plc4c/drivers/plc4x/src/driver_plc4x_encode_decode.c
similarity index 65%
copy from plc4c/spi/include/plc4c/spi/evaluation_helper.h
copy to plc4c/drivers/plc4x/src/driver_plc4x_encode_decode.c
index c07be76..fa3e0a8 100644
--- a/plc4c/spi/include/plc4c/spi/evaluation_helper.h
+++ b/plc4c/drivers/plc4x/src/driver_plc4x_encode_decode.c
@@ -16,19 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-#ifndef PLC4C_SPI_EVALUATION_HELPER_H_
-#define PLC4C_SPI_EVALUATION_HELPER_H_
-#include <stdint.h>
-#include <stdbool.h>
-#include <plc4c/utils/list.h>
+#include <plc4c/spi/types_private.h>
-bool plc4c_spi_evaluation_helper_equals(int a, int b);
-
-double plc4c_spi_evaluation_helper_ceil(double a);
-
-uint8_t plc4c_spi_evaluation_helper_count(plc4c_list* a);
-
-uint8_t plc4c_spi_evaluation_helper_array_size_in_bytes(plc4c_list* a);
-
-#endif // PLC4C_SPI_EVALUATION_HELPER_H_
+plc4c_return_code plc4c_driver_plc4x_encode_address(char* address, void** item) {
+ return OK;
+}
diff --git a/plc4c/drivers/plc4x/src/driver_plc4x_packets.c b/plc4c/drivers/plc4x/src/driver_plc4x_packets.c
new file mode 100644
index 0000000..571cc3a
--- /dev/null
+++ b/plc4c/drivers/plc4x/src/driver_plc4x_packets.c
@@ -0,0 +1,330 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <ctype.h>
+#include <plc4c/driver_plc4x.h>
+#include <plc4c/spi/types_private.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "plc4c/driver_plc4x_packets.h"
+#include "plc4x_message.h"
+
+plc4c_return_code plc4c_driver_plc4x_send_packet(plc4c_connection* connection,
+ plc4c_plc4x_read_write_plc4x_message* packet) {
+ uint16_t packet_size;
+ plc4c_spi_write_buffer* write_buffer;
+ plc4c_return_code return_code;
+
+ // Get the size required to contain the serialized form of this packet.
+ packet_size = plc4c_plc4x_read_write_plc4x_message_length_in_bytes(packet);
+
+ // Serialize this message to a byte-array.
+ return_code = plc4c_spi_write_buffer_create(packet_size, &write_buffer);
+ if (return_code != OK) {
+ return return_code;
+ }
+ return_code = plc4c_plc4x_read_write_plc4x_message_serialize(write_buffer, packet);
+ if(return_code != OK) {
+ return return_code;
+ }
+
+ // Now send this to the recipient.
+ return_code = connection->transport->send_message(connection->transport_configuration, write_buffer);
+ if (return_code != OK) {
+ return return_code;
+ }
+
+ /* TODO: free when relevant, here works I think*/
+ free(write_buffer->data);
+ free(write_buffer);
+ return OK;
+}
+
+int16_t plc4c_driver_plc4x_select_message_function(uint8_t* buffer_data,
+ uint16_t buffer_length) {
+ if (buffer_length >= 3) {
+ uint16_t length = ((uint16_t) *(buffer_data + 1)) << 8 | ((uint16_t) *(buffer_data + 2));
+ return length;
+ }
+
+ // In all other cases, we'll just have to wait for the next time.
+ return 0;
+}
+
+plc4c_return_code plc4c_driver_plc4x_receive_packet(plc4c_connection* connection,
+ plc4c_plc4x_read_write_plc4x_message** packet) {
+ // Check with the transport if there is a packet available.
+ // If it is, get a read_buffer for reading it.
+ plc4c_spi_read_buffer* read_buffer;
+ plc4c_return_code return_code;
+
+ return_code = connection->transport->select_message(
+ connection->transport_configuration, 3,
+ plc4c_driver_plc4x_select_message_function, &read_buffer);
+
+ // OK is only returned if a packet is available.
+ if (return_code != OK) {
+ return return_code;
+ }
+
+ // Parse the packet by consuming the read_buffer data.
+ *packet = NULL;
+ return_code = plc4c_plc4x_read_write_plc4x_message_parse(read_buffer, packet);
+ if (return_code != OK) {
+ return return_code;
+ }
+
+ // TODO: verify and maybe move
+ free(read_buffer->data);
+ free(read_buffer);
+
+ // In this case a packet was available and parsed.
+ return OK;
+}
+
+void destroy_plc4x_read_request_fields(plc4c_list_element *element) {
+ plc4c_plc4x_read_write_plc4x_field_request *item;
+ item = element->value;
+
+ free(item->field->name);
+ free(item->field->field_query);
+ free(item->field);
+}
+
+void destroy_plc4x_read_response_fields(plc4c_list_element *element) {
+ plc4c_plc4x_read_write_plc4x_field_value_response *item;
+ item = element->value;
+
+ free(item->field->name);
+ free(item->field->field_query);
+ free(item->field);
+ // TODO: Free PlcValue
+}
+
+void destroy_plc4x_write_request_fields(plc4c_list_element *element) {
+ plc4c_plc4x_read_write_plc4x_field_value_request *item;
+ item = element->value;
+
+ free(item->field->name);
+ free(item->field->field_query);
+ free(item->field);
+ // TODO: Free PlcValue
+}
+
+void destroy_plc4x_write_response_fields(plc4c_list_element *element) {
+ plc4c_plc4x_read_write_plc4x_field_response *item;
+ item = element->value;
+ // Nothing to do here.
+}
+
+void plc4c_driver_plc4x_destroy_packet(plc4c_plc4x_read_write_plc4x_message* packet) {
+ if (packet) {
+ switch (packet->_type) {
+ case plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_connect_request:
+ free(packet->plc4x_connect_request_connection_string);
+ break;
+
+ case plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_connect_response:
+ break;
+
+ case plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_read_request:
+ plc4c_utils_list_delete_elements(packet->plc4x_read_request_fields,
+ destroy_plc4x_read_request_fields);
+ free(packet->plc4x_read_request_fields);
+ break;
+
+ case plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_read_response:
+ plc4c_utils_list_delete_elements(packet->plc4x_read_response_fields,
+ destroy_plc4x_read_response_fields);
+ free(packet->plc4x_read_request_fields);
+ break;
+
+ case plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_write_request:
+ plc4c_utils_list_delete_elements(packet->plc4x_write_request_fields,
+ destroy_plc4x_write_request_fields);
+ free(packet->plc4x_read_request_fields);
+ break;
+
+ case plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_write_response:
+ plc4c_utils_list_delete_elements(packet->plc4x_write_response_fields,
+ destroy_plc4x_write_response_fields);
+ free(packet->plc4x_read_request_fields);
+ break;
+ }
+ free(packet);
+ }
+}
+
+plc4c_return_code plc4c_driver_plc4x_create_connection_request(plc4c_driver_plc4x_config* configuration,
+ plc4c_plc4x_read_write_plc4x_message** connect_request_packet) {
+ *connect_request_packet = malloc(sizeof(plc4c_plc4x_read_write_plc4x_message));
+ if (*connect_request_packet == NULL) {
+ return NO_MEMORY;
+ }
+
+ (*connect_request_packet)->_type = plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_connect_request;
+ (*connect_request_packet)->request_id = configuration->request_id++;
+
+ // Copy the connection string.
+ size_t size = sizeof(char) * (strlen(configuration->remote_connection_string) + 1);
+ (*connect_request_packet)->plc4x_connect_request_connection_string = malloc(size);
+ if((*connect_request_packet)->plc4x_connect_request_connection_string == NULL) {
+ return NO_MEMORY;
+ }
+ strncpy((*connect_request_packet)->plc4x_connect_request_connection_string,
+ configuration->remote_connection_string, size);
+
+ return OK;
+}
+
+void plc4c_driver_plc4x_destroy_connection_request(plc4c_plc4x_read_write_plc4x_message* packet) {
+ plc4c_driver_plc4x_destroy_packet(packet);
+}
+
+plc4c_return_code plc4c_driver_plc4x_create_plc4x_read_request(plc4c_read_request* read_request,
+ plc4c_plc4x_read_write_plc4x_message** plc4x_read_request_packet) {
+ plc4c_driver_plc4x_config* configuration = read_request->connection->configuration;
+
+ *plc4x_read_request_packet = malloc(sizeof(plc4c_plc4x_read_write_plc4x_message));
+ if (*plc4x_read_request_packet == NULL) {
+ return NO_MEMORY;
+ }
+
+ (*plc4x_read_request_packet)->_type = plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_connect_request;
+ (*plc4x_read_request_packet)->request_id = configuration->request_id++;
+ (*plc4x_read_request_packet)->plc4x_read_request_connection_id = configuration->connection_id;
+ plc4c_utils_list_create(&((*plc4x_read_request_packet)->plc4x_read_request_fields));
+
+ plc4c_list_element* cur_item = read_request->items->tail;
+ while (cur_item != NULL) {
+ plc4c_item* item;
+ item = cur_item->value;
+
+ // Create a new field item.
+ plc4c_plc4x_read_write_plc4x_field* field;
+ field = malloc(sizeof(plc4c_plc4x_read_write_plc4x_field));
+ if (field == NULL) {
+ return NO_MEMORY;
+ }
+
+ // Copy the name.
+ size_t size = sizeof(char) * (strlen(item->name) + 1);
+ field->name = malloc(size);
+ if(field->name == NULL) {
+ return NO_MEMORY;
+ }
+ strncpy(field->name,item->name, size);
+
+ // Copy the query.
+ size = sizeof(char) * (strlen(item->address) + 1);
+ field->field_query = malloc(size);
+ if(field->field_query == NULL) {
+ return NO_MEMORY;
+ }
+ strncpy(field->field_query,item->address, size);
+
+ // Add the item to the list.
+ plc4c_utils_list_insert_tail_value(
+ (*plc4x_read_request_packet)->plc4x_read_request_fields, field);
+
+ cur_item = cur_item->next;
+ }
+
+ return OK;
+}
+
+void plc4c_driver_plc4x_destroy_plc4x_read_request(plc4c_plc4x_read_write_plc4x_message* packet) {
+ plc4c_driver_plc4x_destroy_packet(packet);
+}
+
+plc4c_return_code plc4c_driver_plc4x_create_plc4x_write_request(plc4c_write_request* write_request,
+ plc4c_plc4x_read_write_plc4x_message** plc4x_write_request_packet) {
+ plc4c_driver_plc4x_config* configuration = write_request->connection->configuration;
+
+ *plc4x_write_request_packet = malloc(sizeof(plc4c_plc4x_read_write_plc4x_message));
+ if (*plc4x_write_request_packet == NULL) {
+ return NO_MEMORY;
+ }
+
+ (*plc4x_write_request_packet)->_type = plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_connect_request;
+ (*plc4x_write_request_packet)->request_id = configuration->request_id++;
+ (*plc4x_write_request_packet)->plc4x_write_request_connection_id = configuration->connection_id;
+ plc4c_utils_list_create(&((*plc4x_write_request_packet)->plc4x_write_request_fields));
+
+ plc4c_list_element* cur_item = write_request->items->tail;
+ while (cur_item != NULL) {
+ plc4c_item* item;
+ item = cur_item->value;
+
+ // Create a new field item.
+ plc4c_plc4x_read_write_plc4x_field* field;
+ field = malloc(sizeof(plc4c_plc4x_read_write_plc4x_field));
+ if (field == NULL) {
+ return NO_MEMORY;
+ }
+
+ // Copy the name.
+ size_t size = sizeof(char) * (strlen(item->name) + 1);
+ field->name = malloc(size);
+ if(field->name == NULL) {
+ return NO_MEMORY;
+ }
+ strncpy(field->name,item->name, size);
+
+ // Copy the query.
+ size = sizeof(char) * (strlen(item->address) + 1);
+ field->field_query = malloc(size);
+ if(field->field_query == NULL) {
+ return NO_MEMORY;
+ }
+ strncpy(field->field_query,item->address, size);
+
+ plc4c_plc4x_read_write_plc4x_field_value_request* value_request;
+ value_request = malloc(sizeof(plc4c_plc4x_read_write_plc4x_field_value_request));
+ if(value_request == NULL) {
+ return NO_MEMORY;
+ }
+ value_request->field = field;
+ // TODO: Set the plc-value
+ //value_request->
+
+ // Add the item to the list.
+ plc4c_utils_list_insert_tail_value(
+ (*plc4x_write_request_packet)->plc4x_write_request_fields, value_request);
+
+ cur_item = cur_item->next;
+ }
+
+ return OK;
+}
+
+void plc4c_driver_plc4x_destroy_plc4x_write_request(plc4c_plc4x_read_write_plc4x_message* packet) {
+ plc4c_driver_plc4x_destroy_packet(packet);
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/plc4c/drivers/plc4x/src/driver_plc4x_sm_connect.c b/plc4c/drivers/plc4x/src/driver_plc4x_sm_connect.c
new file mode 100644
index 0000000..c30952b
--- /dev/null
+++ b/plc4c/drivers/plc4x/src/driver_plc4x_sm_connect.c
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <plc4c/plc4c.h>
+#include <plc4c/spi/types_private.h>
+#include <stdlib.h>
+#include "plc4c/driver_plc4x.h"
+#include "plc4c/driver_plc4x_sm.h"
+#include "plc4c/driver_plc4x_packets.h"
+#include "plc4x_message.h"
+
+
+enum plc4c_driver_plc4x_connect_states {
+ PLC4C_DRIVER_PLC4X_CONNECT_INIT,
+ PLC4C_DRIVER_PLC4X_CONNECT_TRANSPORT_CONNECT,
+ PLC4C_DRIVER_PLC4X_CONNECT_SEND_CONNECT_REQUEST,
+ PLC4C_DRIVER_PLC4X_CONNECT_RECEIVE_CONNECT_RESPONSE,
+ PLC4C_DRIVER_PLC4X_CONNECT_FINISHED
+};
+
+/**
+ * State machine function for establishing a connection to a remote S7 device.
+ * @param task the current system task
+ * @return return code of the current state machine step execution
+ */
+plc4c_return_code plc4c_driver_plc4x_connect_machine_function(plc4c_system_task* task) {
+
+ plc4c_connection* connection;
+ plc4c_driver_plc4x_config* configuration;
+ plc4c_return_code return_code;
+ plc4c_plc4x_read_write_plc4x_message* packet;
+
+ connection = task->connection;
+ if (connection == NULL) {
+ return INTERNAL_ERROR;
+ }
+ // If we were already connected, return an error
+ if (plc4c_connection_get_connected(connection)) {
+ return ALREADY_CONNECTED;
+ }
+ configuration = connection->configuration;
+
+ // Initialize the pdu id (The first messages are hard-coded)
+// configuration->pdu_id = 1;
+
+ switch (task->state_id) {
+ // Initialize some internal data-structures.
+ case PLC4C_DRIVER_PLC4X_CONNECT_INIT: {
+ // Calculate some internal settings from the values provided in the
+ // configuration.
+
+ task->state_id = PLC4C_DRIVER_PLC4X_CONNECT_TRANSPORT_CONNECT;
+ break;
+ }
+ case PLC4C_DRIVER_PLC4X_CONNECT_TRANSPORT_CONNECT: {
+ return_code = connection->transport->open(connection->transport_configuration);
+ if(return_code != OK) {
+ return return_code;
+ }
+
+ task->state_id = PLC4C_DRIVER_PLC4X_CONNECT_SEND_CONNECT_REQUEST;
+ break;
+ }
+ // Send a connection request.
+ case PLC4C_DRIVER_PLC4X_CONNECT_SEND_CONNECT_REQUEST: {
+ // Get a connection response for the settings in the config.
+ return_code = plc4c_driver_plc4x_create_connection_request(configuration, &packet);
+ if (return_code != OK) {
+ return return_code;
+ }
+
+ // Send the packet to the remote.
+ return_code = plc4c_driver_plc4x_send_packet(connection, packet);
+ if (return_code != OK) {
+ return return_code;
+ }
+ plc4c_driver_plc4x_destroy_connection_request(packet);
+ task->state_id = PLC4C_DRIVER_PLC4X_CONNECT_RECEIVE_CONNECT_RESPONSE;
+ break;
+ }
+ // Receive a connection response.
+ case PLC4C_DRIVER_PLC4X_CONNECT_RECEIVE_CONNECT_RESPONSE: {
+ // Read a response packet.
+ return_code = plc4c_driver_plc4x_receive_packet(connection, &packet);
+ // If we haven't read enough to process a full message, just try again
+ // next time.
+ if (return_code == UNFINISHED) {
+ return OK;
+ } else if (return_code != OK) {
+ return return_code;
+ }
+
+ plc4c_driver_plc4x_destroy_packet(packet);
+ // If we got the expected response, continue with the next higher level
+ // of connection.
+ task->state_id = PLC4C_DRIVER_PLC4X_CONNECT_FINISHED;
+ break;
+ }
+ // Clean up some internal data-structures.
+ case PLC4C_DRIVER_PLC4X_CONNECT_FINISHED: {
+ plc4c_connection_set_connected(connection, true);
+ task->completed = true;
+ break;
+ }
+ // If an unexpected state id was received, this is not really something
+ // we can recover from.
+ default: {
+ task->completed = true;
+ return INTERNAL_ERROR;
+ }
+ }
+ return OK;
+}
+
+plc4c_return_code plc4c_driver_plc4x_connect_function(plc4c_connection* connection,
+ plc4c_system_task** task) {
+
+ plc4c_system_task* new_task = malloc(sizeof(plc4c_system_task));
+ // There's nothing to do here, so no need for a state-machine.
+ new_task->state_id = PLC4C_DRIVER_PLC4X_CONNECT_INIT;
+ new_task->state_machine_function = &plc4c_driver_plc4x_connect_machine_function;
+ new_task->completed = false;
+ new_task->context = connection;
+ new_task->connection = connection;
+ *task = new_task;
+ return OK;
+}
diff --git a/plc4c/drivers/plc4x/src/driver_plc4x_sm_disconnect.c b/plc4c/drivers/plc4x/src/driver_plc4x_sm_disconnect.c
new file mode 100644
index 0000000..52336de
--- /dev/null
+++ b/plc4c/drivers/plc4x/src/driver_plc4x_sm_disconnect.c
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <plc4c/plc4c.h>
+#include <plc4c/spi/types_private.h>
+#include <stdlib.h>
+#include "plc4c/driver_plc4x.h"
+
+enum plc4c_driver_plc4x_disconnect_states {
+ PLC4C_DRIVER_PLC4X_DISCONNECT_INIT,
+ PLC4C_DRIVER_PLC4X_DISCONNECT_WAIT_TASKS_FINISHED,
+ PLC4C_DRIVER_PLC4X_DISCONNECT_FINISHED
+};
+
+plc4c_return_code plc4c_driver_plc4x_disconnect_machine_function(
+ plc4c_system_task* task) {
+ plc4c_connection* connection = task->context;
+ if (connection == NULL) {
+ return INTERNAL_ERROR;
+ }
+
+ switch (task->state_id) {
+ case PLC4C_DRIVER_PLC4X_DISCONNECT_INIT: {
+ plc4c_connection_set_disconnect(connection, true);
+ task->state_id = PLC4C_DRIVER_PLC4X_DISCONNECT_WAIT_TASKS_FINISHED;
+ break;
+ }
+ case PLC4C_DRIVER_PLC4X_DISCONNECT_WAIT_TASKS_FINISHED: {
+ // The disconnect system-task also counts.
+ if (plc4c_connection_get_running_tasks_count(connection) == 1) {
+ plc4c_connection_set_connected(connection, false);
+ task->completed = true;
+ task->state_id = PLC4C_DRIVER_PLC4X_DISCONNECT_FINISHED;
+ }
+ break;
+ }
+ case PLC4C_DRIVER_PLC4X_DISCONNECT_FINISHED: {
+ // Do nothing
+ break;
+ }
+ default: {
+ return INTERNAL_ERROR;
+ }
+ }
+ return OK;
+}
+
+plc4c_return_code plc4c_driver_plc4x_disconnect_function(
+ plc4c_connection* connection, plc4c_system_task** task) {
+ plc4c_system_task* new_task = malloc(sizeof(plc4c_system_task));
+ new_task->state_id = PLC4C_DRIVER_PLC4X_DISCONNECT_INIT;
+ new_task->state_machine_function =
+ &plc4c_driver_plc4x_disconnect_machine_function;
+ new_task->completed = false;
+ new_task->context = connection;
+ new_task->connection = connection;
+ *task = new_task;
+ return OK;
+}
diff --git a/plc4c/drivers/plc4x/src/driver_plc4x_sm_read.c b/plc4c/drivers/plc4x/src/driver_plc4x_sm_read.c
new file mode 100644
index 0000000..44af570
--- /dev/null
+++ b/plc4c/drivers/plc4x/src/driver_plc4x_sm_read.c
@@ -0,0 +1,248 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <ctype.h>
+#include <plc4c/spi/types_private.h>
+#include <stdlib.h>
+#include "plc4c/driver_plc4x.h"
+#include "plc4c/driver_plc4x_packets.h"
+#include "plc4x_message.h"
+
+enum plc4c_driver_plc4x_read_states {
+ PLC4C_DRIVER_PLC4X_READ_INIT,
+ PLC4C_DRIVER_PLC4X_READ_FINISHED
+};
+
+// Forward declaration of helper function to stop PLC4C_DRIVER_PLC4X_READ_FINISHED
+// state become too big, TODO: move to some header or inline
+plc4c_return_code plc4c_driver_plc4x_parse_read_response(
+ plc4c_read_request_execution *execution, plc4c_plc4x_read_write_plc4x_message* packet);
+
+plc4c_return_code plc4c_driver_plc4x_sm_read_init(
+ plc4c_connection* connection, plc4c_read_request_execution* execution) {
+
+ plc4c_plc4x_read_write_plc4x_message* packet;
+ plc4c_return_code result;
+
+ result = plc4c_driver_plc4x_create_plc4x_read_request(execution->read_request, &packet);
+ if (result != OK) {
+ return result;
+ }
+
+ // Send the packet to the remote.
+ result = plc4c_driver_plc4x_send_packet(connection, packet);
+ if (result != OK) {
+ return result;
+ }
+
+ plc4c_driver_plc4x_destroy_plc4x_read_request(packet);
+ return OK;
+}
+
+plc4c_return_code plc4c_driver_plc4x_sm_read_finished(
+ plc4c_connection* connection, plc4c_read_request_execution* execution) {
+
+ plc4c_plc4x_read_write_plc4x_message* packet;
+ plc4c_return_code result;
+
+ // Read a response packet.If we haven't read enough to
+ // process a full message, just try again next time.
+ result = plc4c_driver_plc4x_receive_packet(connection, &packet);
+ if (result != OK)
+ return result;
+
+ // Check the response. the number of items matches that of
+ //the request
+ if (packet->_type !=
+ plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_read_response)
+ return INTERNAL_ERROR;
+
+ // TODO: Check the connection id and the request id both match
+ //if (packet->plc4x_read_response_connection_id == connection.)
+
+ if (plc4c_utils_list_size(packet->plc4x_read_request_fields) !=
+ plc4c_utils_list_size(execution->read_request->items))
+ return INTERNAL_ERROR;
+
+ execution->read_response = malloc(sizeof(plc4c_read_response));
+ if (execution->read_response == NULL)
+ return NO_MEMORY;
+ execution->read_response->read_request = execution->read_request;
+
+ result = plc4c_driver_plc4x_parse_read_response(execution, packet);
+
+ if (result != OK)
+ return result;
+
+ plc4c_driver_plc4x_destroy_packet(packet);
+ return OK;
+
+}
+
+
+plc4c_return_code plc4c_driver_plc4x_read_machine_function(
+ plc4c_system_task* task) {
+
+ plc4c_read_request_execution* execution;
+ plc4c_connection* connection;
+ plc4c_return_code result;
+
+ execution = task->context;
+ connection = task->connection;
+
+ if ((!execution) || (!execution->read_request) || (!connection))
+ return INTERNAL_ERROR;
+
+ switch (task->state_id) {
+
+ case PLC4C_DRIVER_PLC4X_READ_INIT:
+ result = plc4c_driver_plc4x_sm_read_init(connection, execution);
+ if (result != OK)
+ return result;
+ task->state_id = PLC4C_DRIVER_PLC4X_READ_FINISHED;
+ break;
+
+ case PLC4C_DRIVER_PLC4X_READ_FINISHED:
+ result = plc4c_driver_plc4x_sm_read_finished(connection,execution);
+ if (result == OK)
+ task->completed = true;
+ else if (result == UNFINISHED)
+ return OK;
+ else
+ return result;
+ break;
+
+ }
+ return OK;
+}
+
+plc4c_return_code plc4c_driver_plc4x_read_function(
+ plc4c_read_request_execution* read_request_execution,
+ plc4c_system_task** task) {
+ plc4c_system_task* new_task = malloc(sizeof(plc4c_system_task));
+ if(new_task == NULL) {
+ return NO_MEMORY;
+ }
+ new_task->state_id = PLC4C_DRIVER_PLC4X_READ_INIT;
+ new_task->state_machine_function = &plc4c_driver_plc4x_read_machine_function;
+ new_task->completed = false;
+ new_task->context = read_request_execution;
+ new_task->connection = read_request_execution->read_request->connection;
+ *task = new_task;
+ return OK;
+}
+
+void plc4c_driver_plc4x_free_read_request_item(plc4c_list_element *element){
+ plc4c_item *item;
+ item = element->value;
+ plc4c_plc4x_read_write_plc4x_field_request *addr_item;
+ addr_item = item->address;
+ free(addr_item->field->name);
+ free(addr_item->field->field_query);
+ free(addr_item->field);
+ free(item);
+}
+
+
+void plc4c_driver_plc4x_free_read_request(plc4c_read_request *request) {
+ plc4c_utils_list_delete_elements(request->items,
+ &plc4c_driver_plc4x_free_read_request_item);
+ free(request->items);
+ request->items = NULL;
+ request->connection = NULL;
+ // actual request freed by caller
+}
+
+void plc4c_driver_plc4x_free_read_response_item(
+ plc4c_list_element* element) {
+
+ plc4c_response_value_item* value_item;
+ value_item = element->value;
+ plc4c_data_destroy(value_item->value);
+ // don't free value_item->item its managed by the request not response
+
+ free(value_item);
+}
+
+void plc4c_driver_plc4x_free_read_response(plc4c_read_response* response) {
+ // the request will be cleaned up elsewhere
+ plc4c_utils_list_delete_elements(response->items,
+ &plc4c_driver_plc4x_free_read_response_item);
+ free(response->items);
+}
+
+plc4c_return_code plc4c_driver_plc4x_parse_read_response(
+ plc4c_read_request_execution* execution,
+ plc4c_plc4x_read_write_plc4x_message* packet) {
+
+ // TODO this function is too big and complex: modularise
+
+ // Locals :(
+ plc4c_plc4x_read_write_plc4x_message* plc4x_packet;
+ plc4c_list_element* request_elements;
+ plc4c_list_element* payload_elements;
+ plc4c_item* request_item;
+ plc4c_plc4x_read_write_plc4x_field_request * request_address;
+ plc4c_plc4x_read_write_plc4x_field_value_response * payload_item;
+ plc4c_spi_read_buffer* read_buffer;
+ plc4c_data* data_item;
+ plc4c_response_value_item* response_value_item;
+ char* data_protocol_id;
+ uint16_t num_elements;
+ int32_t string_length;
+ uint8_t* byte_array;
+ size_t list_size;
+ size_t idx;
+ enum plc4c_return_code result;
+
+ // Make a new list for holding the response value items
+ plc4c_utils_list_create(&execution->read_response->items);
+
+ // Iterate over the request items and use the types to decode the
+ // response items.
+ request_elements = plc4c_utils_list_tail(execution->read_request->items);
+ payload_elements = plc4c_utils_list_tail(packet->plc4x_read_response_fields);
+
+ while ((request_elements != NULL) && (payload_elements != NULL)) {
+ request_item = request_elements->value;
+ payload_item = payload_elements->value;
+
+ // Create a new response value-item
+ response_value_item = malloc(sizeof(plc4c_response_value_item));
+ if (response_value_item == NULL)
+ return NO_MEMORY;
+
+ response_value_item->item = request_item;
+
+ if (payload_item->response_code == plc4c_plc4x_read_write_plc4x_response_code_OK) {
+ response_value_item->response_code = PLC4C_RESPONSE_CODE_OK;
+ } else {
+ response_value_item->response_code = PLC4C_RESPONSE_CODE_INTERNAL_ERROR;
+ }
+
+ response_value_item->value = payload_item->value;
+
+ // Add the value-item to the list.
+ plc4c_utils_list_insert_head_value(execution->read_response->items, response_value_item);
+ request_elements = request_elements->next;
+ payload_elements = payload_elements->next;
+ }
+
+ return OK;
+}
diff --git a/plc4c/drivers/plc4x/src/driver_plc4x_sm_write.c b/plc4c/drivers/plc4x/src/driver_plc4x_sm_write.c
new file mode 100644
index 0000000..d5a35c1
--- /dev/null
+++ b/plc4c/drivers/plc4x/src/driver_plc4x_sm_write.c
@@ -0,0 +1,232 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <plc4c/plc4c.h>
+#include <plc4c/spi/types_private.h>
+#include <stdlib.h>
+#include "plc4x_message.h"
+#include "plc4c/driver_plc4x_packets.h"
+
+enum plc4c_driver_plc4x_write_states {
+ PLC4C_DRIVER_PLC4X_WRITE_INIT,
+ PLC4C_DRIVER_PLC4X_WRITE_FINISHED
+};
+
+// Forward declaration of helper function to stop PLC4C_DRIVER_S7_WRITE_FINISHED
+// state become too big, TODO: move to some header or inline
+plc4c_return_code plc4c_driver_plc4x_parse_write_response(
+ plc4c_write_request_execution* execution, plc4c_plc4x_read_write_plc4x_message* packet);
+
+
+plc4c_return_code plc4c_driver_plc4x_sm_write_init(
+ plc4c_connection* connection, plc4c_write_request_execution* execution) {
+
+ plc4c_plc4x_read_write_plc4x_message* packet;
+ plc4c_return_code result;
+
+ result = plc4c_driver_plc4x_create_plc4x_write_request(execution->write_request, &packet);
+ if (result != OK) {
+ return result;
+ }
+
+ // Send the packet to the remote.
+ result = plc4c_driver_plc4x_send_packet(connection, packet);
+ if (result != OK) {
+ return result;
+ }
+ plc4c_driver_plc4x_destroy_plc4x_write_request(packet);
+
+ return OK;
+}
+
+plc4c_return_code plc4c_driver_plc4x_sm_write_finished(
+ plc4c_connection* connection, plc4c_write_request_execution* execution) {
+
+ plc4c_plc4x_read_write_plc4x_message* packet;
+ plc4c_return_code result;
+
+ // Read a response packet. If we haven't read enough to process
+ // a full message, just try again next time.
+ result = plc4c_driver_plc4x_receive_packet(connection, &packet);
+ if (result != OK)
+ return result;
+
+ if (plc4c_utils_list_size(packet->plc4x_write_response_fields) !=
+ plc4c_utils_list_size(execution->write_request->items))
+ return INTERNAL_ERROR;
+
+ // Make a new response item and bind to the execution, also bind
+ // the request to the response (useful of parsing)
+ execution->write_response = malloc(sizeof(plc4c_write_response));
+ if (execution->write_response == NULL)
+ return NO_MEMORY;
+ execution->write_response->write_request = execution->write_request;
+
+ // Sets the write-response status from the plc4x payload response status
+ result = plc4c_driver_plc4x_parse_write_response(execution, packet);
+
+ if (result != OK)
+ return result;
+
+ plc4c_driver_plc4x_destroy_packet(packet);
+ return OK;
+}
+
+plc4c_return_code plc4c_driver_plc4x_write_machine_function(
+ plc4c_system_task* task) {
+
+ plc4c_write_request_execution* execution;
+ plc4c_connection* connection;
+ plc4c_return_code result;
+
+ execution = task->context;
+ connection = task->connection;
+
+ if ((!execution) || (!execution->write_request) || (!connection))
+ return INTERNAL_ERROR;
+
+ switch (task->state_id) {
+
+ case PLC4C_DRIVER_PLC4X_WRITE_INIT:
+ result = plc4c_driver_plc4x_sm_write_init(connection, execution);
+ if (result == OK)
+ task->state_id = PLC4C_DRIVER_PLC4X_WRITE_FINISHED;
+ else
+ return result;
+ break;
+
+ case PLC4C_DRIVER_PLC4X_WRITE_FINISHED:
+ result = plc4c_driver_plc4x_sm_write_finished(connection, execution);
+ if (result == OK)
+ task->completed = true;
+ else if (result == UNFINISHED)
+ return OK;
+ else
+ return result;
+
+ }
+ return OK;
+}
+
+plc4c_return_code plc4c_driver_plc4x_write_function(
+ plc4c_write_request_execution* write_request_execution,
+ plc4c_system_task** task) {
+
+ plc4c_system_task* new_task = malloc(sizeof(plc4c_system_task));
+ if(new_task == NULL)
+ return NO_MEMORY;
+
+ new_task->state_id = PLC4C_DRIVER_PLC4X_WRITE_INIT;
+ new_task->state_machine_function = &plc4c_driver_plc4x_write_machine_function;
+ new_task->completed = false;
+ new_task->context = write_request_execution;
+ new_task->connection = plc4c_write_request_get_connection(write_request_execution->write_request);
+ *task = new_task;
+ return OK;
+}
+
+
+// TODO: remove hacked include but think doing so needs a driver
+// callback for request items due to malloc on:
+// plc4x_var_request_parameter_item_address_address
+// either way it doesn't belong in this file.
+void plc4c_driver_plc4x_free_write_request_item(plc4c_list_element *element) {
+ plc4c_request_value_item *item;
+ item = element->value;
+
+ plc4c_plc4x_read_write_plc4x_field_value_request *addr_item;
+ addr_item = item->item->address;
+ // TODO: finish this ...
+ //free(addr_item->);
+ free(addr_item);
+
+ free(item->item);
+ // todo : require call explicitly or add here
+ plc4c_data_destroy(item->value);
+ free(item);
+}
+
+void plc4c_driver_plc4x_free_write_request(plc4c_write_request *request) {
+ plc4c_utils_list_delete_elements(request->items,
+ plc4c_driver_plc4x_free_write_request_item);
+ free(request->items);
+ // actual request free'd by caller
+}
+
+void plc4c_driver_plc4x_free_write_response_item(
+ plc4c_list_element* write_item_element) {
+
+ plc4c_response_item* responce_item;
+ responce_item = write_item_element->value;
+ // dont free responce_item-item->item its managed by the request not responce
+ free(responce_item);
+}
+
+void plc4c_driver_plc4x_free_write_response(plc4c_write_response* response) {
+
+ plc4c_utils_list_delete_elements(response->response_items,
+ plc4c_driver_plc4x_free_write_response_item);
+ free(response->response_items);
+}
+
+
+plc4c_return_code plc4c_driver_plc4x_parse_write_response(
+ plc4c_write_request_execution *execution,
+ plc4c_plc4x_read_write_plc4x_message* packet) {
+
+ // Locals first 4 are just used for walking two lists
+ plc4c_list_element* request_elements;
+ plc4c_request_value_item* request_item;
+ plc4c_list_element* plc4x_payload_elements;
+ plc4c_plc4x_read_write_plc4x_field_response* plc4x_payload_item;
+ plc4c_response_item* response_item;
+
+ // Make the unfilled response a list
+ plc4c_utils_list_create(&execution->write_response->response_items);
+
+ // Iterate over the request items setting return codes as needed.
+ request_elements = plc4c_utils_list_tail(execution->write_request->items);
+ plc4x_payload_elements = plc4c_utils_list_tail(packet->plc4x_write_response_fields);
+
+ while ((request_elements != NULL) && (plc4x_payload_elements != NULL)) {
+ request_item = request_elements->value;
+ plc4x_payload_item = plc4x_payload_elements->value;
+
+ // Make a new response item, bind the related request item
+ response_item = malloc(sizeof(plc4c_response_item));
+ if (response_item == NULL) {
+ return NO_MEMORY;
+ }
+ response_item->item = request_item->item;
+
+ // TODO: better map transport error codes to response error codes
+ if (plc4x_payload_item->response_code == plc4c_plc4x_read_write_plc4x_response_code_OK) {
+ response_item->response_code = PLC4C_RESPONSE_CODE_OK;
+ } else {
+ response_item->response_code = PLC4C_RESPONSE_CODE_INTERNAL_ERROR;
+ }
+
+ plc4c_utils_list_insert_head_value(execution->write_response->response_items, response_item);
+
+ request_elements = request_elements->next;
+ plc4x_payload_elements = plc4x_payload_elements->next;
+ }
+
+ return OK;
+}
\ No newline at end of file
diff --git a/plc4c/spi/include/plc4c/spi/evaluation_helper.h b/plc4c/drivers/plc4x/src/driver_plc4x_static.c
similarity index 65%
copy from plc4c/spi/include/plc4c/spi/evaluation_helper.h
copy to plc4c/drivers/plc4x/src/driver_plc4x_static.c
index c07be76..a76eecc 100644
--- a/plc4c/spi/include/plc4c/spi/evaluation_helper.h
+++ b/plc4c/drivers/plc4x/src/driver_plc4x_static.c
@@ -16,19 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-#ifndef PLC4C_SPI_EVALUATION_HELPER_H_
-#define PLC4C_SPI_EVALUATION_HELPER_H_
-#include <stdint.h>
-#include <stdbool.h>
-#include <plc4c/utils/list.h>
-
-bool plc4c_spi_evaluation_helper_equals(int a, int b);
-
-double plc4c_spi_evaluation_helper_ceil(double a);
-
-uint8_t plc4c_spi_evaluation_helper_count(plc4c_list* a);
-
-uint8_t plc4c_spi_evaluation_helper_array_size_in_bytes(plc4c_list* a);
+/*
+ *
+ * Static functions
+ *
+ */
-#endif // PLC4C_SPI_EVALUATION_HELPER_H_
diff --git a/plc4c/spi/include/plc4c/spi/evaluation_helper.h b/plc4c/drivers/plc4x/test/plc4x_test.c
similarity index 65%
copy from plc4c/spi/include/plc4c/spi/evaluation_helper.h
copy to plc4c/drivers/plc4x/test/plc4x_test.c
index c07be76..b6b8630 100644
--- a/plc4c/spi/include/plc4c/spi/evaluation_helper.h
+++ b/plc4c/drivers/plc4x/test/plc4x_test.c
@@ -16,19 +16,19 @@
* specific language governing permissions and limitations
* under the License.
*/
-#ifndef PLC4C_SPI_EVALUATION_HELPER_H_
-#define PLC4C_SPI_EVALUATION_HELPER_H_
+#include <unity.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <plc4c/utils/list.h>
+void parser_serializer_test_plc4x_read_write();
-bool plc4c_spi_evaluation_helper_equals(int a, int b);
+void setUp(void) {}
-double plc4c_spi_evaluation_helper_ceil(double a);
+void tearDown(void) {}
-uint8_t plc4c_spi_evaluation_helper_count(plc4c_list* a);
+int main(void) {
+ UNITY_BEGIN();
-uint8_t plc4c_spi_evaluation_helper_array_size_in_bytes(plc4c_list* a);
+ // Execute the auto-generated serializer/parser tests.
+ parser_serializer_test_plc4x_read_write();
-#endif // PLC4C_SPI_EVALUATION_HELPER_H_
+ return UNITY_END();
+}
\ No newline at end of file
diff --git a/plc4c/drivers/s7/CMakeLists.txt b/plc4c/drivers/s7/CMakeLists.txt
index 3f76524..2b6d143 100644
--- a/plc4c/drivers/s7/CMakeLists.txt
+++ b/plc4c/drivers/s7/CMakeLists.txt
@@ -40,6 +40,8 @@ if (BUILD_PHASE STREQUAL test-compile)
add_executable(plc4c-driver-s7-test
test/s7_address_parser_test.c
test/s7_test.c
+ ../../spi/test/utils/test_utils.c
+ ../../generated-sources/s7/test/ParserSerializerTestsuite.c
)
IF (NOT WIN32)
diff --git a/plc4c/drivers/s7/src/driver_s7_packets.c b/plc4c/drivers/s7/src/driver_s7_packets.c
index db81811..98bfc9e 100644
--- a/plc4c/drivers/s7/src/driver_s7_packets.c
+++ b/plc4c/drivers/s7/src/driver_s7_packets.c
@@ -18,7 +18,6 @@
*/
#include <cotp_protocol_class.h>
-#include <ctype.h>
#include <plc4c/driver_s7.h>
#include <plc4c/spi/types_private.h>
#include <stdlib.h>
diff --git a/plc4c/drivers/s7/src/driver_s7_sm_read.c b/plc4c/drivers/s7/src/driver_s7_sm_read.c
index bf306c3..850a60f 100644
--- a/plc4c/drivers/s7/src/driver_s7_sm_read.c
+++ b/plc4c/drivers/s7/src/driver_s7_sm_read.c
@@ -164,7 +164,7 @@ void plc4c_driver_s7_free_read_request(plc4c_read_request *request) {
free(request->items);
request->items = NULL;
request->connection = NULL;
- // actual request free'd by caller
+ // actual request freed by caller
}
void plc4c_driver_s7_free_read_response_item(
@@ -173,7 +173,7 @@ void plc4c_driver_s7_free_read_response_item(
plc4c_response_value_item* value_item;
value_item = element->value;
plc4c_data_destroy(value_item->value);
- // dont free value_item->item its managed by the request not responce
+ // don't free value_item->item its managed by the request not response
free(value_item);
}
@@ -210,7 +210,7 @@ plc4c_return_code plc4c_driver_s7_parse_read_response(
size_t idx;
enum plc4c_return_code result;
- // Make a new list for holding the responce value items
+ // Make a new list for holding the response value items
plc4c_utils_list_create(&execution->read_response->items);
// Iterate over the request items and use the types to decode the
diff --git a/plc4c/drivers/s7/test/s7_test.c b/plc4c/drivers/s7/test/s7_test.c
index 2ec0bd9..3e52240 100644
--- a/plc4c/drivers/s7/test/s7_test.c
+++ b/plc4c/drivers/s7/test/s7_test.c
@@ -18,210 +18,7 @@
*/
#include <unity.h>
-#include "plc4c/spi/read_buffer.h"
-#include "tpkt_packet.h"
-#include "stdio.h"
-
-void s7_address_parser_test();
-
-void internal_assert_arrays_equal(uint8_t* expected_array,
- plc4c_spi_write_buffer* write_buffer,
- uint8_t num_bytes) {
- for (int i = 0; i < num_bytes; i++) {
- uint8_t expected_value = *(expected_array + i);
- uint8_t actual_value = *(write_buffer->data + i);
- // Needed for debugging on remote machines: Output the entire arrays content.
- if(expected_value != actual_value) {
- printf("\n");
- for(int j = 0; j < num_bytes; j++) {
- bool different = *(expected_array + j) != *(write_buffer->data + j);
- if(different) {
- printf("\033[0;31m");
- }
- printf("E=%02X %s A=%02X | ", *(expected_array + j), ( different ? "!=" : "=="), *(write_buffer->data + j));
- if(different) {
- printf("\033[0m");
- }
- }
- printf("\n");
- }
- TEST_ASSERT_EQUAL_UINT8_MESSAGE(expected_value, actual_value, "Byte arrays differ");
- }
-}
-
-void internal_parse_serialize_test(uint8_t* payload,
- uint8_t payload_size) {
- // Create a new read_buffer instance
- plc4c_spi_read_buffer* read_buffer;
- plc4c_return_code return_code =
- plc4c_spi_read_buffer_create(payload, payload_size, &read_buffer);
- if (return_code != OK) {
- TEST_FAIL_MESSAGE("Error creating read buffer");
- }
-
- plc4c_s7_read_write_tpkt_packet* message = NULL;
- return_code = plc4c_s7_read_write_tpkt_packet_parse(read_buffer, &message);
- if (return_code != OK) {
- TEST_FAIL_MESSAGE("Error error parsing tpkt packet");
- }
-
- plc4c_spi_write_buffer* write_buffer;
- return_code = plc4c_spi_write_buffer_create(payload_size, &write_buffer);
- if (return_code != OK) {
- TEST_FAIL_MESSAGE("Error writing to buffer");
- }
-
- return_code =
- plc4c_s7_read_write_tpkt_packet_serialize(write_buffer, message);
-
- if (return_code != OK) {
- TEST_FAIL_MESSAGE("Error serializing");
- }
-
- internal_assert_arrays_equal(payload, write_buffer, payload_size);
-
- printf("Success");
-}
-
-void parse_cotp_connection_request() {
- uint8_t payload[] = {0x03, 0x00, 0x00, 0x16, 0x11, 0xe0, 0x00, 0x00,
- 0x00, 0x0f, 0x00, 0xc2, 0x02, 0x01, 0x00, 0xc1,
- 0x02, 0x03, 0x11, 0xc0, 0x01, 0x0a};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_cotp_connection_response() {
- uint8_t payload[] = {0x03, 0x00, 0x00, 0x16, 0x11, 0xd0, 0x00, 0x0f,
- 0x00, 0x0b, 0x00, 0xc0, 0x01, 0x0a, 0xc1, 0x02,
- 0x03, 0x11, 0xc2, 0x02, 0x01, 0x00};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_s7_communication_setup_request() {
- uint8_t payload[] = {0x03, 0x00, 0x00, 0x19, 0x02, 0xf0, 0x81, 0x32, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xf0,
- 0x00, 0x00, 0x08, 0x00, 0x08, 0x03, 0xf0};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_s7_communication_setup_response() {
- uint8_t payload[] = {0x03, 0x00, 0x00, 0x1b, 0x02, 0xf0, 0x80, 0x32, 0x03,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
- 0x00, 0xf0, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0xf0};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_s7_read_plc_type_request() {
- uint8_t payload[] = {0x03, 0x00, 0x00, 0x21, 0x02, 0xf0, 0x82, 0x32, 0x07,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x08, 0x00,
- 0x01, 0x12, 0x04, 0x11, 0x44, 0x01, 0x00, 0xff, 0x09,
- 0x00, 0x04, 0x00, 0x11, 0x00, 0x00};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_s7_read_plc_type_response() {
- uint8_t payload[] = {
- 0x03, /* protocolId */
- 0x00,
- 0x00, 0x7d, /* len */
- 0x02, /* headerLength */
- 0xf0, /* tpduCode */
- 0x80, /* EOT & tpduRef */
-
- 0x32, /* protocolId */
- 0x07, /* messageType */
- 0x00, 0x00,
- 0x00, 0x01, /* tpduReference */
- 0x00, 0x0c, /* parameterLength */
- 0x00, 0x60, /* payloadLength */
-
- 0x00, /* parameterType */
- 0x01, /* numItems */
- 0x12, /* itemType */
- 0x08, /* itemLength */
- 0x12, /* method */
- 0x84, /* cpuFunctionType & cpuFunctionGroup */
- 0x01, /* cpuSubfunction */
- 0x01, /* sequenceNumber */
- 0x00, /* dataUnitReferenceNumber */
- 0x00, /* lastDataUnit */
- 0x00, 0x00, /* errorCode */
-
- 0xff, /* returnCode */
- 0x09, /* transportSize */
- 0x00, 0x5c, /* dataLength */
- 0x00, 0x11, /* typeClass & sublistExtract & sublistList */
- 0x00, 0x00, /* szlIndex */
-
- 0x00, 0x1c, /* szlItemLength */
- 0x00, 0x03, /* szlItemCount */
-
- 0x00, 0x01, /* itemIndex */
- 0x36, 0x45, 0x53, 0x37, 0x20, 0x32, 0x31, 0x32, 0x2d, 0x31, 0x42, 0x44, 0x33, 0x30, 0x2d, 0x30, 0x58, 0x42, 0x30, 0x20, /* mlfb */
- 0x20, 0x20, /* moduleTypeId */
- 0x00, 0x01, /* ausbg */
- 0x20, 0x20, /* ausbe */
-
- 0x00, 0x06, /* itemIndex */
- 0x36, 0x45, 0x53, 0x37, 0x20, 0x32, 0x31, 0x32, 0x2d, 0x31, 0x42, 0x44, 0x33, 0x30, 0x2d, 0x30, 0x58, 0x42, 0x30, 0x20, /* mlfb */
- 0x20, 0x20, /* moduleTypeId */
- 0x00, 0x01, /* ausbg */
- 0x20, 0x20, /* ausbe */
-
- 0x00, 0x07, /* itemIndex */
- 0x36, 0x45, 0x53, 0x37, 0x20, 0x32, 0x31, 0x32, 0x2d, 0x31, 0x42, 0x44, 0x33, 0x30, 0x2d, 0x30, 0x58, 0x42, 0x30, 0x20, /* mlfb */
- 0x20, 0x20, /* moduleTypeId */
- 0x56, 0x02, /* ausbg */
- 0x00, 0x02}; /* ausbe */
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_s7_read_request() {
- uint8_t payload[] = {
- 0x03, 0x00, 0x00, 0x43, 0x02, 0xf0, 0x8b, 0x32, 0x01, 0x00, 0x00, 0x00,
- 0x0b, 0x00, 0x32, 0x00, 0x00, 0x04, 0x04, 0x12, 0x0a, 0x10, 0x01, 0x00,
- 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x12, 0x0a, 0x10, 0x01, 0x00,
- 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x12, 0x0a, 0x10, 0x01, 0x00,
- 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x12, 0x0a, 0x10, 0x01, 0x00,
- 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_s7_read_response() {
- uint8_t payload[] = {0x03, 0x00, 0x00, 0x2d, 0x02, 0xf0, 0x80, 0x32, 0x03,
- 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x18, 0x00,
- 0x00, 0x04, 0x04, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00,
- 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00,
- 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_s7_read_error_response() {
- uint8_t payload[] = {0x03, 0x00, 0x00, 0x13, 0x02, 0xf0, 0x80,
- 0x32, 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00,
- 0x00, 0x00, 0x00, 0x85, 0x00};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_s7_write_request() {
- uint8_t payload[] = {
- 0x03, 0x00, 0x00, 0x5b, 0x02, 0xf0, 0x8e, 0x32, 0x01, 0x00, 0x00, 0x00,
- 0x0e, 0x00, 0x32, 0x00, 0x18, 0x05, 0x04, 0x12, 0x0a, 0x10, 0x01, 0x00,
- 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x12, 0x0a, 0x10, 0x01, 0x00,
- 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0x12, 0x0a, 0x10, 0x01, 0x00,
- 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x12, 0x0a, 0x10, 0x01, 0x00,
- 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x03, 0xff, 0x03, 0x00, 0x01, 0x01,
- 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00, 0xff, 0x03, 0x00, 0x01, 0x01,
- 0x00, 0xff, 0x03, 0x00, 0x01, 0x01, 0x00};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
-
-void parse_s7_write_response() {
- uint8_t payload[] = {0x03, 0x00, 0x00, 0x19, 0x02, 0xf0, 0x80, 0x32, 0x03,
- 0x00, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x04, 0x00,
- 0x00, 0x05, 0x04, 0xff, 0xff, 0xff, 0xff};
- internal_parse_serialize_test(payload, sizeof(payload));
-}
+void parser_serializer_test_s7_read_write();
void setUp(void) {}
@@ -230,17 +27,8 @@ void tearDown(void) {}
int main(void) {
UNITY_BEGIN();
- RUN_TEST(parse_cotp_connection_request);
- RUN_TEST(parse_cotp_connection_response);
- RUN_TEST(parse_s7_communication_setup_request);
- RUN_TEST(parse_s7_communication_setup_response);
- RUN_TEST(parse_s7_read_plc_type_request);
- RUN_TEST(parse_s7_read_plc_type_response);
- RUN_TEST(parse_s7_read_request);
- RUN_TEST(parse_s7_read_response);
- RUN_TEST(parse_s7_read_error_response);
- RUN_TEST(parse_s7_write_request);
- RUN_TEST(parse_s7_write_response);
+ // Execute the auto-generated serializer/parser tests.
+ parser_serializer_test_s7_read_write();
// Run the address parser tests ...
// TODO: Commented out as it seems to only fail while doing releases :-/
diff --git a/plc4c/examples/CMakeLists.txt b/plc4c/examples/CMakeLists.txt
index d1138de..160ba00 100644
--- a/plc4c/examples/CMakeLists.txt
+++ b/plc4c/examples/CMakeLists.txt
@@ -19,4 +19,5 @@
add_subdirectory(hello-subscriptions)
add_subdirectory(hello-world-modbus)
+add_subdirectory(hello-world-plc4x)
add_subdirectory(hello-world-s7)
diff --git a/plc4c/examples/CMakeLists.txt b/plc4c/examples/hello-world-plc4x/CMakeLists.txt
similarity index 57%
copy from plc4c/examples/CMakeLists.txt
copy to plc4c/examples/hello-world-plc4x/CMakeLists.txt
index d1138de..de7f0b2 100644
--- a/plc4c/examples/CMakeLists.txt
+++ b/plc4c/examples/hello-world-plc4x/CMakeLists.txt
@@ -17,6 +17,27 @@
under the License.
]]
-add_subdirectory(hello-subscriptions)
-add_subdirectory(hello-world-modbus)
-add_subdirectory(hello-world-s7)
+include_directories("../../api/include"
+ "../../spi/include"
+ "../../drivers/plc4x/include"
+ "../../transports/tcp/include" )
+
+add_executable(plc4c-examples-loopback-plc4x
+ src/hello_world_plc4x_loopback.c
+ )
+
+IF (NOT WIN32)
+ target_link_libraries(plc4c-examples-loopback-plc4x
+ plc4c-spi
+ plc4c-driver-plc4x
+ plc4c-transport-tcp
+ m
+ )
+ELSE()
+ target_link_libraries(plc4c-examples-loopback-plc4x
+ plc4c-spi
+ plc4c-driver-plc4x
+ plc4c-transport-tcp
+ )
+ENDIF()
+
diff --git a/plc4c/examples/hello-world-plc4x/src/hello_world_plc4x_loopback.c b/plc4c/examples/hello-world-plc4x/src/hello_world_plc4x_loopback.c
new file mode 100644
index 0000000..1740f6d
--- /dev/null
+++ b/plc4c/examples/hello-world-plc4x/src/hello_world_plc4x_loopback.c
@@ -0,0 +1,349 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#define _GNU_SOURCE
+/*#ifndef CLOCK_MONOTONIC
+#define CLOCK_MONOTONIC 1
+#endif*/
+
+
+#include <plc4c/driver_plc4x.h>
+#include <plc4c/plc4c.h>
+#include <plc4c/transport_tcp.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "../../../spi/include/plc4c/spi/types_private.h"
+
+#define DEFAULT_CONNECTION_TEST_STRING "plc4c:tcp://127.0.0.1:59837"
+#define TEST_DOUBLE_INT
+int numOpenConnections = 0;
+
+#ifndef _WIN32
+ #include <unistd.h>
+ #include <time.h>
+ #define PLC4X_LOOPBACK_TIME_IO
+#endif
+
+/**
+ * Here we could implement something that keeps track of all open connections.
+ * For example on embedded devices using the W5100 SPI Network device, this can
+ * only handle 4 simultaneous connections.
+ *
+ * @param connection the connection that was just established
+ */
+void onGlobalConnect(plc4c_connection *cur_connection) {
+ printf("Connected to %s",
+ plc4c_connection_get_connection_string(cur_connection));
+ numOpenConnections++;
+}
+
+void onGlobalDisconnect(plc4c_connection *cur_connection) {
+ printf("Disconnected from %s",
+ plc4c_connection_get_connection_string(cur_connection));
+ numOpenConnections--;
+}
+
+
+bool syncBoolLoop(plc4c_connection *conn,
+ bool (passCallback)(plc4c_connection* conn),
+ bool (failCallback)(plc4c_connection *conn) ) {
+
+ plc4c_system *system;
+ system = plc4c_connection_get_system(conn);
+ while (true) {
+ if (passCallback(conn))
+ return EXIT_SUCCESS;
+ else if (failCallback(conn))
+ return EXIT_FAILURE;
+ if (plc4c_system_loop(system) != OK)
+ return EXIT_FAILURE;
+ }
+}
+
+//#pragma clang diagnostic push
+//#pragma ide diagnostic ignored "hicpp-multiway-paths-covered"
+
+#define CHECK_RESULT(chk, ret, fs) do {if (chk) {printf(fs); return(ret);}} while(0)
+
+void get_user_loopback_values(int argc, char **argv, long *value) {
+ int count = 0;
+ while (count < argc)
+ value[count++] = atol(argv[count]);
+}
+
+int main(int argc, char** argv) {
+
+#ifdef PLC4X_LOOPBACK_TIME_IO
+ struct timespec start, finish;
+ long delta_us, diff_s, diff_ns;
+#endif
+
+ char* connection_test_string;
+ plc4c_return_code result;
+ bool errorFlag = false;
+ int idx = 0;
+ plc4c_system *system = NULL;
+ plc4c_connection *connection = NULL;
+
+ plc4c_read_request *read_request = NULL;
+ plc4c_read_request_execution *read_request_execution = NULL;
+ plc4c_read_response *read_response;
+
+ plc4c_write_request *write_request = NULL;
+ plc4c_write_request_execution *write_request_execution = NULL;
+ plc4c_write_response *write_response;
+
+ plc4c_list_element *cur_element;
+ plc4c_response_value_item *value_item;
+
+ long loopback_value[7] = {0,0,0,0,0};
+ plc4c_data *loopback_data;
+
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bool doRead = 1;
+ bool doWrite = 1;
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ // Connection string argument and do_write test arg (defaults to off as
+ // not currently working)
+ connection_test_string = DEFAULT_CONNECTION_TEST_STRING;
+
+ // Initialisation and startup sequence
+ result = plc4c_system_create(&system);
+ CHECK_RESULT(result != OK, result, "plc4c_system_create failed\n");
+ plc4c_driver *plc4x_driver = plc4c_driver_plc4x_create();
+ result = plc4c_system_add_driver(system, plc4x_driver);
+ CHECK_RESULT(result != OK, result, "plc4c_system_add_driver failed\n");
+ plc4c_transport *tcp_transport = plc4c_transport_tcp_create();
+ result = plc4c_system_add_transport(system, tcp_transport);
+ CHECK_RESULT(result != OK, result, "plc4c_system_add_transport failed\n");
+ result = plc4c_system_init(system);
+ CHECK_RESULT(result != OK, result, "plc4c_system_init failed\n");
+
+ // Register the global callbacks
+ plc4c_system_set_on_connect_success_callback(system, &onGlobalConnect);
+ plc4c_system_set_on_disconnect_success_callback(system, &onGlobalDisconnect);
+
+ // Establish connections to remote devices
+ result = plc4c_system_connect(system, connection_test_string, &connection);
+ CHECK_RESULT(result != OK, result, "plc4c_system_connect failed\n");
+
+ unsigned int loopTimes;
+ if (argc >= 2)
+ loopTimes = (unsigned int) atoi(argv[1]);
+ else
+ loopTimes = 1;
+
+ unsigned int loopCount = 0;
+ #define NREAD 3
+ float valuetowrite[NREAD] = {1.1 ,2.2, 3.3};//, 5.5};
+
+ #define ITEM_STR "%DB2:4.0:REAL[3]"
+
+ // Central program loop ...
+ syncBoolLoop(connection, plc4c_connection_get_connected, plc4c_connection_has_error);
+ bool rtMalloc = false;
+
+ while ( (!errorFlag) && (loopCount++ < loopTimes)) {
+ if (doWrite) {
+ { // Write request create scope
+ if (loopCount == 1 || rtMalloc) {
+ result = plc4c_connection_create_write_request(connection, &write_request);
+ CHECK_RESULT(result != OK, result,"plc4c_connection_create_write_request failed\n");
+ loopback_data = plc4c_data_create_float_array(valuetowrite,NREAD);
+ valuetowrite[(loopCount-1)%NREAD]++;
+ result = plc4c_write_request_add_item(write_request, ITEM_STR, loopback_data);
+ } else {
+ plc4c_data_update_values(loopback_data, valuetowrite);
+ valuetowrite[(loopCount-1)%NREAD]++;
+ //valuetowrite++;
+ }
+
+
+ #ifdef PLC4X_LOOPBACK_TIME_IO
+ clock_gettime(CLOCK_MONOTONIC,&start);
+ #endif
+
+ result = plc4c_write_request_execute(write_request, &write_request_execution);
+
+ CHECK_RESULT(result != OK, result,"plc4c_write_request_execute failed\n");
+
+ if (plc4c_system_loop(system) != OK) {
+ printf("ERROR in the system loop\n");
+ break;
+ }
+ }
+
+ { // Write request sent scope
+ while(1) {
+ if (plc4c_write_request_check_finished_successfully(write_request_execution)) {
+ break;
+ } else if (plc4c_write_request_execution_check_completed_with_error(write_request_execution)) {
+ printf("FAILED\n");
+ errorFlag = true;
+ break;
+ }
+ if (plc4c_system_loop(system) != OK) {
+ printf("ERROR in the system loop\n");
+ errorFlag = true;
+ break;
+ }
+ }
+ }
+
+ { // WRITE_RESPONSE_RECEIVED scope
+ write_response = plc4c_write_request_execution_get_response(write_request_execution);
+ CHECK_RESULT(write_response == NULL, -1,"plc4c_write_request_execution_get_response failed (no responce)\n");
+ cur_element = plc4c_utils_list_tail(write_response->response_items);
+ idx = 0;
+ while (cur_element != NULL) {
+ plc4c_response_item *checker = (plc4c_response_item*) cur_element->value;
+ printf("Write item %d status: '%s'\n", idx++,
+ plc4c_response_code_to_message(checker->response_code));
+ cur_element = cur_element->next;
+ }
+
+ #ifdef PLC4X_LOOPBACK_TIME_IO
+ clock_gettime(CLOCK_MONOTONIC,&finish);
+ diff_s = finish.tv_sec - start.tv_sec;
+ diff_ns = finish.tv_nsec - start.tv_nsec;
+ delta_us = (diff_s * 1000000L) + (diff_ns / 1000L);
+ printf("Write %ldus%c", delta_us, doRead ? '\t' : '\n');
+ #endif
+
+ if (rtMalloc)
+ plc4c_write_request_destroy(write_request);
+
+ plc4c_write_response_destroy(write_response);
+ plc4c_write_request_execution_destroy(write_request_execution);
+
+ if (plc4c_system_loop(system) != OK) {
+ printf("ERROR in the system loop\n");
+ break;
+ }
+ }
+ } // end of doWrite
+
+
+ if (doRead) {
+ { // READ_REQUEST_CREATE scope
+
+ result = plc4c_connection_create_read_request(connection, &read_request);
+ CHECK_RESULT(result != OK, result, "plc4c_connection_create_read_request failed\n");
+
+ result = plc4c_read_request_add_item(read_request, "A_REQUEST", ITEM_STR);
+ CHECK_RESULT(result != OK, result, "plc4c_read_request_add_item failed\n");
+
+ result = plc4c_read_request_execute(read_request, &read_request_execution);
+ CHECK_RESULT(result != OK, result, "plc4c_read_request_execute failed\n");
+
+ #ifdef PLC4X_LOOPBACK_TIME_IO
+ clock_gettime(CLOCK_MONOTONIC,&start);
+ #endif
+
+ if (plc4c_system_loop(system) != OK) {
+ printf("ERROR in the system loop\n");
+ break;
+ }
+ }
+
+
+ { // READ_REQUEST_SENT scope
+ while(true) {
+ if (plc4c_read_request_execution_check_finished_successfully(read_request_execution)) {
+ #ifdef PLC4X_LOOPBACK_TIME_IO
+ clock_gettime(CLOCK_MONOTONIC,&finish);
+ diff_s = finish.tv_sec - start.tv_sec;
+ diff_ns = finish.tv_nsec - start.tv_nsec;
+ delta_us = (diff_s * 1000000L) + (diff_ns / 1000L);
+ printf("Read %ldus\n", delta_us);
+ #endif
+ break;
+ } else if (plc4c_read_request_execution_check_finished_with_error(read_request_execution)) {
+ printf("plc4c_read_request_execution_check_finished_with_error FAILED\n");
+ errorFlag= true;
+ break;
+ }
+ if (plc4c_system_loop(system) != OK) {
+ printf("ERROR in the system loop\n");
+ errorFlag = true;
+ break;
+ }
+ }
+ }
+
+
+ { // READ_RESPONSE_RECEIVED scope
+
+ read_response = plc4c_read_request_execution_get_response(read_request_execution);
+ CHECK_RESULT(read_response == NULL, -1, "plc4c_read_request_execution_get_response failed (No Response)\n");
+
+ // Iterate over all returned items.
+ cur_element = plc4c_utils_list_tail(read_response->items);
+ while (cur_element != NULL) {
+ value_item = cur_element->value;
+ printf("Value %s (%s): ", value_item->item->name,
+ plc4c_response_code_to_message(value_item->response_code));
+ plc4c_data_printf(value_item->value);
+ printf("\n");
+ cur_element = cur_element->next;
+ }
+
+ plc4c_read_response_destroy(read_response);
+ plc4c_read_request_execution_destroy(read_request_execution);
+ plc4c_read_request_destroy(read_request);
+
+ if (plc4c_system_loop(system) != OK) {
+ printf("ERROR in the system loop\n");
+ errorFlag = true;
+ break;
+ }
+ }
+ } // end of do read
+ }
+
+ if (!rtMalloc && doWrite)
+ plc4c_write_request_destroy(write_request);
+
+ // Start disconnecting, break on error or dis-connection
+ result = plc4c_connection_disconnect(connection);
+ CHECK_RESULT(result != OK, -1,"plc4c_connection_disconnect failed\n");
+
+ while (true) {
+ if (plc4c_system_loop(system) != OK) {
+ printf("ERROR in the system loop\n");
+ return EXIT_FAILURE;
+ } else if (!plc4c_connection_get_connected(connection)) {
+ plc4c_system_remove_connection(system, connection);
+ plc4c_connection_destroy(connection);
+ break;
+ }
+ }
+
+ // Make sure everything is cleaned up correctly then destroy the
+ // plc4c_system, freeing up all memory allocated by plc4
+ plc4c_system_shutdown(system);
+ plc4c_system_destroy(system);
+ return 0;
+}
+
+//#pragma clang diagnostic pop
diff --git a/plc4c/generated-sources/modbus/include/data_item.h b/plc4c/generated-sources/modbus/include/data_item.h
index 87a5f69..3f38604 100644
--- a/plc4c/generated-sources/modbus/include/data_item.h
+++ b/plc4c/generated-sources/modbus/include/data_item.h
@@ -35,11 +35,11 @@ extern "C" {
plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_data_type dataType, uint16_t numberOfValues, plc4c_data** data_item);
-plc4c_return_code plc4c_modbus_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data** data_item);
+plc4c_return_code plc4c_modbus_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data* data_item);
-uint16_t plc4c_modbus_read_write_data_item_length_in_bytes(plc4c_data* data_item);
+uint16_t plc4c_modbus_read_write_data_item_length_in_bytes(plc4c_data* _value, plc4c_modbus_read_write_modbus_data_type dataType, uint16_t numberOfValues);
-uint16_t plc4c_modbus_read_write_data_item_length_in_bits(plc4c_data* data_item);
+uint16_t plc4c_modbus_read_write_data_item_length_in_bits(plc4c_data* _value, plc4c_modbus_read_write_modbus_data_type dataType, uint16_t numberOfValues);
#ifdef __cplusplus
}
diff --git a/plc4c/generated-sources/modbus/include/modbus_constants.h b/plc4c/generated-sources/modbus/include/modbus_constants.h
index eb40bb1..b8305e5 100644
--- a/plc4c/generated-sources/modbus/include/modbus_constants.h
+++ b/plc4c/generated-sources/modbus/include/modbus_constants.h
@@ -39,7 +39,6 @@ uint16_t PLC4C_MODBUS_READ_WRITE_MODBUS_CONSTANTS_MODBUS_TCP_DEFAULT_PORT();
struct plc4c_modbus_read_write_modbus_constants {
/* Properties */
- uint16_t modbus_tcp_default_port;
};
typedef struct plc4c_modbus_read_write_modbus_constants plc4c_modbus_read_write_modbus_constants;
diff --git a/plc4c/generated-sources/modbus/include/modbus_data_type.h b/plc4c/generated-sources/modbus/include/modbus_data_type.h
index 163de64..d35bfaa 100644
--- a/plc4c/generated-sources/modbus/include/modbus_data_type.h
+++ b/plc4c/generated-sources/modbus/include/modbus_data_type.h
@@ -67,10 +67,12 @@ typedef enum plc4c_modbus_read_write_modbus_data_type plc4c_modbus_read_write_mo
// Get an empty NULL-struct
plc4c_modbus_read_write_modbus_data_type plc4c_modbus_read_write_modbus_data_type_null();
-plc4c_return_code plc4c_modbus_read_write_modbus_data_type_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_data_type** message);
+plc4c_return_code plc4c_modbus_read_write_modbus_data_type_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_data_type* message);
plc4c_return_code plc4c_modbus_read_write_modbus_data_type_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_modbus_read_write_modbus_data_type* message);
+plc4c_modbus_read_write_modbus_data_type plc4c_modbus_read_write_modbus_data_type_for_value(uint8_t value);
+
plc4c_modbus_read_write_modbus_data_type plc4c_modbus_read_write_modbus_data_type_value_of(char* value_string);
int plc4c_modbus_read_write_modbus_data_type_num_values();
diff --git a/plc4c/generated-sources/modbus/include/modbus_error_code.h b/plc4c/generated-sources/modbus/include/modbus_error_code.h
index f217b86..80e03e0 100644
--- a/plc4c/generated-sources/modbus/include/modbus_error_code.h
+++ b/plc4c/generated-sources/modbus/include/modbus_error_code.h
@@ -50,10 +50,12 @@ typedef enum plc4c_modbus_read_write_modbus_error_code plc4c_modbus_read_write_m
// Get an empty NULL-struct
plc4c_modbus_read_write_modbus_error_code plc4c_modbus_read_write_modbus_error_code_null();
-plc4c_return_code plc4c_modbus_read_write_modbus_error_code_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_error_code** message);
+plc4c_return_code plc4c_modbus_read_write_modbus_error_code_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_error_code* message);
plc4c_return_code plc4c_modbus_read_write_modbus_error_code_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_modbus_read_write_modbus_error_code* message);
+plc4c_modbus_read_write_modbus_error_code plc4c_modbus_read_write_modbus_error_code_for_value(uint8_t value);
+
plc4c_modbus_read_write_modbus_error_code plc4c_modbus_read_write_modbus_error_code_value_of(char* value_string);
int plc4c_modbus_read_write_modbus_error_code_num_values();
diff --git a/plc4c/generated-sources/modbus/include/modbus_tcp_adu.h b/plc4c/generated-sources/modbus/include/modbus_tcp_adu.h
index 63da893..f4786f3 100644
--- a/plc4c/generated-sources/modbus/include/modbus_tcp_adu.h
+++ b/plc4c/generated-sources/modbus/include/modbus_tcp_adu.h
@@ -41,7 +41,6 @@ uint16_t PLC4C_MODBUS_READ_WRITE_MODBUS_TCP_ADU_PROTOCOL_IDENTIFIER();
struct plc4c_modbus_read_write_modbus_tcp_adu {
/* Properties */
uint16_t transaction_identifier;
- uint16_t protocol_identifier;
uint8_t unit_identifier;
plc4c_modbus_read_write_modbus_pdu* pdu;
};
diff --git a/plc4c/generated-sources/modbus/src/data_item.c b/plc4c/generated-sources/modbus/src/data_item.c
index 3d6cba2..d212a00 100644
--- a/plc4c/generated-sources/modbus/src/data_item.c
+++ b/plc4c/generated-sources/modbus/src/data_item.c
@@ -27,7 +27,6 @@
#include "data_item.h"
// Code generated by code-generation. DO NOT EDIT.
-
// Parse function.
plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_data_type dataType, uint16_t numberOfValues, plc4c_data** data_item) {
uint16_t startPos = plc4c_spi_read_get_pos(readBuffer);
@@ -55,7 +54,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_bool_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_BOOL) { /* List */
@@ -201,7 +199,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_int8_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_SINT) { /* List */
@@ -231,7 +228,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_int16_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_INT) { /* List */
@@ -261,7 +257,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_int32_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_DINT) { /* List */
@@ -291,7 +286,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_int64_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_LINT) { /* List */
@@ -321,7 +315,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_uint8_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_USINT) { /* List */
@@ -351,7 +344,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_uint16_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_UINT) { /* List */
@@ -381,7 +373,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_uint32_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_UDINT) { /* List */
@@ -411,7 +402,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_uint64_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_ULINT) { /* List */
@@ -441,7 +431,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_float_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_REAL) { /* List */
@@ -471,7 +460,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_double_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_LREAL) { /* List */
@@ -501,7 +489,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_uint8_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_CHAR) { /* List */
@@ -531,7 +518,6 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return _res;
}
- // Hurz
*data_item = plc4c_data_create_uint16_t_data(value);
} else if(dataType == plc4c_modbus_read_write_modbus_data_type_WCHAR) { /* List */
@@ -557,19 +543,267 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
return OK;
}
-plc4c_return_code plc4c_modbus_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data** data_item) {
+plc4c_return_code plc4c_modbus_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data* data_item) {
plc4c_return_code _res = OK;
- return OK;
+ if((dataType == plc4c_modbus_read_write_modbus_data_type_BOOL) && (numberOfValues == 1)) { /* BOOL */
+
+ // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+ lengthInBits += 7;
+
+ // Simple Field (value)
+ lengthInBits += 1;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_BOOL) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) && (numberOfValues == 1)) { /* BitString */
+
+ // Simple Field (value)
+ lengthInBits += 8;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_WORD) && (numberOfValues == 1)) { /* BitString */
+
+ // Simple Field (value)
+ lengthInBits += 16;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_WORD) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) && (numberOfValues == 1)) { /* BitString */
+
+ // Simple Field (value)
+ lengthInBits += 32;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) && (numberOfValues == 1)) { /* BitString */
+
+ // Simple Field (value)
+ lengthInBits += 64;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_SINT) && (numberOfValues == 1)) { /* SINT */
+
+ // Simple Field (value)
+ lengthInBits += 8;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_SINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_INT) && (numberOfValues == 1)) { /* INT */
+
+ // Simple Field (value)
+ lengthInBits += 16;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_INT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_DINT) && (numberOfValues == 1)) { /* DINT */
+
+ // Simple Field (value)
+ lengthInBits += 32;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_DINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_LINT) && (numberOfValues == 1)) { /* LINT */
+
+ // Simple Field (value)
+ lengthInBits += 64;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_LINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_USINT) && (numberOfValues == 1)) { /* USINT */
+
+ // Simple Field (value)
+ lengthInBits += 8;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_USINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_UINT) && (numberOfValues == 1)) { /* UINT */
+
+ // Simple Field (value)
+ lengthInBits += 16;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_UINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_UDINT) && (numberOfValues == 1)) { /* UDINT */
+
+ // Simple Field (value)
+ lengthInBits += 32;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_UDINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_ULINT) && (numberOfValues == 1)) { /* ULINT */
+
+ // Simple Field (value)
+ lengthInBits += 64;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_ULINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_REAL) && (numberOfValues == 1)) { /* REAL */
+
+ // Simple Field (value)
+ lengthInBits += 32;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_REAL) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_LREAL) && (numberOfValues == 1)) { /* LREAL */
+
+ // Simple Field (value)
+ lengthInBits += 64;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_LREAL) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_CHAR) && (numberOfValues == 1)) { /* CHAR */
+
+ // Simple Field (value)
+ lengthInBits += 8;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_CHAR) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_WCHAR) && (numberOfValues == 1)) { /* WCHAR */
+
+ // Simple Field (value)
+ lengthInBits += 16;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_WCHAR) { /* List */
+
+ // Array Field (value)
+ }
+
+ return OK;
}
-uint16_t plc4c_modbus_read_write_data_item_length_in_bytes(plc4c_data* data_item) {
- return plc4c_modbus_read_write_data_item_length_in_bits(data_item) / 8;
+uint16_t plc4c_modbus_read_write_data_item_length_in_bytes(plc4c_data* _value, plc4c_modbus_read_write_modbus_data_type dataType, uint16_t numberOfValues) {
+ return plc4c_modbus_read_write_data_item_length_in_bits(_value, dataType, numberOfValues) / 8;
}
-uint16_t plc4c_modbus_read_write_data_item_length_in_bits(plc4c_data* data_item) {
+uint16_t plc4c_modbus_read_write_data_item_length_in_bits(plc4c_data* _value, plc4c_modbus_read_write_modbus_data_type dataType, uint16_t numberOfValues) {
uint16_t lengthInBits = 0;
+ if((dataType == plc4c_modbus_read_write_modbus_data_type_BOOL) && (numberOfValues == 1)) { /* BOOL */
+
+ // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+ lengthInBits += 7;
+
+ // Simple Field (value)
+ lengthInBits += 1;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_BOOL) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) && (numberOfValues == 1)) { /* BitString */
+
+ // Simple Field (value)
+ lengthInBits += 8;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_WORD) && (numberOfValues == 1)) { /* BitString */
+
+ // Simple Field (value)
+ lengthInBits += 16;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_WORD) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) && (numberOfValues == 1)) { /* BitString */
+
+ // Simple Field (value)
+ lengthInBits += 32;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) && (numberOfValues == 1)) { /* BitString */
+
+ // Simple Field (value)
+ lengthInBits += 64;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_SINT) && (numberOfValues == 1)) { /* SINT */
+
+ // Simple Field (value)
+ lengthInBits += 8;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_SINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_INT) && (numberOfValues == 1)) { /* INT */
+
+ // Simple Field (value)
+ lengthInBits += 16;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_INT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_DINT) && (numberOfValues == 1)) { /* DINT */
+
+ // Simple Field (value)
+ lengthInBits += 32;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_DINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_LINT) && (numberOfValues == 1)) { /* LINT */
+
+ // Simple Field (value)
+ lengthInBits += 64;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_LINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_USINT) && (numberOfValues == 1)) { /* USINT */
+
+ // Simple Field (value)
+ lengthInBits += 8;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_USINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_UINT) && (numberOfValues == 1)) { /* UINT */
+
+ // Simple Field (value)
+ lengthInBits += 16;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_UINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_UDINT) && (numberOfValues == 1)) { /* UDINT */
+
+ // Simple Field (value)
+ lengthInBits += 32;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_UDINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_ULINT) && (numberOfValues == 1)) { /* ULINT */
+
+ // Simple Field (value)
+ lengthInBits += 64;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_ULINT) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_REAL) && (numberOfValues == 1)) { /* REAL */
+
+ // Simple Field (value)
+ lengthInBits += 32;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_REAL) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_LREAL) && (numberOfValues == 1)) { /* LREAL */
+
+ // Simple Field (value)
+ lengthInBits += 64;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_LREAL) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_CHAR) && (numberOfValues == 1)) { /* CHAR */
+
+ // Simple Field (value)
+ lengthInBits += 8;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_CHAR) { /* List */
+
+ // Array Field (value)
+ } else if((dataType == plc4c_modbus_read_write_modbus_data_type_WCHAR) && (numberOfValues == 1)) { /* WCHAR */
+
+ // Simple Field (value)
+ lengthInBits += 16;
+ } else if(dataType == plc4c_modbus_read_write_modbus_data_type_WCHAR) { /* List */
+
+ // Array Field (value)
+ }
+
return lengthInBits;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_constants.c b/plc4c/generated-sources/modbus/src/modbus_constants.c
index e7a7627..d6ef565 100644
--- a/plc4c/generated-sources/modbus/src/modbus_constants.c
+++ b/plc4c/generated-sources/modbus/src/modbus_constants.c
@@ -59,7 +59,8 @@ plc4c_return_code plc4c_modbus_read_write_modbus_constants_serialize(plc4c_spi_w
plc4c_return_code _res = OK;
// Const Field (modbusTcpDefaultPort)
- plc4c_spi_write_unsigned_short(writeBuffer, 16, PLC4C_MODBUS_READ_WRITE_MODBUS_CONSTANTS_MODBUS_TCP_DEFAULT_PORT());
+ uint16_t modbusTcpDefaultPort = PLC4C_MODBUS_READ_WRITE_MODBUS_CONSTANTS_MODBUS_TCP_DEFAULT_PORT();
+ plc4c_spi_write_unsigned_short(writeBuffer, 16, modbusTcpDefaultPort);
return OK;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_data_type.c b/plc4c/generated-sources/modbus/src/modbus_data_type.c
index f364053..4a2d4f0 100644
--- a/plc4c/generated-sources/modbus/src/modbus_data_type.c
+++ b/plc4c/generated-sources/modbus/src/modbus_data_type.c
@@ -30,17 +30,133 @@ plc4c_modbus_read_write_modbus_data_type plc4c_modbus_read_write_modbus_data_typ
return plc4c_modbus_read_write_modbus_data_type_null_const;
}
-// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_data_type_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_data_type** _message) {
- plc4c_return_code _res = OK;
+uint8_t plc4c_modbus_read_write_modbus_data_type_get_value(plc4c_modbus_read_write_modbus_data_type value) {
+ switch(value) {
+ case plc4c_modbus_read_write_modbus_data_type_BOOL:
+ return (uint8_t) 1;
+ case plc4c_modbus_read_write_modbus_data_type_BYTE:
+ return (uint8_t) 2;
+ case plc4c_modbus_read_write_modbus_data_type_WORD:
+ return (uint8_t) 3;
+ case plc4c_modbus_read_write_modbus_data_type_DWORD:
+ return (uint8_t) 4;
+ case plc4c_modbus_read_write_modbus_data_type_LWORD:
+ return (uint8_t) 5;
+ case plc4c_modbus_read_write_modbus_data_type_SINT:
+ return (uint8_t) 6;
+ case plc4c_modbus_read_write_modbus_data_type_INT:
+ return (uint8_t) 7;
+ case plc4c_modbus_read_write_modbus_data_type_DINT:
+ return (uint8_t) 8;
+ case plc4c_modbus_read_write_modbus_data_type_LINT:
+ return (uint8_t) 9;
+ case plc4c_modbus_read_write_modbus_data_type_USINT:
+ return (uint8_t) 10;
+ case plc4c_modbus_read_write_modbus_data_type_UINT:
+ return (uint8_t) 11;
+ case plc4c_modbus_read_write_modbus_data_type_UDINT:
+ return (uint8_t) 12;
+ case plc4c_modbus_read_write_modbus_data_type_ULINT:
+ return (uint8_t) 13;
+ case plc4c_modbus_read_write_modbus_data_type_REAL:
+ return (uint8_t) 14;
+ case plc4c_modbus_read_write_modbus_data_type_LREAL:
+ return (uint8_t) 15;
+ case plc4c_modbus_read_write_modbus_data_type_TIME:
+ return (uint8_t) 16;
+ case plc4c_modbus_read_write_modbus_data_type_LTIME:
+ return (uint8_t) 17;
+ case plc4c_modbus_read_write_modbus_data_type_DATE:
+ return (uint8_t) 18;
+ case plc4c_modbus_read_write_modbus_data_type_LDATE:
+ return (uint8_t) 19;
+ case plc4c_modbus_read_write_modbus_data_type_TIME_OF_DAY:
+ return (uint8_t) 20;
+ case plc4c_modbus_read_write_modbus_data_type_LTIME_OF_DAY:
+ return (uint8_t) 21;
+ case plc4c_modbus_read_write_modbus_data_type_DATE_AND_TIME:
+ return (uint8_t) 22;
+ case plc4c_modbus_read_write_modbus_data_type_LDATE_AND_TIME:
+ return (uint8_t) 23;
+ case plc4c_modbus_read_write_modbus_data_type_CHAR:
+ return (uint8_t) 24;
+ case plc4c_modbus_read_write_modbus_data_type_WCHAR:
+ return (uint8_t) 25;
+ case plc4c_modbus_read_write_modbus_data_type_STRING:
+ return (uint8_t) 26;
+ case plc4c_modbus_read_write_modbus_data_type_WSTRING:
+ return (uint8_t) 27;
+ }
+ return 0;
+}
- // Allocate enough memory to contain this data structure.
- (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_data_type));
- if(*_message == NULL) {
- return NO_MEMORY;
- }
+plc4c_modbus_read_write_modbus_data_type plc4c_modbus_read_write_modbus_data_type_for_value(uint8_t value) {
+ switch(value) {
+ case (uint8_t) 1:
+ return plc4c_modbus_read_write_modbus_data_type_BOOL;
+ case (uint8_t) 2:
+ return plc4c_modbus_read_write_modbus_data_type_BYTE;
+ case (uint8_t) 3:
+ return plc4c_modbus_read_write_modbus_data_type_WORD;
+ case (uint8_t) 4:
+ return plc4c_modbus_read_write_modbus_data_type_DWORD;
+ case (uint8_t) 5:
+ return plc4c_modbus_read_write_modbus_data_type_LWORD;
+ case (uint8_t) 6:
+ return plc4c_modbus_read_write_modbus_data_type_SINT;
+ case (uint8_t) 7:
+ return plc4c_modbus_read_write_modbus_data_type_INT;
+ case (uint8_t) 8:
+ return plc4c_modbus_read_write_modbus_data_type_DINT;
+ case (uint8_t) 9:
+ return plc4c_modbus_read_write_modbus_data_type_LINT;
+ case (uint8_t) 10:
+ return plc4c_modbus_read_write_modbus_data_type_USINT;
+ case (uint8_t) 11:
+ return plc4c_modbus_read_write_modbus_data_type_UINT;
+ case (uint8_t) 12:
+ return plc4c_modbus_read_write_modbus_data_type_UDINT;
+ case (uint8_t) 13:
+ return plc4c_modbus_read_write_modbus_data_type_ULINT;
+ case (uint8_t) 14:
+ return plc4c_modbus_read_write_modbus_data_type_REAL;
+ case (uint8_t) 15:
+ return plc4c_modbus_read_write_modbus_data_type_LREAL;
+ case (uint8_t) 16:
+ return plc4c_modbus_read_write_modbus_data_type_TIME;
+ case (uint8_t) 17:
+ return plc4c_modbus_read_write_modbus_data_type_LTIME;
+ case (uint8_t) 18:
+ return plc4c_modbus_read_write_modbus_data_type_DATE;
+ case (uint8_t) 19:
+ return plc4c_modbus_read_write_modbus_data_type_LDATE;
+ case (uint8_t) 20:
+ return plc4c_modbus_read_write_modbus_data_type_TIME_OF_DAY;
+ case (uint8_t) 21:
+ return plc4c_modbus_read_write_modbus_data_type_LTIME_OF_DAY;
+ case (uint8_t) 22:
+ return plc4c_modbus_read_write_modbus_data_type_DATE_AND_TIME;
+ case (uint8_t) 23:
+ return plc4c_modbus_read_write_modbus_data_type_LDATE_AND_TIME;
+ case (uint8_t) 24:
+ return plc4c_modbus_read_write_modbus_data_type_CHAR;
+ case (uint8_t) 25:
+ return plc4c_modbus_read_write_modbus_data_type_WCHAR;
+ case (uint8_t) 26:
+ return plc4c_modbus_read_write_modbus_data_type_STRING;
+ case (uint8_t) 27:
+ return plc4c_modbus_read_write_modbus_data_type_WSTRING;
+ }
+ return 0;
+}
+
+ // Parse function.
+plc4c_return_code plc4c_modbus_read_write_modbus_data_type_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_data_type* _message) {
+ plc4c_return_code _res = OK;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) *_message);
+ uint8_t value;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &value);
+ *_message = plc4c_modbus_read_write_modbus_data_type_for_value(value);
return _res;
}
@@ -48,7 +164,8 @@ plc4c_return_code plc4c_modbus_read_write_modbus_data_type_parse(plc4c_spi_read_
plc4c_return_code plc4c_modbus_read_write_modbus_data_type_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_modbus_read_write_modbus_data_type* _message) {
plc4c_return_code _res = OK;
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, *_message);
+ uint8_t value = plc4c_modbus_read_write_modbus_data_type_get_value(*_message);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, value);
return _res;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_error_code.c b/plc4c/generated-sources/modbus/src/modbus_error_code.c
index 7bfd0bb..8d39fc2 100644
--- a/plc4c/generated-sources/modbus/src/modbus_error_code.c
+++ b/plc4c/generated-sources/modbus/src/modbus_error_code.c
@@ -30,17 +30,65 @@ plc4c_modbus_read_write_modbus_error_code plc4c_modbus_read_write_modbus_error_c
return plc4c_modbus_read_write_modbus_error_code_null_const;
}
-// Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_error_code_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_error_code** _message) {
- plc4c_return_code _res = OK;
+uint8_t plc4c_modbus_read_write_modbus_error_code_get_value(plc4c_modbus_read_write_modbus_error_code value) {
+ switch(value) {
+ case plc4c_modbus_read_write_modbus_error_code_ILLEGAL_FUNCTION:
+ return (uint8_t) 1;
+ case plc4c_modbus_read_write_modbus_error_code_ILLEGAL_DATA_ADDRESS:
+ return (uint8_t) 2;
+ case plc4c_modbus_read_write_modbus_error_code_ILLEGAL_DATA_VALUE:
+ return (uint8_t) 3;
+ case plc4c_modbus_read_write_modbus_error_code_SLAVE_DEVICE_FAILURE:
+ return (uint8_t) 4;
+ case plc4c_modbus_read_write_modbus_error_code_ACKNOWLEDGE:
+ return (uint8_t) 5;
+ case plc4c_modbus_read_write_modbus_error_code_SLAVE_DEVICE_BUSY:
+ return (uint8_t) 6;
+ case plc4c_modbus_read_write_modbus_error_code_NEGATIVE_ACKNOWLEDGE:
+ return (uint8_t) 7;
+ case plc4c_modbus_read_write_modbus_error_code_MEMORY_PARITY_ERROR:
+ return (uint8_t) 8;
+ case plc4c_modbus_read_write_modbus_error_code_GATEWAY_PATH_UNAVAILABLE:
+ return (uint8_t) 10;
+ case plc4c_modbus_read_write_modbus_error_code_GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND:
+ return (uint8_t) 11;
+ }
+ return 0;
+}
- // Allocate enough memory to contain this data structure.
- (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_error_code));
- if(*_message == NULL) {
- return NO_MEMORY;
+plc4c_modbus_read_write_modbus_error_code plc4c_modbus_read_write_modbus_error_code_for_value(uint8_t value) {
+ switch(value) {
+ case (uint8_t) 1:
+ return plc4c_modbus_read_write_modbus_error_code_ILLEGAL_FUNCTION;
+ case (uint8_t) 2:
+ return plc4c_modbus_read_write_modbus_error_code_ILLEGAL_DATA_ADDRESS;
+ case (uint8_t) 3:
+ return plc4c_modbus_read_write_modbus_error_code_ILLEGAL_DATA_VALUE;
+ case (uint8_t) 4:
+ return plc4c_modbus_read_write_modbus_error_code_SLAVE_DEVICE_FAILURE;
+ case (uint8_t) 5:
+ return plc4c_modbus_read_write_modbus_error_code_ACKNOWLEDGE;
+ case (uint8_t) 6:
+ return plc4c_modbus_read_write_modbus_error_code_SLAVE_DEVICE_BUSY;
+ case (uint8_t) 7:
+ return plc4c_modbus_read_write_modbus_error_code_NEGATIVE_ACKNOWLEDGE;
+ case (uint8_t) 8:
+ return plc4c_modbus_read_write_modbus_error_code_MEMORY_PARITY_ERROR;
+ case (uint8_t) 10:
+ return plc4c_modbus_read_write_modbus_error_code_GATEWAY_PATH_UNAVAILABLE;
+ case (uint8_t) 11:
+ return plc4c_modbus_read_write_modbus_error_code_GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND;
}
+ return 0;
+}
+
+ // Parse function.
+plc4c_return_code plc4c_modbus_read_write_modbus_error_code_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_error_code* _message) {
+ plc4c_return_code _res = OK;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) *_message);
+ uint8_t value;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &value);
+ *_message = plc4c_modbus_read_write_modbus_error_code_for_value(value);
return _res;
}
@@ -48,7 +96,8 @@ plc4c_return_code plc4c_modbus_read_write_modbus_error_code_parse(plc4c_spi_read
plc4c_return_code plc4c_modbus_read_write_modbus_error_code_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_modbus_read_write_modbus_error_code* _message) {
plc4c_return_code _res = OK;
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, *_message);
+ uint8_t value = plc4c_modbus_read_write_modbus_error_code_get_value(*_message);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, value);
return _res;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu.c b/plc4c/generated-sources/modbus/src/modbus_pdu.c
index ed5691a..a31aab5 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu.c
@@ -149,1037 +149,960 @@ 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(errorFlag == true) { /* ModbusPDUError */
+if( errorFlag == true ) { /* ModbusPDUError */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_error;
-
- // Simple Field (exceptionCode)
- plc4c_modbus_read_write_modbus_error_code* exceptionCode;
- _res = plc4c_modbus_read_write_modbus_error_code_parse(readBuffer, (void*) &exceptionCode);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_error_exception_code = *exceptionCode;
+ // Simple Field (exceptionCode)
+ plc4c_modbus_read_write_modbus_error_code exceptionCode;
+ _res = plc4c_modbus_read_write_modbus_error_code_parse(readBuffer, (void*) &exceptionCode);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_error_exception_code = exceptionCode;
} else
- if((errorFlag == false) && (functionFlag == 0x02) && (response == false)) { /* ModbusPDUReadDiscreteInputsRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x02 ) && ( response == false ) ) { /* ModbusPDUReadDiscreteInputsRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_discrete_inputs_request;
-
- // Simple Field (startingAddress)
- uint16_t startingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_discrete_inputs_request_starting_address = startingAddress;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_discrete_inputs_request_starting_address = startingAddress;
-
- // Simple Field (quantity)
- uint16_t quantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_discrete_inputs_request_quantity = quantity;
+ // Simple Field (quantity)
+ uint16_t quantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_discrete_inputs_request_quantity = quantity;
} else
- if((errorFlag == false) && (functionFlag == 0x02) && (response == true)) { /* ModbusPDUReadDiscreteInputsResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x02 ) && ( response == true ) ) { /* ModbusPDUReadDiscreteInputsResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_discrete_inputs_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (value)
- plc4c_list* value = NULL;
- plc4c_utils_list_create(&value);
- if(value == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) byteCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(value, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (value)
+ plc4c_list* value = NULL;
+ plc4c_utils_list_create(&value);
+ if(value == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(value, _value);
}
- (*_message)->modbus_pdu_read_discrete_inputs_response_value = value;
-
+ }
+ (*_message)->modbus_pdu_read_discrete_inputs_response_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x01) && (response == false)) { /* ModbusPDUReadCoilsRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x01 ) && ( response == false ) ) { /* ModbusPDUReadCoilsRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_coils_request;
-
- // Simple Field (startingAddress)
- uint16_t startingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_coils_request_starting_address = startingAddress;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_coils_request_starting_address = startingAddress;
-
- // Simple Field (quantity)
- uint16_t quantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_coils_request_quantity = quantity;
+ // Simple Field (quantity)
+ uint16_t quantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_coils_request_quantity = quantity;
} else
- if((errorFlag == false) && (functionFlag == 0x01) && (response == true)) { /* ModbusPDUReadCoilsResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x01 ) && ( response == true ) ) { /* ModbusPDUReadCoilsResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_coils_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (value)
- plc4c_list* value = NULL;
- plc4c_utils_list_create(&value);
- if(value == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) byteCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(value, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (value)
+ plc4c_list* value = NULL;
+ plc4c_utils_list_create(&value);
+ if(value == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(value, _value);
}
- (*_message)->modbus_pdu_read_coils_response_value = value;
-
+ }
+ (*_message)->modbus_pdu_read_coils_response_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x05) && (response == false)) { /* ModbusPDUWriteSingleCoilRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x05 ) && ( response == false ) ) { /* ModbusPDUWriteSingleCoilRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_coil_request;
-
- // Simple Field (address)
- uint16_t address = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &address);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_single_coil_request_address = address;
+ // Simple Field (address)
+ uint16_t address = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &address);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_single_coil_request_address = address;
-
- // Simple Field (value)
- uint16_t value = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_single_coil_request_value = value;
+ // Simple Field (value)
+ uint16_t value = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_single_coil_request_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x05) && (response == true)) { /* ModbusPDUWriteSingleCoilResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x05 ) && ( response == true ) ) { /* ModbusPDUWriteSingleCoilResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_coil_response;
-
- // Simple Field (address)
- uint16_t address = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &address);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_single_coil_response_address = address;
+ // Simple Field (address)
+ uint16_t address = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &address);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_single_coil_response_address = address;
-
- // Simple Field (value)
- uint16_t value = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_single_coil_response_value = value;
+ // Simple Field (value)
+ uint16_t value = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_single_coil_response_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x0F) && (response == false)) { /* ModbusPDUWriteMultipleCoilsRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x0F ) && ( response == false ) ) { /* ModbusPDUWriteMultipleCoilsRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_coils_request;
-
- // Simple Field (startingAddress)
- uint16_t startingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_multiple_coils_request_starting_address = startingAddress;
-
-
-
- // Simple Field (quantity)
- uint16_t quantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_multiple_coils_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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (value)
- plc4c_list* value = NULL;
- plc4c_utils_list_create(&value);
- if(value == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) byteCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(value, _value);
+
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_multiple_coils_request_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_multiple_coils_request_quantity = quantity;
+
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (value)
+ plc4c_list* value = NULL;
+ plc4c_utils_list_create(&value);
+ if(value == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(value, _value);
}
- (*_message)->modbus_pdu_write_multiple_coils_request_value = value;
-
+ }
+ (*_message)->modbus_pdu_write_multiple_coils_request_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x0F) && (response == true)) { /* ModbusPDUWriteMultipleCoilsResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x0F ) && ( response == true ) ) { /* ModbusPDUWriteMultipleCoilsResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_coils_response;
-
- // Simple Field (startingAddress)
- uint16_t startingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_multiple_coils_response_starting_address = startingAddress;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_multiple_coils_response_starting_address = startingAddress;
-
- // Simple Field (quantity)
- uint16_t quantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_multiple_coils_response_quantity = quantity;
+ // Simple Field (quantity)
+ uint16_t quantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_multiple_coils_response_quantity = quantity;
} else
- if((errorFlag == false) && (functionFlag == 0x04) && (response == false)) { /* ModbusPDUReadInputRegistersRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x04 ) && ( response == false ) ) { /* ModbusPDUReadInputRegistersRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_input_registers_request;
-
- // Simple Field (startingAddress)
- uint16_t startingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_input_registers_request_starting_address = startingAddress;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_input_registers_request_starting_address = startingAddress;
-
- // Simple Field (quantity)
- uint16_t quantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_input_registers_request_quantity = quantity;
+ // Simple Field (quantity)
+ uint16_t quantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_input_registers_request_quantity = quantity;
} else
- if((errorFlag == false) && (functionFlag == 0x04) && (response == true)) { /* ModbusPDUReadInputRegistersResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x04 ) && ( response == true ) ) { /* ModbusPDUReadInputRegistersResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_input_registers_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (value)
- plc4c_list* value = NULL;
- plc4c_utils_list_create(&value);
- if(value == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) byteCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(value, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (value)
+ plc4c_list* value = NULL;
+ plc4c_utils_list_create(&value);
+ if(value == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(value, _value);
}
- (*_message)->modbus_pdu_read_input_registers_response_value = value;
-
+ }
+ (*_message)->modbus_pdu_read_input_registers_response_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x03) && (response == false)) { /* ModbusPDUReadHoldingRegistersRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x03 ) && ( response == false ) ) { /* ModbusPDUReadHoldingRegistersRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_holding_registers_request;
-
- // Simple Field (startingAddress)
- uint16_t startingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_holding_registers_request_starting_address = startingAddress;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_holding_registers_request_starting_address = startingAddress;
-
- // Simple Field (quantity)
- uint16_t quantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_holding_registers_request_quantity = quantity;
+ // Simple Field (quantity)
+ uint16_t quantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_holding_registers_request_quantity = quantity;
} else
- if((errorFlag == false) && (functionFlag == 0x03) && (response == true)) { /* ModbusPDUReadHoldingRegistersResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x03 ) && ( response == true ) ) { /* ModbusPDUReadHoldingRegistersResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_holding_registers_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (value)
- plc4c_list* value = NULL;
- plc4c_utils_list_create(&value);
- if(value == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) byteCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(value, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (value)
+ plc4c_list* value = NULL;
+ plc4c_utils_list_create(&value);
+ if(value == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(value, _value);
}
- (*_message)->modbus_pdu_read_holding_registers_response_value = value;
-
+ }
+ (*_message)->modbus_pdu_read_holding_registers_response_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x06) && (response == false)) { /* ModbusPDUWriteSingleRegisterRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x06 ) && ( response == false ) ) { /* ModbusPDUWriteSingleRegisterRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_register_request;
-
- // Simple Field (address)
- uint16_t address = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &address);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_single_register_request_address = address;
+ // Simple Field (address)
+ uint16_t address = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &address);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_single_register_request_address = address;
-
- // Simple Field (value)
- uint16_t value = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_single_register_request_value = value;
+ // Simple Field (value)
+ uint16_t value = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_single_register_request_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x06) && (response == true)) { /* ModbusPDUWriteSingleRegisterResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x06 ) && ( response == true ) ) { /* ModbusPDUWriteSingleRegisterResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_register_response;
-
- // Simple Field (address)
- uint16_t address = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &address);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_single_register_response_address = address;
+ // Simple Field (address)
+ uint16_t address = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &address);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_single_register_response_address = address;
-
- // Simple Field (value)
- uint16_t value = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_single_register_response_value = value;
+ // Simple Field (value)
+ uint16_t value = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_single_register_response_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x10) && (response == false)) { /* ModbusPDUWriteMultipleHoldingRegistersRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x10 ) && ( response == false ) ) { /* ModbusPDUWriteMultipleHoldingRegistersRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_holding_registers_request;
-
- // Simple Field (startingAddress)
- uint16_t startingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_multiple_holding_registers_request_starting_address = startingAddress;
-
-
-
- // Simple Field (quantity)
- uint16_t quantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
- if(_res != OK) {
- return _res;
- }
- (*_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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (value)
- plc4c_list* value = NULL;
- plc4c_utils_list_create(&value);
- if(value == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) byteCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(value, _value);
+
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_multiple_holding_registers_request_starting_address = startingAddress;
+
+
+ // Simple Field (quantity)
+ uint16_t quantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_multiple_holding_registers_request_quantity = quantity;
+
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (value)
+ plc4c_list* value = NULL;
+ plc4c_utils_list_create(&value);
+ if(value == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(value, _value);
}
- (*_message)->modbus_pdu_write_multiple_holding_registers_request_value = value;
-
+ }
+ (*_message)->modbus_pdu_write_multiple_holding_registers_request_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x10) && (response == true)) { /* ModbusPDUWriteMultipleHoldingRegistersResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x10 ) && ( response == true ) ) { /* ModbusPDUWriteMultipleHoldingRegistersResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_holding_registers_response;
-
- // Simple Field (startingAddress)
- uint16_t startingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_multiple_holding_registers_response_starting_address = startingAddress;
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_multiple_holding_registers_response_starting_address = startingAddress;
-
- // Simple Field (quantity)
- uint16_t quantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_write_multiple_holding_registers_response_quantity = quantity;
+ // Simple Field (quantity)
+ uint16_t quantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &quantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_write_multiple_holding_registers_response_quantity = quantity;
} else
- if((errorFlag == false) && (functionFlag == 0x17) && (response == false)) { /* ModbusPDUReadWriteMultipleHoldingRegistersRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x17 ) && ( response == false ) ) { /* ModbusPDUReadWriteMultipleHoldingRegistersRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_write_multiple_holding_registers_request;
-
- // Simple Field (readStartingAddress)
- uint16_t readStartingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &readStartingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_read_starting_address = readStartingAddress;
+ // Simple Field (readStartingAddress)
+ uint16_t readStartingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &readStartingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_read_starting_address = readStartingAddress;
-
- // Simple Field (readQuantity)
- uint16_t readQuantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &readQuantity);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_read_quantity = readQuantity;
+ // Simple Field (readQuantity)
+ uint16_t readQuantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &readQuantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_read_quantity = readQuantity;
-
- // Simple Field (writeStartingAddress)
- uint16_t writeStartingAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &writeStartingAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_write_starting_address = writeStartingAddress;
+ // Simple Field (writeStartingAddress)
+ uint16_t writeStartingAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &writeStartingAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_write_starting_address = writeStartingAddress;
-
- // Simple Field (writeQuantity)
- uint16_t writeQuantity = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &writeQuantity);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_write_quantity = writeQuantity;
+
+ // Simple Field (writeQuantity)
+ uint16_t writeQuantity = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &writeQuantity);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
-
- // Array field (value)
- plc4c_list* value = NULL;
- plc4c_utils_list_create(&value);
- if(value == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) byteCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(value, _value);
+ // Array field (value)
+ plc4c_list* value = NULL;
+ plc4c_utils_list_create(&value);
+ if(value == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(value, _value);
}
- (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_value = value;
-
+ }
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x17) && (response == true)) { /* ModbusPDUReadWriteMultipleHoldingRegistersResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x17 ) && ( response == true ) ) { /* ModbusPDUReadWriteMultipleHoldingRegistersResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_write_multiple_holding_registers_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (value)
- plc4c_list* value = NULL;
- plc4c_utils_list_create(&value);
- if(value == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) byteCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(value, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (value)
+ plc4c_list* value = NULL;
+ plc4c_utils_list_create(&value);
+ if(value == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(value, _value);
}
- (*_message)->modbus_pdu_read_write_multiple_holding_registers_response_value = value;
-
+ }
+ (*_message)->modbus_pdu_read_write_multiple_holding_registers_response_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x16) && (response == false)) { /* ModbusPDUMaskWriteHoldingRegisterRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x16 ) && ( response == false ) ) { /* ModbusPDUMaskWriteHoldingRegisterRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_mask_write_holding_register_request;
-
- // Simple Field (referenceAddress)
- uint16_t referenceAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &referenceAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_mask_write_holding_register_request_reference_address = referenceAddress;
+ // Simple Field (referenceAddress)
+ uint16_t referenceAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &referenceAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_mask_write_holding_register_request_reference_address = referenceAddress;
-
- // Simple Field (andMask)
- uint16_t andMask = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &andMask);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_mask_write_holding_register_request_and_mask = andMask;
+ // Simple Field (andMask)
+ uint16_t andMask = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &andMask);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_mask_write_holding_register_request_and_mask = andMask;
-
- // Simple Field (orMask)
- uint16_t orMask = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &orMask);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_mask_write_holding_register_request_or_mask = orMask;
+ // Simple Field (orMask)
+ uint16_t orMask = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &orMask);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_mask_write_holding_register_request_or_mask = orMask;
} else
- if((errorFlag == false) && (functionFlag == 0x16) && (response == true)) { /* ModbusPDUMaskWriteHoldingRegisterResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x16 ) && ( response == true ) ) { /* ModbusPDUMaskWriteHoldingRegisterResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_mask_write_holding_register_response;
-
- // Simple Field (referenceAddress)
- uint16_t referenceAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &referenceAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_mask_write_holding_register_response_reference_address = referenceAddress;
+ // Simple Field (referenceAddress)
+ uint16_t referenceAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &referenceAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_mask_write_holding_register_response_reference_address = referenceAddress;
-
- // Simple Field (andMask)
- uint16_t andMask = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &andMask);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_mask_write_holding_register_response_and_mask = andMask;
+ // Simple Field (andMask)
+ uint16_t andMask = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &andMask);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_mask_write_holding_register_response_and_mask = andMask;
-
- // Simple Field (orMask)
- uint16_t orMask = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &orMask);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_mask_write_holding_register_response_or_mask = orMask;
+ // Simple Field (orMask)
+ uint16_t orMask = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &orMask);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_mask_write_holding_register_response_or_mask = orMask;
} else
- if((errorFlag == false) && (functionFlag == 0x18) && (response == false)) { /* ModbusPDUReadFifoQueueRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x18 ) && ( response == false ) ) { /* ModbusPDUReadFifoQueueRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_fifo_queue_request;
-
- // Simple Field (fifoPointerAddress)
- uint16_t fifoPointerAddress = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &fifoPointerAddress);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_fifo_queue_request_fifo_pointer_address = fifoPointerAddress;
+ // Simple Field (fifoPointerAddress)
+ uint16_t fifoPointerAddress = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &fifoPointerAddress);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_fifo_queue_request_fifo_pointer_address = fifoPointerAddress;
} else
- if((errorFlag == false) && (functionFlag == 0x18) && (response == true)) { /* ModbusPDUReadFifoQueueResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x18 ) && ( response == true ) ) { /* ModbusPDUReadFifoQueueResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_fifo_queue_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &fifoCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (fifoValue)
- plc4c_list* fifoValue = NULL;
- plc4c_utils_list_create(&fifoValue);
- if(fifoValue == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) fifoCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- uint16_t* _value = malloc(sizeof(uint16_t));
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(fifoValue, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint16_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Implicit Field (fifoCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint16_t fifoCount = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &fifoCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (fifoValue)
+ plc4c_list* fifoValue = NULL;
+ plc4c_utils_list_create(&fifoValue);
+ if(fifoValue == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) fifoCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ uint16_t* _value = malloc(sizeof(uint16_t));
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(fifoValue, _value);
}
- (*_message)->modbus_pdu_read_fifo_queue_response_fifo_value = fifoValue;
-
+ }
+ (*_message)->modbus_pdu_read_fifo_queue_response_fifo_value = fifoValue;
} else
- if((errorFlag == false) && (functionFlag == 0x14) && (response == false)) { /* ModbusPDUReadFileRecordRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x14 ) && ( response == false ) ) { /* ModbusPDUReadFileRecordRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_file_record_request;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (items)
- plc4c_list* items = NULL;
- plc4c_utils_list_create(&items);
- if(items == NULL) {
- return NO_MEMORY;
- }
- {
- // Length array
- uint8_t _itemsLength = byteCount;
- uint8_t itemsEndPos = plc4c_spi_read_get_pos(readBuffer) + _itemsLength;
- while(plc4c_spi_read_get_pos(readBuffer) < itemsEndPos) {
- plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* _value = NULL;
- _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(readBuffer, (void*) &_value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(items, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (items)
+ plc4c_list* items = NULL;
+ plc4c_utils_list_create(&items);
+ if(items == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Length array
+ uint8_t _itemsLength = byteCount;
+ uint8_t itemsEndPos = plc4c_spi_read_get_pos(readBuffer) + _itemsLength;
+ while(plc4c_spi_read_get_pos(readBuffer) < itemsEndPos) {
+ plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* _value = NULL;
+ _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(readBuffer, (void*) &_value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(items, _value);
}
- (*_message)->modbus_pdu_read_file_record_request_items = items;
-
+ }
+ (*_message)->modbus_pdu_read_file_record_request_items = items;
} else
- if((errorFlag == false) && (functionFlag == 0x14) && (response == true)) { /* ModbusPDUReadFileRecordResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x14 ) && ( response == true ) ) { /* ModbusPDUReadFileRecordResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_file_record_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (items)
- plc4c_list* items = NULL;
- plc4c_utils_list_create(&items);
- if(items == NULL) {
- return NO_MEMORY;
- }
- {
- // Length array
- uint8_t _itemsLength = byteCount;
- uint8_t itemsEndPos = plc4c_spi_read_get_pos(readBuffer) + _itemsLength;
- while(plc4c_spi_read_get_pos(readBuffer) < itemsEndPos) {
- plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* _value = NULL;
- _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(readBuffer, (void*) &_value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(items, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (items)
+ plc4c_list* items = NULL;
+ plc4c_utils_list_create(&items);
+ if(items == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Length array
+ uint8_t _itemsLength = byteCount;
+ uint8_t itemsEndPos = plc4c_spi_read_get_pos(readBuffer) + _itemsLength;
+ while(plc4c_spi_read_get_pos(readBuffer) < itemsEndPos) {
+ plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* _value = NULL;
+ _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(readBuffer, (void*) &_value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(items, _value);
}
- (*_message)->modbus_pdu_read_file_record_response_items = items;
+ }
+ (*_message)->modbus_pdu_read_file_record_response_items = items;
+ } else
+if( ( errorFlag == false ) && ( functionFlag == 0x15 ) && ( response == false ) ) { /* ModbusPDUWriteFileRecordRequest */
+ (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_file_record_request;
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
- } else
- if((errorFlag == false) && (functionFlag == 0x15) && (response == false)) { /* ModbusPDUWriteFileRecordRequest */
- (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_file_record_request;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (items)
- plc4c_list* items = NULL;
- plc4c_utils_list_create(&items);
- if(items == NULL) {
- return NO_MEMORY;
- }
- {
- // Length array
- uint8_t _itemsLength = byteCount;
- uint8_t itemsEndPos = plc4c_spi_read_get_pos(readBuffer) + _itemsLength;
- while(plc4c_spi_read_get_pos(readBuffer) < itemsEndPos) {
- plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* _value = NULL;
- _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(readBuffer, (void*) &_value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(items, _value);
+ // Array field (items)
+ plc4c_list* items = NULL;
+ plc4c_utils_list_create(&items);
+ if(items == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Length array
+ uint8_t _itemsLength = byteCount;
+ uint8_t itemsEndPos = plc4c_spi_read_get_pos(readBuffer) + _itemsLength;
+ while(plc4c_spi_read_get_pos(readBuffer) < itemsEndPos) {
+ plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* _value = NULL;
+ _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(readBuffer, (void*) &_value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(items, _value);
}
- (*_message)->modbus_pdu_write_file_record_request_items = items;
-
+ }
+ (*_message)->modbus_pdu_write_file_record_request_items = items;
} else
- if((errorFlag == false) && (functionFlag == 0x15) && (response == true)) { /* ModbusPDUWriteFileRecordResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x15 ) && ( response == true ) ) { /* ModbusPDUWriteFileRecordResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_file_record_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (items)
- plc4c_list* items = NULL;
- plc4c_utils_list_create(&items);
- if(items == NULL) {
- return NO_MEMORY;
- }
- {
- // Length array
- uint8_t _itemsLength = byteCount;
- uint8_t itemsEndPos = plc4c_spi_read_get_pos(readBuffer) + _itemsLength;
- while(plc4c_spi_read_get_pos(readBuffer) < itemsEndPos) {
- plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* _value = NULL;
- _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(readBuffer, (void*) &_value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(items, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (items)
+ plc4c_list* items = NULL;
+ plc4c_utils_list_create(&items);
+ if(items == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Length array
+ uint8_t _itemsLength = byteCount;
+ uint8_t itemsEndPos = plc4c_spi_read_get_pos(readBuffer) + _itemsLength;
+ while(plc4c_spi_read_get_pos(readBuffer) < itemsEndPos) {
+ plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* _value = NULL;
+ _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(readBuffer, (void*) &_value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(items, _value);
}
- (*_message)->modbus_pdu_write_file_record_response_items = items;
-
+ }
+ (*_message)->modbus_pdu_write_file_record_response_items = items;
} else
- if((errorFlag == false) && (functionFlag == 0x07) && (response == false)) { /* ModbusPDUReadExceptionStatusRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x07 ) && ( response == false ) ) { /* ModbusPDUReadExceptionStatusRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_exception_status_request;
} else
- if((errorFlag == false) && (functionFlag == 0x07) && (response == true)) { /* ModbusPDUReadExceptionStatusResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x07 ) && ( response == true ) ) { /* ModbusPDUReadExceptionStatusResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_exception_status_response;
-
- // Simple Field (value)
- uint8_t value = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &value);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_read_exception_status_response_value = value;
+ // Simple Field (value)
+ uint8_t value = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &value);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_read_exception_status_response_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x08) && (response == false)) { /* ModbusPDUDiagnosticRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x08 ) && ( response == false ) ) { /* ModbusPDUDiagnosticRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_diagnostic_request;
-
- // Simple Field (subFunction)
- uint16_t subFunction = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &subFunction);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_diagnostic_request_sub_function = subFunction;
+ // Simple Field (subFunction)
+ uint16_t subFunction = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &subFunction);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_diagnostic_request_sub_function = subFunction;
-
- // Simple Field (data)
- uint16_t data = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &data);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_diagnostic_request_data = data;
+ // Simple Field (data)
+ uint16_t data = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &data);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_diagnostic_request_data = data;
} else
- if((errorFlag == false) && (functionFlag == 0x08) && (response == true)) { /* ModbusPDUDiagnosticResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x08 ) && ( response == true ) ) { /* ModbusPDUDiagnosticResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_diagnostic_response;
-
- // Simple Field (subFunction)
- uint16_t subFunction = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &subFunction);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_diagnostic_response_sub_function = subFunction;
+ // Simple Field (subFunction)
+ uint16_t subFunction = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &subFunction);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_diagnostic_response_sub_function = subFunction;
-
- // Simple Field (data)
- uint16_t data = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &data);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_diagnostic_response_data = data;
+ // Simple Field (data)
+ uint16_t data = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &data);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_diagnostic_response_data = data;
} else
- if((errorFlag == false) && (functionFlag == 0x0B) && (response == false)) { /* ModbusPDUGetComEventCounterRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x0B ) && ( response == false ) ) { /* ModbusPDUGetComEventCounterRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_get_com_event_counter_request;
} else
- if((errorFlag == false) && (functionFlag == 0x0B) && (response == true)) { /* ModbusPDUGetComEventCounterResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x0B ) && ( response == true ) ) { /* ModbusPDUGetComEventCounterResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_get_com_event_counter_response;
-
- // Simple Field (status)
- uint16_t status = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &status);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_get_com_event_counter_response_status = status;
+ // Simple Field (status)
+ uint16_t status = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &status);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_get_com_event_counter_response_status = status;
-
- // Simple Field (eventCount)
- uint16_t eventCount = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &eventCount);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_get_com_event_counter_response_event_count = eventCount;
+ // Simple Field (eventCount)
+ uint16_t eventCount = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &eventCount);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_get_com_event_counter_response_event_count = eventCount;
} else
- if((errorFlag == false) && (functionFlag == 0x0C) && (response == false)) { /* ModbusPDUGetComEventLogRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x0C ) && ( response == false ) ) { /* ModbusPDUGetComEventLogRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_get_com_event_log_request;
} else
- if((errorFlag == false) && (functionFlag == 0x0C) && (response == true)) { /* ModbusPDUGetComEventLogResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x0C ) && ( response == true ) ) { /* ModbusPDUGetComEventLogResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_get_com_event_log_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Simple Field (status)
- uint16_t status = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &status);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_get_com_event_log_response_status = status;
-
-
-
- // Simple Field (eventCount)
- uint16_t eventCount = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &eventCount);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_get_com_event_log_response_event_count = eventCount;
-
-
-
- // Simple Field (messageCount)
- uint16_t messageCount = 0;
- _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &messageCount);
- if(_res != OK) {
- return _res;
- }
- (*_message)->modbus_pdu_get_com_event_log_response_message_count = messageCount;
-
-
-
- // Array field (events)
- plc4c_list* events = NULL;
- plc4c_utils_list_create(&events);
- if(events == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) (byteCount) - (6);
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(events, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Simple Field (status)
+ uint16_t status = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &status);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_get_com_event_log_response_status = status;
+
+
+ // Simple Field (eventCount)
+ uint16_t eventCount = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &eventCount);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_get_com_event_log_response_event_count = eventCount;
+
+
+ // Simple Field (messageCount)
+ uint16_t messageCount = 0;
+ _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &messageCount);
+ if(_res != OK) {
+ return _res;
+ }
+ (*_message)->modbus_pdu_get_com_event_log_response_message_count = messageCount;
+
+
+ // Array field (events)
+ plc4c_list* events = NULL;
+ plc4c_utils_list_create(&events);
+ if(events == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) (byteCount) - (6);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(events, _value);
}
- (*_message)->modbus_pdu_get_com_event_log_response_events = events;
-
+ }
+ (*_message)->modbus_pdu_get_com_event_log_response_events = events;
} else
- if((errorFlag == false) && (functionFlag == 0x11) && (response == false)) { /* ModbusPDUReportServerIdRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x11 ) && ( response == false ) ) { /* ModbusPDUReportServerIdRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_report_server_id_request;
} else
- if((errorFlag == false) && (functionFlag == 0x11) && (response == true)) { /* ModbusPDUReportServerIdResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x11 ) && ( response == true ) ) { /* ModbusPDUReportServerIdResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_report_server_id_response;
-
- // 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 = 0;
- _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
- if(_res != OK) {
- return _res;
- }
-
-
-
- // Array field (value)
- plc4c_list* value = NULL;
- plc4c_utils_list_create(&value);
- if(value == NULL) {
- return NO_MEMORY;
- }
- {
- // Count array
- uint16_t itemCount = (uint16_t) byteCount;
- for(int curItem = 0; curItem < itemCount; curItem++) {
-
- char* _value = malloc(sizeof(char));
- _res = plc4c_spi_read_char(readBuffer, (char*) _value);
- if(_res != OK) {
- return _res;
- }
- plc4c_utils_list_insert_head_value(value, _value);
+
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = 0;
+ _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+
+ // Array field (value)
+ plc4c_list* value = NULL;
+ plc4c_utils_list_create(&value);
+ if(value == NULL) {
+ return NO_MEMORY;
+ }
+ {
+ // Count array
+ uint16_t itemCount = (uint16_t) byteCount;
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+
+ char* _value = malloc(sizeof(char));
+ _res = plc4c_spi_read_char(readBuffer, (char*) _value);
+ if(_res != OK) {
+ return _res;
}
+ plc4c_utils_list_insert_head_value(value, _value);
}
- (*_message)->modbus_pdu_report_server_id_response_value = value;
-
+ }
+ (*_message)->modbus_pdu_report_server_id_response_value = value;
} else
- if((errorFlag == false) && (functionFlag == 0x2B) && (response == false)) { /* ModbusPDUReadDeviceIdentificationRequest */
+if( ( errorFlag == false ) && ( functionFlag == 0x2B ) && ( response == false ) ) { /* ModbusPDUReadDeviceIdentificationRequest */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_device_identification_request;
} else
- if((errorFlag == false) && (functionFlag == 0x2B) && (response == true)) { /* ModbusPDUReadDeviceIdentificationResponse */
+if( ( errorFlag == false ) && ( functionFlag == 0x2B ) && ( response == true ) ) { /* ModbusPDUReadDeviceIdentificationResponse */
(*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_device_identification_response;
}
@@ -1190,560 +1113,612 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_b
plc4c_return_code _res = OK;
// Discriminator Field (errorFlag)
- plc4c_spi_write_bit(writeBuffer, plc4c_modbus_read_write_modbus_pdu_get_discriminator(_message->_type).errorFlag);
+ bool errorFlag = plc4c_modbus_read_write_modbus_pdu_get_discriminator(_message->_type).errorFlag;
+ plc4c_spi_write_bit(writeBuffer, errorFlag);
// Discriminator Field (functionFlag)
- plc4c_spi_write_unsigned_byte(writeBuffer, 7, plc4c_modbus_read_write_modbus_pdu_get_discriminator(_message->_type).functionFlag);
+ uint8_t functionFlag = plc4c_modbus_read_write_modbus_pdu_get_discriminator(_message->_type).functionFlag;
+ plc4c_spi_write_unsigned_byte(writeBuffer, 7, functionFlag);
- // Switch Field (Depending of the current type, serialize the sub-type elements)
+ // Switch Field (Depending on the current type, serialize the sub-type elements)
switch(_message->_type) {
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_error: {
- // Simple Field (exceptionCode)
- _res = plc4c_modbus_read_write_modbus_error_code_serialize(writeBuffer, &_message->modbus_pdu_error_exception_code);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (exceptionCode)
+ plc4c_modbus_read_write_modbus_error_code exceptionCode = _message->modbus_pdu_error_exception_code;
+ _res = plc4c_modbus_read_write_modbus_error_code_serialize(writeBuffer, &exceptionCode);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_discrete_inputs_request: {
- // Simple Field (startingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_discrete_inputs_request_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = _message->modbus_pdu_read_discrete_inputs_request_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (quantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_discrete_inputs_request_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (quantity)
+ uint16_t quantity = _message->modbus_pdu_read_discrete_inputs_request_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, quantity);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_discrete_inputs_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_discrete_inputs_response_value));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_discrete_inputs_response_value);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (value)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_discrete_inputs_response_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (value)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_discrete_inputs_response_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_discrete_inputs_response_value, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_discrete_inputs_response_value, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_coils_request: {
- // Simple Field (startingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_coils_request_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = _message->modbus_pdu_read_coils_request_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (quantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_coils_request_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (quantity)
+ uint16_t quantity = _message->modbus_pdu_read_coils_request_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, quantity);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_coils_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_coils_response_value));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_coils_response_value);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (value)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_coils_response_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (value)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_coils_response_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_coils_response_value, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_coils_response_value, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_coil_request: {
- // Simple Field (address)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_single_coil_request_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (address)
+ uint16_t address = _message->modbus_pdu_write_single_coil_request_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, address);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (value)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_single_coil_request_value);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (value)
+ uint16_t value = _message->modbus_pdu_write_single_coil_request_value;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, value);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_coil_response: {
- // Simple Field (address)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_single_coil_response_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (address)
+ uint16_t address = _message->modbus_pdu_write_single_coil_response_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, address);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (value)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_single_coil_response_value);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (value)
+ uint16_t value = _message->modbus_pdu_write_single_coil_response_value;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, value);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_coils_request: {
- // Simple Field (startingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_multiple_coils_request_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = _message->modbus_pdu_write_multiple_coils_request_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (quantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_multiple_coils_request_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (quantity)
+ uint16_t quantity = _message->modbus_pdu_write_multiple_coils_request_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, quantity);
+ if(_res != OK) {
+ return _res;
+ }
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_count(_message->modbus_pdu_write_multiple_coils_request_value));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_count(_message->modbus_pdu_write_multiple_coils_request_value);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (value)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_multiple_coils_request_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (value)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_multiple_coils_request_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_write_multiple_coils_request_value, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_write_multiple_coils_request_value, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_coils_response: {
- // Simple Field (startingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_multiple_coils_response_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = _message->modbus_pdu_write_multiple_coils_response_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (quantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_multiple_coils_response_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (quantity)
+ uint16_t quantity = _message->modbus_pdu_write_multiple_coils_response_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, quantity);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_input_registers_request: {
- // Simple Field (startingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_input_registers_request_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = _message->modbus_pdu_read_input_registers_request_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (quantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_input_registers_request_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (quantity)
+ uint16_t quantity = _message->modbus_pdu_read_input_registers_request_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, quantity);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_input_registers_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_input_registers_response_value));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_input_registers_response_value);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (value)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_input_registers_response_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (value)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_input_registers_response_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_input_registers_response_value, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_input_registers_response_value, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_holding_registers_request: {
- // Simple Field (startingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_holding_registers_request_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = _message->modbus_pdu_read_holding_registers_request_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (quantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_holding_registers_request_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (quantity)
+ uint16_t quantity = _message->modbus_pdu_read_holding_registers_request_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, quantity);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_holding_registers_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_holding_registers_response_value));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_holding_registers_response_value);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (value)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_holding_registers_response_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (value)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_holding_registers_response_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_holding_registers_response_value, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_holding_registers_response_value, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_register_request: {
- // Simple Field (address)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_single_register_request_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (address)
+ uint16_t address = _message->modbus_pdu_write_single_register_request_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, address);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (value)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_single_register_request_value);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (value)
+ uint16_t value = _message->modbus_pdu_write_single_register_request_value;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, value);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_register_response: {
- // Simple Field (address)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_single_register_response_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (address)
+ uint16_t address = _message->modbus_pdu_write_single_register_response_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, address);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (value)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_single_register_response_value);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (value)
+ uint16_t value = _message->modbus_pdu_write_single_register_response_value;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, value);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_holding_registers_request: {
- // Simple Field (startingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_multiple_holding_registers_request_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = _message->modbus_pdu_write_multiple_holding_registers_request_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (quantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_multiple_holding_registers_request_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (quantity)
+ uint16_t quantity = _message->modbus_pdu_write_multiple_holding_registers_request_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, quantity);
+ if(_res != OK) {
+ return _res;
+ }
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_count(_message->modbus_pdu_write_multiple_holding_registers_request_value));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_count(_message->modbus_pdu_write_multiple_holding_registers_request_value);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (value)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_multiple_holding_registers_request_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (value)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_multiple_holding_registers_request_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_write_multiple_holding_registers_request_value, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_write_multiple_holding_registers_request_value, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_holding_registers_response: {
- // Simple Field (startingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_multiple_holding_registers_response_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (startingAddress)
+ uint16_t startingAddress = _message->modbus_pdu_write_multiple_holding_registers_response_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, startingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (quantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_write_multiple_holding_registers_response_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (quantity)
+ uint16_t quantity = _message->modbus_pdu_write_multiple_holding_registers_response_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, quantity);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_write_multiple_holding_registers_request: {
- // Simple Field (readStartingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_write_multiple_holding_registers_request_read_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (readStartingAddress)
+ uint16_t readStartingAddress = _message->modbus_pdu_read_write_multiple_holding_registers_request_read_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, readStartingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (readQuantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_write_multiple_holding_registers_request_read_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (readQuantity)
+ uint16_t readQuantity = _message->modbus_pdu_read_write_multiple_holding_registers_request_read_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, readQuantity);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (writeStartingAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_write_multiple_holding_registers_request_write_starting_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (writeStartingAddress)
+ uint16_t writeStartingAddress = _message->modbus_pdu_read_write_multiple_holding_registers_request_write_starting_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, writeStartingAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (writeQuantity)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_write_multiple_holding_registers_request_write_quantity);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (writeQuantity)
+ uint16_t writeQuantity = _message->modbus_pdu_read_write_multiple_holding_registers_request_write_quantity;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, writeQuantity);
+ if(_res != OK) {
+ return _res;
+ }
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_write_multiple_holding_registers_request_value));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_write_multiple_holding_registers_request_value);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (value)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_request_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (value)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_request_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_write_multiple_holding_registers_request_value, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_write_multiple_holding_registers_request_value, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_write_multiple_holding_registers_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_write_multiple_holding_registers_response_value));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_write_multiple_holding_registers_response_value);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (value)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_response_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (value)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_response_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_write_multiple_holding_registers_response_value, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_read_write_multiple_holding_registers_response_value, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_mask_write_holding_register_request: {
- // Simple Field (referenceAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_mask_write_holding_register_request_reference_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (referenceAddress)
+ uint16_t referenceAddress = _message->modbus_pdu_mask_write_holding_register_request_reference_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, referenceAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (andMask)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_mask_write_holding_register_request_and_mask);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (andMask)
+ uint16_t andMask = _message->modbus_pdu_mask_write_holding_register_request_and_mask;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, andMask);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (orMask)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_mask_write_holding_register_request_or_mask);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (orMask)
+ uint16_t orMask = _message->modbus_pdu_mask_write_holding_register_request_or_mask;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, orMask);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_mask_write_holding_register_response: {
- // Simple Field (referenceAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_mask_write_holding_register_response_reference_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (referenceAddress)
+ uint16_t referenceAddress = _message->modbus_pdu_mask_write_holding_register_response_reference_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, referenceAddress);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (andMask)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_mask_write_holding_register_response_and_mask);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (andMask)
+ uint16_t andMask = _message->modbus_pdu_mask_write_holding_register_response_and_mask;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, andMask);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (orMask)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_mask_write_holding_register_response_or_mask);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (orMask)
+ uint16_t orMask = _message->modbus_pdu_mask_write_holding_register_response_or_mask;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, orMask);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_fifo_queue_request: {
- // Simple Field (fifoPointerAddress)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_read_fifo_queue_request_fifo_pointer_address);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (fifoPointerAddress)
+ uint16_t fifoPointerAddress = _message->modbus_pdu_read_fifo_queue_request_fifo_pointer_address;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, fifoPointerAddress);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_fifo_queue_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (((plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_fifo_queue_response_fifo_value)) * (2))) + (2));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint16_t byteCount = (((plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_fifo_queue_response_fifo_value)) * (2))) + (2);
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Implicit Field (fifoCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (((plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_fifo_queue_response_fifo_value)) * (2))) / (2));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (fifoCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint16_t fifoCount = (((plc4c_spi_evaluation_helper_count(_message->modbus_pdu_read_fifo_queue_response_fifo_value)) * (2))) / (2);
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, fifoCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (fifoValue)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_fifo_queue_response_fifo_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (fifoValue)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_fifo_queue_response_fifo_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- uint16_t* _value = (uint16_t*) plc4c_utils_list_get_value(_message->modbus_pdu_read_fifo_queue_response_fifo_value, curItem);
- plc4c_spi_write_unsigned_short(writeBuffer, 16, *_value);
- }
- }
+ uint16_t* _value = (uint16_t*) plc4c_utils_list_get_value(_message->modbus_pdu_read_fifo_queue_response_fifo_value, curItem);
+ plc4c_spi_write_unsigned_short(writeBuffer, 16, *_value);
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_file_record_request: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_array_size_in_bytes(_message->modbus_pdu_read_file_record_request_items));
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_array_size_in_bytes(_message->modbus_pdu_read_file_record_request_items);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+ // Array field (items)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_file_record_request_items);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* _value = (plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item*) plc4c_utils_list_get_value(_message->modbus_pdu_read_file_record_request_items, curItem);
+ _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_serialize(writeBuffer, (void*) _value);
if(_res != OK) {
return _res;
}
-
- // Array field (items)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_file_record_request_items);
- for(int curItem = 0; curItem < itemCount; curItem++) {
- bool lastItem = curItem == (itemCount - 1);
- plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* _value = (plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item*) plc4c_utils_list_get_value(_message->modbus_pdu_read_file_record_request_items, curItem);
- _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_serialize(writeBuffer, (void*) _value);
- if(_res != OK) {
- return _res;
- }
- }
- }
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_file_record_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_array_size_in_bytes(_message->modbus_pdu_read_file_record_response_items));
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_array_size_in_bytes(_message->modbus_pdu_read_file_record_response_items);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+ // Array field (items)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_file_record_response_items);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* _value = (plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item*) plc4c_utils_list_get_value(_message->modbus_pdu_read_file_record_response_items, curItem);
+ _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_serialize(writeBuffer, (void*) _value);
if(_res != OK) {
return _res;
}
-
- // Array field (items)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_read_file_record_response_items);
- for(int curItem = 0; curItem < itemCount; curItem++) {
- bool lastItem = curItem == (itemCount - 1);
- plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* _value = (plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item*) plc4c_utils_list_get_value(_message->modbus_pdu_read_file_record_response_items, curItem);
- _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_serialize(writeBuffer, (void*) _value);
- if(_res != OK) {
- return _res;
- }
- }
- }
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_file_record_request: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_array_size_in_bytes(_message->modbus_pdu_write_file_record_request_items));
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_array_size_in_bytes(_message->modbus_pdu_write_file_record_request_items);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+ // Array field (items)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_file_record_request_items);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* _value = (plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item*) plc4c_utils_list_get_value(_message->modbus_pdu_write_file_record_request_items, curItem);
+ _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_serialize(writeBuffer, (void*) _value);
if(_res != OK) {
return _res;
}
-
- // Array field (items)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_file_record_request_items);
- for(int curItem = 0; curItem < itemCount; curItem++) {
- bool lastItem = curItem == (itemCount - 1);
- plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* _value = (plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item*) plc4c_utils_list_get_value(_message->modbus_pdu_write_file_record_request_items, curItem);
- _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_serialize(writeBuffer, (void*) _value);
- if(_res != OK) {
- return _res;
- }
- }
- }
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_file_record_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_array_size_in_bytes(_message->modbus_pdu_write_file_record_response_items));
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_array_size_in_bytes(_message->modbus_pdu_write_file_record_response_items);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
+
+ // Array field (items)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_file_record_response_items);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
+ bool lastItem = curItem == (itemCount - 1);
+ plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* _value = (plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item*) plc4c_utils_list_get_value(_message->modbus_pdu_write_file_record_response_items, curItem);
+ _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_serialize(writeBuffer, (void*) _value);
if(_res != OK) {
return _res;
}
-
- // Array field (items)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_write_file_record_response_items);
- for(int curItem = 0; curItem < itemCount; curItem++) {
- bool lastItem = curItem == (itemCount - 1);
- plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* _value = (plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item*) plc4c_utils_list_get_value(_message->modbus_pdu_write_file_record_response_items, curItem);
- _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_serialize(writeBuffer, (void*) _value);
- if(_res != OK) {
- return _res;
- }
- }
- }
+ }
+ }
break;
}
@@ -1753,43 +1728,48 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_b
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_exception_status_response: {
- // Simple Field (value)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, _message->modbus_pdu_read_exception_status_response_value);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (value)
+ uint8_t value = _message->modbus_pdu_read_exception_status_response_value;
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, value);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_diagnostic_request: {
- // Simple Field (subFunction)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_diagnostic_request_sub_function);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (subFunction)
+ uint16_t subFunction = _message->modbus_pdu_diagnostic_request_sub_function;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, subFunction);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (data)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_diagnostic_request_data);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (data)
+ uint16_t data = _message->modbus_pdu_diagnostic_request_data;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, data);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_diagnostic_response: {
- // Simple Field (subFunction)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_diagnostic_response_sub_function);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (subFunction)
+ uint16_t subFunction = _message->modbus_pdu_diagnostic_response_sub_function;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, subFunction);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (data)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_diagnostic_response_data);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (data)
+ uint16_t data = _message->modbus_pdu_diagnostic_response_data;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, data);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
@@ -1799,17 +1779,19 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_b
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_get_com_event_counter_response: {
- // Simple Field (status)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_get_com_event_counter_response_status);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (status)
+ uint16_t status = _message->modbus_pdu_get_com_event_counter_response_status;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, status);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (eventCount)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_get_com_event_counter_response_event_count);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (eventCount)
+ uint16_t eventCount = _message->modbus_pdu_get_com_event_counter_response_event_count;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, eventCount);
+ if(_res != OK) {
+ return _res;
+ }
break;
}
@@ -1819,39 +1801,43 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_b
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_get_com_event_log_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (plc4c_spi_evaluation_helper_count(_message->modbus_pdu_get_com_event_log_response_events)) + (6));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = (plc4c_spi_evaluation_helper_count(_message->modbus_pdu_get_com_event_log_response_events)) + (6);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (status)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_get_com_event_log_response_status);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (status)
+ uint16_t status = _message->modbus_pdu_get_com_event_log_response_status;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, status);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (eventCount)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_get_com_event_log_response_event_count);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (eventCount)
+ uint16_t eventCount = _message->modbus_pdu_get_com_event_log_response_event_count;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, eventCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Simple Field (messageCount)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->modbus_pdu_get_com_event_log_response_message_count);
- if(_res != OK) {
- return _res;
- }
+ // Simple Field (messageCount)
+ uint16_t messageCount = _message->modbus_pdu_get_com_event_log_response_message_count;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, messageCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (events)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_get_com_event_log_response_events);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (events)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_get_com_event_log_response_events);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_get_com_event_log_response_events, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_get_com_event_log_response_events, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
@@ -1861,21 +1847,22 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_b
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_report_server_id_response: {
- // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_spi_evaluation_helper_count(_message->modbus_pdu_report_server_id_response_value));
- if(_res != OK) {
- return _res;
- }
+ // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t byteCount = plc4c_spi_evaluation_helper_count(_message->modbus_pdu_report_server_id_response_value);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, byteCount);
+ if(_res != OK) {
+ return _res;
+ }
- // Array field (value)
- {
- uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_report_server_id_response_value);
- for(int curItem = 0; curItem < itemCount; curItem++) {
+ // Array field (value)
+ {
+ uint8_t itemCount = plc4c_utils_list_size(_message->modbus_pdu_report_server_id_response_value);
+ for(int curItem = 0; curItem < itemCount; curItem++) {
- char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_report_server_id_response_value, curItem);
- plc4c_spi_write_char(writeBuffer, *_value);
- }
- }
+ char* _value = (char*) plc4c_utils_list_get_value(_message->modbus_pdu_report_server_id_response_value, curItem);
+ plc4c_spi_write_char(writeBuffer, *_value);
+ }
+ }
break;
}
@@ -1905,362 +1892,362 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4c_modbus_read_wri
// Discriminator Field (functionFlag)
lengthInBits += 7;
- // Depending of the current type, add the length of sub-type elements ...
+ // Depending on the current type, add the length of sub-type elements ...
switch(_message->_type) {
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_error: {
- // Simple field (exceptionCode)
- lengthInBits += plc4c_modbus_read_write_modbus_error_code_length_in_bits(&_message->modbus_pdu_error_exception_code);
+ // Simple field (exceptionCode)
+ lengthInBits += plc4c_modbus_read_write_modbus_error_code_length_in_bits(&_message->modbus_pdu_error_exception_code);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_discrete_inputs_request: {
- // Simple field (startingAddress)
- lengthInBits += 16;
+ // Simple field (startingAddress)
+ lengthInBits += 16;
- // Simple field (quantity)
- lengthInBits += 16;
+ // Simple field (quantity)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_discrete_inputs_response: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_discrete_inputs_response_value);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_discrete_inputs_response_value);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_coils_request: {
- // Simple field (startingAddress)
- lengthInBits += 16;
+ // Simple field (startingAddress)
+ lengthInBits += 16;
- // Simple field (quantity)
- lengthInBits += 16;
+ // Simple field (quantity)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_coils_response: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_coils_response_value);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_coils_response_value);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_coil_request: {
- // Simple field (address)
- lengthInBits += 16;
+ // Simple field (address)
+ lengthInBits += 16;
- // Simple field (value)
- lengthInBits += 16;
+ // Simple field (value)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_coil_response: {
- // Simple field (address)
- lengthInBits += 16;
+ // Simple field (address)
+ lengthInBits += 16;
- // Simple field (value)
- lengthInBits += 16;
+ // Simple field (value)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_coils_request: {
- // Simple field (startingAddress)
- lengthInBits += 16;
+ // Simple field (startingAddress)
+ lengthInBits += 16;
- // Simple field (quantity)
- lengthInBits += 16;
+ // Simple field (quantity)
+ lengthInBits += 16;
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_write_multiple_coils_request_value);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_write_multiple_coils_request_value);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_coils_response: {
- // Simple field (startingAddress)
- lengthInBits += 16;
+ // Simple field (startingAddress)
+ lengthInBits += 16;
- // Simple field (quantity)
- lengthInBits += 16;
+ // Simple field (quantity)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_input_registers_request: {
- // Simple field (startingAddress)
- lengthInBits += 16;
+ // Simple field (startingAddress)
+ lengthInBits += 16;
- // Simple field (quantity)
- lengthInBits += 16;
+ // Simple field (quantity)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_input_registers_response: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_input_registers_response_value);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_input_registers_response_value);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_holding_registers_request: {
- // Simple field (startingAddress)
- lengthInBits += 16;
+ // Simple field (startingAddress)
+ lengthInBits += 16;
- // Simple field (quantity)
- lengthInBits += 16;
+ // Simple field (quantity)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_holding_registers_response: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_holding_registers_response_value);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_holding_registers_response_value);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_register_request: {
- // Simple field (address)
- lengthInBits += 16;
+ // Simple field (address)
+ lengthInBits += 16;
- // Simple field (value)
- lengthInBits += 16;
+ // Simple field (value)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_single_register_response: {
- // Simple field (address)
- lengthInBits += 16;
+ // Simple field (address)
+ lengthInBits += 16;
- // Simple field (value)
- lengthInBits += 16;
+ // Simple field (value)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_holding_registers_request: {
- // Simple field (startingAddress)
- lengthInBits += 16;
+ // Simple field (startingAddress)
+ lengthInBits += 16;
- // Simple field (quantity)
- lengthInBits += 16;
+ // Simple field (quantity)
+ lengthInBits += 16;
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_write_multiple_holding_registers_request_value);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_write_multiple_holding_registers_request_value);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_multiple_holding_registers_response: {
- // Simple field (startingAddress)
- lengthInBits += 16;
+ // Simple field (startingAddress)
+ lengthInBits += 16;
- // Simple field (quantity)
- lengthInBits += 16;
+ // Simple field (quantity)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_write_multiple_holding_registers_request: {
- // Simple field (readStartingAddress)
- lengthInBits += 16;
+ // Simple field (readStartingAddress)
+ lengthInBits += 16;
- // Simple field (readQuantity)
- lengthInBits += 16;
+ // Simple field (readQuantity)
+ lengthInBits += 16;
- // Simple field (writeStartingAddress)
- lengthInBits += 16;
+ // Simple field (writeStartingAddress)
+ lengthInBits += 16;
- // Simple field (writeQuantity)
- lengthInBits += 16;
+ // Simple field (writeQuantity)
+ lengthInBits += 16;
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_request_value);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_request_value);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_write_multiple_holding_registers_response: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_response_value);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_read_write_multiple_holding_registers_response_value);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_mask_write_holding_register_request: {
- // Simple field (referenceAddress)
- lengthInBits += 16;
+ // Simple field (referenceAddress)
+ lengthInBits += 16;
- // Simple field (andMask)
- lengthInBits += 16;
+ // Simple field (andMask)
+ lengthInBits += 16;
- // Simple field (orMask)
- lengthInBits += 16;
+ // Simple field (orMask)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_mask_write_holding_register_response: {
- // Simple field (referenceAddress)
- lengthInBits += 16;
+ // Simple field (referenceAddress)
+ lengthInBits += 16;
- // Simple field (andMask)
- lengthInBits += 16;
+ // Simple field (andMask)
+ lengthInBits += 16;
- // Simple field (orMask)
- lengthInBits += 16;
+ // Simple field (orMask)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_fifo_queue_request: {
- // Simple field (fifoPointerAddress)
- lengthInBits += 16;
+ // Simple field (fifoPointerAddress)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_fifo_queue_response: {
- // Implicit Field (byteCount)
- lengthInBits += 16;
+ // Implicit Field (byteCount)
+ lengthInBits += 16;
- // Implicit Field (fifoCount)
- lengthInBits += 16;
+ // Implicit Field (fifoCount)
+ lengthInBits += 16;
- // Array field
- lengthInBits += 16 * plc4c_utils_list_size(_message->modbus_pdu_read_fifo_queue_response_fifo_value);
+ // Array field
+ lengthInBits += 16 * plc4c_utils_list_size(_message->modbus_pdu_read_fifo_queue_response_fifo_value);
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_file_record_request: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- if(_message->modbus_pdu_read_file_record_request_items != NULL) {
- plc4c_list_element* curElement = _message->modbus_pdu_read_file_record_request_items->tail;
- while (curElement != NULL) {
- lengthInBits += plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_length_in_bits((plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item*) curElement->value);
- curElement = curElement->next;
- }
- }
+ // Array field
+ if(_message->modbus_pdu_read_file_record_request_items != NULL) {
+ plc4c_list_element* curElement = _message->modbus_pdu_read_file_record_request_items->tail;
+ while (curElement != NULL) {
+ lengthInBits += plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_length_in_bits((plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item*) curElement->value);
+ curElement = curElement->next;
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_file_record_response: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- if(_message->modbus_pdu_read_file_record_response_items != NULL) {
- plc4c_list_element* curElement = _message->modbus_pdu_read_file_record_response_items->tail;
- while (curElement != NULL) {
- lengthInBits += plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_length_in_bits((plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item*) curElement->value);
- curElement = curElement->next;
- }
- }
+ // Array field
+ if(_message->modbus_pdu_read_file_record_response_items != NULL) {
+ plc4c_list_element* curElement = _message->modbus_pdu_read_file_record_response_items->tail;
+ while (curElement != NULL) {
+ lengthInBits += plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_length_in_bits((plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item*) curElement->value);
+ curElement = curElement->next;
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_file_record_request: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- if(_message->modbus_pdu_write_file_record_request_items != NULL) {
- plc4c_list_element* curElement = _message->modbus_pdu_write_file_record_request_items->tail;
- while (curElement != NULL) {
- lengthInBits += plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_length_in_bits((plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item*) curElement->value);
- curElement = curElement->next;
- }
- }
+ // Array field
+ if(_message->modbus_pdu_write_file_record_request_items != NULL) {
+ plc4c_list_element* curElement = _message->modbus_pdu_write_file_record_request_items->tail;
+ while (curElement != NULL) {
+ lengthInBits += plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_length_in_bits((plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item*) curElement->value);
+ curElement = curElement->next;
+ }
+ }
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_file_record_response: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- if(_message->modbus_pdu_write_file_record_response_items != NULL) {
- plc4c_list_element* curElement = _message->modbus_pdu_write_file_record_response_items->tail;
- while (curElement != NULL) {
- lengthInBits += plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_length_in_bits((plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item*) curElement->value);
- curElement = curElement->next;
- }
- }
+ // Array field
+ if(_message->modbus_pdu_write_file_record_response_items != NULL) {
+ plc4c_list_element* curElement = _message->modbus_pdu_write_file_record_response_items->tail;
+ while (curElement != NULL) {
+ lengthInBits += plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_length_in_bits((plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item*) curElement->value);
+ curElement = curElement->next;
+ }
+ }
break;
}
@@ -2270,30 +2257,30 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4c_modbus_read_wri
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_exception_status_response: {
- // Simple field (value)
- lengthInBits += 8;
+ // Simple field (value)
+ lengthInBits += 8;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_diagnostic_request: {
- // Simple field (subFunction)
- lengthInBits += 16;
+ // Simple field (subFunction)
+ lengthInBits += 16;
- // Simple field (data)
- lengthInBits += 16;
+ // Simple field (data)
+ lengthInBits += 16;
break;
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_diagnostic_response: {
- // Simple field (subFunction)
- lengthInBits += 16;
+ // Simple field (subFunction)
+ lengthInBits += 16;
- // Simple field (data)
- lengthInBits += 16;
+ // Simple field (data)
+ lengthInBits += 16;
break;
}
@@ -2303,12 +2290,12 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4c_modbus_read_wri
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_get_com_event_counter_response: {
- // Simple field (status)
- lengthInBits += 16;
+ // Simple field (status)
+ lengthInBits += 16;
- // Simple field (eventCount)
- lengthInBits += 16;
+ // Simple field (eventCount)
+ lengthInBits += 16;
break;
}
@@ -2318,24 +2305,24 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4c_modbus_read_wri
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_get_com_event_log_response: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Simple field (status)
- lengthInBits += 16;
+ // Simple field (status)
+ lengthInBits += 16;
- // Simple field (eventCount)
- lengthInBits += 16;
+ // Simple field (eventCount)
+ lengthInBits += 16;
- // Simple field (messageCount)
- lengthInBits += 16;
+ // Simple field (messageCount)
+ lengthInBits += 16;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_get_com_event_log_response_events);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_get_com_event_log_response_events);
break;
}
@@ -2345,12 +2332,12 @@ uint16_t plc4c_modbus_read_write_modbus_pdu_length_in_bits(plc4c_modbus_read_wri
}
case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_report_server_id_response: {
- // Implicit Field (byteCount)
- lengthInBits += 8;
+ // Implicit Field (byteCount)
+ lengthInBits += 8;
- // Array field
- lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_report_server_id_response_value);
+ // Array field
+ lengthInBits += 8 * plc4c_utils_list_size(_message->modbus_pdu_report_server_id_response_value);
break;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
index 86a7b10..7efce8a 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
@@ -74,25 +74,29 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_it
plc4c_return_code _res = OK;
// Simple Field (referenceType)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, _message->reference_type);
+ uint8_t referenceType = _message->reference_type;
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, referenceType);
if(_res != OK) {
return _res;
}
// Simple Field (fileNumber)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->file_number);
+ uint16_t fileNumber = _message->file_number;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, fileNumber);
if(_res != OK) {
return _res;
}
// Simple Field (recordNumber)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->record_number);
+ uint16_t recordNumber = _message->record_number;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, recordNumber);
if(_res != OK) {
return _res;
}
// Simple Field (recordLength)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->record_length);
+ uint16_t recordLength = _message->record_length;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, recordLength);
if(_res != OK) {
return _res;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
index d57f0ca..2cab1ac 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
@@ -35,7 +35,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
return NO_MEMORY;
}
- // Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ // Implicit Field (dataLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
uint8_t dataLength = 0;
_res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &dataLength);
if(_res != OK) {
@@ -77,14 +77,16 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* _message) {
plc4c_return_code _res = OK;
- // Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (plc4c_spi_evaluation_helper_count(_message->data)) + (1));
+ // Implicit Field (dataLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint8_t dataLength = (plc4c_spi_evaluation_helper_count(_message->data)) + (1);
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, dataLength);
if(_res != OK) {
return _res;
}
// Simple Field (referenceType)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, _message->reference_type);
+ uint8_t referenceType = _message->reference_type;
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, referenceType);
if(_res != OK) {
return _res;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
index d706de0..a9b8807 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
@@ -59,7 +59,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
}
(*_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)
+ // Implicit Field (recordLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
uint16_t recordLength = 0;
_res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &recordLength);
if(_res != OK) {
@@ -94,25 +94,29 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
plc4c_return_code _res = OK;
// Simple Field (referenceType)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, _message->reference_type);
+ uint8_t referenceType = _message->reference_type;
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, referenceType);
if(_res != OK) {
return _res;
}
// Simple Field (fileNumber)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->file_number);
+ uint16_t fileNumber = _message->file_number;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, fileNumber);
if(_res != OK) {
return _res;
}
// Simple Field (recordNumber)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->record_number);
+ uint16_t recordNumber = _message->record_number;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, recordNumber);
if(_res != OK) {
return _res;
}
- // Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (plc4c_spi_evaluation_helper_count(_message->record_data)) / (2));
+ // Implicit Field (recordLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint16_t recordLength = (plc4c_spi_evaluation_helper_count(_message->record_data)) / (2);
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, recordLength);
if(_res != OK) {
return _res;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
index 562d302..744703b 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
@@ -59,7 +59,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
}
(*_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)
+ // Implicit Field (recordLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
uint16_t recordLength = 0;
_res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &recordLength);
if(_res != OK) {
@@ -94,25 +94,29 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
plc4c_return_code _res = OK;
// Simple Field (referenceType)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, _message->reference_type);
+ uint8_t referenceType = _message->reference_type;
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, referenceType);
if(_res != OK) {
return _res;
}
// Simple Field (fileNumber)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->file_number);
+ uint16_t fileNumber = _message->file_number;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, fileNumber);
if(_res != OK) {
return _res;
}
// Simple Field (recordNumber)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->record_number);
+ uint16_t recordNumber = _message->record_number;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, recordNumber);
if(_res != OK) {
return _res;
}
- // Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (plc4c_spi_evaluation_helper_count(_message->record_data)) / (2));
+ // Implicit Field (recordLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint16_t recordLength = (plc4c_spi_evaluation_helper_count(_message->record_data)) / (2);
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, recordLength);
if(_res != OK) {
return _res;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_serial_adu.c b/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
index 8ac3027..b11bf0c 100644
--- a/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
+++ b/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
@@ -86,7 +86,8 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_serialize(plc4c_spi_
plc4c_return_code _res = OK;
// Simple Field (transactionId)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->transaction_id);
+ uint16_t transactionId = _message->transaction_id;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, transactionId);
if(_res != OK) {
return _res;
}
@@ -98,19 +99,22 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_serialize(plc4c_spi_
}
// Simple Field (length)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->length);
+ uint16_t length = _message->length;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, length);
if(_res != OK) {
return _res;
}
// Simple Field (address)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, _message->address);
+ uint8_t address = _message->address;
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, address);
if(_res != OK) {
return _res;
}
// Simple Field (pdu)
- _res = plc4c_modbus_read_write_modbus_pdu_serialize(writeBuffer, _message->pdu);
+ plc4c_modbus_read_write_modbus_pdu* pdu = _message->pdu;
+ _res = plc4c_modbus_read_write_modbus_pdu_serialize(writeBuffer, pdu);
if(_res != OK) {
return _res;
}
diff --git a/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c b/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
index 7ab8c40..98effc7 100644
--- a/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
+++ b/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
@@ -60,7 +60,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_bu
// throw new ParseException("Expected constant value " + PLC4C_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)
+ // Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
uint16_t length = 0;
_res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &length);
if(_res != OK) {
@@ -90,28 +90,33 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_serialize(plc4c_spi_wri
plc4c_return_code _res = OK;
// Simple Field (transactionIdentifier)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->transaction_identifier);
+ uint16_t transactionIdentifier = _message->transaction_identifier;
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, transactionIdentifier);
if(_res != OK) {
return _res;
}
// Const Field (protocolIdentifier)
- plc4c_spi_write_unsigned_short(writeBuffer, 16, PLC4C_MODBUS_READ_WRITE_MODBUS_TCP_ADU_PROTOCOL_IDENTIFIER());
+ uint16_t protocolIdentifier = PLC4C_MODBUS_READ_WRITE_MODBUS_TCP_ADU_PROTOCOL_IDENTIFIER();
+ plc4c_spi_write_unsigned_short(writeBuffer, 16, protocolIdentifier);
- // Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
- _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (plc4c_modbus_read_write_modbus_pdu_length_in_bytes(_message->pdu)) + (1));
+ // Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+ uint16_t length = (plc4c_modbus_read_write_modbus_pdu_length_in_bytes(_message->pdu)) + (1);
+ _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, length);
if(_res != OK) {
return _res;
}
// Simple Field (unitIdentifier)
- _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, _message->unit_identifier);
+ uint8_t unitIdentifier = _message->unit_identifier;
+ _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, unitIdentifier);
if(_res != OK) {
return _res;
}
// Simple Field (pdu)
- _res = plc4c_modbus_read_write_modbus_pdu_serialize(writeBuffer, _message->pdu);
+ plc4c_modbus_read_write_modbus_pdu* pdu = _message->pdu;
+ _res = plc4c_modbus_read_write_modbus_pdu_serialize(writeBuffer, pdu);
if(_res != OK) {
return _res;
}
diff --git a/plc4c/generated-sources/modbus/test/ParserSerializerTestsuite.c b/plc4c/generated-sources/modbus/test/ParserSerializerTestsuite.c
new file mode 100644
index 0000000..a489119
--- /dev/null
+++ b/plc4c/generated-sources/modbus/test/ParserSerializerTestsuite.c
@@ -0,0 +1,279 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+
+// Code generated by code-generation. DO NOT EDIT.
+
+#include <unity.h>
+
+#include "plc4c/spi/read_buffer.h"
+#include "plc4c/spi/write_buffer.h"
+
+#include "modbus_tcp_adu.h"
+
+
+void internal_assert_arrays_equal(uint8_t* expected_array, uint8_t* actual_array, uint8_t num_bytes);
+
+
+void parser_serializer_test_modbus_read_write_read_input_registers_request() {
+
+ uint8_t payload[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x04, 0x08, 0xd2, 0x00, 0x02
+ };
+ uint16_t payload_size = sizeof(payload);
+
+ // Create a new read_buffer instance
+ plc4c_spi_read_buffer* read_buffer;
+ plc4c_return_code return_code =
+ plc4c_spi_read_buffer_create(payload, payload_size, &read_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error creating read buffer");
+ }
+
+ plc4c_modbus_read_write_modbus_tcp_adu* message = NULL;
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_parse(read_buffer, false, &message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error error parsing tpkt packet");
+ }
+
+ plc4c_spi_write_buffer* write_buffer;
+ return_code = plc4c_spi_write_buffer_create(payload_size, &write_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error writing to buffer");
+ }
+
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_serialize(write_buffer, message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error serializing");
+ }
+
+ internal_assert_arrays_equal(payload, write_buffer->data, payload_size);
+
+ printf("Success");
+}
+
+void parser_serializer_test_modbus_read_write_read_input_registers_response() {
+
+ uint8_t payload[] = {
+ 0x7c, 0xfe, 0x00, 0x00, 0x00, 0xc9, 0xff, 0x04, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 [...]
+ };
+ uint16_t payload_size = sizeof(payload);
+
+ // Create a new read_buffer instance
+ plc4c_spi_read_buffer* read_buffer;
+ plc4c_return_code return_code =
+ plc4c_spi_read_buffer_create(payload, payload_size, &read_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error creating read buffer");
+ }
+
+ plc4c_modbus_read_write_modbus_tcp_adu* message = NULL;
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_parse(read_buffer, true, &message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error error parsing tpkt packet");
+ }
+
+ plc4c_spi_write_buffer* write_buffer;
+ return_code = plc4c_spi_write_buffer_create(payload_size, &write_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error writing to buffer");
+ }
+
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_serialize(write_buffer, message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error serializing");
+ }
+
+ internal_assert_arrays_equal(payload, write_buffer->data, payload_size);
+
+ printf("Success");
+}
+
+void parser_serializer_test_modbus_read_write_read_extended_registers_request_split_file_record() {
+
+ uint8_t payload[] = {
+ 0x00, 0x0a, 0x00, 0x00, 0x00, 0x11, 0x01, 0x14, 0x0e, 0x06, 0x00, 0x03, 0x27, 0x0e, 0x00, 0x02, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08
+ };
+ uint16_t payload_size = sizeof(payload);
+
+ // Create a new read_buffer instance
+ plc4c_spi_read_buffer* read_buffer;
+ plc4c_return_code return_code =
+ plc4c_spi_read_buffer_create(payload, payload_size, &read_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error creating read buffer");
+ }
+
+ plc4c_modbus_read_write_modbus_tcp_adu* message = NULL;
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_parse(read_buffer, false, &message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error error parsing tpkt packet");
+ }
+
+ plc4c_spi_write_buffer* write_buffer;
+ return_code = plc4c_spi_write_buffer_create(payload_size, &write_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error writing to buffer");
+ }
+
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_serialize(write_buffer, message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error serializing");
+ }
+
+ internal_assert_arrays_equal(payload, write_buffer->data, payload_size);
+
+ printf("Success");
+}
+
+void parser_serializer_test_modbus_read_write_read_extended_registers_response_split_file_record() {
+
+ uint8_t payload[] = {
+ 0x00, 0x0a, 0x00, 0x00, 0x00, 0x1b, 0x01, 0x14, 0x18, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x11, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+ uint16_t payload_size = sizeof(payload);
+
+ // Create a new read_buffer instance
+ plc4c_spi_read_buffer* read_buffer;
+ plc4c_return_code return_code =
+ plc4c_spi_read_buffer_create(payload, payload_size, &read_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error creating read buffer");
+ }
+
+ plc4c_modbus_read_write_modbus_tcp_adu* message = NULL;
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_parse(read_buffer, true, &message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error error parsing tpkt packet");
+ }
+
+ plc4c_spi_write_buffer* write_buffer;
+ return_code = plc4c_spi_write_buffer_create(payload_size, &write_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error writing to buffer");
+ }
+
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_serialize(write_buffer, message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error serializing");
+ }
+
+ internal_assert_arrays_equal(payload, write_buffer->data, payload_size);
+
+ printf("Success");
+}
+
+void parser_serializer_test_modbus_read_write_write_extended_registers_request_file_record() {
+
+ uint8_t payload[] = {
+ 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x15, 0x09, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08
+ };
+ uint16_t payload_size = sizeof(payload);
+
+ // Create a new read_buffer instance
+ plc4c_spi_read_buffer* read_buffer;
+ plc4c_return_code return_code =
+ plc4c_spi_read_buffer_create(payload, payload_size, &read_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error creating read buffer");
+ }
+
+ plc4c_modbus_read_write_modbus_tcp_adu* message = NULL;
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_parse(read_buffer, false, &message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error error parsing tpkt packet");
+ }
+
+ plc4c_spi_write_buffer* write_buffer;
+ return_code = plc4c_spi_write_buffer_create(payload_size, &write_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error writing to buffer");
+ }
+
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_serialize(write_buffer, message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error serializing");
+ }
+
+ internal_assert_arrays_equal(payload, write_buffer->data, payload_size);
+
+ printf("Success");
+}
+
+void parser_serializer_test_modbus_read_write_write_extended_registers_request_split_file_record() {
+
+ uint8_t payload[] = {
+ 0x00, 0x0a, 0x00, 0x00, 0x00, 0x15, 0x01, 0x15, 0x12, 0x06, 0x00, 0x01, 0x27, 0x0F, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00
+ };
+ uint16_t payload_size = sizeof(payload);
+
+ // Create a new read_buffer instance
+ plc4c_spi_read_buffer* read_buffer;
+ plc4c_return_code return_code =
+ plc4c_spi_read_buffer_create(payload, payload_size, &read_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error creating read buffer");
+ }
+
+ plc4c_modbus_read_write_modbus_tcp_adu* message = NULL;
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_parse(read_buffer, false, &message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error error parsing tpkt packet");
+ }
+
+ plc4c_spi_write_buffer* write_buffer;
+ return_code = plc4c_spi_write_buffer_create(payload_size, &write_buffer);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error writing to buffer");
+ }
+
+ return_code = plc4c_modbus_read_write_modbus_tcp_adu_serialize(write_buffer, message);
+ if (return_code != OK) {
+ TEST_FAIL_MESSAGE("Error serializing");
+ }
+
+ internal_assert_arrays_equal(payload, write_buffer->data, payload_size);
+
+ printf("Success");
+}
+
+
+
+void parser_serializer_test_modbus_read_write(void) {
+
+ RUN_TEST(
+ parser_serializer_test_modbus_read_write_read_input_registers_request);
+
+ RUN_TEST(
+ parser_serializer_test_modbus_read_write_read_input_registers_response);
+
+ RUN_TEST(
+ parser_serializer_test_modbus_read_write_read_extended_registers_request_split_file_record);
+
+ RUN_TEST(
+ parser_serializer_test_modbus_read_write_read_extended_registers_response_split_file_record);
+
+ RUN_TEST(
+ parser_serializer_test_modbus_read_write_write_extended_registers_request_file_record);
+
+ RUN_TEST(
+ parser_serializer_test_modbus_read_write_write_extended_registers_request_split_file_record);
+
+}
+
\ No newline at end of file
diff --git a/plc4c/generated-sources/s7/include/tpkt_packet.h b/plc4c/generated-sources/plc4x/include/plc4x_constants.h
similarity index 52%
copy from plc4c/generated-sources/s7/include/tpkt_packet.h
copy to plc4c/generated-sources/plc4x/include/plc4x_constants.h
index 9119348..a86416b 100644
--- a/plc4c/generated-sources/s7/include/tpkt_packet.h
+++ b/plc4c/generated-sources/plc4x/include/plc4x_constants.h
@@ -17,16 +17,15 @@
* under the License.
*/
-#ifndef PLC4C_S7_READ_WRITE_TPKT_PACKET_H_
-#define PLC4C_S7_READ_WRITE_TPKT_PACKET_H_
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_CONSTANTS_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_CONSTANTS_H_
#include <stdbool.h>
#include <stdint.h>
-#include <plc4c/driver_s7_static.h>
+#include <plc4c/driver_plc4x_static.h>
#include <plc4c/spi/read_buffer.h>
#include <plc4c/spi/write_buffer.h>
#include <plc4c/utils/list.h>
-#include "cotp_packet.h"
// Code generated by code-generation. DO NOT EDIT.
@@ -36,27 +35,25 @@ extern "C" {
// Constant values.
-uint8_t PLC4C_S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID();
+uint16_t PLC4C_PLC4X_READ_WRITE_PLC4X_CONSTANTS_PLC4X_TCP_DEFAULT_PORT();
-struct plc4c_s7_read_write_tpkt_packet {
+struct plc4c_plc4x_read_write_plc4x_constants {
/* Properties */
- uint8_t protocol_id;
- plc4c_s7_read_write_cotp_packet* payload;
};
-typedef struct plc4c_s7_read_write_tpkt_packet plc4c_s7_read_write_tpkt_packet;
+typedef struct plc4c_plc4x_read_write_plc4x_constants plc4c_plc4x_read_write_plc4x_constants;
// Create an empty NULL-struct
-plc4c_s7_read_write_tpkt_packet plc4c_s7_read_write_tpkt_packet_null();
+plc4c_plc4x_read_write_plc4x_constants plc4c_plc4x_read_write_plc4x_constants_null();
-plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* readBuffer, plc4c_s7_read_write_tpkt_packet** message);
+plc4c_return_code plc4c_plc4x_read_write_plc4x_constants_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_constants** message);
-plc4c_return_code plc4c_s7_read_write_tpkt_packet_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_s7_read_write_tpkt_packet* message);
+plc4c_return_code plc4c_plc4x_read_write_plc4x_constants_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_constants* message);
-uint16_t plc4c_s7_read_write_tpkt_packet_length_in_bytes(plc4c_s7_read_write_tpkt_packet* message);
+uint16_t plc4c_plc4x_read_write_plc4x_constants_length_in_bytes(plc4c_plc4x_read_write_plc4x_constants* message);
-uint16_t plc4c_s7_read_write_tpkt_packet_length_in_bits(plc4c_s7_read_write_tpkt_packet* message);
+uint16_t plc4c_plc4x_read_write_plc4x_constants_length_in_bits(plc4c_plc4x_read_write_plc4x_constants* message);
#ifdef __cplusplus
}
#endif
-#endif // PLC4C_S7_READ_WRITE_TPKT_PACKET_H_
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_CONSTANTS_H_
diff --git a/plc4c/generated-sources/s7/include/tpkt_packet.h b/plc4c/generated-sources/plc4x/include/plc4x_field.h
similarity index 53%
copy from plc4c/generated-sources/s7/include/tpkt_packet.h
copy to plc4c/generated-sources/plc4x/include/plc4x_field.h
index 9119348..3c253f2 100644
--- a/plc4c/generated-sources/s7/include/tpkt_packet.h
+++ b/plc4c/generated-sources/plc4x/include/plc4x_field.h
@@ -17,16 +17,15 @@
* under the License.
*/
-#ifndef PLC4C_S7_READ_WRITE_TPKT_PACKET_H_
-#define PLC4C_S7_READ_WRITE_TPKT_PACKET_H_
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_H_
#include <stdbool.h>
#include <stdint.h>
-#include <plc4c/driver_s7_static.h>
+#include <plc4c/driver_plc4x_static.h>
#include <plc4c/spi/read_buffer.h>
#include <plc4c/spi/write_buffer.h>
#include <plc4c/utils/list.h>
-#include "cotp_packet.h"
// Code generated by code-generation. DO NOT EDIT.
@@ -35,28 +34,25 @@ extern "C" {
#endif
-// Constant values.
-uint8_t PLC4C_S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID();
-
-struct plc4c_s7_read_write_tpkt_packet {
+struct plc4c_plc4x_read_write_plc4x_field {
/* Properties */
- uint8_t protocol_id;
- plc4c_s7_read_write_cotp_packet* payload;
+ char* name;
+ char* field_query;
};
-typedef struct plc4c_s7_read_write_tpkt_packet plc4c_s7_read_write_tpkt_packet;
+typedef struct plc4c_plc4x_read_write_plc4x_field plc4c_plc4x_read_write_plc4x_field;
// Create an empty NULL-struct
-plc4c_s7_read_write_tpkt_packet plc4c_s7_read_write_tpkt_packet_null();
+plc4c_plc4x_read_write_plc4x_field plc4c_plc4x_read_write_plc4x_field_null();
-plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* readBuffer, plc4c_s7_read_write_tpkt_packet** message);
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_field** message);
-plc4c_return_code plc4c_s7_read_write_tpkt_packet_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_s7_read_write_tpkt_packet* message);
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_field* message);
-uint16_t plc4c_s7_read_write_tpkt_packet_length_in_bytes(plc4c_s7_read_write_tpkt_packet* message);
+uint16_t plc4c_plc4x_read_write_plc4x_field_length_in_bytes(plc4c_plc4x_read_write_plc4x_field* message);
-uint16_t plc4c_s7_read_write_tpkt_packet_length_in_bits(plc4c_s7_read_write_tpkt_packet* message);
+uint16_t plc4c_plc4x_read_write_plc4x_field_length_in_bits(plc4c_plc4x_read_write_plc4x_field* message);
#ifdef __cplusplus
}
#endif
-#endif // PLC4C_S7_READ_WRITE_TPKT_PACKET_H_
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_H_
diff --git a/plc4c/generated-sources/s7/include/tpkt_packet.h b/plc4c/generated-sources/plc4x/include/plc4x_field_request.h
similarity index 51%
copy from plc4c/generated-sources/s7/include/tpkt_packet.h
copy to plc4c/generated-sources/plc4x/include/plc4x_field_request.h
index 9119348..d337aab 100644
--- a/plc4c/generated-sources/s7/include/tpkt_packet.h
+++ b/plc4c/generated-sources/plc4x/include/plc4x_field_request.h
@@ -17,16 +17,16 @@
* under the License.
*/
-#ifndef PLC4C_S7_READ_WRITE_TPKT_PACKET_H_
-#define PLC4C_S7_READ_WRITE_TPKT_PACKET_H_
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_REQUEST_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_REQUEST_H_
#include <stdbool.h>
#include <stdint.h>
-#include <plc4c/driver_s7_static.h>
+#include <plc4c/driver_plc4x_static.h>
#include <plc4c/spi/read_buffer.h>
#include <plc4c/spi/write_buffer.h>
#include <plc4c/utils/list.h>
-#include "cotp_packet.h"
+#include "plc4x_field.h"
// Code generated by code-generation. DO NOT EDIT.
@@ -35,28 +35,24 @@ extern "C" {
#endif
-// Constant values.
-uint8_t PLC4C_S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID();
-
-struct plc4c_s7_read_write_tpkt_packet {
+struct plc4c_plc4x_read_write_plc4x_field_request {
/* Properties */
- uint8_t protocol_id;
- plc4c_s7_read_write_cotp_packet* payload;
+ plc4c_plc4x_read_write_plc4x_field* field;
};
-typedef struct plc4c_s7_read_write_tpkt_packet plc4c_s7_read_write_tpkt_packet;
+typedef struct plc4c_plc4x_read_write_plc4x_field_request plc4c_plc4x_read_write_plc4x_field_request;
// Create an empty NULL-struct
-plc4c_s7_read_write_tpkt_packet plc4c_s7_read_write_tpkt_packet_null();
+plc4c_plc4x_read_write_plc4x_field_request plc4c_plc4x_read_write_plc4x_field_request_null();
-plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* readBuffer, plc4c_s7_read_write_tpkt_packet** message);
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_request_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_field_request** message);
-plc4c_return_code plc4c_s7_read_write_tpkt_packet_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_s7_read_write_tpkt_packet* message);
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_request_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_field_request* message);
-uint16_t plc4c_s7_read_write_tpkt_packet_length_in_bytes(plc4c_s7_read_write_tpkt_packet* message);
+uint16_t plc4c_plc4x_read_write_plc4x_field_request_length_in_bytes(plc4c_plc4x_read_write_plc4x_field_request* message);
-uint16_t plc4c_s7_read_write_tpkt_packet_length_in_bits(plc4c_s7_read_write_tpkt_packet* message);
+uint16_t plc4c_plc4x_read_write_plc4x_field_request_length_in_bits(plc4c_plc4x_read_write_plc4x_field_request* message);
#ifdef __cplusplus
}
#endif
-#endif // PLC4C_S7_READ_WRITE_TPKT_PACKET_H_
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_REQUEST_H_
diff --git a/plc4c/generated-sources/plc4x/include/plc4x_field_response.h b/plc4c/generated-sources/plc4x/include/plc4x_field_response.h
new file mode 100644
index 0000000..9e60b85
--- /dev/null
+++ b/plc4c/generated-sources/plc4x/include/plc4x_field_response.h
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_RESPONSE_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_RESPONSE_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <plc4c/driver_plc4x_static.h>
+#include <plc4c/spi/read_buffer.h>
+#include <plc4c/spi/write_buffer.h>
+#include <plc4c/utils/list.h>
+#include "plc4x_field.h"
+#include "plc4x_response_code.h"
+
+// Code generated by code-generation. DO NOT EDIT.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct plc4c_plc4x_read_write_plc4x_field_response {
+ /* Properties */
+ plc4c_plc4x_read_write_plc4x_field* field;
+ plc4c_plc4x_read_write_plc4x_response_code response_code;
+};
+typedef struct plc4c_plc4x_read_write_plc4x_field_response plc4c_plc4x_read_write_plc4x_field_response;
+
+// Create an empty NULL-struct
+plc4c_plc4x_read_write_plc4x_field_response plc4c_plc4x_read_write_plc4x_field_response_null();
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_response_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_field_response** message);
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_response_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_field_response* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_field_response_length_in_bytes(plc4c_plc4x_read_write_plc4x_field_response* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_field_response_length_in_bits(plc4c_plc4x_read_write_plc4x_field_response* message);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_RESPONSE_H_
diff --git a/plc4c/generated-sources/plc4x/include/plc4x_field_value_request.h b/plc4c/generated-sources/plc4x/include/plc4x_field_value_request.h
new file mode 100644
index 0000000..edc3a1f
--- /dev/null
+++ b/plc4c/generated-sources/plc4x/include/plc4x_field_value_request.h
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_VALUE_REQUEST_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_VALUE_REQUEST_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <plc4c/driver_plc4x_static.h>
+#include <plc4c/spi/read_buffer.h>
+#include <plc4c/spi/write_buffer.h>
+#include <plc4c/utils/list.h>
+#include "plc4x_field.h"
+#include "plc4x_value_type.h"
+#include "plc4x_value.h"
+
+// Code generated by code-generation. DO NOT EDIT.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct plc4c_plc4x_read_write_plc4x_field_value_request {
+ /* Properties */
+ plc4c_plc4x_read_write_plc4x_field* field;
+ plc4c_plc4x_read_write_plc4x_value_type value_type;
+ plc4c_data* value;
+};
+typedef struct plc4c_plc4x_read_write_plc4x_field_value_request plc4c_plc4x_read_write_plc4x_field_value_request;
+
+// Create an empty NULL-struct
+plc4c_plc4x_read_write_plc4x_field_value_request plc4c_plc4x_read_write_plc4x_field_value_request_null();
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_value_request_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_field_value_request** message);
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_value_request_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_field_value_request* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_field_value_request_length_in_bytes(plc4c_plc4x_read_write_plc4x_field_value_request* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_field_value_request_length_in_bits(plc4c_plc4x_read_write_plc4x_field_value_request* message);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_VALUE_REQUEST_H_
diff --git a/plc4c/generated-sources/plc4x/include/plc4x_field_value_response.h b/plc4c/generated-sources/plc4x/include/plc4x_field_value_response.h
new file mode 100644
index 0000000..48d8f14
--- /dev/null
+++ b/plc4c/generated-sources/plc4x/include/plc4x_field_value_response.h
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_VALUE_RESPONSE_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_VALUE_RESPONSE_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <plc4c/driver_plc4x_static.h>
+#include <plc4c/spi/read_buffer.h>
+#include <plc4c/spi/write_buffer.h>
+#include <plc4c/utils/list.h>
+#include "plc4x_field.h"
+#include "plc4x_response_code.h"
+#include "plc4x_value_type.h"
+#include "plc4x_value.h"
+
+// Code generated by code-generation. DO NOT EDIT.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct plc4c_plc4x_read_write_plc4x_field_value_response {
+ /* Properties */
+ plc4c_plc4x_read_write_plc4x_field* field;
+ plc4c_plc4x_read_write_plc4x_response_code response_code;
+ plc4c_plc4x_read_write_plc4x_value_type value_type;
+ plc4c_data* value;
+};
+typedef struct plc4c_plc4x_read_write_plc4x_field_value_response plc4c_plc4x_read_write_plc4x_field_value_response;
+
+// Create an empty NULL-struct
+plc4c_plc4x_read_write_plc4x_field_value_response plc4c_plc4x_read_write_plc4x_field_value_response_null();
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_value_response_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_field_value_response** message);
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_field_value_response_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_field_value_response* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_field_value_response_length_in_bytes(plc4c_plc4x_read_write_plc4x_field_value_response* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_field_value_response_length_in_bits(plc4c_plc4x_read_write_plc4x_field_value_response* message);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_FIELD_VALUE_RESPONSE_H_
diff --git a/plc4c/generated-sources/plc4x/include/plc4x_message.h b/plc4c/generated-sources/plc4x/include/plc4x_message.h
new file mode 100644
index 0000000..7430b5a
--- /dev/null
+++ b/plc4c/generated-sources/plc4x/include/plc4x_message.h
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_MESSAGE_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_MESSAGE_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <plc4c/driver_plc4x_static.h>
+#include <plc4c/spi/read_buffer.h>
+#include <plc4c/spi/write_buffer.h>
+#include <plc4c/utils/list.h>
+#include "plc4x_field_value_response.h"
+#include "plc4x_response_code.h"
+#include "plc4x_field_response.h"
+#include "plc4x_field_request.h"
+#include "plc4x_field_value_request.h"
+#include "plc4x_request_type.h"
+
+// Code generated by code-generation. DO NOT EDIT.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+// Structure used to contain the discriminator values for discriminated types using this as a parent
+struct plc4c_plc4x_read_write_plc4x_message_discriminator {
+ enum plc4c_plc4x_read_write_plc4x_request_type requestType;
+};
+typedef struct plc4c_plc4x_read_write_plc4x_message_discriminator plc4c_plc4x_read_write_plc4x_message_discriminator;
+
+// Enum assigning each sub-type an individual id.
+enum plc4c_plc4x_read_write_plc4x_message_type {
+ plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_connect_request = 0,
+ plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_connect_response = 1,
+ plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_read_request = 2,
+ plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_read_response = 3,
+ plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_write_request = 4,
+ plc4c_plc4x_read_write_plc4x_message_type_plc4c_plc4x_read_write_plc4x_write_response = 5};
+typedef enum plc4c_plc4x_read_write_plc4x_message_type plc4c_plc4x_read_write_plc4x_message_type;
+
+// Function to get the discriminator values for a given type.
+plc4c_plc4x_read_write_plc4x_message_discriminator plc4c_plc4x_read_write_plc4x_message_get_discriminator(plc4c_plc4x_read_write_plc4x_message_type type);
+
+// Constant values.
+uint8_t PLC4C_PLC4X_READ_WRITE_PLC4X_MESSAGE_VERSION();
+
+struct plc4c_plc4x_read_write_plc4x_message {
+ /* This is an abstract type so this property saves the type of this typed union */
+ plc4c_plc4x_read_write_plc4x_message_type _type;
+ /* Properties */
+ uint16_t request_id;
+ union {
+ struct { /* Plc4xConnectRequest */
+ char* plc4x_connect_request_connection_string;
+ };
+ struct { /* Plc4xConnectResponse */
+ uint16_t plc4x_connect_response_connection_id;
+ plc4c_plc4x_read_write_plc4x_response_code plc4x_connect_response_response_code;
+ };
+ struct { /* Plc4xReadRequest */
+ uint16_t plc4x_read_request_connection_id;
+ plc4c_list* plc4x_read_request_fields;
+ };
+ struct { /* Plc4xReadResponse */
+ uint16_t plc4x_read_response_connection_id;
+ plc4c_plc4x_read_write_plc4x_response_code plc4x_read_response_response_code;
+ plc4c_list* plc4x_read_response_fields;
+ };
+ struct { /* Plc4xWriteRequest */
+ uint16_t plc4x_write_request_connection_id;
+ plc4c_list* plc4x_write_request_fields;
+ };
+ struct { /* Plc4xWriteResponse */
+ uint16_t plc4x_write_response_connection_id;
+ plc4c_plc4x_read_write_plc4x_response_code plc4x_write_response_response_code;
+ plc4c_list* plc4x_write_response_fields;
+ };
+ };
+};
+typedef struct plc4c_plc4x_read_write_plc4x_message plc4c_plc4x_read_write_plc4x_message;
+
+// Create an empty NULL-struct
+plc4c_plc4x_read_write_plc4x_message plc4c_plc4x_read_write_plc4x_message_null();
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_message_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_message** message);
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_message_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_message* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_message_length_in_bytes(plc4c_plc4x_read_write_plc4x_message* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_message_length_in_bits(plc4c_plc4x_read_write_plc4x_message* message);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_MESSAGE_H_
diff --git a/plc4c/generated-sources/plc4x/include/plc4x_request_type.h b/plc4c/generated-sources/plc4x/include/plc4x_request_type.h
new file mode 100644
index 0000000..13b3d75
--- /dev/null
+++ b/plc4c/generated-sources/plc4x/include/plc4x_request_type.h
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_REQUEST_TYPE_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_REQUEST_TYPE_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <plc4c/driver_plc4x_static.h>
+#include <plc4c/spi/read_buffer.h>
+#include <plc4c/spi/write_buffer.h>
+
+// Code generated by code-generation. DO NOT EDIT.
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum plc4c_plc4x_read_write_plc4x_request_type {
+ plc4c_plc4x_read_write_plc4x_request_type_CONNECT_REQUEST = 0x01,
+ plc4c_plc4x_read_write_plc4x_request_type_CONNECT_RESPONSE = 0x02,
+ plc4c_plc4x_read_write_plc4x_request_type_DISCONNECT_REQUEST = 0x03,
+ plc4c_plc4x_read_write_plc4x_request_type_DISCONNECT_RESPONSE = 0x04,
+ plc4c_plc4x_read_write_plc4x_request_type_READ_REQUEST = 0x05,
+ plc4c_plc4x_read_write_plc4x_request_type_READ_RESPONSE = 0x06,
+ plc4c_plc4x_read_write_plc4x_request_type_WRITE_REQUEST = 0x07,
+ plc4c_plc4x_read_write_plc4x_request_type_WRITE_RESPONSE = 0x08,
+ plc4c_plc4x_read_write_plc4x_request_type_SUBSCRIPTION_REQUEST = 0x09,
+ plc4c_plc4x_read_write_plc4x_request_type_SUBSCRIPTION_RESPONSE = 0x0A,
+ plc4c_plc4x_read_write_plc4x_request_type_UNSUBSCRIPTION_REQUEST = 0x0B,
+ plc4c_plc4x_read_write_plc4x_request_type_UNSUBSCRIPTION_RESPONSE = 0x0C
+};
+typedef enum plc4c_plc4x_read_write_plc4x_request_type plc4c_plc4x_read_write_plc4x_request_type;
+
+// Get an empty NULL-struct
+plc4c_plc4x_read_write_plc4x_request_type plc4c_plc4x_read_write_plc4x_request_type_null();
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_request_type_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_request_type* message);
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_request_type_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_request_type* message);
+
+plc4c_plc4x_read_write_plc4x_request_type plc4c_plc4x_read_write_plc4x_request_type_for_value(uint8_t value);
+
+plc4c_plc4x_read_write_plc4x_request_type plc4c_plc4x_read_write_plc4x_request_type_value_of(char* value_string);
+
+int plc4c_plc4x_read_write_plc4x_request_type_num_values();
+
+plc4c_plc4x_read_write_plc4x_request_type plc4c_plc4x_read_write_plc4x_request_type_value_for_index(int index);
+
+uint16_t plc4c_plc4x_read_write_plc4x_request_type_length_in_bytes(plc4c_plc4x_read_write_plc4x_request_type* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_request_type_length_in_bits(plc4c_plc4x_read_write_plc4x_request_type* message);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_REQUEST_TYPE_H_
diff --git a/plc4c/generated-sources/plc4x/include/plc4x_response_code.h b/plc4c/generated-sources/plc4x/include/plc4x_response_code.h
new file mode 100644
index 0000000..e1b3c53
--- /dev/null
+++ b/plc4c/generated-sources/plc4x/include/plc4x_response_code.h
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_RESPONSE_CODE_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_RESPONSE_CODE_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <plc4c/driver_plc4x_static.h>
+#include <plc4c/spi/read_buffer.h>
+#include <plc4c/spi/write_buffer.h>
+
+// Code generated by code-generation. DO NOT EDIT.
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum plc4c_plc4x_read_write_plc4x_response_code {
+ plc4c_plc4x_read_write_plc4x_response_code_OK = 0x01,
+ plc4c_plc4x_read_write_plc4x_response_code_NOT_FOUND = 0x02,
+ plc4c_plc4x_read_write_plc4x_response_code_ACCESS_DENIED = 0x03,
+ plc4c_plc4x_read_write_plc4x_response_code_INVALID_ADDRESS = 0x04,
+ plc4c_plc4x_read_write_plc4x_response_code_INVALID_DATATYPE = 0x06,
+ plc4c_plc4x_read_write_plc4x_response_code_INVALID_DATA = 0x07,
+ plc4c_plc4x_read_write_plc4x_response_code_INTERNAL_ERROR = 0x08,
+ plc4c_plc4x_read_write_plc4x_response_code_REMOTE_BUSY = 0x09,
+ plc4c_plc4x_read_write_plc4x_response_code_REMOTE_ERROR = 0x0A,
+ plc4c_plc4x_read_write_plc4x_response_code_UNSUPPORTED = 0x0B,
+ plc4c_plc4x_read_write_plc4x_response_code_RESPONSE_PENDING = 0x0C
+};
+typedef enum plc4c_plc4x_read_write_plc4x_response_code plc4c_plc4x_read_write_plc4x_response_code;
+
+// Get an empty NULL-struct
+plc4c_plc4x_read_write_plc4x_response_code plc4c_plc4x_read_write_plc4x_response_code_null();
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_response_code_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_response_code* message);
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_response_code_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_response_code* message);
+
+plc4c_plc4x_read_write_plc4x_response_code plc4c_plc4x_read_write_plc4x_response_code_for_value(uint8_t value);
+
+plc4c_plc4x_read_write_plc4x_response_code plc4c_plc4x_read_write_plc4x_response_code_value_of(char* value_string);
+
+int plc4c_plc4x_read_write_plc4x_response_code_num_values();
+
+plc4c_plc4x_read_write_plc4x_response_code plc4c_plc4x_read_write_plc4x_response_code_value_for_index(int index);
+
+uint16_t plc4c_plc4x_read_write_plc4x_response_code_length_in_bytes(plc4c_plc4x_read_write_plc4x_response_code* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_response_code_length_in_bits(plc4c_plc4x_read_write_plc4x_response_code* message);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_RESPONSE_CODE_H_
diff --git a/plc4c/generated-sources/plc4x/include/plc4x_return_code.h b/plc4c/generated-sources/plc4x/include/plc4x_return_code.h
new file mode 100644
index 0000000..3ab2176
--- /dev/null
+++ b/plc4c/generated-sources/plc4x/include/plc4x_return_code.h
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_RETURN_CODE_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_RETURN_CODE_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <plc4c/driver_plc4x_static.h>
+#include <plc4c/spi/read_buffer.h>
+#include <plc4c/spi/write_buffer.h>
+
+// Code generated by code-generation. DO NOT EDIT.
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum plc4c_plc4x_read_write_plc4x_return_code {
+ plc4c_plc4x_read_write_plc4x_return_code_OK = 0x01,
+ plc4c_plc4x_read_write_plc4x_return_code_NOT_FOUND = 0x02,
+ plc4c_plc4x_read_write_plc4x_return_code_ACCESS_DENIED = 0x03,
+ plc4c_plc4x_read_write_plc4x_return_code_INVALID_ADDRESS = 0x04,
+ plc4c_plc4x_read_write_plc4x_return_code_INVALID_DATATYPE = 0x05,
+ plc4c_plc4x_read_write_plc4x_return_code_INVALID_DATA = 0x06,
+ plc4c_plc4x_read_write_plc4x_return_code_INTERNAL_ERROR = 0x07,
+ plc4c_plc4x_read_write_plc4x_return_code_REMOTE_BUSY = 0x08,
+ plc4c_plc4x_read_write_plc4x_return_code_REMOTE_ERROR = 0x09,
+ plc4c_plc4x_read_write_plc4x_return_code_UNSUPPORTED = 0x0A,
+ plc4c_plc4x_read_write_plc4x_return_code_RESPONSE_PENDING = 0x0B
+};
+typedef enum plc4c_plc4x_read_write_plc4x_return_code plc4c_plc4x_read_write_plc4x_return_code;
+
+// Get an empty NULL-struct
+plc4c_plc4x_read_write_plc4x_return_code plc4c_plc4x_read_write_plc4x_return_code_null();
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_return_code_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_return_code* message);
+
+plc4c_return_code plc4c_plc4x_read_write_plc4x_return_code_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_plc4x_read_write_plc4x_return_code* message);
+
+plc4c_plc4x_read_write_plc4x_return_code plc4c_plc4x_read_write_plc4x_return_code_for_value(uint8_t value);
+
+plc4c_plc4x_read_write_plc4x_return_code plc4c_plc4x_read_write_plc4x_return_code_value_of(char* value_string);
+
+int plc4c_plc4x_read_write_plc4x_return_code_num_values();
+
+plc4c_plc4x_read_write_plc4x_return_code plc4c_plc4x_read_write_plc4x_return_code_value_for_index(int index);
+
+uint16_t plc4c_plc4x_read_write_plc4x_return_code_length_in_bytes(plc4c_plc4x_read_write_plc4x_return_code* message);
+
+uint16_t plc4c_plc4x_read_write_plc4x_return_code_length_in_bits(plc4c_plc4x_read_write_plc4x_return_code* message);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_RETURN_CODE_H_
diff --git a/plc4c/generated-sources/modbus/include/data_item.h b/plc4c/generated-sources/plc4x/include/plc4x_value.h
similarity index 58%
copy from plc4c/generated-sources/modbus/include/data_item.h
copy to plc4c/generated-sources/plc4x/include/plc4x_value.h
index 87a5f69..318d877 100644
--- a/plc4c/generated-sources/modbus/include/data_item.h
+++ b/plc4c/generated-sources/plc4x/include/plc4x_value.h
@@ -16,16 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-#ifndef PLC4C_MODBUS_READ_WRITE_DATA_ITEM_H_
-#define PLC4C_MODBUS_READ_WRITE_DATA_ITEM_H_
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_VALUE_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_VALUE_H_
#include <stdbool.h>
#include <stdint.h>
-#include <plc4c/driver_modbus_static.h>
+#include <plc4c/driver_plc4x_static.h>
#include <plc4c/spi/read_buffer.h>
#include <plc4c/spi/write_buffer.h>
#include <plc4c/utils/list.h>
-#include "modbus_data_type.h"
+#include "plc4x_value_type.h"
// Code generated by code-generation. DO NOT EDIT.
@@ -33,15 +33,15 @@
extern "C" {
#endif
-plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, plc4c_modbus_read_write_modbus_data_type dataType, uint16_t numberOfValues, plc4c_data** data_item);
+plc4c_return_code plc4c_plc4x_read_write_plc4x_value_parse(plc4c_spi_read_buffer* readBuffer, plc4c_plc4x_read_write_plc4x_value_type valueType, plc4c_data** data_item);
-plc4c_return_code plc4c_modbus_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data** data_item);
+plc4c_return_code plc4c_plc4x_read_write_plc4x_value_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_data* data_item);
-uint16_t plc4c_modbus_read_write_data_item_length_in_bytes(plc4c_data* data_item);
+uint16_t plc4c_plc4x_read_write_plc4x_value_length_in_bytes(plc4c_data* _value, plc4c_plc4x_read_write_plc4x_value_type valueType);
-uint16_t plc4c_modbus_read_write_data_item_length_in_bits(plc4c_data* data_item);
+uint16_t plc4c_plc4x_read_write_plc4x_value_length_in_bits(plc4c_data* _value, plc4c_plc4x_read_write_plc4x_value_type valueType);
#ifdef __cplusplus
}
#endif
-#endif // PLC4C_MODBUS_READ_WRITE_DATA_ITEM_H_
+#endif // PLC4C_PLC4X_READ_WRITE_PLC4X_VALUE_H_
diff --git a/plc4c/generated-sources/plc4x/include/plc4x_value_type.h b/plc4c/generated-sources/plc4x/include/plc4x_value_type.h
new file mode 100644
index 0000000..d44cd09
--- /dev/null
+++ b/plc4c/generated-sources/plc4x/include/plc4x_value_type.h
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef PLC4C_PLC4X_READ_WRITE_PLC4X_VALUE_TYPE_H_
+#define PLC4C_PLC4X_READ_WRITE_PLC4X_VALUE_TYPE_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <plc4c/driver_plc4x_static.h>
+#include <plc4c/spi/read_buffer.h>
+#include <plc4c/spi/write_buffer.h>
+
+// Code generated by code-generation. DO NOT EDIT.
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum plc4c_plc4x_read_write_plc4x_value_type {
+ plc4c_plc4x_read_write_plc4x_value_type_NULL = 0x00,
+ plc4c_plc4x_read_write_plc4x_value_type_BOOL = 0x01,
+ plc4c_plc4x_read_write_plc4x_value_type_BYTE = 0x02,
+ plc4c_plc4x_read_write_plc4x_value_type_WORD = 0x03,
+ plc4c_plc4x_read_write_plc4x_value_type_DWORD = 0x04,
+ plc4c_plc4x_read_write_plc4x_value_type_USINT = 0x11,
+ plc4c_plc4x_read_write_plc4x_value_type_UINT = 0x12,
+ plc4c_plc4x_read_write_plc4x_value_type_UDINT = 0x13,
+ plc4c_plc4x_read_write_plc4x_value_type_ULINT = 0x14,
+ plc4c_plc4x_read_write_plc4x_value_type_SINT = 0x21,
... 12052 lines suppressed ...