def generateNodeCode_begin(node, nodeset, code_global): code = [] codeCleanup = [] code.append("UA_StatusCode retVal = UA_STATUSCODE_GOOD;") # Attributes if isinstance(node, ReferenceTypeNode): code.extend(generateReferenceTypeNodeCode(node)) elif isinstance(node, ObjectNode): code.extend(generateObjectNodeCode(node)) elif isinstance(node, VariableNode) and not isinstance(node, VariableTypeNode): [code1, codeCleanup1, codeGlobal1] = generateVariableNodeCode(node, nodeset) code.extend(code1) codeCleanup.extend(codeCleanup1) code_global.extend(codeGlobal1) elif isinstance(node, VariableTypeNode): [code1, codeCleanup1, codeGlobal1] = generateVariableTypeNodeCode(node, nodeset) code.extend(code1) codeCleanup.extend(codeCleanup1) code_global.extend(codeGlobal1) elif isinstance(node, MethodNode): code.extend(generateMethodNodeCode(node)) elif isinstance(node, ObjectTypeNode): code.extend(generateObjectTypeNodeCode(node)) elif isinstance(node, DataTypeNode): code.extend(generateDataTypeNodeCode(node)) elif isinstance(node, ViewNode): code.extend(generateViewNodeCode(node)) if node.displayName is not None: code.append("attr.displayName = " + generateLocalizedTextCode(node.displayName, alloc=False) + ";") if node.description is not None: code.append("#ifdef UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS") code.append("attr.description = " + generateLocalizedTextCode(node.description, alloc=False) + ";") code.append("#endif") if node.writeMask is not None: code.append("attr.writeMask = %d;" % node.writeMask) if node.userWriteMask is not None: code.append("attr.userWriteMask = %d;" % node.userWriteMask) # AddNodes call code.append("retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_{},". format(makeCIdentifier(node.__class__.__name__.upper().replace("NODE" ,"")))) code.append(generateNodeIdCode(node.id) + ",") code.append(generateNodeIdCode(node.parent.id if node.parent else NodeId()) + ",") code.append(generateNodeIdCode(node.parentReference.id if node.parent else NodeId()) + ",") code.append(generateQualifiedNameCode(node.browseName) + ",") if isinstance(node, VariableNode) or isinstance(node, ObjectNode): typeDefRef = node.popTypeDef() code.append(generateNodeIdCode(typeDefRef.target) + ",") else: code.append(" UA_NODEID_NULL,") code.append("(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_{}ATTRIBUTES],NULL, NULL);". format(makeCIdentifier(node.__class__.__name__.upper().replace("NODE" ,"")))) code.extend(codeCleanup) return "\n".join(code)
def getTypesArrayForValue(nodeset, value): typeNode = nodeset.getNodeByBrowseName(value.__class__.__name__) if typeNode is None or value.isInternal: typesArray = "UA_TYPES" else: typesArray = typeNode.typesArray typeName = makeCIdentifier(value.__class__.__name__.upper()) return "&" + typesArray + "[" + typesArray + "_" + typeName + "]"
def getTypeBrowseName(dataTypeNode): typeBrowseName = makeCIdentifier(dataTypeNode.browseName.name) #TODO: review this if typeBrowseName == "NumericRange": # in the stack we define a separate structure for the numeric range, but # the value itself is just a string typeBrowseName = "String" return typeBrowseName
def generateExtensionObjectSubtypeCode(node, parent, nodeset, global_var_code, instanceName=None, isArrayElement=False): code = [""] codeCleanup = [""] logger.debug("Building extensionObject for " + str(parent.id)) logger.debug("Encoding " + str(node.encodingRule)) parentDataType = nodeset.getDataTypeNode(parent.dataType) parentDataTypeName = nodeset.getDataTypeNode( parent.dataType).browseName.name if parentDataType.symbolicName is not None and parentDataType.symbolicName.value is not None: parentDataTypeName = parentDataType.symbolicName.value typeBrowseNode = makeCIdentifier(parentDataTypeName) #TODO: review this if typeBrowseNode == "NumericRange": # in the stack we define a separate structure for the numeric range, but # the value itself is just a string typeBrowseNode = "String" typeString = "UA_" + typeBrowseNode if instanceName is None: instanceName = generateNodeValueInstanceName(node, parent, 0) code.append("UA_STACKARRAY(" + typeString + ", " + instanceName + ", 1);") typeArr = nodeset.getDataTypeNode(parent.dataType).typesArray typeArrayString = typeArr + "[" + typeArr + "_" + parentDataTypeName.upper( ) + "]" code.append("UA_init({ref}{instanceName}, &{typeArrayString});".format( ref="&" if isArrayElement else "", instanceName=instanceName, typeArrayString=typeArrayString)) # Assign data to the struct contents # Track the encoding rule definition to detect arrays and/or ExtensionObjects values = node.value if values == None: values = [] for idx, subv in enumerate(values): if subv is None: continue encField = node.encodingRule[idx].name memberName = makeCIdentifier(lowerFirstChar(encField)) # Check if this is an array accessor = "." if isArrayElement else "->" if isinstance(subv, list): if len(subv) == 0: continue logger.info("ExtensionObject contains array") memberName = makeCIdentifier(lowerFirstChar(encField)) encTypeString = "UA_" + subv[0].__class__.__name__ instanceNameSafe = makeCIdentifier(instanceName) code.append("UA_STACKARRAY(" + encTypeString + ", " + instanceNameSafe + "_" + memberName + ", {0});".format(len(subv))) encTypeArr = nodeset.getDataTypeNode( subv[0].__class__.__name__).typesArray encTypeArrayString = encTypeArr + "[" + encTypeArr + "_" + subv[ 0].__class__.__name__.upper() + "]" code.append("UA_init({instanceName}, &{typeArrayString});".format( instanceName=instanceNameSafe + "_" + memberName, typeArrayString=encTypeArrayString)) for subArrayIdx, val in enumerate(subv): code.append( generateNodeValueCode(instanceNameSafe + "_" + memberName + "[" + str(subArrayIdx) + "]", val, instanceName, instanceName + "_gehtNed_member", global_var_code, asIndirect=False)) code.append(instanceName + accessor + memberName + "Size = {0};".format(len(subv))) code.append(instanceName + accessor + memberName + " = " + instanceNameSafe + "_" + memberName + ";") continue logger.debug("Encoding of field " + memberName + " is " + str(subv.encodingRule) + "defined by " + str(encField)) if subv.valueRank is None or subv.valueRank == 0: 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: memberName = makeCIdentifier(lowerFirstChar(encField)) code.append( generateNodeValueCode(instanceName + accessor + memberName + "Size", subv, instanceName, valueName, global_var_code, asIndirect=False)) if not isArrayElement: code.append("UA_Variant_setScalar(&attr.value, " + instanceName + ", &" + typeArrayString + ");") return [code, codeCleanup]