etisserant@0: #!/usr/bin/env python etisserant@0: # -*- coding: utf-8 -*- etisserant@0: etisserant@0: #This file is part of CanFestival, a library implementing CanOpen Stack. etisserant@0: # etisserant@0: #Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD etisserant@0: # etisserant@0: #See COPYING file for copyrights details. etisserant@0: # etisserant@0: #This library is free software; you can redistribute it and/or etisserant@0: #modify it under the terms of the GNU Lesser General Public etisserant@0: #License as published by the Free Software Foundation; either etisserant@0: #version 2.1 of the License, or (at your option) any later version. etisserant@0: # etisserant@0: #This library is distributed in the hope that it will be useful, etisserant@0: #but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@0: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU etisserant@0: #Lesser General Public License for more details. etisserant@0: # etisserant@0: #You should have received a copy of the GNU Lesser General Public etisserant@0: #License along with this library; if not, write to the Free Software etisserant@0: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@0: etisserant@0: import cPickle etisserant@0: from types import * lbessard@205: import re etisserant@0: etisserant@0: """ etisserant@0: Dictionary of translation between access symbol and their signification etisserant@0: """ etisserant@0: AccessType = {"ro" : "Read Only", "wo" : "Write Only", "rw" : "Read/Write"} etisserant@0: etisserant@0: BoolType = {True : "True", False : "False"} etisserant@0: OptionType = {True : "Yes", False : "No"} etisserant@0: etisserant@0: CustomisableTypes = [(0x02, 0), (0x03, 0), (0x04, 0), (0x05, 0), (0x06, 0), (0x07, 0), etisserant@0: (0x08, 0), (0x09, 1), (0x0A, 1), (0x0B, 1), (0x10, 0), (0x11, 0), (0x12, 0), etisserant@0: (0x13, 0), (0x14, 0), (0x15, 0), (0x16, 0), (0x18, 0), (0x19, 0), (0x1A, 0), etisserant@0: (0x1B, 0)] etisserant@0: etisserant@0: DefaultParams = {"comment" : "", "save" : False} etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Dictionary Mapping and Organisation etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: """ etisserant@0: Properties of entry structure in the Object Dictionary etisserant@0: """ etisserant@0: OD_Subindex = 1 # Entry has at least one subindex etisserant@0: OD_MultipleSubindexes = 2 # Entry has more than one subindex etisserant@0: OD_IdenticalSubindexes = 4 # Subindexes of entry have the same description etisserant@0: OD_IdenticalIndexes = 8 # Entry has the same description on multiple indexes etisserant@0: etisserant@0: """ etisserant@0: Structures of entry in the Object Dictionary, sum of the properties described above etisserant@0: for all sorts of entries use in CAN Open specification etisserant@0: """ etisserant@0: nosub = 0 # Entry without subindex (only for type declaration) etisserant@260: var = OD_Subindex etisserant@260: array = OD_Subindex | OD_MultipleSubindexes etisserant@260: rec = OD_Subindex | OD_MultipleSubindexes | OD_IdenticalSubindexes etisserant@0: # Entries identical on multiple indexes etisserant@260: plurivar = OD_Subindex | OD_IdenticalIndexes etisserant@260: pluriarray = OD_Subindex | OD_MultipleSubindexes | OD_IdenticalIndexes # Example : PDO Parameters etisserant@260: plurirec = OD_Subindex | OD_MultipleSubindexes | OD_IdenticalSubindexes |OD_IdenticalIndexes # Example : PDO Mapping etisserant@0: etisserant@0: """ etisserant@0: MappingDictionary is the structure used for writing a good organised Object etisserant@0: Dictionary. It follows the specifications of the CANOpen standard. etisserant@0: Change the informations within it if there is a mistake. But don't modify the etisserant@0: organisation of this object, it will involve in a malfunction of the application. etisserant@0: """ etisserant@0: etisserant@0: MappingDictionary = { etisserant@0: 0x0001 : {"name" : "BOOLEAN", "struct" : nosub, "size" : 1, "default" : False, "values" : []}, etisserant@0: 0x0002 : {"name" : "INTEGER8", "struct" : nosub, "size" : 8, "default" : 0, "values" : []}, etisserant@0: 0x0003 : {"name" : "INTEGER16", "struct" : nosub, "size" : 16, "default" : 0, "values" : []}, etisserant@0: 0x0004 : {"name" : "INTEGER32", "struct" : nosub, "size" : 32, "default" : 0, "values" : []}, etisserant@0: 0x0005 : {"name" : "UNSIGNED8", "struct" : nosub, "size" : 8, "default" : 0, "values" : []}, etisserant@0: 0x0006 : {"name" : "UNSIGNED16", "struct" : nosub, "size" : 16, "default" : 0, "values" : []}, etisserant@0: 0x0007 : {"name" : "UNSIGNED32", "struct" : nosub, "size" : 32, "default" : 0, "values" : []}, etisserant@0: 0x0008 : {"name" : "REAL32", "struct" : nosub, "size" : 32, "default" : 0.0, "values" : []}, etisserant@0: 0x0009 : {"name" : "VISIBLE_STRING", "struct" : nosub, "size" : 8, "default" : "", "values" : []}, etisserant@0: 0x000A : {"name" : "OCTET_STRING", "struct" : nosub, "size" : 8, "default" : "", "values" : []}, etisserant@0: 0x000B : {"name" : "UNICODE_STRING", "struct" : nosub, "size" : 16, "default" : "", "values" : []}, lbessard@67: # 0x000C : {"name" : "TIME_OF_DAY", "struct" : nosub, "size" : 48, "default" : 0, "values" : []}, lbessard@67: # 0x000D : {"name" : "TIME_DIFFERENCE", "struct" : nosub, "size" : 48, "default" : 0, "values" : []}, greg@176: 0x000F : {"name" : "DOMAIN", "struct" : nosub, "size" : 0, "default" : "", "values" : []}, etisserant@0: 0x0010 : {"name" : "INTEGER24", "struct" : nosub, "size" : 24, "default" : 0, "values" : []}, etisserant@0: 0x0011 : {"name" : "REAL64", "struct" : nosub, "size" : 64, "default" : 0.0, "values" : []}, etisserant@0: 0x0012 : {"name" : "INTEGER40", "struct" : nosub, "size" : 40, "default" : 0, "values" : []}, etisserant@0: 0x0013 : {"name" : "INTEGER48", "struct" : nosub, "size" : 48, "default" : 0, "values" : []}, etisserant@0: 0x0014 : {"name" : "INTEGER56", "struct" : nosub, "size" : 56, "default" : 0, "values" : []}, etisserant@0: 0x0015 : {"name" : "INTEGER64", "struct" : nosub, "size" : 64, "default" : 0, "values" : []}, etisserant@0: 0x0016 : {"name" : "UNSIGNED24", "struct" : nosub, "size" : 24, "default" : 0, "values" : []}, etisserant@0: 0x0018 : {"name" : "UNSIGNED40", "struct" : nosub, "size" : 40, "default" : 0, "values" : []}, etisserant@0: 0x0019 : {"name" : "UNSIGNED48", "struct" : nosub, "size" : 48, "default" : 0, "values" : []}, etisserant@0: 0x001A : {"name" : "UNSIGNED56", "struct" : nosub, "size" : 56, "default" : 0, "values" : []}, etisserant@0: 0x001B : {"name" : "UNSIGNED64", "struct" : nosub, "size" : 64, "default" : 0, "values" : []}, etisserant@0: 0x1000 : {"name" : "Device Type", "struct" : var, "need" : True, "values" : lbessard@182: [{"name" : "Device Type", "type" : 0x07, "access" : 'ro', "pdo" : False}]}, etisserant@0: 0x1001 : {"name" : "Error Register", "struct" : var, "need" : True, "values" : lbessard@182: [{"name" : "Error Register", "type" : 0x05, "access": 'ro', "pdo" : True}]}, etisserant@0: 0x1002 : {"name" : "Manufacturer Status Register", "struct" : var, "need" : False, "values" : lbessard@182: [{"name" : "Manufacturer Status Register", "type" : 0x07, "access" : 'ro', "pdo" : True}]}, luis@284: 0x1003 : {"name" : "Pre-defined Error Field", "struct" : rec, "need" : False, "callback" : True, "values" : lbessard@182: [{"name" : "Number of Errors", "type" : 0x05, "access" : 'rw', "pdo" : False}, Laurent@783: {"name" : "Standard Error Field", "type" : 0x07, "access" : 'ro', "pdo" : False, "nbmin" : 1, "nbmax" : 0xFE}]}, lbessard@258: 0x1005 : {"name" : "SYNC COB ID", "struct" : var, "need" : False, "callback" : True, "values" : lbessard@182: [{"name" : "SYNC COB ID", "type" : 0x07, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1006 : {"name" : "Communication / Cycle Period", "struct" : var, "need" : False, "callback" : True, "values" : lbessard@182: [{"name" : "Communication Cycle Period", "type" : 0x07, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1007 : {"name" : "Synchronous Window Length", "struct" : var, "need" : False, "values" : lbessard@182: [{"name" : "Synchronous Window Length", "type" : 0x07, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1008 : {"name" : "Manufacturer Device Name", "struct" : var, "need" : False, "values" : etisserant@0: [{"name" : "Manufacturer Device Name", "type" : 0x09, "access" : 'ro', "pdo" : False}]}, etisserant@0: 0x1009 : {"name" : "Manufacturer Hardware Version", "struct" : var, "need" : False, "values" : etisserant@0: [{"name" : "Manufacturer Hardware Version", "type" : 0x09, "access" : 'ro', "pdo" : False}]}, etisserant@0: 0x100A : {"name" : "Manufacturer Software Version", "struct" : var, "need" : False, "values" : frdupin@62: [{"name" : "Manufacturer Software Version", "type" : 0x09, "access" : 'ro', "pdo" : False}]}, etisserant@0: 0x100C : {"name" : "Guard Time", "struct" : var, "need" : False, "values" : lbessard@182: [{"name" : "Guard Time", "type" : 0x06, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x100D : {"name" : "Life Time Factor", "struct" : var, "need" : False, "values" : lbessard@182: [{"name" : "Life Time Factor", "type" : 0x05, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1010 : {"name" : "Store parameters", "struct" : array, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Save All Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Save Communication Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Save Application Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False}, lbessard@510: {"name" : "Save Manufacturer Parameters %d[(sub - 3)]", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmax" : 0x7C}]}, etisserant@0: 0x1011 : {"name" : "Restore Default Parameters", "struct" : array, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Restore All Default Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Restore Communication Default Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Restore Application Default Parameters", "type" : 0x07, "access" : 'rw', "pdo" : False}, lbessard@510: {"name" : "Restore Manufacturer Defined Default Parameters %d[(sub - 3)]", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmax" : 0x7C}]}, etisserant@0: 0x1012 : {"name" : "TIME COB ID", "struct" : var, "need" : False, "values" : lbessard@182: [{"name" : "TIME COB ID", "type" : 0x07, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1013 : {"name" : "High Resolution Timestamp", "struct" : var, "need" : False, "values" : lbessard@182: [{"name" : "High Resolution Time Stamp", "type" : 0x07, "access" : 'rw', "pdo" : True}]}, etisserant@0: 0x1014 : {"name" : "Emergency COB ID", "struct" : var, "need" : False, "values" : lbessard@313: [{"name" : "Emergency COB ID", "type" : 0x07, "access" : 'rw', "pdo" : False, "default" : "\"$NODEID+0x80\""}]}, etisserant@0: 0x1015 : {"name" : "Inhibit Time Emergency", "struct" : var, "need" : False, "values" : lbessard@182: [{"name" : "Inhibit Time Emergency", "type" : 0x06, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1016 : {"name" : "Consumer Heartbeat Time", "struct" : rec, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@299: {"name" : "Consumer Heartbeat Time", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmin" : 1, "nbmax" : 0x7F}]}, greg@177: 0x1017 : {"name" : "Producer Heartbeat Time", "struct" : var, "need" : False, "callback" : True, "values" : lbessard@182: [{"name" : "Producer Heartbeat Time", "type" : 0x06, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1018 : {"name" : "Identity", "struct" : array, "need" : True, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Vendor ID", "type" : 0x07, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Product Code", "type" : 0x07, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Revision Number", "type" : 0x07, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Serial Number", "type" : 0x07, "access" : 'ro', "pdo" : False}]}, Laurent@783: 0x1019 : {"name" : "Synchronous counter overflow value", "struct" : var, "need" : False, "values" : Laurent@783: [{"name" : "Synchronous counter overflow value", "type" : 0x05, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1020 : {"name" : "Verify Configuration", "struct" : array, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, Laurent@783: {"name" : "Configuration Date", "type" : 0x07, "access" : 'rw', "pdo" : False}, Laurent@783: {"name" : "Configuration Time", "type" : 0x07, "access" : 'rw', "pdo" : False}]}, lbessard@59: # 0x1021 : {"name" : "Store EDS", "struct" : var, "need" : False, "values" : lbessard@59: # [{"name" : "Store EDS", "type" : 0x0F, "access" : 'rw', "pdo" : False}]}, lbessard@59: # 0x1022 : {"name" : "Storage Format", "struct" : var, "need" : False, "values" : lbessard@182: # [{"name" : "Storage Format", "type" : 0x06, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1023 : {"name" : "OS Command", "struct" : array, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, etisserant@0: {"name" : "Command", "type" : 0x0A, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Status", "type" : 0x05, "access" : 'ro', "pdo" : False}, etisserant@0: {"name" : "Reply", "type" : 0x0A, "access" : 'ro', "pdo" : False}]}, etisserant@0: 0x1024 : {"name" : "OS Command Mode", "struct" : var, "need" : False, "values" : lbessard@182: [{"name" : "OS Command Mode", "type" : 0x05, "access" : 'wo', "pdo" : False}]}, etisserant@0: 0x1025 : {"name" : "OS Debugger Interface", "struct" : array, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Command", "type" : 0x0A, "access" : 'rw', "pdo" : False}, Laurent@783: {"name" : "Status", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Reply", "type" : 0x0A, "access" : 'ro', "pdo" : False}]}, etisserant@0: 0x1026 : {"name" : "OS Prompt", "struct" : array, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "StdIn", "type" : 0x05, "access" : 'wo', "pdo" : True}, lbessard@182: {"name" : "StdOut", "type" : 0x05, "access" : 'ro', "pdo" : True}, lbessard@182: {"name" : "StdErr", "type" : 0x05, "access" : 'ro', "pdo" : True}]}, etisserant@0: 0x1027 : {"name" : "Module List", "struct" : rec, "need" : False, "values" : lbessard@182: [{"name" : "Number of Connected Modules", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@299: {"name" : "Module %d[(sub)]", "type" : 0x06, "access" : 'ro', "pdo" : False, "nbmin" : 1, "nbmax" : 0xFE}]}, etisserant@0: 0x1028 : {"name" : "Emergency Consumer", "struct" : rec, "need" : False, "values" : lbessard@182: [{"name" : "Number of Consumed Emergency Objects", "type" : 0x05, "access" : 'ro', "pdo" : False}, Laurent@783: {"name" : "Emergency Consumer", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmin" : 1, "nbmax" : 0x7F}]}, etisserant@0: 0x1029 : {"name" : "Error Behavior", "struct" : array, "need" : False, "values" : lbessard@182: [{"name" : "Number of Error Classes", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Communication Error", "type" : 0x05, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Device Profile", "type" : 0x05, "access" : 'rw', "pdo" : False, "nbmax" : 0xFE}]}, etisserant@0: 0x1200 : {"name" : "Server SDO Parameter", "struct" : array, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@299: {"name" : "COB ID Client to Server (Receive SDO)", "type" : 0x07, "access" : 'ro', "pdo" : False, "default" : "\"$NODEID+0x600\""}, lbessard@299: {"name" : "COB ID Server to Client (Transmit SDO)", "type" : 0x07, "access" : 'ro', "pdo" : False, "default" : "\"$NODEID+0x580\""}]}, etisserant@0: 0x1201 : {"name" : "Additional Server SDO %d Parameter[(idx)]", "struct" : pluriarray, "incr" : 1, "nbmax" : 0x7F, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "COB ID Client to Server (Receive SDO)", "type" : 0x07, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "COB ID Server to Client (Transmit SDO)", "type" : 0x07, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "Node ID of the SDO Client", "type" : 0x05, "access" : 'ro', "pdo" : False}]}, etisserant@0: 0x1280 : {"name" : "Client SDO %d Parameter[(idx)]", "struct" : pluriarray, "incr" : 1, "nbmax" : 0x100, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@182: {"name" : "COB ID Client to Server (Transmit SDO)", "type" : 0x07, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "COB ID Server to Client (Receive SDO)", "type" : 0x07, "access" : 'rw', "pdo" : False}, lbessard@273: {"name" : "Node ID of the SDO Server", "type" : 0x05, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1400 : {"name" : "Receive PDO %d Parameter[(idx)]", "struct" : pluriarray, "incr" : 1, "nbmax" : 0x200, "need" : False, "values" : lbessard@182: [{"name" : "Highest SubIndex Supported", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@317: {"name" : "COB ID used by PDO", "type" : 0x07, "access" : 'rw', "pdo" : False, "default" : "{True:\"$NODEID+0x%X00\"%(base+2),False:0x80000000}[base<4]"}, lbessard@182: {"name" : "Transmission Type", "type" : 0x05, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Inhibit Time", "type" : 0x06, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Compatibility Entry", "type" : 0x05, "access" : 'rw', "pdo" : False}, Laurent@783: {"name" : "Event Timer", "type" : 0x06, "access" : 'rw', "pdo" : False}, Laurent@783: {"name" : "SYNC start value", "type" : 0x05, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1600 : {"name" : "Receive PDO %d Mapping[(idx)]", "struct" : plurirec, "incr" : 1, "nbmax" : 0x200, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'rw', "pdo" : False}, lbessard@299: {"name" : "PDO %d Mapping for an application object %d[(idx,sub)]", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmin" : 0, "nbmax" : 0x40}]}, etisserant@236: 0x1800 : {"name" : "Transmit PDO %d Parameter[(idx)]", "struct" : pluriarray, "incr" : 1, "nbmax" : 0x200, "need" : False, "callback" : True, "values" : lbessard@182: [{"name" : "Highest SubIndex Supported", "type" : 0x05, "access" : 'ro', "pdo" : False}, lbessard@317: {"name" : "COB ID used by PDO", "type" : 0x07, "access" : 'rw', "pdo" : False, "default" : "{True:\"$NODEID+0x%X80\"%(base+1),False:0x80000000}[base<4]"}, lbessard@182: {"name" : "Transmission Type", "type" : 0x05, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Inhibit Time", "type" : 0x06, "access" : 'rw', "pdo" : False}, lbessard@182: {"name" : "Compatibility Entry", "type" : 0x05, "access" : 'rw', "pdo" : False}, Laurent@783: {"name" : "Event Timer", "type" : 0x06, "access" : 'rw', "pdo" : False}, Laurent@783: {"name" : "SYNC start value", "type" : 0x05, "access" : 'rw', "pdo" : False}]}, etisserant@0: 0x1A00 : {"name" : "Transmit PDO %d Mapping[(idx)]", "struct" : plurirec, "incr" : 1, "nbmax" : 0x200, "need" : False, "values" : lbessard@182: [{"name" : "Number of Entries", "type" : 0x05, "access" : 'rw', "pdo" : False}, lbessard@299: {"name" : "PDO %d Mapping for a process data variable %d[(idx,sub)]", "type" : 0x07, "access" : 'rw', "pdo" : False, "nbmin" : 0, "nbmax" : 0x40}]}, etisserant@0: } etisserant@0: etisserant@0: #------------------------------------------------------------------------------- lbessard@205: # Search in a Mapping Dictionary lbessard@205: #------------------------------------------------------------------------------- lbessard@205: lbessard@205: """ lbessard@205: Return the index of the typename given by searching in mappingdictionary lbessard@205: """ lbessard@205: def FindTypeIndex(typename, mappingdictionary): lbessard@205: testdic = {} lbessard@205: for index, values in mappingdictionary.iteritems(): lbessard@205: if index < 0x1000: lbessard@205: testdic[values["name"]] = index lbessard@205: if typename in testdic: lbessard@205: return testdic[typename] lbessard@205: return None lbessard@205: lbessard@205: """ lbessard@205: Return the name of the type by searching in mappingdictionary lbessard@205: """ lbessard@205: def FindTypeName(typeindex, mappingdictionary): lbessard@205: if typeindex < 0x1000 and typeindex in mappingdictionary: lbessard@205: return mappingdictionary[typeindex]["name"] lbessard@205: return None lbessard@205: lbessard@205: """ lbessard@205: Return the default value of the type by searching in mappingdictionary lbessard@205: """ lbessard@205: def FindTypeDefaultValue(typeindex, mappingdictionary): lbessard@205: if typeindex < 0x1000 and typeindex in mappingdictionary: lbessard@205: return mappingdictionary[typeindex]["default"] lbessard@205: return None lbessard@205: lbessard@205: """ lbessard@205: Return the list of types defined in mappingdictionary lbessard@205: """ lbessard@205: def FindTypeList(mappingdictionary): lbessard@205: list = [] lbessard@205: for index in mappingdictionary.keys(): lbessard@205: if index < 0x1000: lbessard@205: list.append(mappingdictionary[index]["name"]) lbessard@205: return list lbessard@205: lbessard@205: """ lbessard@205: Return the name of an entry by searching in mappingdictionary lbessard@205: """ laurent@584: def FindEntryName(index, mappingdictionary, compute=True): lbessard@205: base_index = FindIndex(index, mappingdictionary) lbessard@205: if base_index: lbessard@205: infos = mappingdictionary[base_index] laurent@584: if infos["struct"] & OD_IdenticalIndexes and compute: lbessard@205: return StringFormat(infos["name"], (index - base_index) / infos["incr"] + 1, 0) lbessard@205: else: lbessard@205: return infos["name"] lbessard@205: return None lbessard@205: lbessard@205: """ lbessard@205: Return the informations of one entry by searching in mappingdictionary lbessard@205: """ laurent@584: def FindEntryInfos(index, mappingdictionary, compute=True): lbessard@205: base_index = FindIndex(index, mappingdictionary) lbessard@205: if base_index: lbessard@205: copy = mappingdictionary[base_index].copy() laurent@584: if copy["struct"] & OD_IdenticalIndexes and compute: lbessard@205: copy["name"] = StringFormat(copy["name"], (index - base_index) / copy["incr"] + 1, 0) lbessard@205: copy.pop("values") lbessard@205: return copy lbessard@205: return None lbessard@205: lbessard@205: """ lbessard@205: Return the informations of one subentry of an entry by searching in mappingdictionary lbessard@205: """ laurent@584: def FindSubentryInfos(index, subIndex, mappingdictionary, compute=True): lbessard@205: base_index = FindIndex(index, mappingdictionary) lbessard@205: if base_index: lbessard@205: struct = mappingdictionary[base_index]["struct"] lbessard@510: if struct & OD_IdenticalIndexes: lbessard@510: incr = mappingdictionary[base_index]["incr"] lbessard@510: else: lbessard@510: incr = 1 lbessard@205: if struct & OD_Subindex: lbessard@510: infos = None lbessard@205: if struct & OD_IdenticalSubindexes: lbessard@205: if subIndex == 0: lbessard@510: infos = mappingdictionary[base_index]["values"][0].copy() lbessard@205: elif 0 < subIndex <= mappingdictionary[base_index]["values"][1]["nbmax"]: lbessard@510: infos = mappingdictionary[base_index]["values"][1].copy() lbessard@510: elif struct & OD_MultipleSubindexes: lbessard@510: idx = 0 lbessard@510: for subindex_infos in mappingdictionary[base_index]["values"]: lbessard@510: if "nbmax" in subindex_infos: lbessard@510: if idx <= subIndex < idx + subindex_infos["nbmax"]: lbessard@510: infos = subindex_infos.copy() lbessard@510: break; lbessard@510: idx += subindex_infos["nbmax"] lbessard@510: else: lbessard@510: if subIndex == idx: lbessard@510: infos = subindex_infos.copy() lbessard@510: break; lbessard@510: idx += 1 lbessard@205: elif subIndex == 0: lbessard@510: infos = mappingdictionary[base_index]["values"][0].copy() laurent@584: if infos is not None and compute: lbessard@510: infos["name"] = StringFormat(infos["name"], (index - base_index) / incr + 1, subIndex) lbessard@510: return infos lbessard@205: return None lbessard@205: lbessard@205: """ lbessard@205: Return the list of variables that can be mapped defined in mappingdictionary lbessard@205: """ laurent@584: def FindMapVariableList(mappingdictionary, Node, compute=True): lbessard@205: list = [] lbessard@205: for index in mappingdictionary.iterkeys(): lbessard@205: if Node.IsEntry(index): lbessard@205: for subIndex, values in enumerate(mappingdictionary[index]["values"]): lbessard@205: if mappingdictionary[index]["values"][subIndex]["pdo"]: lbessard@205: infos = Node.GetEntryInfos(mappingdictionary[index]["values"][subIndex]["type"]) laurent@584: name = mappingdictionary[index]["values"][subIndex]["name"] lbessard@205: if mappingdictionary[index]["struct"] & OD_IdenticalSubindexes: lbessard@205: values = Node.GetEntry(index) lbessard@205: for i in xrange(len(values) - 1): laurent@584: computed_name = name laurent@584: if compute: laurent@584: computed_name = StringFormat(computed_name, 1, i + 1) laurent@584: list.append((index, i + 1, infos["size"], computed_name)) lbessard@205: else: laurent@584: computed_name = name laurent@584: if compute: laurent@584: computed_name = StringFormat(computed_name, 1, subIndex) laurent@584: list.append((index, subIndex, infos["size"], computed_name)) lbessard@205: return list lbessard@205: lbessard@205: """ lbessard@205: Return the list of mandatory indexes defined in mappingdictionary lbessard@205: """ lbessard@205: def FindMandatoryIndexes(mappingdictionary): lbessard@205: list = [] lbessard@205: for index in mappingdictionary.iterkeys(): lbessard@205: if index >= 0x1000 and mappingdictionary[index]["need"]: lbessard@205: list.append(index) lbessard@205: return list lbessard@205: lbessard@205: """ lbessard@205: Return the index of the informations in the Object Dictionary in case of identical lbessard@205: indexes lbessard@205: """ lbessard@205: def FindIndex(index, mappingdictionary): lbessard@205: if index in mappingdictionary: lbessard@205: return index lbessard@205: else: lbessard@205: listpluri = [idx for idx in mappingdictionary.keys() if mappingdictionary[idx]["struct"] & OD_IdenticalIndexes] lbessard@205: listpluri.sort() lbessard@205: for idx in listpluri: lbessard@205: nb_max = mappingdictionary[idx]["nbmax"] lbessard@205: incr = mappingdictionary[idx]["incr"] lbessard@205: if idx < index < idx + incr * nb_max and (index - idx)%incr == 0: lbessard@205: return idx lbessard@205: return None lbessard@205: lbessard@205: #------------------------------------------------------------------------------- lbessard@205: # Formating Name of an Entry lbessard@205: #------------------------------------------------------------------------------- lbessard@205: lbessard@205: name_model = re.compile('(.*)\[(.*)\]') lbessard@205: lbessard@205: """ lbessard@205: Format the text given with the index and subindex defined lbessard@205: """ lbessard@205: def StringFormat(text, idx, sub): lbessard@205: result = name_model.match(text) lbessard@205: if result: lbessard@205: format = result.groups() lbessard@205: return format[0]%eval(format[1]) lbessard@205: else: lbessard@205: return text lbessard@205: lbessard@205: #------------------------------------------------------------------------------- etisserant@0: # Definition of Node Object etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: """ etisserant@0: Class recording the Object Dictionary entries. It checks at each modification etisserant@0: that the structure of the Object Dictionary stay coherent etisserant@0: """ etisserant@0: etisserant@0: class Node: etisserant@0: lbessard@418: DefaultStringSize = 10 lbessard@418: lbessard@182: def __init__(self, name = "", type = "slave", id = 0, description = "", profilename = "DS-301", profile = {}, specificmenu = []): etisserant@0: self.Name = name etisserant@0: self.Type = type etisserant@0: self.ID = id lbessard@182: self.Description = description etisserant@0: self.ProfileName = profilename etisserant@0: self.Profile = profile etisserant@0: self.SpecificMenu = specificmenu etisserant@0: self.Dictionary = {} etisserant@0: self.ParamsDictionary = {} etisserant@0: self.DS302 = {} etisserant@0: self.UserMapping = {} etisserant@0: etisserant@0: """ etisserant@0: Return the node name etisserant@0: """ etisserant@0: def GetNodeName(self): etisserant@0: return self.Name etisserant@0: etisserant@0: """ etisserant@0: Define the node name etisserant@0: """ etisserant@0: def SetNodeName(self, name): etisserant@0: self.Name = name etisserant@0: etisserant@0: """ etisserant@0: Return the node type ("master" or "slave") etisserant@0: """ etisserant@0: def GetNodeType(self): etisserant@0: return self.Type etisserant@0: etisserant@0: """ etisserant@0: Define the node type ("master" or "slave") etisserant@0: """ etisserant@0: def SetNodeType(self, type): etisserant@0: self.Type = type etisserant@0: etisserant@0: """ etisserant@0: Return the node ID etisserant@0: """ etisserant@0: def GetNodeID(self): etisserant@0: return self.ID etisserant@0: etisserant@0: """ etisserant@0: Define the node ID etisserant@0: """ etisserant@0: def SetNodeID(self, id): etisserant@0: self.ID = id etisserant@0: etisserant@0: """ lbessard@182: Return the node description lbessard@182: """ lbessard@182: def GetNodeDescription(self): lbessard@182: if getattr(self, "Description", False): lbessard@182: return self.Description lbessard@182: else: lbessard@182: return "" lbessard@182: lbessard@182: """ lbessard@182: Define the node description lbessard@182: """ lbessard@182: def SetNodeDescription(self, description): lbessard@182: self.Description = description lbessard@182: lbessard@182: """ etisserant@0: Return the Specific Profile Name etisserant@0: """ etisserant@0: def GetProfileName(self): etisserant@0: return self.ProfileName etisserant@0: etisserant@0: """ etisserant@0: Define the Specific Profile Name etisserant@0: """ etisserant@0: def SetProfileName(self, profilename): etisserant@0: self.ProfileName = profilename etisserant@0: etisserant@0: """ etisserant@0: Return the Specific Profile etisserant@0: """ etisserant@0: def GetProfile(self): etisserant@0: return self.Profile etisserant@0: etisserant@0: """ etisserant@0: Define the Specific Profile etisserant@0: """ etisserant@0: def SetProfile(self, profile): etisserant@0: self.Profile = profile etisserant@0: etisserant@0: """ lbessard@418: Return the default string size lbessard@418: """ lbessard@418: def GetDefaultStringSize(self): lbessard@418: return self.DefaultStringSize lbessard@418: lbessard@418: """ lbessard@418: Define the default string size lbessard@418: """ lbessard@418: def SetDefaultStringSize(self, size): lbessard@418: self.DefaultStringSize = size lbessard@418: lbessard@418: """ etisserant@0: Define the DS-302 Profile etisserant@0: """ etisserant@0: def SetDS302Profile(self, profile): etisserant@0: self.DS302 = profile etisserant@0: etisserant@0: """ etisserant@0: Define the DS-302 Profile etisserant@0: """ etisserant@0: def GetDS302Profile(self): etisserant@0: return self.DS302 etisserant@0: etisserant@0: """ etisserant@0: Return the Specific Menu Entries etisserant@0: """ etisserant@0: def GetSpecificMenu(self): etisserant@0: return self.SpecificMenu etisserant@0: etisserant@0: """ etisserant@0: Define the Specific Menu Entries etisserant@0: """ etisserant@0: def SetSpecificMenu(self, specificmenu): etisserant@0: self.SpecificMenu = specificmenu etisserant@0: etisserant@0: """ etisserant@0: Extend the Specific Menu Entries etisserant@0: """ etisserant@0: etisserant@0: def ExtendSpecificMenu(self, specificmenu): greg@176: self.SpecificMenu.extend(specificmenu) etisserant@0: etisserant@0: """ etisserant@0: Function which return the different Mappings available for this node etisserant@0: """ etisserant@0: def GetMappings(self, userdefinedtoo = True): etisserant@0: if userdefinedtoo: etisserant@0: return [self.Profile, self.DS302, self.UserMapping] etisserant@0: else: etisserant@0: return [self.Profile, self.DS302] etisserant@0: etisserant@0: """ etisserant@0: Add a new entry in the Object Dictionary etisserant@0: """ etisserant@0: def AddEntry(self, index, subIndex = None, value = None): etisserant@0: if index not in self.Dictionary: etisserant@0: if not subIndex: etisserant@0: self.Dictionary[index] = value etisserant@0: return True etisserant@0: elif subIndex == 1: etisserant@0: self.Dictionary[index] = [value] etisserant@0: return True lbessard@299: elif subIndex > 0 and type(self.Dictionary[index]) == ListType and subIndex == len(self.Dictionary[index]) + 1: etisserant@0: self.Dictionary[index].append(value) etisserant@0: return True etisserant@0: return False etisserant@0: etisserant@0: """ etisserant@0: Warning ! Modifies an existing entry in the Object Dictionary. Can't add a new one. etisserant@0: """ etisserant@0: def SetEntry(self, index, subIndex = None, value = None): etisserant@0: if index in self.Dictionary: etisserant@0: if not subIndex: etisserant@0: if value != None: etisserant@0: self.Dictionary[index] = value etisserant@0: return True etisserant@0: elif type(self.Dictionary[index]) == ListType and 0 < subIndex <= len(self.Dictionary[index]): etisserant@0: if value != None: etisserant@0: self.Dictionary[index][subIndex - 1] = value etisserant@0: return True etisserant@0: return False etisserant@0: etisserant@0: def SetParamsEntry(self, index, subIndex = None, comment = None, save = None, callback = None): etisserant@0: if not getattr(self, "ParamsDictionary", False): etisserant@0: self.ParamsDictionary = {} etisserant@0: if index in self.Dictionary: etisserant@0: if (comment != None or save != None or callback != None) and index not in self.ParamsDictionary: etisserant@0: self.ParamsDictionary[index] = {} etisserant@0: if subIndex == None or type(self.Dictionary[index]) != ListType and subIndex == 0: etisserant@0: if comment != None: etisserant@0: self.ParamsDictionary[index]["comment"] = comment etisserant@0: if save != None: etisserant@0: self.ParamsDictionary[index]["save"] = save etisserant@0: if callback != None: etisserant@0: self.ParamsDictionary[index]["callback"] = callback etisserant@0: return True etisserant@0: elif type(self.Dictionary[index]) == ListType and 0 <= subIndex <= len(self.Dictionary[index]): etisserant@0: if (comment != None or save != None or callback != None) and subIndex not in self.ParamsDictionary[index]: etisserant@0: self.ParamsDictionary[index][subIndex] = {} etisserant@0: if comment != None: etisserant@0: self.ParamsDictionary[index][subIndex]["comment"] = comment etisserant@0: if save != None: etisserant@0: self.ParamsDictionary[index][subIndex]["save"] = save etisserant@0: return True etisserant@0: return False etisserant@0: etisserant@0: """ etisserant@0: Removes an existing entry in the Object Dictionary. If a subIndex is specified etisserant@0: it will remove this subIndex only if it's the last of the index. If no subIndex etisserant@0: is specified it removes the whole index and subIndexes from the Object Dictionary. etisserant@0: """ etisserant@0: def RemoveEntry(self, index, subIndex = None): etisserant@0: if not getattr(self, "ParamsDictionary", False): etisserant@0: self.ParamsDictionary = {} etisserant@0: if index in self.Dictionary: etisserant@0: if not subIndex: etisserant@0: self.Dictionary.pop(index) etisserant@0: if index in self.ParamsDictionary: etisserant@0: self.ParamsDictionary.pop(index) etisserant@0: return True etisserant@0: elif type(self.Dictionary[index]) == ListType and subIndex == len(self.Dictionary[index]): etisserant@0: self.Dictionary[index].pop(subIndex - 1) etisserant@0: if index in self.ParamsDictionary: etisserant@0: if subIndex in self.ParamsDictionary[index]: etisserant@0: self.ParamsDictionary[index].pop(subIndex) etisserant@0: if len(self.ParamsDictionary[index]) == 0: etisserant@0: self.ParamsDictionary.pop(index) etisserant@0: if len(self.Dictionary[index]) == 0: etisserant@0: self.Dictionary.pop(index) etisserant@0: if index in self.ParamsDictionary: etisserant@0: self.ParamsDictionary.pop(index) etisserant@0: return True etisserant@0: return False etisserant@0: etisserant@0: """ etisserant@0: Check if an entry exists in the Object Dictionary and returns the answer. etisserant@0: """ lbessard@205: def IsEntry(self, index, subIndex = None): etisserant@0: if index in self.Dictionary: lbessard@205: if not subIndex: lbessard@205: return True lbessard@205: return subIndex <= len(self.Dictionary[index]) etisserant@0: return False etisserant@0: etisserant@0: """ etisserant@0: Returns the value of the entry asked. If the entry has the value "count", it etisserant@0: returns the number of subIndex in the entry except the first. etisserant@0: """ lbessard@299: def GetEntry(self, index, subIndex = None, compute = True): etisserant@0: if index in self.Dictionary: etisserant@0: if subIndex == None: etisserant@0: if type(self.Dictionary[index]) == ListType: etisserant@0: values = [len(self.Dictionary[index])] lbessard@205: for value in self.Dictionary[index]: lbessard@299: values.append(self.CompileValue(value, index, compute)) etisserant@0: return values etisserant@0: else: lbessard@299: return self.CompileValue(self.Dictionary[index], index, compute) etisserant@0: elif subIndex == 0: etisserant@0: if type(self.Dictionary[index]) == ListType: etisserant@0: return len(self.Dictionary[index]) etisserant@0: else: lbessard@299: return self.CompileValue(self.Dictionary[index], index, compute) etisserant@0: elif type(self.Dictionary[index]) == ListType and 0 < subIndex <= len(self.Dictionary[index]): lbessard@299: return self.CompileValue(self.Dictionary[index][subIndex - 1], index, compute) etisserant@0: return None etisserant@0: etisserant@0: """ etisserant@0: Returns the value of the entry asked. If the entry has the value "count", it etisserant@0: returns the number of subIndex in the entry except the first. etisserant@0: """ etisserant@0: def GetParamsEntry(self, index, subIndex = None): etisserant@0: if not getattr(self, "ParamsDictionary", False): etisserant@0: self.ParamsDictionary = {} etisserant@0: if index in self.Dictionary: etisserant@0: if subIndex == None: etisserant@0: if type(self.Dictionary[index]) == ListType: etisserant@0: if index in self.ParamsDictionary: etisserant@0: result = [] etisserant@0: for i in xrange(len(self.Dictionary[index]) + 1): etisserant@0: line = DefaultParams.copy() etisserant@0: if i in self.ParamsDictionary[index]: etisserant@0: line.update(self.ParamsDictionary[index][i]) etisserant@0: result.append(line) etisserant@0: return result etisserant@0: else: etisserant@0: return [DefaultParams.copy() for i in xrange(len(self.Dictionary[index]) + 1)] etisserant@0: else: etisserant@0: result = DefaultParams.copy() etisserant@0: if index in self.ParamsDictionary: etisserant@0: result.update(self.ParamsDictionary[index]) etisserant@0: return result etisserant@0: elif subIndex == 0 and type(self.Dictionary[index]) != ListType: etisserant@0: result = DefaultParams.copy() etisserant@0: if index in self.ParamsDictionary: etisserant@0: result.update(self.ParamsDictionary[index]) etisserant@0: return result etisserant@0: elif type(self.Dictionary[index]) == ListType and 0 <= subIndex <= len(self.Dictionary[index]): etisserant@0: result = DefaultParams.copy() etisserant@0: if index in self.ParamsDictionary and subIndex in self.ParamsDictionary[index]: lbessard@64: result.update(self.ParamsDictionary[index][subIndex]) etisserant@0: return result etisserant@0: return None etisserant@0: etisserant@0: def HasEntryCallbacks(self, index): lbessard@245: entry_infos = self.GetEntryInfos(index) lbessard@245: if entry_infos and "callback" in entry_infos: lbessard@245: return entry_infos["callback"] lbessard@245: else: lbessard@245: if not getattr(self, "ParamsDictionary", False): lbessard@245: self.ParamsDictionary = {} lbessard@245: if index in self.Dictionary and index in self.ParamsDictionary and "callback" in self.ParamsDictionary[index]: lbessard@245: return self.ParamsDictionary[index]["callback"] etisserant@0: return False etisserant@0: etisserant@0: """ lbessard@68: Check if an entry exists in the User Mapping Dictionary and returns the answer. lbessard@68: """ lbessard@68: def IsMappingEntry(self, index): lbessard@68: if index in self.UserMapping: lbessard@68: return True lbessard@68: return False lbessard@68: lbessard@68: """ etisserant@0: Add a new entry in the User Mapping Dictionary etisserant@0: """ etisserant@0: def AddMappingEntry(self, index, subIndex = None, name = "Undefined", struct = 0, size = None, nbmax = None, default = None, values = None): etisserant@0: if index not in self.UserMapping: etisserant@0: if values == None: etisserant@0: values = [] etisserant@0: if subIndex == None: etisserant@0: self.UserMapping[index] = {"name" : name, "struct" : struct, "need" : False, "values" : values} etisserant@0: if size != None: etisserant@0: self.UserMapping[index]["size"] = size etisserant@0: if nbmax != None: etisserant@0: self.UserMapping[index]["nbmax"] = nbmax etisserant@0: if default != None: etisserant@0: self.UserMapping[index]["default"] = default etisserant@0: return True etisserant@0: elif subIndex != None and subIndex == len(self.UserMapping[index]["values"]): etisserant@0: if values == None: etisserant@0: values = {} etisserant@0: self.UserMapping[index]["values"].append(values) etisserant@0: return True etisserant@0: return False etisserant@0: etisserant@0: """ etisserant@0: Warning ! Modifies an existing entry in the User Mapping Dictionary. Can't add a new one. etisserant@0: """ etisserant@0: def SetMappingEntry(self, index, subIndex = None, name = None, struct = None, size = None, nbmax = None, default = None, values = None): etisserant@0: if index in self.UserMapping: etisserant@0: if subIndex == None: etisserant@0: if name != None: etisserant@0: self.UserMapping[index]["name"] = name etisserant@0: if self.UserMapping[index]["struct"] & OD_IdenticalSubindexes: etisserant@0: self.UserMapping[index]["values"][1]["name"] = name + " %d[(sub)]" etisserant@0: elif not self.UserMapping[index]["struct"] & OD_MultipleSubindexes: etisserant@0: self.UserMapping[index]["values"][0]["name"] = name etisserant@0: if struct != None: etisserant@0: self.UserMapping[index]["struct"] = struct etisserant@0: if size != None: etisserant@0: self.UserMapping[index]["size"] = size etisserant@0: if nbmax != None: etisserant@0: self.UserMapping[index]["nbmax"] = nbmax etisserant@0: if default != None: etisserant@0: self.UserMapping[index]["default"] = default etisserant@0: if values != None: etisserant@0: self.UserMapping[index]["values"] = values etisserant@0: return True etisserant@0: elif 0 <= subIndex < len(self.UserMapping[index]["values"]) and values != None: lbessard@281: if "type" in values: lbessard@453: if self.UserMapping[index]["struct"] & OD_IdenticalSubindexes: lbessard@453: if self.IsStringType(self.UserMapping[index]["values"][subIndex]["type"]): lbessard@453: if self.IsRealType(values["type"]): lbessard@453: for i in xrange(len(self.Dictionary[index])): lbessard@453: self.SetEntry(index, i + 1, 0.) lbessard@453: elif not self.IsStringType(values["type"]): lbessard@453: for i in xrange(len(self.Dictionary[index])): lbessard@453: self.SetEntry(index, i + 1, 0) lbessard@453: elif self.IsRealType(self.UserMapping[index]["values"][subIndex]["type"]): lbessard@453: if self.IsStringType(values["type"]): lbessard@453: for i in xrange(len(self.Dictionary[index])): lbessard@453: self.SetEntry(index, i + 1, "") lbessard@453: elif not self.IsRealType(values["type"]): lbessard@453: for i in xrange(len(self.Dictionary[index])): lbessard@453: self.SetEntry(index, i + 1, 0) lbessard@453: elif self.IsStringType(values["type"]): lbessard@453: for i in xrange(len(self.Dictionary[index])): lbessard@453: self.SetEntry(index, i + 1, "") lbessard@453: elif self.IsRealType(values["type"]): lbessard@453: for i in xrange(len(self.Dictionary[index])): lbessard@453: self.SetEntry(index, i + 1, 0.) lbessard@453: else: lbessard@453: if self.IsStringType(self.UserMapping[index]["values"][subIndex]["type"]): lbessard@453: if self.IsRealType(values["type"]): lbessard@453: self.SetEntry(index, subIndex, 0.) lbessard@453: elif not self.IsStringType(values["type"]): lbessard@453: self.SetEntry(index, subIndex, 0) lbessard@453: elif self.IsRealType(self.UserMapping[index]["values"][subIndex]["type"]): lbessard@453: if self.IsStringType(values["type"]): lbessard@453: self.SetEntry(index, subIndex, "") lbessard@453: elif not self.IsRealType(values["type"]): lbessard@453: self.SetEntry(index, subIndex, 0) lbessard@453: elif self.IsStringType(values["type"]): lbessard@453: self.SetEntry(index, subIndex, "") lbessard@453: elif self.IsRealType(values["type"]): lbessard@453: self.SetEntry(index, subIndex, 0.) etisserant@0: self.UserMapping[index]["values"][subIndex].update(values) etisserant@0: return True etisserant@0: return False etisserant@0: etisserant@0: """ etisserant@0: Removes an existing entry in the User Mapping Dictionary. If a subIndex is specified etisserant@0: it will remove this subIndex only if it's the last of the index. If no subIndex etisserant@0: is specified it removes the whole index and subIndexes from the User Mapping Dictionary. etisserant@0: """ etisserant@0: def RemoveMappingEntry(self, index, subIndex = None): etisserant@0: if index in self.UserMapping: etisserant@0: if subIndex == None: etisserant@0: self.UserMapping.pop(index) etisserant@0: return True etisserant@0: elif subIndex == len(self.UserMapping[index]["values"]) - 1: etisserant@0: self.UserMapping[index]["values"].pop(subIndex) etisserant@0: return True etisserant@0: return False etisserant@0: lbessard@205: def RemoveMapVariable(self, index, subIndex = None): etisserant@0: model = index << 16 etisserant@0: mask = 0xFFFF << 16 etisserant@0: if subIndex: etisserant@0: model += subIndex << 8 lbessard@299: mask += 0xFF << 8 etisserant@0: for i in self.Dictionary.iterkeys(): etisserant@0: if 0x1600 <= i <= 0x17FF or 0x1A00 <= i <= 0x1BFF: etisserant@0: for j,value in enumerate(self.Dictionary[i]): etisserant@0: if (value & mask) == model: etisserant@0: self.Dictionary[i][j] = 0 etisserant@0: lbessard@63: def UpdateMapVariable(self, index, subIndex, size): lbessard@63: model = index << 16 lbessard@63: mask = 0xFFFF << 16 lbessard@63: if subIndex: lbessard@63: model += subIndex << 8 lbessard@63: mask = 0xFF << 8 lbessard@63: for i in self.Dictionary.iterkeys(): lbessard@63: if 0x1600 <= i <= 0x17FF or 0x1A00 <= i <= 0x1BFF: lbessard@63: for j,value in enumerate(self.Dictionary[i]): lbessard@63: if (value & mask) == model: lbessard@63: self.Dictionary[i][j] = model + size lbessard@63: etisserant@0: def RemoveLine(self, index, max, incr = 1): etisserant@0: i = index etisserant@0: while i < max and self.IsEntry(i + incr): etisserant@0: self.Dictionary[i] = self.Dictionary[i + incr] etisserant@0: i += incr etisserant@0: self.Dictionary.pop(i) etisserant@0: etisserant@0: def RemoveUserType(self, index): etisserant@0: type = self.GetEntry(index, 1) etisserant@0: for i in self.UserMapping: etisserant@0: for value in self.UserMapping[i]["values"]: etisserant@0: if value["type"] == index: etisserant@0: value["type"] = type etisserant@0: self.RemoveMappingEntry(index) etisserant@0: self.RemoveEntry(index) etisserant@0: etisserant@0: """ etisserant@0: Return a copy of the node etisserant@0: """ etisserant@0: def Copy(self): etisserant@0: return cPickle.loads(cPickle.dumps(self)) etisserant@0: etisserant@0: """ etisserant@0: Return a sorted list of indexes in Object Dictionary etisserant@0: """ etisserant@0: def GetIndexes(self): etisserant@0: listindex = self.Dictionary.keys() etisserant@0: listindex.sort() etisserant@0: return listindex etisserant@0: etisserant@0: """ etisserant@0: Print the Dictionary values etisserant@0: """ etisserant@0: def Print(self): lbessard@273: print self.PrintString() lbessard@273: lbessard@273: def PrintString(self): lbessard@273: result = "" etisserant@0: listindex = self.Dictionary.keys() etisserant@0: listindex.sort() etisserant@0: for index in listindex: lbessard@273: name = self.GetEntryName(index) greg@239: values = self.Dictionary[index] lbessard@273: if isinstance(values, ListType): lbessard@273: result += "%04X (%s):\n"%(index, name) lbessard@273: for subidx, value in enumerate(values): lbessard@273: subentry_infos = self.GetSubentryInfos(index, subidx + 1) lbessard@273: if index == 0x1F22 and value: lbessard@273: nb_params = BE_to_LE(value[:4]) lbessard@273: data = value[4:] lbessard@274: value = "%d arg defined"%nb_params lbessard@273: i = 0 lbessard@274: count = 1 lbessard@273: while i < len(data): lbessard@274: value += "\n%04X %02X, arg %d: "%(index, subidx+1, count) lbessard@274: value += "%04X"%BE_to_LE(data[i:i+2]) lbessard@274: value += " %02X"%BE_to_LE(data[i+2:i+3]) lbessard@273: size = BE_to_LE(data[i+3:i+7]) lbessard@274: value += " %08X"%size lbessard@274: value += (" %0"+"%d"%(size * 2)+"X")%BE_to_LE(data[i+7:i+7+size]) lbessard@273: i += 7 + size lbessard@274: count += 1 lbessard@273: elif isinstance(value, IntType): lbessard@273: value = "%X"%value lbessard@274: result += "%04X %02X (%s): %s\n"%(index, subidx+1, subentry_infos["name"], value) lbessard@273: else: lbessard@274: if isinstance(values, IntType): lbessard@274: values = "%X"%values lbessard@273: result += "%04X (%s): %s\n"%(index, name, values) lbessard@273: return result lbessard@273: lbessard@299: def CompileValue(self, value, index, compute = True): greg@541: if isinstance(value, (StringType, UnicodeType)) and value.upper().find("$NODEID") != -1: lbessard@205: base = self.GetBaseIndex(index) lbessard@205: try: lbessard@299: raw = eval(value) lbessard@299: if compute: lbessard@513: return eval(raw.upper().replace("$NODEID","self.ID")) lbessard@299: return raw lbessard@205: except: lbessard@205: return 0 lbessard@205: else: lbessard@205: return value lbessard@205: lbessard@205: #------------------------------------------------------------------------------- lbessard@205: # Node Informations Functions lbessard@205: #------------------------------------------------------------------------------- lbessard@205: lbessard@205: def GetBaseIndex(self, index): lbessard@205: for mapping in self.GetMappings(): lbessard@205: result = FindIndex(index, mapping) lbessard@205: if result != None: lbessard@227: return (index - result) / mapping[result].get("incr", 1) lbessard@205: result = FindIndex(index, MappingDictionary) lbessard@205: if result != None: lbessard@227: return (index - result) / MappingDictionary[result].get("incr", 1) lbessard@205: return 0 lbessard@205: lbessard@205: def GetCustomisedTypeValues(self, index): lbessard@205: values = self.GetEntry(index) lbessard@205: customisabletypes = self.GetCustomisableTypes() lbessard@205: return values, customisabletypes[values[1]][1] lbessard@205: laurent@584: def GetEntryName(self, index, compute=True): lbessard@205: result = None lbessard@205: mappings = self.GetMappings() lbessard@205: i = 0 lbessard@205: while not result and i < len(mappings): laurent@584: result = FindEntryName(index, mappings[i], compute) lbessard@205: i += 1 lbessard@205: if result == None: laurent@584: result = FindEntryName(index, MappingDictionary, compute) lbessard@205: return result lbessard@205: laurent@584: def GetEntryInfos(self, index, compute=True): lbessard@205: result = None lbessard@205: mappings = self.GetMappings() lbessard@205: i = 0 lbessard@205: while not result and i < len(mappings): laurent@584: result = FindEntryInfos(index, mappings[i], compute) lbessard@205: i += 1 Edouard@659: r301 = FindEntryInfos(index, MappingDictionary, compute) Edouard@659: if r301 : Edouard@659: if result is not None: Edouard@659: r301.update(result) Edouard@659: return r301 lbessard@205: return result lbessard@205: laurent@584: def GetSubentryInfos(self, index, subIndex, compute=True): lbessard@205: result = None lbessard@205: mappings = self.GetMappings() lbessard@205: i = 0 lbessard@205: while not result and i < len(mappings): laurent@584: result = FindSubentryInfos(index, subIndex, mappings[i], compute) lbessard@205: if result: lbessard@205: result["user_defined"] = i == len(mappings) - 1 and index >= 0x1000 lbessard@205: i += 1 Edouard@659: r301 = FindSubentryInfos(index, subIndex, MappingDictionary, compute) Edouard@659: if r301 : Edouard@659: if result is not None: Edouard@659: r301.update(result) Edouard@659: else: Edouard@659: r301["user_defined"] = False Edouard@659: return r301 lbessard@205: return result lbessard@205: lbessard@205: def GetTypeIndex(self, typename): lbessard@205: result = None lbessard@205: mappings = self.GetMappings() lbessard@205: i = 0 lbessard@205: while not result and i < len(mappings): lbessard@205: result = FindTypeIndex(typename, mappings[i]) lbessard@205: i += 1 lbessard@205: if result == None: lbessard@205: result = FindTypeIndex(typename, MappingDictionary) lbessard@205: return result lbessard@205: lbessard@205: def GetTypeName(self, typeindex): lbessard@205: result = None lbessard@205: mappings = self.GetMappings() lbessard@205: i = 0 lbessard@205: while not result and i < len(mappings): lbessard@205: result = FindTypeName(typeindex, mappings[i]) lbessard@205: i += 1 lbessard@205: if result == None: lbessard@205: result = FindTypeName(typeindex, MappingDictionary) lbessard@205: return result lbessard@205: lbessard@205: def GetTypeDefaultValue(self, typeindex): lbessard@205: result = None lbessard@205: mappings = self.GetMappings() lbessard@205: i = 0 lbessard@205: while not result and i < len(mappings): lbessard@205: result = FindTypeDefaultValue(typeindex, mappings[i]) lbessard@205: i += 1 lbessard@205: if result == None: lbessard@205: result = FindTypeDefaultValue(typeindex, MappingDictionary) lbessard@205: return result lbessard@205: laurent@584: def GetMapVariableList(self, compute=True): laurent@584: list = FindMapVariableList(MappingDictionary, self, compute) lbessard@205: for mapping in self.GetMappings(): laurent@584: list.extend(FindMapVariableList(mapping, self, compute)) lbessard@205: list.sort() lbessard@205: return list lbessard@205: lbessard@205: def GetMandatoryIndexes(self, node = None): lbessard@205: list = FindMandatoryIndexes(MappingDictionary) lbessard@205: for mapping in self.GetMappings(): lbessard@205: list.extend(FindMandatoryIndexes(mapping)) lbessard@205: return list lbessard@205: lbessard@205: def GetCustomisableTypes(self): lbessard@205: dic = {} lbessard@205: for index, valuetype in CustomisableTypes: lbessard@205: name = self.GetTypeName(index) lbessard@205: dic[index] = [name, valuetype] lbessard@205: return dic lbessard@205: lbessard@205: #------------------------------------------------------------------------------- lbessard@281: # Type helper functions lbessard@281: #------------------------------------------------------------------------------- lbessard@281: lbessard@281: def IsStringType(self, index): greg@523: if index in (0x9, 0xA, 0xB, 0xF): lbessard@281: return True lbessard@281: elif 0xA0 <= index < 0x100: lbessard@281: result = self.GetEntry(index, 1) lbessard@281: if result is not None and result in (0x9, 0xA, 0xB): lbessard@281: return True lbessard@281: return False lbessard@281: lbessard@453: def IsRealType(self, index): lbessard@453: if index in (0x8, 0x11): lbessard@453: return True lbessard@453: elif 0xA0 <= index < 0x100: lbessard@453: result = self.GetEntry(index, 1) lbessard@453: if result is not None and result in (0x8, 0x11): lbessard@453: return True lbessard@453: return False lbessard@453: lbessard@281: #------------------------------------------------------------------------------- lbessard@205: # Type and Map Variable Lists lbessard@205: #------------------------------------------------------------------------------- lbessard@205: lbessard@205: def GetTypeList(self): lbessard@205: list = FindTypeList(MappingDictionary) lbessard@205: for mapping in self.GetMappings(): lbessard@205: list.extend(FindTypeList(mapping)) lbessard@205: list.sort() lbessard@205: return ",".join(list) lbessard@205: lbessard@536: def GenerateMapName(self, name, index, subindex): lbessard@536: return "%s (0x%4.4X)" % (name, index) lbessard@536: lbessard@205: """ lbessard@205: Generate the list of variables that can be mapped for the current node lbessard@205: """ lbessard@205: def GenerateMapList(self): lbessard@205: self.MapList = "None" lbessard@205: self.NameTranslation = {"None" : "00000000"} lbessard@205: self.MapTranslation = {"00000000" : "None"} lbessard@205: list = self.GetMapVariableList() lbessard@205: for index, subIndex, size, name in list: lbessard@205: self.MapList += ",%s"%name lbessard@205: map = "%04X%02X%02X"%(index,subIndex,size) lbessard@536: mapname = self.GenerateMapName(name, index, subIndex) lbessard@536: self.NameTranslation[mapname] = map lbessard@536: self.MapTranslation[map] = mapname lbessard@205: lbessard@205: def GetMapValue(self, mapname): lbessard@205: if mapname == "None": lbessard@205: return 0 lbessard@205: else: lbessard@205: list = self.GetMapVariableList() lbessard@205: for index, subIndex, size, name in list: lbessard@536: if mapname == self.GenerateMapName(name, index, subIndex): lbessard@205: return (index << 16) + (subIndex << 8) + size lbessard@205: return None lbessard@205: lbessard@205: def GetMapName(self, value): lbessard@205: if value != 0: lbessard@205: index = value >> 16 lbessard@205: subindex = (value >> 8) % (1 << 8) lbessard@205: result = self.GetSubentryInfos(index, subindex) lbessard@205: if result: lbessard@536: return self.GenerateMapName(result["name"], index, subindex) lbessard@205: return "None" lbessard@205: lbessard@205: """ lbessard@205: Return the list of variables that can be mapped for the current node lbessard@205: """ lbessard@205: def GetMapList(self): laurent@584: list = [_("None")] + [self.GenerateMapName(name, index, subIndex) for index, subIndex, size, name in self.GetMapVariableList()] lbessard@205: return ",".join(list) lbessard@273: lbessard@273: def BE_to_LE(value): lbessard@273: """ lbessard@273: Convert Big Endian to Little Endian lbessard@273: @param value: value expressed in Big Endian lbessard@273: @param size: number of bytes generated lbessard@273: @return: a string containing the value converted lbessard@273: """ lbessard@273: lbessard@273: data = [char for char in value] lbessard@273: data.reverse() lbessard@273: return int("".join(["%2.2X"%ord(char) for char in data]), 16) lbessard@327: lbessard@327: def LE_to_BE(value, size): lbessard@327: """ lbessard@327: Convert Little Endian to Big Endian lbessard@327: @param value: value expressed in integer lbessard@327: @param size: number of bytes generated lbessard@327: @return: a string containing the value converted lbessard@327: """ lbessard@327: lbessard@327: data = ("%" + str(size * 2) + "." + str(size * 2) + "X") % value lbessard@327: list_car = [data[i:i+2] for i in xrange(0, len(data), 2)] lbessard@327: list_car.reverse() lbessard@327: return "".join([chr(int(car, 16)) for car in list_car]) lbessard@327: