# HG changeset patch # User laurent # Date 1349111582 -7200 # Node ID 412a9f05070f4d129b5f7eeae951ee3b2389a789 # Parent ec9e6ef49878810f0f406a65efb6e718afb4b134 Fixing CanFestival master and slave nodeid when generating code for PLC diff -r ec9e6ef49878 -r 412a9f05070f canfestival/NetworkEditor.py --- a/canfestival/NetworkEditor.py Mon Oct 01 19:10:51 2012 +0200 +++ b/canfestival/NetworkEditor.py Mon Oct 01 19:13:02 2012 +0200 @@ -76,8 +76,7 @@ else: other_profile_text = _('Other Profile') - master_menu = [(wx.ITEM_NORMAL, (_('Node infos'), ID_NETWORKEDITORMASTERMENUNODEINFOS, '', self.OnNodeInfosMenu)), - (wx.ITEM_NORMAL, (_('DS-301 Profile'), ID_NETWORKEDITORMASTERMENUDS301PROFILE, '', self.OnCommunicationMenu)), + master_menu = [(wx.ITEM_NORMAL, (_('DS-301 Profile'), ID_NETWORKEDITORMASTERMENUDS301PROFILE, '', self.OnCommunicationMenu)), (wx.ITEM_NORMAL, (_('DS-302 Profile'), ID_NETWORKEDITORMASTERMENUDS302PROFILE, '', self.OnOtherCommunicationMenu)), (wx.ITEM_NORMAL, (other_profile_text, ID_NETWORKEDITORMASTERMENUDSOTHERPROFILE, '', self.OnEditProfileMenu)), (wx.ITEM_SEPARATOR, None), diff -r ec9e6ef49878 -r 412a9f05070f canfestival/SlaveEditor.py --- a/canfestival/SlaveEditor.py Mon Oct 01 19:10:51 2012 +0200 +++ b/canfestival/SlaveEditor.py Mon Oct 01 19:13:02 2012 +0200 @@ -46,8 +46,7 @@ else: other_profile_text = _('Other Profile') - return [(wx.ITEM_NORMAL, (_('Node infos'), ID_SLAVEEDITORCONFNODEMENUNODEINFOS, '', self.OnNodeInfosMenu)), - (wx.ITEM_NORMAL, (_('DS-301 Profile'), ID_SLAVEEDITORCONFNODEMENUDS301PROFILE, '', self.OnCommunicationMenu)), + return [(wx.ITEM_NORMAL, (_('DS-301 Profile'), ID_SLAVEEDITORCONFNODEMENUDS301PROFILE, '', self.OnCommunicationMenu)), (wx.ITEM_NORMAL, (_('DS-302 Profile'), ID_SLAVEEDITORCONFNODEMENUDS302PROFILE, '', self.OnOtherCommunicationMenu)), (wx.ITEM_NORMAL, (other_profile_text, ID_SLAVEEDITORCONFNODEMENUDSOTHERPROFILE, '', self.OnEditProfileMenu)), (wx.ITEM_SEPARATOR, None), diff -r ec9e6ef49878 -r 412a9f05070f canfestival/canfestival.py --- a/canfestival/canfestival.py Mon Oct 01 19:10:51 2012 +0200 +++ b/canfestival/canfestival.py Mon Oct 01 19:13:02 2012 +0200 @@ -53,7 +53,7 @@ - + @@ -107,6 +107,9 @@ dialog.Destroy() self.OnCTNSave() + def GetCurrentNodeName(self): + return self.CTNName() + def GetSlaveODPath(self): return os.path.join(self.CTNPath(), 'slave.od') @@ -169,6 +172,7 @@ # Create a new copy of the model slave = self.GetCurrentNodeCopy() slave.SetNodeName("OD_%s"%prefix) + slave.SetNodeID(self.CanFestivalSlaveNode.getNodeId()) # allow access to local OD from Slave PLC pointers = config_utils.LocalODPointers(locations, current_location, slave) res = gen_cfile.GenerateFile(Gen_OD_path, slave, pointers) @@ -219,6 +223,21 @@ ConfNodeMethods = [] +class _NodeManager(NodeManager): + + def __init__(self, parent, *args, **kwargs): + NodeManager.__init__(self, *args, **kwargs) + self.Parent = parent + + def __del__(self): + self.Parent = None + + def GetCurrentNodeName(self): + return self.Parent.CTNName() + + def GetCurrentNodeID(self): + return self.Parent.CanFestivalNode.getNodeId() + class _NodeListCTN(NodeList): XSD = """ @@ -226,7 +245,7 @@ - + @@ -237,7 +256,7 @@ IconPath = os.path.join(CanFestivalPath, "objdictgen", "networkedit.png") def __init__(self): - manager = NodeManager() + manager = _NodeManager(self) NodeList.__init__(self, manager) self.LoadProject(self.CTNPath()) self.SetNetworkName(self.BaseParams.getName()) @@ -246,16 +265,32 @@ return self.CanFestivalNode.getCan_Device() def SetParamsAttribute(self, path, value): - result = ConfigTreeNode.SetParamsAttribute(self, path, value) + if path == "CanFestivalNode.NodeId": + nodeid = self.CanFestivalNode.getNodeId() + if value != nodeid: + slaves = self.GetSlaveIDs() + dir = (value - nodeid) / abs(value - nodeid) + while value in slaves and value >= 0: + value += dir + if value < 0: + value = nodeid + + value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value) + refresh_network = False # Filter IEC_Channel and Name, that have specific behavior if path == "BaseParams.IEC_Channel" and self._View is not None: self._View.SetBusId(self.GetCurrentLocation()) elif path == "BaseParams.Name": self.SetNetworkName(value) - - return result - + refresh_network = True + elif path == "CanFestivalNode.NodeId": + refresh_network = True + + if refresh_network and self._View is not None: + wx.CallAfter(self._View.RefreshBufferState) + return value, refresh + _GeneratedMasterView = None def _ShowGeneratedMaster(self): self._OpenView("Generated master") @@ -335,6 +370,7 @@ master, pointers = config_utils.GenerateConciseDCF(locations, current_location, self, self.CanFestivalNode.getSync_TPDOs(),"OD_%s"%prefix) except config_utils.PDOmappingException, e: raise Exception, e.message + master.SetNodeID(self.CanFestivalNode.getNodeId()) # Do generate C file. res = gen_cfile.GenerateFile(Gen_OD_path, master, pointers) if res :