etherlab/EthercatMaster.py
author Laurent Bessard
Wed, 02 Oct 2013 10:46:18 +0200
changeset 2162 43ab74687f45
parent 2160 75349c51a34b
child 2165 02a2b5dee5e3
permissions -rw-r--r--
Fixed xslt stylesheet for extracting entries defined in module, rewiting xslt stylesheet to yslt
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
     1
import os
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
     2
import cPickle
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
     3
from lxml import etree
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
     4
from copy import deepcopy
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
     5
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
     6
import wx
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
     7
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
     8
from xmlclass import *
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
     9
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    10
from PLCControler import UndoBuffer, LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    11
from ConfigTreeNode import ConfigTreeNode
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    12
from dialogs import BrowseValuesLibraryDialog
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    13
from IDEFrame import TITLE, FILEMENU, PROJECTTREE
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    14
2152
e6946c298a42 Cherry-pick and re-commit to legitimate ancestor of commit 'Ethercat Management Function Refactoring Source by RTES Lab.' from youcu <youcu1022@gmail.com>
Edouard Tisserant
parents: 2149
diff changeset
    15
from EthercatSlave import _EthercatSlaveCTN, ExtractHexDecValue, GenerateHexDecValue, TYPECONVERSION, VARCLASSCONVERSION, _CommonSlave
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    16
from EthercatCFileGenerator import _EthercatCFileGenerator
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    17
from ConfigEditor import MasterEditor
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    18
from POULibrary import POULibrary
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    19
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    20
try:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    21
    from EthercatCIA402Slave import _EthercatCIA402SlaveCTN
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    22
    HAS_MCL = True
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    23
except:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    24
    HAS_MCL = False
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    25
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    26
#--------------------------------------------------
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    27
#         Remote Exec Etherlab Commands
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    28
#--------------------------------------------------
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    29
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    30
SCAN_COMMAND = """
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    31
import commands
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    32
result = commands.getoutput("ethercat slaves")
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    33
slaves = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    34
for slave_line in result.splitlines():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    35
    chunks = slave_line.split()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    36
    idx, pos, state, flag = chunks[:4]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    37
    name = " ".join(chunks[4:])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    38
    alias, position = pos.split(":")
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    39
    slave = {"idx": int(idx),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    40
             "alias": int(alias),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    41
             "position": int(position),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    42
             "name": name}
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    43
    details = commands.getoutput("ethercat slaves -p %d -v" % slave["idx"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    44
    for details_line in details.splitlines():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    45
        details_line = details_line.strip()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    46
        for header, param in [("Vendor Id:", "vendor_id"),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    47
                              ("Product code:", "product_code"),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    48
                              ("Revision number:", "revision_number")]:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    49
            if details_line.startswith(header):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    50
                slave[param] = details_line.split()[-1]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    51
                break
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    52
    slaves.append(slave)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    53
returnVal = slaves
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    54
"""
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    55
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    56
#--------------------------------------------------
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    57
#      Etherlab Specific Blocks Library
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    58
#--------------------------------------------------
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    59
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    60
def GetLocalPath(filename):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    61
    return os.path.join(os.path.split(__file__)[0], filename)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    62
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    63
class EtherlabLibrary(POULibrary):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    64
    def GetLibraryPath(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    65
        return GetLocalPath("pous.xml")
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    66
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    67
    def Generate_C(self, buildpath, varlist, IECCFLAGS):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    68
        etherlab_ext_file = open(GetLocalPath("etherlab_ext.c"), 'r')
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    69
        etherlab_ext_code = etherlab_ext_file.read()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    70
        etherlab_ext_file.close()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    71
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    72
        Gen_etherlabfile_path = os.path.join(buildpath, "etherlab_ext.c")
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    73
        ethelabfile = open(Gen_etherlabfile_path,'w')
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    74
        ethelabfile.write(etherlab_ext_code)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    75
        ethelabfile.close()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    76
        
2152
e6946c298a42 Cherry-pick and re-commit to legitimate ancestor of commit 'Ethercat Management Function Refactoring Source by RTES Lab.' from youcu <youcu1022@gmail.com>
Edouard Tisserant
parents: 2149
diff changeset
    77
        runtimefile_path = os.path.join(os.path.split(__file__)[0], "runtime_etherlab.py")
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    78
        return ((["etherlab_ext"], [(Gen_etherlabfile_path, IECCFLAGS)], True), "", 
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    79
                ("runtime_etherlab.py", file(GetLocalPath("runtime_etherlab.py"))))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    80
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    81
#--------------------------------------------------
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    82
#                 Ethercat MASTER
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    83
#--------------------------------------------------
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    84
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
    85
EtherCATConfigParser = GenerateParserFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATConfig.xsd")) 
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    86
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    87
def sort_commands(x, y):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    88
    if x["Index"] == y["Index"]:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    89
        return cmp(x["Subindex"], y["Subindex"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    90
    return cmp(x["Index"], y["Index"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    91
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
    92
cls = EtherCATConfigParser.GetElementClass("Slave", "Config")
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    93
if cls:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    94
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    95
    def getType(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    96
        slave_info = self.getInfo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    97
        return {"device_type": slave_info.getName(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    98
                "vendor": GenerateHexDecValue(slave_info.getVendorId()),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
    99
                "product_code": GenerateHexDecValue(slave_info.getProductCode(), 16),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   100
                "revision_number": GenerateHexDecValue(slave_info.getRevisionNo(), 16)}
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   101
    setattr(cls, "getType", getType)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   102
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   103
    def setType(self, type_infos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   104
        slave_info = self.getInfo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   105
        slave_info.setName(type_infos["device_type"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   106
        slave_info.setVendorId(ExtractHexDecValue(type_infos["vendor"]))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   107
        slave_info.setProductCode(ExtractHexDecValue(type_infos["product_code"]))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   108
        slave_info.setRevisionNo(ExtractHexDecValue(type_infos["revision_number"]))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   109
    setattr(cls, "setType", setType)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   110
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   111
    def getInitCmds(self, create_default=False):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   112
        Mailbox = self.getMailbox()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   113
        if Mailbox is None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   114
            if create_default:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   115
                self.addMailbox()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   116
                Mailbox = self.getMailbox()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   117
            else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   118
                return None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   119
        CoE = Mailbox.getCoE()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   120
        if CoE is None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   121
            if create_default:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   122
                Mailbox.addCoE()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   123
                CoE = Mailbox.getCoE()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   124
            else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   125
                return None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   126
        InitCmds = CoE.getInitCmds()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   127
        if InitCmds is None and create_default:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   128
            CoE.addInitCmds()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   129
            InitCmds = CoE.getInitCmds()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   130
        return InitCmds
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   131
    setattr(cls, "getInitCmds", getInitCmds)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   132
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   133
    def getStartupCommands(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   134
        pos = self.getInfo().getPhysAddr()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   135
        InitCmds = self.getInitCmds()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   136
        if InitCmds is None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   137
            return []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   138
        commands = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   139
        for idx, InitCmd in enumerate(InitCmds.getInitCmd()):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   140
            comment = InitCmd.getComment()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   141
            if comment is None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   142
                comment = ""
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   143
            commands.append({
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   144
                "command_idx": idx,
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   145
                "Position": pos,
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   146
                "Index": InitCmd.getIndex(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   147
                "Subindex": InitCmd.getSubIndex(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   148
                "Value": InitCmd.getData(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   149
                "Description": comment})
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   150
        commands.sort(sort_commands)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   151
        return commands
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   152
    setattr(cls, "getStartupCommands", getStartupCommands)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   153
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   154
    def appendStartupCommand(self, command_infos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   155
        InitCmds = self.getInitCmds(True)
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   156
        command = EtherCATConfigParser.CreateElement("InitCmd", "InitCmds", 1)
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   157
        InitCmds.appendInitCmd(command)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   158
        command.setIndex(command_infos["Index"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   159
        command.setSubIndex(command_infos["Subindex"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   160
        command.setData(command_infos["Value"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   161
        command.setComment(command_infos["Description"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   162
        return len(InitCmds.getInitCmd()) - 1
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   163
    setattr(cls, "appendStartupCommand", appendStartupCommand)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   164
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   165
    def setStartupCommand(self, command_infos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   166
        InitCmds = self.getInitCmds()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   167
        if InitCmds is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   168
            commands = InitCmds.getInitCmd()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   169
            if command_infos["command_idx"] < len(commands):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   170
                command = commands[command_infos["command_idx"]]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   171
                command.setIndex(command_infos["Index"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   172
                command.setSubIndex(command_infos["Subindex"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   173
                command.setData(command_infos["Value"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   174
                command.setComment(command_infos["Description"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   175
    setattr(cls, "setStartupCommand", setStartupCommand)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   176
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   177
    def removeStartupCommand(self, command_idx):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   178
        InitCmds = self.getInitCmds()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   179
        if InitCmds is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   180
            if command_idx < len(InitCmds.getInitCmd()):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   181
                InitCmds.removeInitCmd(command_idx)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   182
    setattr(cls, "removeStartupCommand", removeStartupCommand)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   183
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   184
ProcessVariablesXSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   185
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   186
      <xsd:element name="ProcessVariables">
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   187
        <xsd:complexType>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   188
          <xsd:sequence>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   189
            <xsd:element name="variable" minOccurs="0" maxOccurs="unbounded">
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   190
              <xsd:complexType>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   191
                <xsd:sequence>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   192
                  <xsd:element name="ReadFrom" type="LocationDesc" minOccurs="0"/>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   193
                  <xsd:element name="WriteTo" type="LocationDesc" minOccurs="0"/>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   194
                </xsd:sequence>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   195
                <xsd:attribute name="Name" type="xsd:string" use="required"/>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   196
                <xsd:attribute name="Comment" type="xsd:string" use="required"/>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   197
              </xsd:complexType>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   198
            </xsd:element>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   199
          </xsd:sequence>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   200
        </xsd:complexType>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   201
      </xsd:element>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   202
      <xsd:complexType name="LocationDesc">
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   203
        <xsd:attribute name="Position" type="xsd:integer" use="required"/>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   204
        <xsd:attribute name="Index" type="xsd:integer" use="required"/>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   205
        <xsd:attribute name="SubIndex" type="xsd:integer" use="required"/>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   206
      </xsd:complexType>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   207
    </xsd:schema>
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   208
"""
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   209
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   210
ProcessVariablesParser = GenerateParserFromXSDstring(ProcessVariablesXSD) 
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   211
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   212
class _EthercatCTN:
2152
e6946c298a42 Cherry-pick and re-commit to legitimate ancestor of commit 'Ethercat Management Function Refactoring Source by RTES Lab.' from youcu <youcu1022@gmail.com>
Edouard Tisserant
parents: 2149
diff changeset
   213
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   214
    CTNChildrenTypes = [("EthercatSlave", _EthercatSlaveCTN, "Ethercat Slave")]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   215
    if HAS_MCL:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   216
        CTNChildrenTypes.append(("EthercatCIA402Slave", _EthercatCIA402SlaveCTN, "Ethercat CIA402 Slave"))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   217
    EditorType = MasterEditor
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   218
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   219
    def __init__(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   220
        config_filepath = self.ConfigFileName()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   221
        config_is_saved = False
2160
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   222
        self.Config = None
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   223
        if os.path.isfile(config_filepath):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   224
            config_xmlfile = open(config_filepath, 'r')
2160
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   225
            try:
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   226
                self.Config, error = \
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   227
                    EtherCATConfigParser.LoadXMLString(config_xmlfile.read())
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   228
                if error is None:
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   229
                    config_is_saved = True
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   230
            except Exception, e:
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   231
                error = e.message
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   232
            config_xmlfile.close()
2160
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   233
            
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   234
            if error is not None:
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   235
                self.GetCTRoot().logger.write_error(
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   236
                    _("Couldn't load %s network configuration file.") % CTNName)    
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   237
            
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   238
        if self.Config is None:
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   239
            self.Config = EtherCATConfigParser.CreateElement("EtherCATConfig")
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   240
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   241
        process_filepath = self.ProcessVariablesFileName()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   242
        process_is_saved = False
2160
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   243
        self.ProcessVariables = None
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   244
        if os.path.isfile(process_filepath):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   245
            process_xmlfile = open(process_filepath, 'r')
2160
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   246
            try:
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   247
                self.ProcessVariables, error = \
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   248
                    ProcessVariablesParser.LoadXMLString(process_xmlfile.read())
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   249
                if error is None:
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   250
                    process_is_saved = True
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   251
            except Exception, e:
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   252
                error = e.message
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   253
            process_xmlfile.close()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   254
            
2160
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   255
            if error is not None:
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   256
                self.GetCTRoot().logger.write_error(
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   257
                    _("Couldn't load %s network process variables file.") % CTNName)    
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   258
            
75349c51a34b Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 2157
diff changeset
   259
        if self.ProcessVariables is None:
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   260
            self.ProcessVariables = ProcessVariablesParser.CreateElement("ProcessVariables")
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   261
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   262
        if config_is_saved and process_is_saved:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   263
            self.CreateBuffer(True)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   264
        else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   265
            self.CreateBuffer(False)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   266
            self.OnCTNSave()
2152
e6946c298a42 Cherry-pick and re-commit to legitimate ancestor of commit 'Ethercat Management Function Refactoring Source by RTES Lab.' from youcu <youcu1022@gmail.com>
Edouard Tisserant
parents: 2149
diff changeset
   267
         
e6946c298a42 Cherry-pick and re-commit to legitimate ancestor of commit 'Ethercat Management Function Refactoring Source by RTES Lab.' from youcu <youcu1022@gmail.com>
Edouard Tisserant
parents: 2149
diff changeset
   268
        # ----------- call ethercat mng. function --------------
e6946c298a42 Cherry-pick and re-commit to legitimate ancestor of commit 'Ethercat Management Function Refactoring Source by RTES Lab.' from youcu <youcu1022@gmail.com>
Edouard Tisserant
parents: 2149
diff changeset
   269
        self.CommonMethod = _CommonSlave(self)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   270
    
2149
7f473761c932 Added icon for Ethercat extension root and Ethercat master node
Laurent Bessard
parents: 2147
diff changeset
   271
    def GetIconName(self):
7f473761c932 Added icon for Ethercat extension root and Ethercat master node
Laurent Bessard
parents: 2147
diff changeset
   272
        return "Ethercat"
7f473761c932 Added icon for Ethercat extension root and Ethercat master node
Laurent Bessard
parents: 2147
diff changeset
   273
    
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   274
    def GetContextualMenuItems(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   275
        return [("Add Ethercat Slave", "Add Ethercat Slave to Master", self.OnAddEthercatSlave)]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   276
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   277
    def OnAddEthercatSlave(self, event):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   278
        app_frame = self.GetCTRoot().AppFrame
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   279
        dialog = BrowseValuesLibraryDialog(app_frame, 
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   280
            "Ethercat Slave Type", self.GetSlaveTypesLibrary())
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   281
        if dialog.ShowModal() == wx.ID_OK:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   282
            type_infos = dialog.GetValueInfos()
2137
b65abacdbdf9 Added support for multiple module extra params in ModulesLibrary
Laurent Bessard
parents: 2133
diff changeset
   283
            device, module_extra_params = self.GetModuleInfos(type_infos)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   284
            if device is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   285
                if HAS_MCL and _EthercatCIA402SlaveCTN.NODE_PROFILE in device.GetProfileNumbers():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   286
                    ConfNodeType = "EthercatCIA402Slave"
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   287
                else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   288
                    ConfNodeType = "EthercatSlave"
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   289
                new_child = self.CTNAddChild("%s_0" % ConfNodeType, ConfNodeType)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   290
                new_child.SetParamsAttribute("SlaveParams.Type", type_infos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   291
                self.CTNRequestSave()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   292
                new_child._OpenView()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   293
                app_frame._Refresh(TITLE, FILEMENU, PROJECTTREE)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   294
        dialog.Destroy()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   295
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   296
    def ExtractHexDecValue(self, value):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   297
        return ExtractHexDecValue(value)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   298
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   299
    def GetSizeOfType(self, type):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   300
        return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   301
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   302
    def ConfigFileName(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   303
        return os.path.join(self.CTNPath(), "config.xml")
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   304
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   305
    def ProcessVariablesFileName(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   306
        return os.path.join(self.CTNPath(), "process_variables.xml")
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   307
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   308
    def FilterSlave(self, slave, vendor=None, slave_pos=None, slave_profile=None):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   309
        if slave_pos is not None and slave.getInfo().getPhysAddr() != slave_pos:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   310
            return False
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   311
        type_infos = slave.getType()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   312
        if vendor is not None and ExtractHexDecValue(type_infos["vendor"]) != vendor:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   313
            return False
2137
b65abacdbdf9 Added support for multiple module extra params in ModulesLibrary
Laurent Bessard
parents: 2133
diff changeset
   314
        device, module_extra_params = self.GetModuleInfos(type_infos)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   315
        if slave_profile is not None and slave_profile not in device.GetProfileNumbers():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   316
            return False
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   317
        return True
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   318
2124
1f2c3fdd70d0 Fixed bugs in drag'n drop from variables panel in master and slaves editor panel
Laurent Bessard
parents: 2113
diff changeset
   319
    def GetSlaveName(self, slave_pos):
1f2c3fdd70d0 Fixed bugs in drag'n drop from variables panel in master and slaves editor panel
Laurent Bessard
parents: 2113
diff changeset
   320
        CTNChild = self.GetChildByIECLocation((slave_pos,))
1f2c3fdd70d0 Fixed bugs in drag'n drop from variables panel in master and slaves editor panel
Laurent Bessard
parents: 2113
diff changeset
   321
        if CTNChild is not None:
1f2c3fdd70d0 Fixed bugs in drag'n drop from variables panel in master and slaves editor panel
Laurent Bessard
parents: 2113
diff changeset
   322
            return CTNChild.CTNName()
1f2c3fdd70d0 Fixed bugs in drag'n drop from variables panel in master and slaves editor panel
Laurent Bessard
parents: 2113
diff changeset
   323
        return self.CTNName()
1f2c3fdd70d0 Fixed bugs in drag'n drop from variables panel in master and slaves editor panel
Laurent Bessard
parents: 2113
diff changeset
   324
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   325
    def GetSlaves(self, vendor=None, slave_pos=None, slave_profile=None):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   326
        slaves = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   327
        for slave in self.Config.getConfig().getSlave():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   328
            if self.FilterSlave(slave, vendor, slave_pos, slave_profile):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   329
                slaves.append(slave.getInfo().getPhysAddr())
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   330
        slaves.sort()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   331
        return slaves
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   332
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   333
    def GetSlave(self, slave_pos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   334
        for slave in self.Config.getConfig().getSlave():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   335
            slave_info = slave.getInfo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   336
            if slave_info.getPhysAddr() == slave_pos:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   337
                return slave
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   338
        return None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   339
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   340
    def GetStartupCommands(self, vendor=None, slave_pos=None, slave_profile=None):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   341
        commands = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   342
        for slave in self.Config.getConfig().getSlave():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   343
            if self.FilterSlave(slave, vendor, slave_pos, slave_profile):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   344
                commands.append((slave.getInfo().getPhysAddr(), slave.getStartupCommands()))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   345
        commands.sort()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   346
        return reduce(lambda x, y: x + y[1], commands, [])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   347
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   348
    def AppendStartupCommand(self, command_infos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   349
        slave = self.GetSlave(command_infos["Position"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   350
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   351
            command_idx = slave.appendStartupCommand(command_infos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   352
            self.BufferModel()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   353
            return command_idx
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   354
        return None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   355
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   356
    def SetStartupCommandInfos(self, command_infos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   357
        slave = self.GetSlave(command_infos["Position"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   358
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   359
            slave.setStartupCommand(command_infos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   360
            self.BufferModel()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   361
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   362
    def RemoveStartupCommand(self, slave_pos, command_idx, buffer=True):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   363
        slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   364
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   365
            slave.removeStartupCommand(command_idx)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   366
            if buffer:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   367
                self.BufferModel()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   368
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   369
    def SetProcessVariables(self, variables):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   370
        vars = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   371
        for var in variables:
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   372
            variable = ProcessVariablesParser.CreateElement("variable", "ProcessVariables")
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   373
            variable.setName(var["Name"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   374
            variable.setComment(var["Description"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   375
            if var["ReadFrom"] != "":
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   376
                position, index, subindex = var["ReadFrom"]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   377
                if variable.getReadFrom() is None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   378
                    variable.addReadFrom()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   379
                read_from = variable.getReadFrom()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   380
                read_from.setPosition(position)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   381
                read_from.setIndex(index)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   382
                read_from.setSubIndex(subindex)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   383
            elif variable.getReadFrom() is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   384
                variable.deleteReadFrom()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   385
            if var["WriteTo"] != "":
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   386
                position, index, subindex = var["WriteTo"]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   387
                if variable.getWriteTo() is None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   388
                    variable.addWriteTo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   389
                write_to = variable.getWriteTo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   390
                write_to.setPosition(position)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   391
                write_to.setIndex(index)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   392
                write_to.setSubIndex(subindex)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   393
            elif variable.getWriteTo() is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   394
                variable.deleteWriteTo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   395
            vars.append(variable)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   396
        self.ProcessVariables.setvariable(vars)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   397
        self.BufferModel()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   398
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   399
    def GetProcessVariables(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   400
        variables = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   401
        idx = 0
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   402
        for variable in self.ProcessVariables.getvariable():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   403
            var = {"Name": variable.getName(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   404
                   "Number": idx,
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   405
                   "Description": variable.getComment()}
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   406
            read_from = variable.getReadFrom()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   407
            if read_from is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   408
                var["ReadFrom"] = (read_from.getPosition(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   409
                                   read_from.getIndex(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   410
                                   read_from.getSubIndex())
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   411
            else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   412
                var["ReadFrom"] = ""
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   413
            write_to = variable.getWriteTo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   414
            if write_to is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   415
                var["WriteTo"] = (write_to.getPosition(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   416
                                   write_to.getIndex(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   417
                                   write_to.getSubIndex())
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   418
            else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   419
                var["WriteTo"] = ""
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   420
            variables.append(var)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   421
            idx += 1
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   422
        return variables
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   423
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   424
    def _ScanNetwork(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   425
        app_frame = self.GetCTRoot().AppFrame
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   426
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   427
        execute = True
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   428
        if len(self.Children) > 0:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   429
            dialog = wx.MessageDialog(app_frame, 
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   430
                _("The current network configuration will be deleted.\nDo you want to continue?"), 
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   431
                _("Scan Network"), 
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   432
                wx.YES_NO|wx.ICON_QUESTION)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   433
            execute = dialog.ShowModal() == wx.ID_YES
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   434
            dialog.Destroy()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   435
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   436
        if execute:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   437
            error, returnVal = self.RemoteExec(SCAN_COMMAND, returnVal = None)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   438
            if error != 0:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   439
                dialog = wx.MessageDialog(app_frame, returnVal, "Error", wx.OK|wx.ICON_ERROR)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   440
                dialog.ShowModal()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   441
                dialog.Destroy()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   442
            elif returnVal is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   443
                for child in self.IECSortedChildren():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   444
                    self._doRemoveChild(child)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   445
                
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   446
                for slave in returnVal:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   447
                    type_infos = {
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   448
                        "vendor": slave["vendor_id"],
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   449
                        "product_code": slave["product_code"],
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   450
                        "revision_number":slave["revision_number"],
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   451
                    }
2137
b65abacdbdf9 Added support for multiple module extra params in ModulesLibrary
Laurent Bessard
parents: 2133
diff changeset
   452
                    device, module_extra_params = self.GetModuleInfos(type_infos)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   453
                    if device is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   454
                        if HAS_MCL and _EthercatCIA402SlaveCTN.NODE_PROFILE in device.GetProfileNumbers():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   455
                            CTNType = "EthercatCIA402Slave"
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   456
                        else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   457
                            CTNType = "EthercatSlave"
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   458
                        self.CTNAddChild("slave%s" % slave["idx"], CTNType, slave["idx"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   459
                        self.SetSlaveAlias(slave["idx"], slave["alias"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   460
                        type_infos["device_type"] = device.getType().getcontent()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   461
                        self.SetSlaveType(slave["idx"], type_infos)
2127
32255ca50fb0 Fix scan network functionality, project tree not refreshed after adding slaves
Laurent Bessard
parents: 2124
diff changeset
   462
            
32255ca50fb0 Fix scan network functionality, project tree not refreshed after adding slaves
Laurent Bessard
parents: 2124
diff changeset
   463
                if app_frame:
32255ca50fb0 Fix scan network functionality, project tree not refreshed after adding slaves
Laurent Bessard
parents: 2124
diff changeset
   464
                    app_frame.RefreshProjectTree()
32255ca50fb0 Fix scan network functionality, project tree not refreshed after adding slaves
Laurent Bessard
parents: 2124
diff changeset
   465
            
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   466
    def CTNAddChild(self, CTNName, CTNType, IEC_Channel=0):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   467
        """
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   468
        Create the confnodes that may be added as child to this node self
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   469
        @param CTNType: string desining the confnode class name (get name from CTNChildrenTypes)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   470
        @param CTNName: string for the name of the confnode instance
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   471
        """
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   472
        newConfNodeOpj = ConfigTreeNode.CTNAddChild(self, CTNName, CTNType, IEC_Channel)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   473
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   474
        slave = self.GetSlave(newConfNodeOpj.BaseParams.getIEC_Channel())
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   475
        if slave is None:
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   476
            slave = EtherCATConfigParser.CreateElement("Slave", "Config")
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   477
            self.Config.getConfig().appendSlave(slave)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   478
            slave_infos = slave.getInfo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   479
            slave_infos.setName("undefined")
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   480
            slave_infos.setPhysAddr(newConfNodeOpj.BaseParams.getIEC_Channel())
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   481
            slave_infos.setAutoIncAddr(0)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   482
            self.BufferModel()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   483
            self.OnCTNSave()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   484
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   485
        return newConfNodeOpj
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   486
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   487
    def _doRemoveChild(self, CTNInstance):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   488
        slave_pos = CTNInstance.GetSlavePos()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   489
        config = self.Config.getConfig()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   490
        for idx, slave in enumerate(config.getSlave()):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   491
            slave_infos = slave.getInfo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   492
            if slave_infos.getPhysAddr() == slave_pos:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   493
                config.removeSlave(idx)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   494
                self.BufferModel()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   495
                self.OnCTNSave()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   496
        ConfigTreeNode._doRemoveChild(self, CTNInstance)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   497
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   498
    def SetSlavePosition(self, slave_pos, new_pos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   499
        slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   500
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   501
            slave_info = slave.getInfo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   502
            slave_info.setPhysAddr(new_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   503
            for variable in self.ProcessVariables.getvariable():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   504
                read_from = variable.getReadFrom()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   505
                if read_from is not None and read_from.getPosition() == slave_pos:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   506
                    read_from.setPosition(new_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   507
                write_to = variable.getWriteTo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   508
                if write_to is not None and write_to.getPosition() == slave_pos:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   509
                    write_to.setPosition(new_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   510
            self.CreateBuffer(True)
2147
a8b095de63e8 Fix bug in when moving Ethercat slaves fixed
Laurent Bessard
parents: 2141
diff changeset
   511
            self.CTNRequestSave()
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   512
            if self._View is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   513
                self._View.RefreshView()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   514
                self._View.RefreshBuffer()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   515
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   516
    def GetSlaveAlias(self, slave_pos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   517
        slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   518
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   519
            slave_info = slave.getInfo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   520
            return slave_info.getAutoIncAddr()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   521
        return None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   522
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   523
    def SetSlaveAlias(self, slave_pos, alias):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   524
        slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   525
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   526
            slave_info = slave.getInfo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   527
            slave_info.setAutoIncAddr(alias)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   528
            self.BufferModel()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   529
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   530
    def GetSlaveType(self, slave_pos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   531
        slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   532
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   533
            return slave.getType()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   534
        return None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   535
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   536
    def SetSlaveType(self, slave_pos, type_infos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   537
        slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   538
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   539
            slave.setType(type_infos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   540
            self.BufferModel()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   541
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   542
    def GetSlaveInfos(self, slave_pos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   543
        slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   544
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   545
            type_infos = slave.getType()
2137
b65abacdbdf9 Added support for multiple module extra params in ModulesLibrary
Laurent Bessard
parents: 2133
diff changeset
   546
            device, module_extra_params = self.GetModuleInfos(type_infos)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   547
            if device is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   548
                infos = type_infos.copy()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   549
                infos.update({"physics": device.getPhysics(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   550
                              "sync_managers": device.GetSyncManagers(),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   551
                              "entries": self.GetSlaveVariables(device)})
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   552
                return infos
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   553
        return None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   554
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   555
    def GetSlaveVariables(self, slave_pos=None, limits=None, device=None):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   556
        if device is None and slave_pos is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   557
            slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   558
            if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   559
                type_infos = slave.getType()
2137
b65abacdbdf9 Added support for multiple module extra params in ModulesLibrary
Laurent Bessard
parents: 2133
diff changeset
   560
                device, module_extra_params = self.GetModuleInfos(type_infos)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   561
        if device is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   562
            entries = device.GetEntriesList(limits)
2152
e6946c298a42 Cherry-pick and re-commit to legitimate ancestor of commit 'Ethercat Management Function Refactoring Source by RTES Lab.' from youcu <youcu1022@gmail.com>
Edouard Tisserant
parents: 2149
diff changeset
   563
            #print entries
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   564
            entries_list = entries.items()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   565
            entries_list.sort()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   566
            entries = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   567
            current_index = None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   568
            current_entry = None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   569
            for (index, subindex), entry in entries_list:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   570
                entry["children"] = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   571
                if slave_pos is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   572
                    entry["Position"] = str(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   573
                entry
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   574
                if index != current_index:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   575
                    current_index = index
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   576
                    current_entry = entry
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   577
                    entries.append(entry)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   578
                elif current_entry is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   579
                    current_entry["children"].append(entry)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   580
                else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   581
                    entries.append(entry)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   582
            return entries
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   583
        return []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   584
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   585
    def GetSlaveVariableDataType(self, slave_pos, index, subindex):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   586
        slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   587
        if slave is not None:
2137
b65abacdbdf9 Added support for multiple module extra params in ModulesLibrary
Laurent Bessard
parents: 2133
diff changeset
   588
            device, module_extra_params = self.GetModuleInfos(slave.getType())
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   589
            if device is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   590
                entries = device.GetEntriesList()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   591
                entry_infos = entries.get((index, subindex))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   592
                if entry_infos is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   593
                    return entry_infos["Type"]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   594
        return None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   595
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   596
    def GetNodesVariables(self, vendor=None, slave_pos=None, slave_profile=None, limits=None):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   597
        entries = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   598
        for slave_position in self.GetSlaves():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   599
            if slave_pos is not None and slave_position != slave_pos:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   600
                continue
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   601
            slave = self.GetSlave(slave_position)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   602
            type_infos = slave.getType()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   603
            if vendor is not None and ExtractHexDecValue(type_infos["vendor"]) != vendor:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   604
                continue
2137
b65abacdbdf9 Added support for multiple module extra params in ModulesLibrary
Laurent Bessard
parents: 2133
diff changeset
   605
            device, module_extra_params = self.GetModuleInfos(type_infos)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   606
            if slave_profile is not None and slave_profile not in device.GetProfileNumbers():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   607
                continue
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   608
            entries.extend(self.GetSlaveVariables(slave_position, limits, device))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   609
        return entries
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   610
     
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   611
    def GetModuleInfos(self, type_infos):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   612
        return self.CTNParent.GetModuleInfos(type_infos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   613
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   614
    def GetSlaveTypesLibrary(self, profile_filter=None):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   615
        return self.CTNParent.GetModulesLibrary(profile_filter)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   616
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   617
    def GetLibraryVendors(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   618
        return self.CTNParent.GetVendors()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   619
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   620
    def GetDeviceLocationTree(self, slave_pos, current_location, device_name):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   621
        slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   622
        vars = []    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   623
        if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   624
            type_infos = slave.getType()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   625
        
2137
b65abacdbdf9 Added support for multiple module extra params in ModulesLibrary
Laurent Bessard
parents: 2133
diff changeset
   626
            device, module_extra_params = self.GetModuleInfos(type_infos)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   627
            if device is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   628
                sync_managers = []
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   629
                for sync_manager in device.getSm():
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   630
                    sync_manager_control_byte = ExtractHexDecValue(sync_manager.getControlByte())
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   631
                    sync_manager_direction = sync_manager_control_byte & 0x0c
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   632
                    if sync_manager_direction:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   633
                        sync_managers.append(LOCATION_VAR_OUTPUT)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   634
                    else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   635
                        sync_managers.append(LOCATION_VAR_INPUT)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   636
                
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   637
                entries = device.GetEntriesList().items()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   638
                entries.sort()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   639
                for (index, subindex), entry in entries:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   640
                    var_size = self.GetSizeOfType(entry["Type"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   641
                    if var_size is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   642
                        var_class = VARCLASSCONVERSION.get(entry["PDOMapping"], None)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   643
                        if var_class is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   644
                            if var_class == LOCATION_VAR_INPUT:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   645
                                var_dir = "%I"
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   646
                            else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   647
                                var_dir = "%Q"    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   648
                        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   649
                            vars.append({"name": "0x%4.4x-0x%2.2x: %s" % (index, subindex, entry["Name"]),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   650
                                         "type": var_class,
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   651
                                         "size": var_size,
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   652
                                         "IEC_type": entry["Type"],
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   653
                                         "var_name": "%s_%4.4x_%2.2x" % ("_".join(device_name.split()), index, subindex),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   654
                                         "location": "%s%s%s"%(var_dir, var_size, ".".join(map(str, current_location + 
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   655
                                                                                                    (index, subindex)))),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   656
                                         "description": "",
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   657
                                         "children": []})
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   658
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   659
        return vars
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   660
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   661
    def CTNTestModified(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   662
        return self.ChangesToSave or not self.ModelIsSaved()    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   663
2133
ba0b2ca7db26 Fixed Save As... function in Beremiz
Laurent Bessard
parents: 2127
diff changeset
   664
    def OnCTNSave(self, from_project_path=None):
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   665
        config_filepath = self.ConfigFileName()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   666
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   667
        config_xmlfile = open(config_filepath,"w")
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   668
        config_xmlfile.write(etree.tostring(
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   669
            self.Config, 
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   670
            pretty_print=True, 
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   671
            xml_declaration=True, 
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   672
            encoding='utf-8'))
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   673
        config_xmlfile.close()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   674
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   675
        process_filepath = self.ProcessVariablesFileName()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   676
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   677
        process_xmlfile = open(process_filepath,"w")
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   678
        process_xmlfile.write(etree.tostring(
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   679
            self.ProcessVariables, 
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   680
            pretty_print=True, 
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   681
            xml_declaration=True, 
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   682
            encoding='utf-8'))
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   683
        process_xmlfile.close()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   684
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   685
        self.Buffer.CurrentSaved()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   686
        return True
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   687
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   688
    def GetProcessVariableName(self, location, var_type):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   689
        return "__M%s_%s" % (self.GetSizeOfType(var_type), "_".join(map(str, location)))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   690
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   691
    def _Generate_C(self, buildpath, locations):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   692
        current_location = self.GetCurrentLocation()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   693
        # define a unique name for the generated C file
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   694
        location_str = "_".join(map(lambda x:str(x), current_location))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   695
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   696
        Gen_Ethercatfile_path = os.path.join(buildpath, "ethercat_%s.c"%location_str)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   697
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   698
        self.FileGenerator = _EthercatCFileGenerator(self)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   699
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   700
        LocationCFilesAndCFLAGS, LDFLAGS, extra_files = ConfigTreeNode._Generate_C(self, buildpath, locations)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   701
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   702
        for idx, variable in enumerate(self.ProcessVariables.getvariable()):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   703
            name = None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   704
            var_type = None
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   705
            read_from = variable.getReadFrom()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   706
            write_to = variable.getWriteTo()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   707
            if read_from is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   708
                pos = read_from.getPosition()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   709
                index = read_from.getIndex()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   710
                subindex = read_from.getSubIndex()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   711
                location = current_location + (idx, )
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   712
                var_type = self.GetSlaveVariableDataType(pos, index, subindex)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   713
                name = self.FileGenerator.DeclareVariable(
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   714
                            pos, index, subindex, var_type, "I",
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   715
                            self.GetProcessVariableName(location, var_type))
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   716
            if write_to is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   717
                pos = write_to.getPosition()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   718
                index = write_to.getIndex()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   719
                subindex = write_to.getSubIndex()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   720
                if name is None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   721
                    location = current_location + (idx, )
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   722
                    var_type = self.GetSlaveVariableDataType(pos, index, subindex)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   723
                    name = self.GetProcessVariableName(location, var_type)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   724
                self.FileGenerator.DeclareVariable(
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   725
                            pos, index, subindex, var_type, "Q", name, True)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   726
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   727
        self.FileGenerator.GenerateCFile(Gen_Ethercatfile_path, location_str, self.BaseParams.getIEC_Channel())
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   728
        
2135
ca1c34ff6c10 Fixed order of LocationCFilesAndCFLAGS, master was called after slaves in PLC init and retrieve functions
Laurent Bessard
parents: 2133
diff changeset
   729
        LocationCFilesAndCFLAGS.insert(0, 
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   730
            (current_location, 
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   731
             [(Gen_Ethercatfile_path, '"-I%s"'%os.path.abspath(self.GetCTRoot().GetIECLibPath()))], 
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   732
             True))
2112
e88cd6ff885e Fixed linking with non RTDM etherlab lib. Now with rtdm...
Edouard Tisserant
parents: 2111
diff changeset
   733
        LDFLAGS.append("-lethercat_rtdm -lrtdm")
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   734
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   735
        return LocationCFilesAndCFLAGS, LDFLAGS, extra_files
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   736
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   737
    ConfNodeMethods = [
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   738
        {"bitmap" : "ScanNetwork",
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   739
         "name" : _("Scan Network"), 
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   740
         "tooltip" : _("Scan Network"),
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   741
         "method" : "_ScanNetwork"},
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   742
    ]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   743
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   744
    def CTNGenerate_C(self, buildpath, locations):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   745
        current_location = self.GetCurrentLocation()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   746
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   747
        slaves = self.GetSlaves()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   748
        for slave_pos in slaves:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   749
            slave = self.GetSlave(slave_pos)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   750
            if slave is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   751
                self.FileGenerator.DeclareSlave(slave_pos, slave)
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   752
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   753
        for location in locations:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   754
            loc = location["LOC"][len(current_location):]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   755
            slave_pos = loc[0]
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   756
            if slave_pos in slaves and len(loc) == 3 and location["DIR"] != "M":
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   757
                self.FileGenerator.DeclareVariable(
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   758
                    slave_pos, loc[1], loc[2], location["IEC_TYPE"], location["DIR"], location["NAME"])
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   759
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   760
        return [],"",False
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   761
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   762
#-------------------------------------------------------------------------------
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   763
#                      Current Buffering Management Functions
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   764
#-------------------------------------------------------------------------------
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   765
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   766
    """
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   767
    Return a copy of the config
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   768
    """
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   769
    def Copy(self, model):
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   770
        return deepcopy(model)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   771
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   772
    def CreateBuffer(self, saved):
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   773
        self.Buffer = UndoBuffer(
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   774
            (EtherCATConfigParser.Dumps(self.Config), 
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   775
             ProcessVariablesParser.Dumps(self.ProcessVariables)), 
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   776
            saved)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   777
        
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   778
    def BufferModel(self):
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   779
        self.Buffer.Buffering(
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   780
            (EtherCATConfigParser.Dumps(self.Config), 
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   781
             ProcessVariablesParser.Dumps(self.ProcessVariables)))
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   782
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   783
    def ModelIsSaved(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   784
        if self.Buffer is not None:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   785
            return self.Buffer.IsCurrentSaved()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   786
        else:
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   787
            return True
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   788
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   789
    def LoadPrevious(self):
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   790
        config, process_variables = self.Buffer.Previous()
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   791
        self.Config = EtherCATConfigParser.Loads(config)
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   792
        self.ProcessVariables = ProcessVariablesParser.Loads(process_variables)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   793
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   794
    def LoadNext(self):
2157
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   795
        config, process_variables = self.Buffer.Next()
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   796
        self.Config = EtherCATConfigParser.Loads(config)
a2385e535cf5 Fixed controllers for working with latest version of xmlclass
Laurent Bessard
parents: 2152
diff changeset
   797
        self.ProcessVariables = ProcessVariablesParser.Loads(process_variables)
2111
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   798
    
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   799
    def GetBufferState(self):
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   800
        first = self.Buffer.IsFirst()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   801
        last = self.Buffer.IsLast()
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   802
        return not first, not last
f2cffda17d00 Split etherlab.py into multiple files
Laurent Bessard
parents:
diff changeset
   803