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 2021/01/31 11:20:57 UTC
[plc4x] 45/45: PLC4X-276 - [S7] The most of the supported types
don't work correctly - Fixed this by extending the syntax for enum fields
to allow providing a "field name" to use for serialization/deserialization
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/plc4c
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 6fc4b9430cc0f20723ce168aa3babc9e88509660
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sun Jan 31 12:17:45 2021 +0100
PLC4X-276 - [S7] The most of the supported types don't work correctly
- Fixed this by extending the syntax for enum fields to allow providing a "field name" to use for serialization/deserialization
NO JIRA:
- Continued working on getting more of the S7 datatypes working in the PLC4C S7 driver (All except the temporal types now work)
---
.../BaseFreemarkerLanguageTemplateHelper.java | 144 ++--
.../resources/templates/c/enum-template-c.ftlh | 21 +
.../resources/templates/c/enum-template-h.ftlh | 1 +
.../resources/templates/c/pojo-template-c.ftlh | 18 +
.../resources/templates/java/enum-template.ftlh | 21 +
.../main/resources/templates/java/io-template.ftlh | 8 +
.../plugins/codegenerator/language/mspec/MSpec.g4 | 2 +-
.../mspec/model/fields/DefaultEnumField.java | 8 +-
.../mspec/parser/MessageFormatListener.java | 22 +-
.../plc4go/s7/readwrite/model/TransportSize.go | 811 +++++++++++++++++----
.../s7/src/main/resources/protocols/s7/s7.mspec | 2 +-
sandbox/plc4c/api/include/plc4c/data.h | 2 +-
sandbox/plc4c/drivers/s7/src/driver_s7.c | 67 +-
.../plc4c/drivers/s7/src/driver_s7_encode_decode.c | 6 +-
sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c | 5 +
.../plc4c/examples/hello-world/src/hello_world.c | 62 +-
.../modbus/include/modbus_data_type_sizes.h | 1 +
.../modbus/src/modbus_data_type_sizes.c | 20 +
.../generated-sources/s7/include/cotp_tpdu_size.h | 1 +
.../s7/include/data_transport_size.h | 1 +
.../generated-sources/s7/include/memory_area.h | 1 +
.../generated-sources/s7/include/transport_size.h | 11 +
.../generated-sources/s7/src/cotp_tpdu_size.c | 29 +
.../generated-sources/s7/src/data_transport_size.c | 14 +
.../plc4c/generated-sources/s7/src/memory_area.c | 30 +
.../plc4c/generated-sources/s7/src/s7_address.c | 12 +-
.../generated-sources/s7/src/transport_size.c | 281 +++++++
sandbox/plc4c/pom.xml | 2 +-
sandbox/plc4c/spi/src/data.c | 29 +-
29 files changed, 1362 insertions(+), 270 deletions(-)
diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index bd767b2..cce146b 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -43,6 +43,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
// As they should be shared over all language template implementations,
// these are defined here manually.
private static Map<String, SimpleTypeReference> builtInFields;
+
{
builtInFields = new HashMap<>();
builtInFields.put("curPos", new SimpleTypeReference() {
@@ -180,7 +181,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
// If this is a subtype of a discriminated type, we have to add a reference to the parent type.
if (baseType instanceof DiscriminatedComplexTypeDefinition) {
DiscriminatedComplexTypeDefinition discriminatedComplexTypeDefinition = (DiscriminatedComplexTypeDefinition) baseType;
- if(!discriminatedComplexTypeDefinition.isAbstract()) {
+ if (!discriminatedComplexTypeDefinition.isAbstract()) {
complexTypeReferences.add(((ComplexTypeReference)
discriminatedComplexTypeDefinition.getParentType().getTypeReference()).getName());
}
@@ -190,13 +191,13 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
if (baseType instanceof ComplexTypeDefinition) {
ComplexTypeDefinition complexTypeDefinition = (ComplexTypeDefinition) baseType;
for (Field field : complexTypeDefinition.getFields()) {
- if(field instanceof PropertyField) {
+ if (field instanceof PropertyField) {
PropertyField propertyField = (PropertyField) field;
if (propertyField.getType() instanceof ComplexTypeReference) {
ComplexTypeReference complexTypeReference = (ComplexTypeReference) propertyField.getType();
complexTypeReferences.add(complexTypeReference.getName());
}
- } else if(field instanceof SwitchField) {
+ } else if (field instanceof SwitchField) {
SwitchField switchField = (SwitchField) field;
for (DiscriminatedComplexTypeDefinition switchCase : switchField.getCases()) {
complexTypeReferences.addAll(getComplexTypeReferences(switchCase));
@@ -215,7 +216,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
}
// If the type has any parser arguments, these have to be checked too.
- if(baseType.getParserArguments() != null) {
+ if (baseType.getParserArguments() != null) {
for (Argument parserArgument : baseType.getParserArguments()) {
if (parserArgument.getType() instanceof ComplexTypeReference) {
ComplexTypeReference complexTypeReference = (ComplexTypeReference) parserArgument.getType();
@@ -229,19 +230,19 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
/**
* Little helper to return the type of a given property.
*
- * @param baseType base type definition that contains the given property.
+ * @param baseType base type definition that contains the given property.
* @param propertyName name of the property
* @return the type reference of the given property
*/
public Optional<TypeReference> getTypeReferenceForProperty(ComplexTypeDefinition baseType, String propertyName) {
// If this is a built-in type, use that.
- if(builtInFields.containsKey(propertyName)) {
+ if (builtInFields.containsKey(propertyName)) {
return Optional.of(builtInFields.get(propertyName));
}
// Check if the expression root is referencing a field
final Optional<PropertyField> propertyFieldOptional = baseType.getPropertyFields().stream().filter(
propertyField -> propertyField.getName().equals(propertyName)).findFirst();
- if(propertyFieldOptional.isPresent()) {
+ if (propertyFieldOptional.isPresent()) {
final PropertyField propertyField = propertyFieldOptional.get();
return Optional.of(propertyField.getType());
}
@@ -249,12 +250,12 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
final Optional<ImplicitField> implicitFieldOptional = baseType.getFields().stream().filter(
field -> field instanceof ImplicitField).map(field -> (ImplicitField) field).filter(
implicitField -> implicitField.getName().equals(propertyName)).findFirst();
- if(implicitFieldOptional.isPresent()) {
+ if (implicitFieldOptional.isPresent()) {
final ImplicitField implicitField = implicitFieldOptional.get();
return Optional.of(implicitField.getType());
}
// Check if the expression root is referencing an argument
- if(baseType.getParserArguments() != null) {
+ if (baseType.getParserArguments() != null) {
final Optional<Argument> argumentOptional = Arrays.stream(baseType.getParserArguments()).filter(
argument -> argument.getName().equals(propertyName)).findFirst();
if (argumentOptional.isPresent()) {
@@ -267,7 +268,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
final Optional<DiscriminatorField> discriminatorFieldOptional = baseType.getFields().stream().filter(
field -> field instanceof DiscriminatorField).map(field -> (DiscriminatorField) field).filter(
discriminatorField -> discriminatorField.getName().equals(propertyName)).findFirst();
- if(discriminatorFieldOptional.isPresent()) {
+ if (discriminatorFieldOptional.isPresent()) {
final DiscriminatorField discriminatorField = discriminatorFieldOptional.get();
return Optional.of(discriminatorField.getType());
}
@@ -286,10 +287,10 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
ComplexTypeReference complexTypeReference = (ComplexTypeReference) typeReference;
final TypeDefinition typeDefinition = types.get(complexTypeReference.getName());
- if(typeDefinition == null) {
+ if (typeDefinition == null) {
throw new RuntimeException("Couldn't find given enum type definition with name " + complexTypeReference.getName());
}
- if(!(typeDefinition instanceof EnumTypeDefinition)) {
+ if (!(typeDefinition instanceof EnumTypeDefinition)) {
throw new RuntimeException("Referenced type with name " + complexTypeReference.getName() + " is not an enum type");
}
EnumTypeDefinition enumTypeDefinition = (EnumTypeDefinition) typeDefinition;
@@ -302,8 +303,8 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
**********************************************************************************/
public boolean hasFieldOfType(String fieldTypeName) {
- if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
- return ((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field -> field.getTypeName().equals(fieldTypeName));
+ if (getThisTypeDefinition() instanceof ComplexTypeDefinition) {
+ return ((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field -> field.getTypeName().equals(fieldTypeName));
}
return false;
}
@@ -312,14 +313,14 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
for (String name : names) {
boolean foundName = false;
for (Field field : fields) {
- if(field instanceof NamedField) {
- if(name.equals(((NamedField) field).getName())) {
+ if (field instanceof NamedField) {
+ if (name.equals(((NamedField) field).getName())) {
foundName = true;
break;
}
}
}
- if(!foundName) {
+ if (!foundName) {
return false;
}
}
@@ -327,7 +328,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public Field getFieldForNameFromCurrentOrParent(String fieldName) {
- if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
+ if (getThisTypeDefinition() instanceof ComplexTypeDefinition) {
return ((ComplexTypeDefinition) getThisTypeDefinition()).getAllPropertyFields()
.stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
}
@@ -335,7 +336,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public Field getFieldForNameFromCurrent(String fieldName) {
- if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
+ if (getThisTypeDefinition() instanceof ComplexTypeDefinition) {
return ((ComplexTypeDefinition) getThisTypeDefinition()).getPropertyFields()
.stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
}
@@ -363,12 +364,12 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public boolean isEnumField(Field field) {
- if(field instanceof TypedField) {
+ if (field instanceof TypedField) {
TypedField typedField = (TypedField) field;
TypeReference typeReference = typedField.getType();
- if(!isSimpleTypeReference(typeReference)) {
+ if (!isSimpleTypeReference(typeReference)) {
TypeDefinition typeDefinition = getTypeDefinitionForTypeReference(typedField.getType());
- if(typeDefinition instanceof EnumTypeDefinition) {
+ if (typeDefinition instanceof EnumTypeDefinition) {
return true;
}
}
@@ -421,11 +422,11 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public boolean isCountArrayField(Field field) {
- if(field instanceof ArrayField) {
+ if (field instanceof ArrayField) {
ArrayField arrayField = (ArrayField) field;
return arrayField.getLoopType() == ArrayField.LoopType.COUNT;
}
- if(field instanceof ManualArrayField) {
+ if (field instanceof ManualArrayField) {
ManualArrayField arrayField = (ManualArrayField) field;
return arrayField.getLoopType() == ManualArrayField.LoopType.COUNT;
}
@@ -433,11 +434,11 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public boolean isLengthArrayField(Field field) {
- if(field instanceof ArrayField) {
+ if (field instanceof ArrayField) {
ArrayField arrayField = (ArrayField) field;
return arrayField.getLoopType() == ArrayField.LoopType.LENGTH;
}
- if(field instanceof ManualArrayField) {
+ if (field instanceof ManualArrayField) {
ManualArrayField arrayField = (ManualArrayField) field;
return arrayField.getLoopType() == ManualArrayField.LoopType.LENGTH;
}
@@ -445,11 +446,11 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public boolean isTerminatedArrayField(Field field) {
- if(field instanceof ArrayField) {
+ if (field instanceof ArrayField) {
ArrayField arrayField = (ArrayField) field;
return arrayField.getLoopType() == ArrayField.LoopType.TERMINATED;
}
- if(field instanceof ManualArrayField) {
+ if (field instanceof ManualArrayField) {
ManualArrayField arrayField = (ManualArrayField) field;
return arrayField.getLoopType() == ManualArrayField.LoopType.TERMINATED;
}
@@ -481,7 +482,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public Collection<Field> getPropertyAndSwitchFields(TypeDefinition typeDefinition) {
- if(thisType instanceof ComplexTypeDefinition) {
+ if (thisType instanceof ComplexTypeDefinition) {
return ((ComplexTypeDefinition) thisType).getFields().stream().filter(
field -> (field instanceof PropertyField) || (field instanceof SwitchField)).collect(Collectors.toList());
}
@@ -509,7 +510,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public TypeDefinition getTypeDefinitionForTypeReference(TypeReference typeReference) {
- if(!(typeReference instanceof ComplexTypeReference)) {
+ if (!(typeReference instanceof ComplexTypeReference)) {
throw new RuntimeException("Type reference must be a complex type reference");
}
return getTypeDefinitions().get(((ComplexTypeReference) typeReference).getName());
@@ -623,11 +624,12 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
/**
* Get an ordered list of generated names for the discriminators.
* These names can be used to access the type definitions as well as well as the values.
+ *
* @return list of symbolic names for the discriminators.
*/
public List<String> getDiscriminatorNames() {
TypeDefinition baseType = thisType;
- if(thisType.getParentType() != null) {
+ if (thisType.getParentType() != null) {
baseType = thisType.getParentType();
}
final SwitchField switchField = getSwitchField(baseType);
@@ -642,6 +644,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
* Check if there's any field with the given name.
* This is required to suppress the generation of a discriminator field
* in case a named field is providing the information.
+ *
* @param discriminatorName name of the discriminator name
* @return true if a field with the given name already exists in the same type.
*/
@@ -652,31 +655,32 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
/**
* Converts a given discriminator description into a symbolic name.
+ *
* @param discriminatorExpression discriminator expression
* @return name
*/
public String getDiscriminatorName(Term discriminatorExpression) {
- if(discriminatorExpression instanceof Literal) {
+ if (discriminatorExpression instanceof Literal) {
Literal literal = (Literal) discriminatorExpression;
- if(literal instanceof NullLiteral) {
+ if (literal instanceof NullLiteral) {
return "null";
- } else if(literal instanceof BooleanLiteral) {
+ } else if (literal instanceof BooleanLiteral) {
return Boolean.toString(((BooleanLiteral) literal).getValue());
- } else if(literal instanceof NumericLiteral) {
+ } else if (literal instanceof NumericLiteral) {
return ((NumericLiteral) literal).getNumber().toString();
- } else if(literal instanceof StringLiteral) {
+ } else if (literal instanceof StringLiteral) {
return ((StringLiteral) literal).getValue();
- } else if(literal instanceof VariableLiteral) {
+ } else if (literal instanceof VariableLiteral) {
VariableLiteral variableLiteral = (VariableLiteral) literal;
return getVariableLiteralName(variableLiteral);
}
- } else if(discriminatorExpression instanceof UnaryTerm) {
+ } else if (discriminatorExpression instanceof UnaryTerm) {
UnaryTerm unaryTerm = (UnaryTerm) discriminatorExpression;
return getDiscriminatorName(unaryTerm.getA());
- } else if(discriminatorExpression instanceof BinaryTerm) {
+ } else if (discriminatorExpression instanceof BinaryTerm) {
BinaryTerm binaryTerm = (BinaryTerm) discriminatorExpression;
return getDiscriminatorName(binaryTerm.getA()) + "_" + getDiscriminatorName(binaryTerm.getB());
- } else if(discriminatorExpression instanceof TernaryTerm) {
+ } else if (discriminatorExpression instanceof TernaryTerm) {
TernaryTerm ternaryTerm = (TernaryTerm) discriminatorExpression;
return getDiscriminatorName(ternaryTerm.getA()) + "_" + getDiscriminatorName(ternaryTerm.getB())
+ "_" + getDiscriminatorName(ternaryTerm.getC());
@@ -686,7 +690,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
private String getVariableLiteralName(VariableLiteral variableLiteral) {
String rest = "";
- if(variableLiteral.getChild() != null) {
+ if (variableLiteral.getChild() != null) {
rest = getVariableLiteralName(variableLiteral.getChild());
rest = rest.substring(0, 1).toUpperCase() + rest.substring(1);
}
@@ -695,6 +699,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
/**
* Get a list of the types for every discriminator name.
+ *
* @return Map mapping discriminator names to types.
*/
public Map<String, TypeReference> getDiscriminatorTypes() {
@@ -741,6 +746,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
/**
* Get a list of the values for every discriminator name for every discriminated type.
+ *
* @return Map mapping discriminator names to discriminator values for every discriminated type.
*/
public Map<String, Map<String, String>> getDiscriminatorValues() {
@@ -765,13 +771,13 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public TypeReference getArgumentType(TypeReference typeReference, int index) {
- if(typeReference instanceof ComplexTypeReference) {
+ if (typeReference instanceof ComplexTypeReference) {
ComplexTypeReference complexTypeReference = (ComplexTypeReference) typeReference;
- if(!getTypeDefinitions().containsKey(complexTypeReference.getName())) {
+ if (!getTypeDefinitions().containsKey(complexTypeReference.getName())) {
throw new RuntimeException("Could not find definition of complex type " + complexTypeReference.getName());
}
TypeDefinition complexTypeDefinition = getTypeDefinitions().get(complexTypeReference.getName());
- if(complexTypeDefinition.getParserArguments().length <= index) {
+ if (complexTypeDefinition.getParserArguments().length <= index) {
throw new RuntimeException("Type " + complexTypeReference.getName() + " specifies too few parser arguments");
}
return complexTypeDefinition.getParserArguments()[index].getType();
@@ -787,7 +793,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
*/
public List<Argument> getSerializerArguments(Argument[] arguments) {
List<Argument> serializerArguments = new LinkedList<>();
- if(arguments != null) {
+ if (arguments != null) {
for (Argument argument : arguments) {
if ("lastItem".equals(argument.getName())) {
serializerArguments.add(argument);
@@ -799,7 +805,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
public List<Term> getSerializerTerms(Term[] terms) {
List<Term> serializerTerms = new LinkedList<>();
- if(terms != null) {
+ if (terms != null) {
for (Term term : terms) {
if (term.contains("lastItem")) {
serializerTerms.add(term);
@@ -810,7 +816,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public boolean hasLastItemTerm(Term[] terms) {
- if(terms != null) {
+ if (terms != null) {
for (Term term : terms) {
if (term.contains("lastItem")) {
return true;
@@ -821,28 +827,28 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
public boolean discriminatorValueNeedsStringEqualityCheck(Term term) {
- if(term instanceof VariableLiteral) {
+ if (term instanceof VariableLiteral) {
VariableLiteral variableLiteral = (VariableLiteral) term;
// If this literal references an Enum type, then we have to output it differently.
if (getTypeDefinitions().get(variableLiteral.getName()) instanceof EnumTypeDefinition) {
return false;
}
- if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
+ if (getThisTypeDefinition() instanceof ComplexTypeDefinition) {
Field referencedField = ((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().filter(field -> ((field instanceof NamedField) && ((NamedField) field).getName().equals(variableLiteral.getName()))).findFirst().orElse(null);
- if(referencedField != null) {
- if(referencedField instanceof TypedField) {
+ if (referencedField != null) {
+ if (referencedField instanceof TypedField) {
TypedField typedField = (TypedField) referencedField;
- if(typedField.getType() instanceof StringTypeReference) {
+ if (typedField.getType() instanceof StringTypeReference) {
return true;
}
}
}
}
- if(getThisTypeDefinition().getParserArguments() != null) {
+ if (getThisTypeDefinition().getParserArguments() != null) {
for (Argument parserArgument : getThisTypeDefinition().getParserArguments()) {
if (parserArgument.getName().equals(variableLiteral.getName())) {
- if(parserArgument.getType() instanceof StringTypeReference) {
+ if (parserArgument.getType() instanceof StringTypeReference) {
return true;
}
}
@@ -862,4 +868,34 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
return filteredEnumValues.values();
}
+ public Collection<EnumValue> getEnumValuesForUniqueConstantValues(EnumValue[] enumValues, String constantName) {
+ Map<String, EnumValue> filteredEnumValues = new TreeMap<>();
+ for (EnumValue enumValue : enumValues) {
+ if (!filteredEnumValues.containsKey(enumValue.getConstant(constantName))) {
+ filteredEnumValues.put(enumValue.getConstant(constantName), enumValue);
+ }
+ }
+ return filteredEnumValues.values();
+ }
+
+ public Collection<EnumValue> getEnumValuesForConstantValue(EnumValue[] enumValues, String constantName, String constantValue) {
+ List<EnumValue> filteredEnumValues = new ArrayList<>();
+ for (EnumValue enumValue : enumValues) {
+ if(enumValue.getConstant(constantName).equals(constantValue)) {
+ filteredEnumValues.add(enumValue);
+ }
+ }
+ return filteredEnumValues;
+ }
+
+ public SimpleTypeReference getEnumFieldSimpleTypeReference(TypeReference type, String fieldName) {
+ TypeDefinition typeDefinition = getTypeDefinitionForTypeReference(type);
+ if (typeDefinition instanceof EnumTypeDefinition) {
+ if (((EnumTypeDefinition) typeDefinition).getConstantType(fieldName) instanceof SimpleTypeReference) {
+ return (SimpleTypeReference) ((EnumTypeDefinition) typeDefinition).getConstantType(fieldName);
+ }
+ }
+ return null;
+ }
+
}
diff --git a/build-utils/language-c/src/main/resources/templates/c/enum-template-c.ftlh b/build-utils/language-c/src/main/resources/templates/c/enum-template-c.ftlh
index 2211ef6..2328390 100644
--- a/build-utils/language-c/src/main/resources/templates/c/enum-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/enum-template-c.ftlh
@@ -101,5 +101,26 @@ ${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))
}
}
}
+
+${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_get_first_enum_for_field_${helper.camelCaseToSnakeCase(constantName)}(${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))} value) {
+ <#if helper.isStringTypeReference(type.getConstantType(constantName))>
+ <#list helper.getEnumValuesForUniqueConstantValues(type.enumValues, constantName) as enumValue>
+ if (strcmp(value, ${helper.escapeEnumValue(type.getConstantType(constantName), enumValue.getConstant(constantName))?no_esc}) == 0) {
+ return ${helper.getCTypeName(type.name)}_${enumValue.name};
+ }
+ </#list>
+ <#else>
+ switch(value) {
+ <#list helper.getEnumValuesForUniqueConstantValues(type.enumValues, constantName) as enumValue>
+ case ${helper.escapeEnumValue(type.getConstantType(constantName), enumValue.getConstant(constantName))?no_esc}: {
+ return ${helper.getCTypeName(type.name)}_${enumValue.name};
+ }
+ </#list>
+ default: {
+ return -1;
+ }
+ }
+ </#if>
+}
</#list>
</#if>
diff --git a/build-utils/language-c/src/main/resources/templates/c/enum-template-h.ftlh b/build-utils/language-c/src/main/resources/templates/c/enum-template-h.ftlh
index 266c39b..497195d 100644
--- a/build-utils/language-c/src/main/resources/templates/c/enum-template-h.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/enum-template-h.ftlh
@@ -82,6 +82,7 @@ ${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_value_for_in
<#list type.constantNames as constantName>
${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))} ${helper.getCTypeName(type.name)}_get_${helper.camelCaseToSnakeCase(constantName)}(${helper.getCTypeName(type.name)} value);
+${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_get_first_enum_for_field_${helper.camelCaseToSnakeCase(constantName)}(${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))} value);
</#list>
</#if>
diff --git a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
index fb38e1a..43ac99a 100644
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
@@ -265,10 +265,21 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
<#if indentContent> </#if> // Enum field (${enumField.name})
<#if indentContent> </#if> ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getNullValueForTypeReference(enumField.type)};
+ <#if enumField.fieldName?has_content>
+<#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")};
+<#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> }
+ <#else>
<#if indentContent> </#if> _res = ${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(enumField.type), "&" + enumField.name)};
<#if indentContent> </#if> if(_res != OK) {
<#if indentContent> </#if> return _res;
<#if indentContent> </#if> }
+ </#if>
<#if indentContent> </#if> (*_message)-><@fieldName baseType=baseType field=enumField/> = ${enumField.name};
<#break>
<#case "implicit">
@@ -461,10 +472,17 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
<#assign enumField = field>
<#if indentContent> </#if> // Enum field (${enumField.name})
+ <#if enumField.fieldName?has_content>
+<#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) + ")")};
+<#if indentContent> </#if> if(_res != OK) {
+<#if indentContent> </#if> return _res;
+<#if indentContent> </#if> }
+ <#else>
<#if indentContent> </#if> _res = ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "_message->" + helper.getFieldName(baseType, enumField))};
<#if indentContent> </#if> if(_res != OK) {
<#if indentContent> </#if> return _res;
<#if indentContent> </#if> }
+ </#if>
<#break>
<#case "implicit">
<#assign implicitField = field>
diff --git a/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh
index c182bbc..bdc44b3 100644
--- a/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh
@@ -51,7 +51,9 @@ import org.apache.plc4x.java.spi.generation.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
public enum ${type.name} {
@@ -100,6 +102,25 @@ public enum ${type.name} {
return ${constantName};
}
+ public static ${type.name} firstEnumForField${constantName?cap_first}(${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)} fieldValue) {
+ for (${type.name} _val : ${type.name}.values()) {
+ if(_val.get${constantName?cap_first}() == fieldValue) {
+ return _val;
+ }
+ }
+ return null;
+ }
+
+ public static List<${type.name}> enumsForField${constantName?cap_first}(${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)} fieldValue) {
+ List<${type.name}> _values = new ArrayList();
+ for (${type.name} _val : ${type.name}.values()) {
+ if(_val.get${constantName?cap_first}() == fieldValue) {
+ _values.add(_val);
+ }
+ }
+ return _values;
+ }
+
</#list>
</#if>
<#if type.type?has_content>
diff --git a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
index dc127b6..bc15070 100644
--- a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
@@ -252,7 +252,11 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
<#assign enumField = field>
// Enum field (${enumField.name})
+ <#if enumField.fieldName?has_content>
+ ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getLanguageTypeNameForField(field)}.firstEnumForField${enumField.fieldName?cap_first}(${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(enumField.type))});
+ <#else>
${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getLanguageTypeNameForField(field)}.enumForValue(${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(enumField.type))});
+ </#if>
<#break>
<#case "implicit">
<#assign implicitField = field>
@@ -471,7 +475,11 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
// Enum field (${enumField.name})
${helper.getLanguageTypeNameForField(field)} ${enumField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${enumField.name?cap_first}();
+ <#if enumField.fieldName?has_content>
+ ${helper.getWriteBufferWriteMethodCall(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), "(" + enumField.name + ".get" + enumField.fieldName?cap_first + "())")};
+ <#else>
${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "(" + enumField.name + ".getValue())")};
+ </#if>
<#break>
<#case "implicit">
<#assign implicitField = field>
diff --git a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4 b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
index d79ba85..add3267 100644
--- a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
+++ b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
@@ -80,7 +80,7 @@ discriminatorField
;
enumField
- : 'enum' type=typeReference name=idExpression
+ : 'enum' type=typeReference name=idExpression (fieldName=idExpression)?
;
implicitField
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
index 97c7912..4c36511 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
@@ -27,12 +27,14 @@ public class DefaultEnumField extends DefaultTaggedField implements EnumField {
private final TypeReference type;
private final String name;
+ private final String fieldName;
private final Term[] params;
- public DefaultEnumField(String[] tags, TypeReference type, String name, Term[] params) {
+ public DefaultEnumField(String[] tags, TypeReference type, String name, String fieldName, Term[] params) {
super(tags);
this.type = type;
this.name = name;
+ this.fieldName = fieldName;
this.params = params;
}
@@ -44,6 +46,10 @@ public class DefaultEnumField extends DefaultTaggedField implements EnumField {
return name;
}
+ public String getFieldName() {
+ return fieldName;
+ }
+
public Term[] getParams() {
return params;
}
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 135fd4f..251e09d 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -197,8 +197,12 @@ public class MessageFormatListener extends MSpecBaseListener {
public void enterEnumField(MSpecParser.EnumFieldContext ctx) {
ComplexTypeReference type = new DefaultComplexTypeReference(ctx.type.complexTypeReference.getText());
String name = getIdString(ctx.name);
+ String fieldName = null;
+ if (ctx.fieldName != null) {
+ fieldName = getIdString(ctx.fieldName);
+ }
Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
- Field field = new DefaultEnumField(null, type, name, params);
+ Field field = new DefaultEnumField(null, type, name, fieldName, params);
if (parserContexts.peek() != null) {
parserContexts.peek().add(field);
}
@@ -341,7 +345,7 @@ public class MessageFormatListener extends MSpecBaseListener {
String typeName = ctx.name.getText();
List<Argument> parserArguments = new LinkedList<>();
// For DataIO types, add all the arguments from the parent type.
- if(!(ctx.parent.parent.parent.parent instanceof MSpecParser.ComplexTypeContext)) {
+ if (!(ctx.parent.parent.parent.parent instanceof MSpecParser.ComplexTypeContext)) {
if (((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent).params != null) {
parserArguments.addAll(Arrays.asList(getParserArguments(
((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent).params.argument())));
@@ -401,7 +405,7 @@ public class MessageFormatListener extends MSpecBaseListener {
MSpecParser.ExpressionContext expression = ctx.constantValueExpressions.expression(i);
String constant = unquoteString(expression.getText());
// String expressions are double escaped
- if(constant.startsWith("\"")) {
+ if (constant.startsWith("\"")) {
constant = unquoteString(constant);
}
constants.put(constantName, constant);
@@ -423,7 +427,7 @@ public class MessageFormatListener extends MSpecBaseListener {
private TypeReference getTypeReference(MSpecParser.TypeReferenceContext ctx) {
if (ctx.simpleTypeReference != null) {
- return getSimpleTypeReference (ctx.simpleTypeReference);
+ return getSimpleTypeReference(ctx.simpleTypeReference);
} else {
return new DefaultComplexTypeReference(ctx.complexTypeReference.getText());
}
@@ -433,7 +437,7 @@ public class MessageFormatListener extends MSpecBaseListener {
SimpleTypeReference.SimpleBaseType simpleBaseType =
SimpleTypeReference.SimpleBaseType.valueOf(ctx.base.getText().toUpperCase());
// String types need an additional "encoding" field and an optional size.
- if(simpleBaseType == SimpleTypeReference.SimpleBaseType.STRING) {
+ if (simpleBaseType == SimpleTypeReference.SimpleBaseType.STRING) {
int size = (ctx.size != null) ? Integer.parseInt(ctx.size.getText()) : -1;
String encoding = (ctx.encoding != null) ? ctx.encoding.getText() : "UTF-8";
return new DefaultStringTypeReference(simpleBaseType, size, encoding);
@@ -444,17 +448,15 @@ public class MessageFormatListener extends MSpecBaseListener {
return new DefaultIntegerTypeReference(simpleBaseType, size);
}
// If exponent and mantissa are present, it's a floating point representation.
- else if((ctx.exponent != null) && (ctx.mantissa != null)) {
+ else if ((ctx.exponent != null) && (ctx.mantissa != null)) {
int exponent = Integer.parseInt(ctx.exponent.getText());
int mantissa = Integer.parseInt(ctx.mantissa.getText());
return new DefaultFloatTypeReference(simpleBaseType, exponent, mantissa);
- }
- else if((simpleBaseType == SimpleTypeReference.SimpleBaseType.TIME) ||
+ } else if ((simpleBaseType == SimpleTypeReference.SimpleBaseType.TIME) ||
(simpleBaseType == SimpleTypeReference.SimpleBaseType.DATE) ||
(simpleBaseType == SimpleTypeReference.SimpleBaseType.DATETIME)) {
return new DefaultTemporalTypeReference(simpleBaseType);
- }
- else if(simpleBaseType == SimpleTypeReference.SimpleBaseType.BIT) {
+ } else if (simpleBaseType == SimpleTypeReference.SimpleBaseType.BIT) {
return new DefaultBooleanTypeReference();
}
// In all other cases (bit) it's just assume it's length it 1.
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go b/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
index 26cf716..38f3d8d 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
@@ -27,10 +27,11 @@ type TransportSize int8
type ITransportSize interface {
Supported_S7_300() bool
Supported_LOGO() bool
+ Code() uint8
SizeInBytes() uint8
Supported_S7_400() bool
Supported_S7_1200() bool
- SizeCode() uint8
+ ShortName() uint8
Supported_S7_1500() bool
DataTransportSize() DataTransportSize
BaseType() TransportSize
@@ -41,38 +42,35 @@ type ITransportSize interface {
const(
TransportSize_BOOL TransportSize = 0x01
TransportSize_BYTE TransportSize = 0x02
- TransportSize_WORD TransportSize = 0x04
- TransportSize_DWORD TransportSize = 0x06
- TransportSize_LWORD TransportSize = 0x00
- TransportSize_INT TransportSize = 0x05
- TransportSize_UINT TransportSize = 0x05
- TransportSize_SINT TransportSize = 0x02
- TransportSize_USINT TransportSize = 0x02
- TransportSize_DINT TransportSize = 0x07
- TransportSize_UDINT TransportSize = 0x07
- TransportSize_LINT TransportSize = 0x00
- TransportSize_ULINT TransportSize = 0x00
- TransportSize_REAL TransportSize = 0x08
- TransportSize_LREAL TransportSize = 0x30
- TransportSize_CHAR TransportSize = 0x03
- TransportSize_WCHAR TransportSize = 0x13
- TransportSize_STRING TransportSize = 0x03
- TransportSize_WSTRING TransportSize = 0x00
- TransportSize_TIME TransportSize = 0x0B
- TransportSize_LTIME TransportSize = 0x00
- TransportSize_DATE TransportSize = 0x09
- TransportSize_TIME_OF_DAY TransportSize = 0x06
- TransportSize_TOD TransportSize = 0x06
- TransportSize_DATE_AND_TIME TransportSize = 0x0F
- TransportSize_DT TransportSize = 0x0F
+ TransportSize_WORD TransportSize = 0x03
+ TransportSize_DWORD TransportSize = 0x04
+ TransportSize_LWORD TransportSize = 0x05
+ TransportSize_INT TransportSize = 0x06
+ TransportSize_UINT TransportSize = 0x07
+ TransportSize_SINT TransportSize = 0x08
+ TransportSize_USINT TransportSize = 0x09
+ TransportSize_DINT TransportSize = 0x0A
+ TransportSize_UDINT TransportSize = 0x0B
+ TransportSize_LINT TransportSize = 0x0C
+ TransportSize_ULINT TransportSize = 0x0D
+ TransportSize_REAL TransportSize = 0x0E
+ TransportSize_LREAL TransportSize = 0x0F
+ TransportSize_CHAR TransportSize = 0x10
+ TransportSize_WCHAR TransportSize = 0x11
+ TransportSize_STRING TransportSize = 0x12
+ TransportSize_WSTRING TransportSize = 0x13
+ TransportSize_TIME TransportSize = 0x14
+ TransportSize_LTIME TransportSize = 0x16
+ TransportSize_DATE TransportSize = 0x17
+ TransportSize_TIME_OF_DAY TransportSize = 0x18
+ TransportSize_TOD TransportSize = 0x19
+ TransportSize_DATE_AND_TIME TransportSize = 0x1A
+ TransportSize_DT TransportSize = 0x1B
)
func (e TransportSize) Supported_S7_300() bool {
switch e {
- case 0x00: { /* '0x00' */
- return false
- }
case 0x01: { /* '0x01' */
return true
}
@@ -86,32 +84,71 @@ func (e TransportSize) Supported_S7_300() bool {
return true
}
case 0x05: { /* '0x05' */
- return true
+ return false
}
case 0x06: { /* '0x06' */
return true
}
case 0x07: { /* '0x07' */
- return true
+ return false
}
case 0x08: { /* '0x08' */
- return true
+ return false
}
case 0x09: { /* '0x09' */
+ return false
+ }
+ case 0x0A: { /* '0x0A' */
return true
}
case 0x0B: { /* '0x0B' */
+ return false
+ }
+ case 0x0C: { /* '0x0C' */
+ return false
+ }
+ case 0x0D: { /* '0x0D' */
+ return false
+ }
+ case 0x0E: { /* '0x0E' */
return true
}
case 0x0F: { /* '0x0F' */
+ return false
+ }
+ case 0x10: { /* '0x10' */
+ return true
+ }
+ case 0x11: { /* '0x11' */
+ return false
+ }
+ case 0x12: { /* '0x12' */
return true
}
case 0x13: { /* '0x13' */
return false
}
- case 0x30: { /* '0x30' */
+ case 0x14: { /* '0x14' */
+ return true
+ }
+ case 0x16: { /* '0x16' */
return false
}
+ case 0x17: { /* '0x17' */
+ return true
+ }
+ case 0x18: { /* '0x18' */
+ return true
+ }
+ case 0x19: { /* '0x19' */
+ return true
+ }
+ case 0x1A: { /* '0x1A' */
+ return true
+ }
+ case 0x1B: { /* '0x1B' */
+ return true
+ }
default: {
return false
}
@@ -120,9 +157,6 @@ func (e TransportSize) Supported_S7_300() bool {
func (e TransportSize) Supported_LOGO() bool {
switch e {
- case 0x00: { /* '0x00' */
- return false
- }
case 0x01: { /* '0x01' */
return true
}
@@ -136,7 +170,7 @@ func (e TransportSize) Supported_LOGO() bool {
return true
}
case 0x05: { /* '0x05' */
- return true
+ return false
}
case 0x06: { /* '0x06' */
return true
@@ -150,16 +184,55 @@ func (e TransportSize) Supported_LOGO() bool {
case 0x09: { /* '0x09' */
return true
}
+ case 0x0A: { /* '0x0A' */
+ return true
+ }
case 0x0B: { /* '0x0B' */
return true
}
+ case 0x0C: { /* '0x0C' */
+ return false
+ }
+ case 0x0D: { /* '0x0D' */
+ return false
+ }
+ case 0x0E: { /* '0x0E' */
+ return true
+ }
case 0x0F: { /* '0x0F' */
return false
}
+ case 0x10: { /* '0x10' */
+ return true
+ }
+ case 0x11: { /* '0x11' */
+ return true
+ }
+ case 0x12: { /* '0x12' */
+ return true
+ }
case 0x13: { /* '0x13' */
return true
}
- case 0x30: { /* '0x30' */
+ case 0x14: { /* '0x14' */
+ return true
+ }
+ case 0x16: { /* '0x16' */
+ return false
+ }
+ case 0x17: { /* '0x17' */
+ return true
+ }
+ case 0x18: { /* '0x18' */
+ return true
+ }
+ case 0x19: { /* '0x19' */
+ return true
+ }
+ case 0x1A: { /* '0x1A' */
+ return false
+ }
+ case 0x1B: { /* '0x1B' */
return false
}
default: {
@@ -168,11 +241,94 @@ func (e TransportSize) Supported_LOGO() bool {
}
}
-func (e TransportSize) SizeInBytes() uint8 {
+func (e TransportSize) Code() uint8 {
switch e {
- case 0x00: { /* '0x00' */
- return 8
+ case 0x01: { /* '0x01' */
+ return 0x01
+ }
+ case 0x02: { /* '0x02' */
+ return 0x02
+ }
+ case 0x03: { /* '0x03' */
+ return 0x04
+ }
+ case 0x04: { /* '0x04' */
+ return 0x06
+ }
+ case 0x05: { /* '0x05' */
+ return 0x00
+ }
+ case 0x06: { /* '0x06' */
+ return 0x05
+ }
+ case 0x07: { /* '0x07' */
+ return 0x05
+ }
+ case 0x08: { /* '0x08' */
+ return 0x02
+ }
+ case 0x09: { /* '0x09' */
+ return 0x02
+ }
+ case 0x0A: { /* '0x0A' */
+ return 0x07
+ }
+ case 0x0B: { /* '0x0B' */
+ return 0x07
+ }
+ case 0x0C: { /* '0x0C' */
+ return 0x00
+ }
+ case 0x0D: { /* '0x0D' */
+ return 0x00
+ }
+ case 0x0E: { /* '0x0E' */
+ return 0x08
}
+ case 0x0F: { /* '0x0F' */
+ return 0x30
+ }
+ case 0x10: { /* '0x10' */
+ return 0x03
+ }
+ case 0x11: { /* '0x11' */
+ return 0x13
+ }
+ case 0x12: { /* '0x12' */
+ return 0x03
+ }
+ case 0x13: { /* '0x13' */
+ return 0x00
+ }
+ case 0x14: { /* '0x14' */
+ return 0x0B
+ }
+ case 0x16: { /* '0x16' */
+ return 0x00
+ }
+ case 0x17: { /* '0x17' */
+ return 0x09
+ }
+ case 0x18: { /* '0x18' */
+ return 0x06
+ }
+ case 0x19: { /* '0x19' */
+ return 0x06
+ }
+ case 0x1A: { /* '0x1A' */
+ return 0x0F
+ }
+ case 0x1B: { /* '0x1B' */
+ return 0x0F
+ }
+ default: {
+ return 0
+ }
+ }
+}
+
+func (e TransportSize) SizeInBytes() uint8 {
+ switch e {
case 0x01: { /* '0x01' */
return 1
}
@@ -180,38 +336,77 @@ func (e TransportSize) SizeInBytes() uint8 {
return 1
}
case 0x03: { /* '0x03' */
- return 1
+ return 2
}
case 0x04: { /* '0x04' */
- return 2
+ return 4
}
case 0x05: { /* '0x05' */
- return 2
+ return 8
}
case 0x06: { /* '0x06' */
- return 4
+ return 2
}
case 0x07: { /* '0x07' */
- return 4
+ return 2
}
case 0x08: { /* '0x08' */
- return 4
+ return 1
}
case 0x09: { /* '0x09' */
- return 2
+ return 1
+ }
+ case 0x0A: { /* '0x0A' */
+ return 4
}
case 0x0B: { /* '0x0B' */
return 4
}
+ case 0x0C: { /* '0x0C' */
+ return 8
+ }
+ case 0x0D: { /* '0x0D' */
+ return 16
+ }
+ case 0x0E: { /* '0x0E' */
+ return 4
+ }
case 0x0F: { /* '0x0F' */
- return 12
+ return 8
+ }
+ case 0x10: { /* '0x10' */
+ return 1
+ }
+ case 0x11: { /* '0x11' */
+ return 2
+ }
+ case 0x12: { /* '0x12' */
+ return 1
}
case 0x13: { /* '0x13' */
return 2
}
- case 0x30: { /* '0x30' */
+ case 0x14: { /* '0x14' */
+ return 4
+ }
+ case 0x16: { /* '0x16' */
return 8
}
+ case 0x17: { /* '0x17' */
+ return 2
+ }
+ case 0x18: { /* '0x18' */
+ return 4
+ }
+ case 0x19: { /* '0x19' */
+ return 4
+ }
+ case 0x1A: { /* '0x1A' */
+ return 12
+ }
+ case 0x1B: { /* '0x1B' */
+ return 12
+ }
default: {
return 0
}
@@ -220,9 +415,6 @@ func (e TransportSize) SizeInBytes() uint8 {
func (e TransportSize) Supported_S7_400() bool {
switch e {
- case 0x00: { /* '0x00' */
- return false
- }
case 0x01: { /* '0x01' */
return true
}
@@ -236,32 +428,71 @@ func (e TransportSize) Supported_S7_400() bool {
return true
}
case 0x05: { /* '0x05' */
- return true
+ return false
}
case 0x06: { /* '0x06' */
return true
}
case 0x07: { /* '0x07' */
- return true
+ return false
}
case 0x08: { /* '0x08' */
- return true
+ return false
}
case 0x09: { /* '0x09' */
+ return false
+ }
+ case 0x0A: { /* '0x0A' */
return true
}
case 0x0B: { /* '0x0B' */
+ return false
+ }
+ case 0x0C: { /* '0x0C' */
+ return false
+ }
+ case 0x0D: { /* '0x0D' */
+ return false
+ }
+ case 0x0E: { /* '0x0E' */
return true
}
case 0x0F: { /* '0x0F' */
+ return false
+ }
+ case 0x10: { /* '0x10' */
+ return true
+ }
+ case 0x11: { /* '0x11' */
+ return false
+ }
+ case 0x12: { /* '0x12' */
return true
}
case 0x13: { /* '0x13' */
return false
}
- case 0x30: { /* '0x30' */
+ case 0x14: { /* '0x14' */
+ return true
+ }
+ case 0x16: { /* '0x16' */
return false
}
+ case 0x17: { /* '0x17' */
+ return true
+ }
+ case 0x18: { /* '0x18' */
+ return true
+ }
+ case 0x19: { /* '0x19' */
+ return true
+ }
+ case 0x1A: { /* '0x1A' */
+ return true
+ }
+ case 0x1B: { /* '0x1B' */
+ return true
+ }
default: {
return false
}
@@ -270,9 +501,6 @@ func (e TransportSize) Supported_S7_400() bool {
func (e TransportSize) Supported_S7_1200() bool {
switch e {
- case 0x00: { /* '0x00' */
- return false
- }
case 0x01: { /* '0x01' */
return true
}
@@ -286,7 +514,7 @@ func (e TransportSize) Supported_S7_1200() bool {
return true
}
case 0x05: { /* '0x05' */
- return true
+ return false
}
case 0x06: { /* '0x06' */
return true
@@ -300,29 +528,65 @@ func (e TransportSize) Supported_S7_1200() bool {
case 0x09: { /* '0x09' */
return true
}
+ case 0x0A: { /* '0x0A' */
+ return true
+ }
case 0x0B: { /* '0x0B' */
return true
}
- case 0x0F: { /* '0x0F' */
+ case 0x0C: { /* '0x0C' */
+ return false
+ }
+ case 0x0D: { /* '0x0D' */
return false
}
+ case 0x0E: { /* '0x0E' */
+ return true
+ }
+ case 0x0F: { /* '0x0F' */
+ return true
+ }
+ case 0x10: { /* '0x10' */
+ return true
+ }
+ case 0x11: { /* '0x11' */
+ return true
+ }
+ case 0x12: { /* '0x12' */
+ return true
+ }
case 0x13: { /* '0x13' */
return true
}
- case 0x30: { /* '0x30' */
+ case 0x14: { /* '0x14' */
return true
}
+ case 0x16: { /* '0x16' */
+ return false
+ }
+ case 0x17: { /* '0x17' */
+ return true
+ }
+ case 0x18: { /* '0x18' */
+ return true
+ }
+ case 0x19: { /* '0x19' */
+ return true
+ }
+ case 0x1A: { /* '0x1A' */
+ return false
+ }
+ case 0x1B: { /* '0x1B' */
+ return false
+ }
default: {
return false
}
}
}
-func (e TransportSize) SizeCode() uint8 {
+func (e TransportSize) ShortName() uint8 {
switch e {
- case 0x00: { /* '0x00' */
- return 'X'
- }
case 0x01: { /* '0x01' */
return 'X'
}
@@ -330,36 +594,75 @@ func (e TransportSize) SizeCode() uint8 {
return 'B'
}
case 0x03: { /* '0x03' */
- return 'B'
+ return 'W'
}
case 0x04: { /* '0x04' */
- return 'W'
+ return 'D'
}
case 0x05: { /* '0x05' */
- return 'W'
+ return 'X'
}
case 0x06: { /* '0x06' */
- return 'D'
+ return 'W'
}
case 0x07: { /* '0x07' */
- return 'D'
+ return 'W'
}
case 0x08: { /* '0x08' */
- return 'D'
+ return 'B'
}
case 0x09: { /* '0x09' */
- return 'X'
+ return 'B'
+ }
+ case 0x0A: { /* '0x0A' */
+ return 'D'
}
case 0x0B: { /* '0x0B' */
+ return 'D'
+ }
+ case 0x0C: { /* '0x0C' */
+ return 'X'
+ }
+ case 0x0D: { /* '0x0D' */
return 'X'
}
+ case 0x0E: { /* '0x0E' */
+ return 'D'
+ }
case 0x0F: { /* '0x0F' */
return 'X'
}
+ case 0x10: { /* '0x10' */
+ return 'B'
+ }
+ case 0x11: { /* '0x11' */
+ return 'X'
+ }
+ case 0x12: { /* '0x12' */
+ return 'X'
+ }
case 0x13: { /* '0x13' */
return 'X'
}
- case 0x30: { /* '0x30' */
+ case 0x14: { /* '0x14' */
+ return 'X'
+ }
+ case 0x16: { /* '0x16' */
+ return 'X'
+ }
+ case 0x17: { /* '0x17' */
+ return 'X'
+ }
+ case 0x18: { /* '0x18' */
+ return 'X'
+ }
+ case 0x19: { /* '0x19' */
+ return 'X'
+ }
+ case 0x1A: { /* '0x1A' */
+ return 'X'
+ }
+ case 0x1B: { /* '0x1B' */
return 'X'
}
default: {
@@ -370,9 +673,6 @@ func (e TransportSize) SizeCode() uint8 {
func (e TransportSize) Supported_S7_1500() bool {
switch e {
- case 0x00: { /* '0x00' */
- return true
- }
case 0x01: { /* '0x01' */
return true
}
@@ -400,16 +700,55 @@ func (e TransportSize) Supported_S7_1500() bool {
case 0x09: { /* '0x09' */
return true
}
+ case 0x0A: { /* '0x0A' */
+ return true
+ }
case 0x0B: { /* '0x0B' */
return true
}
+ case 0x0C: { /* '0x0C' */
+ return true
+ }
+ case 0x0D: { /* '0x0D' */
+ return true
+ }
+ case 0x0E: { /* '0x0E' */
+ return true
+ }
case 0x0F: { /* '0x0F' */
return true
}
+ case 0x10: { /* '0x10' */
+ return true
+ }
+ case 0x11: { /* '0x11' */
+ return true
+ }
+ case 0x12: { /* '0x12' */
+ return true
+ }
case 0x13: { /* '0x13' */
return true
}
- case 0x30: { /* '0x30' */
+ case 0x14: { /* '0x14' */
+ return true
+ }
+ case 0x16: { /* '0x16' */
+ return true
+ }
+ case 0x17: { /* '0x17' */
+ return true
+ }
+ case 0x18: { /* '0x18' */
+ return true
+ }
+ case 0x19: { /* '0x19' */
+ return true
+ }
+ case 0x1A: { /* '0x1A' */
+ return true
+ }
+ case 0x1B: { /* '0x1B' */
return true
}
default: {
@@ -420,9 +759,6 @@ func (e TransportSize) Supported_S7_1500() bool {
func (e TransportSize) DataTransportSize() DataTransportSize {
switch e {
- case 0x00: { /* '0x00' */
- return 0
- }
case 0x01: { /* '0x01' */
return DataTransportSize_BIT
}
@@ -436,10 +772,10 @@ func (e TransportSize) DataTransportSize() DataTransportSize {
return DataTransportSize_BYTE_WORD_DWORD
}
case 0x05: { /* '0x05' */
- return DataTransportSize_INTEGER
+ return 0
}
case 0x06: { /* '0x06' */
- return DataTransportSize_BYTE_WORD_DWORD
+ return DataTransportSize_INTEGER
}
case 0x07: { /* '0x07' */
return DataTransportSize_INTEGER
@@ -450,16 +786,55 @@ func (e TransportSize) DataTransportSize() DataTransportSize {
case 0x09: { /* '0x09' */
return DataTransportSize_BYTE_WORD_DWORD
}
+ case 0x0A: { /* '0x0A' */
+ return DataTransportSize_INTEGER
+ }
case 0x0B: { /* '0x0B' */
+ return DataTransportSize_INTEGER
+ }
+ case 0x0C: { /* '0x0C' */
return 0
}
+ case 0x0D: { /* '0x0D' */
+ return 0
+ }
+ case 0x0E: { /* '0x0E' */
+ return DataTransportSize_BYTE_WORD_DWORD
+ }
case 0x0F: { /* '0x0F' */
return 0
}
+ case 0x10: { /* '0x10' */
+ return DataTransportSize_BYTE_WORD_DWORD
+ }
+ case 0x11: { /* '0x11' */
+ return 0
+ }
+ case 0x12: { /* '0x12' */
+ return DataTransportSize_BYTE_WORD_DWORD
+ }
case 0x13: { /* '0x13' */
return 0
}
- case 0x30: { /* '0x30' */
+ case 0x14: { /* '0x14' */
+ return 0
+ }
+ case 0x16: { /* '0x16' */
+ return 0
+ }
+ case 0x17: { /* '0x17' */
+ return DataTransportSize_BYTE_WORD_DWORD
+ }
+ case 0x18: { /* '0x18' */
+ return DataTransportSize_BYTE_WORD_DWORD
+ }
+ case 0x19: { /* '0x19' */
+ return DataTransportSize_BYTE_WORD_DWORD
+ }
+ case 0x1A: { /* '0x1A' */
+ return 0
+ }
+ case 0x1B: { /* '0x1B' */
return 0
}
default: {
@@ -470,9 +845,6 @@ func (e TransportSize) DataTransportSize() DataTransportSize {
func (e TransportSize) BaseType() TransportSize {
switch e {
- case 0x00: { /* '0x00' */
- return 0
- }
case 0x01: { /* '0x01' */
return 0
}
@@ -483,34 +855,73 @@ func (e TransportSize) BaseType() TransportSize {
return 0
}
case 0x04: { /* '0x04' */
- return 0
+ return TransportSize_WORD
}
case 0x05: { /* '0x05' */
return 0
}
case 0x06: { /* '0x06' */
- return TransportSize_WORD
+ return 0
}
case 0x07: { /* '0x07' */
return TransportSize_INT
}
case 0x08: { /* '0x08' */
- return 0
+ return TransportSize_INT
}
case 0x09: { /* '0x09' */
- return 0
+ return TransportSize_INT
+ }
+ case 0x0A: { /* '0x0A' */
+ return TransportSize_INT
}
case 0x0B: { /* '0x0B' */
+ return TransportSize_INT
+ }
+ case 0x0C: { /* '0x0C' */
+ return TransportSize_INT
+ }
+ case 0x0D: { /* '0x0D' */
+ return TransportSize_INT
+ }
+ case 0x0E: { /* '0x0E' */
return 0
}
case 0x0F: { /* '0x0F' */
+ return TransportSize_REAL
+ }
+ case 0x10: { /* '0x10' */
+ return 0
+ }
+ case 0x11: { /* '0x11' */
+ return 0
+ }
+ case 0x12: { /* '0x12' */
return 0
}
case 0x13: { /* '0x13' */
return 0
}
- case 0x30: { /* '0x30' */
- return TransportSize_REAL
+ case 0x14: { /* '0x14' */
+ return 0
+ }
+ case 0x16: { /* '0x16' */
+ return TransportSize_TIME
+ }
+ case 0x17: { /* '0x17' */
+ return 0
+ }
+ case 0x18: { /* '0x18' */
+ return 0
+ }
+ case 0x19: { /* '0x19' */
+ return 0
+ }
+ case 0x1A: { /* '0x1A' */
+ return 0
+ }
+ case 0x1B: { /* '0x1B' */
+ return 0
}
default: {
return 0
@@ -520,9 +931,6 @@ func (e TransportSize) BaseType() TransportSize {
func (e TransportSize) DataProtocolId() string {
switch e {
- case 0x00: { /* '0x00' */
- return "IEC61131_LWORD"
- }
case 0x01: { /* '0x01' */
return "IEC61131_BOOL"
}
@@ -530,37 +938,76 @@ func (e TransportSize) DataProtocolId() string {
return "IEC61131_BYTE"
}
case 0x03: { /* '0x03' */
- return "IEC61131_CHAR"
+ return "IEC61131_WORD"
}
case 0x04: { /* '0x04' */
- return "IEC61131_WORD"
+ return "IEC61131_DWORD"
}
case 0x05: { /* '0x05' */
- return "IEC61131_INT"
+ return "IEC61131_LWORD"
}
case 0x06: { /* '0x06' */
- return "IEC61131_DWORD"
+ return "IEC61131_INT"
}
case 0x07: { /* '0x07' */
- return "IEC61131_DINT"
+ return "IEC61131_UINT"
}
case 0x08: { /* '0x08' */
- return "IEC61131_REAL"
+ return "IEC61131_SINT"
}
case 0x09: { /* '0x09' */
- return "IEC61131_DATE"
+ return "IEC61131_USINT"
+ }
+ case 0x0A: { /* '0x0A' */
+ return "IEC61131_DINT"
}
case 0x0B: { /* '0x0B' */
- return "IEC61131_TIME"
+ return "IEC61131_UDINT"
+ }
+ case 0x0C: { /* '0x0C' */
+ return "IEC61131_LINT"
+ }
+ case 0x0D: { /* '0x0D' */
+ return "IEC61131_ULINT"
+ }
+ case 0x0E: { /* '0x0E' */
+ return "IEC61131_REAL"
}
case 0x0F: { /* '0x0F' */
- return "IEC61131_DATE_AND_TIME"
+ return "IEC61131_LREAL"
}
- case 0x13: { /* '0x13' */
+ case 0x10: { /* '0x10' */
+ return "IEC61131_CHAR"
+ }
+ case 0x11: { /* '0x11' */
return "IEC61131_WCHAR"
}
- case 0x30: { /* '0x30' */
- return "IEC61131_LREAL"
+ case 0x12: { /* '0x12' */
+ return "IEC61131_STRING"
+ }
+ case 0x13: { /* '0x13' */
+ return "IEC61131_WSTRING"
+ }
+ case 0x14: { /* '0x14' */
+ return "IEC61131_TIME"
+ }
+ case 0x16: { /* '0x16' */
+ return "IEC61131_LTIME"
+ }
+ case 0x17: { /* '0x17' */
+ return "IEC61131_DATE"
+ }
+ case 0x18: { /* '0x18' */
+ return "IEC61131_TIME_OF_DAY"
+ }
+ case 0x19: { /* '0x19' */
+ return "IEC61131_TIME_OF_DAY"
+ }
+ case 0x1A: { /* '0x1A' */
+ return "IEC61131_DATE_AND_TIME"
+ }
+ case 0x1B: { /* '0x1B' */
+ return "IEC61131_DATE_AND_TIME"
}
default: {
return ""
@@ -569,68 +1016,116 @@ func (e TransportSize) DataProtocolId() string {
}
func TransportSizeByValue(value int8) TransportSize {
switch value {
- case 0x00:
- return TransportSize_LWORD
case 0x01:
return TransportSize_BOOL
case 0x02:
return TransportSize_BYTE
case 0x03:
- return TransportSize_CHAR
- case 0x04:
return TransportSize_WORD
+ case 0x04:
+ return TransportSize_DWORD
case 0x05:
- return TransportSize_INT
+ return TransportSize_LWORD
case 0x06:
- return TransportSize_DWORD
+ return TransportSize_INT
case 0x07:
- return TransportSize_DINT
+ return TransportSize_UINT
case 0x08:
- return TransportSize_REAL
+ return TransportSize_SINT
case 0x09:
- return TransportSize_DATE
+ return TransportSize_USINT
+ case 0x0A:
+ return TransportSize_DINT
case 0x0B:
- return TransportSize_TIME
+ return TransportSize_UDINT
+ case 0x0C:
+ return TransportSize_LINT
+ case 0x0D:
+ return TransportSize_ULINT
+ case 0x0E:
+ return TransportSize_REAL
case 0x0F:
- return TransportSize_DATE_AND_TIME
- case 0x13:
- return TransportSize_WCHAR
- case 0x30:
return TransportSize_LREAL
+ case 0x10:
+ return TransportSize_CHAR
+ case 0x11:
+ return TransportSize_WCHAR
+ case 0x12:
+ return TransportSize_STRING
+ case 0x13:
+ return TransportSize_WSTRING
+ case 0x14:
+ return TransportSize_TIME
+ case 0x16:
+ return TransportSize_LTIME
+ case 0x17:
+ return TransportSize_DATE
+ case 0x18:
+ return TransportSize_TIME_OF_DAY
+ case 0x19:
+ return TransportSize_TOD
+ case 0x1A:
+ return TransportSize_DATE_AND_TIME
+ case 0x1B:
+ return TransportSize_DT
}
return 0
}
func TransportSizeByName(value string) TransportSize {
switch value {
- case "LWORD":
- return TransportSize_LWORD
case "BOOL":
return TransportSize_BOOL
case "BYTE":
return TransportSize_BYTE
- case "CHAR":
- return TransportSize_CHAR
case "WORD":
return TransportSize_WORD
- case "INT":
- return TransportSize_INT
case "DWORD":
return TransportSize_DWORD
+ case "LWORD":
+ return TransportSize_LWORD
+ case "INT":
+ return TransportSize_INT
+ case "UINT":
+ return TransportSize_UINT
+ case "SINT":
+ return TransportSize_SINT
+ case "USINT":
+ return TransportSize_USINT
case "DINT":
return TransportSize_DINT
+ case "UDINT":
+ return TransportSize_UDINT
+ case "LINT":
+ return TransportSize_LINT
+ case "ULINT":
+ return TransportSize_ULINT
case "REAL":
return TransportSize_REAL
- case "DATE":
- return TransportSize_DATE
+ case "LREAL":
+ return TransportSize_LREAL
+ case "CHAR":
+ return TransportSize_CHAR
+ case "WCHAR":
+ return TransportSize_WCHAR
+ case "STRING":
+ return TransportSize_STRING
+ case "WSTRING":
+ return TransportSize_WSTRING
case "TIME":
return TransportSize_TIME
+ case "LTIME":
+ return TransportSize_LTIME
+ case "DATE":
+ return TransportSize_DATE
+ case "TIME_OF_DAY":
+ return TransportSize_TIME_OF_DAY
+ case "TOD":
+ return TransportSize_TOD
case "DATE_AND_TIME":
return TransportSize_DATE_AND_TIME
- case "WCHAR":
- return TransportSize_WCHAR
- case "LREAL":
- return TransportSize_LREAL
+ case "DT":
+ return TransportSize_DT
}
return 0
}
@@ -668,34 +1163,58 @@ func (e TransportSize) Serialize(io utils.WriteBuffer) error {
func (e TransportSize) String() string {
switch e {
- case TransportSize_LWORD:
- return "LWORD"
case TransportSize_BOOL:
return "BOOL"
case TransportSize_BYTE:
return "BYTE"
- case TransportSize_CHAR:
- return "CHAR"
case TransportSize_WORD:
return "WORD"
- case TransportSize_INT:
- return "INT"
case TransportSize_DWORD:
return "DWORD"
+ case TransportSize_LWORD:
+ return "LWORD"
+ case TransportSize_INT:
+ return "INT"
+ case TransportSize_UINT:
+ return "UINT"
+ case TransportSize_SINT:
+ return "SINT"
+ case TransportSize_USINT:
+ return "USINT"
case TransportSize_DINT:
return "DINT"
+ case TransportSize_UDINT:
+ return "UDINT"
+ case TransportSize_LINT:
+ return "LINT"
+ case TransportSize_ULINT:
+ return "ULINT"
case TransportSize_REAL:
return "REAL"
- case TransportSize_DATE:
- return "DATE"
+ case TransportSize_LREAL:
+ return "LREAL"
+ case TransportSize_CHAR:
+ return "CHAR"
+ case TransportSize_WCHAR:
+ return "WCHAR"
+ case TransportSize_STRING:
+ return "STRING"
+ case TransportSize_WSTRING:
+ return "WSTRING"
case TransportSize_TIME:
return "TIME"
+ case TransportSize_LTIME:
+ return "LTIME"
+ case TransportSize_DATE:
+ return "DATE"
+ case TransportSize_TIME_OF_DAY:
+ return "TIME_OF_DAY"
+ case TransportSize_TOD:
+ return "TOD"
case TransportSize_DATE_AND_TIME:
return "DATE_AND_TIME"
- case TransportSize_WCHAR:
- return "WCHAR"
- case TransportSize_LREAL:
- return "LREAL"
+ case TransportSize_DT:
+ return "DT"
}
return ""
}
diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
index 928531d..38dcb47 100644
--- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -166,7 +166,7 @@
[discriminator uint 8 'addressType']
[typeSwitch 'addressType'
['0x10' S7AddressAny
- [enum TransportSize 'transportSize']
+ [enum TransportSize 'transportSize' 'code']
[simple uint 16 'numberOfElements']
[simple uint 16 'dbNumber']
[enum MemoryArea 'area']
diff --git a/sandbox/plc4c/api/include/plc4c/data.h b/sandbox/plc4c/api/include/plc4c/data.h
index 67c0d91..265f7aa 100644
--- a/sandbox/plc4c/api/include/plc4c/data.h
+++ b/sandbox/plc4c/api/include/plc4c/data.h
@@ -141,7 +141,7 @@ plc4c_data *plc4c_data_create_constant_string_data(unsigned int size, char *s);
* @param s the char value
* @return pointer to plc4c_data
*/
-plc4c_data *plc4c_data_create_char_data(char s);
+plc4c_data *plc4c_data_create_char_data(char* s);
/**
* Creates a plc4c_data which contains a list of values
diff --git a/sandbox/plc4c/drivers/s7/src/driver_s7.c b/sandbox/plc4c/drivers/s7/src/driver_s7.c
index 2cfd568..40a5938 100644
--- a/sandbox/plc4c/drivers/s7/src/driver_s7.c
+++ b/sandbox/plc4c/drivers/s7/src/driver_s7.c
@@ -18,13 +18,16 @@
*/
#include "plc4c/driver_s7.h"
-#include "plc4c/driver_s7_sm.h"
+
+#include <string.h>
+
#include "plc4c/driver_s7_encode_decode.h"
+#include "plc4c/driver_s7_sm.h"
-plc4c_return_code plc4c_driver_s7_configure_function(
- plc4c_list* parameters, void** configuration) {
+plc4c_return_code plc4c_driver_s7_configure_function(plc4c_list* parameters,
+ void** configuration) {
plc4c_driver_s7_config* s7_config = malloc(sizeof(plc4c_driver_s7_config));
- if(s7_config == NULL) {
+ if (s7_config == NULL) {
return NO_MEMORY;
}
@@ -70,13 +73,60 @@ plc4c_driver* plc4c_driver_s7_create() {
*
*/
-char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io, int32_t stringLength, char* encoding) {
- // TODO: Implement ...
+char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io,
+ int32_t stringLength,
+ char* encoding) {
+ if (strcmp(encoding, "UTF-8") == 0) {
+ // Read the max length (which is not interesting for us.
+ uint8_t maxLen;
+ plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &maxLen);
+ if (res != OK) {
+ return NULL;
+ }
+ // Read the effective length of the string.
+ uint8_t effectiveStringLength;
+ res = plc4c_spi_read_unsigned_byte(io, 8, &effectiveStringLength);
+ if (res != OK) {
+ return NULL;
+ }
+ char* result = malloc(sizeof(char) * (effectiveStringLength + 1));
+ if (result == NULL) {
+ return NULL;
+ }
+ char* curPos = result;
+ for(int i = 0; i < effectiveStringLength; i++) {
+ uint8_t val;
+ plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &val);
+ if (res != OK) {
+ return NULL;
+ }
+ *curPos = (char) val;
+ curPos++;
+ }
+ *curPos = '\0';
+ return result;
+ } else if (strcmp(encoding, "UTF-16") == 0) {
+ }
return "";
}
-char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io, char* encoding) {
- // TODO: Implement ...
+char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io,
+ char* encoding) {
+ if (strcmp(encoding, "UTF-8") == 0) {
+ char* result = malloc(sizeof(char) * 2);
+ if (result == NULL) {
+ return NULL;
+ }
+ uint8_t val;
+ plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &val);
+ if (res != OK) {
+ return NULL;
+ }
+ *result = (char) val;
+ *(result+1) = '\0';
+ return result;
+ } else if (strcmp(encoding, "UTF-16") == 0) {
+ }
return "";
}
@@ -109,4 +159,3 @@ time_t plc4c_s7_read_write_parse_tia_date_time(plc4c_spi_read_buffer* io) {
// TODO: Implement ...
return 0;
}
-
diff --git a/sandbox/plc4c/drivers/s7/src/driver_s7_encode_decode.c b/sandbox/plc4c/drivers/s7/src/driver_s7_encode_decode.c
index defc8dd..955a45d 100644
--- a/sandbox/plc4c/drivers/s7/src/driver_s7_encode_decode.c
+++ b/sandbox/plc4c/drivers/s7/src/driver_s7_encode_decode.c
@@ -220,8 +220,8 @@ plc4c_return_code plc4c_driver_s7_encode_address(
if ((*cur_pos == '(') && (strcmp(data_type, "STRING") == 0)) {
// Next comes the string_length
- last_pos = cur_pos;
- while (isalpha(*cur_pos)) {
+ last_pos = ++cur_pos;
+ while (isdigit(*cur_pos)) {
cur_pos++;
}
len = cur_pos - last_pos;
@@ -307,7 +307,7 @@ plc4c_return_code plc4c_driver_s7_encode_address(
// Check the optional transport size code.
if(transfer_size_code != NULL) {
- if(plc4c_s7_read_write_transport_size_get_size_code(any_address->s7_address_any_transport_size) != *transfer_size_code) {
+ if(plc4c_s7_read_write_transport_size_get_short_name(any_address->s7_address_any_transport_size) != *transfer_size_code) {
return INVALID_ADDRESS;
}
}
diff --git a/sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c b/sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c
index b8adcf0..1b0a811 100644
--- a/sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c
+++ b/sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c
@@ -131,6 +131,11 @@ plc4c_return_code plc4c_driver_s7_read_machine_function(
char* data_protocol_id = plc4c_s7_read_write_transport_size_get_data_protocol_id(transport_size);
uint16_t num_elements = s7_address->s7_var_request_parameter_item_address_address->s7_address_any_number_of_elements;
int32_t string_length = 0;
+ if(transport_size == plc4c_s7_read_write_transport_size_STRING) {
+ // TODO: This needs to be changed to read arrays of strings.
+ string_length = num_elements;
+ num_elements = 1;
+ }
// Convert the linked list with uint8_t elements into an array of uint8_t.
plc4c_s7_read_write_s7_var_payload_data_item* cur_response_item = cur_response_item_element->value;
diff --git a/sandbox/plc4c/examples/hello-world/src/hello_world.c b/sandbox/plc4c/examples/hello-world/src/hello_world.c
index 1a13892..9c9e158 100644
--- a/sandbox/plc4c/examples/hello-world/src/hello_world.c
+++ b/sandbox/plc4c/examples/hello-world/src/hello_world.c
@@ -69,8 +69,8 @@ enum plc4c_connection_state_t {
};
typedef enum plc4c_connection_state_t plc4c_connection_state;
-#pragma clang diagnostic push
-#pragma ide diagnostic ignored "hicpp-multiway-paths-covered"
+//#pragma clang diagnostic push
+//#pragma ide diagnostic ignored "hicpp-multiway-paths-covered"
int main() {
bool loop = true;
@@ -195,81 +195,83 @@ int main() {
}
printf("SUCCESS\n");
- printf("Adding an item for '%I0.0:BOOL' ... ");
- result =
+ /*result =
plc4c_read_request_add_item(read_request, "BOOL", "%DB4:0.0:BOOL");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "BYTE", "%DB4:1:BYTE");
+ plc4c_read_request_add_item(read_request, "BYTE", "%DB4.1:BYTE");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "WORD", "%DB4:2:WORD");
+ plc4c_read_request_add_item(read_request, "WORD", "%DB4.2:WORD");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "DWORD", "%DB4:4:DWORD");
+ plc4c_read_request_add_item(read_request, "DWORD", "%DB4.4:DWORD");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "SINT", "%DB4:16:SINT");
+ plc4c_read_request_add_item(read_request, "SINT", "%DB4.16:SINT");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "USINT", "%DB4:17:USINT");
+ plc4c_read_request_add_item(read_request, "USINT", "%DB4.17:USINT");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "INT", "%DB4:18:INT");
+ plc4c_read_request_add_item(read_request, "INT", "%DB4.18:INT");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "UINT", "%DB4:20:UINT");
+ plc4c_read_request_add_item(read_request, "UINT", "%DB4.20:UINT");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "DINT", "%DB4:22:DINT");
+ plc4c_read_request_add_item(read_request, "DINT", "%DB4.22:DINT");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "UDINT", "%DB4:26:UDINT");
+ plc4c_read_request_add_item(read_request, "UDINT", "%DB4.26:UDINT");
if (result != OK) {
printf("FAILED\n");
return -1;
}
result =
- plc4c_read_request_add_item(read_request, "REAL", "%DB4:46:REAL");
+ plc4c_read_request_add_item(read_request, "REAL", "%DB4.46:REAL");
if (result != OK) {
printf("FAILED\n");
return -1;
- }
+ }*/
+
+ // Works till here ...
+
// S7 reports "Not supported"
- /*result =
+ result =
plc4c_read_request_add_item(read_request, "TIME", "%DB4:58:TIME");
if (result != OK) {
printf("FAILED\n");
return -1;
}
- result =
+ /*result =
plc4c_read_request_add_item(read_request, "DATE", "%DB4:70:DATE");
if (result != OK) {
printf("FAILED\n");
@@ -281,36 +283,38 @@ int main() {
printf("FAILED\n");
return -1;
}*/
- result =
+ /*result =
plc4c_read_request_add_item(read_request, "TOD", "%DB4:76:TOD");
if (result != OK) {
printf("FAILED\n");
return -1;
- }
- /*result =
+ }*/
+ result =
plc4c_read_request_add_item(read_request, "CHAR", "%DB4:136:CHAR");
if (result != OK) {
printf("FAILED\n");
return -1;
}
- result =
+ // UTF-16 doesn't work well in a portable way
+ /*result =
plc4c_read_request_add_item(read_request, "WCHAR", "%DB4:138:WCHAR");
if (result != OK) {
printf("FAILED\n");
return -1;
- }
+ }*/
result =
plc4c_read_request_add_item(read_request, "STRING", "%DB4:140:STRING(10)");
if (result != OK) {
printf("FAILED\n");
return -1;
}
- result =
- plc4c_read_request_add_item(read_request, "WSTRING", "%DB4:396:WSTRING(10)");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }*/
+ // UTF-16 doesn't work well in a portable way
+ /*result =
+ plc4c_read_request_add_item(read_request, "WSTRING", "%DB4:396:WSTRING(10)");
+ if (result != OK) {
+ printf("FAILED\n");
+ return -1;
+ }*/
printf("SUCCESS\n");
// Execute the read-request.
@@ -354,7 +358,7 @@ int main() {
while (cur_element != NULL) {
plc4c_response_value_item *value_item = cur_element->value;
- printf("Value %s (%s):", value_item->item->name,
+ 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");
diff --git a/sandbox/plc4c/generated-sources/modbus/include/modbus_data_type_sizes.h b/sandbox/plc4c/generated-sources/modbus/include/modbus_data_type_sizes.h
index 945e5e1..04a5ebf 100644
--- a/sandbox/plc4c/generated-sources/modbus/include/modbus_data_type_sizes.h
+++ b/sandbox/plc4c/generated-sources/modbus/include/modbus_data_type_sizes.h
@@ -68,6 +68,7 @@ int plc4c_modbus_read_write_modbus_data_type_sizes_num_values();
plc4c_modbus_read_write_modbus_data_type_sizes plc4c_modbus_read_write_modbus_data_type_sizes_value_for_index(int index);
uint8_t plc4c_modbus_read_write_modbus_data_type_sizes_get_data_type_size(plc4c_modbus_read_write_modbus_data_type_sizes value);
+plc4c_modbus_read_write_modbus_data_type_sizes plc4c_modbus_read_write_modbus_data_type_sizes_get_first_enum_for_field_data_type_size(uint8_t value);
#ifdef __cplusplus
}
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_data_type_sizes.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_data_type_sizes.c
index 263ce2d..0eeaabd 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_data_type_sizes.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_data_type_sizes.c
@@ -294,3 +294,23 @@ uint8_t plc4c_modbus_read_write_modbus_data_type_sizes_get_data_type_size(plc4c_
}
}
}
+
+plc4c_modbus_read_write_modbus_data_type_sizes plc4c_modbus_read_write_modbus_data_type_sizes_get_first_enum_for_field_data_type_size(uint8_t value) {
+ switch(value) {
+ case 1: {
+ return plc4c_modbus_read_write_modbus_data_type_sizes_BOOL;
+ }
+ case 2: {
+ return plc4c_modbus_read_write_modbus_data_type_sizes_WORD;
+ }
+ case 4: {
+ return plc4c_modbus_read_write_modbus_data_type_sizes_DWORD;
+ }
+ case 8: {
+ return plc4c_modbus_read_write_modbus_data_type_sizes_LWORD;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
diff --git a/sandbox/plc4c/generated-sources/s7/include/cotp_tpdu_size.h b/sandbox/plc4c/generated-sources/s7/include/cotp_tpdu_size.h
index 6906a00..fc27eb4 100644
--- a/sandbox/plc4c/generated-sources/s7/include/cotp_tpdu_size.h
+++ b/sandbox/plc4c/generated-sources/s7/include/cotp_tpdu_size.h
@@ -48,6 +48,7 @@ int plc4c_s7_read_write_cotp_tpdu_size_num_values();
plc4c_s7_read_write_cotp_tpdu_size plc4c_s7_read_write_cotp_tpdu_size_value_for_index(int index);
uint16_t plc4c_s7_read_write_cotp_tpdu_size_get_size_in_bytes(plc4c_s7_read_write_cotp_tpdu_size value);
+plc4c_s7_read_write_cotp_tpdu_size plc4c_s7_read_write_cotp_tpdu_size_get_first_enum_for_field_size_in_bytes(uint16_t value);
#ifdef __cplusplus
}
diff --git a/sandbox/plc4c/generated-sources/s7/include/data_transport_size.h b/sandbox/plc4c/generated-sources/s7/include/data_transport_size.h
index 4525b5b..70ff8cd 100644
--- a/sandbox/plc4c/generated-sources/s7/include/data_transport_size.h
+++ b/sandbox/plc4c/generated-sources/s7/include/data_transport_size.h
@@ -48,6 +48,7 @@ int plc4c_s7_read_write_data_transport_size_num_values();
plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_data_transport_size_value_for_index(int index);
bool plc4c_s7_read_write_data_transport_size_get_size_in_bits(plc4c_s7_read_write_data_transport_size value);
+plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_data_transport_size_get_first_enum_for_field_size_in_bits(bool value);
#ifdef __cplusplus
}
diff --git a/sandbox/plc4c/generated-sources/s7/include/memory_area.h b/sandbox/plc4c/generated-sources/s7/include/memory_area.h
index f6f357e..55694cb 100644
--- a/sandbox/plc4c/generated-sources/s7/include/memory_area.h
+++ b/sandbox/plc4c/generated-sources/s7/include/memory_area.h
@@ -50,6 +50,7 @@ int plc4c_s7_read_write_memory_area_num_values();
plc4c_s7_read_write_memory_area plc4c_s7_read_write_memory_area_value_for_index(int index);
char* plc4c_s7_read_write_memory_area_get_short_name(plc4c_s7_read_write_memory_area value);
+plc4c_s7_read_write_memory_area plc4c_s7_read_write_memory_area_get_first_enum_for_field_short_name(char* value);
#ifdef __cplusplus
}
diff --git a/sandbox/plc4c/generated-sources/s7/include/transport_size.h b/sandbox/plc4c/generated-sources/s7/include/transport_size.h
index 8f77697..1eebc59 100644
--- a/sandbox/plc4c/generated-sources/s7/include/transport_size.h
+++ b/sandbox/plc4c/generated-sources/s7/include/transport_size.h
@@ -69,26 +69,37 @@ int plc4c_s7_read_write_transport_size_num_values();
plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_value_for_index(int index);
bool plc4c_s7_read_write_transport_size_get_supported__s7_300(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_300(bool value);
bool plc4c_s7_read_write_transport_size_get_supported__logo(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__logo(bool value);
uint8_t plc4c_s7_read_write_transport_size_get_code(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_code(uint8_t value);
uint8_t plc4c_s7_read_write_transport_size_get_size_in_bytes(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_size_in_bytes(uint8_t value);
bool plc4c_s7_read_write_transport_size_get_supported__s7_400(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_400(bool value);
bool plc4c_s7_read_write_transport_size_get_supported__s7_1200(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_1200(bool value);
uint8_t plc4c_s7_read_write_transport_size_get_short_name(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_short_name(uint8_t value);
bool plc4c_s7_read_write_transport_size_get_supported__s7_1500(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_1500(bool value);
plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_transport_size_get_data_transport_size(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_data_transport_size(plc4c_s7_read_write_data_transport_size value);
plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_type(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_base_type(plc4c_s7_read_write_transport_size value);
char* plc4c_s7_read_write_transport_size_get_data_protocol_id(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_data_protocol_id(char* value);
#ifdef __cplusplus
}
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_tpdu_size.c b/sandbox/plc4c/generated-sources/s7/src/cotp_tpdu_size.c
index d5deae3..3e98970 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_tpdu_size.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_tpdu_size.c
@@ -114,3 +114,32 @@ uint16_t plc4c_s7_read_write_cotp_tpdu_size_get_size_in_bytes(plc4c_s7_read_writ
}
}
}
+
+plc4c_s7_read_write_cotp_tpdu_size plc4c_s7_read_write_cotp_tpdu_size_get_first_enum_for_field_size_in_bytes(uint16_t value) {
+ switch(value) {
+ case 1024: {
+ return plc4c_s7_read_write_cotp_tpdu_size_SIZE_1024;
+ }
+ case 128: {
+ return plc4c_s7_read_write_cotp_tpdu_size_SIZE_128;
+ }
+ case 2048: {
+ return plc4c_s7_read_write_cotp_tpdu_size_SIZE_2048;
+ }
+ case 256: {
+ return plc4c_s7_read_write_cotp_tpdu_size_SIZE_256;
+ }
+ case 4096: {
+ return plc4c_s7_read_write_cotp_tpdu_size_SIZE_4096;
+ }
+ case 512: {
+ return plc4c_s7_read_write_cotp_tpdu_size_SIZE_512;
+ }
+ case 8192: {
+ return plc4c_s7_read_write_cotp_tpdu_size_SIZE_8192;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
diff --git a/sandbox/plc4c/generated-sources/s7/src/data_transport_size.c b/sandbox/plc4c/generated-sources/s7/src/data_transport_size.c
index 14b508d..c58ff58 100644
--- a/sandbox/plc4c/generated-sources/s7/src/data_transport_size.c
+++ b/sandbox/plc4c/generated-sources/s7/src/data_transport_size.c
@@ -114,3 +114,17 @@ bool plc4c_s7_read_write_data_transport_size_get_size_in_bits(plc4c_s7_read_writ
}
}
}
+
+plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_data_transport_size_get_first_enum_for_field_size_in_bits(bool value) {
+ switch(value) {
+ case false: {
+ return plc4c_s7_read_write_data_transport_size_NULL;
+ }
+ case true: {
+ return plc4c_s7_read_write_data_transport_size_BIT;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
diff --git a/sandbox/plc4c/generated-sources/s7/src/memory_area.c b/sandbox/plc4c/generated-sources/s7/src/memory_area.c
index 51a929f..b822207 100644
--- a/sandbox/plc4c/generated-sources/s7/src/memory_area.c
+++ b/sandbox/plc4c/generated-sources/s7/src/memory_area.c
@@ -132,3 +132,33 @@ char* plc4c_s7_read_write_memory_area_get_short_name(plc4c_s7_read_write_memory_
}
}
}
+
+plc4c_s7_read_write_memory_area plc4c_s7_read_write_memory_area_get_first_enum_for_field_short_name(char* value) {
+ if (strcmp(value, "C") == 0) {
+ return plc4c_s7_read_write_memory_area_COUNTERS;
+ }
+ if (strcmp(value, "D") == 0) {
+ return plc4c_s7_read_write_memory_area_DIRECT_PERIPHERAL_ACCESS;
+ }
+ if (strcmp(value, "DB") == 0) {
+ return plc4c_s7_read_write_memory_area_DATA_BLOCKS;
+ }
+ if (strcmp(value, "DBI") == 0) {
+ return plc4c_s7_read_write_memory_area_INSTANCE_DATA_BLOCKS;
+ }
+ if (strcmp(value, "I") == 0) {
+ return plc4c_s7_read_write_memory_area_INPUTS;
+ }
+ if (strcmp(value, "LD") == 0) {
+ return plc4c_s7_read_write_memory_area_LOCAL_DATA;
+ }
+ if (strcmp(value, "M") == 0) {
+ return plc4c_s7_read_write_memory_area_FLAGS_MARKERS;
+ }
+ if (strcmp(value, "Q") == 0) {
+ return plc4c_s7_read_write_memory_area_OUTPUTS;
+ }
+ if (strcmp(value, "T") == 0) {
+ return plc4c_s7_read_write_memory_area_TIMERS;
+ }
+}
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_address.c b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
index 0f239fb..923cb2c 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_address.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
@@ -67,9 +67,13 @@ plc4c_return_code plc4c_s7_read_write_s7_address_parse(plc4c_spi_read_buffer* io
// Enum field (transportSize)
plc4c_s7_read_write_transport_size transportSize = plc4c_s7_read_write_transport_size_null();
- _res = plc4c_spi_read_signed_byte(io, 8, (int8_t*) &transportSize);
- if(_res != OK) {
- return _res;
+ {
+ uint8_t _constantValue = 0;
+ _res = plc4c_spi_read_unsigned_byte(io, 8, (uint8_t*) &_constantValue);
+ if(_res != OK) {
+ return _res;
+ }
+ transportSize = plc4c_s7_read_write_transport_size_get_first_enum_for_field_code(_constantValue);
}
(*_message)->s7_address_any_transport_size = transportSize;
@@ -153,7 +157,7 @@ plc4c_return_code plc4c_s7_read_write_s7_address_serialize(plc4c_spi_write_buffe
case plc4c_s7_read_write_s7_address_type_plc4c_s7_read_write_s7_address_any: {
// Enum field (transportSize)
- _res = plc4c_spi_write_signed_byte(io, 8, _message->s7_address_any_transport_size);
+ _res = plc4c_spi_write_unsigned_byte(io, 8, plc4c_s7_read_write_transport_size_get_code(_message->s7_address_any_transport_size));
if(_res != OK) {
return _res;
}
diff --git a/sandbox/plc4c/generated-sources/s7/src/transport_size.c b/sandbox/plc4c/generated-sources/s7/src/transport_size.c
index c8bb738..17fd0d8 100644
--- a/sandbox/plc4c/generated-sources/s7/src/transport_size.c
+++ b/sandbox/plc4c/generated-sources/s7/src/transport_size.c
@@ -288,6 +288,20 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_300(plc4c_s7_read_writ
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_300(bool value) {
+ switch(value) {
+ case false: {
+ return plc4c_s7_read_write_transport_size_LWORD;
+ }
+ case true: {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
bool plc4c_s7_read_write_transport_size_get_supported__logo(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -374,6 +388,20 @@ bool plc4c_s7_read_write_transport_size_get_supported__logo(plc4c_s7_read_write_
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__logo(bool value) {
+ switch(value) {
+ case false: {
+ return plc4c_s7_read_write_transport_size_LWORD;
+ }
+ case true: {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
uint8_t plc4c_s7_read_write_transport_size_get_code(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -460,6 +488,56 @@ uint8_t plc4c_s7_read_write_transport_size_get_code(plc4c_s7_read_write_transpor
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_code(uint8_t value) {
+ switch(value) {
+ case 0: {
+ return plc4c_s7_read_write_transport_size_LWORD;
+ }
+ case 1: {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ case 2: {
+ return plc4c_s7_read_write_transport_size_BYTE;
+ }
+ case 3: {
+ return plc4c_s7_read_write_transport_size_CHAR;
+ }
+ case 4: {
+ return plc4c_s7_read_write_transport_size_WORD;
+ }
+ case 5: {
+ return plc4c_s7_read_write_transport_size_INT;
+ }
+ case 6: {
+ return plc4c_s7_read_write_transport_size_DWORD;
+ }
+ case 7: {
+ return plc4c_s7_read_write_transport_size_DINT;
+ }
+ case 8: {
+ return plc4c_s7_read_write_transport_size_REAL;
+ }
+ case 9: {
+ return plc4c_s7_read_write_transport_size_DATE;
+ }
+ case 11: {
+ return plc4c_s7_read_write_transport_size_TIME;
+ }
+ case 15: {
+ return plc4c_s7_read_write_transport_size_DATE_AND_TIME;
+ }
+ case 19: {
+ return plc4c_s7_read_write_transport_size_WCHAR;
+ }
+ case 48: {
+ return plc4c_s7_read_write_transport_size_LREAL;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
uint8_t plc4c_s7_read_write_transport_size_get_size_in_bytes(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -546,6 +624,32 @@ uint8_t plc4c_s7_read_write_transport_size_get_size_in_bytes(plc4c_s7_read_write
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_size_in_bytes(uint8_t value) {
+ switch(value) {
+ case 1: {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ case 12: {
+ return plc4c_s7_read_write_transport_size_DATE_AND_TIME;
+ }
+ case 16: {
+ return plc4c_s7_read_write_transport_size_ULINT;
+ }
+ case 2: {
+ return plc4c_s7_read_write_transport_size_WORD;
+ }
+ case 4: {
+ return plc4c_s7_read_write_transport_size_DWORD;
+ }
+ case 8: {
+ return plc4c_s7_read_write_transport_size_LWORD;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
bool plc4c_s7_read_write_transport_size_get_supported__s7_400(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -632,6 +736,20 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_400(plc4c_s7_read_writ
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_400(bool value) {
+ switch(value) {
+ case false: {
+ return plc4c_s7_read_write_transport_size_LWORD;
+ }
+ case true: {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
bool plc4c_s7_read_write_transport_size_get_supported__s7_1200(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -718,6 +836,20 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_1200(plc4c_s7_read_wri
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_1200(bool value) {
+ switch(value) {
+ case false: {
+ return plc4c_s7_read_write_transport_size_LWORD;
+ }
+ case true: {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
uint8_t plc4c_s7_read_write_transport_size_get_short_name(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -804,6 +936,26 @@ uint8_t plc4c_s7_read_write_transport_size_get_short_name(plc4c_s7_read_write_tr
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_short_name(uint8_t value) {
+ switch(value) {
+ case 'B': {
+ return plc4c_s7_read_write_transport_size_BYTE;
+ }
+ case 'D': {
+ return plc4c_s7_read_write_transport_size_DWORD;
+ }
+ case 'W': {
+ return plc4c_s7_read_write_transport_size_WORD;
+ }
+ case 'X': {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
bool plc4c_s7_read_write_transport_size_get_supported__s7_1500(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -890,6 +1042,17 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_1500(plc4c_s7_read_wri
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_1500(bool value) {
+ switch(value) {
+ case true: {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_transport_size_get_data_transport_size(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -976,6 +1139,26 @@ plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_transport_size_get_d
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_data_transport_size(plc4c_s7_read_write_data_transport_size value) {
+ switch(value) {
+ case plc4c_s7_read_write_data_transport_size_BIT: {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ case plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD: {
+ return plc4c_s7_read_write_transport_size_BYTE;
+ }
+ case plc4c_s7_read_write_data_transport_size_INTEGER: {
+ return plc4c_s7_read_write_transport_size_INT;
+ }
+ case -1: {
+ return plc4c_s7_read_write_transport_size_LWORD;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_type(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -1062,6 +1245,29 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_t
}
}
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_base_type(plc4c_s7_read_write_transport_size value) {
+ switch(value) {
+ case plc4c_s7_read_write_transport_size_INT: {
+ return plc4c_s7_read_write_transport_size_UINT;
+ }
+ case plc4c_s7_read_write_transport_size_REAL: {
+ return plc4c_s7_read_write_transport_size_LREAL;
+ }
+ case plc4c_s7_read_write_transport_size_TIME: {
+ return plc4c_s7_read_write_transport_size_LTIME;
+ }
+ case plc4c_s7_read_write_transport_size_WORD: {
+ return plc4c_s7_read_write_transport_size_DWORD;
+ }
+ case -1: {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ default: {
+ return -1;
+ }
+ }
+}
+
char* plc4c_s7_read_write_transport_size_get_data_protocol_id(plc4c_s7_read_write_transport_size value) {
switch(value) {
case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -1147,3 +1353,78 @@ char* plc4c_s7_read_write_transport_size_get_data_protocol_id(plc4c_s7_read_writ
}
}
}
+
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_data_protocol_id(char* value) {
+ if (strcmp(value, "IEC61131_BOOL") == 0) {
+ return plc4c_s7_read_write_transport_size_BOOL;
+ }
+ if (strcmp(value, "IEC61131_BYTE") == 0) {
+ return plc4c_s7_read_write_transport_size_BYTE;
+ }
+ if (strcmp(value, "IEC61131_CHAR") == 0) {
+ return plc4c_s7_read_write_transport_size_CHAR;
+ }
+ if (strcmp(value, "IEC61131_DATE") == 0) {
+ return plc4c_s7_read_write_transport_size_DATE;
+ }
+ if (strcmp(value, "IEC61131_DATE_AND_TIME") == 0) {
+ return plc4c_s7_read_write_transport_size_DATE_AND_TIME;
+ }
+ if (strcmp(value, "IEC61131_DINT") == 0) {
+ return plc4c_s7_read_write_transport_size_DINT;
+ }
+ if (strcmp(value, "IEC61131_DWORD") == 0) {
+ return plc4c_s7_read_write_transport_size_DWORD;
+ }
+ if (strcmp(value, "IEC61131_INT") == 0) {
+ return plc4c_s7_read_write_transport_size_INT;
+ }
+ if (strcmp(value, "IEC61131_LINT") == 0) {
+ return plc4c_s7_read_write_transport_size_LINT;
+ }
+ if (strcmp(value, "IEC61131_LREAL") == 0) {
+ return plc4c_s7_read_write_transport_size_LREAL;
+ }
+ if (strcmp(value, "IEC61131_LTIME") == 0) {
+ return plc4c_s7_read_write_transport_size_LTIME;
+ }
+ if (strcmp(value, "IEC61131_LWORD") == 0) {
+ return plc4c_s7_read_write_transport_size_LWORD;
+ }
+ if (strcmp(value, "IEC61131_REAL") == 0) {
+ return plc4c_s7_read_write_transport_size_REAL;
+ }
+ if (strcmp(value, "IEC61131_SINT") == 0) {
+ return plc4c_s7_read_write_transport_size_SINT;
+ }
+ if (strcmp(value, "IEC61131_STRING") == 0) {
+ return plc4c_s7_read_write_transport_size_STRING;
+ }
+ if (strcmp(value, "IEC61131_TIME") == 0) {
+ return plc4c_s7_read_write_transport_size_TIME;
+ }
+ if (strcmp(value, "IEC61131_TIME_OF_DAY") == 0) {
+ return plc4c_s7_read_write_transport_size_TIME_OF_DAY;
+ }
+ if (strcmp(value, "IEC61131_UDINT") == 0) {
+ return plc4c_s7_read_write_transport_size_UDINT;
+ }
+ if (strcmp(value, "IEC61131_UINT") == 0) {
+ return plc4c_s7_read_write_transport_size_UINT;
+ }
+ if (strcmp(value, "IEC61131_ULINT") == 0) {
+ return plc4c_s7_read_write_transport_size_ULINT;
+ }
+ if (strcmp(value, "IEC61131_USINT") == 0) {
+ return plc4c_s7_read_write_transport_size_USINT;
+ }
+ if (strcmp(value, "IEC61131_WCHAR") == 0) {
+ return plc4c_s7_read_write_transport_size_WCHAR;
+ }
+ if (strcmp(value, "IEC61131_WORD") == 0) {
+ return plc4c_s7_read_write_transport_size_WORD;
+ }
+ if (strcmp(value, "IEC61131_WSTRING") == 0) {
+ return plc4c_s7_read_write_transport_size_WSTRING;
+ }
+}
diff --git a/sandbox/plc4c/pom.xml b/sandbox/plc4c/pom.xml
index 4e187bf..e3e4df2 100644
--- a/sandbox/plc4c/pom.xml
+++ b/sandbox/plc4c/pom.xml
@@ -287,7 +287,7 @@
</plugins>
<!--
Developers working in plc4c will probably use an IDE like CLion to edit just this
- Part of the project. These IDEs generate some work-directries we need to exclude.
+ Part of the project. These IDEs generate some work-directories we need to exclude.
-->
<pluginManagement>
<plugins>
diff --git a/sandbox/plc4c/spi/src/data.c b/sandbox/plc4c/spi/src/data.c
index a688732..f12f00a 100644
--- a/sandbox/plc4c/spi/src/data.c
+++ b/sandbox/plc4c/spi/src/data.c
@@ -154,7 +154,7 @@ plc4c_data *plc4c_data_create_constant_string_data(unsigned int size, char *s) {
return data;
}
-plc4c_data *plc4c_data_create_char_data(char s) {
+plc4c_data *plc4c_data_create_char_data(char* s) {
plc4c_data *data = malloc(sizeof(plc4c_data));
data->data_type = PLC4C_CONSTANT_STRING;
data->size = 1;
@@ -188,6 +188,10 @@ plc4c_data *plc4c_data_create_void_pointer_data(void *v) {
}
void plc4c_data_printf(plc4c_data *data) {
+ if (data == NULL) {
+ printf("NULL");
+ return;
+ }
switch (data->data_type) {
case PLC4C_BOOL:
printf("%s", data->data.boolean_value ? "true" : "false");
@@ -196,25 +200,25 @@ void plc4c_data_printf(plc4c_data *data) {
printf("%d", data->data.char_value);
break;
case PLC4C_UCHAR:
- printf("%d", data->data.uchar_value);
+ printf("%u", data->data.uchar_value);
break;
case PLC4C_SHORT:
printf("%d", data->data.short_value);
break;
case PLC4C_USHORT:
- printf("%d", data->data.ushort_value);
+ printf("%u", data->data.ushort_value);
break;
case PLC4C_INT:
printf("%d", data->data.int_value);
break;
case PLC4C_UINT:
- printf("%iu", data->data.uint_value);
+ printf("%u", data->data.uint_value);
break;
case PLC4C_LINT:
- printf("%d", data->data.lint_value);
+ printf("%I64d", data->data.lint_value);
break;
case PLC4C_ULINT:
- printf("%d", data->data.ulint_value);
+ printf("%I64u", data->data.ulint_value);
break;
case PLC4C_FLOAT:
printf("%f", data->data.float_value);
@@ -226,14 +230,19 @@ void plc4c_data_printf(plc4c_data *data) {
printf("%s", data->data.const_string_value);
break;
case PLC4C_LIST:
- printf("{");
+ printf("[");
plc4c_list_element *cur_element =
plc4c_utils_list_tail(&data->data.list_value);
while (cur_element != NULL) {
- plc4c_response_value_item *value_item = cur_element->value;
- plc4c_data_printf(value_item->value);
+ plc4c_data *data_item = cur_element->value;
+ plc4c_data_printf(data_item);
+ cur_element = cur_element->next;
+ if (cur_element != NULL) {
+ printf(", ");
+ }
}
- printf("}");
+ printf("]");
+ break;
case PLC4C_VOID_POINTER:
if (data->custom_printf != NULL) {
data->custom_printf(data);