From 2879b3a1c79ffe3a23bd97699b7003c226d49a8f Mon Sep 17 00:00:00 2001
From: Martin Teichmann <martin.teichmann@xfel.eu>
Date: Mon, 11 Jan 2021 09:06:12 +0000
Subject: [PATCH] improve interpretation of EEPROM data

---
 ethercat.py | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/ethercat.py b/ethercat.py
index c90ae22..802b9bc 100644
--- a/ethercat.py
+++ b/ethercat.py
@@ -227,8 +227,42 @@ class Terminal:
         self.eeprom = await self.read_eeprom()
         await self.write(0x800, data=0x80)  # empty out sync manager
         await self.write(0x800, data=self.eeprom[41])
-        self.mbx_out_off, self.mbx_out_sz, self.mbx_in_off, self.mbx_in_sz = \
-            unpack("<HH4xHH", self.eeprom[41][:12])
+        self.mbx_out_off = self.mbx_out_sz = None
+        self.mbx_in_off = self.mbx_in_sz = None
+        self.pdo_out_off = self.pdo_out_sz = None
+        self.pdo_in_off = self.pdo_in_sz = None
+        for i in range(0, len(self.eeprom[41]), 8):
+            offset, size, mode = unpack("<HHB", self.eeprom[41][i:i+5])
+            mode &= 0xf
+            if mode == 0:
+                self.pdo_in_off = offset
+                self.pdo_in_sz = size
+            elif mode == 2:
+                self.mbx_in_off = offset
+                self.mbx_in_sz = size
+            elif mode == 4:
+                self.pdo_out_off = offset
+                self.pdo_out_sz = size
+            elif mode == 6:
+                self.mbx_out_off = offset
+                self.mbx_out_sz = size
+
+    def parse_pdos(self):
+        def parse_pdo(s):
+            i = 0
+            while i < len(s):
+                idx, e, sm, u1, u2, u3 = unpack("<HBBBBH", s[i:i+8])
+                print(f"idx {idx:x} sm {sm} {u1:x} {u2:x} {u3:x}")
+                i += 8
+                for er in range(e):
+                    bitsize, = unpack("<5xB2x", s[i:i+8])
+                    print("  bs", bitsize, s[i:i+8])
+                    i += 8
+
+        if 50 in self.eeprom:
+            parse_pdo(self.eeprom[50])
+        if 51 in self.eeprom:
+            parse_pdo(self.eeprom[51])
 
     async def set_state(self, state):
         await self.ec.roundtrip(ECCmd.FPWR, self.position, 0x0120, "H", state)
-- 
GitLab