Base build mechanism layout.
authoretisserant
Mon, 03 Sep 2007 17:12:43 +0200
changeset 18 0fac6d621a24
parent 17 ee8cb104dbe0
child 19 73257cea38bd
Base build mechanism layout.
Beremiz.py
plugger.py
plugins/canfestival/canfestival.py
--- a/Beremiz.py	Fri Aug 31 15:11:30 2007 +0200
+++ b/Beremiz.py	Mon Sep 03 17:12:43 2007 +0200
@@ -866,61 +866,6 @@
         err = child.wait()
         return (err, outdata, errdata)
 
-    def BuildAutom(self):
-        LOCATED_MODEL = re.compile("__LOCATED_VAR\(([A-Z]*),([_A-Za-z0-9]*)\)")
-        
-        if self.PLCManager:
-            self.TargetDir = os.path.join(self.CurrentProjectPath, "build")
-            if not os.path.exists(self.TargetDir):
-                os.mkdir(self.TargetDir)
-            self.Log.flush()
-            try:
-                self.Log.write("Generating IEC-61131 code...\n")
-                plc_file = os.path.join(self.TargetDir, "plc.st")
-                result = self.PLCManager.GenerateProgram(plc_file)
-                if not result:
-                    raise Exception, "Error : ST/IL/SFC code generator returned %d"%result
-                self.Log.write("Compiling ST Program in to C Program...\n")
-                status, result, err_result = self.LogCommand("%s %s -I %s %s"%(iec2cc_path, plc_file, ieclib_path, self.TargetDir))
-                if status:
-                    new_dialog = wx.Frame(None)
-                    ST_viewer = TextViewer(new_dialog, None, None)
-                    #ST_viewer.Enable(False)
-                    ST_viewer.SetKeywords(IEC_KEYWORDS)
-                    ST_viewer.SetText(file(plc_file).read())
-                    new_dialog.Show()
-                    raise Exception, "Error : IEC to C compiler returned %d"%status
-                C_files = result.splitlines()
-                C_files.remove("POUS.c")
-                C_files = map(lambda filename:os.path.join(self.TargetDir, filename), C_files)
-                self.Log.write("Extracting Located Variables...\n")
-                location_file = open(os.path.join(self.TargetDir,"LOCATED_VARIABLES.h"))
-                locations = []
-                lines = [line.strip() for line in location_file.readlines()]
-                for line in lines:
-                    result = LOCATED_MODEL.match(line)
-                    if result:
-                        locations.append(result.groups())
-                self.Log.write("Generating Network Configurations...\n")
-                for bus_id, bus_infos in self.BusManagers.items():
-                   if bus_infos["Manager"]:
-                        c_filename = "%s.c"%os.path.join(self.TargetDir, gen_cfile.FormatName(bus_infos["Name"]))
-                        result = bus_infos["Manager"].GenerateBus(c_filename, locations)
-                        if result:
-                            raise Exception
-                        else:
-                            C_files.append(c_filename)
-                self.Log.write("Generating Makefiles...\n")
-                self.Log.write(str(C_files))
-                
-                self.Log.write("Compiling Project...\n")
-                
-                self.Log.write("\nBuild Project completed\n")
-            except Exception, message:
-                self.Log.write_error("\nBuild Failed\n")
-                self.Log.write(str(message))
-                pass
-                
 #-------------------------------------------------------------------------------
 #                             Add Bus Dialog
 #-------------------------------------------------------------------------------
--- a/plugger.py	Fri Aug 31 15:11:30 2007 +0200
+++ b/plugger.py	Mon Sep 03 17:12:43 2007 +0200
@@ -117,22 +117,24 @@
         shutil.copytree(src_PlugPath, self.PlugPath)
         return True
 
-    def PlugGenerate_C(self, buildpath, current_location, locations):
+    def PlugGenerate_C(self, buildpath, current_location, locations, logger):
         """
         Generate C code
         @param current_location: Tupple containing plugin IEC location : %I0.0.4.5 => (0,0,4,5)
         @param locations: List of complete variables locations \
             [(IEC_loc, IEC_Direction, IEC_Type, Name)]\
             ex: [((0,0,4,5),'I','STRING','__IX_0_0_4_5'),...]
-        """
+        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
+        """
+        logger.write_warning(".".join(map(lambda x:str(x), current_location)) + " -> Nothing yo do")
         return [],""
     
-    def _Generate_C(self, buildpath, current_location, locations):
+    def _Generate_C(self, buildpath, current_location, locations, logger):
         # Generate plugins [(Cfiles, CFLAGS)], LDFLAGS
-        PlugCFilesAndCFLAGS, PlugLDFLAGS = self.PlugGenerate_C(buildpath, current_location, locations)
+        PlugCFilesAndCFLAGS, PlugLDFLAGS = self.PlugGenerate_C(buildpath, current_location, locations, logger)
         # recurse through all childs, and stack their results
         for PlugChild in self.IterChilds():
-            # Compute chile IEC location
+            # Compute child's IEC location
             new_location = current_location + (self.BaseParams.getIEC_Channel())
             # Get childs [(Cfiles, CFLAGS)], LDFLAGS
             CFilesAndCFLAGS, LDFLAGS = \
@@ -142,7 +144,9 @@
                     # but update location (add curent IEC channel at the end)
                     new_location,
                     # filter locations that start with current IEC location
-                    [ (l,d,t,n) for l,d,t,n in locations if l[0:len(new_location)] == new_location ])
+                    [ (l,d,t,n) for l,d,t,n in locations if l[0:len(new_location)] == new_location ],
+                    #propagete logger
+                    logger)
             # stack the result
             PlugCFilesAndCFLAGS += CFilesAndCFLAGS
             PlugLDFLAGS += LDFLAGS
@@ -519,3 +523,89 @@
     
     def PluginXmlFilePath(self, PlugName=None):
         return os.path.join(self.PlugPath(PlugName), "beremiz.xml")
+
+    def PlugGenerate_C(self, buildpath, current_location, locations, logger):
+        """
+        Generate C code
+        @param current_location: Tupple containing plugin IEC location : %I0.0.4.5 => (0,0,4,5)
+        @param locations: List of complete variables locations \
+            [(IEC_loc, IEC_Direction, IEC_Type, Name)]\
+            ex: [((0,0,4,5),'I','STRING','__IX_0_0_4_5'),...]
+        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
+        """
+        return [(C_file_name, "") for C_file_name in self.PLCGeneratedCFiles ] , ""
+        
+    def _Generate_SoftPLC(self, buildpath, logger):
+
+        LOCATED_MODEL = re.compile("__LOCATED_VAR\((?P<IEC_TYPE>[A-Z]*),(?P<NAME>[_A-Za-z0-9]*),(?P<DIR>[QMI])(?:,(?P<SIZE>[XBWD]))?,(?P<LOC>[,0-9]*)\)")
+        
+        if self.PLCManager:
+            logger.write("Generating SoftPLC IEC-61131 ST/IL/SFC code...\n")
+            plc_file = os.path.join(self.TargetDir, "plc.st")
+            result = self.PLCManager.GenerateProgram(plc_file)
+            if not result:
+                logger.write_error("Error : ST/IL/SFC code generator returned %d"%result)
+                return False
+            logger.write("Compiling ST Program in to C Program...\n")
+            status, result, err_result = self.LogCommand("%s %s -I %s %s"%(iec2cc_path, plc_file, ieclib_path, self.TargetDir))
+            if status:
+                new_dialog = wx.Frame(None)
+                ST_viewer = TextViewer(new_dialog, None, None)
+                #ST_viewer.Enable(False)
+                ST_viewer.SetKeywords(IEC_KEYWORDS)
+                ST_viewer.SetText(file(plc_file).read())
+                new_dialog.Show()
+                raise Exception, "Error : IEC to C compiler returned %d"%status
+            C_files = result.splitlines()
+            C_files.remove("POUS.c")
+            C_files = map(lambda filename:os.path.join(self.TargetDir, filename), C_files)
+            logger.write("Extracting Located Variables...\n")
+            location_file = open(os.path.join(self.TargetDir,"LOCATED_VARIABLES.h"))
+            locations = []
+            lines = [line.strip() for line in location_file.readlines()]
+            for line in lines:
+                result = LOCATED_MODEL.match(line)
+                if result:
+                    resdict = result.groupdict()
+                    # rewrite location as a tuple of integers
+                    resdict['LOC'] = tuple(map(int,resdict['LOC'].split(',')))
+                    if not resdict['SIZE']:
+                        resdict['SIZE'] = 'X'
+                    locations.append(resdict)
+        self.PLCGeneratedCFiles = C_files
+        self.PLCGeneratedLocatedVars = locations
+        return True
+
+    def _build(self, logger):
+        buildpath = os.path.join(self.ProjectPath, "build")
+        if not os.path.exists(buildpath):
+            os.mkdir(buildpath)
+        
+        logger.write("Start build in %s" % buildpath)
+        
+        if not self._Generate_SoftPLC(buildpath, logger):
+            logger.write("SoftPLC code generation failed !")
+            return
+    
+        logger.write("SoftPLC code generation successfull")
+        
+        try:
+            CFilesAndCFLAGS, LDFLAGS = self._Generate_C(
+                buildpath, 
+                (), 
+                self.PLCGeneratedLocatedVars,
+                logger)
+        except Exception, msg:
+            logger.write_error("Plugins code generation Failed !")
+            logger.write_error(str(msg))
+            return
+
+        logger.write_error("Plugins code generation successfull")
+        
+        for CFile, CFLAG in CFilesAndCFLAGS:
+            print CFile,CFLAG
+        
+        LDFLAGS
+
+    PluginMethods = [("Build",_build), ("Clean",None), ("Run",None), ("EditPLC",None), ("Simulate",None)]
+    
--- a/plugins/canfestival/canfestival.py	Fri Aug 31 15:11:30 2007 +0200
+++ b/plugins/canfestival/canfestival.py	Mon Sep 03 17:12:43 2007 +0200
@@ -28,7 +28,7 @@
         self.LoadProject(self.PlugPath())
 
     _View = None
-    def _OpenView(self):
+    def _OpenView(self, logger):
         if not self._View:
             def _onclose():
                 self.View = None
@@ -48,7 +48,7 @@
         self.SaveProject()
         return True
 
-    def PlugGenerate_C(self, buildpath, current_location, locations):
+    def PlugGenerate_C(self, buildpath, current_location, locations, logger):
         """
         Generate C code
         @param current_location: Tupple containing plugin IEC location : %I0.0.4.5 => (0,0,4,5)