etherlab/etherlab.py
author Laurent Bessard
Tue, 05 Mar 2013 23:04:59 +0100
changeset 2099 ea5384ab152c
parent 2098 392791b5cc04
child 2101 da450992572e
permissions -rw-r--r--
Improved Ethercat Network Configurator panels
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     1
import os, shutil
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     2
import cPickle
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     3
from xml.dom import minidom
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     4
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     5
import wx
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
     6
import csv
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     7
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     8
from xmlclass import *
2086
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
     9
from POULibrary import POULibrary
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
    10
from ConfigTreeNode import ConfigTreeNode
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
    11
from PLCControler import UndoBuffer, LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
    12
from ConfigEditor import NodeEditor, CIA402NodeEditor, MasterEditor, LibraryEditor, ETHERCAT_VENDOR, ETHERCAT_GROUP, ETHERCAT_DEVICE
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    13
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    14
try:
2049
438a4a1ff188 updated examples also
Edouard Tisserant
parents: 2048
diff changeset
    15
    from MotionLibrary import Headers, AxisXSD
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    16
    HAS_MCL = True
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    17
except:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    18
    HAS_MCL = False
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    19
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    20
TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L",
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    21
    "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    22
    "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L"}
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    23
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    24
DATATYPECONVERSION = {"BOOL" : "BIT", "SINT" : "S8", "INT" : "S16", "DINT" : "S32", "LINT" : "S64",
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    25
    "USINT" : "U8", "UINT" : "U16", "UDINT" : "U32", "ULINT" : "U64", 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    26
    "BYTE" : "U8", "WORD" : "U16", "DWORD" : "U32", "LWORD" : "U64"}
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    27
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    28
VARCLASSCONVERSION = {"T": LOCATION_VAR_INPUT, "R": LOCATION_VAR_OUTPUT, "RT": LOCATION_VAR_MEMORY}
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
    29
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
    30
#--------------------------------------------------
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    31
#         Remote Exec Etherlab Commands
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
    32
#--------------------------------------------------
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
    33
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    34
SCAN_COMMAND = """
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    35
import commands
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    36
result = commands.getoutput("ethercat slaves")
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    37
slaves = []
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    38
for slave_line in result.splitlines():
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    39
    chunks = slave_line.split()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    40
    idx, pos, state, flag = chunks[:4]
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    41
    name = " ".join(chunks[4:])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    42
    alias, position = pos.split(":")
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    43
    slave = {"idx": int(idx),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    44
             "alias": int(alias),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    45
             "position": int(position),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    46
             "name": name}
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    47
    details = commands.getoutput("ethercat slaves -p %d -v" % slave["idx"])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    48
    for details_line in details.splitlines():
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    49
        details_line = details_line.strip()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    50
        for header, param in [("Vendor Id:", "vendor_id"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    51
                              ("Product code:", "product_code"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    52
                              ("Revision number:", "revision_number")]:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    53
            if details_line.startswith(header):
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
    54
                slave[param] = details_line.split()[-1]
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    55
                break
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    56
    slaves.append(slave)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    57
returnVal = slaves
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    58
"""
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    59
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    60
#--------------------------------------------------
2086
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    61
#      Etherlab Specific Blocks Library
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    62
#--------------------------------------------------
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    63
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    64
def GetLocalPath(filename):
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    65
    return os.path.join(os.path.split(__file__)[0], filename)
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    66
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    67
class EtherlabLibrary(POULibrary):
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    68
    def GetLibraryPath(self):
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    69
        return GetLocalPath("pous.xml")
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    70
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    71
    def Generate_C(self, buildpath, varlist, IECCFLAGS):
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    72
        etherlab_ext_file = open(GetLocalPath("etherlab_ext.c"), 'r')
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    73
        etherlab_ext_code = etherlab_ext_file.read()
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    74
        etherlab_ext_file.close()
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    75
        
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    76
        Gen_etherlabfile_path = os.path.join(buildpath, "etherlab_ext.c")
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    77
        ethelabfile = open(Gen_etherlabfile_path,'w')
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    78
        ethelabfile.write(etherlab_ext_code)
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    79
        ethelabfile.close()
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    80
        
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    81
        runtimefile_path = os.path.join(os.path.split(__file__)[0], "runtime_etherlab.py")
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    82
        return ((["etherlab_ext"], [(Gen_etherlabfile_path, IECCFLAGS)], True), "", 
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    83
                ("runtime_etherlab.py", file(GetLocalPath("runtime_etherlab.py"))))
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    84
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    85
#--------------------------------------------------
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    86
#                    Ethercat Node
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    87
#--------------------------------------------------
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    88
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
    89
class _EthercatSlaveCTN:
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
    90
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    91
    NODE_PROFILE = None
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    92
    EditorType = NodeEditor
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
    93
    
2068
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
    94
    def GetIconName(self):
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
    95
        return "Slave"
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
    96
    
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
    97
    def ExtractHexDecValue(self, value):
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
    98
        return ExtractHexDecValue(value)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    99
    
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
   100
    def GetSizeOfType(self, type):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   101
        return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   102
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   103
    def GetSlavePos(self):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   104
        return self.BaseParams.getIEC_Channel()
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   105
    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   106
    def GetParamsAttributes(self, path = None):
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   107
        if path:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   108
            parts = path.split(".", 1)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   109
            if self.MandatoryParams and parts[0] == self.MandatoryParams[0]:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   110
                return self.MandatoryParams[1].getElementInfos(parts[0], parts[1])
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   111
            elif self.CTNParams and parts[0] == self.CTNParams[0]:
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   112
                return self.CTNParams[1].getElementInfos(parts[0], parts[1])
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   113
        else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   114
            params = []
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   115
            if self.CTNParams:
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   116
                params.append(self.CTNParams[1].getElementInfos(self.CTNParams[0]))
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   117
            else:
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   118
                params.append({
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   119
                    'use': 'required', 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   120
                    'type': 'element', 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   121
                    'name': 'SlaveParams', 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   122
                    'value': None, 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   123
                    'children': []
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   124
                })
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   125
            
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   126
            slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos())
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   127
            params[0]['children'].insert(0,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   128
                   {'use': 'optional', 
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   129
                    'type': self.CTNParent.GetSlaveTypesLibrary(self.NODE_PROFILE), 
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   130
                    'name': 'Type', 
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   131
                    'value': (slave_type["device_type"], slave_type)}) 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   132
            params[0]['children'].insert(1,
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   133
                   {'use': 'optional', 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   134
                    'type': 'unsignedLong', 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   135
                    'name': 'Alias', 
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   136
                    'value': self.CTNParent.GetSlaveAlias(self.GetSlavePos())})
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   137
            return params
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   138
        
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   139
    def SetParamsAttribute(self, path, value):
2066
de4817ce8b50 Fix bug when modifying node parameters
Laurent Bessard
parents: 2064
diff changeset
   140
        position = self.BaseParams.getIEC_Channel()
de4817ce8b50 Fix bug when modifying node parameters
Laurent Bessard
parents: 2064
diff changeset
   141
        
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   142
        if path == "SlaveParams.Type":
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   143
            self.CTNParent.SetSlaveType(position, value)
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   144
            slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos())
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   145
            value = (slave_type["device_type"], slave_type)
2067
04cc0295e2c4 Fix bug slave information panel not refreshed when slave type changed
Laurent Bessard
parents: 2066
diff changeset
   146
            if self._View is not None:
04cc0295e2c4 Fix bug slave information panel not refreshed when slave type changed
Laurent Bessard
parents: 2066
diff changeset
   147
                wx.CallAfter(self._View.RefreshSlaveInfos)
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   148
            return value, True
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   149
        elif path == "SlaveParams.Alias":
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   150
            self.CTNParent.SetSlaveAlias(position, value)
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   151
            return value, True
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   152
        
2080
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   153
        value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value)
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   154
        
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   155
        # Filter IEC_Channel, Slave_Type and Alias that have specific behavior
2080
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   156
        if path == "BaseParams.IEC_Channel" and value != position:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   157
            self.CTNParent.SetSlavePosition(position, value)
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   158
        
2080
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   159
        return value, refresh
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   160
        
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
   161
    def GetSlaveInfos(self):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   162
        return self.CTNParent.GetSlaveInfos(self.GetSlavePos())
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   163
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   164
    def GetSlaveVariables(self, limits):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   165
        return self.CTNParent.GetSlaveVariables(self.GetSlavePos(), limits)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   166
    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   167
    def GetVariableLocationTree(self):
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   168
        return  {"name": self.BaseParams.getName(),
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   169
                 "type": LOCATION_CONFNODE,
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   170
                 "location": self.GetFullIEC_Channel(),
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   171
                 "children": self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), self.GetCurrentLocation(), self.BaseParams.getName())
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   172
        }
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   173
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   174
    def CTNGenerate_C(self, buildpath, locations):
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   175
        """
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   176
        Generate C code
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   177
        @param current_location: Tupple containing confnode IEC location : %I0.0.4.5 => (0,0,4,5)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   178
        @param locations: List of complete variables locations \
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   179
            [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   180
            "NAME" : name of the variable (generally "__IW0_1_2" style)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   181
            "DIR" : direction "Q","I" or "M"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   182
            "SIZE" : size "X", "B", "W", "D", "L"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   183
            "LOC" : tuple of interger for IEC location (0,1,2,...)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   184
            }, ...]
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   185
        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   186
        """
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   187
        return [],"",False
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   188
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   189
#--------------------------------------------------
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   190
#                 Ethercat CIA402 Node
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   191
#--------------------------------------------------
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   192
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   193
if HAS_MCL:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   194
    
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   195
    NODE_VARIABLES = [
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   196
        ("ControlWord", 0x6040, 0x00, "UINT", "Q"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   197
        ("TargetPosition", 0x607a, 0x00, "DINT", "Q"),
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   198
        ("ModesOfOperation", 0x06060, 0x00, "SINT", "Q"),
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   199
        ("StatusWord", 0x6041, 0x00, "UINT", "I"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   200
        ("ModesOfOperationDisplay", 0x06061, 0x00, "SINT", "I"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   201
        ("ActualPosition", 0x6064, 0x00, "DINT", "I"),
2091
d964dbc2c7b0 Adding support for extracting ActualVelocity from CIA402 nodes PDOs
Laurent Bessard
parents: 2088
diff changeset
   202
        ("ActualVelocity", 0x606C, 0x00, "DINT", "I"),
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   203
    ]
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   204
    
2085
ae263886ae92 Fix bug in CIA402 slave digital inputs
Laurent Bessard
parents: 2084
diff changeset
   205
    DEFAULT_RETRIEVE = "    __CIA402Node_%(location)s.axis->%(name)s = *(__CIA402Node_%(location)s.%(name)s);"
ae263886ae92 Fix bug in CIA402 slave digital inputs
Laurent Bessard
parents: 2084
diff changeset
   206
    DEFAULT_PUBLISH = "    *(__CIA402Node_%(location)s.%(name)s) = __CIA402Node_%(location)s.axis->%(name)s;"
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   207
    
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   208
    EXTRA_NODE_VARIABLES = [
2096
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   209
        ("ErrorCode", [
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   210
            {"description": ("ErrorCode", 0x603F, 0x00, "UINT", "I"),
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   211
             "publish": None}
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   212
            ]),
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   213
        ("DigitalInputs", [
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   214
            {"description": ("DigitalInputs", 0x60FD, 0x00, "UDINT", "I"),
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   215
             "publish": None}
2096
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   216
            ]),
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   217
        ("DigitalOutputs", [
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   218
            {"description": ("DigitalOutputs", 0x60FE, 0x00, "UDINT", "Q"),
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   219
             "retrieve": None}
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   220
            ])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   221
    ]
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   222
    EXTRA_NODE_VARIABLES_DICT = dict([("Enable" + name, value) for name, value in EXTRA_NODE_VARIABLES])
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   223
2094
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   224
    BLOCK_INPUT_TEMPLATE = "    __SET_VAR(%(blockname)s->,%(input_name)s, %(input_value)s);"
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   225
    BLOCK_OUTPUT_TEMPLATE = "    __SET_VAR(data__->,%(output_name)s, __GET_VAR(%(blockname)s->%(output_name)s));"
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   226
    
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   227
    BLOCK_FUNCTION_TEMPLATE = """
2093
3fdf9d56d803 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2092
diff changeset
   228
extern void ETHERLAB%(ucase_blocktype)s_body__(ETHERLAB%(ucase_blocktype)s* data__);
3fdf9d56d803 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2092
diff changeset
   229
void __%(blocktype)s_%(location)s(MC_%(ucase_blocktype)s *data__) {
2094
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   230
    __DECLARE_GLOBAL_PROTOTYPE(ETHERLAB%(ucase_blocktype)s, %(blockname)s);
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   231
    ETHERLAB%(ucase_blocktype)s* %(blockname)s = __GET_GLOBAL_%(blockname)s();
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   232
%(extract_inputs)s
2094
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   233
    ETHERLAB%(ucase_blocktype)s_body__(%(blockname)s);
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   234
%(return_outputs)s
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   235
}
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   236
"""
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   237
    
2094
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   238
    BLOCK_FUNTION_DEFINITION_TEMPLATE = """    if (!__CIA402Node_%(location)s.axis->__mcl_func_MC_%(blocktype)s)
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   239
    __CIA402Node_%(location)s.axis->__mcl_func_MC_%(blocktype)s = __%(blocktype)s_%(location)s;"""
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   240
    
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   241
    GLOBAL_INSTANCES = [
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   242
        {"blocktype": "GetTorqueLimit", 
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   243
         "inputs": [],
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   244
         "outputs": [{"name": "TorqueLimitPos", "type": "UINT"},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   245
                     {"name": "TorqueLimitNeg", "type": "UINT"}]},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   246
        {"blocktype": "SetTorqueLimit", 
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   247
         "inputs": [{"name": "TorqueLimitPos", "type": "UINT"},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   248
                    {"name": "TorqueLimitNeg", "type": "UINT"}],
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   249
         "outputs": []},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   250
    ]
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   251
    
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   252
    class _EthercatCIA402SlaveCTN(_EthercatSlaveCTN):
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   253
        XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   254
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   255
          <xsd:element name="CIA402SlaveParams">
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   256
            <xsd:complexType>
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   257
              %s
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   258
            </xsd:complexType>
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   259
          </xsd:element>
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   260
        </xsd:schema>
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   261
        """ % ("\n".join(['<xsd:attribute name="Enable%s" type="xsd:boolean" use="optional" default="false"/>' % category 
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   262
                          for category, variables in EXTRA_NODE_VARIABLES]) + AxisXSD)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   263
        
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   264
        NODE_PROFILE = 402
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   265
        EditorType = CIA402NodeEditor
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   266
        
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   267
        ConfNodeMethods = [
2068
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
   268
            {"bitmap" : "CIA402AxisRef",
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   269
             "name" : _("Axis Ref"),
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   270
             "tooltip" : _("Initiate Drag'n drop of Axis ref located variable"),
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   271
             "method" : "_getCIA402AxisRef",
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   272
             "push": True},
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   273
        ]
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   274
        
2068
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
   275
        def GetIconName(self):
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
   276
            return "CIA402Slave"
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   277
        
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   278
        def SetParamsAttribute(self, path, value):
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   279
            if path == "CIA402SlaveParams.Type":
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   280
                path = "SlaveParams.Type"
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   281
            elif path == "CIA402SlaveParams.Alias":
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   282
                path = "SlaveParams.Alias"
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   283
            return _EthercatSlaveCTN.SetParamsAttribute(self, path, value)
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   284
        
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   285
        def GetVariableLocationTree(self):
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   286
            axis_name = self.CTNName()
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   287
            current_location = self.GetCurrentLocation()
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   288
            children = [{"name": "%s Axis Ref" % (axis_name),
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   289
                         "type": LOCATION_VAR_INPUT,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   290
                         "size": "W",
2083
0f7ab170c862 Fix Axis_Ref type defined in VariableLocationTree
Laurent Bessard
parents: 2082
diff changeset
   291
                         "IEC_type": "AXIS_REF",
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   292
                         "var_name": axis_name,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   293
                         "location": "%%IW%s.0" % (".".join(map(str, current_location))),
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   294
                         "description": "",
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   295
                         "children": []}]
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   296
            children.extend(self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), current_location, axis_name))
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   297
            return  {"name": axis_name,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   298
                     "type": LOCATION_CONFNODE,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   299
                     "location": self.GetFullIEC_Channel(),
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   300
                     "children": children,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   301
            }
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   302
        
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   303
        def CTNGlobalInstances(self):
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   304
            current_location = self.GetCurrentLocation()
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   305
            return [("%s_%s" % (block_infos["blocktype"], "_".join(map(str, current_location))),
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   306
                     "EtherLab%s" % block_infos["blocktype"]) for block_infos in GLOBAL_INSTANCES]
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   307
        
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   308
        def _getCIA402AxisRef(self):
2074
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
   309
            data = wx.TextDataObject(str(("%%IW%s.0" % ".".join(map(str, self.GetCurrentLocation())), 
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   310
                                          "location", "AXIS_REF", self.CTNName(), "")))
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   311
            dragSource = wx.DropSource(self.GetCTRoot().AppFrame)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   312
            dragSource.SetData(data)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   313
            dragSource.DoDragDrop()
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   314
        
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   315
        def CTNGenerate_C(self, buildpath, locations):
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   316
            """
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   317
            Generate C code
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   318
            @param current_location: Tupple containing confnode IEC location : %I0.0.4.5 => (0,0,4,5)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   319
            @param locations: List of complete variables locations \
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   320
                [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   321
                "NAME" : name of the variable (generally "__IW0_1_2" style)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   322
                "DIR" : direction "Q","I" or "M"
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   323
                "SIZE" : size "X", "B", "W", "D", "L"
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   324
                "LOC" : tuple of interger for IEC location (0,1,2,...)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   325
                }, ...]
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   326
            @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   327
            """
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   328
            current_location = self.GetCurrentLocation()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   329
            
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   330
            location_str = "_".join(map(lambda x:str(x), current_location))
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   331
            
2045
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   332
            plc_cia402node_filepath = os.path.join(os.path.split(__file__)[0], "plc_cia402node.c")
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   333
            plc_cia402node_file = open(plc_cia402node_filepath, 'r')
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   334
            plc_cia402node_code = plc_cia402node_file.read()
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   335
            plc_cia402node_file.close()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   336
            
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   337
            str_completion = {
2088
c0952932d74b Adding support for using Etherlab SDO function blocks in MCL
Laurent Bessard
parents: 2086
diff changeset
   338
                "slave_pos": self.GetSlavePos(),
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   339
                "location": location_str,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   340
                "MCL_headers": Headers,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   341
                "extern_located_variables_declaration": [],
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   342
                "fieldbus_interface_declaration": [],
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   343
                "fieldbus_interface_definition": [],
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   344
                "entry_variables": [],
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   345
                "init_axis_params": [],
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   346
                "init_entry_variables": [],
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   347
                "extra_variables_retrieve": [],
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   348
                "extra_variables_publish": []
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   349
            }
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   350
            
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   351
            for blocktype_infos in GLOBAL_INSTANCES:
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   352
                texts = {
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   353
                    "blocktype": blocktype_infos["blocktype"],
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   354
                    "ucase_blocktype": blocktype_infos["blocktype"].upper(),
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   355
                    "location": "_".join(map(str, current_location))
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   356
                }
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   357
                texts["blockname"] = "%(ucase_blocktype)s_%(location)s" % texts
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   358
                
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   359
                inputs = [{"input_name": "POS", "input_value": str(self.GetSlavePos())},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   360
                          {"input_name": "EXECUTE", "input_value": "__GET_VAR(data__->EXECUTE)"}] +\
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   361
                         [{"input_name": input["name"].upper(), 
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   362
                           "input_value": "__GET_VAR(data__->%s)" % input["name"].upper()}
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   363
                          for input in blocktype_infos["inputs"]]
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   364
                input_texts = []
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   365
                for input_infos in inputs:
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   366
                    input_infos.update(texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   367
                    input_texts.append(BLOCK_INPUT_TEMPLATE % input_infos)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   368
                texts["extract_inputs"] = "\n".join(input_texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   369
                
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   370
                outputs = [{"output_name": output} for output in ["DONE", "BUSY", "ERROR"]] + \
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   371
                          [{"output_name": output["name"].upper()} for output in blocktype_infos["outputs"]]
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   372
                output_texts = []
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   373
                for output_infos in outputs:
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   374
                    output_infos.update(texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   375
                    output_texts.append(BLOCK_OUTPUT_TEMPLATE % output_infos)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   376
                texts["return_outputs"] = "\n".join(output_texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   377
                
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   378
                str_completion["fieldbus_interface_declaration"].append(
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   379
                        BLOCK_FUNCTION_TEMPLATE % texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   380
                
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   381
                str_completion["fieldbus_interface_definition"].append(
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   382
                        BLOCK_FUNTION_DEFINITION_TEMPLATE % texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   383
                
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   384
            variables = NODE_VARIABLES[:]
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   385
            
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   386
            params = self.CTNParams[1].getElementInfos(self.CTNParams[0])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   387
            for param in params["children"]:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   388
                if param["name"] in EXTRA_NODE_VARIABLES_DICT:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   389
                    if param["value"]:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   390
                        extra_variables = EXTRA_NODE_VARIABLES_DICT.get(param["name"])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   391
                        for variable_infos in extra_variables:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   392
                            var_infos = {
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   393
                                "location": location_str,
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   394
                                "name": variable_infos["description"][0]
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   395
                            }
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   396
                            variables.append(variable_infos["description"])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   397
                            retrieve_template = variable_infos.get("retrieve", DEFAULT_RETRIEVE)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   398
                            publish_template = variable_infos.get("publish", DEFAULT_PUBLISH)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   399
                            
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   400
                            if retrieve_template is not None:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   401
                                str_completion["extra_variables_retrieve"].append(
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   402
                                    retrieve_template % var_infos)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   403
                            if publish_template is not None:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   404
                                str_completion["extra_variables_publish"].append(
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   405
                                    publish_template % var_infos)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   406
                elif param["value"] is not None:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   407
                    param_infos = {
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   408
                        "location": location_str,
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   409
                        "param_name": param["name"],
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   410
                    }
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   411
                    if param["type"] == "boolean":
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   412
                        param_infos["param_value"] = {True: "true", False: "false"}[param["value"]]
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   413
                    else:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   414
                        param_infos["param_value"] = str(param["value"])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   415
                    str_completion["init_axis_params"].append(
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   416
                        "        __CIA402Node_%(location)s.axis->%(param_name)s = %(param_value)s;" % param_infos)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   417
            
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   418
            for variable in variables:
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   419
                var_infos = dict(zip(["name", "index", "subindex", "var_type", "dir"], variable))
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   420
                var_infos["location"] = location_str
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   421
                var_infos["var_size"] = self.GetSizeOfType(var_infos["var_type"])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   422
                var_infos["var_name"] = "__%(dir)s%(var_size)s%(location)s_%(index)d_%(subindex)d" % var_infos
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   423
                
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   424
                str_completion["extern_located_variables_declaration"].append(
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   425
                        "IEC_%(var_type)s *%(var_name)s;" % var_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   426
                str_completion["entry_variables"].append(
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   427
                        "    IEC_%(var_type)s *%(name)s;" % var_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   428
                str_completion["init_entry_variables"].append(
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   429
                        "    __CIA402Node_%(location)s.%(name)s = %(var_name)s;" % var_infos)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   430
                
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   431
                self.CTNParent.FileGenerator.DeclareVariable(
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   432
                        self.GetSlavePos(), var_infos["index"], var_infos["subindex"], 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   433
                        var_infos["var_type"], var_infos["dir"], var_infos["var_name"])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   434
            
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   435
            for element in ["extern_located_variables_declaration", 
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   436
                            "fieldbus_interface_declaration",
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   437
                            "fieldbus_interface_definition",
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   438
                            "entry_variables", 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   439
                            "init_axis_params", 
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   440
                            "init_entry_variables",
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   441
                            "extra_variables_retrieve",
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   442
                            "extra_variables_publish"]:
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   443
                str_completion[element] = "\n".join(str_completion[element])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   444
            
2045
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   445
            Gen_CIA402Nodefile_path = os.path.join(buildpath, "cia402node_%s.c"%location_str)
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   446
            cia402nodefile = open(Gen_CIA402Nodefile_path, 'w')
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   447
            cia402nodefile.write(plc_cia402node_code % str_completion)
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   448
            cia402nodefile.close()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   449
            
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   450
            return [(Gen_CIA402Nodefile_path, '"-I%s"'%os.path.abspath(self.GetCTRoot().GetIECLibPath()))],"",True
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
   451
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   452
#--------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   453
#                 Ethercat MASTER
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   454
#--------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   455
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   456
EtherCATConfigClasses = GenerateClassesFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATConfig.xsd")) 
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   457
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   458
def ExtractHexDecValue(value):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   459
    try:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   460
        return int(value)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   461
    except:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   462
        pass
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   463
    try:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   464
        return int(value.replace("#", "0"), 16)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   465
    except:
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
   466
        raise ValueError, "Invalid value for HexDecValue \"%s\"" % value
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   467
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   468
def GenerateHexDecValue(value, base=10):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   469
    if base == 10:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   470
        return str(value)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   471
    elif base == 16:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   472
        return "#x%.8x" % value
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   473
    else:
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
   474
        raise ValueError, "Not supported base"
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   475
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   476
def sort_commands(x, y):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   477
    if x["Index"] == y["Index"]:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   478
        return cmp(x["Subindex"], y["Subindex"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   479
    return cmp(x["Index"], y["Index"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   480
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   481
cls = EtherCATConfigClasses.get("Config_Slave", None)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   482
if cls:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   483
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   484
    def getType(self):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   485
        slave_info = self.getInfo()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   486
        return {"device_type": slave_info.getName(),
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   487
                "vendor": GenerateHexDecValue(slave_info.getVendorId()),
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   488
                "product_code": GenerateHexDecValue(slave_info.getProductCode(), 16),
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   489
                "revision_number": GenerateHexDecValue(slave_info.getRevisionNo(), 16)}
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   490
    setattr(cls, "getType", getType)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   491
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   492
    def setType(self, type_infos):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   493
        slave_info = self.getInfo()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   494
        slave_info.setName(type_infos["device_type"])
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   495
        slave_info.setVendorId(ExtractHexDecValue(type_infos["vendor"]))
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   496
        slave_info.setProductCode(ExtractHexDecValue(type_infos["product_code"]))
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   497
        slave_info.setRevisionNo(ExtractHexDecValue(type_infos["revision_number"]))
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   498
    setattr(cls, "setType", setType)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   499
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   500
    def getInitCmds(self, create_default=False):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   501
        Mailbox = self.getMailbox()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   502
        if Mailbox is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   503
            if create_default:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   504
                self.addMailbox()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   505
                Mailbox = self.getMailbox()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   506
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   507
                return None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   508
        CoE = Mailbox.getCoE()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   509
        if CoE is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   510
            if create_default:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   511
                Mailbox.addCoE()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   512
                CoE = Mailbox.getCoE()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   513
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   514
                return None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   515
        InitCmds = CoE.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   516
        if InitCmds is None and create_default:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   517
            CoE.addInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   518
            InitCmds = CoE.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   519
        return InitCmds
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   520
    setattr(cls, "getInitCmds", getInitCmds)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   521
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   522
    def getStartupCommands(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   523
        pos = self.getInfo().getPhysAddr()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   524
        InitCmds = self.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   525
        if InitCmds is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   526
            return []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   527
        commands = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   528
        for idx, InitCmd in enumerate(InitCmds.getInitCmd()):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   529
            comment = InitCmd.getComment()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   530
            if comment is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   531
                comment = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   532
            commands.append({
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   533
                "command_idx": idx,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   534
                "Position": pos,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   535
                "Index": InitCmd.getIndex(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   536
                "Subindex": InitCmd.getSubIndex(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   537
                "Value": InitCmd.getData(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   538
                "Description": comment})
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   539
        commands.sort(sort_commands)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   540
        return commands
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   541
    setattr(cls, "getStartupCommands", getStartupCommands)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   542
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   543
    def appendStartupCommand(self, command_infos):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   544
        InitCmds = self.getInitCmds(True)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   545
        command = EtherCATConfigClasses["InitCmds_InitCmd"]()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   546
        command.setIndex(command_infos["Index"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   547
        command.setSubIndex(command_infos["Subindex"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   548
        command.setData(command_infos["Value"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   549
        command.setComment(command_infos["Description"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   550
        InitCmds.appendInitCmd(command)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   551
        return len(InitCmds.getInitCmd()) - 1
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   552
    setattr(cls, "appendStartupCommand", appendStartupCommand)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   553
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   554
    def setStartupCommand(self, command_infos):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   555
        InitCmds = self.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   556
        if InitCmds is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   557
            commands = InitCmds.getInitCmd()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   558
            if command_infos["command_idx"] < len(commands):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   559
                command = commands[command_infos["command_idx"]]
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   560
                command.setIndex(command_infos["Index"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   561
                command.setSubIndex(command_infos["Subindex"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   562
                command.setData(command_infos["Value"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   563
                command.setComment(command_infos["Description"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   564
    setattr(cls, "setStartupCommand", setStartupCommand)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   565
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   566
    def removeStartupCommand(self, command_idx):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   567
        InitCmds = self.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   568
        if InitCmds is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   569
            if command_idx < len(InitCmds.getInitCmd()):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   570
                InitCmds.removeInitCmd(command_idx)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   571
    setattr(cls, "removeStartupCommand", removeStartupCommand)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   572
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   573
ProcessVariablesXSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   574
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   575
      <xsd:element name="ProcessVariables">
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   576
        <xsd:complexType>
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   577
          <xsd:sequence>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   578
            <xsd:element name="variable" minOccurs="0" maxOccurs="unbounded">
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   579
              <xsd:complexType>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   580
                <xsd:sequence>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   581
                  <xsd:element name="ReadFrom" type="LocationDesc" minOccurs="0"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   582
                  <xsd:element name="WriteTo" type="LocationDesc" minOccurs="0"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   583
                </xsd:sequence>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   584
                <xsd:attribute name="Name" type="xsd:string" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   585
                <xsd:attribute name="Comment" type="xsd:string" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   586
              </xsd:complexType>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   587
            </xsd:element>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   588
          </xsd:sequence>
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   589
        </xsd:complexType>
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   590
      </xsd:element>
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   591
      <xsd:complexType name="LocationDesc">
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   592
        <xsd:attribute name="Position" type="xsd:integer" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   593
        <xsd:attribute name="Index" type="xsd:integer" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   594
        <xsd:attribute name="SubIndex" type="xsd:integer" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   595
      </xsd:complexType>
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   596
    </xsd:schema>
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   597
"""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   598
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   599
ProcessVariablesClasses = GenerateClassesFromXSDstring(ProcessVariablesXSD) 
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   600
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   601
class _EthercatCTN:
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   602
    
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   603
    CTNChildrenTypes = [("EthercatSlave", _EthercatSlaveCTN, "Ethercat Slave")]
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   604
    if HAS_MCL:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   605
        CTNChildrenTypes.append(("EthercatCIA402Slave", _EthercatCIA402SlaveCTN, "Ethercat CIA402 Slave"))
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   606
    EditorType = MasterEditor
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   607
    
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   608
    def __init__(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   609
        config_filepath = self.ConfigFileName()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   610
        config_is_saved = False
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   611
        self.Config = EtherCATConfigClasses["EtherCATConfig"]()
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   612
        if os.path.isfile(config_filepath):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   613
            config_xmlfile = open(config_filepath, 'r')
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   614
            config_tree = minidom.parse(config_xmlfile)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   615
            config_xmlfile.close()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   616
            
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   617
            for child in config_tree.childNodes:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   618
                if child.nodeType == config_tree.ELEMENT_NODE and child.nodeName == "EtherCATConfig":
2051
13dee9322beb refactoring
laurent
parents: 2047
diff changeset
   619
                    self.Config.loadXMLTree(child)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   620
                    config_is_saved = True
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   621
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   622
        process_filepath = self.ProcessVariablesFileName()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   623
        process_is_saved = False
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   624
        self.ProcessVariables = ProcessVariablesClasses["ProcessVariables"]()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   625
        if os.path.isfile(process_filepath):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   626
            process_xmlfile = open(process_filepath, 'r')
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   627
            process_tree = minidom.parse(process_xmlfile)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   628
            process_xmlfile.close()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   629
            
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   630
            for child in process_tree.childNodes:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   631
                if child.nodeType == process_tree.ELEMENT_NODE and child.nodeName == "ProcessVariables":
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   632
                    self.ProcessVariables.loadXMLTree(child)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   633
                    process_is_saved = True
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   634
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   635
        if config_is_saved and process_is_saved:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   636
            self.CreateBuffer(True)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   637
        else:
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   638
            self.CreateBuffer(False)
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   639
            self.OnCTNSave()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   640
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   641
    def ExtractHexDecValue(self, value):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   642
        return ExtractHexDecValue(value)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   643
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   644
    def GetSizeOfType(self, type):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   645
        return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   646
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   647
    def ConfigFileName(self):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   648
        return os.path.join(self.CTNPath(), "config.xml")
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   649
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   650
    def ProcessVariablesFileName(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   651
        return os.path.join(self.CTNPath(), "process_variables.xml")
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   652
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   653
    def FilterSlave(self, slave, vendor=None, slave_pos=None, slave_profile=None):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   654
        if slave_pos is not None and slave.getInfo().getPhysAddr() != slave_pos:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   655
            return False
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   656
        type_infos = slave.getType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   657
        if vendor is not None and ExtractHexDecValue(type_infos["vendor"]) != vendor:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   658
            return False
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   659
        device, alignment = self.GetModuleInfos(type_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   660
        if slave_profile is not None and slave_profile not in device.GetProfileNumbers():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   661
            return False
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   662
        return True
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   663
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   664
    def GetSlaves(self, vendor=None, slave_pos=None, slave_profile=None):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   665
        slaves = []
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   666
        for slave in self.Config.getConfig().getSlave():
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   667
            if self.FilterSlave(slave, vendor, slave_pos, slave_profile):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   668
                slaves.append(slave.getInfo().getPhysAddr())
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   669
        slaves.sort()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   670
        return slaves
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   671
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   672
    def GetSlave(self, slave_pos):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   673
        for slave in self.Config.getConfig().getSlave():
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   674
            slave_info = slave.getInfo()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   675
            if slave_info.getPhysAddr() == slave_pos:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   676
                return slave
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   677
        return None
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   678
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   679
    def GetStartupCommands(self, vendor=None, slave_pos=None, slave_profile=None):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   680
        commands = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   681
        for slave in self.Config.getConfig().getSlave():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   682
            if self.FilterSlave(slave, vendor, slave_pos, slave_profile):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   683
                commands.append((slave.getInfo().getPhysAddr(), slave.getStartupCommands()))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   684
        commands.sort()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   685
        return reduce(lambda x, y: x + y[1], commands, [])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   686
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   687
    def AppendStartupCommand(self, command_infos):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   688
        slave = self.GetSlave(command_infos["Position"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   689
        if slave is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   690
            command_idx = slave.appendStartupCommand(command_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   691
            self.BufferModel()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   692
            return command_idx
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   693
        return None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   694
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   695
    def SetStartupCommandInfos(self, command_infos):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   696
        slave = self.GetSlave(command_infos["Position"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   697
        if slave is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   698
            slave.setStartupCommand(command_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   699
            self.BufferModel()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   700
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   701
    def RemoveStartupCommand(self, slave_pos, command_idx):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   702
        slave = self.GetSlave(slave_pos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   703
        if slave is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   704
            slave.removeStartupCommand(command_idx)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   705
            self.BufferModel()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   706
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   707
    def SetProcessVariables(self, variables):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   708
        vars = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   709
        for var in variables:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   710
            variable = ProcessVariablesClasses["ProcessVariables_variable"]()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   711
            variable.setName(var["Name"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   712
            variable.setComment(var["Description"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   713
            if var["ReadFrom"] != "":
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   714
                position, index, subindex = var["ReadFrom"]
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   715
                if variable.getReadFrom() is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   716
                    variable.addReadFrom()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   717
                read_from = variable.getReadFrom()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   718
                read_from.setPosition(position)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   719
                read_from.setIndex(index)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   720
                read_from.setSubIndex(subindex)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   721
            elif variable.getReadFrom() is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   722
                variable.deleteReadFrom()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   723
            if var["WriteTo"] != "":
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   724
                position, index, subindex = var["WriteTo"]
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   725
                if variable.getWriteTo() is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   726
                    variable.addWriteTo()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   727
                write_to = variable.getWriteTo()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   728
                write_to.setPosition(position)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   729
                write_to.setIndex(index)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   730
                write_to.setSubIndex(subindex)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   731
            elif variable.getWriteTo() is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   732
                variable.deleteWriteTo()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   733
            vars.append(variable)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   734
        self.ProcessVariables.setvariable(vars)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   735
        self.BufferModel()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   736
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   737
    def GetProcessVariables(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   738
        variables = []
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   739
        idx = 0
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   740
        for variable in self.ProcessVariables.getvariable():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   741
            var = {"Name": variable.getName(),
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   742
                   "Number": idx,
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   743
                   "Description": variable.getComment()}
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   744
            read_from = variable.getReadFrom()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   745
            if read_from is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   746
                var["ReadFrom"] = (read_from.getPosition(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   747
                                   read_from.getIndex(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   748
                                   read_from.getSubIndex())
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   749
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   750
                var["ReadFrom"] = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   751
            write_to = variable.getWriteTo()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   752
            if write_to is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   753
                var["WriteTo"] = (write_to.getPosition(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   754
                                   write_to.getIndex(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   755
                                   write_to.getSubIndex())
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   756
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   757
                var["WriteTo"] = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   758
            variables.append(var)
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   759
            idx += 1
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   760
        return variables
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   761
    
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   762
    def _ScanNetwork(self):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   763
        app_frame = self.GetCTRoot().AppFrame
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   764
        
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   765
        execute = True
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   766
        if len(self.Children) > 0:
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   767
            dialog = wx.MessageDialog(app_frame, 
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   768
                _("The current network configuration will be deleted.\nDo you want to continue?"), 
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   769
                _("Scan Network"), 
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   770
                wx.YES_NO|wx.ICON_QUESTION)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   771
            execute = dialog.ShowModal() == wx.ID_YES
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   772
            dialog.Destroy()
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   773
        
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   774
        if execute:
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   775
            error, returnVal = self.RemoteExec(SCAN_COMMAND, returnVal = None)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   776
            if error != 0:
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   777
                dialog = wx.MessageDialog(app_frame, returnVal, "Error", wx.OK|wx.ICON_ERROR)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   778
                dialog.ShowModal()
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   779
                dialog.Destroy()
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   780
            elif returnVal is not None:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   781
                for child in self.IECSortedChildren():
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   782
                    self._doRemoveChild(child)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   783
                
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   784
                for slave in returnVal:
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   785
                    type_infos = {
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   786
                        "vendor": slave["vendor_id"],
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   787
                        "product_code": slave["product_code"],
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   788
                        "revision_number":slave["revision_number"],
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   789
                    }
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
   790
                    device, alignment = self.GetModuleInfos(type_infos)
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   791
                    if device is not None:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   792
                        if HAS_MCL and _EthercatCIA402SlaveCTN.NODE_PROFILE in device.GetProfileNumbers():
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   793
                            CTNType = "EthercatCIA402Slave"
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   794
                        else:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   795
                            CTNType = "EthercatSlave"
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   796
                        self.CTNAddChild("slave%s" % slave["idx"], CTNType, slave["idx"])
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   797
                        self.SetSlaveAlias(slave["idx"], slave["alias"])
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   798
                        type_infos["device_type"] = device.getType().getcontent()
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   799
                        self.SetSlaveType(slave["idx"], type_infos)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   800
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   801
    def CTNAddChild(self, CTNName, CTNType, IEC_Channel=0):
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   802
        """
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   803
        Create the confnodes that may be added as child to this node self
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   804
        @param CTNType: string desining the confnode class name (get name from CTNChildrenTypes)
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   805
        @param CTNName: string for the name of the confnode instance
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   806
        """
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   807
        newConfNodeOpj = ConfigTreeNode.CTNAddChild(self, CTNName, CTNType, IEC_Channel)
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   808
        
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   809
        slave = self.GetSlave(newConfNodeOpj.BaseParams.getIEC_Channel())
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   810
        if slave is None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   811
            slave = EtherCATConfigClasses["Config_Slave"]()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   812
            slave_infos = slave.getInfo()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   813
            slave_infos.setName("undefined")
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   814
            slave_infos.setPhysAddr(newConfNodeOpj.BaseParams.getIEC_Channel())
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   815
            slave_infos.setAutoIncAddr(0)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   816
            self.Config.getConfig().appendSlave(slave)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   817
            self.BufferModel()
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   818
            self.OnCTNSave()
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   819
        
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   820
        return newConfNodeOpj
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   821
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   822
    def _doRemoveChild(self, CTNInstance):
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   823
        slave_pos = CTNInstance.GetSlavePos()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   824
        config = self.Config.getConfig()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   825
        for idx, slave in enumerate(config.getSlave()):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   826
            slave_infos = slave.getInfo()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   827
            if slave_infos.getPhysAddr() == slave_pos:
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   828
                config.removeSlave(idx)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   829
                self.BufferModel()
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   830
                self.OnCTNSave()
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   831
        ConfigTreeNode._doRemoveChild(self, CTNInstance)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   832
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   833
    def SetSlavePosition(self, slave_pos, new_pos):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   834
        slave = self.GetSlave(slave_pos)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   835
        if slave is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   836
            slave_info = slave.getInfo()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   837
            slave_info.setPhysAddr(new_pos)
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   838
            for variable in self.ProcessVariables.getvariable():
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   839
                read_from = variable.getReadFrom()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   840
                if read_from is not None and read_from.getPosition() == slave_pos:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   841
                    read_from.setPosition(new_pos)
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   842
                write_to = variable.getWriteTo()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   843
                if write_to is not None and write_to.getPosition() == slave_pos:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   844
                    write_to.setPosition(new_pos)
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   845
            self.CreateBuffer(True)
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   846
            self.OnCTNSave()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   847
            if self._View is not None:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   848
                self._View.RefreshView()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   849
                self._View.RefreshBuffer()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   850
    
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   851
    def GetSlaveAlias(self, slave_pos):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   852
        slave = self.GetSlave(slave_pos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   853
        if slave is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   854
            slave_info = slave.getInfo()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   855
            return slave_info.getAutoIncAddr()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   856
        return None
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   857
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   858
    def SetSlaveAlias(self, slave_pos, alias):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   859
        slave = self.GetSlave(slave_pos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   860
        if slave is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   861
            slave_info = slave.getInfo()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   862
            slave_info.setAutoIncAddr(alias)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   863
            self.BufferModel()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   864
    
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   865
    def GetSlaveType(self, slave_pos):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   866
        slave = self.GetSlave(slave_pos)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   867
        if slave is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   868
            return slave.getType()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   869
        return None
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   870
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   871
    def SetSlaveType(self, slave_pos, type_infos):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   872
        slave = self.GetSlave(slave_pos)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   873
        if slave is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   874
            slave.setType(type_infos)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   875
            self.BufferModel()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   876
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   877
    def GetSlaveInfos(self, slave_pos):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   878
        slave = self.GetSlave(slave_pos)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   879
        if slave is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   880
            type_infos = slave.getType()
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   881
            device, alignment = self.GetModuleInfos(type_infos)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   882
            if device is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   883
                infos = type_infos.copy()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   884
                infos.update({"physics": device.getPhysics(),
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
   885
                              "sync_managers": device.GetSyncManagers(),
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   886
                              "entries": self.GetSlaveVariables(device)})
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   887
                return infos
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   888
        return None
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   889
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   890
    def GetSlaveVariables(self, slave_pos=None, limits=None, device=None):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   891
        if device is None and slave_pos is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   892
            slave = self.GetSlave(slave_pos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   893
            if slave is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   894
                type_infos = slave.getType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   895
                device, alignment = self.GetModuleInfos(type_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   896
        if device is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   897
            entries = device.GetEntriesList(limits)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   898
            entries_list = entries.items()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   899
            entries_list.sort()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   900
            entries = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   901
            current_index = None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   902
            current_entry = None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   903
            for (index, subindex), entry in entries_list:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   904
                entry["children"] = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   905
                if slave_pos is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   906
                    entry["Position"] = str(slave_pos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   907
                entry
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   908
                if index != current_index:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   909
                    current_index = index
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   910
                    current_entry = entry
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   911
                    entries.append(entry)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   912
                elif current_entry is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   913
                    current_entry["children"].append(entry)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   914
                else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   915
                    entries.append(entry)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   916
            return entries
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   917
        return []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   918
    
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   919
    def GetSlaveVariableDataType(self, slave_pos, index, subindex):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   920
        slave = self.GetSlave(slave_pos)
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   921
        if slave is not None:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   922
            device, alignment = self.GetModuleInfos(slave.getType())
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   923
            if device is not None:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   924
                entries = device.GetEntriesList()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   925
                entry_infos = entries.get((index, subindex))
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   926
                if entry_infos is not None:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   927
                    return entry_infos["Type"]
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   928
        return None
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   929
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   930
    def GetNodesVariables(self, vendor=None, slave_pos=None, slave_profile=None, limits=None):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   931
        entries = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   932
        for slave_position in self.GetSlaves():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   933
            if slave_pos is not None and slave_position != slave_pos:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   934
                continue
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   935
            slave = self.GetSlave(slave_position)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   936
            type_infos = slave.getType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   937
            if vendor is not None and ExtractHexDecValue(type_infos["vendor"]) != vendor:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   938
                continue
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   939
            device, alignment = self.GetModuleInfos(type_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   940
            if slave_profile is not None and slave_profile not in device.GetProfileNumbers():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   941
                continue
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   942
            entries.extend(self.GetSlaveVariables(slave_position, limits, device))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   943
        return entries
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   944
     
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   945
    def GetModuleInfos(self, type_infos):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   946
        return self.CTNParent.GetModuleInfos(type_infos)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   947
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   948
    def GetSlaveTypesLibrary(self, profile_filter=None):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   949
        return self.CTNParent.GetModulesLibrary(profile_filter)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   950
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   951
    def GetLibraryVendors(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   952
        return self.CTNParent.GetVendors()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   953
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   954
    def GetDeviceLocationTree(self, slave_pos, current_location, device_name):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   955
        slave = self.GetSlave(slave_pos)
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   956
        vars = []    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   957
        if slave is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   958
            type_infos = slave.getType()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   959
        
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   960
            device, alignment = self.GetModuleInfos(type_infos)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   961
            if device is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   962
                sync_managers = []
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   963
                for sync_manager in device.getSm():
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   964
                    sync_manager_control_byte = ExtractHexDecValue(sync_manager.getControlByte())
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   965
                    sync_manager_direction = sync_manager_control_byte & 0x0c
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   966
                    if sync_manager_direction:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   967
                        sync_managers.append(LOCATION_VAR_OUTPUT)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   968
                    else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   969
                        sync_managers.append(LOCATION_VAR_INPUT)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   970
                
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   971
                entries = device.GetEntriesList().items()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   972
                entries.sort()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   973
                for (index, subindex), entry in entries:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   974
                    var_size = self.GetSizeOfType(entry["Type"])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   975
                    if var_size is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   976
                        var_class = VARCLASSCONVERSION.get(entry["PDOMapping"], None)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   977
                        if var_class is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   978
                            if var_class == LOCATION_VAR_INPUT:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   979
                                var_dir = "%I"
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   980
                            else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   981
                                var_dir = "%Q"    
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   982
                        
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   983
                            vars.append({"name": "0x%4.4x-0x%2.2x: %s" % (index, subindex, entry["Name"]),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   984
                                         "type": var_class,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   985
                                         "size": var_size,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   986
                                         "IEC_type": entry["Type"],
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   987
                                         "var_name": "%s_%4.4x_%2.2x" % ("_".join(device_name.split()), index, subindex),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   988
                                         "location": "%s%s%s"%(var_dir, var_size, ".".join(map(str, current_location + 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   989
                                                                                                    (index, subindex)))),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   990
                                         "description": "",
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   991
                                         "children": []})
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   992
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   993
        return vars
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   994
    
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   995
    def CTNTestModified(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   996
        return self.ChangesToSave or not self.ModelIsSaved()    
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   997
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   998
    def OnCTNSave(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   999
        config_filepath = self.ConfigFileName()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1000
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1001
        config_text = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1002
        config_extras = {"xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance",
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1003
                  "xsi:noNamespaceSchemaLocation" : "EtherCATInfo.xsd"}
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1004
        config_text += self.Config.generateXMLText("EtherCATConfig", 0, config_extras)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1005
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1006
        config_xmlfile = open(config_filepath,"w")
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1007
        config_xmlfile.write(config_text.encode("utf-8"))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1008
        config_xmlfile.close()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1009
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1010
        process_filepath = self.ProcessVariablesFileName()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1011
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1012
        process_text = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1013
        process_extras = {"xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance"}
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1014
        process_text += self.ProcessVariables.generateXMLText("ProcessVariables", 0, process_extras)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1015
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1016
        process_xmlfile = open(process_filepath,"w")
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1017
        process_xmlfile.write(process_text.encode("utf-8"))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1018
        process_xmlfile.close()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1019
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1020
        self.Buffer.CurrentSaved()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1021
        return True
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1022
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1023
    def _Generate_C(self, buildpath, locations):
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1024
        current_location = self.GetCurrentLocation()
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1025
        # define a unique name for the generated C file
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1026
        location_str = "_".join(map(lambda x:str(x), current_location))
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1027
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1028
        Gen_Ethercatfile_path = os.path.join(buildpath, "ethercat_%s.c"%location_str)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1029
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1030
        self.FileGenerator = _EthercatCFileGenerator(self)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1031
        
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1032
        LocationCFilesAndCFLAGS, LDFLAGS, extra_files = ConfigTreeNode._Generate_C(self, buildpath, locations)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1033
        
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1034
        self.FileGenerator.GenerateCFile(Gen_Ethercatfile_path, location_str, self.BaseParams.getIEC_Channel())
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1035
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1036
        LocationCFilesAndCFLAGS.append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1037
            (current_location, 
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1038
             [(Gen_Ethercatfile_path, '"-I%s"'%os.path.abspath(self.GetCTRoot().GetIECLibPath()))], 
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1039
             True))
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1040
        LDFLAGS.append("-lethercat -lrtdm")
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1041
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1042
        return LocationCFilesAndCFLAGS, LDFLAGS, extra_files
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1043
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1044
    ConfNodeMethods = [
2068
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
  1045
        {"bitmap" : "ScanNetwork",
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1046
         "name" : _("Scan Network"), 
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1047
         "tooltip" : _("Scan Network"),
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1048
         "method" : "_ScanNetwork"},
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1049
    ]
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1050
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1051
    def CTNGenerate_C(self, buildpath, locations):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1052
        """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1053
        Generate C code
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1054
        @param current_location: Tupple containing confnode IEC location : %I0.0.4.5 => (0,0,4,5)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1055
        @param locations: List of complete variables locations \
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1056
            [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1057
            "NAME" : name of the variable (generally "__IW0_1_2" style)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1058
            "DIR" : direction "Q","I" or "M"
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1059
            "SIZE" : size "X", "B", "W", "D", "L"
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1060
            "LOC" : tuple of interger for IEC location (0,1,2,...)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1061
            }, ...]
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1062
        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1063
        """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1064
        current_location = self.GetCurrentLocation()
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1065
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1066
        slaves = self.GetSlaves()
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1067
        for slave_pos in slaves:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1068
            slave = self.GetSlave(slave_pos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1069
            if slave is not None:
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1070
                self.FileGenerator.DeclareSlave(slave_pos, slave)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1071
        
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1072
        for location in locations:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1073
            loc = location["LOC"][len(current_location):]
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1074
            slave_pos = loc[0]
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1075
            if slave_pos in slaves and len(loc) == 3:
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1076
                self.FileGenerator.DeclareVariable(
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1077
                    slave_pos, loc[1], loc[2], location["IEC_TYPE"], location["DIR"], location["NAME"])
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1078
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1079
        return [],"",False
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1080
        
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1081
#-------------------------------------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1082
#                      Current Buffering Management Functions
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1083
#-------------------------------------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1084
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1085
    """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1086
    Return a copy of the config
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1087
    """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1088
    def Copy(self, model):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1089
        return cPickle.loads(cPickle.dumps(model))
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1090
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1091
    def CreateBuffer(self, saved):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1092
        self.Buffer = UndoBuffer(cPickle.dumps((self.Config, self.ProcessVariables)), saved)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1093
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1094
    def BufferModel(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1095
        self.Buffer.Buffering(cPickle.dumps((self.Config, self.ProcessVariables)))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1096
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1097
    def ModelIsSaved(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1098
        if self.Buffer is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1099
            return self.Buffer.IsCurrentSaved()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1100
        else:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1101
            return True
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1102
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1103
    def LoadPrevious(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1104
        self.Config, self.ProcessVariables = cPickle.loads(self.Buffer.Previous())
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1105
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1106
    def LoadNext(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1107
        self.Config, self.ProcessVariables = cPickle.loads(self.Buffer.Next())
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1108
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1109
    def GetBufferState(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1110
        first = self.Buffer.IsFirst()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1111
        last = self.Buffer.IsLast()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1112
        return not first, not last
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1113
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1114
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1115
SLAVE_PDOS_CONFIGURATION_DECLARATION = """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1116
/* Slave %(slave)d, "%(device_type)s"
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1117
 * Vendor ID:       0x%(vendor).8x
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1118
 * Product code:    0x%(product_code).8x
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1119
 * Revision number: 0x%(revision_number).8x
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1120
 */
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1121
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1122
ec_pdo_entry_info_t slave_%(slave)d_pdo_entries[] = {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1123
%(pdos_entries_infos)s
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1124
};
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1125
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1126
ec_pdo_info_t slave_%(slave)d_pdos[] = {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1127
%(pdos_infos)s
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1128
};
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1129
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1130
ec_sync_info_t slave_%(slave)d_syncs[] = {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1131
%(pdos_sync_infos)s
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1132
    {0xff}
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1133
};
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1134
"""
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1135
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1136
SLAVE_CONFIGURATION_TEMPLATE = """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1137
    if (!(slave%(slave)d = ecrt_master_slave_config(master, %(alias)d, %(position)d, 0x%(vendor).8x, 0x%(product_code).8x))) {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1138
        fprintf(stderr, "Failed to get slave %(device_type)s configuration at alias %(alias)d and position %(position)d.\\n");
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1139
        return -1;
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1140
    }
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1141
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1142
    if (ecrt_slave_config_pdos(slave%(slave)d, EC_END, slave_%(slave)d_syncs)) {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1143
        fprintf(stderr, "Failed to configure PDOs for slave %(device_type)s at alias %(alias)d and position %(position)d.\\n");
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1144
        return -1;
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1145
    }
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1146
"""
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1147
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1148
SLAVE_INITIALIZATION_TEMPLATE = """
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1149
    {
2081
b1801bf4365c Fix bug in endianization in value transmit and received by SDO
Laurent Bessard
parents: 2080
diff changeset
  1150
        uint8_t value[%(data_size)d];
b1801bf4365c Fix bug in endianization in value transmit and received by SDO
Laurent Bessard
parents: 2080
diff changeset
  1151
        EC_WRITE_%(data_type)s((uint8_t *)value, %(data)s);
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1152
        if (ecrt_master_sdo_download(master, %(slave)d, 0x%(index).4x, 0x%(subindex).2x, (uint8_t *)value, %(data_size)d, &abort_code)) {
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1153
            fprintf(stderr, "Failed to initialize slave %(device_type)s at alias %(alias)d and position %(position)d.\\nError: %%d\\n", abort_code);
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1154
            return -1;
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1155
        }
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1156
    }
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1157
"""
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1158
2039
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1159
SLAVE_OUTPUT_PDO_DEFAULT_VALUE = """
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1160
    {
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1161
        uint8_t value[%(data_size)d];
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1162
        if (ecrt_master_sdo_upload(master, %(slave)d, 0x%(index).4x, 0x%(subindex).2x, (uint8_t *)value, %(data_size)d, &result_size, &abort_code)) {
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1163
            fprintf(stderr, "Failed to get default value for output PDO in slave %(device_type)s at alias %(alias)d and position %(position)d.\\nError: %%d\\n", abort_code);
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1164
            return -1;
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1165
        }
2081
b1801bf4365c Fix bug in endianization in value transmit and received by SDO
Laurent Bessard
parents: 2080
diff changeset
  1166
        %(real_var)s = EC_READ_%(data_type)s((uint8_t *)value);
2039
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1167
    }
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1168
"""
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1169
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1170
def ConfigureVariable(entry_infos, str_completion):
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1171
    entry_infos["data_type"] = DATATYPECONVERSION.get(entry_infos["var_type"], None)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1172
    if entry_infos["data_type"] is None:
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1173
        raise ValueError, _("Type of location \"%s\" not yet supported!") % entry_infos["var_name"]
2039
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1174
    
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1175
    if entry_infos.has_key("real_var"):
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1176
        str_completion["located_variables_declaration"].append(
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1177
            "IEC_%(var_type)s %(real_var)s;" % entry_infos)
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1178
    else:
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1179
        entry_infos["real_var"] = "beremiz" + entry_infos["var_name"]
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1180
        str_completion["located_variables_declaration"].extend(
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1181
            ["IEC_%(var_type)s %(real_var)s;" % entry_infos,
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1182
             "IEC_%(var_type)s *%(var_name)s = &%(real_var)s;" % entry_infos])
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1183
    
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1184
    str_completion["used_pdo_entry_offset_variables_declaration"].append(
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1185
        "unsigned int slave%(slave)d_%(index).4x_%(subindex).2x;" % entry_infos)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1186
    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1187
    if entry_infos["data_type"] == "BIT":
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1188
        str_completion["used_pdo_entry_offset_variables_declaration"].append(
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1189
            "unsigned int slave%(slave)d_%(index).4x_%(subindex).2x_bit;" % entry_infos)
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1190
        
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1191
        str_completion["used_pdo_entry_configuration"].append(
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1192
             ("    {%(alias)d, %(position)d, 0x%(vendor).8x, 0x%(product_code).8x, " + 
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1193
              "0x%(index).4x, %(subindex)d, &slave%(slave)d_%(index).4x_%(subindex).2x, " + 
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1194
              "&slave%(slave)d_%(index).4x_%(subindex).2x_bit},") % entry_infos)
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1195
        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1196
        if entry_infos["dir"] == "I":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1197
            str_completion["retrieve_variables"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1198
              ("    %(real_var)s = EC_READ_BIT(domain1_pd + slave%(slave)d_%(index).4x_%(subindex).2x, " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1199
               "slave%(slave)d_%(index).4x_%(subindex).2x_bit);") % entry_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1200
        elif entry_infos["dir"] == "Q":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1201
            str_completion["publish_variables"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1202
              ("    EC_WRITE_BIT(domain1_pd + slave%(slave)d_%(index).4x_%(subindex).2x, " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1203
               "slave%(slave)d_%(index).4x_%(subindex).2x_bit, %(real_var)s);") % entry_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1204
    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1205
    else:
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1206
        str_completion["used_pdo_entry_configuration"].append(
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1207
            ("    {%(alias)d, %(position)d, 0x%(vendor).8x, 0x%(product_code).8x, 0x%(index).4x, " + 
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1208
             "%(subindex)d, &slave%(slave)d_%(index).4x_%(subindex).2x},") % entry_infos)
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1209
        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1210
        if entry_infos["dir"] == "I":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1211
            str_completion["retrieve_variables"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1212
                ("    %(real_var)s = EC_READ_%(data_type)s(domain1_pd + " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1213
                 "slave%(slave)d_%(index).4x_%(subindex).2x);") % entry_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1214
        elif entry_infos["dir"] == "Q":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1215
            str_completion["publish_variables"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1216
                ("    EC_WRITE_%(data_type)s(domain1_pd + slave%(slave)d_%(index).4x_%(subindex).2x, " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1217
                 "%(real_var)s);") % entry_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1218
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1219
def ExclusionSortFunction(x, y):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1220
    if x["matching"] == y["matching"]:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1221
        if x["assigned"] and not y["assigned"]:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1222
            return -1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1223
        elif not x["assigned"] and y["assigned"]:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1224
            return 1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1225
        return cmp(x["count"], y["count"])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1226
    return -cmp(x["matching"], y["matching"])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1227
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1228
class _EthercatCFileGenerator:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1229
    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1230
    def __init__(self, controler):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1231
        self.Controler = controler
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1232
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1233
        self.Slaves = []
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1234
        self.UsedVariables = {}
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1235
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1236
    def __del__(self):
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1237
        self.Controler = None            
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1238
    
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1239
    def DeclareSlave(self, slave_index, slave):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1240
        self.Slaves.append((slave_index, slave.getInfo().getAutoIncAddr(), slave))
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1241
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1242
    def DeclareVariable(self, slave_index, index, subindex, iec_type, dir, name):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1243
        slave_variables = self.UsedVariables.setdefault(slave_index, {})
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1244
        
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1245
        entry_infos = slave_variables.get((index, subindex), None)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1246
        if entry_infos is None:
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1247
            slave_variables[(index, subindex)] = {
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1248
                "infos": (iec_type, dir, name),
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1249
                "mapped": False}
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1250
        elif entry_infos["infos"] != (iec_type, dir, name):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1251
            raise ValueError, _("Definition conflict for location \"%s\"") % name 
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1252
        
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1253
    def GenerateCFile(self, filepath, location_str, master_number):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1254
        
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1255
        # Extract etherlab master code template
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1256
        plc_etherlab_filepath = os.path.join(os.path.split(__file__)[0], "plc_etherlab.c")
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1257
        plc_etherlab_file = open(plc_etherlab_filepath, 'r')
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1258
        plc_etherlab_code = plc_etherlab_file.read()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1259
        plc_etherlab_file.close()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1260
        
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1261
        # Initialize strings for formatting master code template
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1262
        str_completion = {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1263
            "location": location_str,
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1264
            "master_number": master_number,
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1265
            "located_variables_declaration": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1266
            "used_pdo_entry_offset_variables_declaration": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1267
            "used_pdo_entry_configuration": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1268
            "pdos_configuration_declaration": "",
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1269
            "slaves_declaration": "",
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1270
            "slaves_configuration": "",
2039
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1271
            "slaves_output_pdos_default_values_extraction": "",
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1272
            "slaves_initialization": "",
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1273
            "retrieve_variables": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1274
            "publish_variables": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1275
        }
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1276
        
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1277
        # Initialize variable storing variable mapping state
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1278
        for slave_entries in self.UsedVariables.itervalues():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1279
            for entry_infos in slave_entries.itervalues():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1280
                entry_infos["mapped"] = False
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1281
        
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1282
        # Sort slaves by position (IEC_Channel)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1283
        self.Slaves.sort()
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1284
        # Initialize dictionary storing alias auto-increment position values
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1285
        alias = {}
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1286
        
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1287
        # Generating code for each slave
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1288
        for (slave_idx, slave_alias, slave) in self.Slaves:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1289
            type_infos = slave.getType()
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1290
            
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1291
            # Defining slave alias and auto-increment position
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1292
            if alias.get(slave_alias) is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1293
                alias[slave_alias] += 1
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1294
            else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1295
                alias[slave_alias] = 0
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1296
            slave_pos = (slave_alias, alias[slave_alias])
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1297
            
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1298
            # Extract slave device informations
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1299
            device, alignment = self.Controler.GetModuleInfos(type_infos)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1300
            if device is not None:
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1301
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1302
                # Extract slaves variables to be mapped
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1303
                slave_variables = self.UsedVariables.get(slave_idx, {})
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1304
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1305
                # Extract slave device object dictionary entries
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1306
                device_entries = device.GetEntriesList()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1307
                
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1308
                # Adding code for declaring slave in master code template strings
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1309
                for element in ["vendor", "product_code", "revision_number"]:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1310
                    type_infos[element] = ExtractHexDecValue(type_infos[element])
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1311
                type_infos.update(dict(zip(["slave", "alias", "position"], (slave_idx,) + slave_pos)))
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1312
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1313
                # Extract slave device CoE informations
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1314
                device_coe = device.getCoE()
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1315
                if device_coe is not None:
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1316
                    
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1317
                    # If device support CanOpen over Ethernet, adding code for calling 
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1318
                    # init commands when initializing slave in master code template strings
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1319
                    initCmds = []
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1320
                    for initCmd in device_coe.getInitCmd():
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1321
                        initCmds.append({
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1322
                            "Index": ExtractHexDecValue(initCmd.getIndex()),
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1323
                            "Subindex": ExtractHexDecValue(initCmd.getSubIndex()),
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1324
                            "Value": initCmd.getData().getcontent()})
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1325
                    initCmds.extend(slave.getStartupCommands())
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1326
                    for initCmd in initCmds:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1327
                        index = initCmd["Index"]
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1328
                        subindex = initCmd["Subindex"]
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1329
                        entry = device_entries.get((index, subindex), None)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1330
                        if entry is not None:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1331
                            data_size = entry["BitSize"] / 8
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1332
                            data_str = ("0x%%.%dx" % (data_size * 2)) % initCmd["Value"]
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1333
                            init_cmd_infos = {
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1334
                                "index": index,
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1335
                                "subindex": subindex,
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1336
                                "data": data_str,
2081
b1801bf4365c Fix bug in endianization in value transmit and received by SDO
Laurent Bessard
parents: 2080
diff changeset
  1337
                                "data_type": DATATYPECONVERSION.get(entry["Type"]),
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1338
                                "data_size": data_size
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1339
                            }
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1340
                            init_cmd_infos.update(type_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1341
                            str_completion["slaves_initialization"] += SLAVE_INITIALIZATION_TEMPLATE % init_cmd_infos
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1342
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1343
                    # Extract slave device PDO configuration capabilities
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1344
                    PdoAssign = device_coe.getPdoAssign()
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1345
                    PdoConfig = device_coe.getPdoConfig()
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1346
                else:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1347
                    PdoAssign = PdoConfig = False
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1348
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1349
                # Test if slave has a configuration or need one
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1350
                if len(device.getTxPdo() + device.getRxPdo()) > 0 or len(slave_variables) > 0 and PdoConfig and PdoAssign:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1351
                    
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1352
                    str_completion["slaves_declaration"] += "static ec_slave_config_t *slave%(slave)d = NULL;\n" % type_infos
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1353
                    str_completion["slaves_configuration"] += SLAVE_CONFIGURATION_TEMPLATE % type_infos
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1354
                    
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1355
                    # Initializing 
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1356
                    pdos_infos = {
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1357
                        "pdos_entries_infos": [],
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1358
                        "pdos_infos": [],
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1359
                        "pdos_sync_infos": [], 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1360
                    }
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1361
                    pdos_infos.update(type_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1362
                    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1363
                    sync_managers = []
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1364
                    for sync_manager_idx, sync_manager in enumerate(device.getSm()):
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1365
                        sync_manager_infos = {
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1366
                            "index": sync_manager_idx, 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1367
                            "name": sync_manager.getcontent(),
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1368
                            "slave": slave_idx,
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1369
                            "pdos": [], 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1370
                            "pdos_number": 0,
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1371
                        }
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1372
                        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1373
                        sync_manager_control_byte = ExtractHexDecValue(sync_manager.getControlByte())
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1374
                        sync_manager_direction = sync_manager_control_byte & 0x0c
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1375
                        sync_manager_watchdog = sync_manager_control_byte & 0x40
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1376
                        if sync_manager_direction:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1377
                            sync_manager_infos["sync_manager_type"] = "EC_DIR_OUTPUT"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1378
                        else:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1379
                            sync_manager_infos["sync_manager_type"] = "EC_DIR_INPUT"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1380
                        if sync_manager_watchdog:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1381
                            sync_manager_infos["watchdog"] = "EC_WD_ENABLE"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1382
                        else:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1383
                            sync_manager_infos["watchdog"] = "EC_WD_DISABLE"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1384
                        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1385
                        sync_managers.append(sync_manager_infos)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1386
                    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1387
                    pdos_index = []
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1388
                    exclusive_pdos = {}
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1389
                    selected_pdos = []
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1390
                    for pdo, pdo_type in ([(pdo, "Inputs") for pdo in device.getTxPdo()] +
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1391
                                          [(pdo, "Outputs") for pdo in device.getRxPdo()]):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1392
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1393
                        pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1394
                        pdos_index.append(pdo_index)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1395
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1396
                        excluded_list = pdo.getExclude()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1397
                        if len(excluded_list) > 0:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1398
                            exclusion_list = [pdo_index]
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1399
                            for excluded in excluded_list:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1400
                                exclusion_list.append(ExtractHexDecValue(excluded.getcontent()))
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1401
                            exclusion_list.sort()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1402
                            
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1403
                            exclusion_scope = exclusive_pdos.setdefault(tuple(exclusion_list), [])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1404
                            
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1405
                            entries = pdo.getEntry()
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1406
                            pdo_mapping_match = {
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1407
                                "index": pdo_index, 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1408
                                "matching": 0, 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1409
                                "count": len(entries), 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1410
                                "assigned": pdo.getSm() is not None
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1411
                            }
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1412
                            exclusion_scope.append(pdo_mapping_match)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1413
                            
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1414
                            for entry in entries:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1415
                                index = ExtractHexDecValue(entry.getIndex().getcontent())
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1416
                                subindex = ExtractHexDecValue(entry.getSubIndex())
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1417
                                if slave_variables.get((index, subindex), None) is not None:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1418
                                    pdo_mapping_match["matching"] += 1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1419
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1420
                        elif pdo.getMandatory():
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1421
                            selected_pdos.append(pdo_index)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1422
                    
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1423
                    excluded_pdos = []
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1424
                    for exclusion_scope in exclusive_pdos.itervalues():
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1425
                        exclusion_scope.sort(ExclusionSortFunction)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1426
                        start_excluding_index = 0
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1427
                        if exclusion_scope[0]["matching"] > 0:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1428
                            selected_pdos.append(exclusion_scope[0]["index"])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1429
                            start_excluding_index = 1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1430
                        excluded_pdos.extend([pdo["index"] for pdo in exclusion_scope[start_excluding_index:] if PdoAssign or not pdo["assigned"]])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1431
                    
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1432
                    for pdo, pdo_type in ([(pdo, "Inputs") for pdo in device.getTxPdo()] +
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1433
                                          [(pdo, "Outputs") for pdo in device.getRxPdo()]):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1434
                        entries = pdo.getEntry()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1435
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1436
                        pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1437
                        if pdo_index in excluded_pdos:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1438
                            continue
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1439
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1440
                        pdo_needed = pdo_index in selected_pdos
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1441
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1442
                        entries_infos = []
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1443
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1444
                        for entry in entries:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1445
                            index = ExtractHexDecValue(entry.getIndex().getcontent())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1446
                            subindex = ExtractHexDecValue(entry.getSubIndex())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1447
                            entry_infos = {
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1448
                                "index": index,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1449
                                "subindex": subindex,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1450
                                "name": ExtractName(entry.getName()),
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1451
                                "bitlen": entry.getBitLen(),
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1452
                            }
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1453
                            entry_infos.update(type_infos)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1454
                            entries_infos.append("    {0x%(index).4x, 0x%(subindex).2x, %(bitlen)d}, /* %(name)s */" % entry_infos)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1455
                            
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1456
                            entry_declaration = slave_variables.get((index, subindex), None)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1457
                            if entry_declaration is not None and not entry_declaration["mapped"]:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1458
                                pdo_needed = True
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1459
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1460
                                entry_infos.update(dict(zip(["var_type", "dir", "var_name"], entry_declaration["infos"])))
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1461
                                entry_declaration["mapped"] = True
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1462
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1463
                                entry_type = entry.getDataType().getcontent()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1464
                                if entry_infos["var_type"] != entry_type:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1465
                                    message = _("Wrong type for location \"%s\"!") % entry_infos["var_name"]
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1466
                                    if (self.Controler.GetSizeOfType(entry_infos["var_type"]) != 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1467
                                        self.Controler.GetSizeOfType(entry_type)):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1468
                                        raise ValueError, message
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1469
                                    else:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1470
                                        self.Controler.GetCTRoot().logger.write_warning(_("Warning: ") + message + "\n")
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1471
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1472
                                if (entry_infos["dir"] == "I" and pdo_type != "Inputs" or 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1473
                                    entry_infos["dir"] == "Q" and pdo_type != "Outputs"):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1474
                                    raise ValueError, _("Wrong direction for location \"%s\"!") % entry_infos["var_name"]
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1475
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1476
                                ConfigureVariable(entry_infos, str_completion)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1477
                            
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1478
                            elif pdo_type == "Outputs" and entry.getDataType() is not None and device_coe is not None:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1479
                                data_type = entry.getDataType().getcontent()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1480
                                entry_infos["dir"] = "Q"
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1481
                                entry_infos["data_size"] = max(1, entry_infos["bitlen"] / 8)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1482
                                entry_infos["data_type"] = DATATYPECONVERSION.get(data_type)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1483
                                entry_infos["var_type"] = data_type
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1484
                                entry_infos["real_var"] = "slave%(slave)d_%(index).4x_%(subindex).2x_default" % entry_infos
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1485
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1486
                                ConfigureVariable(entry_infos, str_completion)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1487
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1488
                                str_completion["slaves_output_pdos_default_values_extraction"] += \
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1489
                                    SLAVE_OUTPUT_PDO_DEFAULT_VALUE % entry_infos
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1490
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1491
                        if pdo_needed:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1492
                            for excluded in pdo.getExclude():
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1493
                                excluded_index = ExtractHexDecValue(excluded.getcontent())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1494
                                if excluded_index not in excluded_pdos:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1495
                                    excluded_pdos.append(excluded_index)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1496
                            
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1497
                            sm = pdo.getSm()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1498
                            if sm is None:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1499
                                for sm_idx, sync_manager in enumerate(sync_managers):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1500
                                    if sync_manager["name"] == pdo_type:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1501
                                        sm = sm_idx
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1502
                            if sm is None:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1503
                                raise ValueError, _("No sync manager available for %s pdo!") % pdo_type
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1504
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1505
                            sync_managers[sm]["pdos_number"] += 1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1506
                            sync_managers[sm]["pdos"].append(
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1507
                                {"slave": slave_idx,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1508
                                 "index": pdo_index,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1509
                                 "name": ExtractName(pdo.getName()),
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1510
                                 "type": pdo_type, 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1511
                                 "entries": entries_infos,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1512
                                 "entries_number": len(entries_infos),
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1513
                                 "fixed": pdo.getFixed() == True})
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1514
                
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1515
                    if PdoConfig and PdoAssign:
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1516
                        dynamic_pdos = {}
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1517
                        dynamic_pdos_number = 0
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1518
                        for category, min_index, max_index in [("Inputs", 0x1600, 0x1800), 
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1519
                                                               ("Outputs", 0x1a00, 0x1C00)]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1520
                            for sync_manager in sync_managers:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1521
                                if sync_manager["name"] == category:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1522
                                    category_infos = dynamic_pdos.setdefault(category, {})
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1523
                                    category_infos["sync_manager"] = sync_manager
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1524
                                    category_infos["pdos"] = [pdo for pdo in category_infos["sync_manager"]["pdos"] 
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1525
                                                              if not pdo["fixed"] and pdo["type"] == category]
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1526
                                    category_infos["current_index"] = min_index
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1527
                                    category_infos["max_index"] = max_index
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1528
                                    break
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1529
                        
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1530
                        for (index, subindex), entry_declaration in slave_variables.iteritems():
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1531
                            
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1532
                            if not entry_declaration["mapped"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1533
                                entry = device_entries.get((index, subindex), None)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1534
                                if entry is None:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1535
                                    raise ValueError, _("Unknown entry index 0x%4.4x, subindex 0x%2.2x for device %s") % \
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1536
                                                     (index, subindex, type_infos["device_type"])
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1537
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1538
                                entry_infos = {
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1539
                                    "index": index,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1540
                                    "subindex": subindex,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1541
                                    "name": entry["Name"],
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1542
                                    "bitlen": entry["BitSize"],
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1543
                                }
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1544
                                entry_infos.update(type_infos)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1545
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1546
                                entry_infos.update(dict(zip(["var_type", "dir", "var_name", "real_var"], entry_declaration["infos"])))
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1547
                                entry_declaration["mapped"] = True
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1548
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1549
                                if entry_infos["var_type"] != entry["Type"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1550
                                    message = _("Wrong type for location \"%s\"!") % entry_infos["var_name"]
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1551
                                    if (self.Controler.GetSizeOfType(entry_infos["var_type"]) != 
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1552
                                        self.Controler.GetSizeOfType(entry["Type"])):
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1553
                                        raise ValueError, message
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1554
                                    else:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1555
                                        self.Controler.GetCTRoot().logger.write_warning(message + "\n")
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1556
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1557
                                if entry_infos["dir"] == "I" and entry["PDOMapping"] in ["T", "RT"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1558
                                    pdo_type = "Inputs"
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1559
                                elif entry_infos["dir"] == "Q" and entry["PDOMapping"] in ["R", "RT"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1560
                                    pdo_type = "Outputs"
2045
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
  1561
                                else:
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1562
                                    raise ValueError, _("Wrong direction for location \"%s\"!") % entry_infos["var_name"]
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1563
                                
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1564
                                if not dynamic_pdos.has_key(pdo_type):
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1565
                                    raise ValueError, _("No Sync manager defined for %s!") % pdo_type
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1566
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1567
                                ConfigureVariable(entry_infos, str_completion)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1568
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1569
                                if len(dynamic_pdos[pdo_type]["pdos"]) > 0:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1570
                                    pdo = dynamic_pdos[pdo_type]["pdos"][0]
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1571
                                else:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1572
                                    while dynamic_pdos[pdo_type]["current_index"] in pdos_index:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1573
                                        dynamic_pdos[pdo_type]["current_index"] += 1
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1574
                                    if dynamic_pdos[pdo_type]["current_index"] >= dynamic_pdos[pdo_type]["max_index"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1575
                                        raise ValueError, _("No more free PDO index available for %s!") % pdo_type
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1576
                                    pdos_index.append(dynamic_pdos[pdo_type]["current_index"])
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1577
                                    
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1578
                                    dynamic_pdos_number += 1
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1579
                                    pdo = {"slave": slave_idx,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1580
                                           "index": dynamic_pdos[pdo_type]["current_index"],
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1581
                                           "name": "Dynamic PDO %d" % dynamic_pdos_number,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1582
                                           "type": pdo_type, 
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1583
                                           "entries": [],
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1584
                                           "entries_number": 0,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1585
                                           "fixed": False}
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1586
                                    dynamic_pdos[pdo_type]["sync_manager"]["pdos_number"] += 1
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1587
                                    dynamic_pdos[pdo_type]["sync_manager"]["pdos"].append(pdo)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1588
                                    dynamic_pdos[pdo_type]["pdos"].append(pdo)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1589
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1590
                                pdo["entries"].append("    {0x%(index).4x, 0x%(subindex).2x, %(bitlen)d}, /* %(name)s */" % entry_infos)
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1591
                                if entry_infos["bitlen"] < alignment:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1592
                                    pdo["entries"].append("    {0x0000, 0x00, %d}, /* None */" % (alignment - entry_infos["bitlen"]))
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1593
                                pdo["entries_number"] += 1
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1594
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1595
                                if pdo["entries_number"] == 255:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1596
                                    dynamic_pdos[pdo_type]["pdos"].pop(0)
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1597
                    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1598
                    pdo_offset = 0
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1599
                    entry_offset = 0
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1600
                    for sync_manager_infos in sync_managers:
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1601
                    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1602
                        for pdo_infos in sync_manager_infos["pdos"]:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1603
                            pdo_infos["offset"] = entry_offset
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1604
                            pdo_entries = pdo_infos["entries"]
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1605
                            pdos_infos["pdos_infos"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1606
                                ("    {0x%(index).4x, %(entries_number)d, " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1607
                                 "slave_%(slave)d_pdo_entries + %(offset)d}, /* %(name)s */") % pdo_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1608
                            entry_offset += len(pdo_entries)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1609
                            pdos_infos["pdos_entries_infos"].extend(pdo_entries)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1610
                        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1611
                        sync_manager_infos["offset"] = pdo_offset
2047
b0b7bd288b6e Fixed wrong PDO in unused sync managers\nFix higen drive ethercat example
edouard_and_laurent
parents: 2045
diff changeset
  1612
                        pdo_offset_shift = sync_manager_infos["pdos_number"]
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1613
                        pdos_infos["pdos_sync_infos"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1614
                            ("    {%(index)d, %(sync_manager_type)s, %(pdos_number)d, " + 
2047
b0b7bd288b6e Fixed wrong PDO in unused sync managers\nFix higen drive ethercat example
edouard_and_laurent
parents: 2045
diff changeset
  1615
                             ("slave_%(slave)d_pdos + %(offset)d" if pdo_offset_shift else "NULL") +
b0b7bd288b6e Fixed wrong PDO in unused sync managers\nFix higen drive ethercat example
edouard_and_laurent
parents: 2045
diff changeset
  1616
                             ", %(watchdog)s},") % sync_manager_infos)
b0b7bd288b6e Fixed wrong PDO in unused sync managers\nFix higen drive ethercat example
edouard_and_laurent
parents: 2045
diff changeset
  1617
                        pdo_offset += pdo_offset_shift  
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1618
                    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1619
                    for element in ["pdos_entries_infos", "pdos_infos", "pdos_sync_infos"]:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1620
                        pdos_infos[element] = "\n".join(pdos_infos[element])
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1621
                    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1622
                    str_completion["pdos_configuration_declaration"] += SLAVE_PDOS_CONFIGURATION_DECLARATION % pdos_infos
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1623
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1624
                for (index, subindex), entry_declaration in slave_variables.iteritems():
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1625
                    if not entry_declaration["mapped"]:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1626
                        message = _("Entry index 0x%4.4x, subindex 0x%2.2x not mapped for device %s") % \
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1627
                                        (index, subindex, type_infos["device_type"])
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1628
                        self.Controler.GetCTRoot().logger.write_warning(_("Warning: ") + message + "\n")
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1629
                    
2023
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1630
        for element in ["used_pdo_entry_offset_variables_declaration", 
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1631
                        "used_pdo_entry_configuration", 
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1632
                        "located_variables_declaration", 
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1633
                        "retrieve_variables", 
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1634
                        "publish_variables"]:
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1635
            str_completion[element] = "\n".join(str_completion[element])
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1636
        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1637
        etherlabfile = open(filepath, 'w')
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1638
        etherlabfile.write(plc_etherlab_code % str_completion)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1639
        etherlabfile.close()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1640
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1641
#--------------------------------------------------
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1642
#                 Ethercat ConfNode
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1643
#--------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1644
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1645
EtherCATInfoClasses = GenerateClassesFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATInfo.xsd")) 
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1646
2074
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1647
cls = EtherCATInfoClasses["EtherCATBase.xsd"].get("DictionaryType", None)
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1648
if cls:
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1649
    cls.loadXMLTreeArgs = None
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1650
    
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1651
    setattr(cls, "_loadXMLTree", getattr(cls, "loadXMLTree"))
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1652
    
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1653
    def loadXMLTree(self, *args):
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1654
        self.loadXMLTreeArgs = args
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1655
    setattr(cls, "loadXMLTree", loadXMLTree)
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1656
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1657
    def load(self):
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1658
        if self.loadXMLTreeArgs is not None:
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1659
            self._loadXMLTree(*self.loadXMLTreeArgs)
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1660
            self.loadXMLTreeArgs = None
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1661
    setattr(cls, "load", load)
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1662
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1663
cls = EtherCATInfoClasses["EtherCATInfo.xsd"].get("DeviceType", None)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1664
if cls:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1665
    cls.DataTypes = None
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1666
    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1667
    def GetProfileNumbers(self):
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1668
        profiles = []
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1669
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1670
        for profile in self.getProfile():
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1671
            profile_content = profile.getcontent()
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1672
            if profile_content is None:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1673
                continue
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1674
            
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1675
            for content_element in profile_content["value"]:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1676
                if content_element["name"] == "ProfileNo":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1677
                    profiles.append(content_element["value"])
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1678
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1679
        return profiles
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1680
    setattr(cls, "GetProfileNumbers", GetProfileNumbers)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1681
    
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1682
    def GetProfileDictionaries(self):
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1683
        dictionaries = []
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1684
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1685
        for profile in self.getProfile():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1686
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1687
            profile_content = profile.getcontent()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1688
            if profile_content is None:
2031
c6f32810723e Fix some issues regarding arbitrary variable mapping
laurent
parents: 2030
diff changeset
  1689
                continue
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1690
            
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1691
            for content_element in profile_content["value"]:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1692
                if content_element["name"] == "Dictionary":
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1693
                    dictionaries.append(content_element["value"])
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1694
                elif content_element["name"] == "DictionaryFile":
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1695
                    raise ValueError, "DictionaryFile for defining Device Profile is not yet supported!"
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1696
                
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1697
        return dictionaries
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1698
    setattr(cls, "GetProfileDictionaries", GetProfileDictionaries)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1699
    
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1700
    def ExtractDataTypes(self):
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1701
        self.DataTypes = {}
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1702
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1703
        for dictionary in self.GetProfileDictionaries():
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1704
            dictionary.load()
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1705
            
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1706
            datatypes = dictionary.getDataTypes()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1707
            if datatypes is not None:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1708
                
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1709
                for datatype in datatypes.getDataType():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1710
                    content = datatype.getcontent()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1711
                    if content is not None and content["name"] == "SubItem":
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1712
                        self.DataTypes[datatype.getName()] = datatype
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1713
    
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1714
    setattr(cls, "ExtractDataTypes", ExtractDataTypes)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1715
    
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1716
    def getCoE(self):
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1717
        mailbox = self.getMailbox()
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1718
        if mailbox is not None:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1719
            return mailbox.getCoE()
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1720
        return None
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1721
    setattr(cls, "getCoE", getCoE)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1722
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1723
    def GetEntriesList(self, limits=None):
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1724
        if self.DataTypes is None:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1725
            self.ExtractDataTypes()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1726
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1727
        entries = {}
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1728
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1729
        for dictionary in self.GetProfileDictionaries():
2074
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1730
            dictionary.load()
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1731
            
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1732
            for object in dictionary.getObjects().getObject():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1733
                entry_index = object.getIndex().getcontent()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1734
                index = ExtractHexDecValue(entry_index)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1735
                if limits is None or limits[0] <= index <= limits[1]:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1736
                    entry_type = object.getType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1737
                    entry_name = ExtractName(object.getName())
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1738
                    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1739
                    entry_type_infos = self.DataTypes.get(entry_type, None)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1740
                    if entry_type_infos is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1741
                        content = entry_type_infos.getcontent()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1742
                        for subitem in content["value"]:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1743
                            entry_subidx = subitem.getSubIdx()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1744
                            if entry_subidx is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1745
                                entry_subidx = "0"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1746
                            subidx = ExtractHexDecValue(entry_subidx)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1747
                            subitem_access = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1748
                            subitem_pdomapping = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1749
                            subitem_flags = subitem.getFlags()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1750
                            if subitem_flags is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1751
                                access = subitem_flags.getAccess()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1752
                                if access is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1753
                                    subitem_access = access.getcontent()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1754
                                pdomapping = subitem_flags.getPdoMapping()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1755
                                if pdomapping is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1756
                                    subitem_pdomapping = pdomapping.upper()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1757
                            entries[(index, subidx)] = {
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1758
                                "Index": entry_index,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1759
                                "SubIndex": entry_subidx,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1760
                                "Name": "%s - %s" % 
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1761
                                        (entry_name.decode("utf-8"),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1762
                                         ExtractName(subitem.getDisplayName(), 
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1763
                                                     subitem.getName()).decode("utf-8")),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1764
                                "Type": subitem.getType(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1765
                                "BitSize": subitem.getBitSize(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1766
                                "Access": subitem_access, 
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1767
                                "PDOMapping": subitem_pdomapping}
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1768
                    else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1769
                        entry_access = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1770
                        entry_pdomapping = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1771
                        entry_flags = object.getFlags()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1772
                        if entry_flags is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1773
                            access = entry_flags.getAccess()
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1774
                            if access is not None:
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1775
                                entry_access = access.getcontent()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1776
                            pdomapping = entry_flags.getPdoMapping()
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1777
                            if pdomapping is not None:
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1778
                                entry_pdomapping = pdomapping.upper()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1779
                        entries[(index, 0)] = {
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1780
                             "Index": entry_index,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1781
                             "SubIndex": "0",
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1782
                             "Name": entry_name,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1783
                             "Type": entry_type,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1784
                             "BitSize": object.getBitSize(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1785
                             "Access": entry_access,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1786
                             "PDOMapping": entry_pdomapping}
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1787
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1788
        for TxPdo in self.getTxPdo():
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1789
            ExtractPdoInfos(TxPdo, "Transmit", entries, limits)
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1790
        for RxPdo in self.getRxPdo():
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1791
            ExtractPdoInfos(RxPdo, "Receive", entries, limits)
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1792
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1793
        return entries
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1794
    setattr(cls, "GetEntriesList", GetEntriesList)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1795
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1796
    def GetSyncManagers(self):
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1797
        sync_managers = []
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1798
        for sync_manager in self.getSm():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1799
            sync_manager_infos = {}
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1800
            for name, value in [("Name", sync_manager.getcontent()),
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1801
                                ("Start Address", sync_manager.getStartAddress()),
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1802
                                ("Default Size", sync_manager.getDefaultSize()),
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1803
                                ("Control Byte", sync_manager.getControlByte()),
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1804
                                ("Enable", sync_manager.getEnable())]:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1805
                if value is None:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1806
                    value =""
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1807
                sync_manager_infos[name] = value
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1808
            sync_managers.append(sync_manager_infos)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1809
        return sync_managers
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1810
    setattr(cls, "GetSyncManagers", GetSyncManagers)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1811
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1812
def GroupItemCompare(x, y):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1813
    if x["type"] == y["type"]:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1814
        if x["type"] == ETHERCAT_GROUP:
2031
c6f32810723e Fix some issues regarding arbitrary variable mapping
laurent
parents: 2030
diff changeset
  1815
            return cmp(x["order"], y["order"])
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1816
        else:
2031
c6f32810723e Fix some issues regarding arbitrary variable mapping
laurent
parents: 2030
diff changeset
  1817
            return cmp(x["name"], y["name"])
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1818
    elif x["type"] == ETHERCAT_GROUP:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1819
        return -1
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1820
    return 1
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1821
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1822
def SortGroupItems(group):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1823
    for item in group["children"]:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1824
        if item["type"] == ETHERCAT_GROUP:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1825
            SortGroupItems(item)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1826
    group["children"].sort(GroupItemCompare)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1827
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1828
def ExtractName(names, default=None):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1829
    if len(names) == 1:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1830
        return names[0].getcontent()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1831
    else:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1832
        for name in names:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1833
            if name.getLcId() == 1033:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1834
                return name.getcontent()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1835
    return default
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1836
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1837
def ExtractPdoInfos(pdo, pdo_type, entries, limits=None):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1838
    pdo_index = pdo.getIndex().getcontent()
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1839
    pdo_name = ExtractName(pdo.getName())
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1840
    for pdo_entry in pdo.getEntry():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1841
        entry_index = pdo_entry.getIndex().getcontent()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1842
        entry_subindex = pdo_entry.getSubIndex()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1843
        index = ExtractHexDecValue(entry_index)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1844
        subindex = ExtractHexDecValue(entry_subindex)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1845
        
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1846
        if limits is None or limits[0] <= index <= limits[1]:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1847
            entry = entries.get((index, subindex), None)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1848
            if entry is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1849
                entry["PDO index"] = pdo_index
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1850
                entry["PDO name"] = pdo_name
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1851
                entry["PDO type"] = pdo_type
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1852
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1853
                entry_type = pdo_entry.getDataType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1854
                if entry_type is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1855
                    if pdo_type == "Transmit":
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1856
                        access = "ro"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1857
                        pdomapping = "T"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1858
                    else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1859
                        access = "wo"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1860
                        pdomapping = "R"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1861
                    entries[(index, subindex)] = {
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1862
                        "Index": entry_index,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1863
                        "SubIndex": entry_subindex,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1864
                        "Name": ExtractName(pdo_entry.getName()),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1865
                        "Type": entry_type.getcontent(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1866
                        "Access": access,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1867
                        "PDOMapping": pdomapping}
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1868
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1869
DEFAULT_ALIGNMENT = 8
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1870
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1871
class ModulesLibrary:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1872
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1873
    def __init__(self, path, parent_library=None):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1874
        self.Path = path
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1875
        if not os.path.exists(self.Path):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1876
            os.makedirs(self.Path)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1877
        self.ParentLibrary = parent_library
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1878
        
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1879
        if parent_library is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1880
            self.LoadModules()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1881
        else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1882
            self.Library = None
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1883
        self.LoadAlignments()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1884
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1885
    def GetPath(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1886
        return self.Path
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1887
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1888
    def GetAlignmentFilePath(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1889
        return os.path.join(self.Path, "alignments.cfg")
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1890
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1891
    def LoadModules(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1892
        self.Library = {}
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1893
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1894
        files = os.listdir(self.Path)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1895
        for file in files:
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1896
            filepath = os.path.join(self.Path, file)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1897
            if os.path.isfile(filepath) and os.path.splitext(filepath)[-1] == ".xml":
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1898
                xmlfile = open(filepath, 'r')
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1899
                xml_tree = minidom.parse(xmlfile)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1900
                xmlfile.close()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1901
                
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1902
                modules_infos = None
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1903
                for child in xml_tree.childNodes:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1904
                    if child.nodeType == xml_tree.ELEMENT_NODE and child.nodeName == "EtherCATInfo":
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1905
                        modules_infos = EtherCATInfoClasses["EtherCATInfo.xsd"]["EtherCATInfo"]()
2051
13dee9322beb refactoring
laurent
parents: 2047
diff changeset
  1906
                        modules_infos.loadXMLTree(child)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1907
                
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1908
                if modules_infos is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1909
                    vendor = modules_infos.getVendor()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1910
                    
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1911
                    vendor_category = self.Library.setdefault(ExtractHexDecValue(vendor.getId()), 
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1912
                                                              {"name": ExtractName(vendor.getName(), _("Miscellaneous")), 
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1913
                                                               "groups": {}})
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1914
                    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1915
                    for group in modules_infos.getDescriptions().getGroups().getGroup():
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1916
                        group_type = group.getType()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1917
                        
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1918
                        vendor_category["groups"].setdefault(group_type, {"name": ExtractName(group.getName(), group_type), 
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1919
                                                                          "parent": group.getParentGroup(),
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1920
                                                                          "order": group.getSortOrder(), 
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1921
                                                                          "devices": []})
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1922
                    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1923
                    for device in modules_infos.getDescriptions().getDevices().getDevice():
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1924
                        device_group = device.getGroupType()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1925
                        if not vendor_category["groups"].has_key(device_group):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1926
                            raise ValueError, "Not such group \"%\"" % device_group
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1927
                        vendor_category["groups"][device_group]["devices"].append((device.getType().getcontent(), device))
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1928
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1929
    def GetModulesLibrary(self, profile_filter=None):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1930
        if self.Library is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1931
            self.LoadModules()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1932
        library = []
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1933
        for vendor_id, vendor in self.Library.iteritems():
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1934
            groups = []
2073
d14ab97a452a Fix bug modules present in all groups with the same name even if they are defined by different vendors
Laurent Bessard
parents: 2069
diff changeset
  1935
            children_dict = {}
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1936
            for group_type, group in vendor["groups"].iteritems():
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1937
                group_infos = {"name": group["name"],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1938
                               "order": group["order"],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1939
                               "type": ETHERCAT_GROUP,
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1940
                               "infos": None,
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1941
                               "children": children_dict.setdefault(group_type, [])}
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1942
                device_dict = {}
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1943
                for device_type, device in group["devices"]:
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1944
                    if profile_filter is None or profile_filter in device.GetProfileNumbers():
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1945
                        product_code = device.getType().getProductCode()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1946
                        revision_number = device.getType().getRevisionNo()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1947
                        alignment = self.GetAlignment(vendor_id, product_code, revision_number)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1948
                        device_infos = {"name": ExtractName(device.getName()),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1949
                                        "type": ETHERCAT_DEVICE,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1950
                                        "infos": {"device_type": device_type,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1951
                                                  "vendor": vendor_id,
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1952
                                                  "product_code": product_code,
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1953
                                                  "revision_number": revision_number,
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1954
                                                  "alignment": alignment},
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1955
                                        "children": []}
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1956
                        group_infos["children"].append(device_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1957
                        device_type_occurrences = device_dict.setdefault(device_type, [])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1958
                        device_type_occurrences.append(device_infos)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1959
                for device_type_occurrences in device_dict.itervalues():
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1960
                    if len(device_type_occurrences) > 1:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1961
                        for occurrence in device_type_occurrences:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1962
                            occurrence["name"] += _(" (rev. %s)") % occurrence["infos"]["revision_number"]
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1963
                if len(group_infos["children"]) > 0:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1964
                    if group["parent"] is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1965
                        parent_children = children_dict.setdefault(group["parent"], [])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1966
                        parent_children.append(group_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1967
                    else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1968
                        groups.append(group_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1969
            if len(groups) > 0:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1970
                library.append({"name": vendor["name"],
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1971
                                "type": ETHERCAT_VENDOR,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1972
                                "infos": None,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1973
                                "children": groups})
2031
c6f32810723e Fix some issues regarding arbitrary variable mapping
laurent
parents: 2030
diff changeset
  1974
        library.sort(lambda x, y: cmp(x["name"], y["name"]))
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1975
        return library
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1976
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1977
    def GetVendors(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1978
        return [(vendor_id, vendor["name"]) for vendor_id, vendor in self.Library.items()]
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1979
    
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1980
    def GetModuleInfos(self, module_infos):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1981
        vendor = ExtractHexDecValue(module_infos["vendor"])
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1982
        vendor_infos = self.Library.get(vendor)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1983
        if vendor_infos is not None:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1984
            for group_name, group_infos in vendor_infos["groups"].iteritems():
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1985
                for device_type, device_infos in group_infos["devices"]:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1986
                    product_code = ExtractHexDecValue(device_infos.getType().getProductCode())
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1987
                    revision_number = ExtractHexDecValue(device_infos.getType().getRevisionNo())
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1988
                    if (product_code == ExtractHexDecValue(module_infos["product_code"]) and
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1989
                        revision_number == ExtractHexDecValue(module_infos["revision_number"])):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1990
                        return device_infos, self.GetAlignment(vendor, product_code, revision_number)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1991
        return None, None
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1992
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1993
    def ImportModuleLibrary(self, filepath):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1994
        if os.path.isfile(filepath):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1995
            shutil.copy(filepath, self.Path)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1996
            self.LoadModules()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1997
            return True
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1998
        return False
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1999
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2000
    def LoadAlignments(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2001
        self.Alignments = {}
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2002
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2003
        csvfile_path = self.GetAlignmentFilePath()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2004
        if os.path.exists(csvfile_path):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2005
            csvfile = open(csvfile_path, "rb")
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2006
            sample = csvfile.read(1024)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2007
            csvfile.seek(0)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2008
            dialect = csv.Sniffer().sniff(sample)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2009
            has_header = csv.Sniffer().has_header(sample)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2010
            reader = csv.reader(csvfile, dialect)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2011
            for row in reader:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2012
                if has_header:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2013
                    has_header = False
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2014
                else:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2015
                    try:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2016
                        self.Alignments[tuple(map(int, row[:3]))] = row[3]
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2017
                    except:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2018
                        pass
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2019
            csvfile.close()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2020
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2021
    def SaveAlignments(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2022
        csvfile = open(self.GetAlignmentFilePath(), "wb")
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2023
        writer = csv.writer(csvfile, delimiter=';')
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2024
        writer.writerow(['Vendor', 'product_code', 'revision_number', 'alignment'])
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2025
        for (vendor, product_code, revision_number), alignment in self.Alignments.iteritems():
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2026
            writer.writerow([vendor, product_code, revision_number, alignment])
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2027
        csvfile.close()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2028
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2029
    def SetAlignment(self, vendor, product_code, revision_number, alignment):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2030
        vendor = ExtractHexDecValue(vendor)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2031
        product_code = ExtractHexDecValue(product_code)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2032
        revision_number = ExtractHexDecValue(revision_number)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2033
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2034
        self.Alignments[tuple([vendor, product_code, revision_number])] = alignment
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2035
        self.SaveAlignments()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2036
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2037
    def GetAlignment(self, vendor, product_code, revision_number):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2038
        vendor = ExtractHexDecValue(vendor)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2039
        product_code = ExtractHexDecValue(product_code)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2040
        revision_number = ExtractHexDecValue(revision_number)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2041
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2042
        alignment = self.Alignments.get(tuple([vendor, product_code, revision_number]))
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2043
        if alignment is not None:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2044
            return alignment
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2045
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2046
        if self.ParentLibrary is not None:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2047
            return self.ParentLibrary.GetAlignment(vendor, product_code, revision_number)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2048
        return DEFAULT_ALIGNMENT
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2049
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2050
USERDATA_DIR = wx.StandardPaths.Get().GetUserDataDir()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2051
if wx.Platform != '__WXMSW__':
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2052
    USERDATA_DIR += '_files'
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2053
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2054
ModulesDatabase = ModulesLibrary(
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2055
    os.path.join(USERDATA_DIR, "ethercat_modules"))
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2056
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2057
class RootClass:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2058
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2059
    CTNChildrenTypes = [("EthercatNode",_EthercatCTN,"Ethercat Master")]
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2060
    EditorType = LibraryEditor
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2061
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2062
    def __init__(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2063
        self.ModulesLibrary = None
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2064
        self.LoadModulesLibrary()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2065
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2066
    def GetModulesLibraryPath(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2067
        return os.path.join(self.CTNPath(), "modules") 
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2068
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2069
    def CTNGenerate_C(self, buildpath, locations):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2070
        return [],"",False
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2071
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2072
    def LoadModulesLibrary(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2073
        if self.ModulesLibrary is None:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2074
            self.ModulesLibrary = ModulesLibrary(self.GetModulesLibraryPath(), ModulesDatabase)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2075
        else:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2076
            self.ModulesLibrary.LoadModulesLibrary()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2077
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2078
    def GetModulesDatabaseInstance(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2079
        return ModulesDatabase
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2080
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2081
    def GetModulesLibraryInstance(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2082
        return self.ModulesLibrary
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2083
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2084
    def GetModulesLibrary(self, profile_filter=None):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2085
        return self.ModulesLibrary.GetModulesLibrary(profile_filter)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2086
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  2087
    def GetVendors(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  2088
        return self.ModulesLibrary.GetVendors()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  2089
    
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2090
    def GetModuleInfos(self, module_infos):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2091
        return self.ModulesLibrary.GetModuleInfos(module_infos)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2092
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2093