etherlab/etherlab.py
changeset 2162 43ab74687f45
parent 2160 75349c51a34b
child 2165 02a2b5dee5e3
equal deleted inserted replaced
2161:4bea1d98db46 2162:43ab74687f45
    20 #--------------------------------------------------
    20 #--------------------------------------------------
    21 
    21 
    22 EtherCATInfoParser = GenerateParserFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATInfo.xsd")) 
    22 EtherCATInfoParser = GenerateParserFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATInfo.xsd")) 
    23 EtherCATInfo_XPath = lambda xpath: etree.XPath(xpath)
    23 EtherCATInfo_XPath = lambda xpath: etree.XPath(xpath)
    24 
    24 
    25 def extract_param(el):
    25 def HexDecValue(context, *args):
    26     if el.tag == "Index":
    26     return str(ExtractHexDecValue(args[0][0]))
    27         return "#x%4.4X" % int(el.text)
    27 
    28     elif el.tag == "BitSize":
    28 def EntryName(context, *args):
    29         if el.text is None:
    29     return ExtractName(args[0], 
    30             return 0
    30         args[1][0] if len(args) > 1 else None)
    31         return int(el.text)
    31 
    32     elif el.tag == "PDOMapping":
    32 ENTRY_INFOS_KEYS = [
    33         if el.text is None:
    33     ("Index", lambda x: "#x%4.4X" % int(x), "#x0000"),
    34             return ""
    34     ("SubIndex", str, "0"),
    35         return el.text.upper()
    35     ("Name", str, ""),
    36     if el.text is None:
    36     ("Type", str, ""),
    37         return ""
    37     ("BitSize", int, 0),
    38     return el.text
    38     ("Access", str, ""),
    39 
    39     ("PDOMapping", str, ""),
    40 def extract_pdo_infos(pdo_infos):
    40     ("PDO index", str, ""),
    41     return {
    41     ("PDO name", str, ""),
    42         pdo_infos.tag + " " + el.tag: extract_param(el)
    42     ("PDO type", str, "")]
    43         for el in pdo_infos}
    43 
    44 
    44 class EntryListFactory:
    45 def HexDecValue(ctxt, values):
       
    46     return str(ExtractHexDecValue(values[0]))
       
    47 
       
    48 def EntryName(ctxt, values):
       
    49     default=None
       
    50     names = []
       
    51     for element in values:
       
    52         if element.tag == "Default":
       
    53             default = element.text
       
    54         else:
       
    55             names.append(element)
       
    56     return ExtractName(names, default)
       
    57 
       
    58 class AddEntry(etree.XSLTExtension):
       
    59 
    45 
    60     def __init__(self, entries):
    46     def __init__(self, entries):
    61         etree.XSLTExtension.__init__(self)
       
    62         self.Entries = entries
    47         self.Entries = entries
    63     
    48     
    64     def execute(self, context, self_node, input_node, output_parent):
    49     def AddEntry(self, context, *args):
    65         infos = etree.Element('entry_infos')
    50         index, subindex = map(lambda x: int(x[0]), args[:2])
    66         self.process_children(context, infos)
       
    67         index, subindex = map(
       
    68             lambda x: int(infos.find(x).text),
       
    69             ["Index", "SubIndex"])
       
    70         new_entry_infos = {
    51         new_entry_infos = {
    71             el.tag: extract_param(el)
    52             key: translate(arg[0]) if len(arg) > 0 else default
    72             for el in infos if el.tag != "PDO"}
    53             for (key, translate, default), arg
       
    54             in zip(ENTRY_INFOS_KEYS, args)}
       
    55         
    73         if (index, subindex) != (0, 0):
    56         if (index, subindex) != (0, 0):
    74             entry_infos = self.Entries.get((index, subindex))
    57             entry_infos = self.Entries.get((index, subindex))
    75             if entry_infos is not None:
    58             if entry_infos is not None:
    76                 PDO_infos = infos.find("PDO")
    59                 for param in ["PDO index", "PDO name", "PDO type"]:
    77                 if PDO_infos is not None:
    60                     value = new_entry_infos.get(param)
    78                     entry_infos.update(extract_pdo_infos(PDO_infos))
    61                     if value is not None:
       
    62                         entry_infos[param] = value
    79             else:
    63             else:
    80                 self.Entries[(index, subindex)] = new_entry_infos
    64                 self.Entries[(index, subindex)] = new_entry_infos
    81 
    65 
    82 entries_list_xslt = etree.parse(
    66 entries_list_xslt = etree.parse(
    83     os.path.join(ScriptDirectory, "entries_list.xslt"))
    67     os.path.join(ScriptDirectory, "entries_list.xslt"))
    98     setattr(cls, "getCoE", getCoE)
    82     setattr(cls, "getCoE", getCoE)
    99 
    83 
   100     def GetEntriesList(self, limits=None):
    84     def GetEntriesList(self, limits=None):
   101         entries = {}
    85         entries = {}
   102         
    86         
       
    87         factory = EntryListFactory(entries)
       
    88         
   103         entries_list_xslt_tree = etree.XSLT(
    89         entries_list_xslt_tree = etree.XSLT(
   104             entries_list_xslt, extensions = {
    90             entries_list_xslt, extensions = {
   105                 ("entries_list_ns", "add_entry"): AddEntry(entries),
    91                 ("entries_list_ns", "AddEntry"): factory.AddEntry,
   106                 ("entries_list_ns", "HexDecValue"): HexDecValue,
    92                 ("entries_list_ns", "HexDecValue"): HexDecValue,
   107                 ("entries_list_ns", "EntryName"): EntryName})
    93                 ("entries_list_ns", "EntryName"): EntryName})
   108         entries_list_xslt_tree(self, **dict(zip(
    94         entries_list_xslt_tree(self, **dict(zip(
   109             ["min_index", "max_index"], 
    95             ["min_index", "max_index"], 
   110             map(lambda x: etree.XSLT.strparam(str(x)),
    96             map(lambda x: etree.XSLT.strparam(str(x)),