canfestival/config_utils.py
author Edouard Tisserant
Fri, 19 Jun 2015 23:36:35 +0200
changeset 1468 7df108e8cb18
parent 1278 74afc7e86d00
child 1571 486f94a8032c
permissions -rw-r--r--
Merged
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
     1
#!/usr/bin/env python
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
     3
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
     4
#This file is part of Beremiz, a Integrated Development Environment for
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
     5
#programming IEC 61131-3 automates supporting plcopen standard and CanFestival. 
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
     6
#
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
     7
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
     8
#
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
     9
#See COPYING file for copyrights details.
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    10
#
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    11
#This library is free software; you can redistribute it and/or
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    12
#modify it under the terms of the GNU General Public
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    13
#License as published by the Free Software Foundation; either
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    14
#version 2.1 of the License, or (at your option) any later version.
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    15
#
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    16
#This library is distributed in the hope that it will be useful,
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    17
#but WITHOUT ANY WARRANTY; without even the implied warranty of
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    18
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    19
#General Public License for more details.
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    20
#
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    21
#You should have received a copy of the GNU General Public
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    22
#License along with this library; if not, write to the Free Software
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    23
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    24
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    25
from types import *
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    26
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    27
# Translation between IEC types and Can Open types
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    28
IECToCOType = {"BOOL":0x01, "SINT":0x02, "INT":0x03,"DINT":0x04,"LINT":0x10,
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    29
               "USINT":0x05,"UINT":0x06,"UDINT":0x07,"ULINT":0x1B,"REAL":0x08,
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    30
               "LREAL":0x11,"STRING":0x09,"BYTE":0x05,"WORD":0x06,"DWORD":0x07,
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    31
               "LWORD":0x1B,"WSTRING":0x0B}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    32
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    33
# Constants for PDO types 
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    34
RPDO = 1
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    35
TPDO = 2
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    36
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    37
SlavePDOType = {"I" : TPDO, "Q" : RPDO}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    38
InvertPDOType = {RPDO : TPDO, TPDO : RPDO}
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    39
PDOTypeBaseIndex = {RPDO : 0x1400, TPDO : 0x1800}
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    40
PDOTypeBaseCobId = {RPDO : 0x200, TPDO : 0x180}
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    41
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    42
VariableIncrement = 0x100
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    43
VariableStartIndex = {TPDO : 0x2000, RPDO : 0x4000}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    44
VariableDirText = {TPDO : "__I", RPDO : "__Q"}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    45
VariableTypeOffset = dict(zip(["","X","B","W","D","L"], range(6)))
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    46
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    47
TrashVariables = [(1, 0x01), (8, 0x05), (16, 0x06), (32, 0x07), (64, 0x1B)]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    48
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    49
#-------------------------------------------------------------------------------
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    50
#                  Specific exception for PDO mapping errors
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    51
#-------------------------------------------------------------------------------
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    52
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    53
class PDOmappingException(Exception):
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    54
    pass
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    55
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
    56
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    57
def LE_to_BE(value, size):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    58
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    59
    Convert Little Endian to Big Endian
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    60
    @param value: value expressed in integer
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    61
    @param size: number of bytes generated
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    62
    @return: a string containing the value converted
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    63
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    64
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    65
    data = ("%" + str(size * 2) + "." + str(size * 2) + "X") % value
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    66
    list_car = [data[i:i+2] for i in xrange(0, len(data), 2)]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    67
    list_car.reverse()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    68
    return "".join([chr(int(car, 16)) for car in list_car])
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    69
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    70
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    71
def GetNodePDOIndexes(node, type, parameters = False):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    72
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    73
    Find the PDO indexes of a node
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    74
    @param node: node 
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    75
    @param type: type of PDO searched (RPDO or TPDO or both)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    76
    @param parameters: indicate which indexes are expected (PDO paramaters : True or PDO mappings : False)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    77
    @return: a list of indexes found
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    78
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    79
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    80
    indexes = []
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    81
    if type & RPDO:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    82
        indexes.extend([idx for idx in node.GetIndexes() if 0x1400 <= idx <= 0x15FF])
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    83
    if type & TPDO:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    84
        indexes.extend([idx for idx in node.GetIndexes() if 0x1800 <= idx <= 0x19FF])
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    85
    if not parameters:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    86
        return [idx + 0x200 for idx in indexes]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    87
    else:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    88
        return indexes
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    89
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    90
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    91
def SearchNodePDOMapping(loc_infos, node):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    92
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    93
    Find the PDO indexes of a node
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    94
    @param node: node 
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    95
    @param type: type of PDO searched (RPDO or TPDO or both)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    96
    @param parameters: indicate which indexes are expected (PDO paramaters : True or PDO mappings : False)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    97
    @return: a list of indexes found
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    98
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
    99
    
270
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   100
    model = (loc_infos["index"] << 16) + (loc_infos["subindex"] << 8)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   101
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   102
    for PDOidx in GetNodePDOIndexes(node, loc_infos["pdotype"]):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   103
        values = node.GetEntry(PDOidx)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   104
        if values != None:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   105
            for subindex, mapping in enumerate(values):
270
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   106
                if subindex != 0 and mapping & 0xFFFFFF00 == model:
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   107
                    return PDOidx, subindex
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   108
    return None
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   109
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   110
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   111
def GeneratePDOMappingDCF(idx, cobid, transmittype, pdomapping):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   112
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   113
    Build concise DCF value for configuring a PDO
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   114
    @param idx: index of PDO parameters
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   115
    @param cobid: PDO generated COB ID
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   116
    @param transmittype : PDO transmit type
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   117
    @param pdomapping: list of PDO mappings
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   118
    @return: a tuple of value and number of parameters to add to DCF 
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   119
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   120
    
1278
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   121
    dcfdata=[]
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   122
    # Create entry for RPDO or TPDO parameters and Disable PDO
1278
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   123
    #           ---- INDEX -----   --- SUBINDEX ----   ----- SIZE ------   ------ DATA ------
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   124
    dcfdata += [LE_to_BE(idx, 2) + LE_to_BE(0x01, 1) + LE_to_BE(0x04, 4) + LE_to_BE(0x80000000 + cobid, 4)]
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   125
    # Set Transmit type
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   126
    dcfdata += [LE_to_BE(idx, 2) + LE_to_BE(0x02, 1) + LE_to_BE(0x01, 4) + LE_to_BE(transmittype, 1)]
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   127
    if len(pdomapping) > 0:
1278
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   128
        # Disable Mapping
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   129
        dcfdata += [LE_to_BE(idx + 0x200, 2) + LE_to_BE(0x00, 1) + LE_to_BE(0x01, 4) + LE_to_BE(0x00, 1)]
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   130
        # Map Variables
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   131
        for subindex, (name, loc_infos) in enumerate(pdomapping):
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   132
            value = (loc_infos["index"] << 16) + (loc_infos["subindex"] << 8) + loc_infos["size"]
1278
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   133
            dcfdata += [LE_to_BE(idx + 0x200, 2) + LE_to_BE(subindex + 1, 1) + LE_to_BE(0x04, 4) + LE_to_BE(value, 4)]
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   134
        # Re-enable Mapping
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   135
        dcfdata += [LE_to_BE(idx + 0x200, 2) + LE_to_BE(0x00, 1) + LE_to_BE(0x01, 4) + LE_to_BE(len(pdomapping), 1)]
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   136
    # Re-Enable PDO
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   137
    dcfdata += [LE_to_BE(idx, 2) + LE_to_BE(0x01, 1) + LE_to_BE(0x04, 4) + LE_to_BE(cobid, 4)]
74afc7e86d00 CanFestival plugin fills master's DCF to prepare PDO mappings in a way conform to DSP-301
Edouard Tisserant
parents: 721
diff changeset
   138
    return "".join(dcfdata), len(dcfdata)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   139
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   140
class ConciseDCFGenerator:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   141
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   142
    def __init__(self, nodelist, nodename):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   143
        # Dictionary of location informations classed by name
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   144
        self.IECLocations = {}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   145
        # Dictionary of location that have not been mapped yet
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   146
        self.LocationsNotMapped = {}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   147
        # Dictionary of location informations classed by name
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   148
        self.MasterMapping = {}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   149
        # List of COB IDs available
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   150
        self.ListCobIDAvailable = range(0x180, 0x580)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   151
        # Dictionary of mapping value where unexpected variables are stored
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   152
        self.TrashVariables = {}
163
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   153
        # Dictionary of pointed variables
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   154
        self.PointedVariables = {}
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   155
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   156
        self.NodeList = nodelist
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   157
        self.Manager = self.NodeList.Manager
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   158
        self.MasterNode = self.Manager.GetCurrentNodeCopy()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   159
        self.MasterNode.SetNodeName(nodename)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   160
        self.PrepareMasterNode()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   161
163
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   162
    def GetPointedVariables(self):
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   163
        return self.PointedVariables
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   164
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   165
    def RemoveUsedNodeCobId(self, node):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   166
        """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   167
        Remove all PDO COB ID used by the given node from the list of available COB ID
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   168
        @param node: node
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   169
        @return: a tuple of number of RPDO and TPDO for the node
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   170
        """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   171
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   172
        # Get list of all node TPDO and RPDO indexes
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   173
        nodeRpdoIndexes = GetNodePDOIndexes(node, RPDO, True)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   174
        nodeTpdoIndexes = GetNodePDOIndexes(node, TPDO, True)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   175
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   176
        # Mark all the COB ID of the node already mapped PDO as not available
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   177
        for PdoIdx in nodeRpdoIndexes + nodeTpdoIndexes:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   178
            pdo_cobid = node.GetEntry(PdoIdx, 0x01)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   179
            # Extract COB ID, if PDO isn't active
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   180
            if pdo_cobid > 0x600 :
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   181
                pdo_cobid -= 0x80000000
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   182
            # Remove COB ID from the list of available COB ID
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   183
            if pdo_cobid in self.ListCobIDAvailable:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   184
                self.ListCobIDAvailable.remove(pdo_cobid)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   185
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   186
        return len(nodeRpdoIndexes), len(nodeTpdoIndexes)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   187
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   188
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   189
    def PrepareMasterNode(self):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   190
        """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   191
        Add mandatory entries for DCF generation into MasterNode.
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   192
        """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   193
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   194
        # Adding DCF entry into Master node
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   195
        if not self.MasterNode.IsEntry(0x1F22):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   196
            self.MasterNode.AddEntry(0x1F22, 1, "")
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   197
        self.Manager.AddSubentriesToCurrent(0x1F22, 127, self.MasterNode)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   198
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   199
        # Adding trash mappable variables for unused mapped datas
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   200
        idxTrashVariables = 0x2000 + self.MasterNode.GetNodeID()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   201
        # Add an entry for storing unexpected all variable
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   202
        self.Manager.AddMapVariableToCurrent(idxTrashVariables, self.MasterNode.GetNodeName()+"_trashvariables", 3, len(TrashVariables), self.MasterNode)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   203
        for subidx, (size, typeidx) in enumerate(TrashVariables):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   204
            # Add a subentry for storing unexpected variable of this size
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   205
            self.Manager.SetCurrentEntry(idxTrashVariables, subidx + 1, "TRASH%d" % size, "name", None, self.MasterNode)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   206
            self.Manager.SetCurrentEntry(idxTrashVariables, subidx + 1, typeidx, "type", None, self.MasterNode)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   207
            # Store the mapping value for this entry
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   208
            self.TrashVariables[size] = (idxTrashVariables << 16) + ((subidx + 1) << 8) + size
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   209
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   210
        RPDOnumber, TPDOnumber = self.RemoveUsedNodeCobId(self.MasterNode)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   211
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   212
        # Store the indexes of the first RPDO and TPDO available for MasterNode
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   213
        self.CurrentPDOParamsIdx = {RPDO : 0x1400 + RPDOnumber, TPDO : 0x1800 + TPDOnumber}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   214
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   215
        # Prepare MasterNode with all nodelist slaves
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   216
        for idx, (nodeid, nodeinfos) in enumerate(self.NodeList.SlaveNodes.items()):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   217
            node = nodeinfos["Node"]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   218
            node.SetNodeID(nodeid)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   219
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   220
            RPDOnumber, TPDOnumber = self.RemoveUsedNodeCobId(node)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   221
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   222
            # Get Slave's default SDO server parameters
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   223
            RSDO_cobid = node.GetEntry(0x1200,0x01)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   224
            if not RSDO_cobid:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   225
                RSDO_cobid = 0x600 + nodeid
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   226
            TSDO_cobid = node.GetEntry(0x1200,0x02)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   227
            if not TSDO_cobid:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   228
                TSDO_cobid = 0x580 + nodeid
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   229
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   230
            # Configure Master's SDO parameters entries
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   231
            self.Manager.ManageEntriesOfCurrent([0x1280 + idx], [], self.MasterNode)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   232
            self.MasterNode.SetEntry(0x1280 + idx, 0x01, RSDO_cobid)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   233
            self.MasterNode.SetEntry(0x1280 + idx, 0x02, TSDO_cobid)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   234
            self.MasterNode.SetEntry(0x1280 + idx, 0x03, nodeid)        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   235
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   236
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   237
    def GetMasterNode(self):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   238
        """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   239
        Return MasterNode.
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   240
        """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   241
        return self.MasterNode
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   242
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   243
    def AddParamsToDCF(self, nodeid, data, nbparams):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   244
        """
155
515f3fbd1173 Fixed typos in config_utils comments
etisserant
parents: 150
diff changeset
   245
        Add entry to DCF, for the requested nodeID
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   246
        @param nodeid: id of the slave (int)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   247
        @param data: data to add to slave DCF (string)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   248
        @param nbparams: number of params added to slave DCF (int)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   249
        """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   250
        # Get current DCF for slave
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   251
        nodeDCF = self.MasterNode.GetEntry(0x1F22, nodeid)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   252
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   253
        # Extract data and number of params in current DCF
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   254
        if nodeDCF != None and nodeDCF != '':
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   255
            tmpnbparams = [i for i in nodeDCF[:4]]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   256
            tmpnbparams.reverse()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   257
            nbparams += int(''.join(["%2.2x"%ord(i) for i in tmpnbparams]), 16)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   258
            data = nodeDCF[4:] + data
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   259
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   260
        # Build new DCF
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   261
        dcf = LE_to_BE(nbparams, 0x04) + data
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   262
        # Set new DCF for slave
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   263
        self.MasterNode.SetEntry(0x1F22, nodeid, dcf)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   264
    
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   265
    def GetEmptyPDO(self, nodeid, pdotype, start_index=None):
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   266
        """
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   267
        Search a not configured PDO for a slave
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   268
        @param node: the slave node object
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   269
        @param pdotype: type of PDO to generated (RPDO or TPDO)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   270
        @param start_index: Index where search must start (default: None)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   271
        @return tuple of PDO index, COB ID and number of subindex defined
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   272
        """
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   273
        # If no start_index defined, start with PDOtype base index
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   274
        if start_index is None:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   275
            index = PDOTypeBaseIndex[pdotype]
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   276
        else:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   277
            index = start_index
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   278
        
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   279
        # Search for all PDO possible index until find a configurable PDO
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   280
        # starting from start_index
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   281
        while index < PDOTypeBaseIndex[pdotype] + 0x200:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   282
            values = self.NodeList.GetSlaveNodeEntry(nodeid, index + 0x200)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   283
            if values != None and values[0] > 0:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   284
                # Check that all subindex upper than 0 equal 0 => configurable PDO
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   285
                if reduce(lambda x, y: x and y, map(lambda x: x == 0, values[1:]), True):
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   286
                    cobid = self.NodeList.GetSlaveNodeEntry(nodeid, index, 1)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   287
                    # If no COB ID defined in PDO, generate a new one (not used)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   288
                    if cobid == 0:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   289
                        if len(self.ListCobIDAvailable) == 0:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   290
                            return None
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   291
                        # Calculate COB ID from standard values
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   292
                        if index < PDOTypeBaseIndex[pdotype] + 4:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   293
                            cobid = PDOTypeBaseCobId[pdotype] + 0x100 * (index - PDOTypeBaseIndex[pdotype]) + nodeid
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   294
                        if cobid not in self.ListCobIDAvailable:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   295
                            cobid = self.ListCobIDAvailable.pop(0)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   296
                    return index, cobid, values[0]
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   297
            index += 1
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   298
        return None
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   299
    
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   300
    def AddPDOMapping(self, nodeid, pdotype, pdoindex, pdocobid, pdomapping, sync_TPDOs):
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   301
        """
155
515f3fbd1173 Fixed typos in config_utils comments
etisserant
parents: 150
diff changeset
   302
        Record a new mapping request for a slave, and add related slave config to the DCF
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   303
        @param nodeid: id of the slave (int)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   304
        @param pdotype: type of PDO to generated (RPDO or TPDO)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   305
        @param pdomapping: list od variables to map with PDO
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   306
        """
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   307
        # Add an entry to MasterMapping
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   308
        self.MasterMapping[pdocobid] = {"type" : InvertPDOType[pdotype], 
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   309
            "mapping" : [None] + [(loc_infos["type"], name) for name, loc_infos in pdomapping]}
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   310
        
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   311
        # Return the data to add to DCF
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   312
        if sync_TPDOs:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   313
            return GeneratePDOMappingDCF(pdoindex, pdocobid, 0x01, pdomapping)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   314
        else:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   315
            return GeneratePDOMappingDCF(pdoindex, pdocobid, 0xFF, pdomapping)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   316
        return 0, ""
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   317
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   318
    def GenerateDCF(self, locations, current_location, sync_TPDOs):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   319
        """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   320
        Generate Concise DCF of MasterNode for the locations list given
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   321
        @param locations: list of locations to be mapped
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   322
        @param current_location: tuple of the located prefixes not to be considered
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   323
        @param sync_TPDOs: indicate if TPDO must be synchronous
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   324
        """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   325
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   326
        #-------------------------------------------------------------------------------
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   327
        #               Verify that locations correspond to real slave variables
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   328
        #-------------------------------------------------------------------------------
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   329
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   330
        # Get list of locations check if exists and mappables -> put them in IECLocations
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   331
        for location in locations:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   332
            COlocationtype = IECToCOType[location["IEC_TYPE"]]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   333
            name = location["NAME"]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   334
            if name in self.IECLocations:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   335
                if self.IECLocations[name]["type"] != COlocationtype:
415
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 361
diff changeset
   336
                    raise PDOmappingException, _("Type conflict for location \"%s\"") % name 
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   337
            else:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   338
                # Get only the part of the location that concern this node
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   339
                loc = location["LOC"][len(current_location):]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   340
                # loc correspond to (ID, INDEX, SUBINDEX [,BIT])
166
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   341
                if len(loc) not in (2, 3, 4):
361
331d698e1118 Adding support for internationalization
laurent
parents: 340
diff changeset
   342
                    raise PDOmappingException, _("Bad location size : %s") % str(loc)
166
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   343
                elif len(loc) == 2:
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   344
                    continue
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   345
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   346
                direction = location["DIR"]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   347
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   348
                sizelocation = location["SIZE"]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   349
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   350
                # Extract and check nodeid
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   351
                nodeid, index, subindex = loc[:3]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   352
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   353
                # Check Id is in slave node list
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   354
                if nodeid not in self.NodeList.SlaveNodes.keys():
361
331d698e1118 Adding support for internationalization
laurent
parents: 340
diff changeset
   355
                    raise PDOmappingException, _("Non existing node ID : %d (variable %s)") % (nodeid,name)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   356
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   357
                # Get the model for this node (made from EDS)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   358
                node = self.NodeList.SlaveNodes[nodeid]["Node"]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   359
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   360
                # Extract and check index and subindex
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   361
                if not node.IsEntry(index, subindex):
361
331d698e1118 Adding support for internationalization
laurent
parents: 340
diff changeset
   362
                    raise PDOmappingException, _("No such index/subindex (%x,%x) in ID : %d (variable %s)") % (index,subindex,nodeid,name)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   363
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   364
                # Get the entry info
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   365
                subentry_infos = node.GetSubentryInfos(index, subindex)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   366
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   367
                # If a PDO mappable
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   368
                if subentry_infos and subentry_infos["pdo"]:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   369
                    if sizelocation == "X" and len(loc) > 3:
61
a20fb174f46e Bug on bit locations generation fixed
lbessard
parents: 59
diff changeset
   370
                        numbit = loc[3]
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   371
                    elif sizelocation != "X" and len(loc) > 3:
361
331d698e1118 Adding support for internationalization
laurent
parents: 340
diff changeset
   372
                        raise PDOmappingException, _("Cannot set bit offset for non bool '%s' variable (ID:%d,Idx:%x,sIdx:%x))") % (name,nodeid,index,subindex)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   373
                    else:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   374
                        numbit = None
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   375
                    
166
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   376
                    if location["IEC_TYPE"] != "BOOL" and subentry_infos["type"] != COlocationtype:
361
331d698e1118 Adding support for internationalization
laurent
parents: 340
diff changeset
   377
                        raise PDOmappingException, _("Invalid type \"%s\"-> %d != %d  for location\"%s\"") % (location["IEC_TYPE"], COlocationtype, subentry_infos["type"] , name)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   378
                    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   379
                    typeinfos = node.GetEntryInfos(COlocationtype)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   380
                    self.IECLocations[name] = {"type":COlocationtype, "pdotype":SlavePDOType[direction],
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   381
                                                "nodeid": nodeid, "index": index,"subindex": subindex,
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   382
                                                "bit": numbit, "size": typeinfos["size"], "sizelocation": sizelocation}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   383
                else:
361
331d698e1118 Adding support for internationalization
laurent
parents: 340
diff changeset
   384
                    raise PDOmappingException, _("Not PDO mappable variable : '%s' (ID:%d,Idx:%x,sIdx:%x))") % (name,nodeid,index,subindex)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   385
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   386
        #-------------------------------------------------------------------------------
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   387
        #                         Search for locations already mapped
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   388
        #-------------------------------------------------------------------------------
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   389
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   390
        for name, locationinfos in self.IECLocations.items():
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   391
            node = self.NodeList.SlaveNodes[locationinfos["nodeid"]]["Node"]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   392
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   393
            # Search if slave has a PDO mapping this locations
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   394
            result = SearchNodePDOMapping(locationinfos, node)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   395
            if result != None:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   396
                index, subindex = result
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   397
                # Get COB ID of the PDO
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   398
                cobid = self.NodeList.GetSlaveNodeEntry(locationinfos["nodeid"], index - 0x200, 1)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   399
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   400
                # Add PDO to MasterMapping
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   401
                if cobid not in self.MasterMapping.keys():
80
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   402
                    # Verify that PDO transmit type is conform to sync_TPDOs
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   403
                    transmittype = self.NodeList.GetSlaveNodeEntry(locationinfos["nodeid"], index - 0x200, 2)
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   404
                    if sync_TPDOs and transmittype != 0x01 or transmittype != 0xFF:
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   405
                        if sync_TPDOs:
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   406
                            # Change TransmitType to SYNCHRONE
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   407
                            data, nbparams = GeneratePDOMappingDCF(index - 0x200, cobid, 0x01, [])
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   408
                        else:
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   409
                            # Change TransmitType to ASYCHRONE
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   410
                            data, nbparams = GeneratePDOMappingDCF(index - 0x200, cobid, 0xFF, [])
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   411
                        
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   412
                        # Add entry to slave dcf to change transmit type of 
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   413
                        self.AddParamsToDCF(locationinfos["nodeid"], data, nbparams)
d7eb6e22b02e Bug on Master DCF generation fixed
lbessard
parents: 78
diff changeset
   414
                                    
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   415
                    mapping = [None]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   416
                    values = node.GetEntry(index)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   417
                    # Store the size of each entry mapped in PDO
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   418
                    for value in values[1:]:
78
274a343d49d0 Bug on Master config generation fixed
lbessard
parents: 61
diff changeset
   419
                        if value != 0:
274a343d49d0 Bug on Master config generation fixed
lbessard
parents: 61
diff changeset
   420
                            mapping.append(value % 0x100)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   421
                    self.MasterMapping[cobid] = {"type" : InvertPDOType[locationinfos["pdotype"]], "mapping" : mapping}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   422
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   423
                # Indicate that this PDO entry must be saved
270
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   424
                if locationinfos["bit"] is not None:
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   425
                    if not isinstance(self.MasterMapping[cobid]["mapping"][subindex], ListType):
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   426
                        self.MasterMapping[cobid]["mapping"][subindex] = [1] * self.MasterMapping[cobid]["mapping"][subindex]
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   427
                    if locationinfos["bit"] < len(self.MasterMapping[cobid]["mapping"][subindex]):
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   428
                        self.MasterMapping[cobid]["mapping"][subindex][locationinfos["bit"]] = (locationinfos["type"], name)
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   429
                else:
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   430
                    self.MasterMapping[cobid]["mapping"][subindex] = (locationinfos["type"], name)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   431
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   432
            else:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   433
                # Add location to those that haven't been mapped yet
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   434
                if locationinfos["nodeid"] not in self.LocationsNotMapped.keys():
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   435
                    self.LocationsNotMapped[locationinfos["nodeid"]] = {TPDO : [], RPDO : []}
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   436
                self.LocationsNotMapped[locationinfos["nodeid"]][locationinfos["pdotype"]].append((name, locationinfos))
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   437
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   438
        #-------------------------------------------------------------------------------
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   439
        #                         Build concise DCF for the others locations
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   440
        #-------------------------------------------------------------------------------
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   441
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   442
        for nodeid, locations in self.LocationsNotMapped.items():
61
a20fb174f46e Bug on bit locations generation fixed
lbessard
parents: 59
diff changeset
   443
            node = self.NodeList.SlaveNodes[nodeid]["Node"]
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   444
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   445
            # Initialize number of params and data to add to node DCF
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   446
            nbparams = 0
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   447
            dataparams = ""
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   448
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   449
            # Generate the best PDO mapping for each type of PDO
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   450
            for pdotype in (TPDO, RPDO):
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   451
                if len(locations[pdotype]) > 0:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   452
                    pdosize = 0
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   453
                    pdomapping = []
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   454
                    result = self.GetEmptyPDO(nodeid, pdotype)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   455
                    if result is None:
415
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 361
diff changeset
   456
                        raise PDOmappingException, _("Unable to define PDO mapping for node %02x") % nodeid
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   457
                    pdoindex, pdocobid, pdonbparams = result
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   458
                    for name, loc_infos in locations[pdotype]:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   459
                        pdosize += loc_infos["size"]
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   460
                        # If pdo's size > 64 bits
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   461
                        if pdosize > 64 or len(pdomapping) >= pdonbparams:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   462
                            # Generate a new PDO Mapping
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   463
                            data, nbaddedparams = self.AddPDOMapping(nodeid, pdotype, pdoindex, pdocobid, pdomapping, sync_TPDOs)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   464
                            dataparams += data
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   465
                            nbparams += nbaddedparams
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   466
                            pdosize = loc_infos["size"]
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   467
                            pdomapping = [(name, loc_infos)]
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   468
                            result = self.GetEmptyPDO(nodeid, pdotype, pdoindex + 1)
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   469
                            if result is None:
415
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 361
diff changeset
   470
                                raise PDOmappingException, _("Unable to define PDO mapping for node %02x") % nodeid
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   471
                            pdoindex, pdocobid, pdonbparams = result
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   472
                        else:
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   473
                            pdomapping.append((name, loc_infos))
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   474
                    # If there isn't locations yet but there is still a PDO to generate
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   475
                    if len(pdomapping) > 0:
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   476
                        # Generate a new PDO Mapping
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   477
                        data, nbaddedparams = self.AddPDOMapping(nodeid, pdotype, pdoindex, pdocobid, pdomapping, sync_TPDOs)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   478
                        dataparams += data
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   479
                        nbparams += nbaddedparams
340
651b8fb572e7 Adding support for using only PDO define in EDS file and not configured for adding mapping in node
greg
parents: 307
diff changeset
   480
                
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   481
            # Add number of params and data to node DCF
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   482
            self.AddParamsToDCF(nodeid, dataparams, nbparams)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   483
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   484
        #-------------------------------------------------------------------------------
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   485
        #                         Master Node Configuration
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   486
        #-------------------------------------------------------------------------------
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   487
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   488
        # Generate Master's Configuration from informations stored in MasterMapping
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   489
        for cobid, pdo_infos in self.MasterMapping.items():
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   490
            # Get next PDO index in MasterNode for this PDO type
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   491
            current_idx = self.CurrentPDOParamsIdx[pdo_infos["type"]]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   492
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   493
            # Search if there is already a PDO in MasterNode with this cob id
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   494
            for idx in GetNodePDOIndexes(self.MasterNode, pdo_infos["type"], True):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   495
                if self.MasterNode.GetEntry(idx, 1) == cobid:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   496
                    current_idx = idx
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   497
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   498
            # Add a PDO to MasterNode if not PDO have been found
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   499
            if current_idx == self.CurrentPDOParamsIdx[pdo_infos["type"]]:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   500
                addinglist = [current_idx, current_idx + 0x200]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   501
                self.Manager.ManageEntriesOfCurrent(addinglist, [], self.MasterNode)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   502
                self.MasterNode.SetEntry(current_idx, 0x01, cobid)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   503
                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   504
                # Increment the number of PDO for this PDO type
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   505
                self.CurrentPDOParamsIdx[pdo_infos["type"]] += 1
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   506
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   507
            # Change the transmit type of the PDO
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   508
            if sync_TPDOs:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   509
                self.MasterNode.SetEntry(current_idx, 0x02, 0x01)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   510
            else:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   511
                self.MasterNode.SetEntry(current_idx, 0x02, 0xFF)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   512
            
270
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   513
            mapping = []
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   514
            for item in pdo_infos["mapping"]:
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   515
                if isinstance(item, ListType):
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   516
                    mapping.extend(item)
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   517
                else:
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   518
                    mapping.append(item)
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   519
            
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   520
            # Add some subentries to PDO mapping if there is not enough
270
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   521
            if len(mapping) > 1:
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   522
                self.Manager.AddSubentriesToCurrent(current_idx + 0x200, len(mapping) - 1, self.MasterNode)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   523
            
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   524
            # Generate MasterNode's PDO mapping
270
3b8fb275cf7e Bug on bit mapping in CanFestival plugin fixed
lbessard
parents: 225
diff changeset
   525
            for subindex, variable in enumerate(mapping):
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   526
                if subindex == 0:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   527
                    continue
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   528
                new_index = False
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   529
                
225
aed21ae6658f Some instance type test improved
lbessard
parents: 166
diff changeset
   530
                if isinstance(variable, (IntType, LongType)):
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   531
                    # If variable is an integer then variable is unexpected
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   532
                    self.MasterNode.SetEntry(current_idx + 0x200, subindex, self.TrashVariables[variable])
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   533
                else:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   534
                    typeidx, varname = variable
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   535
                    variable_infos = self.IECLocations[varname]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   536
                    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   537
                    # Calculate base index for storing variable
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   538
                    mapvariableidx = VariableStartIndex[variable_infos["pdotype"]] + \
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   539
                                     VariableTypeOffset[variable_infos["sizelocation"]] * VariableIncrement + \
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   540
                                     variable_infos["nodeid"]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   541
                    
163
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   542
                    # Generate entry name
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   543
                    indexname = "%s%s%s_%d"%(VariableDirText[variable_infos["pdotype"]],
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   544
                                                 variable_infos["sizelocation"],
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   545
                                                 '_'.join(map(str,current_location)),
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   546
                                                 variable_infos["nodeid"])    
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   547
                    
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   548
                    # Search for an entry that has an empty subindex 
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   549
                    while mapvariableidx < VariableStartIndex[variable_infos["pdotype"]] + 0x2000:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   550
                        # Entry doesn't exist
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   551
                        if not self.MasterNode.IsEntry(mapvariableidx):    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   552
                            # Add entry to MasterNode
163
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   553
                            self.Manager.AddMapVariableToCurrent(mapvariableidx, "beremiz"+indexname, 3, 1, self.MasterNode)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   554
                            new_index = True
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   555
                            nbsubentries = self.MasterNode.GetEntry(mapvariableidx, 0x00)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   556
                        else:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   557
                            # Get Number of subentries already defined
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   558
                            nbsubentries = self.MasterNode.GetEntry(mapvariableidx, 0x00)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   559
                            # if entry is full, go to next entry possible or stop now
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   560
                            if nbsubentries == 0xFF:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   561
                                mapvariableidx += 8 * VariableIncrement
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   562
                            else:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   563
                                break
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   564
                                
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   565
                    # Verify that a not full entry has been found
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   566
                    if mapvariableidx < VariableStartIndex[variable_infos["pdotype"]] + 0x2000:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   567
                        # Generate subentry name
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   568
                        if variable_infos["bit"] != None:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   569
                            subindexname = "%(index)d_%(subindex)d_%(bit)d"%variable_infos
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   570
                        else:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   571
                            subindexname = "%(index)d_%(subindex)d"%variable_infos
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   572
                        # If entry have just been created, no subentry have to be added
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   573
                        if not new_index:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   574
                            self.Manager.AddSubentriesToCurrent(mapvariableidx, 1, self.MasterNode)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   575
                            nbsubentries += 1
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   576
                        # Add informations to the new subentry created
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   577
                        self.MasterNode.SetMappingEntry(mapvariableidx, nbsubentries, values = {"name" : subindexname})
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   578
                        self.MasterNode.SetMappingEntry(mapvariableidx, nbsubentries, values = {"type" : typeidx})
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   579
                        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   580
                        # Set value of the PDO mapping
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   581
                        typeinfos = self.Manager.GetEntryInfos(typeidx)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   582
                        if typeinfos != None:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   583
                            value = (mapvariableidx << 16) + ((nbsubentries) << 8) + typeinfos["size"]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   584
                            self.MasterNode.SetEntry(current_idx + 0x200, subindex, value)
163
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   585
                        
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   586
                        # Add variable to pointed variables
482ca562d414 Support for extern pointer for located variables + Preliminary slave code (broken)
etisserant
parents: 155
diff changeset
   587
                        self.PointedVariables[(mapvariableidx, nbsubentries)] = "%s_%s"%(indexname, subindexname)
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   588
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   589
def GenerateConciseDCF(locations, current_location, nodelist, sync_TPDOs, nodename):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   590
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   591
    Fills a CanFestival network editor model, with DCF with requested PDO mappings.
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   592
    @param locations: List of complete variables locations \
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   593
        [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   594
        "NAME" : name of the variable (generally "__IW0_1_2" style)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   595
        "DIR" : direction "Q","I" or "M"
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   596
        "SIZE" : size "X", "B", "W", "D", "L"
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   597
        "LOC" : tuple of interger for IEC location (0,1,2,...)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   598
        }, ...]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   599
    @param nodelist: CanFestival network editor model
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   600
    @return: a modified copy of the given CanFestival network editor model
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   601
    """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   602
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   603
    dcfgenerator = ConciseDCFGenerator(nodelist, nodename)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   604
    dcfgenerator.GenerateDCF(locations, current_location, sync_TPDOs)
307
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   605
    masternode,pointers = dcfgenerator.GetMasterNode(), dcfgenerator.GetPointedVariables()
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   606
    # allow access to local OD from Master PLC
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   607
    pointers.update(LocalODPointers(locations, current_location, masternode))
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   608
    return masternode,pointers
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   609
166
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   610
def LocalODPointers(locations, current_location, slave):
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   611
    IECLocations = {}
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   612
    pointers = {}
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   613
    for location in locations:
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   614
        COlocationtype = IECToCOType[location["IEC_TYPE"]]
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   615
        name = location["NAME"]
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   616
        if name in IECLocations:
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   617
            if IECLocations[name] != COlocationtype:
415
339fa2542481 improved english spelling and grammar and internationalization updated
laurent
parents: 361
diff changeset
   618
                raise PDOmappingException, _("Type conflict for location \"%s\"") % name 
166
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   619
        else:
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   620
            # Get only the part of the location that concern this node
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   621
            loc = location["LOC"][len(current_location):]
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   622
            # loc correspond to (ID, INDEX, SUBINDEX [,BIT])
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   623
            if len(loc) not in (2, 3, 4):
361
331d698e1118 Adding support for internationalization
laurent
parents: 340
diff changeset
   624
                raise PDOmappingException, _("Bad location size : %s") % str(loc)
166
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   625
            elif len(loc) != 2:
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   626
                continue
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   627
            
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   628
            # Extract and check nodeid
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   629
            index, subindex = loc[:2]
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   630
            
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   631
            # Extract and check index and subindex
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   632
            if not slave.IsEntry(index, subindex):
361
331d698e1118 Adding support for internationalization
laurent
parents: 340
diff changeset
   633
                raise PDOmappingException, _("No such index/subindex (%x,%x) (variable %s)") % (index, subindex, name)
166
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   634
            
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   635
            # Get the entry info
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   636
            subentry_infos = slave.GetSubentryInfos(index, subindex)    
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   637
            if subentry_infos["type"] != COlocationtype:
361
331d698e1118 Adding support for internationalization
laurent
parents: 340
diff changeset
   638
                raise PDOmappingException, _("Invalid type \"%s\"-> %d != %d  for location\"%s\"") % (location["IEC_TYPE"], COlocationtype, subentry_infos["type"] , name)
166
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   639
            
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   640
            IECLocations[name] = COlocationtype
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   641
            pointers[(index, subindex)] = name
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   642
    return pointers
121b18748de0 Preliminary CANopen slave generation support
etisserant
parents: 163
diff changeset
   643
        
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   644
if __name__ == "__main__":
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   645
    import os, sys, getopt
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   646
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   647
    def usage():
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   648
        print """
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   649
Usage of config_utils.py test :
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   650
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   651
    %s [options]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   652
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   653
Options:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   654
    --help  (-h)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   655
            Displays help informations for config_utils
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   656
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   657
    --reset (-r)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   658
            Reset the reference result of config_utils test.
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   659
            Use with caution. Be sure that config_utils
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   660
            is currently working properly.
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   661
"""%sys.argv[0]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   662
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   663
    # Boolean that indicate if reference result must be redefined
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   664
    reset = False
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   665
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   666
    # Extract command options
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   667
    try:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   668
        opts, args = getopt.getopt(sys.argv[1:], "hr", ["help","reset"])
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   669
    except getopt.GetoptError:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   670
        # print help information and exit:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   671
        usage()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   672
        sys.exit(2)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   673
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   674
    # Test each option
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   675
    for o, a in opts:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   676
        if o in ("-h", "--help"):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   677
            usage()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   678
            sys.exit()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   679
        elif o in ("-r", "--reset"):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   680
            reset = True
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   681
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   682
    # Extract workspace base folder
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   683
    base_folder = sys.path[0]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   684
    for i in xrange(3):
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   685
        base_folder = os.path.split(base_folder)[0]
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   686
    # Add CanFestival folder to search pathes
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   687
    sys.path.append(os.path.join(base_folder, "CanFestival-3", "objdictgen"))
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   688
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   689
    from nodemanager import *
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   690
    from nodelist import *
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   691
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   692
    # Open the test nodelist contained into test_config folder
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   693
    manager = NodeManager()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   694
    nodelist = NodeList(manager)
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   695
    result = nodelist.LoadProject("test_config")
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   696
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   697
    # List of locations, we try to map for test
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   698
    locations = [{"IEC_TYPE":"BYTE","NAME":"__IB0_1_64_24576_1","DIR":"I","SIZE":"B","LOC":(0,1,64,24576,1)},
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   699
                 {"IEC_TYPE":"INT","NAME":"__IW0_1_64_25601_2","DIR":"I","SIZE":"W","LOC":(0,1,64,25601,2)},
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   700
                 {"IEC_TYPE":"INT","NAME":"__IW0_1_64_25601_3","DIR":"I","SIZE":"W","LOC":(0,1,64,25601,3)},
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   701
                 {"IEC_TYPE":"INT","NAME":"__QW0_1_64_25617_2","DIR":"Q","SIZE":"W","LOC":(0,1,64,25617,1)},
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   702
                 {"IEC_TYPE":"BYTE","NAME":"__IB0_1_64_24578_1","DIR":"I","SIZE":"B","LOC":(0,1,64,24578,1)},
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   703
                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_64_25638_1","DIR":"I","SIZE":"D","LOC":(0,1,64,25638,1)},
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   704
                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_64_25638_2","DIR":"I","SIZE":"D","LOC":(0,1,64,25638,2)},
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   705
                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_64_25638_3","DIR":"I","SIZE":"D","LOC":(0,1,64,25638,3)},
307
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   706
                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_64_25638_4","DIR":"I","SIZE":"D","LOC":(0,1,64,25638,4)},
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   707
                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_4096_0","DIR":"I","SIZE":"D","LOC":(0,1,4096,0)}]
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   708
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   709
    # Generate MasterNode configuration
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   710
    try:
307
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   711
        masternode, pointedvariables = GenerateConciseDCF(locations, (0, 1), nodelist, True, "TestNode")
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   712
    except ValueError, message:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   713
        print "%s\nTest Failed!"%message
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   714
        sys.exit()
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   715
    
307
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   716
    import pprint
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   717
    # Get Text corresponding to MasterNode 
307
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   718
    result_node = masternode.PrintString()
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   719
    result_vars = pprint.pformat(pointedvariables)
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   720
    result = result_node + "\n********POINTERS*********\n" + result_vars + "\n"
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   721
    
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   722
    # If reset has been choosen
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   723
    if reset:
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   724
        # Write Text into reference result file
307
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   725
        testfile = open("test_config/result.txt", "w")
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   726
        testfile.write(result)
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   727
        testfile.close()
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   728
        
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   729
        print "Reset Successful!"
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   730
    else:
150
204d515df3dd Fixed non-regression test of config_utils in canfestival plugin
etisserant
parents: 80
diff changeset
   731
        import os
204d515df3dd Fixed non-regression test of config_utils in canfestival plugin
etisserant
parents: 80
diff changeset
   732
        
307
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   733
        testfile = open("test_config/result_tmp.txt", "w")
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   734
        testfile.write(result)
b80d3a84b8bf Updated config_utils so that command line tests work.
etisserant
parents: 270
diff changeset
   735
        testfile.close()
58
c0741cc16c99 Basic CANOpen master node test compiles and run.
etisserant
parents:
diff changeset
   736
        
150
204d515df3dd Fixed non-regression test of config_utils in canfestival plugin
etisserant
parents: 80
diff changeset
   737
        os.system("diff test_config/result.txt test_config/result_tmp.txt")
204d515df3dd Fixed non-regression test of config_utils in canfestival plugin
etisserant
parents: 80
diff changeset
   738
        os.remove("test_config/result_tmp.txt")