Beremiz.py
changeset 11 75ae893d5eed
parent 9 bc29b3bf2a5a
child 12 a1f9e514f708
equal deleted inserted replaced
10:2aff8e8cd456 11:75ae893d5eed
    34 
    34 
    35 iec2cc_path = os.path.join(base_folder, "matiec", "iec2cc")
    35 iec2cc_path = os.path.join(base_folder, "matiec", "iec2cc")
    36 ieclib_path = os.path.join(base_folder, "matiec", "lib")
    36 ieclib_path = os.path.join(base_folder, "matiec", "lib")
    37 
    37 
    38 from PLCOpenEditor import PLCOpenEditor, ProjectDialog
    38 from PLCOpenEditor import PLCOpenEditor, ProjectDialog
    39 from TextViewer import *
    39 from TextViewer import TextViewer
    40 from plcopen.structures import IEC_KEYWORDS
    40 from plcopen.structures import IEC_KEYWORDS, AddPlugin
    41 from PLCControler import PLCControler
    41 from PLCControler import PLCControler
    42 
    42 
    43 from networkedit import networkedit
    43 import plugins
    44 from nodelist import NodeList
       
    45 from nodemanager import NodeManager
       
    46 import config_utils, gen_cfile
       
    47 
    44 
    48 __version__ = "$Revision$"
    45 __version__ = "$Revision$"
    49 
    46 
    50 def create(parent):
    47 def create(parent):
    51     return Beremiz(parent)
    48     return Beremiz(parent)
   331         
   328         
   332         self._init_sizers()
   329         self._init_sizers()
   333     
   330     
   334     def __init__(self, parent):
   331     def __init__(self, parent):
   335         self._init_ctrls(parent)
   332         self._init_ctrls(parent)
       
   333         
       
   334         for name in plugins.__all__:
       
   335             module = getattr(plugins, name)
       
   336             if len(module.BlockList) > 0:
       
   337                 function = module.GetBlockGenerationFunction(self)
       
   338                 blocklist = module.BlockList
       
   339                 for blocktype in blocklist["list"]:
       
   340                     blocktype["generate"] = function
       
   341                 AddPlugin(module.BlockList)
   336         
   342         
   337         self.CurrentProjectPath = ""
   343         self.CurrentProjectPath = ""
   338         
   344         
   339         self.PLCManager = None
   345         self.PLCManager = None
   340         self.PLCEditor = None
   346         self.PLCEditor = None
   437             if lines[0] != "Beremiz":
   443             if lines[0] != "Beremiz":
   438                 file.close()
   444                 file.close()
   439                 raise Exception
   445                 raise Exception
   440             for bus_id, bus_type, bus_name in [line.split(" ") for line in lines[1:]]:
   446             for bus_id, bus_type, bus_name in [line.split(" ") for line in lines[1:]]:
   441                 id = int(bus_id, 16)
   447                 id = int(bus_id, 16)
   442                 if bus_type == "CanFestival":
   448                 controller = getattr(plugins, bus_type).controller
   443                     manager = NodeManager(os.path.join(base_folder, "CanFestival-3", "objdictgen"))
   449                 if controller != None:
   444                     nodelist = NodeList(manager)
   450                     manager = controller()
   445                     result = nodelist.LoadProject(projectpath, bus_name)
   451                     result = manager.LoadProject(projectpath, bus_name)
   446                     if not result:
   452                     if not result:
   447                         self.BusManagers[id] = {"Name" : bus_name, "Type" : bus_type, "NodeList" : nodelist, "Editor" : None}
   453                         self.BusManagers[id] = {"Name" : bus_name, "Type" : bus_type, "Manager" : manager, "Editor" : None}
   448                     else:
   454                     else:
   449                         message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
   455                         message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
   450                         message.ShowModal()
   456                         message.ShowModal()
   451                         message.Destroy()
   457                         message.Destroy()
   452                 else:
   458                 else:
   453                     self.BusManagers[id] = {"Name" : bus_name, "Type" : bus_type}
   459                     self.BusManagers[id] = {"Name" : bus_name, "Type" : bus_type, "Manager" : None, "Editor" : None}
   454             file.close()
   460             file.close()
   455             self.PLCManager = PLCControler()
   461             self.PLCManager = PLCControler()
   456             plc_file = os.path.join(projectpath, "plc.xml")
   462             plc_file = os.path.join(projectpath, "plc.xml")
   457             if os.path.isfile(plc_file):
   463             if os.path.isfile(plc_file):
   458                 self.PLCManager.OpenXMLFile(plc_file)
   464                 self.PLCManager.OpenXMLFile(plc_file)
   469                     self.CurrentProjectPath = projectpath
   475                     self.CurrentProjectPath = projectpath
   470                 dialog.Destroy()
   476                 dialog.Destroy()
   471             self.RefreshBusList()
   477             self.RefreshBusList()
   472             self.RefreshButtons()
   478             self.RefreshButtons()
   473             self.RefreshMainMenu()
   479             self.RefreshMainMenu()
   474         except Exception:
   480         except Exception, message:
   475             message = wx.MessageDialog(self, "\"%s\" folder is not a valid Beremiz project"%projectpath, "Error", wx.OK|wx.ICON_ERROR)
   481             message = wx.MessageDialog(self, "\"%s\" folder is not a valid Beremiz project\n%s"%(projectpath,message), "Error", wx.OK|wx.ICON_ERROR)
   476             message.ShowModal()
   482             message.ShowModal()
   477             message.Destroy()
   483             message.Destroy()
   478     
   484     
   479     def OnOpenProjectMenu(self, event):
   485     def OnOpenProjectMenu(self, event):
   480         if self.CurrentProjectPath != "":
   486         if self.CurrentProjectPath != "":
   506         busidlist = self.BusManagers.keys()
   512         busidlist = self.BusManagers.keys()
   507         busidlist.sort()
   513         busidlist.sort()
   508         for id in busidlist:
   514         for id in busidlist:
   509             bus_infos = self.BusManagers[id]
   515             bus_infos = self.BusManagers[id]
   510             file.write("0x%2.2X %s %s\n"%(id, bus_infos["Type"], bus_infos["Name"]))
   516             file.write("0x%2.2X %s %s\n"%(id, bus_infos["Type"], bus_infos["Name"]))
   511             bus_infos["NodeList"].SaveProject(bus_infos["Name"])
   517             bus_infos["Manager"].SaveProject(bus_infos["Name"])
   512         file.close()
   518         file.close()
   513         event.Skip()
   519         event.Skip()
   514     
   520     
   515     def OnPropertiesMenu(self, event):
   521     def OnPropertiesMenu(self, event):
   516         event.Skip()
   522         event.Skip()
   575     def OnBusListDClick(self, event):
   581     def OnBusListDClick(self, event):
   576         selected = event.GetSelection()
   582         selected = event.GetSelection()
   577         busidlist = self.BusManagers.keys()
   583         busidlist = self.BusManagers.keys()
   578         busidlist.sort()
   584         busidlist.sort()
   579         bus_infos = self.BusManagers[busidlist[selected]]
   585         bus_infos = self.BusManagers[busidlist[selected]]
   580         if bus_infos["Type"] == "CanFestival":
   586         view = getattr(plugins, bus_infos["Type"]).view
       
   587         if view != None:
   581             if bus_infos["Editor"] == None:
   588             if bus_infos["Editor"] == None:
   582                 netedit = networkedit(self, bus_infos["NodeList"])
   589                 editor = view(self, bus_infos["Manager"])
   583                 netedit.SetBusId(busidlist[selected])
   590                 editor.SetBusId(busidlist[selected])
   584                 netedit.Show()
   591                 editor.Show()
   585                 bus_infos["Editor"] = netedit
   592                 bus_infos["Editor"] = editor
   586         event.Skip()
   593         event.Skip()
   587     
   594     
   588     def CloseEditor(self, bus_id):
   595     def CloseEditor(self, bus_id):
   589         if self.BusManagers.get(bus_id, None) != None:
   596         if self.BusManagers.get(bus_id, None) != None:
   590             self.BusManagers[bus_id]["Editor"] = None
   597             self.BusManagers[bus_id]["Editor"] = None
   596             if values["busID"].startswith("0x"):
   603             if values["busID"].startswith("0x"):
   597                 bus_id = int(values["busID"], 16)
   604                 bus_id = int(values["busID"], 16)
   598             else:
   605             else:
   599                 bus_id = int(values["busID"])
   606                 bus_id = int(values["busID"])
   600             if self.BusManagers.get(bus_id, None) == None:
   607             if self.BusManagers.get(bus_id, None) == None:
   601                 if values["busType"] == "CanFestival":
   608                 controller = getattr(plugins, values["busType"]).controller
   602                     manager = NodeManager(os.path.join(base_folder, "CanFestival-3", "objdictgen"))
   609                 if controller != None:
   603                     nodelist = NodeList(manager)
   610                     manager = controller()
   604                     result = nodelist.LoadProject(self.CurrentProjectPath, values["busName"])
   611                     result = manager.LoadProject(self.CurrentProjectPath, values["busName"])
   605                     if not result:
   612                     if not result:
   606                         self.BusManagers[bus_id] = {"Name" : values["busName"], "Type" : values["busType"], "NodeList" : nodelist, "Editor" : None}
   613                         self.BusManagers[bus_id] = {"Name" : values["busName"], "Type" : values["busType"], "Manager" : manager, "Editor" : None}
   607                     else:
   614                     else:
   608                         message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
   615                         message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
   609                         message.ShowModal()
   616                         message.ShowModal()
   610                         message.Destroy()
   617                         message.Destroy()
   611                 else:
   618                 else:
   612                     self.BusManagers[bus_id] = {"Name" : values["busName"], "Type" : values["busType"]}
   619                     self.BusManagers[bus_id] = {"Name" : values["busName"], "Type" : values["busType"], "Manager" : None, "Editor" : None}
   613             else:
   620             else:
   614                 message = wx.MessageDialog(self, "The bus ID \"0x%2.2X\" is already used!"%bus_id, "Error", wx.OK|wx.ICON_ERROR)
   621                 message = wx.MessageDialog(self, "The bus ID \"0x%2.2X\" is already used!"%bus_id, "Error", wx.OK|wx.ICON_ERROR)
   615                 message.ShowModal()
   622                 message.ShowModal()
   616                 message.Destroy()
   623                 message.Destroy()
   617             self.RefreshBusList()
   624             self.RefreshBusList()
   706                     result = LOCATED_MODEL.match(line)
   713                     result = LOCATED_MODEL.match(line)
   707                     if result:
   714                     if result:
   708                         locations.append(result.groups())
   715                         locations.append(result.groups())
   709                 self.Log.write("Generating Network Configurations...\n")
   716                 self.Log.write("Generating Network Configurations...\n")
   710                 for bus_id, bus_infos in self.BusManagers.items():
   717                 for bus_id, bus_infos in self.BusManagers.items():
   711                     if bus_infos["Type"] == "CanFestival":
   718                     if bus_infos["Manager"]:
   712                         master = config_utils.GenerateConciseDCF(locations, bus_id, bus_infos["NodeList"])
   719                         filepath = "%s.c"%os.path.join(self.TargetDir, gen_cfile.FormatName(bus_infos["Name"]))
   713                         result = gen_cfile.GenerateFile("%s.c"%os.path.join(self.TargetDir, gen_cfile.FormatName(bus_infos["Name"])), master)
   720                         result = bus_infos["Manager"].GenerateBus(filepath, bus_id, locations)
   714                         if result:
   721                         if result:
   715                             raise Exception
   722                             raise Exception, "Bus with id \"0x%2.2X\" can't be generated!"%bus_id
   716                 self.Log.write("Generating Makefiles...\n")
   723                 self.Log.write("Generating Makefiles...\n")
   717                 
   724                 
   718                 self.Log.write("Compiling Project...\n")
   725                 self.Log.write("Compiling Project...\n")
   719                 
   726                 
   720                 self.Log.write("\nBuild Project completed\n")
   727                 self.Log.write("\nBuild Project completed\n")
   802         self._init_sizers()
   809         self._init_sizers()
   803 
   810 
   804     def __init__(self, parent):
   811     def __init__(self, parent):
   805         self._init_ctrls(parent)
   812         self._init_ctrls(parent)
   806         
   813         
   807         for option in ["CanFestival","SVGUI"]:
   814         for option in [""] + plugins.__all__:
   808             self.BusType.Append(option)
   815             self.BusType.Append(option)
   809     
   816     
   810     def OnOK(self, event):
   817     def OnOK(self, event):
   811         error = []
   818         error = []
   812         bus_id = self.BusId.GetValue()
   819         bus_id = self.BusId.GetValue()