|
@@ -203,9 +203,6 @@ def generateCommonVariableCode(node, nodeset):
|
|
if hasZero == False and len(node.value.value) == numElements:
|
|
if hasZero == False and len(node.value.value) == numElements:
|
|
code.append("attr.value.arrayDimensionsSize = attr.arrayDimensionsSize;")
|
|
code.append("attr.value.arrayDimensionsSize = attr.arrayDimensionsSize;")
|
|
code.append("attr.value.arrayDimensions = attr.arrayDimensions;")
|
|
code.append("attr.value.arrayDimensions = attr.arrayDimensions;")
|
|
- logger.warning("printing arrayDimensions")
|
|
|
|
- else:
|
|
|
|
- logger.error("Dimension with size 0 or value count mismatch detected, ArrayDimensions won't be copied to the Value attribute.")
|
|
|
|
elif node.value is not None:
|
|
elif node.value is not None:
|
|
raise RuntimeError("Cannot encode dataTypeNode: " + dataTypeNode.browseName.name + " for value of node " + node.browseName.name + " " + str(node.id))
|
|
raise RuntimeError("Cannot encode dataTypeNode: " + dataTypeNode.browseName.name + " for value of node " + node.browseName.name + " " + str(node.id))
|
|
|
|
|
|
@@ -283,36 +280,42 @@ def generateExtensionObjectSubtypeCode(node, parent, nodeset, global_var_code, i
|
|
encField = node.encodingRule[encFieldIdx]
|
|
encField = node.encodingRule[encFieldIdx]
|
|
encFieldIdx = encFieldIdx + 1
|
|
encFieldIdx = encFieldIdx + 1
|
|
memberName = lowerFirstChar(encField[0])
|
|
memberName = lowerFirstChar(encField[0])
|
|
|
|
+
|
|
|
|
+ # Check if this is an array
|
|
|
|
+ accessor = "." if isArrayElement else "->"
|
|
|
|
+
|
|
if isinstance(subv, list):
|
|
if isinstance(subv, list):
|
|
if len(subv) == 0:
|
|
if len(subv) == 0:
|
|
continue
|
|
continue
|
|
logger.info("ExtensionObject contains array")
|
|
logger.info("ExtensionObject contains array")
|
|
memberName = lowerFirstChar(encField[0])
|
|
memberName = lowerFirstChar(encField[0])
|
|
encTypeString = "UA_" + subv[0].__class__.__name__
|
|
encTypeString = "UA_" + subv[0].__class__.__name__
|
|
- code.append("UA_STACKARRAY(" + encTypeString + ", " + instanceName + "_" + memberName+", {0});".format(len(subv)))
|
|
|
|
|
|
+ instanceNameSafe = makeCIdentifier(instanceName)
|
|
|
|
+ code.append("UA_STACKARRAY(" + encTypeString + ", " + instanceNameSafe + "_" + memberName+", {0});".format(len(subv)))
|
|
encTypeArr = nodeset.getDataTypeNode(subv[0].__class__.__name__).typesArray
|
|
encTypeArr = nodeset.getDataTypeNode(subv[0].__class__.__name__).typesArray
|
|
encTypeArrayString = encTypeArr + "[" + encTypeArr + "_" + subv[0].__class__.__name__.upper() + "]"
|
|
encTypeArrayString = encTypeArr + "[" + encTypeArr + "_" + subv[0].__class__.__name__.upper() + "]"
|
|
code.append("UA_init({ref}{instanceName}, &{typeArrayString});".format(ref="&" if isArrayElement else "",
|
|
code.append("UA_init({ref}{instanceName}, &{typeArrayString});".format(ref="&" if isArrayElement else "",
|
|
- instanceName=instanceName + "_" + memberName,
|
|
|
|
|
|
+ instanceName=instanceNameSafe + "_" + memberName,
|
|
typeArrayString=encTypeArrayString))
|
|
typeArrayString=encTypeArrayString))
|
|
|
|
|
|
subArrayIdx = 0
|
|
subArrayIdx = 0
|
|
for val in subv:
|
|
for val in subv:
|
|
- code.append(generateNodeValueCode(instanceName + "_" + memberName + "[" + str(subArrayIdx) + "]" +" = ", val, instanceName,instanceName + "_gehtNed_member", global_var_code, asIndirect=False))
|
|
|
|
|
|
+ code.append(generateNodeValueCode(instanceNameSafe + "_" + memberName + "[" + str(subArrayIdx) + "]" +" = ", val, instanceName,instanceName + "_gehtNed_member", global_var_code, asIndirect=False))
|
|
subArrayIdx = subArrayIdx + 1
|
|
subArrayIdx = subArrayIdx + 1
|
|
- code.append(instanceName + "->" + memberName + " = " + instanceName+"_"+ memberName+";")
|
|
|
|
|
|
+ code.append(instanceName + accessor + memberName + " = " + instanceNameSafe+"_"+ memberName+";")
|
|
continue
|
|
continue
|
|
else:
|
|
else:
|
|
logger.debug(
|
|
logger.debug(
|
|
"Encoding of field " + memberName + " is " + str(subv.encodingRule) + "defined by " + str(encField))
|
|
"Encoding of field " + memberName + " is " + str(subv.encodingRule) + "defined by " + str(encField))
|
|
- # Check if this is an array
|
|
|
|
- accessor = "." if isArrayElement else "->"
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
if subv.valueRank is None or subv.valueRank == 0:
|
|
if subv.valueRank is None or subv.valueRank == 0:
|
|
- valueName = instanceName + accessor + memberName
|
|
|
|
- code.append(generateNodeValueCode(valueName + " = " ,
|
|
|
|
- subv, instanceName,valueName, global_var_code, asIndirect=False))
|
|
|
|
|
|
+ if not subv.isNone():
|
|
|
|
+ # Some values can be optional
|
|
|
|
+ valueName = instanceName + accessor + memberName
|
|
|
|
+ code.append(generateNodeValueCode(valueName + " = " ,
|
|
|
|
+ subv, instanceName,valueName, global_var_code, asIndirect=False))
|
|
else:
|
|
else:
|
|
memberName = lowerFirstChar(encField[0])
|
|
memberName = lowerFirstChar(encField[0])
|
|
code.append(generateNodeValueCode(instanceName + accessor + memberName + "Size = ", subv, instanceName,valueName, global_var_code, asIndirect=False))
|
|
code.append(generateNodeValueCode(instanceName + accessor + memberName + "Size = ", subv, instanceName,valueName, global_var_code, asIndirect=False))
|
|
@@ -414,10 +417,11 @@ def generateValueCode(node, parentNode, nodeset, bootstrapping=True):
|
|
code = code + code1
|
|
code = code + code1
|
|
codeCleanup = codeCleanup + codeCleanup1
|
|
codeCleanup = codeCleanup + codeCleanup1
|
|
instanceName = generateNodeValueInstanceName(node.value[0], parentNode, 0)
|
|
instanceName = generateNodeValueInstanceName(node.value[0], parentNode, 0)
|
|
- if not(isinstance(node.value[0], ExtensionObject)):
|
|
|
|
|
|
+ if not node.value[0].isNone() and not(isinstance(node.value[0], ExtensionObject)):
|
|
code.append("UA_" + node.value[0].__class__.__name__ + " *" + valueName + " = UA_" + node.value[
|
|
code.append("UA_" + node.value[0].__class__.__name__ + " *" + valueName + " = UA_" + node.value[
|
|
0].__class__.__name__ + "_new();")
|
|
0].__class__.__name__ + "_new();")
|
|
code.append("if (!" + valueName + ") return UA_STATUSCODE_BADOUTOFMEMORY;")
|
|
code.append("if (!" + valueName + ") return UA_STATUSCODE_BADOUTOFMEMORY;")
|
|
|
|
+ code.append("UA_" + node.value[0].__class__.__name__ + "_init(" + valueName + ");")
|
|
code.append(generateNodeValueCode("*" + valueName + " = " , node.value[0], instanceName, valueName, codeGlobal, asIndirect=True))
|
|
code.append(generateNodeValueCode("*" + valueName + " = " , node.value[0], instanceName, valueName, codeGlobal, asIndirect=True))
|
|
code.append(
|
|
code.append(
|
|
"UA_Variant_setScalar(&attr.value, " + valueName + ", " +
|
|
"UA_Variant_setScalar(&attr.value, " + valueName + ", " +
|