etisserant@31: import wx etisserant@31: import wx.stc as stc etisserant@31: import os, sys, shutil etisserant@31: from CppSTC import CppSTC etisserant@31: from plugger import PlugTemplate etisserant@31: etisserant@31: class _Cfile: etisserant@31: XSD = """ etisserant@31: etisserant@31: etisserant@31: etisserant@31: etisserant@31: etisserant@31: etisserant@31: etisserant@31: """ etisserant@31: def __init__(self): etisserant@31: if not os.path.isfile(self.CFileName()): etisserant@31: f = open(self.CFileName(), 'w') etisserant@31: f.write("/*Empty*/") etisserant@31: etisserant@31: def CFileName(self): etisserant@31: return os.path.join(self.PlugPath(),self.C_File.getFileName()) etisserant@31: etisserant@31: def SetParamsAttribute(self, path, value, logger): etisserant@31: oldname = self.CFileName() etisserant@31: res = PlugTemplate.SetParamsAttribute(self, path, value, logger) etisserant@31: if path == "C_File.FileName": etisserant@31: shutil.move(oldname, self.CFileName()) etisserant@31: logger.write("\"%s\" renamed \"%s\"\n"%(oldname, self.CFileName())) etisserant@31: return value, False etisserant@31: return res etisserant@31: etisserant@31: _View = None etisserant@31: def _OpenView(self, logger): etisserant@31: if not self._View: etisserant@31: def _onclose(evt): etisserant@31: self.OnPlugSave() etisserant@31: self._View = None etisserant@31: evt.Skip() etisserant@31: self._View = wx.Frame(self.GetPlugRoot().AppFrame,-1) etisserant@31: self._View.Bind(wx.EVT_CLOSE, _onclose) etisserant@31: ed = CppSTC(self._View, wx.NewId()) etisserant@31: ed.SetText(open(self.CFileName()).read()) etisserant@31: ed.EmptyUndoBuffer() etisserant@31: ed.Colourise(0, -1) etisserant@31: ed.SetMarginType(1, stc.STC_MARGIN_NUMBER) etisserant@31: ed.SetMarginWidth(1, 25) etisserant@31: self._View.ed = ed etisserant@31: etisserant@31: self._View.Show() etisserant@31: etisserant@31: PluginMethods = [("Edit C File",_OpenView)] etisserant@31: etisserant@31: def OnPlugSave(self): etisserant@31: if self._View: etisserant@31: f = open(self.CFileName(),'w') etisserant@31: f.write(self._View.ed.GetText()) etisserant@31: return True etisserant@31: etisserant@31: def PlugGenerate_C(self, buildpath, locations, logger): etisserant@31: """ etisserant@31: Generate C code etisserant@31: @param current_location: Tupple containing plugin IEC location : %I0.0.4.5 => (0,0,4,5) etisserant@31: @param locations: List of complete variables locations \ etisserant@31: [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...) etisserant@31: "NAME" : name of the variable (generally "__IW0_1_2" style) etisserant@31: "DIR" : direction "Q","I" or "M" etisserant@31: "SIZE" : size "X", "B", "W", "D", "L" etisserant@31: "LOC" : tuple of interger for IEC location (0,1,2,...) etisserant@31: }, ...] etisserant@31: @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND etisserant@31: """ etisserant@31: current_location = self.GetCurrentLocation() etisserant@31: # define a unique name for the generated C file etisserant@31: prefix = "_".join(map(lambda x:str(x), current_location)) etisserant@31: Gen_Cfile_path = os.path.join(buildpath, prefix + "_CFile.c" ) etisserant@31: f = open(Gen_Cfile_path,'w') etisserant@31: f.write("/* Header generated by Beremiz c_ext plugin */\n") etisserant@31: f.write("#include \"iec_std_lib.h\"\n") etisserant@31: for loc in locations: etisserant@31: f.write(loc["IEC_TYPE"]+" "+loc["NAME"]+";\n") etisserant@31: f.write("/* End of header generated by Beremiz c_ext plugin */\n") etisserant@31: etisserant@31: return [(Gen_Cfile_path,"")],"" etisserant@31: etisserant@31: class RootClass: etisserant@31: etisserant@31: PlugChildsTypes = [("C_File",_Cfile)] etisserant@31: etisserant@31: def PlugGenerate_C(self, buildpath, locations, logger): etisserant@31: return [],"" etisserant@31: etisserant@31: