diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py index dbcdbed651f68d49e541b6d3f18016fd2fd465fc..e6e2b0fbb0180649fad7c45167ea221866113827 100644 --- a/ebpfcat/ebpfcat.py +++ b/ebpfcat/ebpfcat.py @@ -223,8 +223,10 @@ class EBPFTerminal(Terminal): f"Incompatible Terminal: {self.vendorId}:{self.productCode}") await self.to_operational(2) self.pdos = {} - if self.has_mailbox(): - await self.parse_pdos() + outbits, inbits = await self.parse_pdos() + self.pdo_out_sz = int((outbits + 7) // 8) + self.pdo_in_sz = int((inbits + 7) // 8) + await self.write_pdo_sm() def allocate(self, packet, readonly): """allocate space in packet for the pdos of this terminal diff --git a/ebpfcat/ethercat.py b/ebpfcat/ethercat.py index a316104268745cab47b8db140d5ff1c23228d3e4..d0deba9ea6dc4bbdb9b122ab7a13ec2dda8d2bf1 100644 --- a/ebpfcat/ethercat.py +++ b/ebpfcat/ethercat.py @@ -450,6 +450,16 @@ class Terminal: elif mode == 6: self.mbx_out_off = offset self.mbx_out_sz = size + else: + print("wrong mode") + + async def write_pdo_sm(self): + await self.write(0x816, "B", 0) + await self.write(0x812, "H", self.pdo_out_sz) + await self.write(0x816, "B", self.pdo_out_sz > 0) + await self.write(0x81E, "B", 0) + await self.write(0x81A, "H", self.pdo_in_sz) + await self.write(0x81E, "B", self.pdo_in_sz > 0) async def parse_pdos(self): async def parse_eeprom(s): @@ -490,16 +500,18 @@ class Terminal: (sm, bitpos // 8, {8: "B", 16: "H", 32: "I", 64: "Q"}[bits]) bitpos += bits + return bitpos self.pdos = {} if self.has_mailbox(): - await parse(parse_sdo(0x1c12, 2)) - await parse(parse_sdo(0x1c13, 3)) + return (await parse(parse_sdo(0x1c12, 2)), + await parse(parse_sdo(0x1c13, 3))) else: - if 50 in self.eeprom: + return ( await parse(parse_eeprom(self.eeprom[50])) - if 51 in self.eeprom: + if 50 in self.eeprom else 0, await parse(parse_eeprom(self.eeprom[51])) + if 51 in self.eeprom else 0) async def parse_pdo(self, index, sm): assignment = await self.sdo_read(index)