浏览代码

Set abstract flag for VariableType nodes

Stefan Profanter 7 年之前
父节点
当前提交
0f5d0af2fa
共有 2 个文件被更改,包括 16 次插入2 次删除
  1. 9 2
      tools/nodeset_compiler/backend_open62541_nodes.py
  2. 7 0
      tools/nodeset_compiler/nodes.py

+ 9 - 2
tools/nodeset_compiler/backend_open62541_nodes.py

@@ -148,6 +148,8 @@ def generateVariableTypeNodeCode(node, nodeset, max_string_length):
     code.append("UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default;")
     if node.historizing:
         code.append("attr.historizing = true;")
+    if node.isAbstract:
+        code.append("attr.isAbstract = true;")
     code.append("attr.valueRank = (UA_Int32)%s;" % str(node.valueRank))
     if node.dataType is not None:
         if isinstance(node.dataType, NodeId) and node.dataType.ns == 0 and node.dataType.i == 0:
@@ -286,8 +288,13 @@ def generateValueCodeDummy(dataTypeNode, parentNode, nodeset, bootstrapping=True
     code = []
     valueName = generateNodeIdPrintable(parentNode) + "_variant_DataContents"
 
-    typeArr = dataTypeNode.typesArray + "[" + dataTypeNode.typesArray + "_" + dataTypeNode.browseName.name.upper() + "]"
-    typeStr = "UA_" + dataTypeNode.browseName.name
+    typeBrowseNode = dataTypeNode.browseName.name
+    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"
+
+    typeArr = dataTypeNode.typesArray + "[" + dataTypeNode.typesArray + "_" + typeBrowseNode.upper() + "]"
+    typeStr = "UA_" + typeBrowseNode
 
     if parentNode.valueRank > 0:
         code.append(typeStr + " *" + valueName + " = (" + typeStr + "*) UA_alloca(" + typeArr + ".memSize * " + str(parentNode.valueRank) + ");")

+ 7 - 0
tools/nodeset_compiler/nodes.py

@@ -303,9 +303,16 @@ class VariableTypeNode(VariableNode):
     def __init__(self, xmlelement=None):
         VariableNode.__init__(self)
         self.nodeClass = NODE_CLASS_VARIABLETYPE
+        self.isAbstract = False
         if xmlelement:
             self.parseXML(xmlelement)
 
+    def parseXML(self, xmlelement):
+        Node.parseXML(self, xmlelement)
+        for (at, av) in xmlelement.attributes.items():
+            if at == "IsAbstract":
+                self.isAbstract = "false" not in av.lower()
+
 class MethodNode(Node):
     def __init__(self, xmlelement=None):
         Node.__init__(self)