lbessard@205: #!/usr/bin/env python lbessard@205: # -*- coding: utf-8 -*- lbessard@205: lbessard@205: #This file is part of CanFestival, a library implementing CanOpen Stack. lbessard@205: # lbessard@205: #Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD lbessard@205: # lbessard@205: #See COPYING file for copyrights details. lbessard@205: # lbessard@205: #This library is free software; you can redistribute it and/or lbessard@205: #modify it under the terms of the GNU Lesser General Public lbessard@205: #License as published by the Free Software Foundation; either lbessard@205: #version 2.1 of the License, or (at your option) any later version. lbessard@205: # lbessard@205: #This library is distributed in the hope that it will be useful, lbessard@205: #but WITHOUT ANY WARRANTY; without even the implied warranty of lbessard@205: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU lbessard@205: #Lesser General Public License for more details. lbessard@205: # lbessard@205: #You should have received a copy of the GNU Lesser General Public lbessard@205: #License along with this library; if not, write to the Free Software lbessard@205: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA lbessard@205: lbessard@205: from gnosis.xml.pickle import * lbessard@205: from gnosis.xml.pickle.util import setParanoia lbessard@205: setParanoia(0) lbessard@205: lbessard@205: from node import * lbessard@205: import eds_utils lbessard@205: import os, shutil lbessard@205: greg@239: lbessard@205: #------------------------------------------------------------------------------- lbessard@205: # Definition of NodeList Object lbessard@205: #------------------------------------------------------------------------------- lbessard@205: greg@239: lbessard@205: """ lbessard@205: Class recording a node list for a CANOpen network. lbessard@205: """ lbessard@205: lbessard@205: class NodeList: lbessard@205: lbessard@205: def __init__(self, manager): lbessard@205: self.Root = "" lbessard@205: self.Manager = manager lbessard@205: self.NetworkName = "" lbessard@205: self.SlaveNodes = {} lbessard@205: self.EDSNodes = {} lbessard@205: self.CurrentSelected = None lbessard@205: lbessard@205: def GetNetworkName(self): lbessard@205: return self.NetworkName lbessard@205: lbessard@205: def SetNetworkName(self, name): lbessard@205: self.NetworkName = name lbessard@205: lbessard@205: def GetManager(self): lbessard@205: return self.Manager lbessard@205: lbessard@205: def GetRoot(self): lbessard@205: return self.Root lbessard@205: lbessard@205: def GetSlaveNumber(self): lbessard@205: return len(self.SlaveNodes) lbessard@205: lbessard@205: def GetSlaveNames(self): lbessard@205: nodes = self.SlaveNodes.keys() lbessard@205: nodes.sort() lbessard@205: return ["0x%2.2X %s"%(idx, self.SlaveNodes[idx]["Name"]) for idx in nodes] lbessard@205: lbessard@205: def GetSlaveIDs(self): lbessard@205: nodes = self.SlaveNodes.keys() lbessard@205: nodes.sort() lbessard@205: return nodes lbessard@205: lbessard@205: def SetCurrentSelected(self, selected): lbessard@205: self.CurrentSelected = selected lbessard@205: lbessard@205: def GetCurrentSelected(self): lbessard@205: return self.CurrentSelected lbessard@205: lbessard@205: def LoadProject(self, root): lbessard@205: self.SlaveNodes = {} lbessard@205: self.EDSNodes = {} lbessard@205: lbessard@205: self.Root = root lbessard@205: if not os.path.exists(self.Root): lbessard@205: return "\"%s\" folder doesn't exist"%self.Root lbessard@205: lbessard@205: self.EDSFolder = os.path.join(self.Root, "eds") lbessard@205: if not os.path.exists(self.EDSFolder): lbessard@205: return "\"%s\" folder doesn't contain a \"eds\" folder"%self.Root lbessard@205: lbessard@205: files = os.listdir(self.EDSFolder) lbessard@205: for file in files: lbessard@205: result = self.LoadEDS(file) lbessard@205: if result != None: lbessard@205: return result lbessard@205: lbessard@205: result = self.LoadMasterNode() lbessard@205: if result != None: lbessard@205: return result lbessard@205: lbessard@205: result = self.LoadSlaveNodes() lbessard@205: if result != None: lbessard@205: return result lbessard@205: lbessard@205: def SaveProject(self): lbessard@205: result = self.SaveMasterNode() lbessard@205: if result != None: lbessard@205: return result lbessard@205: lbessard@205: result = self.SaveNodeList() lbessard@205: if result != None: lbessard@205: return result lbessard@205: lbessard@205: def ImportEDSFile(self, edspath): lbessard@205: dir, file = os.path.split(edspath) lbessard@205: eds = os.path.join(self.EDSFolder, file) lbessard@205: if os.path.isfile(eds): lbessard@205: return "EDS file already imported" lbessard@205: else: lbessard@205: shutil.copy(edspath, self.EDSFolder) lbessard@205: return self.LoadEDS(file) lbessard@205: lbessard@205: def LoadEDS(self, eds): lbessard@205: edspath = os.path.join(self.EDSFolder, eds) lbessard@205: node = eds_utils.GenerateNode(edspath, self.Manager.ScriptDirectory) lbessard@205: if isinstance(node, Node): lbessard@205: self.EDSNodes[eds] = node lbessard@205: return None lbessard@205: else: lbessard@205: return node lbessard@205: lbessard@205: def AddSlaveNode(self, nodeName, nodeID, eds): lbessard@205: if eds in self.EDSNodes.keys(): lbessard@205: slave = {"Name" : nodeName, "EDS" : eds, "Node" : self.EDSNodes[eds]} lbessard@205: self.SlaveNodes[nodeID] = slave lbessard@205: return None lbessard@205: else: lbessard@205: return "\"%s\" EDS file is not available"%eds lbessard@205: lbessard@205: def RemoveSlaveNode(self, index): lbessard@205: if index in self.SlaveNodes.keys(): lbessard@205: self.SlaveNodes.pop(index) lbessard@205: return None lbessard@205: else: lbessard@205: return "Node with \"0x%2.2X\" ID doesn't exist" lbessard@205: lbessard@205: def LoadMasterNode(self): lbessard@205: masterpath = os.path.join(self.Root, "master.od") lbessard@205: if os.path.isfile(masterpath): lbessard@205: self.Manager.OpenFileInCurrent(masterpath) lbessard@205: else: lbessard@205: self.Manager.CreateNewNode("MasterNode", 0x00, "master", "", "None", "", "heartbeat", ["DS302"]) lbessard@205: return None lbessard@205: lbessard@205: def SaveMasterNode(self): lbessard@205: masterpath = os.path.join(self.Root, "master.od") lbessard@205: if self.Manager.SaveCurrentInFile(masterpath): lbessard@205: return None lbessard@205: else: lbessard@205: return "Fail to save Master Node" lbessard@205: lbessard@205: def LoadSlaveNodes(self): lbessard@205: cpjpath = os.path.join(self.Root, "nodelist.cpj") lbessard@205: if os.path.isfile(cpjpath): lbessard@205: try: lbessard@205: networks = eds_utils.ParseCPJFile(cpjpath) lbessard@205: if len(networks) > 0: lbessard@205: self.NetworkName = networks[0]["Name"] lbessard@205: for nodeid, node in networks[0]["Nodes"].items(): lbessard@205: if node["Present"] == 1: lbessard@205: result = self.AddSlaveNode(node["Name"], nodeid, node["DCFName"]) lbessard@205: if result != None: lbessard@205: return result lbessard@205: except SyntaxError, message: lbessard@205: return "Unable to load CPJ file\n%s"%message lbessard@205: return None lbessard@205: lbessard@205: def SaveNodeList(self): lbessard@205: cpjpath = os.path.join(self.Root, "nodelist.cpj") lbessard@205: content = eds_utils.GenerateCPJContent(self) lbessard@205: file = open(cpjpath, "w") lbessard@205: file.write(content) lbessard@205: file.close() lbessard@205: lbessard@205: def GetSlaveNodeEntry(self, nodeid, index, subindex = None): lbessard@205: if nodeid in self.SlaveNodes.keys(): lbessard@205: self.SlaveNodes[nodeid]["Node"].SetNodeID(nodeid) lbessard@205: return self.SlaveNodes[nodeid]["Node"].GetEntry(index, subindex) lbessard@205: else: lbessard@205: return "Node 0x%2.2X doesn't exist"%nodeid lbessard@205: lbessard@205: def GetMasterNodeEntry(self, index, subindex = None): lbessard@205: return self.Manager.GetCurrentEntry(index, subindex) lbessard@205: lbessard@205: def SetMasterNodeEntry(self, index, subindex = None, value = None): lbessard@205: self.Manager.SetCurrentEntry(index, subindex, value) lbessard@205: lbessard@205: def GetOrderNumber(self, nodeid): lbessard@205: nodeindexes = self.SlaveNodes.keys() lbessard@205: nodeindexes.sort() lbessard@205: return nodeindexes.index(nodeid) + 1 lbessard@205: lbessard@205: def GetNodeByOrder(self, order): lbessard@205: if order > 0: lbessard@205: nodeindexes = self.SlaveNodes.keys() lbessard@205: nodeindexes.sort() lbessard@205: print nodeindexes lbessard@205: if order <= len(nodeindexes): lbessard@205: return self.SlaveNodes[nodeindexes[order - 1]]["Node"] lbessard@205: return None lbessard@205: lbessard@205: def IsCurrentEntry(self, index): lbessard@205: if self.CurrentSelected != None: lbessard@205: if self.CurrentSelected == 0: lbessard@205: return self.Manager.IsCurrentEntry(index) lbessard@205: else: lbessard@205: node = self.SlaveNodes[self.CurrentSelected]["Node"] lbessard@205: if node: lbessard@205: return node.IsEntry(index) lbessard@205: return False lbessard@205: lbessard@205: def GetEntryInfos(self, index): lbessard@205: if self.CurrentSelected != None: lbessard@205: if self.CurrentSelected == 0: lbessard@205: return self.Manager.GetEntryInfos(index) lbessard@205: else: lbessard@205: node = self.SlaveNodes[self.CurrentSelected]["Node"] lbessard@205: if node: lbessard@205: return node.GetEntryInfos(index) lbessard@205: return None lbessard@205: lbessard@205: def GetCurrentValidIndexes(self, min, max): lbessard@205: if self.CurrentSelected != None: lbessard@205: if self.CurrentSelected == 0: lbessard@205: return self.Manager.GetCurrentValidIndexes(min, max) lbessard@205: else: lbessard@205: node = self.SlaveNodes[self.CurrentSelected]["Node"] lbessard@205: if node: lbessard@205: validindexes = [] lbessard@205: for index in node.GetIndexes(): lbessard@205: if min <= index <= max: lbessard@205: validindexes.append((node.GetEntryName(index), index)) lbessard@205: return validindexes lbessard@205: else: lbessard@205: print "Can't find node" lbessard@205: return [] lbessard@205: lbessard@205: def GetCurrentEntryValues(self, index): lbessard@205: if self.CurrentSelected != None: lbessard@205: node = self.SlaveNodes[self.CurrentSelected]["Node"] greg@239: node.SetNodeID(self.CurrentSelected) lbessard@205: if node: lbessard@205: return self.Manager.GetNodeEntryValues(node, index) lbessard@205: else: lbessard@205: print "Can't find node" lbessard@205: return [], [] greg@239: lbessard@205: if __name__ == "__main__": lbessard@205: from nodemanager import * lbessard@205: import os, sys, shutil lbessard@205: lbessard@205: manager = NodeManager(sys.path[0]) lbessard@205: nodelist = NodeList(manager) greg@239: #result = nodelist.LoadProject("/home/deobox/beremiz/test_nodelist") greg@239: result = nodelist.LoadProject("/home/deobox/Desktop/TestMapping") lbessard@205: if result != None: lbessard@205: print result lbessard@205: else: lbessard@205: print "MasterNode :" lbessard@205: manager.CurrentNode.Print() lbessard@205: for nodeid, node in nodelist.SlaveNodes.items(): lbessard@205: print "SlaveNode name=%s id=0x%2.2X :"%(node["Name"], nodeid) lbessard@205: node["Node"].Print() greg@239: