diff -r 6787754b251b -r b6572d0336c3 doc/doxygen/html/xml__in_8py-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/doxygen/html/xml__in_8py-source.html Mon Jun 04 17:59:50 2007 +0200 @@ -0,0 +1,477 @@ + +
+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 from xml.parsers import expat +00025 +00026 import node +00027 from node import * +00028 +00029 maxObjects = 8 +00030 +00031 currentPDOIndex = 0 +00032 currentBitsMapped = 0 +00033 currentMaxObjects = 0 +00034 currentNbMappedObjects = 0 +00035 +00036 nextPdoIndex = {"rx":0x1400,"tx":0x1800} +00037 +00038 valid_elements = ["node","heartbeat_consumers","sdo_clients","pdo","mapped_object", +00039 "pdo_param","pdo_receive","pdo_transmit","mapped_variable","mapped_table", +00040 "mapped_string_variable","mapped_string_table"] +00041 +00042 #------------------------------------------------------------------------------- +00043 # Callback method of parse +00044 #------------------------------------------------------------------------------- +00045 +00046 def StartElement(name, attrs): +00047 if name in valid_elements: +00048 if name == "node": +00049 startNode(attrs) +00050 elif name == "heartbeat_consumers": +00051 startHeartBeatConsumers(attrs) +00052 elif name == "sdo_clients": +00053 startSdoClients(attrs) +00054 elif name in ["pdo_param","pdo_receive","pdo_transmit"]: +00055 raise ValueError, """!!! The XML grammar has changed. +00056 Please, open your xml file, delete the tags pdo_param, pdo_receive and pdo_transmit. +00057 Use instead the tag pdo for each pdo to create, and (optional) use the tag mapped_object (menu pdo/map and object ...).""" +00058 elif name == "pdo": +00059 startPdo(attrs) +00060 elif name == "mapped_object": +00061 startMappedObject(attrs) +00062 elif name == "mapped_variable": +00063 startMappedVariable(attrs) +00064 elif name == "mapped_table": +00065 startMappedTable(attrs) +00066 elif name == "mapped_string_variable": +00067 startMappedVariable(attrs) +00068 elif name == "mapped_string_table": +00069 startMappedTable(attrs) +00070 +00071 def EndElement(name): +00072 if name in valid_elements: +00073 if name == "node": +00074 stopNode() +00075 +00076 def CharacterData(data): +00077 pass +00078 +00079 #------------------------------------------------------------------------------- +00080 # Creation of Node +00081 #------------------------------------------------------------------------------- +00082 +00083 def startNode(attrs): +00084 name = attrs["name"] +00085 Node.SetNodeName(name) +00086 +00087 if "node_id" in attrs and len(attrs["node_id"]) > 0: +00088 node_id = eval(attrs["node_id"]) +00089 else: +00090 node_id = 0x01 # We define here a default node_id. +00091 Node.SetNodeID(node_id) +00092 +00093 typeNode = attrs["type_node"] +00094 Node.SetNodeType(typeNode) +00095 +00096 if "device_type_1000" in attrs: +00097 device_type = eval(attrs["device_type_1000"]) +00098 else: +00099 device_type = 0 +00100 Node.AddEntry(0x1000, 0, device_type) +00101 Node.AddEntry(0x1001, 0, 0) +00102 Node.AddEntry(0x1005, 0, 0x00000080) +00103 Node.AddEntry(0x1006, 0, 0) +00104 Node.AddEntry(0x1007, 0, 0) +00105 +00106 if "manufacturer_device_name_1008" in attrs: +00107 manufacturer_device_name = attrs["manufacturer_device_name_1008"] +00108 else: +00109 manufacturer_device_name = "" +00110 Node.AddEntry(0x1008, 0, manufacturer_device_name) +00111 +00112 if "manufacturer_hardware_version_1009" in attrs: +00113 manufacturer_hardware_version = attrs["manufacturer_hardware_version_1009"] +00114 else: +00115 manufacturer_hardware_version = "__DATE__" +00116 Node.AddEntry(0x1009, 0, manufacturer_hardware_version) +00117 +00118 if "manufacturer_software_version_100A" in attrs: +00119 manufacturer_software_version = attrs["manufacturer_software_version_100A"] +00120 else: +00121 manufacturer_software_version = 0 +00122 Node.AddEntry(0x100A, 0, manufacturer_software_version) +00123 +00124 if "vendor_id_1018" in attrs: +00125 vendor_id = eval(attrs["vendor_id_1018"]) +00126 else: +00127 vendor_id = 0 +00128 if "product_code_1018" in attrs: +00129 product_code = eval(attrs["product_code_1018"]) +00130 else: +00131 product_code = 0 +00132 if "revision_number_1018" in attrs: +00133 revision_number = eval(attrs["revision_number_1018"]) +00134 else: +00135 revision_number = 0 +00136 if "serial_number_1018" in attrs: +00137 serial_number = eval(attrs["serial_number_1018"]) +00138 else: +00139 serial_number = 0 +00140 Node.AddEntry(0x1018, 1, vendor_id) +00141 Node.AddEntry(0x1018, 2, product_code) +00142 Node.AddEntry(0x1018, 3, revision_number) +00143 Node.AddEntry(0x1018, 4, serial_number) +00144 +00145 def stopNode(): +00146 heartBeatProducer() +00147 sdoServer() +00148 +00149 #------------------------------------------------------------------------------- +00150 # Creation of PDO in Object Dictionary +00151 #------------------------------------------------------------------------------- +00152 +00153 def startPdo(attrs): +00154 global currentPdoIndex +00155 global currentMaxObjects +00156 global currentNbMappedObjects +00157 global currentBitsMapped +00158 global maxObjects +00159 +00160 cobId = 0 +00161 transmissionType = 253 # Default is on request. Why not ? +00162 +00163 # Find the type of the PDO and search the index of the last added +00164 type = attrs["type_rx_tx"] +00165 index = nextPdoIndex[type] +00166 +00167 # If the index of the PDO is define, verify that it has a good index +00168 if "index_communication_parameter" in attrs: +00169 index = eval(attrs["index_communication_parameter"]) +00170 if type == "rx" and not 0x1400 <= index <= 0x15FF: +00171 raise ValueError, """!!! Abort because Index PDO receive : 0x%04X not valid. +00172 Valid index is 0x1400 ... 0x15FF"""%index +00173 if type == "tx" and not 0x1800 <= index <= 0x19FF: +00174 raise ValueError, """!!! Abort because Index PDO transmit : 0x%04X not valid. +00175 Valid index is 0x1800 ... 0x19FF"""%index +00176 +00177 # Extract the PDO communication parameters +00178 if "cob_id" == attrs: +00179 cobId = eval(attrs["cob_id"]) +00180 if "max_objects_in_pdo" == attrs: +00181 maxObjects = eval(attrs["max_objects_in_pdo"]) +00182 if "transmission_type" in attrs: +00183 transmissionType = eval(attrs["transmission_type"]) +00184 +00185 if Node.IsEntry(index): +00186 raise ValueError, """!!! Abort because the PDO at index : 0x%04X have been already defined."""%index +00187 +00188 # Communication parameters +00189 Node.AddEntry(index, 1, cobId) +00190 Node.AddEntry(index, 2, transmissionType) +00191 +00192 # Mapping parameters +00193 mapping_index = index + 0x200 +00194 for i in xrange(1, maxObjects + 1): +00195 Node.AddEntry(mapping_index, i, 0x0) +00196 +00197 currentPdoIndex = index +00198 currentMaxObjects = maxObjects +00199 currentBitsMapped = 0 +00200 currentNbMappedObjects = 0 +00201 +00202 nextPdoIndex[type] = index + 1 +00203 +00204 def startMappedObject(attrs): +00205 global currentPdoIndex +00206 global currentMaxObjects +00207 global currentNbMappedObjects +00208 global currentBitsMapped +00209 +00210 index = currentPdoIndex +00211 mapping_index = index + 0x200 +00212 +00213 indexObject = eval(attrs["index"]) +00214 subIndexObject = eval(attrs["sub_index"]) +00215 sizeInBitsObject = eval(attrs["size_in_bits"]) +00216 +00217 if currentMaxObjects == 0: +00218 raise ValueError, """!!! Abort because of a bogue for mapped object (defined at index 0x%04X, subIndex 0x%025X) +00219 in PDO. index : 0x%04X is undefined."""%(indexObject,subindexObject,mapping_index) +00220 if currentNbMappedObjects >= currentMaxObjects: +00221 raise ValueError, """!!! Abort mapping object (defined at index 0x%04X, subIndex 0x%02X) +00222 in PDO index 0x%04X. max objects (%d) reached."""%(IndexObject,subIndexObject,mapping_index,pdo[mapping_index]["maxObjects"]) +00223 if currentBitsMapped + sizeInBitsObject > 64: +00224 raise ValueError, """!!! Abort mapping object (defined at index 0x%04X, subIndex 0x%02X) +00225 in PDO index 0x%04X. No room to put %d bits in the PDO."""%(IndexObject,subIndexObject,mapping_index,sizeInBitsObject) +00226 +00227 value = eval("0x%04X%02X%02X"%(indexObject,subIndexObject,sizeInBitsObject)) +00228 Node.SetEntry(mapping_index, currentNbMappedObjects + 1, value) +00229 +00230 currentNbMappedObjects += 1 +00231 currentBitsMapped += sizeInBitsObject +00232 +00233 #------------------------------------------------------------------------------- +00234 # Creation of mapped variable and table +00235 #------------------------------------------------------------------------------- +00236 +00237 def startMappedVariable(attrs): +00238 name = attrs["name"] +00239 index = eval(attrs["index"]) +00240 subIndex = eval(attrs["sub_index"]) +00241 +00242 if "size_in_bits" in attrs: +00243 size = eval(attrs["size_in_bits"]) # Numeric variable +00244 if "type" in attrs: +00245 type = attrs["type"] +00246 if (type == "UNS"): +00247 type = "UNSIGNED" +00248 else: # Default type +00249 type = "UNSIGNED" +00250 typename = "%s%d"%(type,size) +00251 +00252 type_index = Manager.GetTypeIndex(typename, False) +00253 if type_index == None: +00254 raise ValueError, """!!! ERROR : For variable "%s" at index 0x%04X, subindex 0x%02X : Unrecognized type : %s"""%(name,index,subIndex,typename) +00255 +00256 # Begin ValueRange support +00257 if "min_value" in attrs or "max_value" in attrs: +00258 if "min_value" in attrs and "max_value" in attrs: +00259 minValue = eval(attrs["min_value"]) +00260 maxValue = eval(attrs["max_value"]) +00261 if (minValue > maxValue): +00262 raise ValueError, """!!! ERROR : For variable "%s" at index 0x%04X, subindex 0x%02X : error in value-range : min > max"""%(name,index,subIndex) +00263 else: +00264 raise ValueError, """!!! ERROR : For variable "%s" at index 0x%04X, subindex 0x%02X : You have defined only a min or a max value. \nIf you define one, you must define both."""%(name,index,subIndex) +00265 +00266 type_index = findRangeType(type_index, minValue, maxValue) +00267 if type_index == None: +00268 raise ValueError, """!!! Sorry, too many different value range have been defined""" +00269 # End ValueRange support +00270 +00271 if "size_in_byte" in attrs: +00272 size = eval(attrs["size_in_byte"]) # String variable +00273 type_index = findStringType(Manager.GetTypeIndex("VISIBLE_STRING", False), size) +00274 if type_index == None: +00275 raise ValueError, """!!! Sorry, too many different string length have been defined""" +00276 +00277 if "access" in attrs: +00278 access = attrs["access"].lower() +00279 else: +00280 access = "rw" # default value +00281 +00282 if index < 0x2000 or index > 0xBFFF: +00283 raise ValueError, """!!! ERROR : For variable "%s" at index 0x%04X, subindex 0x%02X : Variable can't be defined using this index-subindex."""%(name,index,subIndex) +00284 +00285 if subIndex == 0: +00286 Node.AddMappingEntry(index, name = name, struct = 1) +00287 elif subIndex == 1: +00288 Node.AddMappingEntry(index, struct = 3) +00289 Node.AddMappingEntry(index, 0, values = {"name" : "Number of Entries", "type" : 0x02, "access" : "ro", "pdo" : False}) +00290 result = Node.AddMappingEntry(index, subIndex, values = {"name" : name, "type" : type_index, "access" : access, "pdo" : True}) +00291 +00292 if result: +00293 Node.AddEntry(index, subIndex, 0) +00294 else: +00295 raise ValueError, """!!! ERROR : For variable "%s" at index 0x%04X, subindex 0x%02X : Unable to map"""%(name,index,subIndex) +00296 +00297 def startMappedTable(attrs): +00298 name = attrs["name"] +00299 number_elements = eval(attrs["number_elements"]) +00300 index = eval(attrs["index"]) +00301 +00302 if "size_in_bits" in attrs: +00303 size = eval(attrs["size_in_bits"]) # Numeric variable +00304 if "type" in attrs: +00305 type = attrs["type"] +00306 if (type == "UNS"): +00307 type = "UNSIGNED" +00308 else: # Default type +00309 type = "UNSIGNED" +00310 typename = "%s%d"%(type,size) +00311 +00312 type_index = Manager.GetTypeIndex(typename, False) +00313 if type_index == None: +00314 raise ValueError, """!!! ERROR : For table \"%s\" at index 0x%04X : Unrecognized type : %s"""%(name,index,typename) +00315 +00316 # Begin ValueRange support +00317 if "min_value" in attrs or "max_value" in attrs: +00318 if "min_value" in attrs and "max_value" in attrs: +00319 minValue = eval(attrs["min_value"]) +00320 maxValue = eval(attrs["max_value"]) +00321 if (minValue > maxValue): +00322 raise ValueError, """!!! ERROR : For table \"%s\" at index 0x%04X : error in value-range : min > max"""%(name,index) +00323 else: +00324 raise ValueError, """!!! ERROR : For table \"%s\" at index 0x%04X : You have defined only a min or a max value. \nIf you define one, you must define both."""%(name,index) +00325 +00326 type_index = findRangeType(type_index, minValue, maxValue) +00327 if type_index == None: +00328 raise ValueError, """!!! Sorry, too many different value range have been defined""" +00329 # End ValueRange support +00330 +00331 if "size_in_byte" in attrs: +00332 size = eval(attrs["size_in_byte"]) # String variable +00333 type_index = findStringType(Manager.GetTypeIndex("VISIBLE_STRING", False), size) +00334 if type_index == None: +00335 raise ValueError, """!!! Sorry, too many different string length have been defined""" +00336 +00337 if "access" in attrs: +00338 access = attrs["access"].lower() +00339 else: +00340 access = "rw" # default value +00341 +00342 if index < 0x2000 or index > 0xBFFF: +00343 raise ValueError, """!!! ERROR : For table \"%s\" at index 0x%04X : Variable can't be defined using this index-subindex."""%(name,index) +00344 +00345 result = Node.AddMappingEntry(index, name = name, struct = 7) +00346 if not result: +00347 raise ValueError, """!!! ERROR : For table \"%s\" at index 0x%04X : Unable to map because a variable or a table is using this index"""%(name,index) +00348 Node.AddMappingEntry(index, 0, values = {"name" : "Number of Entries", "type" : 0x02, "access" : "ro", "pdo" : False}) +00349 Node.AddMappingEntry(index, 1, values = {"name" : name, "type" : type_index, "access" : access, "pdo" : True, "nbmax" : number_elements}) +00350 +00351 for subIndex in xrange(1,number_elements+1): +00352 Node.AddEntry(index, subIndex, 0) +00353 +00354 def findRangeType(type, minValue, maxValue): +00355 index = 0xA0 +00356 while index < 0x100 and Node.IsEntry(index): +00357 current_type = Node.GetEntry(index, 1) +00358 if current_type == type: +00359 current_minValue = Node.GetEntry(index, 2) +00360 current_maxValue = Node.GetEntry(index, 3) +00361 if current_minValue == minValue and current_maxValue == maxValue: +00362 return index +00363 index += 1 +00364 if index < 0x100: +00365 infos = Manager.GetEntryInfos(type, False) +00366 name = "%s[%d-%d]"%(infos["name"], minValue, maxValue) +00367 Node.AddMappingEntry(index, name = name, struct = 3, size = infos["size"], default = infos["default"]) +00368 Node.AddMappingEntry(index, 0, values = {"name" : "Number of Entries", "type" : 0x02, "access" : "ro", "pdo" : False}) +00369 Node.AddMappingEntry(index, 1, values = {"name" : "Type", "type" : 0x02, "access" : "ro", "pdo" : False}) +00370 Node.AddMappingEntry(index, 2, values = {"name" : "Minimum Value", "type" : type, "access" : "ro", "pdo" : False}) +00371 Node.AddMappingEntry(index, 3, values = {"name" : "Maximum Value", "type" : type, "access" : "ro", "pdo" : False}) +00372 Node.AddEntry(index, 1, type) +00373 Node.AddEntry(index, 2, minValue) +00374 Node.AddEntry(index, 3, maxValue) +00375 return index +00376 return None +00377 +00378 def findStringType(type, length): +00379 index = 0xA0 +00380 while index < 0x100 and Node.IsEntry(index): +00381 current_type = Node.GetEntry(index, 1) +00382 if current_type == type: +00383 current_length = Node.GetEntry(index, 2) +00384 if current_length == length: +00385 return index +00386 index += 1 +00387 if index < 0x100: +00388 infos = Manager.GetEntryInfos(type, False) +00389 name = "%s%d"%(Manager.GetTypeName(type), length) +00390 Node.AddMappingEntry(index, name = name, struct = 3, size = infos["size"], default = infos["default"]) +00391 Node.AddMappingEntry(index, 0, values = {"name" : "Number of Entries", "type" : 0x02, "access" : "ro", "pdo" : False}) +00392 Node.AddMappingEntry(index, 1, values = {"name" : "Type", "type" : 0x02, "access" : "ro", "pdo" : False}) +00393 Node.AddMappingEntry(index, 2, values = {"name" : "Length", "type" : 0x02, "access" : "ro", "pdo" : False}) +00394 Node.AddEntry(index, 1, type) +00395 Node.AddEntry(index, 2, length) +00396 return index +00397 return None +00398 +00399 #------------------------------------------------------------------------------- +00400 # Creation HeartBeat Producer & Consumers +00401 #------------------------------------------------------------------------------- +00402 +00403 def heartBeatProducer(): +00404 Node.AddEntry(0x1017, 0, 0) +00405 +00406 def startHeartBeatConsumers(attrs): +00407 nombre = eval(attrs["nombre"]) +00408 for i in xrange(nombre): +00409 Node.AddEntry(0x1016, i + 1, 0) +00410 +00411 #------------------------------------------------------------------------------- +00412 # Creation of SDO Server & Clients +00413 #------------------------------------------------------------------------------- +00414 +00415 def sdoServer(): +00416 Node.AddEntry(0x1200, 1, 0x600 + Node.GetNodeID()) +00417 Node.AddEntry(0x1200, 2, 0x580 + Node.GetNodeID()) +00418 +00419 def startSdoClients(attrs): +00420 nombre = eval(attrs["nombre"]) +00421 for i in xrange(nombre): +00422 Node.AddEntry(0x1280 + i, 1, 0x600) +00423 Node.AddEntry(0x1280 + i, 2, 0x580) +00424 Node.AddEntry(0x1280 + i, 3, 0) +00425 +00426 #------------------------------------------------------------------------------- +00427 # Parse file with Saxe +00428 #------------------------------------------------------------------------------- +00429 +00430 def ParseFile(filepath): +00431 xmlfile = open(filepath,"r") +00432 Parser = expat.ParserCreate() +00433 Parser.StartElementHandler = StartElement +00434 Parser.EndElementHandler = EndElement +00435 Parser.CharacterDataHandler = CharacterData +00436 ParserStatus = Parser.ParseFile(xmlfile) +00437 xmlfile.close() +00438 +00439 def GenerateNode(filepath, manager): +00440 global Node +00441 global Manager +00442 Manager = manager +00443 Node = node.Node() +00444 ParseFile(filepath) +00445 return Node +00446 +00447 #------------------------------------------------------------------------------- +00448 # Main Function +00449 #------------------------------------------------------------------------------- +00450 +00451 if __name__ == '__main__': +00452 ParseFile("test.xml") +00453 +