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)
Exemple #2
0
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 + "]"
Exemple #3
0
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
Exemple #4
0
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]