Browse Source

Make small functions to create the nodeset instead of a big one

Jose Cabral 7 years ago
parent
commit
d1beeed78e

+ 27 - 14
tools/nodeset_compiler/backend_open62541.py

@@ -210,29 +210,26 @@ extern UA_StatusCode %s(UA_Server *server);
  * Any manual changes will be overwritten. */
 
 #include "%s.h"
-
-UA_StatusCode %s(UA_Server *server) {  // NOLINT
-
-UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-""" % (outfilebase, outfilebase))
+""" % (outfilebase))
 
     parentrefs = getSubTypesOf(nodeset, nodeset.getNodeByBrowseName("HierarchicalReferences"))
     parentrefs = list(map(lambda x: x.id, parentrefs))
 
-    # Generate namespaces (don't worry about duplicates)
-    writec("/* Use namespace ids generated by the server */")
-    for i, nsid in enumerate(nodeset.namespaces):
-        nsid = nsid.replace("\"", "\\\"")
-        writec("UA_UInt16 ns" + str(i) + " = UA_Server_addNamespace(server, \"" + nsid + "\");")
-
     # Loop over the sorted nodes
     logger.info("Reordering nodes for minimal dependencies during printing")
     sorted_nodes = reorderNodesMinDependencies(nodeset)
     logger.info("Writing code for nodes and references")
+    
+    functionNumber = 0
+    
+    for i in range(0, len(sorted_nodes)):
+        writec("UA_StatusCode function_" + outfilebase + "_" + str(i) + "(UA_Server *server, UA_UInt16 *ns);")
+    
     for node in sorted_nodes:
         # Print node
         if not node.hidden:
             writec("\n/* " + str(node.displayName) + " - " + str(node.id) + " */")
+            writec("\nUA_StatusCode function_" + outfilebase + "_" + str(functionNumber) + "(UA_Server *server, UA_UInt16* ns){\n")
             code = generateNodeCode(node, supressGenerationOfAttribute, generate_ns0, parentrefs, nodeset, max_string_length)
             if code is None:
                 writec("/* Ignored. No parent */")
@@ -244,11 +241,27 @@ UA_StatusCode retVal = UA_STATUSCODE_GOOD;
         # Print inverse references leading to this node
         for ref in node.printRefs:
             writec(generateReferenceCode(ref))
+            
+        writec("return retVal;\n}")
+        functionNumber = functionNumber + 1
+    
+    
+    writec("""
+UA_StatusCode %s(UA_Server *server) {  // NOLINT
 
-    # Finalize the generated source
-    writec("return retVal;")
-    writec("} // closing nodeset()")
+UA_StatusCode retVal = UA_STATUSCODE_GOOD;""" % (outfilebase))
+    # Generate namespaces (don't worry about duplicates)
+    writec("/* Use namespace ids generated by the server */")
+    writec("UA_UInt16 ns[" + str(len(nodeset.namespaces)) + "];")
+    for i, nsid in enumerate(nodeset.namespaces):
+        nsid = nsid.replace("\"", "\\\"")
+        writec("ns[" + str(i) + "] = UA_Server_addNamespace(server, \"" + nsid + "\");")
 
+    for i in range(0, functionNumber):
+        writec("retVal |= function_" + outfilebase + "_" + str(i) + "(server, ns);")
+    
+        
+    writec("return retVal;\n}")
     outfileh.close()
     fullCode = outfilec.getvalue()
     outfilec.close()

+ 5 - 5
tools/nodeset_compiler/backend_open62541_datatypes.py

@@ -47,23 +47,23 @@ def generateLocalizedTextCode(value, alloc=False, max_string_length=0):
                                                        value.locale, splitStringLiterals(value.text, max_string_length=max_string_length))
 
 def generateQualifiedNameCode(value, alloc=False, max_string_length=0):
-    return "UA_QUALIFIEDNAME{}(ns{}, {})".format("_ALLOC" if alloc else "",
+    return "UA_QUALIFIEDNAME{}(ns[{}], {})".format("_ALLOC" if alloc else "",
                                                      str(value.ns), splitStringLiterals(value.name, max_string_length=max_string_length))
 
 def generateNodeIdCode(value):
     if not value:
         return "UA_NODEID_NUMERIC(0,0)"
     if value.i != None:
-        return "UA_NODEID_NUMERIC(ns%s,%s)" % (value.ns, value.i)
+        return "UA_NODEID_NUMERIC(ns[%s],%s)" % (value.ns, value.i)
     elif value.s != None:
-        return "UA_NODEID_STRING(ns%s,%s)" % (value.ns, value.s.replace('"', r'\"'))
+        return "UA_NODEID_STRING(ns[%s],%s)" % (value.ns, value.s.replace('"', r'\"'))
     raise Exception(str(value) + " no NodeID generation for bytestring and guid..")
 
 def generateExpandedNodeIdCode(value):
     if value.i != None:
-        return "UA_EXPANDEDNODEID_NUMERIC(ns%s, %s)" % (str(value.ns), str(value.i))
+        return "UA_EXPANDEDNODEID_NUMERIC(ns[%s], %s)" % (str(value.ns), str(value.i))
     elif value.s != None:
-        return "UA_EXPANDEDNODEID_STRING(ns%s, %s)" % (str(value.ns), value.s.replace('"', r'\"'))
+        return "UA_EXPANDEDNODEID_STRING(ns[%s], %s)" % (str(value.ns), value.s.replace('"', r'\"'))
     raise Exception(str(value) + " no NodeID generation for bytestring and guid..")
 
 def generateDateTimeCode(value):

+ 2 - 2
tools/nodeset_compiler/backend_open62541_nodes.py

@@ -455,7 +455,7 @@ def generateSubtypeOfDefinitionCode(node):
 
 def generateNodeCode(node, supressGenerationOfAttribute, generate_ns0, parentrefs, nodeset, max_string_length):
     code = []
-    code.append("{")
+    code.append("UA_StatusCode retVal = UA_STATUSCODE_GOOD;")
 
     codeCleanup = []
 
@@ -519,5 +519,5 @@ def generateNodeCode(node, supressGenerationOfAttribute, generate_ns0, parentref
     else:
         code.append("NULL, NULL);")
     code.extend(codeCleanup)
-    code.append("}\n")
+    
     return "\n".join(code)