From 505af19719a8ad47414655f54fb903ecf452d7c8 Mon Sep 17 00:00:00 2001
From: Martin Teichmann <martin.teichmann@xfel.eu>
Date: Wed, 3 Mar 2021 15:32:20 +0000
Subject: [PATCH] update tests and fix code accordingly

---
 ebpfcat/ebpfcat.py       | 30 ++++++++++++++++++++----------
 ebpfcat/ethercat_test.py |  9 ++++++---
 2 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py
index 97290d5..bebc790 100644
--- a/ebpfcat/ebpfcat.py
+++ b/ebpfcat/ebpfcat.py
@@ -206,7 +206,7 @@ class EBPFTerminal(Terminal):
                 (self.vendorId, self.productCode) not in self.compatibility):
             raise RuntimeError("Incompatible Terminal")
 
-    def allocate(self, packet):
+    def allocate(self, packet, readonly):
         if self.pdo_in_sz:
             bases = [packet.size + packet.DATAGRAM_HEADER]
             packet.append(ECCmd.FPRD, b"\0" * self.pdo_in_sz, 0,
@@ -215,9 +215,13 @@ class EBPFTerminal(Terminal):
             bases = [None]
         if self.pdo_out_sz:
             bases.append(packet.size + packet.DATAGRAM_HEADER)
-            packet.on_the_fly.append((packet.size, ECCmd.FPWR))
-            packet.append(ECCmd.NOP, b"\0" * self.pdo_out_sz, 0,
-                          self.position, self.pdo_out_off)
+            if readonly:
+                packet.on_the_fly.append((packet.size, ECCmd.FPWR))
+                packet.append(ECCmd.NOP, b"\0" * self.pdo_out_sz, 0,
+                              self.position, self.pdo_out_off)
+            else:
+                packet.append(ECCmd.FPWR, b"\0" * self.pdo_out_sz, 0,
+                              self.position, self.pdo_out_off)
         return bases
 
     def update(self, data):
@@ -230,7 +234,7 @@ class EtherXDP(XDP):
     variables = ArrayMap()
     counters = variables.globalVar("64I")
 
-    rate = 10
+    rate = 0
 
     def program(self):
         with self.tmp:
@@ -323,11 +327,6 @@ class SyncGroupBase:
         self.terminals = {t: None for t in
                           sorted(terminals, key=lambda t: t.position)}
 
-    def allocate(self):
-        self.packet = Packet()
-        self.packet.on_the_fly = []
-        self.terminals = {t: t.allocate(self.packet) for t in self.terminals}
-
 
 class SyncGroup(SyncGroupBase):
     """A group of devices communicating at the same time"""
@@ -354,6 +353,11 @@ class SyncGroup(SyncGroupBase):
         self.asm_packet = self.packet.assemble(self.packet_index)
         return ensure_future(self.run())
 
+    def allocate(self):
+        self.packet = Packet()
+        self.terminals = {t: t.allocate(self.packet, False)
+                          for t in self.terminals}
+
 
 class FastSyncGroup(SyncGroupBase, XDP):
     license = "GPL"
@@ -379,3 +383,9 @@ class FastSyncGroup(SyncGroupBase, XDP):
         self.monitor = ensure_future(gather(*[t.to_operational()
                                               for t in self.terminals]))
         return self.monitor
+
+    def allocate(self):
+        self.packet = Packet()
+        self.packet.on_the_fly = []
+        self.terminals = {t: t.allocate(self.packet, True)
+                          for t in self.terminals}
diff --git a/ebpfcat/ethercat_test.py b/ebpfcat/ethercat_test.py
index c5e885b..43b2e80 100644
--- a/ebpfcat/ethercat_test.py
+++ b/ebpfcat/ethercat_test.py
@@ -4,7 +4,8 @@ from unittest import TestCase, main
 from .devices import AnalogInput, AnalogOutput
 from .terminals import EL4104, EL3164, EK1814
 from .ethercat import ECCmd
-from .ebpfcat import FastSyncGroup, SyncGroup, TerminalVar, Device
+from .ebpfcat import (
+    FastSyncGroup, SyncGroup, TerminalVar, Device, EBPFTerminal, PacketDesc)
 from .ebpf import Instruction, Opcode as O
 
 
@@ -27,7 +28,7 @@ class MockEtherCat:
                 await sleep(0)
         return self.results.pop(0)
 
-    def register_sync_group(self, sg):
+    def register_sync_group(self, sg, packet):
         self.rsg = sg
         return 0x33
 
@@ -187,7 +188,9 @@ class Tests(TestCase):
             Instruction(opcode=O.W+O.LD, dst=0, src=1, off=4, imm=0),
             Instruction(opcode=O.W+O.LD, dst=2, src=1, off=0, imm=0),
             Instruction(opcode=O.ADD+O.LONG, dst=2, src=0, off=0, imm=83),
-            Instruction(opcode=O.JLE+O.REG, dst=0, src=2, off=21, imm=0),
+            Instruction(opcode=O.JLE+O.REG, dst=0, src=2, off=23, imm=0),
+            Instruction(opcode=O.ST+O.B, dst=9, src=0, off=41, imm=5),
+            Instruction(opcode=O.ST+O.B, dst=9, src=0, off=54, imm=5),
 
             Instruction(opcode=O.B+O.LD, dst=0, src=9, off=51, imm=0),
             Instruction(opcode=O.AND, dst=0, src=0, off=0, imm=-2),
-- 
GitLab