etherlab/etherlab.py
changeset 2162 43ab74687f45
parent 2160 75349c51a34b
child 2165 02a2b5dee5e3
--- a/etherlab/etherlab.py	Mon Sep 30 13:43:02 2013 +0200
+++ b/etherlab/etherlab.py	Wed Oct 02 10:46:18 2013 +0200
@@ -22,60 +22,44 @@
 EtherCATInfoParser = GenerateParserFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATInfo.xsd")) 
 EtherCATInfo_XPath = lambda xpath: etree.XPath(xpath)
 
-def extract_param(el):
-    if el.tag == "Index":
-        return "#x%4.4X" % int(el.text)
-    elif el.tag == "BitSize":
-        if el.text is None:
-            return 0
-        return int(el.text)
-    elif el.tag == "PDOMapping":
-        if el.text is None:
-            return ""
-        return el.text.upper()
-    if el.text is None:
-        return ""
-    return el.text
-
-def extract_pdo_infos(pdo_infos):
-    return {
-        pdo_infos.tag + " " + el.tag: extract_param(el)
-        for el in pdo_infos}
-
-def HexDecValue(ctxt, values):
-    return str(ExtractHexDecValue(values[0]))
-
-def EntryName(ctxt, values):
-    default=None
-    names = []
-    for element in values:
-        if element.tag == "Default":
-            default = element.text
-        else:
-            names.append(element)
-    return ExtractName(names, default)
-
-class AddEntry(etree.XSLTExtension):
+def HexDecValue(context, *args):
+    return str(ExtractHexDecValue(args[0][0]))
+
+def EntryName(context, *args):
+    return ExtractName(args[0], 
+        args[1][0] if len(args) > 1 else None)
+
+ENTRY_INFOS_KEYS = [
+    ("Index", lambda x: "#x%4.4X" % int(x), "#x0000"),
+    ("SubIndex", str, "0"),
+    ("Name", str, ""),
+    ("Type", str, ""),
+    ("BitSize", int, 0),
+    ("Access", str, ""),
+    ("PDOMapping", str, ""),
+    ("PDO index", str, ""),
+    ("PDO name", str, ""),
+    ("PDO type", str, "")]
+
+class EntryListFactory:
 
     def __init__(self, entries):
-        etree.XSLTExtension.__init__(self)
         self.Entries = entries
     
-    def execute(self, context, self_node, input_node, output_parent):
-        infos = etree.Element('entry_infos')
-        self.process_children(context, infos)
-        index, subindex = map(
-            lambda x: int(infos.find(x).text),
-            ["Index", "SubIndex"])
+    def AddEntry(self, context, *args):
+        index, subindex = map(lambda x: int(x[0]), args[:2])
         new_entry_infos = {
-            el.tag: extract_param(el)
-            for el in infos if el.tag != "PDO"}
+            key: translate(arg[0]) if len(arg) > 0 else default
+            for (key, translate, default), arg
+            in zip(ENTRY_INFOS_KEYS, args)}
+        
         if (index, subindex) != (0, 0):
             entry_infos = self.Entries.get((index, subindex))
             if entry_infos is not None:
-                PDO_infos = infos.find("PDO")
-                if PDO_infos is not None:
-                    entry_infos.update(extract_pdo_infos(PDO_infos))
+                for param in ["PDO index", "PDO name", "PDO type"]:
+                    value = new_entry_infos.get(param)
+                    if value is not None:
+                        entry_infos[param] = value
             else:
                 self.Entries[(index, subindex)] = new_entry_infos
 
@@ -100,9 +84,11 @@
     def GetEntriesList(self, limits=None):
         entries = {}
         
+        factory = EntryListFactory(entries)
+        
         entries_list_xslt_tree = etree.XSLT(
             entries_list_xslt, extensions = {
-                ("entries_list_ns", "add_entry"): AddEntry(entries),
+                ("entries_list_ns", "AddEntry"): factory.AddEntry,
                 ("entries_list_ns", "HexDecValue"): HexDecValue,
                 ("entries_list_ns", "EntryName"): EntryName})
         entries_list_xslt_tree(self, **dict(zip(