diff -r 41fc23fd21c4 -r 361366b891ca svghmi/svghmi.py --- a/svghmi/svghmi.py Wed Sep 11 11:20:11 2019 +0200 +++ b/svghmi/svghmi.py Wed Sep 11 12:24:30 2019 +0200 @@ -199,7 +199,7 @@ # "programs_declarations": "\n".join(["extern %(type)s %(C_path)s;" % # p for p in self._ProgramList]), - # TODO generate C code to observe/access HMI tree variables + # C code to observe/access HMI tree variables svghmi_c_filepath = paths.AbsNeighbourFile(__file__, "svghmi.c") svghmi_c_file = open(svghmi_c_filepath, 'r') svghmi_c_code = svghmi_c_file.read() @@ -209,7 +209,7 @@ "extern_variables_declarations": "\n".join(extern_variables_declarations), "buffer_size": buf_index, "var_access_code": targets.GetCode("var_access.c"), - "PLC_ticktime": self.GetCTRoot().GetTicktime() + "PLC_ticktime": self.GetCTR().GetTicktime() } gen_svghmi_c_path = os.path.join(buildpath, "svghmi.c") @@ -217,10 +217,21 @@ gen_svghmi_c.write(svghmi_c_code) gen_svghmi_c.close() - return (["svghmi"], [(gen_svghmi_c_path, IECCFLAGS)], True), "" + # Python based WebSocket HMITree Server + svghmiserverfile = open(paths.AbsNeighbourFile(__file__, "svghmi_server.py"), 'r') + svghmiservercode = svghmiserverfile.read() + svghmiserverfile.close() + + runtimefile_path = os.path.join(buildpath, "runtime_svghmi.py") + runtimefile = open(runtimefile_path, 'w') + runtimefile.write(svghmiservercode) + runtimefile.close() + + return ((["svghmi"], [(gen_svghmi_c_path, IECCFLAGS)], True), "", + ("runtime_svghmi0.py", open(runtimefile_path, "rb"))) class SVGHMI(object): - XSD = """ + XSD = """ @@ -245,6 +256,10 @@ "tooltip": _("Edit HMI"), "method": "_StartInkscape" }, + + # TODO : HMITree button + # - can drag'n'drop variabes to Inkscape + ] def _getSVGpath(self, project_path=None): @@ -294,7 +309,18 @@ @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND """ + location_str = "_".join(map(str, self.GetCurrentLocation())) + view_name = self.BaseParams.getName() + svgfile = self._getSVGpath() + + res = ([], "", False) + + target_fname = "sghmi_"+location_str+".xhtml" + + target_path = os.path.join(self._getBuildPath(), target_fname) + target_file = open(target_path, 'w') + if os.path.exists(svgfile): # TODO : move to __init__ @@ -309,6 +335,7 @@ # call xslt transform on Inkscape's SVG to generate XHTML result = transform.transform(svgdom) + result.write(target_file, encoding="utf-8") # print(str(result)) # print(transform.xslt.error_log) @@ -318,23 +345,29 @@ else: # TODO : use default svg that expose the HMI tree as-is - pass - - - res = ([], "", False) - - targetpath = os.path.join(self._getBuildPath(), "target.xhtml") - targetfile = open(targetpath, 'w') - - # TODO : DOM to string - targetfile.write("TODO") - targetfile.close() - res += (("target.js", open(targetpath, "rb")),) - - # TODO add C code to expose HMI tree variables to shared memory - # TODO generate a description of shared memory (xml or CSV) - # that can be loaded by svghmi QTWeb* app or svghmi server - + target_file.write(""" + + +

No SVG file provided

+ + +""") + + target_file.close() + + runtimefile_path = os.path.join(buildpath, "runtime_svghmi1_%s.py" % location_str) + runtimefile = open(runtimefile_path, 'w') + runtimefile.write(""" +def _runtime_svghmi1_%(location)s_start(): + svghmi_root.putChild('%(view_name)s',File('%(xhtml)s')) + + """ % {"location": location_str, + "xhtml": target_fname, + "view_name": view_name}) + + runtimefile.close() + + res += (("runtime_svghmi1_%s.py" % location_str, open(runtimefile_path, "rb")),) return res