Procházet zdrojové kódy

a messy try of implementing a plugin system for code generator
Manual:
*run a build
*look into tool/plugin_Node.py
*seach opcua.c for "Hello"

Stasik0 před 11 roky
rodič
revize
1b36c82014
2 změnil soubory, kde provedl 36 přidání a 1 odebrání
  1. 24 1
      tool/generate_builtin.py
  2. 12 0
      tool/plugin_Node.py

+ 24 - 1
tool/generate_builtin.py

@@ -261,6 +261,23 @@ print('#define OPCUA_H_', end='\n', file=fh)
 print('#include "opcua_basictypes.h"', end='\n', file=fh)
 print('#include "opcua_namespace_0.h"', end='\n', file=fh);
 
+
+#plugin handling
+import os
+files = [f for f in os.listdir('.') if os.path.isfile(f) and f[-3:] == ".py" and f[:7] == "plugin_"]
+plugin_types = []
+packageForType = OrderedDict()
+
+for f in files:
+	package = f[:-3]
+	exec "import " + package
+	exec "pluginSetup = " + package + ".setup()"
+	if pluginSetup["pluginType"] == "structuredObject":
+		plugin_types.append(pluginSetup["tagName"])
+		packageForType[pluginSetup["tagName"]] = package
+		print("Custom object creation for tag " + pluginSetup["tagName"] + " imported from package " + package)
+#end plugin handling
+
 for element in types:
     name = element.get("Name")
     if skipType(name):
@@ -285,7 +302,13 @@ for element in types:
     #    print "package ListOf" + name + " is new Types.Arrays.UA_Builtin_Arrays(" + name + ");\n"
 
 for name, element in deferred_types.iteritems():
-    createStructured(element)
+	if name in plugin_types:
+		#execute plugin if registered
+		exec "ret = " + packageForType[name]+".createElement(element, fc, fh)"
+		if ret == "default":
+			createStructured(element)
+	else:
+		createStructured(element)
     # if name in arraytypes:
     #    print "package ListOf" + name + " is new Types.Arrays.UA_Builtin_Arrays(" + name + ");\n"
 

+ 12 - 0
tool/plugin_Node.py

@@ -0,0 +1,12 @@
+from __future__ import print_function
+
+def setup():
+	config = dict()
+	config["pluginType"] = "structuredObject";
+	config["tagName"] = "Node";
+	return config
+
+def createElement(element, fc, fh):
+	print("/* Hello from plugin */", end='\n', file=fc)
+	#return "default" to execute the default createElement
+	return "default"