diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py index 97290d5b787adcc7db3697d4abb852b84ad570be..bebc790f147f5b41985c64946758c79690d448f0 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 c5e885bb72f74e823defbb05ec4379793997e971..43b2e802715e2ae128c09daf09a2c5cc408eaecc 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),