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() |