plugins/c_ext/c_ext.py
author etisserant
Tue, 11 Sep 2007 16:11:15 +0200
changeset 31 33b38700d0db
child 45 00acf2162135
permissions -rw-r--r--
added basic C Code extention plugin
31
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
     1
import wx
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
     2
import wx.stc as stc
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
     3
import os, sys, shutil
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
     4
from CppSTC import CppSTC
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
     5
from plugger import PlugTemplate
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
     6
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
     7
class _Cfile:
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
     8
    XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
     9
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    10
      <xsd:element name="C_File">
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    11
        <xsd:complexType>
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    12
          <xsd:attribute name="FileName" type="xsd:string" use="required" default="myfile.c"/>
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    13
        </xsd:complexType>
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    14
      </xsd:element>
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    15
    </xsd:schema>
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    16
    """
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    17
    def __init__(self):
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    18
        if not os.path.isfile(self.CFileName()):
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    19
            f = open(self.CFileName(), 'w')
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    20
            f.write("/*Empty*/")
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    21
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    22
    def CFileName(self):
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    23
        return os.path.join(self.PlugPath(),self.C_File.getFileName())
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    24
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    25
    def SetParamsAttribute(self, path, value, logger):
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    26
        oldname = self.CFileName()
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    27
        res = PlugTemplate.SetParamsAttribute(self, path, value, logger)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    28
        if path == "C_File.FileName":
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    29
            shutil.move(oldname, self.CFileName())
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    30
            logger.write("\"%s\" renamed \"%s\"\n"%(oldname, self.CFileName()))
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    31
            return value, False
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    32
        return res
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    33
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    34
    _View = None
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    35
    def _OpenView(self, logger):
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    36
        if not self._View:
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    37
            def _onclose(evt):
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    38
                self.OnPlugSave()
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    39
                self._View = None
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    40
                evt.Skip()
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    41
            self._View = wx.Frame(self.GetPlugRoot().AppFrame,-1)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    42
            self._View.Bind(wx.EVT_CLOSE, _onclose)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    43
            ed = CppSTC(self._View, wx.NewId())
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    44
            ed.SetText(open(self.CFileName()).read())
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    45
            ed.EmptyUndoBuffer()
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    46
            ed.Colourise(0, -1)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    47
            ed.SetMarginType(1, stc.STC_MARGIN_NUMBER)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    48
            ed.SetMarginWidth(1, 25)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    49
            self._View.ed = ed
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    50
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    51
            self._View.Show()
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    52
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    53
    PluginMethods = [("Edit C File",_OpenView)]
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    54
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    55
    def OnPlugSave(self):
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    56
        if self._View:
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    57
            f = open(self.CFileName(),'w')
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    58
            f.write(self._View.ed.GetText())
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    59
        return True
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    60
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    61
    def PlugGenerate_C(self, buildpath, locations, logger):
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    62
        """
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    63
        Generate C code
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    64
        @param current_location: Tupple containing plugin IEC location : %I0.0.4.5 => (0,0,4,5)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    65
        @param locations: List of complete variables locations \
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    66
            [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    67
            "NAME" : name of the variable (generally "__IW0_1_2" style)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    68
            "DIR" : direction "Q","I" or "M"
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    69
            "SIZE" : size "X", "B", "W", "D", "L"
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    70
            "LOC" : tuple of interger for IEC location (0,1,2,...)
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    71
            }, ...]
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    72
        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    73
        """
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    74
        current_location = self.GetCurrentLocation()
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    75
        # define a unique name for the generated C file
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    76
        prefix = "_".join(map(lambda x:str(x), current_location))
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    77
        Gen_Cfile_path = os.path.join(buildpath, prefix + "_CFile.c" )
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    78
        f = open(Gen_Cfile_path,'w')
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    79
        f.write("/* Header generated by Beremiz c_ext plugin */\n")
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    80
        f.write("#include \"iec_std_lib.h\"\n")
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    81
        for loc in locations:
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    82
            f.write(loc["IEC_TYPE"]+" "+loc["NAME"]+";\n")
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    83
        f.write("/* End of header generated by Beremiz c_ext plugin */\n")
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    84
        
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    85
        return [(Gen_Cfile_path,"")],""
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    86
    
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    87
class RootClass:
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    88
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    89
    PlugChildsTypes = [("C_File",_Cfile)]
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    90
    
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    91
    def PlugGenerate_C(self, buildpath, locations, logger):
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    92
        return [],""
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    93
33b38700d0db added basic C Code extention plugin
etisserant
parents:
diff changeset
    94