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