objdictgen/eds_utils.py
author etisserant
Sat, 28 Jun 2008 18:43:15 +0200
changeset 492 b919a24a45cb
parent 489 cfba6bf99701
child 509 88c2ea321049
permissions -rw-r--r--
Fixed automatic SDO server creation for slave
Automatic PDO creation for slave
Remove PDO from EDS when mapping not defined
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
     1
#!/usr/bin/env python
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
     3
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
     4
#This file is part of CanFestival, a library implementing CanOpen Stack. 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
     5
#
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
     6
#Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
     7
#
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
     8
#See COPYING file for copyrights details.
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
     9
#
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    10
#This library is free software; you can redistribute it and/or
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    11
#modify it under the terms of the GNU Lesser General Public
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    12
#License as published by the Free Software Foundation; either
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    13
#version 2.1 of the License, or (at your option) any later version.
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    14
#
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    15
#This library is distributed in the hope that it will be useful,
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    16
#but WITHOUT ANY WARRANTY; without even the implied warranty of
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    17
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    18
#Lesser General Public License for more details.
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    19
#
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    20
#You should have received a copy of the GNU Lesser General Public
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    21
#License along with this library; if not, write to the Free Software
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    22
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    23
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    24
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    25
import node
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    26
from node import nosub, var, array, rec, plurivar, pluriarray, plurirec
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    27
from sets import *
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    28
from types import *
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    29
from time import *
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    30
import os,re
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    31
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    32
# Regular expression for finding index section names
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
    33
index_model = re.compile('([0-9A-F]{1,4}$)')
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    34
# Regular expression for finding subindex section names
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
    35
subindex_model = re.compile('([0-9A-F]{1,4})SUB([0-9A-F]{1,2}$)')
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
    36
# Regular expression for finding index section names
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
    37
index_objectlinks_model = re.compile('([0-9A-F]{1,4}OBJECTLINKS$)')
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    38
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    39
# Regular expression for finding NodeXPresent keynames
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
    40
nodepresent_model = re.compile('NODE([0-9]{1,3})PRESENT$')
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    41
# Regular expression for finding NodeXName keynames
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
    42
nodename_model = re.compile('NODE([0-9]{1,3})NAME$')
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    43
# Regular expression for finding NodeXDCFName keynames
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
    44
nodedcfname_model = re.compile('NODE([0-9]{1,3})DCFNAME$')
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    45
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    46
# Dictionary for quickly translate boolean into integer value
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    47
BOOL_TRANSLATE = {True : "1", False : "0"}
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    48
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    49
# Dictionary for quickly translate eds access value into canfestival access value
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
    50
ACCESS_TRANSLATE = {"RO" : "ro", "WO" : "wo", "RW" : "rw", "RWR" : "rw", "RWW" : "rw", "CONST" : "ro"}
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    51
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    52
# Function for verifying data values
206
6787754b251b Bugs corrected on objdictedit and networkdict
greg
parents: 205
diff changeset
    53
is_integer = lambda x: type(x) in (IntType, LongType)
6787754b251b Bugs corrected on objdictedit and networkdict
greg
parents: 205
diff changeset
    54
is_string = lambda x: type(x) in (StringType, UnicodeType)
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    55
is_boolean = lambda x: x in (0, 1)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    56
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    57
# Define checking of value for each attribute
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    58
ENTRY_ATTRIBUTES = {"SUBNUMBER" : is_integer, "PARAMETERNAME" : is_string, 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    59
                    "OBJECTTYPE" : lambda x: x in (7, 8, 9), "DATATYPE" : is_integer, 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    60
                    "LOWLIMIT" : is_integer, "HIGHLIMIT" : is_integer,
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
    61
                    "ACCESSTYPE" : lambda x: x.upper() in ACCESS_TRANSLATE.keys(),
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    62
                    "DEFAULTVALUE" : lambda x: True, "PDOMAPPING" : is_boolean,
323
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
    63
                    "OBJFLAGS" : is_integer, "PARAMETERVALUE" : lambda x: True,}
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    64
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    65
# Define entry parameters by entry ObjectType number
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    66
ENTRY_TYPES = {7 : {"name" : " VAR",
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
    67
                    "require" : ["PARAMETERNAME", "DATATYPE", "ACCESSTYPE"],
323
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
    68
                    "optional" : ["OBJECTTYPE", "DEFAULTVALUE", "PDOMAPPING", "LOWLIMIT", "HIGHLIMIT", "OBJFLAGS", "PARAMETERVALUE"]},
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    69
               8 : {"name" : "n ARRAY",
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
    70
                    "require" : ["PARAMETERNAME", "OBJECTTYPE", "SUBNUMBER"],
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    71
                    "optional" : ["OBJFLAGS"]},
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    72
               9 : {"name" : " RECORD",
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
    73
                    "require" : ["PARAMETERNAME", "OBJECTTYPE", "SUBNUMBER"],
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    74
                    "optional" : ["OBJFLAGS"]}}
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    75
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    76
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    77
# Function that search into Node Mappings the informations about an index or a subindex
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    78
# and return the default value
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
    79
def GetDefaultValue(Node, index, subIndex = None):
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    80
    infos = Node.GetEntryInfos(index)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    81
    if infos["struct"] & node.OD_MultipleSubindexes:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    82
        # First case entry is a record
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    83
        if infos["struct"] & node.OD_IdenticalSubindexes:
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    84
            subentry_infos = Node.GetSubentryInfos(index, 1)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    85
        # Second case entry is an array
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    86
        else:
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    87
            subentry_infos = Node.GetSubentryInfos(index, subIndex)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    88
        # If a default value is defined for this subindex, returns it
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    89
        if "default" in subentry_infos:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    90
            return subentry_infos["default"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    91
        # If not, returns the default value for the subindex type
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    92
        else:
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    93
            return Node.GetTypeDefaultValue(subentry_infos["type"])
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    94
    # Third case entry is a var
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    95
    else:
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
    96
        subentry_infos = Node.GetSubentryInfos(index, 0)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    97
        # If a default value is defined for this subindex, returns it
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    98
        if "default" in subentry_infos:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
    99
            return subentry_infos["default"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   100
        # If not, returns the default value for the subindex type
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   101
        else:
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   102
            return Node.GetTypeDefaultValue(subentry_infos["type"])
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   103
    return None
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   104
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   105
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   106
#-------------------------------------------------------------------------------
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   107
#                               Parse file
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   108
#-------------------------------------------------------------------------------
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   109
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   110
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   111
# List of section names that are not index and subindex and that we can meet in
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   112
# an EDS file
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   113
SECTION_KEYNAMES = ["FILEINFO", "DEVICEINFO", "DUMMYUSAGE", "COMMENTS", 
305
db803c81f19f Bug on some eds including StandardDataTypes section fixed
lbessard
parents: 299
diff changeset
   114
                    "MANDATORYOBJECTS", "OPTIONALOBJECTS", "MANUFACTUREROBJECTS",
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   115
                    "STANDARDDATATYPES", "SUPPORTEDMODULES"]
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   116
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   117
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   118
# Function that extract sections from a file and returns a dictionary of the informations
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   119
def ExtractSections(file):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   120
    return [(blocktuple[0],                # EntryName : Assignements dict
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   121
             blocktuple[-1].splitlines())  # all the lines
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   122
             for blocktuple in [           # Split the eds files into
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   123
             block.split("]", 1)              # (EntryName,Assignements) tuple
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   124
             for block in                  # for each blocks staring with '['
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   125
             ("\n"+file).split("\n[")]
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   126
             if blocktuple[0].isalnum()]   # if EntryName exists
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   127
    
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   128
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   129
# Function that parse an CPJ file and returns a dictionary of the informations
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   130
def ParseCPJFile(filepath):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   131
    networks = []
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   132
    # Read file text
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   133
    cpj_file = open(filepath,'r').read()
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   134
    sections = ExtractSections(cpj_file)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   135
    # Parse assignments for each section
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   136
    for section_name, assignments in sections:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   137
        
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   138
        # Verify that section name is TOPOLOGY 
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   139
        if section_name.upper() in "TOPOLOGY":
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   140
            
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   141
            # Reset values for topology
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   142
            topology = {"Name" : "", "Nodes" : {}}
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   143
            
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   144
            for assignment in assignments:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   145
                # Escape any comment
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   146
                if assignment.startswith(";"):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   147
                    pass
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   148
                # Verify that line is a valid assignment
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   149
                elif assignment.find('=') > 0:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   150
                    # Split assignment into the two values keyname and value
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   151
                    keyname, value = assignment.split("=", 1)
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   152
                    
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   153
                    # keyname must be immediately followed by the "=" sign, so we
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   154
                    # verify that there is no whitespace into keyname
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   155
                    if keyname.isalnum():
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   156
                        # value can be preceded and followed by whitespaces, so we escape them
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   157
                        value = value.strip()
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   158
                
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   159
                        # First case, value starts with "0x" or "-0x", then it's an hexadecimal value
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   160
                        if value.startswith("0x") or value.startswith("-0x"):
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   161
                            try:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   162
                                computed_value = int(value, 16)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   163
                            except:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   164
                                raise SyntaxError, "\"%s\" is not a valid value for attribute \"%s\" of section \"[%s]\""%(value, keyname, section_name)
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   165
                        elif value.isdigit() or value.startswith("-") and value[1:].isdigit():
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   166
                            # Second case, value is a number and starts with "0" or "-0", then it's an octal value
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   167
                            if value.startswith("0") or value.startswith("-0"):
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   168
                                computed_value = int(value, 8)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   169
                            # Third case, value is a number and don't start with "0", then it's a decimal value
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   170
                            else:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   171
                                computed_value = int(value)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   172
                        # In any other case, we keep string value
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   173
                        else:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   174
                            computed_value = value
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   175
                        
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   176
                        # Search if the section name match any cpj expression
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   177
                        nodepresent_result = nodepresent_model.match(keyname.upper())
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   178
                        nodename_result = nodename_model.match(keyname.upper())
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   179
                        nodedcfname_result = nodedcfname_model.match(keyname.upper())
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   180
                        
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   181
                        if keyname.upper() == "NETNAME":
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   182
                            if not is_string(computed_value):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   183
                                raise SyntaxError, "Invalid value \"%s\" for keyname \"%s\" of section \"[%s]\""%(value, keyname, section_name)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   184
                            topology["Name"] = computed_value
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   185
                        elif keyname.upper() == "NODES":
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   186
                            if not is_integer(computed_value):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   187
                                raise SyntaxError, "Invalid value \"%s\" for keyname \"%s\" of section \"[%s]\""%(value, keyname, section_name)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   188
                            topology["Number"] = computed_value
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   189
                        elif keyname.upper() == "EDSBASENAME":
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   190
                            if not is_string(computed_value):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   191
                                raise SyntaxError, "Invalid value \"%s\" for keyname \"%s\" of section \"[%s]\""%(value, keyname, section_name)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   192
                            topology["Path"] = computed_value
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   193
                        elif nodepresent_result:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   194
                            if not is_boolean(computed_value):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   195
                                raise SyntaxError, "Invalid value \"%s\" for keyname \"%s\" of section \"[%s]\""%(value, keyname, section_name)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   196
                            nodeid = int(nodepresent_result.groups()[0])
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   197
                            if nodeid not in topology["Nodes"].keys():
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   198
                                topology["Nodes"][nodeid] = {}
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   199
                            topology["Nodes"][nodeid]["Present"] = computed_value
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   200
                        elif nodename_result:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   201
                            if not is_string(value):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   202
                                raise SyntaxError, "Invalid value \"%s\" for keyname \"%s\" of section \"[%s]\""%(value, keyname, section_name)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   203
                            nodeid = int(nodename_result.groups()[0])
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   204
                            if nodeid not in topology["Nodes"].keys():
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   205
                                topology["Nodes"][nodeid] = {}
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   206
                            topology["Nodes"][nodeid]["Name"] = computed_value
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   207
                        elif nodedcfname_result:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   208
                            if not is_string(computed_value):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   209
                                raise SyntaxError, "Invalid value \"%s\" for keyname \"%s\" of section \"[%s]\""%(value, keyname, section_name)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   210
                            nodeid = int(nodedcfname_result.groups()[0])
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   211
                            if nodeid not in topology["Nodes"].keys():
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   212
                                topology["Nodes"][nodeid] = {}
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   213
                            topology["Nodes"][nodeid]["DCFName"] = computed_value
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   214
                        else:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   215
                            raise SyntaxError, "Keyname \"%s\" not recognised for section \"[%s]\""%(keyname, section_name)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   216
                        
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   217
                # All lines that are not empty and are neither a comment neither not a valid assignment
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   218
                elif assignment.strip() != "":
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   219
                    raise SyntaxError, "\"%s\" is not a valid CPJ line"%assignment.strip()
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   220
        
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   221
            if "Number" not in topology.keys():
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   222
                raise SyntaxError, "\"Nodes\" keyname in \"[%s]\" section is missing"%section_name
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   223
        
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   224
            if topology["Number"] != len(topology["Nodes"]):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   225
                raise SyntaxError, "\"Nodes\" value not corresponding to number of nodes defined"
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   226
            
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   227
            for nodeid, node in topology["Nodes"].items():
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   228
                if "Present" not in node.keys():
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   229
                    raise SyntaxError, "\"Node%dPresent\" keyname in \"[%s]\" section is missing"%(nodeid, section_name)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   230
            
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   231
            networks.append(topology)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   232
            
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   233
        # In other case, there is a syntax problem into CPJ file
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   234
        else:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   235
            raise SyntaxError, "Section \"[%s]\" is unrecognized"%section_name
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   236
    
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   237
    return networks
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   238
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   239
# Function that parse an EDS file and returns a dictionary of the informations
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   240
def ParseEDSFile(filepath):
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   241
    eds_dict = {}
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   242
    # Read file text
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   243
    eds_file = open(filepath,'r').read()
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   244
    sections = ExtractSections(eds_file)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   245
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   246
    # Parse assignments for each section
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   247
    for section_name, assignments in sections:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   248
        # Reset values of entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   249
        values = {}
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   250
        
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   251
        # Search if the section name match an index or subindex expression
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   252
        index_result = index_model.match(section_name.upper())
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   253
        subindex_result = subindex_model.match(section_name.upper())
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   254
        index_objectlinks_result = index_objectlinks_model.match(section_name.upper())
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   255
        
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   256
        # Compilation of the EDS information dictionary
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   257
        
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   258
        is_entry = False
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   259
        # First case, section name is in SECTION_KEYNAMES 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   260
        if section_name.upper() in SECTION_KEYNAMES:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   261
            # Verify that entry is not already defined
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   262
            if section_name.upper() not in eds_dict:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   263
                eds_dict[section_name.upper()] = values
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   264
            else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   265
                raise SyntaxError, "\"[%s]\" section is defined two times"%section_name
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   266
        # Second case, section name is an index name 
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   267
        elif index_result:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   268
            # Extract index number
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   269
            index = int(index_result.groups()[0], 16)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   270
            # If index hasn't been referenced before, we add an entry into the dictionary
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   271
            if index not in eds_dict:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   272
                eds_dict[index] = values
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   273
                eds_dict[index]["subindexes"] = {}
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   274
            elif eds_dict[index].keys() == ["subindexes"]:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   275
                values["subindexes"] = eds_dict[index]["subindexes"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   276
                eds_dict[index] = values
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   277
            else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   278
                raise SyntaxError, "\"[%s]\" section is defined two times"%section_name
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   279
            is_entry = True
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   280
        # Third case, section name is a subindex name 
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   281
        elif subindex_result:
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   282
            # Extract index and subindex number
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   283
            index, subindex = [int(value, 16) for value in subindex_result.groups()]
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   284
            # If index hasn't been referenced before, we add an entry into the dictionary
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   285
            # that will be updated later
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   286
            if index not in eds_dict:
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   287
                eds_dict[index] = {"subindexes" : {}}
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   288
            if subindex not in eds_dict[index]["subindexes"]:
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   289
                eds_dict[index]["subindexes"][subindex] = values
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   290
            else:
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   291
                raise SyntaxError, "\"[%s]\" section is defined two times"%section_name
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   292
            is_entry = True
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   293
        # Third case, section name is a subindex name 
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   294
        elif index_objectlinks_result:
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   295
            pass
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   296
        # In any other case, there is a syntax problem into EDS file
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   297
        else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   298
            raise SyntaxError, "Section \"[%s]\" is unrecognized"%section_name
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   299
        
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   300
        for assignment in assignments:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   301
            # Escape any comment
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   302
            if assignment.startswith(";"):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   303
                pass
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   304
            # Verify that line is a valid assignment
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   305
            elif assignment.find('=') > 0:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   306
                # Split assignment into the two values keyname and value
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   307
                keyname, value = assignment.split("=", 1)
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   308
                
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   309
                # keyname must be immediately followed by the "=" sign, so we
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   310
                # verify that there is no whitespace into keyname
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   311
                if keyname.isalnum():
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   312
                    # value can be preceded and followed by whitespaces, so we escape them
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   313
                    value = value.strip()
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   314
                    # First case, value starts with "$NODEID", then it's a formula
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   315
                    if value.startswith("$NODEID"):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   316
                        try:
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   317
                            test = int(value.replace("$NODEID+", ""), 16)
299
506f9700b9fb Allowing user to type formulas
lbessard
parents: 258
diff changeset
   318
                            computed_value = "\"%s\""%value
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   319
                        except:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   320
                            raise SyntaxError, "\"%s\" is not a valid formula for attribute \"%s\" of section \"[%s]\""%(value, keyname, section_name)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   321
                    # Second case, value starts with "0x", then it's an hexadecimal value
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   322
                    elif value.startswith("0x") or value.startswith("-0x"):
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   323
                        try:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   324
                            computed_value = int(value, 16)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   325
                        except:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   326
                            raise SyntaxError, "\"%s\" is not a valid value for attribute \"%s\" of section \"[%s]\""%(value, keyname, section_name)
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   327
                    elif value.isdigit() or value.startswith("-") and value[1:].isdigit():
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   328
                        # Third case, value is a number and starts with "0", then it's an octal value
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   329
                        if value.startswith("0") or value.startswith("-0"):
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   330
                            computed_value = int(value, 8)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   331
                        # Forth case, value is a number and don't start with "0", then it's a decimal value
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   332
                        else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   333
                            computed_value = int(value)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   334
                    # In any other case, we keep string value
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   335
                    else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   336
                        computed_value = value
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   337
                    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   338
                    # Add value to values dictionary
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   339
                    if computed_value != "":
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   340
                        # If entry is an index or a subindex
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   341
                        if is_entry:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   342
                            # Verify that keyname is a possible attribute
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   343
                            if keyname.upper() not in ENTRY_ATTRIBUTES:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   344
                                raise SyntaxError, "Keyname \"%s\" not recognised for section \"[%s]\""%(keyname, section_name)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   345
                            # Verify that value is valid
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   346
                            elif not ENTRY_ATTRIBUTES[keyname.upper()](computed_value):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   347
                                raise SyntaxError, "Invalid value \"%s\" for keyname \"%s\" of section \"[%s]\""%(value, keyname, section_name)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   348
                            else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   349
                                values[keyname.upper()] = computed_value
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   350
                        else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   351
                            values[keyname.upper()] = computed_value
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   352
            # All lines that are not empty and are neither a comment neither not a valid assignment
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   353
            elif assignment.strip() != "":
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   354
                raise SyntaxError, "\"%s\" is not a valid EDS line"%assignment.strip()
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   355
        
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   356
        # If entry is an index or a subindex
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   357
        if is_entry:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   358
            # Verify that entry has an ObjectType
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   359
            if "OBJECTTYPE" in values.keys():
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   360
                # Extract entry ObjectType
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   361
                objecttype = values["OBJECTTYPE"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   362
            else:
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   363
                # Set ObjectType to VAR by default
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   364
                objecttype = 7
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   365
            # Extract parameters defined
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   366
            keys = Set(values.keys())
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   367
            keys.discard("subindexes")
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   368
            # Extract possible parameters and parameters required
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   369
            possible = Set(ENTRY_TYPES[objecttype]["require"] + ENTRY_TYPES[objecttype]["optional"])
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   370
            required = Set(ENTRY_TYPES[objecttype]["require"])
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   371
            # Verify that parameters defined contains all the parameters required
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   372
            if not keys.issuperset(required):
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   373
                missing = required.difference(keys)._data.keys()
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   374
                if len(missing) > 1:
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   375
                    attributes = "Attributes %s are"%", ".join(["\"%s\""%attribute for attribute in missing])
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   376
                else:
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   377
                    attributes = "Attribute \"%s\" is"%missing[0]
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   378
                raise SyntaxError, "Error on section \"[%s]\":\n%s required for a%s entry"%(section_name, attributes, ENTRY_TYPES[objecttype]["name"])
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   379
            # Verify that parameters defined are all in the possible parameters
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   380
            if not keys.issubset(possible):
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   381
                unsupported = keys.difference(possible)._data.keys()
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   382
                if len(unsupported) > 1:
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   383
                    attributes = "Attributes %s are"%", ".join(["\"%s\""%attribute for attribute in unsupported])
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   384
                else:
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   385
                    attributes = "Attribute \"%s\" is"%unsupported[0]
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   386
                raise SyntaxError, "Error on section \"[%s]\":\n%s unsupported for a%s entry"%(section_name, attributes, ENTRY_TYPES[objecttype]["name"])
227
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   387
            
323
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   388
            if "PARAMETERVALUE" in values:
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   389
                try:
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   390
                    if values["DATATYPE"] in (0x09, 0x0A, 0x0B, 0x0F):
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   391
                        values["PARAMETERVALUE"] = str(values["PARAMETERVALUE"])
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   392
                    elif values["DATATYPE"] in (0x08, 0x11):
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   393
                        values["PARAMETERVALUE"] = float(values["PARAMETERVALUE"])
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   394
                    elif values["DATATYPE"] == 0x01:
445
666f2cf93f06 Bug on Boolean values parsing while importing EDS fixed
lbessard
parents: 332
diff changeset
   395
                        values["PARAMETERVALUE"] = {0 : False, 1 : True}[values["PARAMETERVALUE"]]
323
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   396
                    else:
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   397
                        if type(values["PARAMETERVALUE"]) != IntType and values["PARAMETERVALUE"].find("$NODEID") == -1:
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   398
                            raise
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   399
                except:
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   400
                    raise SyntaxError, "Error on section \"[%s]\":\nParameterValue incompatible with DataType"%section_name
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   401
            
227
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   402
            if "DEFAULTVALUE" in values:
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   403
                try:
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   404
                    if values["DATATYPE"] in (0x09, 0x0A, 0x0B, 0x0F):
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   405
                        values["DEFAULTVALUE"] = str(values["DEFAULTVALUE"])
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   406
                    elif values["DATATYPE"] in (0x08, 0x11):
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   407
                        values["DEFAULTVALUE"] = float(values["DEFAULTVALUE"])
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   408
                    elif values["DATATYPE"] == 0x01:
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   409
                        values["DEFAULTVALUE"] = {0 : True, 1 : False}[values["DEFAULTVALUE"]]
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   410
                    else:
299
506f9700b9fb Allowing user to type formulas
lbessard
parents: 258
diff changeset
   411
                        if type(values["DEFAULTVALUE"]) != IntType and values["DEFAULTVALUE"].find("$NODEID") == -1:
227
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   412
                            raise
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   413
                except:
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   414
                    raise SyntaxError, "Error on section \"[%s]\":\nDefaultValue incompatible with DataType"%section_name
f76c64f66097 Bugs on cfile generation fixed
lbessard
parents: 226
diff changeset
   415
            
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   416
    return eds_dict
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   417
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   418
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   419
# Function that write an EDS file after generate it's content
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   420
def WriteFile(filepath, content):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   421
    # Open file in write mode
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   422
    cfile = open(filepath,"w")
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   423
    # Write content
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   424
    cfile.write(content)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   425
    # Close file
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   426
    cfile.close()
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   427
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   428
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   429
# Function that generate the EDS file content for the current node in the manager
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   430
def GenerateFileContent(Node, filepath):
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   431
    # Dictionary of each index contents
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   432
    indexContents = {}
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   433
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   434
    # Extract local time
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   435
    current_time = localtime()
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   436
    # Extract node informations
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   437
    nodename = Node.GetNodeName()
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   438
    nodeid = Node.GetNodeID()
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   439
    nodetype = Node.GetNodeType() 
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   440
    description = Node.GetNodeDescription()
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   441
    
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   442
    # Retreiving lists of indexes defined
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   443
    entries = Node.GetIndexes()
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   444
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   445
    # Generate FileInfo section
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   446
    fileContent = "[FileInfo]\n"
258
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   447
    fileContent += "FileName=%s\n"%os.path.split(filepath)[-1]
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   448
    fileContent += "FileVersion=1\n"
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   449
    fileContent += "FileRevision=1\n"
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   450
    fileContent += "EDSVersion=4.0\n"
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   451
    fileContent += "Description=%s\n"%description
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   452
    fileContent += "CreationTime=%s"%strftime("%I:%M", current_time)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   453
    # %p option of strftime seems not working, then generate AM/PM by hands
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   454
    if strftime("%I", current_time) == strftime("%H", current_time):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   455
        fileContent += "AM\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   456
    else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   457
        fileContent += "PM\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   458
    fileContent += "CreationDate=%s\n"%strftime("%m-%d-%Y", current_time)
258
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   459
    fileContent += "CreatedBy=CANFestival\n"
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   460
    fileContent += "ModificationTime=%s"%strftime("%I:%M", current_time)
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   461
    # %p option of strftime seems not working, then generate AM/PM by hands
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   462
    if strftime("%I", current_time) == strftime("%H", current_time):
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   463
        fileContent += "AM\n"
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   464
    else:
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   465
        fileContent += "PM\n"
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   466
    fileContent += "ModificationDate=%s\n"%strftime("%m-%d-%Y", current_time)
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   467
    fileContent += "ModifiedBy=CANFestival\n"
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   468
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   469
    # Generate DeviceInfo section
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   470
    fileContent += "\n[DeviceInfo]\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   471
    fileContent += "VendorName=CANFestival\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   472
    # Use information typed by user in Identity entry
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   473
    fileContent += "VendorNumber=0x%8.8X\n"%Node.GetEntry(0x1018, 1)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   474
    fileContent += "ProductName=%s\n"%nodename
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   475
    fileContent += "ProductNumber=0x%8.8X\n"%Node.GetEntry(0x1018, 2)
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   476
    fileContent += "RevisionNumber=0x%8.8X\n"%Node.GetEntry(0x1018, 3)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   477
    # CANFestival support all baudrates as soon as driver choosen support them
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   478
    fileContent += "BaudRate_10=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   479
    fileContent += "BaudRate_20=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   480
    fileContent += "BaudRate_50=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   481
    fileContent += "BaudRate_125=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   482
    fileContent += "BaudRate_250=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   483
    fileContent += "BaudRate_500=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   484
    fileContent += "BaudRate_800=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   485
    fileContent += "BaudRate_1000=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   486
    # Select BootUp type from the informations given by user
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   487
    fileContent += "SimpleBootUpMaster=%s\n"%BOOL_TRANSLATE[nodetype == "master"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   488
    fileContent += "SimpleBootUpSlave=%s\n"%BOOL_TRANSLATE[nodetype == "slave"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   489
    # CANFestival characteristics
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   490
    fileContent += "Granularity=8\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   491
    fileContent += "DynamicChannelsSupported=0\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   492
    fileContent += "CompactPDO=0\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   493
    fileContent += "GroupMessaging=0\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   494
    # Calculate receive and tranmit PDO numbers with the entry available
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   495
    fileContent += "NrOfRXPDO=%d\n"%len([idx for idx in entries if 0x1400 <= idx <= 0x15FF])
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   496
    fileContent += "NrOfTXPDO=%d\n"%len([idx for idx in entries if 0x1800 <= idx <= 0x19FF])
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   497
    # LSS not supported as soon as DS-302 was not fully implemented
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   498
    fileContent += "LSS_Supported=0\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   499
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   500
    # Generate Dummy Usage section
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   501
    fileContent += "\n[DummyUsage]\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   502
    fileContent += "Dummy0001=0\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   503
    fileContent += "Dummy0002=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   504
    fileContent += "Dummy0003=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   505
    fileContent += "Dummy0004=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   506
    fileContent += "Dummy0005=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   507
    fileContent += "Dummy0006=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   508
    fileContent += "Dummy0007=1\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   509
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   510
    # Generate Comments section
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   511
    fileContent += "\n[Comments]\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   512
    fileContent += "Lines=0\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   513
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   514
    # List of entry by type (Mandatory, Optional or Manufacturer
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   515
    mandatories = []
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   516
    optionals = []
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   517
    manufacturers = []
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   518
    
492
b919a24a45cb Fixed automatic SDO server creation for slave
etisserant
parents: 489
diff changeset
   519
    # Remove all unused PDO
b919a24a45cb Fixed automatic SDO server creation for slave
etisserant
parents: 489
diff changeset
   520
    for entry in entries[:]:
b919a24a45cb Fixed automatic SDO server creation for slave
etisserant
parents: 489
diff changeset
   521
        if 0x1600 <= entry < 0x1800 or 0x1A00 <= entry < 0x1C00:
b919a24a45cb Fixed automatic SDO server creation for slave
etisserant
parents: 489
diff changeset
   522
            subentry_value = Node.GetEntry(entry, 1)
b919a24a45cb Fixed automatic SDO server creation for slave
etisserant
parents: 489
diff changeset
   523
            if subentry_value is None or subentry_value == 0:
b919a24a45cb Fixed automatic SDO server creation for slave
etisserant
parents: 489
diff changeset
   524
                entries.remove(entry)
b919a24a45cb Fixed automatic SDO server creation for slave
etisserant
parents: 489
diff changeset
   525
                entries.remove(entry - 0x200)
b919a24a45cb Fixed automatic SDO server creation for slave
etisserant
parents: 489
diff changeset
   526
                
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   527
    # For each entry, we generate the entry section or sections if there is subindexes
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   528
    for entry in entries:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   529
        # Extract infos and values for the entry
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   530
        entry_infos = Node.GetEntryInfos(entry)
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   531
        values = Node.GetEntry(entry, compute = False)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   532
        # Define section name
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   533
        text = "\n[%X]\n"%entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   534
        # If there is only one value, it's a VAR entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   535
        if type(values) != ListType:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   536
            # Extract the informations of the first subindex
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   537
            subentry_infos = Node.GetSubentryInfos(entry, 0)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   538
            # Generate EDS informations for the entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   539
            text += "ParameterName=%s\n"%subentry_infos["name"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   540
            text += "ObjectType=0x7\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   541
            text += "DataType=0x%4.4X\n"%subentry_infos["type"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   542
            text += "AccessType=%s\n"%subentry_infos["access"]
445
666f2cf93f06 Bug on Boolean values parsing while importing EDS fixed
lbessard
parents: 332
diff changeset
   543
            if subentry_infos["type"] == 1:
666f2cf93f06 Bug on Boolean values parsing while importing EDS fixed
lbessard
parents: 332
diff changeset
   544
                text += "DefaultValue=%s\n"%BOOL_TRANSLATE[values]
666f2cf93f06 Bug on Boolean values parsing while importing EDS fixed
lbessard
parents: 332
diff changeset
   545
            else:
666f2cf93f06 Bug on Boolean values parsing while importing EDS fixed
lbessard
parents: 332
diff changeset
   546
                text += "DefaultValue=%s\n"%values
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   547
            text += "PDOMapping=%s\n"%BOOL_TRANSLATE[subentry_infos["pdo"]]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   548
        else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   549
            # Generate EDS informations for the entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   550
            text += "ParameterName=%s\n"%entry_infos["name"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   551
            if entry_infos["struct"] & node.OD_IdenticalSubindexes:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   552
                text += "ObjectType=0x9\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   553
            else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   554
                text += "ObjectType=0x8\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   555
            
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   556
            # Generate EDS informations for subindexes of the entry in a separate text
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   557
            subtext = ""
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   558
            # Reset number of subindex defined 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   559
            nb_subentry = 0
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   560
            for subentry, value in enumerate(values):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   561
                # Extract the informations of each subindex
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   562
                subentry_infos = Node.GetSubentryInfos(entry, subentry)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   563
                # If entry is not for the compatibility, generate informations for subindex
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   564
                if subentry_infos["name"] != "Compatibility Entry":
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   565
                    subtext += "\n[%Xsub%X]\n"%(entry, subentry)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   566
                    subtext += "ParameterName=%s\n"%subentry_infos["name"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   567
                    subtext += "ObjectType=0x7\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   568
                    subtext += "DataType=0x%4.4X\n"%subentry_infos["type"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   569
                    subtext += "AccessType=%s\n"%subentry_infos["access"]
445
666f2cf93f06 Bug on Boolean values parsing while importing EDS fixed
lbessard
parents: 332
diff changeset
   570
                    if subentry_infos["type"] == 1:
666f2cf93f06 Bug on Boolean values parsing while importing EDS fixed
lbessard
parents: 332
diff changeset
   571
                        subtext += "DefaultValue=%s\n"%BOOL_TRANSLATE[value]
666f2cf93f06 Bug on Boolean values parsing while importing EDS fixed
lbessard
parents: 332
diff changeset
   572
                    else:
666f2cf93f06 Bug on Boolean values parsing while importing EDS fixed
lbessard
parents: 332
diff changeset
   573
                        subtext += "DefaultValue=%s\n"%value
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   574
                    subtext += "PDOMapping=%s\n"%BOOL_TRANSLATE[subentry_infos["pdo"]]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   575
                    # Increment number of subindex defined 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   576
                    nb_subentry += 1
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   577
            # Write number of subindex defined for the entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   578
            text += "SubNumber=%d\n"%nb_subentry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   579
            # Write subindex definitions
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   580
            text += subtext
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   581
        
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   582
        # Then we add the entry in the right list
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   583
        
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   584
        # First case, entry is between 0x2000 and 0x5FFF, then it's a manufacturer entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   585
        if 0x2000 <= entry <= 0x5FFF:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   586
            manufacturers.append(entry)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   587
        # Second case, entry is required, then it's a mandatory entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   588
        elif entry_infos["need"]:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   589
            mandatories.append(entry)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   590
        # In any other case, it's an optional entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   591
        else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   592
            optionals.append(entry)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   593
        # Save text of the entry in the dictiionary of contents
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   594
        indexContents[entry] = text
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   595
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   596
    # Before generate File Content we sort the entry list
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   597
    manufacturers.sort()
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   598
    mandatories.sort()
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   599
    optionals.sort()
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   600
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   601
    # Generate Definition of mandatory objects
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   602
    fileContent += "\n[MandatoryObjects]\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   603
    fileContent += "SupportedObjects=%d\n"%len(mandatories)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   604
    for idx, entry in enumerate(mandatories):
258
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   605
        fileContent += "%d=0x%4.4X\n"%(idx + 1, entry)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   606
    # Write mandatory entries
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   607
    for entry in mandatories:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   608
        fileContent += indexContents[entry]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   609
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   610
    # Generate Definition of optional objects
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   611
    fileContent += "\n[OptionalObjects]\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   612
    fileContent += "SupportedObjects=%d\n"%len(optionals)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   613
    for idx, entry in enumerate(optionals):
258
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   614
        fileContent += "%d=0x%4.4X\n"%(idx + 1, entry)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   615
    # Write optional entries
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   616
    for entry in optionals:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   617
        fileContent += indexContents[entry]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   618
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   619
    # Generate Definition of manufacturer objects
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   620
    fileContent += "\n[ManufacturerObjects]\n"
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   621
    fileContent += "SupportedObjects=%d\n"%len(manufacturers)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   622
    for idx, entry in enumerate(manufacturers):
258
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   623
        fileContent += "%d=0x%4.4X\n"%(idx + 1, entry)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   624
    # Write manufacturer entries
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   625
    for entry in manufacturers:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   626
        fileContent += indexContents[entry]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   627
    
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   628
    # Return File Content
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   629
    return fileContent
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   630
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   631
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   632
# Function that generates EDS file from current node edited
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   633
def GenerateEDSFile(filepath, node):
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   634
    try:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   635
        # Generate file content
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   636
        content = GenerateFileContent(node, filepath)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   637
        # Write file
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   638
        WriteFile(filepath, content)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   639
        return None
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   640
    except ValueError, message:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   641
        return "Unable to generate EDS file\n%s"%message
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   642
    
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   643
# Function that generate the CPJ file content for the nodelist
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   644
def GenerateCPJContent(nodelist):
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   645
    nodes = nodelist.SlaveNodes.keys()
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   646
    nodes.sort()
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   647
    
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   648
    fileContent = "[TOPOLOGY]\n"
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   649
    fileContent += "NetName=%s\n"%nodelist.GetNetworkName()
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   650
    fileContent += "Nodes=0x%2.2X\n"%len(nodes)
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   651
    
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   652
    for nodeid in nodes:
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   653
        fileContent += "Node%dPresent=0x01\n"%nodeid
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   654
        fileContent += "Node%dName=%s\n"%(nodeid, nodelist.SlaveNodes[nodeid]["Name"])
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   655
        fileContent += "Node%dDCFName=%s\n"%(nodeid, nodelist.SlaveNodes[nodeid]["EDS"])
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   656
        
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   657
    fileContent += "EDSBaseName=eds\n"
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   658
    return fileContent
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   659
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   660
# Function that generates Node from an EDS file
258
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   661
def GenerateNode(filepath, nodeID = 0):
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   662
    # Create a new node
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   663
    Node = node.Node(id = nodeID)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   664
    try:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   665
        # Parse file and extract dictionary of EDS entry
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   666
        eds_dict = ParseEDSFile(filepath)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   667
        # Extract Profile Number from Device Type entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   668
        ProfileNb = eds_dict[0x1000]["DEFAULTVALUE"] & 0x0000ffff
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   669
        # If profile is not DS-301 or DS-302
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   670
        if ProfileNb not in [301, 302]:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   671
            # Compile Profile name and path to .prf file
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   672
            ProfileName = "DS-%d"%ProfileNb
258
8f7725451453 Some bugs fixed:
lbessard
parents: 227
diff changeset
   673
            ProfilePath = os.path.join(os.path.split(__file__)[0], "config/%s.prf"%ProfileName)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   674
            # Verify that profile is available
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   675
            if os.path.isfile(ProfilePath):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   676
                try:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   677
                    # Load Profile
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   678
                    execfile(ProfilePath)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   679
                    Node.SetProfileName(ProfileName)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   680
                    Node.SetProfile(Mapping)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   681
                    Node.SetSpecificMenu(AddMenuEntries)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   682
                except:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   683
                    pass
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   684
        # Read all entries in the EDS dictionary 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   685
        for entry, values in eds_dict.items():
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   686
            # All sections with a name in keynames are escaped
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   687
            if entry in SECTION_KEYNAMES:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   688
                pass
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   689
            else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   690
                # Extract informations for the entry
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   691
                entry_infos = Node.GetEntryInfos(entry)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   692
                
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   693
                # If no informations are available, then we write them
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   694
                if not entry_infos:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   695
                    # First case, entry is a VAR
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   696
                    if values["OBJECTTYPE"] == 7:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   697
                        # Add mapping for entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   698
                        Node.AddMappingEntry(entry, name = values["PARAMETERNAME"], struct = 1)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   699
                        # Add mapping for first subindex
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   700
                        Node.AddMappingEntry(entry, 0, values = {"name" : values["PARAMETERNAME"], 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   701
                                                                 "type" : values["DATATYPE"], 
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   702
                                                                 "access" : ACCESS_TRANSLATE[values["ACCESSTYPE"].upper()], 
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   703
                                                                 "pdo" : values.get("PDOMAPPING", 0) == 1})
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   704
                    # Second case, entry is an ARRAY or RECORD
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   705
                    elif values["OBJECTTYPE"] in [8, 9]:
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   706
                        # Extract maximum subindex number defined
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   707
                        try:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   708
                            max_subindex = values["subindexes"][0]["DEFAULTVALUE"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   709
                        except:
332
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   710
                            max_subindex = max(*values["subindexes"].keys())
97a7a0538dd1 Improving eds parse
lbessard
parents: 323
diff changeset
   711
                            #raise SyntaxError, "Error on entry 0x%4.4X:\nSubindex 0 must be defined for an ARRAY or RECORD entry"%entry
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   712
                        # Add mapping for entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   713
                        Node.AddMappingEntry(entry, name = values["PARAMETERNAME"], struct = 3)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   714
                        # Add mapping for first subindex
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   715
                        Node.AddMappingEntry(entry, 0, values = {"name" : "Number of Entries", "type" : 0x05, "access" : "ro", "pdo" : False})
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   716
                        # Add mapping for other subindexes
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   717
                        for subindex in xrange(1, int(max_subindex) + 1):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   718
                            # if subindex is defined
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   719
                            if subindex in values["subindexes"]:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   720
                                Node.AddMappingEntry(entry, subindex, values = {"name" : values["subindexes"][subindex]["PARAMETERNAME"], 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   721
                                                                                "type" : values["subindexes"][subindex]["DATATYPE"], 
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   722
                                                                                "access" : ACCESS_TRANSLATE[values["subindexes"][subindex]["ACCESSTYPE"].upper()], 
226
abf63d732a84 Bug on EDS file parsing fixed
lbessard
parents: 206
diff changeset
   723
                                                                                "pdo" : values["subindexes"][subindex].get("PDOMAPPING", 0) == 1})
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   724
                            # if not, we add a mapping for compatibility 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   725
                            else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   726
                                Node.AddMappingEntry(entry, subindex, values = {"name" : "Compatibility Entry", "type" : 0x05, "access" : "rw", "pdo" : False})
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   727
##                    # Third case, entry is an RECORD
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   728
##                    elif values["OBJECTTYPE"] == 9:
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   729
##                        # Verify that the first subindex is defined
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   730
##                        if 0 not in values["subindexes"]:
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   731
##                            raise SyntaxError, "Error on entry 0x%4.4X:\nSubindex 0 must be defined for a RECORD entry"%entry
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   732
##                        # Add mapping for entry
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   733
##                        Node.AddMappingEntry(entry, name = values["PARAMETERNAME"], struct = 7)
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   734
##                        # Add mapping for first subindex
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   735
##                        Node.AddMappingEntry(entry, 0, values = {"name" : "Number of Entries", "type" : 0x05, "access" : "ro", "pdo" : False})
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   736
##                        # Verify that second subindex is defined
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   737
##                        if 1 in values["subindexes"]:
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   738
##                            Node.AddMappingEntry(entry, 1, values = {"name" : values["PARAMETERNAME"] + " %d[(sub)]", 
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   739
##                                                                     "type" : values["subindexes"][1]["DATATYPE"], 
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   740
##                                                                     "access" : ACCESS_TRANSLATE[values["subindexes"][1]["ACCESSTYPE"].upper()], 
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   741
##                                                                     "pdo" : values["subindexes"][1].get("PDOMAPPING", 0) == 1,
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   742
##                                                                     "nbmax" : 0xFE})
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   743
##                        else:
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   744
##                            raise SyntaxError, "Error on entry 0x%4.4X:\nA RECORD entry must have at least 2 subindexes"%entry
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   745
                
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   746
                # Define entry for the new node
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   747
                
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   748
                # First case, entry is a VAR
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   749
                if values["OBJECTTYPE"] == 7:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   750
                    # Take default value if it is defined
323
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   751
                    if "PARAMETERVALUE" in values:
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   752
                        value = values["PARAMETERVALUE"]
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   753
                    elif "DEFAULTVALUE" in values:
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   754
                        value = values["DEFAULTVALUE"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   755
                    # Find default value for value type of the entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   756
                    else:
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   757
                        value = GetDefaultValue(Node, entry)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   758
                    Node.AddEntry(entry, 0, value)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   759
                # Second case, entry is an ARRAY or a RECORD
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   760
                elif values["OBJECTTYPE"] in (8, 9):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   761
                    # Verify that "Subnumber" attribute is defined and has a valid value
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   762
                    if "SUBNUMBER" in values and values["SUBNUMBER"] > 0:
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   763
                        consecutive = False
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   764
                        # Extract maximum subindex number defined
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   765
                        try:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   766
                            max_subindex = values["subindexes"][0]["DEFAULTVALUE"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   767
                        except:
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   768
                            max_subindex = values["SUBNUMBER"] - 1
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   769
                            consecutive = True
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   770
                            #raise SyntaxError, "Error on entry 0x%4.4X:\nSubindex 0 must be defined for an ARRAY or a RECORD entry"%entry
299
506f9700b9fb Allowing user to type formulas
lbessard
parents: 258
diff changeset
   771
                        Node.AddEntry(entry, value = [])
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   772
                        # Define value for all subindexes except the first 
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   773
                        for subindex in xrange(1, int(max_subindex) + 1):
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   774
                            # Take default value if it is defined and entry is defined
323
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   775
                            if subindex in values["subindexes"] and "PARAMETERVALUE" in values["subindexes"][subindex]:
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   776
                                value = values["subindexes"][subindex]["PARAMETERVALUE"]
4df7e6d2d1db Adding "ParameterValue" as optional parameter for "VAR" entries
lbessard
parents: 309
diff changeset
   777
                            elif subindex in values["subindexes"] and "DEFAULTVALUE" in values["subindexes"][subindex]:
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   778
                                value = values["subindexes"][subindex]["DEFAULTVALUE"]
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   779
                            # Find default value for value type of the subindex
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   780
                            elif subindex in values["subindexes"] or not consecutive:
489
cfba6bf99701 Modification for generating eds file from a node instead of a manager
lbessard
parents: 445
diff changeset
   781
                                value = GetDefaultValue(Node, entry, subindex)
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   782
                            else:
309
5d08887347a9 Bugs on EDS import fixed
lbessard
parents: 305
diff changeset
   783
                                raise SyntaxError, "Error on entry 0x%4.4X:\nCan't recompose implemented subindexes in this ARRAY or RECORD entry"%entry
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   784
                            Node.AddEntry(entry, subindex, value)
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   785
                    else:
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   786
                        raise SyntaxError, "Array or Record entry 0x%4.4X must have a \"SubNumber\" attribute"%entry
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   787
        return Node
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   788
    except SyntaxError, message:
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   789
        return "Unable to import EDS file\n%s"%message
182
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   790
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   791
#-------------------------------------------------------------------------------
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   792
#                             Main Function
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   793
#-------------------------------------------------------------------------------
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   794
988f2b302aa6 Adding support for importing and exporting EDS files
lbessard
parents:
diff changeset
   795
if __name__ == '__main__':
205
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   796
    print ParseEDSFile("examples/PEAK MicroMod.eds")
dac0f9b4e3f8 Adding program for network management
lbessard
parents: 182
diff changeset
   797