Beremiz.py
changeset 11 75ae893d5eed
parent 9 bc29b3bf2a5a
child 12 a1f9e514f708
--- a/Beremiz.py	Thu Aug 16 12:03:00 2007 +0200
+++ b/Beremiz.py	Mon Aug 20 14:28:08 2007 +0200
@@ -36,14 +36,11 @@
 ieclib_path = os.path.join(base_folder, "matiec", "lib")
 
 from PLCOpenEditor import PLCOpenEditor, ProjectDialog
-from TextViewer import *
-from plcopen.structures import IEC_KEYWORDS
+from TextViewer import TextViewer
+from plcopen.structures import IEC_KEYWORDS, AddPlugin
 from PLCControler import PLCControler
 
-from networkedit import networkedit
-from nodelist import NodeList
-from nodemanager import NodeManager
-import config_utils, gen_cfile
+import plugins
 
 __version__ = "$Revision$"
 
@@ -334,6 +331,15 @@
     def __init__(self, parent):
         self._init_ctrls(parent)
         
+        for name in plugins.__all__:
+            module = getattr(plugins, name)
+            if len(module.BlockList) > 0:
+                function = module.GetBlockGenerationFunction(self)
+                blocklist = module.BlockList
+                for blocktype in blocklist["list"]:
+                    blocktype["generate"] = function
+                AddPlugin(module.BlockList)
+        
         self.CurrentProjectPath = ""
         
         self.PLCManager = None
@@ -439,18 +445,18 @@
                 raise Exception
             for bus_id, bus_type, bus_name in [line.split(" ") for line in lines[1:]]:
                 id = int(bus_id, 16)
-                if bus_type == "CanFestival":
-                    manager = NodeManager(os.path.join(base_folder, "CanFestival-3", "objdictgen"))
-                    nodelist = NodeList(manager)
-                    result = nodelist.LoadProject(projectpath, bus_name)
+                controller = getattr(plugins, bus_type).controller
+                if controller != None:
+                    manager = controller()
+                    result = manager.LoadProject(projectpath, bus_name)
                     if not result:
-                        self.BusManagers[id] = {"Name" : bus_name, "Type" : bus_type, "NodeList" : nodelist, "Editor" : None}
+                        self.BusManagers[id] = {"Name" : bus_name, "Type" : bus_type, "Manager" : manager, "Editor" : None}
                     else:
                         message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
                         message.ShowModal()
                         message.Destroy()
                 else:
-                    self.BusManagers[id] = {"Name" : bus_name, "Type" : bus_type}
+                    self.BusManagers[id] = {"Name" : bus_name, "Type" : bus_type, "Manager" : None, "Editor" : None}
             file.close()
             self.PLCManager = PLCControler()
             plc_file = os.path.join(projectpath, "plc.xml")
@@ -471,8 +477,8 @@
             self.RefreshBusList()
             self.RefreshButtons()
             self.RefreshMainMenu()
-        except Exception:
-            message = wx.MessageDialog(self, "\"%s\" folder is not a valid Beremiz project"%projectpath, "Error", wx.OK|wx.ICON_ERROR)
+        except Exception, message:
+            message = wx.MessageDialog(self, "\"%s\" folder is not a valid Beremiz project\n%s"%(projectpath,message), "Error", wx.OK|wx.ICON_ERROR)
             message.ShowModal()
             message.Destroy()
     
@@ -508,7 +514,7 @@
         for id in busidlist:
             bus_infos = self.BusManagers[id]
             file.write("0x%2.2X %s %s\n"%(id, bus_infos["Type"], bus_infos["Name"]))
-            bus_infos["NodeList"].SaveProject(bus_infos["Name"])
+            bus_infos["Manager"].SaveProject(bus_infos["Name"])
         file.close()
         event.Skip()
     
@@ -577,12 +583,13 @@
         busidlist = self.BusManagers.keys()
         busidlist.sort()
         bus_infos = self.BusManagers[busidlist[selected]]
-        if bus_infos["Type"] == "CanFestival":
+        view = getattr(plugins, bus_infos["Type"]).view
+        if view != None:
             if bus_infos["Editor"] == None:
-                netedit = networkedit(self, bus_infos["NodeList"])
-                netedit.SetBusId(busidlist[selected])
-                netedit.Show()
-                bus_infos["Editor"] = netedit
+                editor = view(self, bus_infos["Manager"])
+                editor.SetBusId(busidlist[selected])
+                editor.Show()
+                bus_infos["Editor"] = editor
         event.Skip()
     
     def CloseEditor(self, bus_id):
@@ -598,18 +605,18 @@
             else:
                 bus_id = int(values["busID"])
             if self.BusManagers.get(bus_id, None) == None:
-                if values["busType"] == "CanFestival":
-                    manager = NodeManager(os.path.join(base_folder, "CanFestival-3", "objdictgen"))
-                    nodelist = NodeList(manager)
-                    result = nodelist.LoadProject(self.CurrentProjectPath, values["busName"])
+                controller = getattr(plugins, values["busType"]).controller
+                if controller != None:
+                    manager = controller()
+                    result = manager.LoadProject(self.CurrentProjectPath, values["busName"])
                     if not result:
-                        self.BusManagers[bus_id] = {"Name" : values["busName"], "Type" : values["busType"], "NodeList" : nodelist, "Editor" : None}
+                        self.BusManagers[bus_id] = {"Name" : values["busName"], "Type" : values["busType"], "Manager" : manager, "Editor" : None}
                     else:
                         message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
                         message.ShowModal()
                         message.Destroy()
                 else:
-                    self.BusManagers[bus_id] = {"Name" : values["busName"], "Type" : values["busType"]}
+                    self.BusManagers[bus_id] = {"Name" : values["busName"], "Type" : values["busType"], "Manager" : None, "Editor" : None}
             else:
                 message = wx.MessageDialog(self, "The bus ID \"0x%2.2X\" is already used!"%bus_id, "Error", wx.OK|wx.ICON_ERROR)
                 message.ShowModal()
@@ -708,11 +715,11 @@
                         locations.append(result.groups())
                 self.Log.write("Generating Network Configurations...\n")
                 for bus_id, bus_infos in self.BusManagers.items():
-                    if bus_infos["Type"] == "CanFestival":
-                        master = config_utils.GenerateConciseDCF(locations, bus_id, bus_infos["NodeList"])
-                        result = gen_cfile.GenerateFile("%s.c"%os.path.join(self.TargetDir, gen_cfile.FormatName(bus_infos["Name"])), master)
+                    if bus_infos["Manager"]:
+                        filepath = "%s.c"%os.path.join(self.TargetDir, gen_cfile.FormatName(bus_infos["Name"]))
+                        result = bus_infos["Manager"].GenerateBus(filepath, bus_id, locations)
                         if result:
-                            raise Exception
+                            raise Exception, "Bus with id \"0x%2.2X\" can't be generated!"%bus_id
                 self.Log.write("Generating Makefiles...\n")
                 
                 self.Log.write("Compiling Project...\n")
@@ -804,7 +811,7 @@
     def __init__(self, parent):
         self._init_ctrls(parent)
         
-        for option in ["CanFestival","SVGUI"]:
+        for option in [""] + plugins.__all__:
             self.BusType.Append(option)
     
     def OnOK(self, event):