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)), |