diff -r 6787754b251b -r b6572d0336c3 doc/doxygen/html/node_8py-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/doxygen/html/node_8py-source.html Mon Jun 04 17:59:50 2007 +0200 @@ -0,0 +1,1011 @@ + + +CanFestival: /home/epimerde/documents/tc11/CanFestival-3/objdictgen/node.py Source File + + + + +
+
+
+
+

/home/epimerde/documents/tc11/CanFestival-3/objdictgen/node.py

Go to the documentation of this file.
00001 #!/usr/bin/env python
+00002 # -*- coding: utf-8 -*-
+00003 
+00004 #This file is part of CanFestival, a library implementing CanOpen Stack. 
+00005 #
+00006 #Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD
+00007 #
+00008 #See COPYING file for copyrights details.
+00009 #
+00010 #This library is free software; you can redistribute it and/or
+00011 #modify it under the terms of the GNU Lesser General Public
+00012 #License as published by the Free Software Foundation; either
+00013 #version 2.1 of the License, or (at your option) any later version.
+00014 #
+00015 #This library is distributed in the hope that it will be useful,
+00016 #but WITHOUT ANY WARRANTY; without even the implied warranty of
+00017 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+00018 #Lesser General Public License for more details.
+00019 #
+00020 #You should have received a copy of the GNU Lesser General Public
+00021 #License along with this library; if not, write to the Free Software
+00022 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+00023 
+00024 import cPickle
+00025 from types import *
+00026 import re
+00027 
+00028 """
+00029 Dictionary of translation between access symbol and their signification
+00030 """
+00031 AccessType = {"ro" : "Read Only", "wo" : "Write Only", "rw" : "Read/Write"}
+00032 
+00033 BoolType = {True : "True", False : "False"} 
+00034 OptionType = {True : "Yes", False : "No"}
+00035 
+00036 CustomisableTypes = [(0x02, 0), (0x03, 0), (0x04, 0), (0x05, 0), (0x06, 0), (0x07, 0),
+00037     (0x08, 0), (0x09, 1), (0x0A, 1), (0x0B, 1), (0x10, 0), (0x11, 0), (0x12, 0),
+00038     (0x13, 0), (0x14, 0), (0x15, 0), (0x16, 0), (0x18, 0), (0x19, 0), (0x1A, 0),
+00039     (0x1B, 0)]
+00040 
+00041 DefaultParams = {"comment" : "", "save" : False}
+00042 
+00043 #-------------------------------------------------------------------------------
+00044 #                      Dictionary Mapping and Organisation
+00045 #-------------------------------------------------------------------------------
+00046 
+00047 """
+00048 Properties of entry structure in the Object Dictionary
+00049 """
+00050 OD_Subindex = 1             # Entry has at least one subindex
+00051 OD_MultipleSubindexes = 2   # Entry has more than one subindex
+00052 OD_IdenticalSubindexes = 4  # Subindexes of entry have the same description
+00053 OD_IdenticalIndexes = 8     # Entry has the same description on multiple indexes
+00054 
+00055 """
+00056 Structures of entry in the Object Dictionary, sum of the properties described above
+00057 for all sorts of entries use in CAN Open specification
+00058 """
+00059 nosub = 0 # Entry without subindex (only for type declaration)
+00060 var = 1
+00061 array = 3
+00062 rec = 7
+00063 # Entries identical on multiple indexes
+00064 plurivar = 9
+00065 pluriarray = 11 # Example : PDO Parameters
+00066 plurirec = 15   # Example : PDO Mapping
+00067 
+00068 """
+00069 MappingDictionary is the structure used for writing a good organised Object
+00070 Dictionary. It follows the specifications of the CANOpen standard.
+00071 Change the informations within it if there is a mistake. But don't modify the
+00072 organisation of this object, it will involve in a malfunction of the application.
+00073 """
+00074 
+00075 MappingDictionary = {
+00076     0x0001 : {"name" : "BOOLEAN", "struct" : nosub, "size" : 1, "default" : False, "values" : []},
+00077     0x0002 : {"name" : "INTEGER8", "struct" : nosub, "size" : 8, "default" : 0, "values" : []},
+00078     0x0003 : {"name" : "INTEGER16", "struct" : nosub, "size" : 16, "default" : 0, "values" : []},
+00079     0x0004 : {"name" : "INTEGER32", "struct" : nosub, "size" : 32, "default" : 0, "values" : []},
+00080     0x0005 : {"name" : "UNSIGNED8", "struct" : nosub, "size" : 8, "default" : 0, "values" : []},
+00081     0x0006 : {"name" : "UNSIGNED16", "struct" : nosub, "size" : 16, "default" : 0, "values" : []},
+00082     0x0007 : {"name" : "UNSIGNED32", "struct" : nosub, "size" : 32, "default" : 0, "values" : []},
+00083     0x0008 : {"name" : "REAL32", "struct" : nosub, "size" : 32, "default" : 0.0, "values" : []},
+00084     0x0009 : {"name" : "VISIBLE_STRING", "struct" : nosub, "size" : 8, "default" : "", "values" : []},
+00085     0x000A : {"name" : "OCTET_STRING", "struct" : nosub, "size" : 8, "default" : "", "values" : []},
+00086     0x000B : {"name" : "UNICODE_STRING", "struct" : nosub, "size" : 16, "default" : "", "values" : []},
+00087 #    0x000C : {"name" : "TIME_OF_DAY", "struct" : nosub, "size" : 48, "default" : 0, "values" : []},
+00088 #    0x000D : {"name" : "TIME_DIFFERENCE", "struct" : nosub, "size" : 48, "default" : 0, "values" : []},
+00089     0x000F : {"name" : "DOMAIN", "struct" : nosub, "size" : 0, "default" : "", "values" : []},
+00090     0x0010 : {"name" : "INTEGER24", "struct" : nosub, "size" : 24, "default" : 0, "values" : []},
+00091     0x0011 : {"name" : "REAL64", "struct" : nosub, "size" : 64, "default" : 0.0, "values" : []},
+00092     0x0012 : {"name" : "INTEGER40", "struct" : nosub, "size" : 40, "default" : 0, "values" : []},
+00093     0x0013 : {"name" : "INTEGER48", "struct" : nosub, "size" : 48, "default" : 0, "values" : []},
+00094     0x0014 : {"name" : "INTEGER56", "struct" : nosub, "size" : 56, "default" : 0, "values" : []},
+00095     0x0015 : {"name" : "INTEGER64", "struct" : nosub, "size" : 64, "default" : 0, "values" : []},
+00096     0x0016 : {"name" : "UNSIGNED24", "struct" : nosub, "size" : 24, "default" : 0, "values" : []},
+00097     0x0018 : {"name" : "UNSIGNED40", "struct" : nosub, "size" : 40, "default" : 0, "values" : []},
+00098     0x0019 : {"name" : "UNSIGNED48", "struct" : nosub, "size" : 48, "default" : 0, "values" : []},
+00099     0x001A : {"name" : "UNSIGNED56", "struct" : nosub, "size" : 56, "default" : 0, "values" : []},
+00100     0x001B : {"name" : "UNSIGNED64", "struct" : nosub, "size" : 64, "default" : 0, "values" : []},
+00101     0x1000 : {"name" : "Device Type", "struct" : var, "need" : True, "values" : 
+00102                 [{"name" : "Device Type", "type" : 0x07, "access" : 'ro', "pdo" : False}]},
+00103     0x1001 : {"name" : "Error Register", "struct" : var,  "need" : True, "values" : 
+00104                 [{"name" : "Error Register", "type" : 0x05, "access": 'ro', "pdo" : True}]},
+00105     0x1002 : {"name" : "Manufacturer Status Register", "struct" : var, "need" : False,  "values" :
+00106                 [{"name" : "Manufacturer Status Register", "type" : 0x07, "access" : 'ro', "pdo" : True}]},
+00107     0x1003 : {"name" : "Pre-defined Error Field", "struct" : rec, "need" : False,  "values" :
+00108                 [{"name" : "Number of Errors", "type" : 0x05, "access" : 'rw', "pdo" : False},
+00109                  {"name" : "Standard Error Field", "type" : 0x07, "access" : 'ro', "pdo" : False, "nbmax" : 0xFE}]},
+00110     0x1005 : {"name" : "SYNC COB ID", "struct" : var, "need" : True, "callback" : True, "values" :
+00111                 [{"name" : "SYNC COB ID", "type" : 0x07, "access" : 'rw', "pdo" : False}]},
+00112     0x1006 : {"name" : "Communication / Cycle Period", "struct" : var, "need" : False, "callback" : True, "values" :
+00113                 [{"name" : "Communication Cycle Period", "type" : 0x07, "access" : 'rw', "pdo" : False}]},
+00114     0x1007 : {"name" : "Synchronous Window Length", "struct" : var, "need" : False, "values" :
+00115                 [{"name" : "Synchronous Window Length", "type" : 0x07, "access" : 'rw', "pdo" : False}]},
+00116     0x1008 : {"name" : "Manufacturer Device Name", "struct" : var, "need" : False, "values" :
+00117                 [{"name" : "Manufacturer Device Name", "type" : 0x09, "access" : 'ro', "pdo" : False}]},
+00118     0x1009 : {"name" : "Manufacturer Hardware Version", "struct" : var, "need" : False, "values" :
+00119                 [{"name" : "Manufacturer Hardware Version", "type" : 0x09, "access" : 'ro', "pdo" : False}]},
+00120     0x100A : {"name" : "Manufacturer Software Version", "struct" : var, "need" : False, "values" :
+00121                 [{"name" : "Manufacturer Software Version", "type" : 0x09, "access" : 'ro', "pdo" : False}]},
+00122     0x100C : {"name" : "Guard Time", "struct" : var, "need" : False, "values" :
+00123                 [{"name" : "Guard Time", "type" : 0x06, "access" : 'rw', "pdo" : False}]},
+00124     0x100D : {"name" : "Life Time Factor", "struct" : var, "need" : False, "values" :
+00125                 [{"name" : "Life Time Factor", "type" : 0x05, "access" : 'rw', "pdo" : False}]},
+00126     0x1010 : {"name" : "Store parameters", "struct" : array, "need" : False, "values" :
+00127                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00128                  {"name" : "Save All Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False},
+00129                  {"name" : "Save Communication Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False},
+00130                  {"name" : "Save Application Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False},
+00131                  {"name" : "Save Manufacturer Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmax" : 0x7C}]},
+00132     0x1011 : {"name" : "Restore Default Parameters", "struct" : array, "need" : False, "values" :
+00133                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00134                  {"name" : "Restore All Default Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False},
+00135                  {"name" : "Restore Communication Default Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False},
+00136                  {"name" : "Restore Application Default Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False},
+00137                  {"name" : "Restore Manufacturer Default Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmax" : 0x7C}]},
+00138     0x1012 : {"name" : "TIME COB ID", "struct" : var, "need" : False, "values" :
+00139                 [{"name" : "TIME COB ID", "type" : 0x07, "access" : 'rw', "pdo" : False}]},
+00140     0x1013 : {"name" : "High Resolution Timestamp", "struct" : var, "need" : False, "values" :
+00141                 [{"name" : "High Resolution Time Stamp", "type" : 0x07, "access" : 'rw', "pdo" : True}]},
+00142     0x1014 : {"name" : "Emergency COB ID", "struct" : var, "need" : False, "values" :
+00143                 [{"name" : "Emergency COB ID", "type" : 0x07, "access" : 'rw', "pdo" : False}]},
+00144     0x1015 : {"name" : "Inhibit Time Emergency", "struct" : var, "need" : False, "values" :
+00145                 [{"name" : "Inhibit Time Emergency", "type" : 0x06, "access" : 'rw', "pdo" : False}]},
+00146     0x1016 : {"name" : "Consumer Heartbeat Time", "struct" : rec, "need" : False, "values" :
+00147                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00148                  {"name" : "Consumer Heartbeat Time", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmax" : 0x7F}]},
+00149     0x1017 : {"name" : "Producer Heartbeat Time", "struct" : var, "need" : False, "callback" : True, "values" :
+00150                 [{"name" : "Producer Heartbeat Time", "type" : 0x06, "access" : 'rw', "pdo" : False}]},
+00151     0x1018 : {"name" : "Identity", "struct" : array, "need" : True, "values" :
+00152                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00153                  {"name" : "Vendor ID", "type" : 0x07, "access" : 'ro', "pdo" : False},
+00154                  {"name" : "Product Code", "type" : 0x07, "access" : 'ro', "pdo" : False},
+00155                  {"name" : "Revision Number", "type" : 0x07, "access" : 'ro', "pdo" : False},
+00156                  {"name" : "Serial Number", "type" : 0x07, "access" : 'ro', "pdo" : False}]},
+00157     0x1020 : {"name" : "Verify Configuration", "struct" : array, "need" : False, "values" :
+00158                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00159                  {"name" : "Configuration Date", "type" : 0x07, "access" : 'ro', "pdo" : False},
+00160                  {"name" : "Configuration Time", "type" : 0x07, "access" : 'ro', "pdo" : False}]},
+00161 #    0x1021 : {"name" : "Store EDS", "struct" : var, "need" : False, "values" :
+00162 #                [{"name" : "Store EDS", "type" : 0x0F, "access" : 'rw', "pdo" : False}]},
+00163 #    0x1022 : {"name" : "Storage Format", "struct" : var, "need" : False, "values" :
+00164 #                [{"name" : "Storage Format", "type" : 0x06, "access" : 'rw', "pdo" : False}]},
+00165     0x1023 : {"name" : "OS Command", "struct" : array, "need" : False, "values" :
+00166                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00167                  {"name" : "Command", "type" : 0x0A, "access" : 'rw', "pdo" : False},
+00168                  {"name" : "Status", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00169                  {"name" : "Reply", "type" : 0x0A, "access" : 'ro', "pdo" : False}]},
+00170     0x1024 : {"name" : "OS Command Mode", "struct" : var, "need" : False, "values" :
+00171                 [{"name" : "OS Command Mode", "type" : 0x05, "access" : 'wo', "pdo" : False}]},
+00172     0x1025 : {"name" : "OS Debugger Interface", "struct" : array, "need" : False, "values" :
+00173                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00174                  {"name" : "Command", "type" : 0x0A, "access" : 'rw', "pdo" : False},
+00175                  {"name" : "Status", "type" : 0x07, "access" : 'ro', "pdo" : False},
+00176                  {"name" : "Reply", "type" : 0x0A, "access" : 'ro', "pdo" : False}]},
+00177     0x1026 : {"name" : "OS Prompt", "struct" : array, "need" : False, "values" :
+00178                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00179                  {"name" : "StdIn", "type" : 0x05, "access" : 'wo', "pdo" : True},
+00180                  {"name" : "StdOut", "type" : 0x05, "access" : 'ro', "pdo" : True},
+00181                  {"name" : "StdErr", "type" : 0x05, "access" : 'ro', "pdo" : True}]},
+00182     0x1027 : {"name" : "Module List", "struct" : rec, "need" : False, "values" :
+00183                 [{"name" : "Number of Connected Modules", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00184                  {"name" : "Module %d[(sub)]", "type" : 0x06, "access" : 'ro', "pdo" : False, "nbmax" : 0xFE}]},
+00185     0x1028 : {"name" : "Emergency Consumer", "struct" : rec, "need" : False, "values" :
+00186                 [{"name" : "Number of Consumed Emergency Objects", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00187                  {"name" : "Emergency Consumer", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmax" : 0x7E}]},
+00188     0x1029 : {"name" : "Error Behavior", "struct" : array, "need" : False, "values" :
+00189                 [{"name" : "Number of Error Classes", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00190                  {"name" : "Communication Error", "type" : 0x05, "access" : 'rw', "pdo" : False},
+00191                  {"name" : "Device Profile", "type" : 0x05, "access" : 'rw', "pdo" : False, "nbmax" : 0xFE}]},
+00192     0x1200 : {"name" : "Server SDO Parameter", "struct" : array, "need" : False, "values" :
+00193                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00194                  {"name" : "COB ID Client to Server (Receive SDO)", "type" : 0x07, "access" : 'ro', "pdo" : False},
+00195                  {"name" : "COB ID Server to Client (Transmit SDO)", "type" : 0x07, "access" : 'ro', "pdo" : False}]},
+00196     0x1201 : {"name" : "Additional Server SDO %d Parameter[(idx)]", "struct" : pluriarray, "incr" : 1, "nbmax" : 0x7F, "need" : False, "values" :
+00197                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00198                  {"name" : "COB ID Client to Server (Receive SDO)", "type" : 0x07, "access" : 'ro', "pdo" : False},
+00199                  {"name" : "COB ID Server to Client (Transmit SDO)", "type" : 0x07, "access" : 'ro', "pdo" : False},
+00200                  {"name" : "Node ID of the SDO Client", "type" : 0x05, "access" : 'ro', "pdo" : False}]},
+00201     0x1280 : {"name" : "Client SDO %d Parameter[(idx)]", "struct" : pluriarray, "incr" : 1, "nbmax" : 0x100, "need" : False, "values" :
+00202                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00203                  {"name" : "COB ID Client to Server (Transmit SDO)", "type" : 0x07, "access" : 'rw', "pdo" : False},
+00204                  {"name" : "COB ID Server to Client (Receive SDO)", "type" : 0x07, "access" : 'rw', "pdo" : False},
+00205                  {"name" : "Node ID of the SDO Server", "type" : 0x04, "access" : 'rw', "pdo" : False}]},
+00206     0x1400 : {"name" : "Receive PDO %d Parameter[(idx)]", "struct" : pluriarray, "incr" : 1, "nbmax" : 0x200, "need" : False, "values" :
+00207                 [{"name" : "Highest SubIndex Supported", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00208                  {"name" : "COB ID used by PDO", "type" : 0x07, "access" : 'rw', "pdo" : False, "default" : "{True:self.ID+(base+2)*0x100,False:0}[base<4]"},
+00209                  {"name" : "Transmission Type", "type" : 0x05, "access" : 'rw', "pdo" : False},
+00210                  {"name" : "Inhibit Time", "type" : 0x06, "access" : 'rw', "pdo" : False},
+00211                  {"name" : "Compatibility Entry", "type" : 0x05, "access" : 'rw', "pdo" : False},
+00212                  {"name" : "Event Timer", "type" : 0x06, "access" : 'rw', "pdo" : False}]},
+00213     0x1600 : {"name" : "Receive PDO %d Mapping[(idx)]", "struct" : plurirec, "incr" : 1, "nbmax" : 0x200, "need" : False, "values" :
+00214                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'rw', "pdo" : False},
+00215                  {"name" : "PDO %d Mapping for an application object %d[(idx,sub)]", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmax" : 0x40}]},
+00216     0x1800 : {"name" : "Transmit PDO %d Parameter[(idx)]", "struct" : pluriarray, "incr" : 1, "nbmax" : 0x200, "need" : False, "values" :
+00217                 [{"name" : "Highest SubIndex Supported", "type" : 0x05, "access" : 'ro', "pdo" : False},
+00218                  {"name" : "COB ID used by PDO", "type" : 0x07, "access" : 'rw', "pdo" : False, "default" : "{True:self.ID+(base+1)*0x100+0x80,False:0}[base<4]"},
+00219                  {"name" : "Transmission Type", "type" : 0x05, "access" : 'rw', "pdo" : False},
+00220                  {"name" : "Inhibit Time", "type" : 0x06, "access" : 'rw', "pdo" : False},
+00221                  {"name" : "Compatibility Entry", "type" : 0x05, "access" : 'rw', "pdo" : False},
+00222                  {"name" : "Event Timer", "type" : 0x06, "access" : 'rw', "pdo" : False}]},
+00223     0x1A00 : {"name" : "Transmit PDO %d Mapping[(idx)]", "struct" : plurirec, "incr" : 1, "nbmax" : 0x200, "need" : False, "values" :
+00224                 [{"name" : "Number of Entries", "type" : 0x05, "access" : 'rw', "pdo" : False},
+00225                  {"name" : "PDO %d Mapping for a process data variable %d[(idx,sub)]", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmax" : 0x40}]},
+00226 }
+00227 
+00228 #-------------------------------------------------------------------------------
+00229 #                         Search in a Mapping Dictionary
+00230 #-------------------------------------------------------------------------------
+00231 
+00232 """
+00233 Return the index of the typename given by searching in mappingdictionary 
+00234 """
+00235 def FindTypeIndex(typename, mappingdictionary):
+00236     testdic = {}
+00237     for index, values in mappingdictionary.iteritems():
+00238         if index < 0x1000:
+00239             testdic[values["name"]] = index
+00240     if typename in testdic:
+00241         return testdic[typename]
+00242     return None
+00243 
+00244 """
+00245 Return the name of the type by searching in mappingdictionary 
+00246 """
+00247 def FindTypeName(typeindex, mappingdictionary):
+00248     if typeindex < 0x1000 and typeindex in mappingdictionary:
+00249         return mappingdictionary[typeindex]["name"]
+00250     return None
+00251 
+00252 """
+00253 Return the default value of the type by searching in mappingdictionary 
+00254 """
+00255 def FindTypeDefaultValue(typeindex, mappingdictionary):
+00256     if typeindex < 0x1000 and typeindex in mappingdictionary:
+00257         return mappingdictionary[typeindex]["default"]
+00258     return None
+00259 
+00260 """
+00261 Return the list of types defined in mappingdictionary 
+00262 """
+00263 def FindTypeList(mappingdictionary):
+00264     list = []
+00265     for index in mappingdictionary.keys():
+00266         if index < 0x1000:
+00267             list.append(mappingdictionary[index]["name"])
+00268     return list
+00269 
+00270 """
+00271 Return the name of an entry by searching in mappingdictionary 
+00272 """
+00273 def FindEntryName(index, mappingdictionary):
+00274     base_index = FindIndex(index, mappingdictionary)
+00275     if base_index:
+00276         infos = mappingdictionary[base_index]
+00277         if infos["struct"] & OD_IdenticalIndexes:
+00278             return StringFormat(infos["name"], (index - base_index) / infos["incr"] + 1, 0)
+00279         else:
+00280             return infos["name"]
+00281     return None
+00282 
+00283 """
+00284 Return the informations of one entry by searching in mappingdictionary 
+00285 """
+00286 def FindEntryInfos(index, mappingdictionary):
+00287     base_index = FindIndex(index, mappingdictionary)
+00288     if base_index:
+00289         copy = mappingdictionary[base_index].copy()
+00290         if copy["struct"] & OD_IdenticalIndexes:
+00291             copy["name"] = StringFormat(copy["name"], (index - base_index) / copy["incr"] + 1, 0)
+00292         copy.pop("values")
+00293         return copy
+00294     return None
+00295 
+00296 """
+00297 Return the informations of one subentry of an entry by searching in mappingdictionary 
+00298 """
+00299 def FindSubentryInfos(index, subIndex, mappingdictionary):
+00300     base_index = FindIndex(index, mappingdictionary)
+00301     if base_index:
+00302         struct = mappingdictionary[base_index]["struct"]
+00303         if struct & OD_Subindex:
+00304             if struct & OD_IdenticalSubindexes:
+00305                 if struct & OD_IdenticalIndexes:
+00306                     incr = mappingdictionary[base_index]["incr"]
+00307                 else:
+00308                     incr = 1
+00309                 if subIndex == 0:
+00310                     return mappingdictionary[base_index]["values"][0].copy()
+00311                 elif 0 < subIndex <= mappingdictionary[base_index]["values"][1]["nbmax"]:
+00312                     copy = mappingdictionary[base_index]["values"][1].copy()
+00313                     copy["name"] = StringFormat(copy["name"], (index - base_index) / incr + 1, subIndex)
+00314                     return copy
+00315             elif struct & OD_MultipleSubindexes and 0 <= subIndex < len(mappingdictionary[base_index]["values"]):
+00316                 return mappingdictionary[base_index]["values"][subIndex].copy()
+00317             elif subIndex == 0:
+00318                 return mappingdictionary[base_index]["values"][0].copy()
+00319     return None
+00320 
+00321 """
+00322 Return the list of variables that can be mapped defined in mappingdictionary 
+00323 """
+00324 def FindMapVariableList(mappingdictionary, Node):
+00325     list = []
+00326     for index in mappingdictionary.iterkeys():
+00327         if Node.IsEntry(index):
+00328             for subIndex, values in enumerate(mappingdictionary[index]["values"]):
+00329                 if mappingdictionary[index]["values"][subIndex]["pdo"]:
+00330                     infos = Node.GetEntryInfos(mappingdictionary[index]["values"][subIndex]["type"])
+00331                     if mappingdictionary[index]["struct"] & OD_IdenticalSubindexes:
+00332                         values = Node.GetEntry(index)
+00333                         for i in xrange(len(values) - 1):
+00334                             list.append((index, i + 1, infos["size"], StringFormat(mappingdictionary[index]["values"][subIndex]["name"],1,i+1)))
+00335                     else:
+00336                         list.append((index, subIndex, infos["size"], mappingdictionary[index]["values"][subIndex]["name"]))
+00337     return list
+00338 
+00339 """
+00340 Return the list of mandatory indexes defined in mappingdictionary 
+00341 """
+00342 def FindMandatoryIndexes(mappingdictionary):
+00343     list = []
+00344     for index in mappingdictionary.iterkeys():
+00345         if index >= 0x1000 and mappingdictionary[index]["need"]:
+00346             list.append(index)
+00347     return list
+00348 
+00349 """
+00350 Return the index of the informations in the Object Dictionary in case of identical
+00351 indexes
+00352 """
+00353 def FindIndex(index, mappingdictionary):
+00354     if index in mappingdictionary:
+00355         return index
+00356     else:
+00357         listpluri = [idx for idx in mappingdictionary.keys() if mappingdictionary[idx]["struct"] & OD_IdenticalIndexes]
+00358         listpluri.sort()
+00359         for idx in listpluri:
+00360             nb_max = mappingdictionary[idx]["nbmax"]
+00361             incr = mappingdictionary[idx]["incr"]
+00362             if idx < index < idx + incr * nb_max and (index - idx)%incr == 0:
+00363                 return idx
+00364     return None
+00365 
+00366 #-------------------------------------------------------------------------------
+00367 #                           Formating Name of an Entry
+00368 #-------------------------------------------------------------------------------
+00369 
+00370 name_model = re.compile('(.*)\[(.*)\]')
+00371 
+00372 """
+00373 Format the text given with the index and subindex defined
+00374 """
+00375 def StringFormat(text, idx, sub):
+00376     result = name_model.match(text)
+00377     if result:
+00378         format = result.groups()
+00379         return format[0]%eval(format[1])
+00380     else:
+00381         return text
+00382 
+00383 #-------------------------------------------------------------------------------
+00384 #                          Definition of Node Object
+00385 #-------------------------------------------------------------------------------
+00386 
+00387 """
+00388 Class recording the Object Dictionary entries. It checks at each modification
+00389 that the structure of the Object Dictionary stay coherent
+00390 """
+00391 
+00392 class Node:
+00393     
+00394     def __init__(self, name = "", type = "slave", id = 0, description = "", profilename = "DS-301", profile = {}, specificmenu = []):
+00395         self.NameName = name
+00396         self.TypeType = type
+00397         self.IDID = id
+00398         self.DescriptionDescription = description
+00399         self.ProfileNameProfileName = profilename
+00400         self.ProfileProfile = profile
+00401         self.SpecificMenuSpecificMenu = specificmenu
+00402         self.DictionaryDictionary = {}
+00403         self.ParamsDictionaryParamsDictionary = {}
+00404         self.DS302DS302 = {}
+00405         self.UserMappingUserMapping = {}
+00406     
+00407     """
+00408     Return the node name
+00409     """
+00410     def GetNodeName(self):
+00411         return self.NameName
+00412     
+00413     """
+00414     Define the node name
+00415     """
+00416     def SetNodeName(self, name):
+00417         self.NameName = name
+00418 
+00419     """
+00420     Return the node type ("master" or "slave")
+00421     """
+00422     def GetNodeType(self):
+00423         return self.TypeType
+00424     
+00425     """
+00426     Define the node type ("master" or "slave")
+00427     """
+00428     def SetNodeType(self, type):
+00429         self.TypeType = type
+00430 
+00431     """
+00432     Return the node ID
+00433     """
+00434     def GetNodeID(self):
+00435         return self.IDID
+00436     
+00437     """
+00438     Define the node ID
+00439     """
+00440     def SetNodeID(self, id):
+00441         self.IDID = id
+00442 
+00443     """
+00444     Return the node description
+00445     """
+00446     def GetNodeDescription(self):
+00447         if getattr(self, "Description", False):
+00448             return self.DescriptionDescription
+00449         else:
+00450             return ""
+00451     
+00452     """
+00453     Define the node description
+00454     """
+00455     def SetNodeDescription(self, description):
+00456         self.DescriptionDescription = description
+00457 
+00458     """
+00459     Return the Specific Profile Name
+00460     """
+00461     def GetProfileName(self):
+00462         return self.ProfileNameProfileName
+00463     
+00464     """
+00465     Define the Specific Profile Name
+00466     """
+00467     def SetProfileName(self, profilename):
+00468         self.ProfileNameProfileName = profilename
+00469 
+00470     """
+00471     Return the Specific Profile
+00472     """
+00473     def GetProfile(self):
+00474         return self.ProfileProfile
+00475     
+00476     """
+00477     Define the Specific Profile
+00478     """
+00479     def SetProfile(self, profile):
+00480         self.ProfileProfile = profile
+00481     
+00482     """
+00483     Define the DS-302 Profile
+00484     """
+00485     def SetDS302Profile(self, profile):
+00486         self.DS302DS302 = profile
+00487     
+00488     """
+00489     Define the DS-302 Profile
+00490     """
+00491     def GetDS302Profile(self):
+00492         return self.DS302DS302
+00493     
+00494     """
+00495     Return the Specific Menu Entries
+00496     """
+00497     def GetSpecificMenu(self):
+00498         return self.SpecificMenuSpecificMenu
+00499     
+00500     """
+00501     Define the Specific Menu Entries
+00502     """
+00503     def SetSpecificMenu(self, specificmenu):
+00504         self.SpecificMenuSpecificMenu = specificmenu
+00505     
+00506     """
+00507     Extend the Specific Menu Entries
+00508     """
+00509     
+00510     def ExtendSpecificMenu(self, specificmenu):
+00511         self.SpecificMenuSpecificMenu.extend(specificmenu)
+00512     
+00513     """
+00514     Function which return the different Mappings available for this node
+00515     """
+00516     def GetMappings(self, userdefinedtoo = True):
+00517         if userdefinedtoo:
+00518             return [self.ProfileProfile, self.DS302DS302, self.UserMappingUserMapping]
+00519         else:
+00520             return [self.ProfileProfile, self.DS302DS302]
+00521     
+00522     """
+00523     Add a new entry in the Object Dictionary
+00524     """
+00525     def AddEntry(self, index, subIndex = None, value = None):
+00526         if index not in self.DictionaryDictionary:
+00527             if not subIndex:
+00528                 self.DictionaryDictionary[index] = value
+00529                 return True
+00530             elif subIndex == 1:
+00531                 self.DictionaryDictionary[index] = [value]
+00532                 return True
+00533         elif subIndex > 1 and type(self.DictionaryDictionary[index]) == ListType and subIndex == len(self.DictionaryDictionary[index]) + 1:
+00534             self.DictionaryDictionary[index].append(value)
+00535             return True
+00536         return False
+00537 
+00538     """
+00539     Warning ! Modifies an existing entry in the Object Dictionary. Can't add a new one.
+00540     """
+00541     def SetEntry(self, index, subIndex = None, value = None):
+00542         if index in self.DictionaryDictionary:
+00543             if not subIndex:
+00544                 if value != None:
+00545                     self.DictionaryDictionary[index] = value
+00546                 return True
+00547             elif type(self.DictionaryDictionary[index]) == ListType and 0 < subIndex <= len(self.DictionaryDictionary[index]):
+00548                 if value != None:
+00549                     self.DictionaryDictionary[index][subIndex - 1] = value
+00550                 return True
+00551         return False
+00552     
+00553     def SetParamsEntry(self, index, subIndex = None, comment = None, save = None, callback = None):
+00554         if not getattr(self, "ParamsDictionary", False):
+00555             self.ParamsDictionaryParamsDictionary = {}
+00556         if index in self.DictionaryDictionary:
+00557             if (comment != None or save != None or callback != None) and index not in self.ParamsDictionaryParamsDictionary:
+00558                 self.ParamsDictionaryParamsDictionary[index] = {}
+00559             if subIndex == None or type(self.DictionaryDictionary[index]) != ListType and subIndex == 0:
+00560                 if comment != None:
+00561                     self.ParamsDictionaryParamsDictionary[index]["comment"] = comment
+00562                 if save != None:
+00563                     self.ParamsDictionaryParamsDictionary[index]["save"] = save
+00564                 if callback != None:
+00565                     self.ParamsDictionaryParamsDictionary[index]["callback"] = callback
+00566                 return True
+00567             elif type(self.DictionaryDictionary[index]) == ListType and 0 <= subIndex <= len(self.DictionaryDictionary[index]):
+00568                 if (comment != None or save != None or callback != None) and subIndex not in self.ParamsDictionaryParamsDictionary[index]:
+00569                     self.ParamsDictionaryParamsDictionary[index][subIndex] = {}
+00570                 if comment != None:
+00571                     self.ParamsDictionaryParamsDictionary[index][subIndex]["comment"] = comment
+00572                 if save != None:
+00573                     self.ParamsDictionaryParamsDictionary[index][subIndex]["save"] = save
+00574                 return True
+00575         return False
+00576     
+00577     """
+00578     Removes an existing entry in the Object Dictionary. If a subIndex is specified
+00579     it will remove this subIndex only if it's the last of the index. If no subIndex
+00580     is specified it removes the whole index and subIndexes from the Object Dictionary.
+00581     """
+00582     def RemoveEntry(self, index, subIndex = None):
+00583         if not getattr(self, "ParamsDictionary", False):
+00584             self.ParamsDictionaryParamsDictionary = {}
+00585         if index in self.DictionaryDictionary:
+00586             if not subIndex:
+00587                 self.DictionaryDictionary.pop(index)
+00588                 if index in self.ParamsDictionaryParamsDictionary:
+00589                     self.ParamsDictionaryParamsDictionary.pop(index)
+00590                 return True
+00591             elif type(self.DictionaryDictionary[index]) == ListType and subIndex == len(self.DictionaryDictionary[index]):
+00592                 self.DictionaryDictionary[index].pop(subIndex - 1)
+00593                 if index in self.ParamsDictionaryParamsDictionary:
+00594                     if subIndex in self.ParamsDictionaryParamsDictionary[index]:
+00595                         self.ParamsDictionaryParamsDictionary[index].pop(subIndex)
+00596                     if len(self.ParamsDictionaryParamsDictionary[index]) == 0:
+00597                         self.ParamsDictionaryParamsDictionary.pop(index)
+00598                 if len(self.DictionaryDictionary[index]) == 0:
+00599                     self.DictionaryDictionary.pop(index)
+00600                     if index in self.ParamsDictionaryParamsDictionary:
+00601                         self.ParamsDictionaryParamsDictionary.pop(index)
+00602                 return True
+00603         return False
+00604     
+00605     """
+00606     Check if an entry exists in the Object Dictionary and returns the answer.
+00607     """
+00608     def IsEntry(self, index, subIndex = None):
+00609         if index in self.DictionaryDictionary:
+00610             if not subIndex:
+00611                 return True
+00612             return subIndex <= len(self.DictionaryDictionary[index])
+00613         return False
+00614     
+00615     """
+00616     Returns the value of the entry asked. If the entry has the value "count", it
+00617     returns the number of subIndex in the entry except the first.
+00618     """
+00619     def GetEntry(self, index, subIndex = None):
+00620         if index in self.DictionaryDictionary:
+00621             if subIndex == None:
+00622                 if type(self.DictionaryDictionary[index]) == ListType:
+00623                     values = [len(self.DictionaryDictionary[index])]
+00624                     for value in self.DictionaryDictionary[index]:
+00625                         values.append(self.CompileValueCompileValue(value, index))
+00626                     return values
+00627                 else:
+00628                     return self.DictionaryDictionary[index]
+00629             elif subIndex == 0:
+00630                 if type(self.DictionaryDictionary[index]) == ListType:
+00631                     return len(self.DictionaryDictionary[index])
+00632                 else:
+00633                     return self.CompileValueCompileValue(self.DictionaryDictionary[index], index)
+00634             elif type(self.DictionaryDictionary[index]) == ListType and 0 < subIndex <= len(self.DictionaryDictionary[index]):
+00635                 return self.CompileValueCompileValue(self.DictionaryDictionary[index][subIndex - 1], index)
+00636         return None
+00637 
+00638     """
+00639     Returns the value of the entry asked. If the entry has the value "count", it
+00640     returns the number of subIndex in the entry except the first.
+00641     """
+00642     def GetParamsEntry(self, index, subIndex = None):
+00643         if not getattr(self, "ParamsDictionary", False):
+00644             self.ParamsDictionaryParamsDictionary = {}
+00645         if index in self.DictionaryDictionary:
+00646             if subIndex == None:
+00647                 if type(self.DictionaryDictionary[index]) == ListType:
+00648                     if index in self.ParamsDictionaryParamsDictionary:
+00649                         result = []
+00650                         for i in xrange(len(self.DictionaryDictionary[index]) + 1):
+00651                             line = DefaultParams.copy()
+00652                             if i in self.ParamsDictionaryParamsDictionary[index]:
+00653                                 line.update(self.ParamsDictionaryParamsDictionary[index][i])
+00654                             result.append(line)
+00655                         return result
+00656                     else:
+00657                         return [DefaultParams.copy() for i in xrange(len(self.DictionaryDictionary[index]) + 1)]
+00658                 else:
+00659                     result = DefaultParams.copy()
+00660                     if index in self.ParamsDictionaryParamsDictionary:
+00661                         result.update(self.ParamsDictionaryParamsDictionary[index])
+00662                     return result
+00663             elif subIndex == 0 and type(self.DictionaryDictionary[index]) != ListType:
+00664                 result = DefaultParams.copy()
+00665                 if index in self.ParamsDictionaryParamsDictionary:
+00666                     result.update(self.ParamsDictionaryParamsDictionary[index])
+00667                 return result
+00668             elif type(self.DictionaryDictionary[index]) == ListType and 0 <= subIndex <= len(self.DictionaryDictionary[index]):
+00669                 result = DefaultParams.copy()
+00670                 if index in self.ParamsDictionaryParamsDictionary and subIndex in self.ParamsDictionaryParamsDictionary[index]:
+00671                     result.update(self.ParamsDictionaryParamsDictionary[index][subIndex])
+00672                 return result
+00673         return None
+00674 
+00675     def HasEntryCallbacks(self, index):
+00676         if not getattr(self, "ParamsDictionary", False):
+00677             self.ParamsDictionaryParamsDictionary = {}
+00678         if index in self.DictionaryDictionary and index in self.ParamsDictionaryParamsDictionary and "callback" in self.ParamsDictionaryParamsDictionary[index]:
+00679             return self.ParamsDictionaryParamsDictionary[index]["callback"]
+00680         return False
+00681 
+00682     """
+00683     Check if an entry exists in the User Mapping Dictionary and returns the answer.
+00684     """
+00685     def IsMappingEntry(self, index):
+00686         if index in self.UserMappingUserMapping:
+00687             return True
+00688         return False
+00689 
+00690     """
+00691     Add a new entry in the User Mapping Dictionary
+00692     """
+00693     def AddMappingEntry(self, index, subIndex = None, name = "Undefined", struct = 0, size = None, nbmax = None, default = None, values = None):
+00694         if index not in self.UserMappingUserMapping:
+00695             if values == None:
+00696                 values = []
+00697             if subIndex == None:
+00698                 self.UserMappingUserMapping[index] = {"name" : name, "struct" : struct, "need" : False, "values" : values}
+00699                 if size != None:
+00700                     self.UserMappingUserMapping[index]["size"] = size
+00701                 if nbmax != None:
+00702                     self.UserMappingUserMapping[index]["nbmax"] = nbmax
+00703                 if default != None:
+00704                     self.UserMappingUserMapping[index]["default"] = default
+00705                 return True
+00706         elif subIndex != None and subIndex == len(self.UserMappingUserMapping[index]["values"]):
+00707             if values == None:
+00708                 values = {}
+00709             self.UserMappingUserMapping[index]["values"].append(values)
+00710             return True
+00711         return False
+00712 
+00713     """
+00714     Warning ! Modifies an existing entry in the User Mapping Dictionary. Can't add a new one.
+00715     """
+00716     def SetMappingEntry(self, index, subIndex = None, name = None, struct = None, size = None, nbmax = None, default = None, values = None):
+00717         if index in self.UserMappingUserMapping:
+00718             if subIndex == None:
+00719                 if name != None:
+00720                     self.UserMappingUserMapping[index]["name"] = name
+00721                     if self.UserMappingUserMapping[index]["struct"] & OD_IdenticalSubindexes:
+00722                         self.UserMappingUserMapping[index]["values"][1]["name"] = name + " %d[(sub)]"
+00723                     elif not self.UserMappingUserMapping[index]["struct"] & OD_MultipleSubindexes:
+00724                         self.UserMappingUserMapping[index]["values"][0]["name"] = name
+00725                 if struct != None:
+00726                     self.UserMappingUserMapping[index]["struct"] = struct
+00727                 if size != None:
+00728                     self.UserMappingUserMapping[index]["size"] = size
+00729                 if nbmax != None:
+00730                     self.UserMappingUserMapping[index]["nbmax"] = nbmax
+00731                 if default != None:
+00732                     self.UserMappingUserMapping[index]["default"] = default
+00733                 if values != None:
+00734                     self.UserMappingUserMapping[index]["values"] = values
+00735                 return True
+00736             elif 0 <= subIndex < len(self.UserMappingUserMapping[index]["values"]) and values != None:
+00737                 self.UserMappingUserMapping[index]["values"][subIndex].update(values)
+00738                 return True
+00739         return False
+00740     
+00741     """
+00742     Removes an existing entry in the User Mapping Dictionary. If a subIndex is specified
+00743     it will remove this subIndex only if it's the last of the index. If no subIndex
+00744     is specified it removes the whole index and subIndexes from the User Mapping Dictionary.
+00745     """
+00746     def RemoveMappingEntry(self, index, subIndex = None):
+00747         if index in self.UserMappingUserMapping:
+00748             if subIndex == None:
+00749                 self.UserMappingUserMapping.pop(index)
+00750                 return True
+00751             elif subIndex == len(self.UserMappingUserMapping[index]["values"]) - 1:
+00752                 self.UserMappingUserMapping[index]["values"].pop(subIndex)
+00753                 return True
+00754         return False
+00755 
+00756     def RemoveMapVariable(self, index, subIndex = None):
+00757         model = index << 16
+00758         mask = 0xFFFF << 16
+00759         if subIndex:
+00760             model += subIndex << 8
+00761             mask = 0xFF << 8
+00762         for i in self.DictionaryDictionary.iterkeys():
+00763             if 0x1600 <= i <= 0x17FF or 0x1A00 <= i <= 0x1BFF:
+00764                 for j,value in enumerate(self.DictionaryDictionary[i]):
+00765                     if (value & mask) == model:
+00766                         self.DictionaryDictionary[i][j] = 0
+00767     
+00768     def UpdateMapVariable(self, index, subIndex, size):
+00769         model = index << 16
+00770         mask = 0xFFFF << 16
+00771         if subIndex:
+00772             model += subIndex << 8
+00773             mask = 0xFF << 8
+00774         for i in self.DictionaryDictionary.iterkeys():
+00775             if 0x1600 <= i <= 0x17FF or 0x1A00 <= i <= 0x1BFF:
+00776                 for j,value in enumerate(self.DictionaryDictionary[i]):
+00777                     if (value & mask) == model:
+00778                         self.DictionaryDictionary[i][j] = model + size
+00779     
+00780     def RemoveLine(self, index, max, incr = 1):
+00781         i = index
+00782         while i < max and self.IsEntryIsEntry(i + incr):
+00783             self.DictionaryDictionary[i] = self.DictionaryDictionary[i + incr]
+00784             i += incr
+00785         self.DictionaryDictionary.pop(i)
+00786 
+00787     def RemoveUserType(self, index):
+00788         type = self.GetEntryGetEntry(index, 1)
+00789         for i in self.UserMappingUserMapping:
+00790             for value in self.UserMappingUserMapping[i]["values"]:
+00791                 if value["type"] == index:
+00792                     value["type"] = type
+00793         self.RemoveMappingEntryRemoveMappingEntry(index)
+00794         self.RemoveEntryRemoveEntry(index)
+00795 
+00796     """
+00797     Return a copy of the node
+00798     """
+00799     def Copy(self):
+00800         return cPickle.loads(cPickle.dumps(self))
+00801 
+00802     """
+00803     Return a sorted list of indexes in Object Dictionary
+00804     """
+00805     def GetIndexes(self):
+00806         listindex = self.DictionaryDictionary.keys()
+00807         listindex.sort()
+00808         return listindex
+00809 
+00810     """
+00811     Print the Dictionary values
+00812     """
+00813     def Print(self):
+00814         listindex = self.DictionaryDictionary.keys()
+00815         listindex.sort()
+00816         for index in listindex:
+00817             print "%04X : %s"%(index, self.DictionaryDictionary[index])    
+00818 
+00819     def CompileValue(self, value, index):
+00820         if type(value) == StringType and value.find("self.ID") != -1:
+00821             base = self.GetBaseIndexGetBaseIndex(index)
+00822             try:
+00823                 return eval(value)
+00824             except:
+00825                 return 0
+00826         else:
+00827             return value
+00828 
+00829 #-------------------------------------------------------------------------------
+00830 #                         Node Informations Functions
+00831 #-------------------------------------------------------------------------------
+00832 
+00833     def GetBaseIndex(self, index):
+00834         for mapping in self.GetMappingsGetMappings():
+00835             result = FindIndex(index, mapping)
+00836             if result != None:
+00837                 return (index - result) / mapping[result]["incr"]
+00838         result = FindIndex(index, MappingDictionary)
+00839         if result != None:
+00840             return (index - result) / MappingDictionary[result]["incr"]
+00841         return 0
+00842 
+00843     def GetCustomisedTypeValues(self, index):
+00844         values = self.GetEntryGetEntry(index)
+00845         customisabletypes = self.GetCustomisableTypesGetCustomisableTypes()
+00846         return values, customisabletypes[values[1]][1]
+00847 
+00848     def GetEntryName(self, index):
+00849         result = None
+00850         mappings = self.GetMappingsGetMappings()
+00851         i = 0
+00852         while not result and i < len(mappings):
+00853             result = FindEntryName(index, mappings[i])
+00854             i += 1
+00855         if result == None:
+00856             result = FindEntryName(index, MappingDictionary)
+00857         return result
+00858     
+00859     def GetEntryInfos(self, index):
+00860         result = None
+00861         mappings = self.GetMappingsGetMappings()
+00862         i = 0
+00863         while not result and i < len(mappings):
+00864             result = FindEntryInfos(index, mappings[i])
+00865             i += 1
+00866         if result == None:
+00867             result = FindEntryInfos(index, MappingDictionary)
+00868         return result
+00869     
+00870     def GetSubentryInfos(self, index, subIndex):
+00871         result = None
+00872         mappings = self.GetMappingsGetMappings()
+00873         i = 0
+00874         while not result and i < len(mappings):
+00875             result = FindSubentryInfos(index, subIndex, mappings[i])
+00876             if result:
+00877                 result["user_defined"] = i == len(mappings) - 1 and index >= 0x1000
+00878             i += 1
+00879         if result == None:
+00880             result = FindSubentryInfos(index, subIndex, MappingDictionary)
+00881             if result:
+00882                 result["user_defined"] = False
+00883         return result
+00884     
+00885     def GetTypeIndex(self, typename):
+00886         result = None
+00887         mappings = self.GetMappingsGetMappings()
+00888         i = 0
+00889         while not result and i < len(mappings):
+00890             result = FindTypeIndex(typename, mappings[i])
+00891             i += 1
+00892         if result == None:
+00893             result = FindTypeIndex(typename, MappingDictionary)
+00894         return result
+00895     
+00896     def GetTypeName(self, typeindex):
+00897         result = None
+00898         mappings = self.GetMappingsGetMappings()
+00899         i = 0
+00900         while not result and i < len(mappings):
+00901             result = FindTypeName(typeindex, mappings[i])
+00902             i += 1
+00903         if result == None:
+00904             result = FindTypeName(typeindex, MappingDictionary)
+00905         return result
+00906     
+00907     def GetTypeDefaultValue(self, typeindex):
+00908         result = None
+00909         mappings = self.GetMappingsGetMappings()
+00910         i = 0
+00911         while not result and i < len(mappings):
+00912             result = FindTypeDefaultValue(typeindex, mappings[i])
+00913             i += 1
+00914         if result == None:
+00915             result = FindTypeDefaultValue(typeindex, MappingDictionary)
+00916         return result
+00917     
+00918     def GetMapVariableList(self):
+00919         list = FindMapVariableList(MappingDictionary, self)
+00920         for mapping in self.GetMappingsGetMappings():
+00921             list.extend(FindMapVariableList(mapping, self))
+00922         list.sort()
+00923         return list
+00924     
+00925     def GetMandatoryIndexes(self, node = None):
+00926         list = FindMandatoryIndexes(MappingDictionary)
+00927         for mapping in self.GetMappingsGetMappings():
+00928             list.extend(FindMandatoryIndexes(mapping))
+00929         return list
+00930     
+00931     def GetCustomisableTypes(self):
+00932         dic = {}
+00933         for index, valuetype in CustomisableTypes:
+00934             name = self.GetTypeNameGetTypeName(index)
+00935             dic[index] = [name, valuetype]
+00936         return dic
+00937 
+00938 #-------------------------------------------------------------------------------
+00939 #                            Type and Map Variable Lists
+00940 #-------------------------------------------------------------------------------
+00941     
+00942     def GetTypeList(self):
+00943         list = FindTypeList(MappingDictionary)
+00944         for mapping in self.GetMappingsGetMappings():
+00945             list.extend(FindTypeList(mapping))
+00946         list.sort()
+00947         return ",".join(list)
+00948 
+00949     """
+00950     Generate the list of variables that can be mapped for the current node
+00951     """
+00952     def GenerateMapList(self):
+00953         self.MapListMapList = "None"
+00954         self.NameTranslationNameTranslation = {"None" : "00000000"}
+00955         self.MapTranslationMapTranslation = {"00000000" : "None"}
+00956         list = self.GetMapVariableListGetMapVariableList()
+00957         for index, subIndex, size, name in list:
+00958             self.MapListMapList += ",%s"%name
+00959             map = "%04X%02X%02X"%(index,subIndex,size)
+00960             self.NameTranslationNameTranslation[name] = map
+00961             self.MapTranslationMapTranslation[map] = name
+00962 
+00963     def GetMapValue(self, mapname):
+00964         if mapname == "None":
+00965             return 0
+00966         else:
+00967             list = self.GetMapVariableListGetMapVariableList()
+00968             for index, subIndex, size, name in list:
+00969                 if mapname == name:
+00970                     return (index << 16) + (subIndex << 8) + size
+00971             return None
+00972     
+00973     def GetMapName(self, value):
+00974         if value != 0:
+00975             index = value >> 16
+00976             subindex = (value >> 8) % (1 << 8)
+00977             result = self.GetSubentryInfosGetSubentryInfos(index, subindex)
+00978             if result:
+00979                 return result["name"]
+00980         return "None"
+00981     
+00982     """
+00983     Return the list of variables that can be mapped for the current node
+00984     """
+00985     def GetMapList(self):
+00986         list = ["None"] + [name for index, subIndex, size, name in self.GetMapVariableListGetMapVariableList()]
+00987         return ",".join(list)
+

Generated on Mon Jun 4 16:29:06 2007 for CanFestival by  + +doxygen 1.5.1
+ +