2 # -*- coding: utf-8 -*-
4 #This file is part of CanFestival, a library implementing CanOpen Stack.
6 #Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD
8 #See COPYING file for copyrights details.
10 #This library is free software; you can redistribute it and/or
11 #modify it under the terms of the GNU Lesser General Public
12 #License as published by the Free Software Foundation; either
13 #version 2.1 of the License, or (at your option) any later version.
15 #This library is distributed in the hope that it will be useful,
16 #but WITHOUT ANY WARRANTY; without even the implied warranty of
17 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 #Lesser General Public License for more details.
20 #You should have received a copy of the GNU Lesser General Public
21 #License along with this library; if not, write to the Free Software
22 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 import os, shutil, types
28 #-------------------------------------------------------------------------------
29 # Definition of NodeList Object
30 #-------------------------------------------------------------------------------
33 Class recording a node list for a CANOpen network.
38 def __init__(self, manager, netname = ""):
41 self.Manager = manager
42 self.NetworkName = netname
45 self.CurrentSelected = None
49 return self.Changed or not self.Manager.CurrentIsSaved()
51 def ForceChanged(self, changed):
52 self.Changed = changed
54 def GetNetworkName(self):
55 return self.NetworkName
57 def SetNetworkName(self, name):
58 self.NetworkName = name
66 def SetRoot(self, newrootpath):
68 Define a new path for the CanOpen network project
69 !!! Does not check if new path is valid !!!
71 self.Root = newrootpath
72 self.Manager.SetCurrentFilePath(os.path.join(self.Root, "master.od"))
74 def GetSlaveNumber(self):
75 return len(self.SlaveNodes)
77 def GetSlaveNames(self):
78 nodes = self.SlaveNodes.keys()
80 return ["0x%2.2X %s"%(idx, self.SlaveNodes[idx]["Name"]) for idx in nodes]
82 def GetSlaveIDs(self):
83 nodes = self.SlaveNodes.keys()
87 def SetCurrentSelected(self, selected):
88 self.CurrentSelected = selected
90 def GetCurrentSelected(self):
91 return self.CurrentSelected
93 def LoadProject(self, root, netname = None):
98 if not os.path.exists(self.Root):
99 return "\"%s\" folder doesn't exist"%self.Root
101 self.EDSFolder = os.path.join(self.Root, "eds")
102 if not os.path.exists(self.EDSFolder):
103 os.mkdir(self.EDSFolder)
104 #return "\"%s\" folder doesn't contain a \"eds\" folder"%self.Root
106 files = os.listdir(self.EDSFolder)
108 filepath = os.path.join(self.EDSFolder, file)
109 if os.path.isfile(filepath) and os.path.splitext(filepath)[-1] == ".eds":
110 result = self.LoadEDS(file)
114 result = self.LoadMasterNode(netname)
118 result = self.LoadSlaveNodes(netname)
122 self.NetworkName = netname
124 def SaveProject(self, netname = None):
125 result = self.SaveMasterNode(netname)
129 result = self.SaveNodeList(netname)
133 def ImportEDSFile(self, edspath, force = False):
134 dir, file = os.path.split(edspath)
135 eds = os.path.join(self.EDSFolder, file)
136 if not force and os.path.isfile(eds):
137 return "EDS file already imported"
139 shutil.copy(edspath, self.EDSFolder)
140 return self.LoadEDS(file)
142 def LoadEDS(self, eds):
143 edspath = os.path.join(self.EDSFolder, eds)
144 node = eds_utils.GenerateNode(edspath)
145 if isinstance(node, Node):
146 self.EDSNodes[eds] = node
151 def AddSlaveNode(self, nodeName, nodeID, eds):
152 if eds in self.EDSNodes.keys():
153 slave = {"Name" : nodeName, "EDS" : eds, "Node" : self.EDSNodes[eds]}
154 self.SlaveNodes[nodeID] = slave
158 return "\"%s\" EDS file is not available"%eds
160 def RemoveSlaveNode(self, index):
161 if index in self.SlaveNodes.keys():
162 self.SlaveNodes.pop(index)
165 return "Node with \"0x%2.2X\" ID doesn't exist"
167 def LoadMasterNode(self, netname = None):
169 masterpath = os.path.join(self.Root, "%s_master.od"%netname)
171 masterpath = os.path.join(self.Root, "master.od")
172 if os.path.isfile(masterpath):
173 result = self.Manager.OpenFileInCurrent(masterpath)
175 result = self.Manager.CreateNewNode("MasterNode", 0x00, "master", "", "None", "", "heartbeat", ["DS302"])
176 if not isinstance(result, types.IntType):
180 def SaveMasterNode(self, netname = None):
182 masterpath = os.path.join(self.Root, "%s_master.od"%netname)
184 masterpath = os.path.join(self.Root, "master.od")
185 if self.Manager.SaveCurrentInFile(masterpath):
188 return "Fail to save Master Node"
190 def LoadSlaveNodes(self, netname = None):
191 cpjpath = os.path.join(self.Root, "nodelist.cpj")
192 if os.path.isfile(cpjpath):
194 networks = eds_utils.ParseCPJFile(cpjpath)
198 if net["Name"] == netname:
200 self.NetworkName = netname
201 elif len(networks) > 0:
202 network = networks[0]
203 self.NetworkName = network["Name"]
205 for nodeid, node in network["Nodes"].items():
206 if node["Present"] == 1:
207 result = self.AddSlaveNode(node["Name"], nodeid, node["DCFName"])
211 except SyntaxError, message:
212 return "Unable to load CPJ file\n%s"%message
215 def SaveNodeList(self, netname = None):
217 cpjpath = os.path.join(self.Root, "nodelist.cpj")
218 content = eds_utils.GenerateCPJContent(self)
220 file = open(cpjpath, "a")
222 file = open(cpjpath, "w")
228 return "Fail to save node list"
230 def GetSlaveNodeEntry(self, nodeid, index, subindex = None):
231 if nodeid in self.SlaveNodes.keys():
232 self.SlaveNodes[nodeid]["Node"].SetNodeID(nodeid)
233 return self.SlaveNodes[nodeid]["Node"].GetEntry(index, subindex)
235 return "Node 0x%2.2X doesn't exist"%nodeid
237 def GetMasterNodeEntry(self, index, subindex = None):
238 return self.Manager.GetCurrentEntry(index, subindex)
240 def SetMasterNodeEntry(self, index, subindex = None, value = None):
241 self.Manager.SetCurrentEntry(index, subindex, value)
243 def GetOrderNumber(self, nodeid):
244 nodeindexes = self.SlaveNodes.keys()
246 return nodeindexes.index(nodeid) + 1
248 def GetNodeByOrder(self, order):
250 nodeindexes = self.SlaveNodes.keys()
252 if order <= len(nodeindexes):
253 return self.SlaveNodes[nodeindexes[order - 1]]["Node"]
256 def IsCurrentEntry(self, index):
257 if self.CurrentSelected != None:
258 if self.CurrentSelected == 0:
259 return self.Manager.IsCurrentEntry(index)
261 node = self.SlaveNodes[self.CurrentSelected]["Node"]
263 node.SetNodeID(self.CurrentSelected)
264 return node.IsEntry(index)
267 def GetEntryInfos(self, index):
268 if self.CurrentSelected != None:
269 if self.CurrentSelected == 0:
270 return self.Manager.GetEntryInfos(index)
272 node = self.SlaveNodes[self.CurrentSelected]["Node"]
274 node.SetNodeID(self.CurrentSelected)
275 return node.GetEntryInfos(index)
278 def GetSubentryInfos(self, index, subindex):
279 if self.CurrentSelected != None:
280 if self.CurrentSelected == 0:
281 return self.Manager.GetSubentryInfos(index, subindex)
283 node = self.SlaveNodes[self.CurrentSelected]["Node"]
285 node.SetNodeID(self.CurrentSelected)
286 return node.GetSubentryInfos(index, subindex)
289 def GetCurrentValidIndexes(self, min, max):
290 if self.CurrentSelected != None:
291 if self.CurrentSelected == 0:
292 return self.Manager.GetCurrentValidIndexes(min, max)
294 node = self.SlaveNodes[self.CurrentSelected]["Node"]
296 node.SetNodeID(self.CurrentSelected)
298 for index in node.GetIndexes():
299 if min <= index <= max:
300 validindexes.append((node.GetEntryName(index), index))
303 print "Can't find node"
306 def GetCurrentEntryValues(self, index):
307 if self.CurrentSelected != None:
308 node = self.SlaveNodes[self.CurrentSelected]["Node"]
310 node.SetNodeID(self.CurrentSelected)
311 return self.Manager.GetNodeEntryValues(node, index)
313 print "Can't find node"
316 def AddToMasterDCF(self, node_id, index, subindex, size, value):
317 # Adding DCF entry into Master node
318 if not self.Manager.IsCurrentEntry(0x1F22):
319 self.Manager.ManageEntriesOfCurrent([0x1F22], [])
320 self.Manager.AddSubentriesToCurrent(0x1F22, 127)
322 self.Manager.AddToDCF(node_id, index, subindex, size, value)
324 if __name__ == "__main__":
325 from nodemanager import *
326 import os, sys, shutil
328 manager = NodeManager(sys.path[0])
330 nodelist = NodeList(manager)
332 result = nodelist.LoadProject("/home/laurent/test_nodelist")
337 manager.CurrentNode.Print()
339 for nodeid, node in nodelist.SlaveNodes.items():
340 print "SlaveNode name=%s id=0x%2.2X :"%(node["Name"], nodeid)