From 1a74fb64ea04a6662667ad6653aede296f22ce99 Mon Sep 17 00:00:00 2001 From: samsam Date: Wed, 6 Nov 2024 22:13:27 +0100 Subject: [PATCH 01/11] Fixed : retransmission of discarded segments starts at beginning of new block --- canopen/sdo/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/canopen/sdo/client.py b/canopen/sdo/client.py index 421fc3d4..e756035c 100644 --- a/canopen/sdo/client.py +++ b/canopen/sdo/client.py @@ -561,7 +561,7 @@ def _retransmit(self): response = self.sdo_client.read_response() res_command, = struct.unpack_from("B", response) seqno = res_command & 0x7F - if seqno == self._ackseq + 1: + if seqno == 1: # We should be back in sync self._ackseq = seqno return response From 33aa620cda234f72c710079979a78db06172f3dc Mon Sep 17 00:00:00 2001 From: Samuel Lee Date: Wed, 15 Jan 2025 11:51:50 +0100 Subject: [PATCH 02/11] Test : add a block retransmit test. This test passes with this implementation but will fail with an invalid CRC without fix for discarded segments. --- test/test_sdo.py | 308 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 308 insertions(+) diff --git a/test/test_sdo.py b/test/test_sdo.py index 6fe8544c..ab27f07d 100644 --- a/test/test_sdo.py +++ b/test/test_sdo.py @@ -170,6 +170,314 @@ def test_block_upload(self): data = fp.read() self.assertEqual(data, 'Tiny Node - Mega Domains !') + def test_sdo_block_upload_retransmit(self): + """Send 'the crazy fox jumps over the lazy dog\n' multiple times + and trigger a retransmit by only validating a block partially. + """ + self.data = [ + (TX, b"\xa4\x08\x10\x00\x7f\x00\x00\x00"), + (RX, b"\xc4\x08\x10\x00\x00\x00\x00\x00"), + (TX, b"\xa3\x00\x00\x00\x00\x00\x00\x00"), + (RX, b"\x01\x74\x68\x65\x20\x63\x72\x61"), + (RX, b"\x02\x7a\x79\x20\x66\x6f\x78\x20"), + (RX, b"\x03\x6a\x75\x6d\x70\x73\x20\x6f"), + (RX, b"\x04\x76\x65\x72\x20\x74\x68\x65"), + (RX, b"\x05\x20\x6c\x61\x7a\x79\x20\x64"), + (RX, b"\x06\x6f\x67\x0a\x74\x68\x65\x20"), + (RX, b"\x07\x63\x72\x61\x7a\x79\x20\x66"), + (RX, b"\x08\x6f\x78\x20\x6a\x75\x6d\x70"), + (RX, b"\x09\x73\x20\x6f\x76\x65\x72\x20"), + (RX, b"\x0a\x74\x68\x65\x20\x6c\x61\x7a"), + (RX, b"\x0b\x79\x20\x64\x6f\x67\x0a\x74"), + (RX, b"\x0c\x68\x65\x20\x63\x72\x61\x7a"), + (RX, b"\x0d\x79\x20\x66\x6f\x78\x20\x6a"), + (RX, b"\x0e\x75\x6d\x70\x73\x20\x6f\x76"), + (RX, b"\x0f\x65\x72\x20\x74\x68\x65\x20"), + (RX, b"\x10\x6c\x61\x7a\x79\x20\x64\x6f"), + (RX, b"\x11\x67\x0a\x74\x68\x65\x20\x63"), + (RX, b"\x12\x72\x61\x7a\x79\x20\x66\x6f"), + (RX, b"\x13\x78\x20\x6a\x75\x6d\x70\x73"), + (RX, b"\x14\x20\x6f\x76\x65\x72\x20\x74"), + (RX, b"\x15\x68\x65\x20\x6c\x61\x7a\x79"), + (RX, b"\x16\x20\x64\x6f\x67\x0a\x74\x68"), + (RX, b"\x17\x65\x20\x63\x72\x61\x7a\x79"), + (RX, b"\x18\x20\x66\x6f\x78\x20\x6a\x75"), + (RX, b"\x19\x6d\x70\x73\x20\x6f\x76\x65"), + (RX, b"\x1a\x72\x20\x74\x68\x65\x20\x6c"), + (RX, b"\x1b\x61\x7a\x79\x20\x64\x6f\x67"), + (RX, b"\x1c\x0a\x74\x68\x65\x20\x63\x72"), + (RX, b"\x1d\x61\x7a\x79\x20\x66\x6f\x78"), + (RX, b"\x1e\x20\x6a\x75\x6d\x70\x73\x20"), + (RX, b"\x1f\x6f\x76\x65\x72\x20\x74\x68"), + (RX, b"\x20\x65\x20\x6c\x61\x7a\x79\x20"), + (RX, b"\x21\x64\x6f\x67\x0a\x74\x68\x65"), + (RX, b"\x22\x20\x63\x72\x61\x7a\x79\x20"), + (RX, b"\x23\x66\x6f\x78\x20\x6a\x75\x6d"), + (RX, b"\x24\x70\x73\x20\x6f\x76\x65\x72"), + (RX, b"\x25\x20\x74\x68\x65\x20\x6c\x61"), + (RX, b"\x26\x7a\x79\x20\x64\x6f\x67\x0a"), + (RX, b"\x27\x74\x68\x65\x20\x63\x72\x61"), + (RX, b"\x28\x7a\x79\x20\x66\x6f\x78\x20"), + (RX, b"\x29\x6a\x75\x6d\x70\x73\x20\x6f"), + (RX, b"\x2a\x76\x65\x72\x20\x74\x68\x65"), + (RX, b"\x2b\x20\x6c\x61\x7a\x79\x20\x64"), + (RX, b"\x2c\x6f\x67\x0a\x74\x68\x65\x20"), + (RX, b"\x2d\x63\x72\x61\x7a\x79\x20\x66"), + (RX, b"\x2e\x6f\x78\x20\x6a\x75\x6d\x70"), + (RX, b"\x2f\x73\x20\x6f\x76\x65\x72\x20"), + (RX, b"\x30\x74\x68\x65\x20\x6c\x61\x7a"), + (RX, b"\x31\x79\x20\x64\x6f\x67\x0a\x74"), + (RX, b"\x32\x68\x65\x20\x63\x72\x61\x7a"), + (RX, b"\x34\x79\x20\x66\x6f\x78\x20\x6a"), + (RX, b"\x34\x75\x6d\x70\x73\x20\x6f\x76"), # Wrong seqno (x34 instead of x32) + (RX, b"\x35\x65\x72\x20\x74\x68\x65\x20"), + (RX, b"\x36\x6c\x61\x7a\x79\x20\x64\x6f"), + (RX, b"\x37\x67\x0a\x74\x68\x65\x20\x63"), + (RX, b"\x38\x72\x61\x7a\x79\x20\x66\x6f"), + (RX, b"\x39\x78\x20\x6a\x75\x6d\x70\x73"), + (RX, b"\x3a\x20\x6f\x76\x65\x72\x20\x74"), + (RX, b"\x3b\x68\x65\x20\x6c\x61\x7a\x79"), + (RX, b"\x3c\x20\x64\x6f\x67\x0a\x74\x68"), + (RX, b"\x3d\x65\x20\x63\x72\x61\x7a\x79"), + (RX, b"\x3e\x20\x66\x6f\x78\x20\x6a\x75"), + (RX, b"\x3f\x6d\x70\x73\x20\x6f\x76\x65"), + (RX, b"\x40\x72\x20\x74\x68\x65\x20\x6c"), + (RX, b"\x41\x61\x7a\x79\x20\x64\x6f\x67"), + (RX, b"\x42\x0a\x74\x68\x65\x20\x63\x72"), + (RX, b"\x43\x61\x7a\x79\x20\x66\x6f\x78"), + (RX, b"\x44\x20\x6a\x75\x6d\x70\x73\x20"), + (RX, b"\x45\x6f\x76\x65\x72\x20\x74\x68"), + (RX, b"\x46\x65\x20\x6c\x61\x7a\x79\x20"), + (RX, b"\x47\x64\x6f\x67\x0a\x74\x68\x65"), + (RX, b"\x48\x20\x63\x72\x61\x7a\x79\x20"), + (RX, b"\x49\x66\x6f\x78\x20\x6a\x75\x6d"), + (RX, b"\x4a\x70\x73\x20\x6f\x76\x65\x72"), + (RX, b"\x4b\x20\x74\x68\x65\x20\x6c\x61"), + (RX, b"\x4c\x7a\x79\x20\x64\x6f\x67\x0a"), + (RX, b"\x4d\x74\x68\x65\x20\x63\x72\x61"), + (RX, b"\x4e\x7a\x79\x20\x66\x6f\x78\x20"), + (RX, b"\x4f\x6a\x75\x6d\x70\x73\x20\x6f"), + (RX, b"\x50\x76\x65\x72\x20\x74\x68\x65"), + (RX, b"\x51\x20\x6c\x61\x7a\x79\x20\x64"), + (RX, b"\x52\x6f\x67\x0a\x74\x68\x65\x20"), + (RX, b"\x53\x63\x72\x61\x7a\x79\x20\x66"), + (RX, b"\x54\x6f\x78\x20\x6a\x75\x6d\x70"), + (RX, b"\x55\x73\x20\x6f\x76\x65\x72\x20"), + (RX, b"\x56\x74\x68\x65\x20\x6c\x61\x7a"), + (RX, b"\x57\x79\x20\x64\x6f\x67\x0a\x74"), + (RX, b"\x58\x68\x65\x20\x63\x72\x61\x7a"), + (RX, b"\x59\x79\x20\x66\x6f\x78\x20\x6a"), + (RX, b"\x5a\x75\x6d\x70\x73\x20\x6f\x76"), + (RX, b"\x5b\x65\x72\x20\x74\x68\x65\x20"), + (RX, b"\x5c\x6c\x61\x7a\x79\x20\x64\x6f"), + (RX, b"\x5d\x67\x0a\x74\x68\x65\x20\x63"), + (RX, b"\x5e\x72\x61\x7a\x79\x20\x66\x6f"), + (RX, b"\x5f\x78\x20\x6a\x75\x6d\x70\x73"), + (RX, b"\x60\x20\x6f\x76\x65\x72\x20\x74"), + (RX, b"\x61\x68\x65\x20\x6c\x61\x7a\x79"), + (RX, b"\x62\x20\x64\x6f\x67\x0a\x74\x68"), + (RX, b"\x63\x65\x20\x63\x72\x61\x7a\x79"), + (RX, b"\x64\x20\x66\x6f\x78\x20\x6a\x75"), + (RX, b"\x65\x6d\x70\x73\x20\x6f\x76\x65"), + (RX, b"\x66\x72\x20\x74\x68\x65\x20\x6c"), + (RX, b"\x67\x61\x7a\x79\x20\x64\x6f\x67"), + (RX, b"\x68\x0a\x74\x68\x65\x20\x63\x72"), + (RX, b"\x69\x61\x7a\x79\x20\x66\x6f\x78"), + (RX, b"\x6a\x20\x6a\x75\x6d\x70\x73\x20"), + (RX, b"\x6b\x6f\x76\x65\x72\x20\x74\x68"), + (RX, b"\x6c\x65\x20\x6c\x61\x7a\x79\x20"), + (RX, b"\x6d\x64\x6f\x67\x0a\x74\x68\x65"), + (RX, b"\x6e\x20\x63\x72\x61\x7a\x79\x20"), + (RX, b"\x6f\x66\x6f\x78\x20\x6a\x75\x6d"), + (RX, b"\x70\x70\x73\x20\x6f\x76\x65\x72"), + (RX, b"\x71\x20\x74\x68\x65\x20\x6c\x61"), + (RX, b"\x72\x7a\x79\x20\x64\x6f\x67\x0a"), + (RX, b"\x73\x74\x68\x65\x20\x63\x72\x61"), + (RX, b"\x74\x7a\x79\x20\x66\x6f\x78\x20"), + (RX, b"\x75\x6a\x75\x6d\x70\x73\x20\x6f"), + (RX, b"\x76\x76\x65\x72\x20\x74\x68\x65"), + (RX, b"\x77\x20\x6c\x61\x7a\x79\x20\x64"), + (RX, b"\x78\x6f\x67\x0a\x74\x68\x65\x20"), + (RX, b"\x79\x63\x72\x61\x7a\x79\x20\x66"), + (RX, b"\x7a\x6f\x78\x20\x6a\x75\x6d\x70"), + (RX, b"\x7b\x73\x20\x6f\x76\x65\x72\x20"), + (RX, b"\x7c\x74\x68\x65\x20\x6c\x61\x7a"), + (RX, b"\x7d\x79\x20\x64\x6f\x67\x0a\x74"), + (RX, b"\x7e\x68\x65\x20\x63\x72\x61\x7a"), + (RX, b"\x7f\x79\x20\x66\x6f\x78\x20\x6a"), + (TX, b"\xa2\x32\x7f\x00\x00\x00\x00\x00"), # Last good seqno (x32) + (RX, b"\x01\x79\x20\x66\x6f\x78\x20\x6a"), # Start resending from last acknowledged block + (RX, b"\x02\x75\x6d\x70\x73\x20\x6f\x76"), + (RX, b"\x03\x65\x72\x20\x74\x68\x65\x20"), + (RX, b"\x04\x6c\x61\x7a\x79\x20\x64\x6f"), + (RX, b"\x05\x67\x0a\x74\x68\x65\x20\x63"), + (RX, b"\x06\x72\x61\x7a\x79\x20\x66\x6f"), + (RX, b"\x07\x78\x20\x6a\x75\x6d\x70\x73"), + (RX, b"\x08\x20\x6f\x76\x65\x72\x20\x74"), + (RX, b"\x09\x68\x65\x20\x6c\x61\x7a\x79"), + (RX, b"\x0a\x20\x64\x6f\x67\x0a\x74\x68"), + (RX, b"\x0b\x65\x20\x63\x72\x61\x7a\x79"), + (RX, b"\x0c\x20\x66\x6f\x78\x20\x6a\x75"), + (RX, b"\x0d\x6d\x70\x73\x20\x6f\x76\x65"), + (RX, b"\x0e\x72\x20\x74\x68\x65\x20\x6c"), + (RX, b"\x0f\x61\x7a\x79\x20\x64\x6f\x67"), + (RX, b"\x10\x0a\x74\x68\x65\x20\x63\x72"), + (RX, b"\x11\x61\x7a\x79\x20\x66\x6f\x78"), + (RX, b"\x12\x20\x6a\x75\x6d\x70\x73\x20"), + (RX, b"\x13\x6f\x76\x65\x72\x20\x74\x68"), + (RX, b"\x14\x65\x20\x6c\x61\x7a\x79\x20"), + (RX, b"\x15\x64\x6f\x67\x0a\x74\x68\x65"), + (RX, b"\x16\x20\x63\x72\x61\x7a\x79\x20"), + (RX, b"\x17\x66\x6f\x78\x20\x6a\x75\x6d"), + (RX, b"\x18\x70\x73\x20\x6f\x76\x65\x72"), + (RX, b"\x19\x20\x74\x68\x65\x20\x6c\x61"), + (RX, b"\x1a\x7a\x79\x20\x64\x6f\x67\x0a"), + (RX, b"\x1b\x74\x68\x65\x20\x63\x72\x61"), + (RX, b"\x1c\x7a\x79\x20\x66\x6f\x78\x20"), + (RX, b"\x1d\x6a\x75\x6d\x70\x73\x20\x6f"), + (RX, b"\x1e\x76\x65\x72\x20\x74\x68\x65"), + (RX, b"\x1f\x20\x6c\x61\x7a\x79\x20\x64"), + (RX, b"\x20\x6f\x67\x0a\x74\x68\x65\x20"), + (RX, b"\x21\x63\x72\x61\x7a\x79\x20\x66"), + (RX, b"\x22\x6f\x78\x20\x6a\x75\x6d\x70"), + (RX, b"\x23\x73\x20\x6f\x76\x65\x72\x20"), + (RX, b"\x24\x74\x68\x65\x20\x6c\x61\x7a"), + (RX, b"\x25\x79\x20\x64\x6f\x67\x0a\x74"), + (RX, b"\x26\x68\x65\x20\x63\x72\x61\x7a"), + (RX, b"\x27\x79\x20\x66\x6f\x78\x20\x6a"), + (RX, b"\x28\x75\x6d\x70\x73\x20\x6f\x76"), + (RX, b"\x29\x65\x72\x20\x74\x68\x65\x20"), + (RX, b"\x2a\x6c\x61\x7a\x79\x20\x64\x6f"), + (RX, b"\x2b\x67\x0a\x74\x68\x65\x20\x63"), + (RX, b"\x2c\x72\x61\x7a\x79\x20\x66\x6f"), + (RX, b"\x2d\x78\x20\x6a\x75\x6d\x70\x73"), + (RX, b"\x2e\x20\x6f\x76\x65\x72\x20\x74"), + (RX, b"\x2f\x68\x65\x20\x6c\x61\x7a\x79"), + (RX, b"\x30\x20\x64\x6f\x67\x0a\x74\x68"), + (RX, b"\x31\x65\x20\x63\x72\x61\x7a\x79"), + (RX, b"\x32\x20\x66\x6f\x78\x20\x6a\x75"), + (RX, b"\x33\x6d\x70\x73\x20\x6f\x76\x65"), + (RX, b"\x34\x72\x20\x74\x68\x65\x20\x6c"), + (RX, b"\x35\x61\x7a\x79\x20\x64\x6f\x67"), + (RX, b"\x36\x0a\x74\x68\x65\x20\x63\x72"), + (RX, b"\x37\x61\x7a\x79\x20\x66\x6f\x78"), + (RX, b"\x38\x20\x6a\x75\x6d\x70\x73\x20"), + (RX, b"\x39\x6f\x76\x65\x72\x20\x74\x68"), + (RX, b"\x3a\x65\x20\x6c\x61\x7a\x79\x20"), + (RX, b"\x3b\x64\x6f\x67\x0a\x74\x68\x65"), + (RX, b"\x3c\x20\x63\x72\x61\x7a\x79\x20"), + (RX, b"\x3d\x66\x6f\x78\x20\x6a\x75\x6d"), + (RX, b"\x3e\x70\x73\x20\x6f\x76\x65\x72"), + (RX, b"\x3f\x20\x74\x68\x65\x20\x6c\x61"), + (RX, b"\x40\x7a\x79\x20\x64\x6f\x67\x0a"), + (RX, b"\x41\x74\x68\x65\x20\x63\x72\x61"), + (RX, b"\x42\x7a\x79\x20\x66\x6f\x78\x20"), + (RX, b"\x43\x6a\x75\x6d\x70\x73\x20\x6f"), + (RX, b"\x44\x76\x65\x72\x20\x74\x68\x65"), + (RX, b"\x45\x20\x6c\x61\x7a\x79\x20\x64"), + (RX, b"\x46\x6f\x67\x0a\x74\x68\x65\x20"), + (RX, b"\x47\x63\x72\x61\x7a\x79\x20\x66"), + (RX, b"\x48\x6f\x78\x20\x6a\x75\x6d\x70"), + (RX, b"\x49\x73\x20\x6f\x76\x65\x72\x20"), + (RX, b"\x4a\x74\x68\x65\x20\x6c\x61\x7a"), + (RX, b"\x4b\x79\x20\x64\x6f\x67\x0a\x74"), + (RX, b"\x4c\x68\x65\x20\x63\x72\x61\x7a"), + (RX, b"\x4d\x79\x20\x66\x6f\x78\x20\x6a"), + (RX, b"\x4e\x75\x6d\x70\x73\x20\x6f\x76"), + (RX, b"\x4f\x65\x72\x20\x74\x68\x65\x20"), + (RX, b"\x50\x6c\x61\x7a\x79\x20\x64\x6f"), + (RX, b"\x51\x67\x0a\x74\x68\x65\x20\x63"), + (RX, b"\x52\x72\x61\x7a\x79\x20\x66\x6f"), + (RX, b"\x53\x78\x20\x6a\x75\x6d\x70\x73"), + (RX, b"\x54\x20\x6f\x76\x65\x72\x20\x74"), + (RX, b"\x55\x68\x65\x20\x6c\x61\x7a\x79"), + (RX, b"\x56\x20\x64\x6f\x67\x0a\x74\x68"), + (RX, b"\x57\x65\x20\x63\x72\x61\x7a\x79"), + (RX, b"\x58\x20\x66\x6f\x78\x20\x6a\x75"), + (RX, b"\x59\x6d\x70\x73\x20\x6f\x76\x65"), + (RX, b"\x5a\x72\x20\x74\x68\x65\x20\x6c"), + (RX, b"\x5b\x61\x7a\x79\x20\x64\x6f\x67"), + (RX, b"\x5c\x0a\x74\x68\x65\x20\x63\x72"), + (RX, b"\x5d\x61\x7a\x79\x20\x66\x6f\x78"), + (RX, b"\x5e\x20\x6a\x75\x6d\x70\x73\x20"), + (RX, b"\x5f\x6f\x76\x65\x72\x20\x74\x68"), + (RX, b"\x60\x65\x20\x6c\x61\x7a\x79\x20"), + (RX, b"\x61\x64\x6f\x67\x0a\x74\x68\x65"), + (RX, b"\x62\x20\x63\x72\x61\x7a\x79\x20"), + (RX, b"\x63\x66\x6f\x78\x20\x6a\x75\x6d"), + (RX, b"\x64\x70\x73\x20\x6f\x76\x65\x72"), + (RX, b"\x65\x20\x74\x68\x65\x20\x6c\x61"), + (RX, b"\x66\x7a\x79\x20\x64\x6f\x67\x0a"), + (RX, b"\x67\x74\x68\x65\x20\x63\x72\x61"), + (RX, b"\x68\x7a\x79\x20\x66\x6f\x78\x20"), + (RX, b"\x69\x6a\x75\x6d\x70\x73\x20\x6f"), + (RX, b"\x6a\x76\x65\x72\x20\x74\x68\x65"), + (RX, b"\x6b\x20\x6c\x61\x7a\x79\x20\x64"), + (RX, b"\x6c\x6f\x67\x0a\x74\x68\x65\x20"), + (RX, b"\x6d\x63\x72\x61\x7a\x79\x20\x66"), + (RX, b"\x6e\x6f\x78\x20\x6a\x75\x6d\x70"), + (RX, b"\x6f\x73\x20\x6f\x76\x65\x72\x20"), + (RX, b"\x70\x74\x68\x65\x20\x6c\x61\x7a"), + (RX, b"\x71\x79\x20\x64\x6f\x67\x0a\x74"), + (RX, b"\x72\x68\x65\x20\x63\x72\x61\x7a"), + (RX, b"\x73\x79\x20\x66\x6f\x78\x20\x6a"), + (RX, b"\x74\x75\x6d\x70\x73\x20\x6f\x76"), + (RX, b"\x75\x65\x72\x20\x74\x68\x65\x20"), + (RX, b"\x76\x6c\x61\x7a\x79\x20\x64\x6f"), + (RX, b"\x77\x67\x0a\x74\x68\x65\x20\x63"), + (RX, b"\x78\x72\x61\x7a\x79\x20\x66\x6f"), + (RX, b"\x79\x78\x20\x6a\x75\x6d\x70\x73"), + (RX, b"\x7a\x20\x6f\x76\x65\x72\x20\x74"), + (RX, b"\x7b\x68\x65\x20\x6c\x61\x7a\x79"), + (RX, b"\x7c\x20\x64\x6f\x67\x0a\x74\x68"), + (RX, b"\x7d\x65\x20\x63\x72\x61\x7a\x79"), + (RX, b"\x7e\x20\x66\x6f\x78\x20\x6a\x75"), + (RX, b"\x7f\x6d\x70\x73\x20\x6f\x76\x65"), + (TX, b"\xa2\x7f\x7f\x00\x00\x00\x00\x00"), + (RX, b"\x01\x72\x20\x74\x68\x65\x20\x6c"), + (RX, b"\x02\x61\x7a\x79\x20\x64\x6f\x67"), + (RX, b"\x03\x0a\x74\x68\x65\x20\x63\x72"), + (RX, b"\x04\x61\x7a\x79\x20\x66\x6f\x78"), + (RX, b"\x05\x20\x6a\x75\x6d\x70\x73\x20"), + (RX, b"\x06\x6f\x76\x65\x72\x20\x74\x68"), + (RX, b"\x07\x65\x20\x6c\x61\x7a\x79\x20"), + (RX, b"\x08\x64\x6f\x67\x0a\x74\x68\x65"), + (RX, b"\x09\x20\x63\x72\x61\x7a\x79\x20"), + (RX, b"\x0a\x66\x6f\x78\x20\x6a\x75\x6d"), + (RX, b"\x0b\x70\x73\x20\x6f\x76\x65\x72"), + (RX, b"\x0c\x20\x74\x68\x65\x20\x6c\x61"), + (RX, b"\x0d\x7a\x79\x20\x64\x6f\x67\x0a"), + (RX, b"\x0e\x74\x68\x65\x20\x63\x72\x61"), + (RX, b"\x0f\x7a\x79\x20\x66\x6f\x78\x20"), + (RX, b"\x10\x6a\x75\x6d\x70\x73\x20\x6f"), + (RX, b"\x11\x76\x65\x72\x20\x74\x68\x65"), + (RX, b"\x12\x20\x6c\x61\x7a\x79\x20\x64"), + (RX, b"\x13\x6f\x67\x0a\x74\x68\x65\x20"), + (RX, b"\x14\x63\x72\x61\x7a\x79\x20\x66"), + (RX, b"\x15\x6f\x78\x20\x6a\x75\x6d\x70"), + (RX, b"\x16\x73\x20\x6f\x76\x65\x72\x20"), + (RX, b"\x17\x74\x68\x65\x20\x6c\x61\x7a"), + (RX, b"\x18\x79\x20\x64\x6f\x67\x0a\x74"), + (RX, b"\x19\x68\x65\x20\x63\x72\x61\x7a"), + (RX, b"\x1a\x79\x20\x66\x6f\x78\x20\x6a"), + (RX, b"\x1b\x75\x6d\x70\x73\x20\x6f\x76"), + (RX, b"\x1c\x65\x72\x20\x74\x68\x65\x20"), + (RX, b"\x1d\x6c\x61\x7a\x79\x20\x64\x6f"), + (RX, b"\x1e\x67\x0a\x74\x68\x65\x20\x63"), + (RX, b"\x1f\x72\x61\x7a\x79\x20\x66\x6f"), + (RX, b"\x20\x78\x20\x6a\x75\x6d\x70\x73"), + (RX, b"\x21\x20\x6f\x76\x65\x72\x20\x74"), + (RX, b"\x22\x68\x65\x20\x6c\x61\x7a\x79"), + (RX, b"\xa3\x20\x64\x6f\x67\x0a\x00\x00"), + (TX, b"\xa2\x23\x7f\x00\x00\x00\x00\x00"), + (RX, b"\xc9\x3b\x49\x00\x00\x00\x00\x00"), + (TX, b"\xa1\x00\x00\x00\x00\x00\x00\x00"), + ] + data = [] + with self.network[2].sdo[0x1008].open("r", block_transfer=True) as fp: + data = fp.read() + assert data == 39 * "the crazy fox jumps over the lazy dog\n" + def test_writable_file(self): self.data = [ (TX, b'\x20\x00\x20\x00\x00\x00\x00\x00'), From 7fe2c7181a1767c53d86b96c256e1b00591646e6 Mon Sep 17 00:00:00 2001 From: Samuel Lee Date: Wed, 15 Jan 2025 11:57:43 +0100 Subject: [PATCH 03/11] Comment : fixed wrong value in comment --- test/test_sdo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_sdo.py b/test/test_sdo.py index ab27f07d..8bc2a4b0 100644 --- a/test/test_sdo.py +++ b/test/test_sdo.py @@ -229,7 +229,7 @@ def test_sdo_block_upload_retransmit(self): (RX, b"\x31\x79\x20\x64\x6f\x67\x0a\x74"), (RX, b"\x32\x68\x65\x20\x63\x72\x61\x7a"), (RX, b"\x34\x79\x20\x66\x6f\x78\x20\x6a"), - (RX, b"\x34\x75\x6d\x70\x73\x20\x6f\x76"), # Wrong seqno (x34 instead of x32) + (RX, b"\x34\x75\x6d\x70\x73\x20\x6f\x76"), # Wrong seqno (x34 instead of x33) (RX, b"\x35\x65\x72\x20\x74\x68\x65\x20"), (RX, b"\x36\x6c\x61\x7a\x79\x20\x64\x6f"), (RX, b"\x37\x67\x0a\x74\x68\x65\x20\x63"), From ab4d1501ea95fa6e400acc201037dd07632006b6 Mon Sep 17 00:00:00 2001 From: Samuel Lee Date: Wed, 15 Jan 2025 12:02:11 +0100 Subject: [PATCH 04/11] Comment : better comments on the different steps of the block --- test/test_sdo.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/test_sdo.py b/test/test_sdo.py index 8bc2a4b0..2048a6ee 100644 --- a/test/test_sdo.py +++ b/test/test_sdo.py @@ -229,10 +229,10 @@ def test_sdo_block_upload_retransmit(self): (RX, b"\x31\x79\x20\x64\x6f\x67\x0a\x74"), (RX, b"\x32\x68\x65\x20\x63\x72\x61\x7a"), (RX, b"\x34\x79\x20\x66\x6f\x78\x20\x6a"), - (RX, b"\x34\x75\x6d\x70\x73\x20\x6f\x76"), # Wrong seqno (x34 instead of x33) - (RX, b"\x35\x65\x72\x20\x74\x68\x65\x20"), - (RX, b"\x36\x6c\x61\x7a\x79\x20\x64\x6f"), - (RX, b"\x37\x67\x0a\x74\x68\x65\x20\x63"), + (RX, b"\x34\x75\x6d\x70\x73\x20\x6f\x76"), # --> Wrong seqno (x34 instead of x33) + (RX, b"\x35\x65\x72\x20\x74\x68\x65\x20"), # All the following frames until end of block + (RX, b"\x36\x6c\x61\x7a\x79\x20\x64\x6f"), # will be ignored by the client and should be + (RX, b"\x37\x67\x0a\x74\x68\x65\x20\x63"), # resent by server. (RX, b"\x38\x72\x61\x7a\x79\x20\x66\x6f"), (RX, b"\x39\x78\x20\x6a\x75\x6d\x70\x73"), (RX, b"\x3a\x20\x6f\x76\x65\x72\x20\x74"), @@ -304,9 +304,9 @@ def test_sdo_block_upload_retransmit(self): (RX, b"\x7c\x74\x68\x65\x20\x6c\x61\x7a"), (RX, b"\x7d\x79\x20\x64\x6f\x67\x0a\x74"), (RX, b"\x7e\x68\x65\x20\x63\x72\x61\x7a"), - (RX, b"\x7f\x79\x20\x66\x6f\x78\x20\x6a"), - (TX, b"\xa2\x32\x7f\x00\x00\x00\x00\x00"), # Last good seqno (x32) - (RX, b"\x01\x79\x20\x66\x6f\x78\x20\x6a"), # Start resending from last acknowledged block + (RX, b"\x7f\x79\x20\x66\x6f\x78\x20\x6a"), # --> Last element of block + (TX, b"\xa2\x32\x7f\x00\x00\x00\x00\x00"), # --> Last good seqno (x32) + (RX, b"\x01\x79\x20\x66\x6f\x78\x20\x6a"), # --> Server starts resending from last acknowledged block (RX, b"\x02\x75\x6d\x70\x73\x20\x6f\x76"), (RX, b"\x03\x65\x72\x20\x74\x68\x65\x20"), (RX, b"\x04\x6c\x61\x7a\x79\x20\x64\x6f"), @@ -433,7 +433,7 @@ def test_sdo_block_upload_retransmit(self): (RX, b"\x7d\x65\x20\x63\x72\x61\x7a\x79"), (RX, b"\x7e\x20\x66\x6f\x78\x20\x6a\x75"), (RX, b"\x7f\x6d\x70\x73\x20\x6f\x76\x65"), - (TX, b"\xa2\x7f\x7f\x00\x00\x00\x00\x00"), + (TX, b"\xa2\x7f\x7f\x00\x00\x00\x00\x00"), # --> This block is acknlowedged without issues (RX, b"\x01\x72\x20\x74\x68\x65\x20\x6c"), (RX, b"\x02\x61\x7a\x79\x20\x64\x6f\x67"), (RX, b"\x03\x0a\x74\x68\x65\x20\x63\x72"), @@ -471,7 +471,7 @@ def test_sdo_block_upload_retransmit(self): (RX, b"\xa3\x20\x64\x6f\x67\x0a\x00\x00"), (TX, b"\xa2\x23\x7f\x00\x00\x00\x00\x00"), (RX, b"\xc9\x3b\x49\x00\x00\x00\x00\x00"), - (TX, b"\xa1\x00\x00\x00\x00\x00\x00\x00"), + (TX, b"\xa1\x00\x00\x00\x00\x00\x00\x00"), # --> Transfer ends without issues ] data = [] with self.network[2].sdo[0x1008].open("r", block_transfer=True) as fp: From 2692989549da0d1ca347ad922e0a829a9cbc1c90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Colomb?= Date: Mon, 9 Jun 2025 20:50:03 +0200 Subject: [PATCH 05/11] Fix docstring. --- test/test_sdo.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/test_sdo.py b/test/test_sdo.py index 2048a6ee..3952b535 100644 --- a/test/test_sdo.py +++ b/test/test_sdo.py @@ -171,9 +171,7 @@ def test_block_upload(self): self.assertEqual(data, 'Tiny Node - Mega Domains !') def test_sdo_block_upload_retransmit(self): - """Send 'the crazy fox jumps over the lazy dog\n' multiple times - and trigger a retransmit by only validating a block partially. - """ + """Trigger a retransmit by only validating a block partially.""" self.data = [ (TX, b"\xa4\x08\x10\x00\x7f\x00\x00\x00"), (RX, b"\xc4\x08\x10\x00\x00\x00\x00\x00"), From 43e93773b26e0f92a1e03979746a5ed87d253a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Colomb?= Date: Mon, 9 Jun 2025 20:50:59 +0200 Subject: [PATCH 06/11] Fix quoting style to match surrounding code. --- test/test_sdo.py | 596 +++++++++++++++++++++++------------------------ 1 file changed, 298 insertions(+), 298 deletions(-) diff --git a/test/test_sdo.py b/test/test_sdo.py index 3952b535..ada2a9ce 100644 --- a/test/test_sdo.py +++ b/test/test_sdo.py @@ -173,306 +173,306 @@ def test_block_upload(self): def test_sdo_block_upload_retransmit(self): """Trigger a retransmit by only validating a block partially.""" self.data = [ - (TX, b"\xa4\x08\x10\x00\x7f\x00\x00\x00"), - (RX, b"\xc4\x08\x10\x00\x00\x00\x00\x00"), - (TX, b"\xa3\x00\x00\x00\x00\x00\x00\x00"), - (RX, b"\x01\x74\x68\x65\x20\x63\x72\x61"), - (RX, b"\x02\x7a\x79\x20\x66\x6f\x78\x20"), - (RX, b"\x03\x6a\x75\x6d\x70\x73\x20\x6f"), - (RX, b"\x04\x76\x65\x72\x20\x74\x68\x65"), - (RX, b"\x05\x20\x6c\x61\x7a\x79\x20\x64"), - (RX, b"\x06\x6f\x67\x0a\x74\x68\x65\x20"), - (RX, b"\x07\x63\x72\x61\x7a\x79\x20\x66"), - (RX, b"\x08\x6f\x78\x20\x6a\x75\x6d\x70"), - (RX, b"\x09\x73\x20\x6f\x76\x65\x72\x20"), - (RX, b"\x0a\x74\x68\x65\x20\x6c\x61\x7a"), - (RX, b"\x0b\x79\x20\x64\x6f\x67\x0a\x74"), - (RX, b"\x0c\x68\x65\x20\x63\x72\x61\x7a"), - (RX, b"\x0d\x79\x20\x66\x6f\x78\x20\x6a"), - (RX, b"\x0e\x75\x6d\x70\x73\x20\x6f\x76"), - (RX, b"\x0f\x65\x72\x20\x74\x68\x65\x20"), - (RX, b"\x10\x6c\x61\x7a\x79\x20\x64\x6f"), - (RX, b"\x11\x67\x0a\x74\x68\x65\x20\x63"), - (RX, b"\x12\x72\x61\x7a\x79\x20\x66\x6f"), - (RX, b"\x13\x78\x20\x6a\x75\x6d\x70\x73"), - (RX, b"\x14\x20\x6f\x76\x65\x72\x20\x74"), - (RX, b"\x15\x68\x65\x20\x6c\x61\x7a\x79"), - (RX, b"\x16\x20\x64\x6f\x67\x0a\x74\x68"), - (RX, b"\x17\x65\x20\x63\x72\x61\x7a\x79"), - (RX, b"\x18\x20\x66\x6f\x78\x20\x6a\x75"), - (RX, b"\x19\x6d\x70\x73\x20\x6f\x76\x65"), - (RX, b"\x1a\x72\x20\x74\x68\x65\x20\x6c"), - (RX, b"\x1b\x61\x7a\x79\x20\x64\x6f\x67"), - (RX, b"\x1c\x0a\x74\x68\x65\x20\x63\x72"), - (RX, b"\x1d\x61\x7a\x79\x20\x66\x6f\x78"), - (RX, b"\x1e\x20\x6a\x75\x6d\x70\x73\x20"), - (RX, b"\x1f\x6f\x76\x65\x72\x20\x74\x68"), - (RX, b"\x20\x65\x20\x6c\x61\x7a\x79\x20"), - (RX, b"\x21\x64\x6f\x67\x0a\x74\x68\x65"), - (RX, b"\x22\x20\x63\x72\x61\x7a\x79\x20"), - (RX, b"\x23\x66\x6f\x78\x20\x6a\x75\x6d"), - (RX, b"\x24\x70\x73\x20\x6f\x76\x65\x72"), - (RX, b"\x25\x20\x74\x68\x65\x20\x6c\x61"), - (RX, b"\x26\x7a\x79\x20\x64\x6f\x67\x0a"), - (RX, b"\x27\x74\x68\x65\x20\x63\x72\x61"), - (RX, b"\x28\x7a\x79\x20\x66\x6f\x78\x20"), - (RX, b"\x29\x6a\x75\x6d\x70\x73\x20\x6f"), - (RX, b"\x2a\x76\x65\x72\x20\x74\x68\x65"), - (RX, b"\x2b\x20\x6c\x61\x7a\x79\x20\x64"), - (RX, b"\x2c\x6f\x67\x0a\x74\x68\x65\x20"), - (RX, b"\x2d\x63\x72\x61\x7a\x79\x20\x66"), - (RX, b"\x2e\x6f\x78\x20\x6a\x75\x6d\x70"), - (RX, b"\x2f\x73\x20\x6f\x76\x65\x72\x20"), - (RX, b"\x30\x74\x68\x65\x20\x6c\x61\x7a"), - (RX, b"\x31\x79\x20\x64\x6f\x67\x0a\x74"), - (RX, b"\x32\x68\x65\x20\x63\x72\x61\x7a"), - (RX, b"\x34\x79\x20\x66\x6f\x78\x20\x6a"), - (RX, b"\x34\x75\x6d\x70\x73\x20\x6f\x76"), # --> Wrong seqno (x34 instead of x33) - (RX, b"\x35\x65\x72\x20\x74\x68\x65\x20"), # All the following frames until end of block - (RX, b"\x36\x6c\x61\x7a\x79\x20\x64\x6f"), # will be ignored by the client and should be - (RX, b"\x37\x67\x0a\x74\x68\x65\x20\x63"), # resent by server. - (RX, b"\x38\x72\x61\x7a\x79\x20\x66\x6f"), - (RX, b"\x39\x78\x20\x6a\x75\x6d\x70\x73"), - (RX, b"\x3a\x20\x6f\x76\x65\x72\x20\x74"), - (RX, b"\x3b\x68\x65\x20\x6c\x61\x7a\x79"), - (RX, b"\x3c\x20\x64\x6f\x67\x0a\x74\x68"), - (RX, b"\x3d\x65\x20\x63\x72\x61\x7a\x79"), - (RX, b"\x3e\x20\x66\x6f\x78\x20\x6a\x75"), - (RX, b"\x3f\x6d\x70\x73\x20\x6f\x76\x65"), - (RX, b"\x40\x72\x20\x74\x68\x65\x20\x6c"), - (RX, b"\x41\x61\x7a\x79\x20\x64\x6f\x67"), - (RX, b"\x42\x0a\x74\x68\x65\x20\x63\x72"), - (RX, b"\x43\x61\x7a\x79\x20\x66\x6f\x78"), - (RX, b"\x44\x20\x6a\x75\x6d\x70\x73\x20"), - (RX, b"\x45\x6f\x76\x65\x72\x20\x74\x68"), - (RX, b"\x46\x65\x20\x6c\x61\x7a\x79\x20"), - (RX, b"\x47\x64\x6f\x67\x0a\x74\x68\x65"), - (RX, b"\x48\x20\x63\x72\x61\x7a\x79\x20"), - (RX, b"\x49\x66\x6f\x78\x20\x6a\x75\x6d"), - (RX, b"\x4a\x70\x73\x20\x6f\x76\x65\x72"), - (RX, b"\x4b\x20\x74\x68\x65\x20\x6c\x61"), - (RX, b"\x4c\x7a\x79\x20\x64\x6f\x67\x0a"), - (RX, b"\x4d\x74\x68\x65\x20\x63\x72\x61"), - (RX, b"\x4e\x7a\x79\x20\x66\x6f\x78\x20"), - (RX, b"\x4f\x6a\x75\x6d\x70\x73\x20\x6f"), - (RX, b"\x50\x76\x65\x72\x20\x74\x68\x65"), - (RX, b"\x51\x20\x6c\x61\x7a\x79\x20\x64"), - (RX, b"\x52\x6f\x67\x0a\x74\x68\x65\x20"), - (RX, b"\x53\x63\x72\x61\x7a\x79\x20\x66"), - (RX, b"\x54\x6f\x78\x20\x6a\x75\x6d\x70"), - (RX, b"\x55\x73\x20\x6f\x76\x65\x72\x20"), - (RX, b"\x56\x74\x68\x65\x20\x6c\x61\x7a"), - (RX, b"\x57\x79\x20\x64\x6f\x67\x0a\x74"), - (RX, b"\x58\x68\x65\x20\x63\x72\x61\x7a"), - (RX, b"\x59\x79\x20\x66\x6f\x78\x20\x6a"), - (RX, b"\x5a\x75\x6d\x70\x73\x20\x6f\x76"), - (RX, b"\x5b\x65\x72\x20\x74\x68\x65\x20"), - (RX, b"\x5c\x6c\x61\x7a\x79\x20\x64\x6f"), - (RX, b"\x5d\x67\x0a\x74\x68\x65\x20\x63"), - (RX, b"\x5e\x72\x61\x7a\x79\x20\x66\x6f"), - (RX, b"\x5f\x78\x20\x6a\x75\x6d\x70\x73"), - (RX, b"\x60\x20\x6f\x76\x65\x72\x20\x74"), - (RX, b"\x61\x68\x65\x20\x6c\x61\x7a\x79"), - (RX, b"\x62\x20\x64\x6f\x67\x0a\x74\x68"), - (RX, b"\x63\x65\x20\x63\x72\x61\x7a\x79"), - (RX, b"\x64\x20\x66\x6f\x78\x20\x6a\x75"), - (RX, b"\x65\x6d\x70\x73\x20\x6f\x76\x65"), - (RX, b"\x66\x72\x20\x74\x68\x65\x20\x6c"), - (RX, b"\x67\x61\x7a\x79\x20\x64\x6f\x67"), - (RX, b"\x68\x0a\x74\x68\x65\x20\x63\x72"), - (RX, b"\x69\x61\x7a\x79\x20\x66\x6f\x78"), - (RX, b"\x6a\x20\x6a\x75\x6d\x70\x73\x20"), - (RX, b"\x6b\x6f\x76\x65\x72\x20\x74\x68"), - (RX, b"\x6c\x65\x20\x6c\x61\x7a\x79\x20"), - (RX, b"\x6d\x64\x6f\x67\x0a\x74\x68\x65"), - (RX, b"\x6e\x20\x63\x72\x61\x7a\x79\x20"), - (RX, b"\x6f\x66\x6f\x78\x20\x6a\x75\x6d"), - (RX, b"\x70\x70\x73\x20\x6f\x76\x65\x72"), - (RX, b"\x71\x20\x74\x68\x65\x20\x6c\x61"), - (RX, b"\x72\x7a\x79\x20\x64\x6f\x67\x0a"), - (RX, b"\x73\x74\x68\x65\x20\x63\x72\x61"), - (RX, b"\x74\x7a\x79\x20\x66\x6f\x78\x20"), - (RX, b"\x75\x6a\x75\x6d\x70\x73\x20\x6f"), - (RX, b"\x76\x76\x65\x72\x20\x74\x68\x65"), - (RX, b"\x77\x20\x6c\x61\x7a\x79\x20\x64"), - (RX, b"\x78\x6f\x67\x0a\x74\x68\x65\x20"), - (RX, b"\x79\x63\x72\x61\x7a\x79\x20\x66"), - (RX, b"\x7a\x6f\x78\x20\x6a\x75\x6d\x70"), - (RX, b"\x7b\x73\x20\x6f\x76\x65\x72\x20"), - (RX, b"\x7c\x74\x68\x65\x20\x6c\x61\x7a"), - (RX, b"\x7d\x79\x20\x64\x6f\x67\x0a\x74"), - (RX, b"\x7e\x68\x65\x20\x63\x72\x61\x7a"), - (RX, b"\x7f\x79\x20\x66\x6f\x78\x20\x6a"), # --> Last element of block - (TX, b"\xa2\x32\x7f\x00\x00\x00\x00\x00"), # --> Last good seqno (x32) - (RX, b"\x01\x79\x20\x66\x6f\x78\x20\x6a"), # --> Server starts resending from last acknowledged block - (RX, b"\x02\x75\x6d\x70\x73\x20\x6f\x76"), - (RX, b"\x03\x65\x72\x20\x74\x68\x65\x20"), - (RX, b"\x04\x6c\x61\x7a\x79\x20\x64\x6f"), - (RX, b"\x05\x67\x0a\x74\x68\x65\x20\x63"), - (RX, b"\x06\x72\x61\x7a\x79\x20\x66\x6f"), - (RX, b"\x07\x78\x20\x6a\x75\x6d\x70\x73"), - (RX, b"\x08\x20\x6f\x76\x65\x72\x20\x74"), - (RX, b"\x09\x68\x65\x20\x6c\x61\x7a\x79"), - (RX, b"\x0a\x20\x64\x6f\x67\x0a\x74\x68"), - (RX, b"\x0b\x65\x20\x63\x72\x61\x7a\x79"), - (RX, b"\x0c\x20\x66\x6f\x78\x20\x6a\x75"), - (RX, b"\x0d\x6d\x70\x73\x20\x6f\x76\x65"), - (RX, b"\x0e\x72\x20\x74\x68\x65\x20\x6c"), - (RX, b"\x0f\x61\x7a\x79\x20\x64\x6f\x67"), - (RX, b"\x10\x0a\x74\x68\x65\x20\x63\x72"), - (RX, b"\x11\x61\x7a\x79\x20\x66\x6f\x78"), - (RX, b"\x12\x20\x6a\x75\x6d\x70\x73\x20"), - (RX, b"\x13\x6f\x76\x65\x72\x20\x74\x68"), - (RX, b"\x14\x65\x20\x6c\x61\x7a\x79\x20"), - (RX, b"\x15\x64\x6f\x67\x0a\x74\x68\x65"), - (RX, b"\x16\x20\x63\x72\x61\x7a\x79\x20"), - (RX, b"\x17\x66\x6f\x78\x20\x6a\x75\x6d"), - (RX, b"\x18\x70\x73\x20\x6f\x76\x65\x72"), - (RX, b"\x19\x20\x74\x68\x65\x20\x6c\x61"), - (RX, b"\x1a\x7a\x79\x20\x64\x6f\x67\x0a"), - (RX, b"\x1b\x74\x68\x65\x20\x63\x72\x61"), - (RX, b"\x1c\x7a\x79\x20\x66\x6f\x78\x20"), - (RX, b"\x1d\x6a\x75\x6d\x70\x73\x20\x6f"), - (RX, b"\x1e\x76\x65\x72\x20\x74\x68\x65"), - (RX, b"\x1f\x20\x6c\x61\x7a\x79\x20\x64"), - (RX, b"\x20\x6f\x67\x0a\x74\x68\x65\x20"), - (RX, b"\x21\x63\x72\x61\x7a\x79\x20\x66"), - (RX, b"\x22\x6f\x78\x20\x6a\x75\x6d\x70"), - (RX, b"\x23\x73\x20\x6f\x76\x65\x72\x20"), - (RX, b"\x24\x74\x68\x65\x20\x6c\x61\x7a"), - (RX, b"\x25\x79\x20\x64\x6f\x67\x0a\x74"), - (RX, b"\x26\x68\x65\x20\x63\x72\x61\x7a"), - (RX, b"\x27\x79\x20\x66\x6f\x78\x20\x6a"), - (RX, b"\x28\x75\x6d\x70\x73\x20\x6f\x76"), - (RX, b"\x29\x65\x72\x20\x74\x68\x65\x20"), - (RX, b"\x2a\x6c\x61\x7a\x79\x20\x64\x6f"), - (RX, b"\x2b\x67\x0a\x74\x68\x65\x20\x63"), - (RX, b"\x2c\x72\x61\x7a\x79\x20\x66\x6f"), - (RX, b"\x2d\x78\x20\x6a\x75\x6d\x70\x73"), - (RX, b"\x2e\x20\x6f\x76\x65\x72\x20\x74"), - (RX, b"\x2f\x68\x65\x20\x6c\x61\x7a\x79"), - (RX, b"\x30\x20\x64\x6f\x67\x0a\x74\x68"), - (RX, b"\x31\x65\x20\x63\x72\x61\x7a\x79"), - (RX, b"\x32\x20\x66\x6f\x78\x20\x6a\x75"), - (RX, b"\x33\x6d\x70\x73\x20\x6f\x76\x65"), - (RX, b"\x34\x72\x20\x74\x68\x65\x20\x6c"), - (RX, b"\x35\x61\x7a\x79\x20\x64\x6f\x67"), - (RX, b"\x36\x0a\x74\x68\x65\x20\x63\x72"), - (RX, b"\x37\x61\x7a\x79\x20\x66\x6f\x78"), - (RX, b"\x38\x20\x6a\x75\x6d\x70\x73\x20"), - (RX, b"\x39\x6f\x76\x65\x72\x20\x74\x68"), - (RX, b"\x3a\x65\x20\x6c\x61\x7a\x79\x20"), - (RX, b"\x3b\x64\x6f\x67\x0a\x74\x68\x65"), - (RX, b"\x3c\x20\x63\x72\x61\x7a\x79\x20"), - (RX, b"\x3d\x66\x6f\x78\x20\x6a\x75\x6d"), - (RX, b"\x3e\x70\x73\x20\x6f\x76\x65\x72"), - (RX, b"\x3f\x20\x74\x68\x65\x20\x6c\x61"), - (RX, b"\x40\x7a\x79\x20\x64\x6f\x67\x0a"), - (RX, b"\x41\x74\x68\x65\x20\x63\x72\x61"), - (RX, b"\x42\x7a\x79\x20\x66\x6f\x78\x20"), - (RX, b"\x43\x6a\x75\x6d\x70\x73\x20\x6f"), - (RX, b"\x44\x76\x65\x72\x20\x74\x68\x65"), - (RX, b"\x45\x20\x6c\x61\x7a\x79\x20\x64"), - (RX, b"\x46\x6f\x67\x0a\x74\x68\x65\x20"), - (RX, b"\x47\x63\x72\x61\x7a\x79\x20\x66"), - (RX, b"\x48\x6f\x78\x20\x6a\x75\x6d\x70"), - (RX, b"\x49\x73\x20\x6f\x76\x65\x72\x20"), - (RX, b"\x4a\x74\x68\x65\x20\x6c\x61\x7a"), - (RX, b"\x4b\x79\x20\x64\x6f\x67\x0a\x74"), - (RX, b"\x4c\x68\x65\x20\x63\x72\x61\x7a"), - (RX, b"\x4d\x79\x20\x66\x6f\x78\x20\x6a"), - (RX, b"\x4e\x75\x6d\x70\x73\x20\x6f\x76"), - (RX, b"\x4f\x65\x72\x20\x74\x68\x65\x20"), - (RX, b"\x50\x6c\x61\x7a\x79\x20\x64\x6f"), - (RX, b"\x51\x67\x0a\x74\x68\x65\x20\x63"), - (RX, b"\x52\x72\x61\x7a\x79\x20\x66\x6f"), - (RX, b"\x53\x78\x20\x6a\x75\x6d\x70\x73"), - (RX, b"\x54\x20\x6f\x76\x65\x72\x20\x74"), - (RX, b"\x55\x68\x65\x20\x6c\x61\x7a\x79"), - (RX, b"\x56\x20\x64\x6f\x67\x0a\x74\x68"), - (RX, b"\x57\x65\x20\x63\x72\x61\x7a\x79"), - (RX, b"\x58\x20\x66\x6f\x78\x20\x6a\x75"), - (RX, b"\x59\x6d\x70\x73\x20\x6f\x76\x65"), - (RX, b"\x5a\x72\x20\x74\x68\x65\x20\x6c"), - (RX, b"\x5b\x61\x7a\x79\x20\x64\x6f\x67"), - (RX, b"\x5c\x0a\x74\x68\x65\x20\x63\x72"), - (RX, b"\x5d\x61\x7a\x79\x20\x66\x6f\x78"), - (RX, b"\x5e\x20\x6a\x75\x6d\x70\x73\x20"), - (RX, b"\x5f\x6f\x76\x65\x72\x20\x74\x68"), - (RX, b"\x60\x65\x20\x6c\x61\x7a\x79\x20"), - (RX, b"\x61\x64\x6f\x67\x0a\x74\x68\x65"), - (RX, b"\x62\x20\x63\x72\x61\x7a\x79\x20"), - (RX, b"\x63\x66\x6f\x78\x20\x6a\x75\x6d"), - (RX, b"\x64\x70\x73\x20\x6f\x76\x65\x72"), - (RX, b"\x65\x20\x74\x68\x65\x20\x6c\x61"), - (RX, b"\x66\x7a\x79\x20\x64\x6f\x67\x0a"), - (RX, b"\x67\x74\x68\x65\x20\x63\x72\x61"), - (RX, b"\x68\x7a\x79\x20\x66\x6f\x78\x20"), - (RX, b"\x69\x6a\x75\x6d\x70\x73\x20\x6f"), - (RX, b"\x6a\x76\x65\x72\x20\x74\x68\x65"), - (RX, b"\x6b\x20\x6c\x61\x7a\x79\x20\x64"), - (RX, b"\x6c\x6f\x67\x0a\x74\x68\x65\x20"), - (RX, b"\x6d\x63\x72\x61\x7a\x79\x20\x66"), - (RX, b"\x6e\x6f\x78\x20\x6a\x75\x6d\x70"), - (RX, b"\x6f\x73\x20\x6f\x76\x65\x72\x20"), - (RX, b"\x70\x74\x68\x65\x20\x6c\x61\x7a"), - (RX, b"\x71\x79\x20\x64\x6f\x67\x0a\x74"), - (RX, b"\x72\x68\x65\x20\x63\x72\x61\x7a"), - (RX, b"\x73\x79\x20\x66\x6f\x78\x20\x6a"), - (RX, b"\x74\x75\x6d\x70\x73\x20\x6f\x76"), - (RX, b"\x75\x65\x72\x20\x74\x68\x65\x20"), - (RX, b"\x76\x6c\x61\x7a\x79\x20\x64\x6f"), - (RX, b"\x77\x67\x0a\x74\x68\x65\x20\x63"), - (RX, b"\x78\x72\x61\x7a\x79\x20\x66\x6f"), - (RX, b"\x79\x78\x20\x6a\x75\x6d\x70\x73"), - (RX, b"\x7a\x20\x6f\x76\x65\x72\x20\x74"), - (RX, b"\x7b\x68\x65\x20\x6c\x61\x7a\x79"), - (RX, b"\x7c\x20\x64\x6f\x67\x0a\x74\x68"), - (RX, b"\x7d\x65\x20\x63\x72\x61\x7a\x79"), - (RX, b"\x7e\x20\x66\x6f\x78\x20\x6a\x75"), - (RX, b"\x7f\x6d\x70\x73\x20\x6f\x76\x65"), - (TX, b"\xa2\x7f\x7f\x00\x00\x00\x00\x00"), # --> This block is acknlowedged without issues - (RX, b"\x01\x72\x20\x74\x68\x65\x20\x6c"), - (RX, b"\x02\x61\x7a\x79\x20\x64\x6f\x67"), - (RX, b"\x03\x0a\x74\x68\x65\x20\x63\x72"), - (RX, b"\x04\x61\x7a\x79\x20\x66\x6f\x78"), - (RX, b"\x05\x20\x6a\x75\x6d\x70\x73\x20"), - (RX, b"\x06\x6f\x76\x65\x72\x20\x74\x68"), - (RX, b"\x07\x65\x20\x6c\x61\x7a\x79\x20"), - (RX, b"\x08\x64\x6f\x67\x0a\x74\x68\x65"), - (RX, b"\x09\x20\x63\x72\x61\x7a\x79\x20"), - (RX, b"\x0a\x66\x6f\x78\x20\x6a\x75\x6d"), - (RX, b"\x0b\x70\x73\x20\x6f\x76\x65\x72"), - (RX, b"\x0c\x20\x74\x68\x65\x20\x6c\x61"), - (RX, b"\x0d\x7a\x79\x20\x64\x6f\x67\x0a"), - (RX, b"\x0e\x74\x68\x65\x20\x63\x72\x61"), - (RX, b"\x0f\x7a\x79\x20\x66\x6f\x78\x20"), - (RX, b"\x10\x6a\x75\x6d\x70\x73\x20\x6f"), - (RX, b"\x11\x76\x65\x72\x20\x74\x68\x65"), - (RX, b"\x12\x20\x6c\x61\x7a\x79\x20\x64"), - (RX, b"\x13\x6f\x67\x0a\x74\x68\x65\x20"), - (RX, b"\x14\x63\x72\x61\x7a\x79\x20\x66"), - (RX, b"\x15\x6f\x78\x20\x6a\x75\x6d\x70"), - (RX, b"\x16\x73\x20\x6f\x76\x65\x72\x20"), - (RX, b"\x17\x74\x68\x65\x20\x6c\x61\x7a"), - (RX, b"\x18\x79\x20\x64\x6f\x67\x0a\x74"), - (RX, b"\x19\x68\x65\x20\x63\x72\x61\x7a"), - (RX, b"\x1a\x79\x20\x66\x6f\x78\x20\x6a"), - (RX, b"\x1b\x75\x6d\x70\x73\x20\x6f\x76"), - (RX, b"\x1c\x65\x72\x20\x74\x68\x65\x20"), - (RX, b"\x1d\x6c\x61\x7a\x79\x20\x64\x6f"), - (RX, b"\x1e\x67\x0a\x74\x68\x65\x20\x63"), - (RX, b"\x1f\x72\x61\x7a\x79\x20\x66\x6f"), - (RX, b"\x20\x78\x20\x6a\x75\x6d\x70\x73"), - (RX, b"\x21\x20\x6f\x76\x65\x72\x20\x74"), - (RX, b"\x22\x68\x65\x20\x6c\x61\x7a\x79"), - (RX, b"\xa3\x20\x64\x6f\x67\x0a\x00\x00"), - (TX, b"\xa2\x23\x7f\x00\x00\x00\x00\x00"), - (RX, b"\xc9\x3b\x49\x00\x00\x00\x00\x00"), - (TX, b"\xa1\x00\x00\x00\x00\x00\x00\x00"), # --> Transfer ends without issues + (TX, b'\xa4\x08\x10\x00\x7f\x00\x00\x00'), + (RX, b'\xc4\x08\x10\x00\x00\x00\x00\x00'), + (TX, b'\xa3\x00\x00\x00\x00\x00\x00\x00'), + (RX, b'\x01\x74\x68\x65\x20\x63\x72\x61'), + (RX, b'\x02\x7a\x79\x20\x66\x6f\x78\x20'), + (RX, b'\x03\x6a\x75\x6d\x70\x73\x20\x6f'), + (RX, b'\x04\x76\x65\x72\x20\x74\x68\x65'), + (RX, b'\x05\x20\x6c\x61\x7a\x79\x20\x64'), + (RX, b'\x06\x6f\x67\x0a\x74\x68\x65\x20'), + (RX, b'\x07\x63\x72\x61\x7a\x79\x20\x66'), + (RX, b'\x08\x6f\x78\x20\x6a\x75\x6d\x70'), + (RX, b'\x09\x73\x20\x6f\x76\x65\x72\x20'), + (RX, b'\x0a\x74\x68\x65\x20\x6c\x61\x7a'), + (RX, b'\x0b\x79\x20\x64\x6f\x67\x0a\x74'), + (RX, b'\x0c\x68\x65\x20\x63\x72\x61\x7a'), + (RX, b'\x0d\x79\x20\x66\x6f\x78\x20\x6a'), + (RX, b'\x0e\x75\x6d\x70\x73\x20\x6f\x76'), + (RX, b'\x0f\x65\x72\x20\x74\x68\x65\x20'), + (RX, b'\x10\x6c\x61\x7a\x79\x20\x64\x6f'), + (RX, b'\x11\x67\x0a\x74\x68\x65\x20\x63'), + (RX, b'\x12\x72\x61\x7a\x79\x20\x66\x6f'), + (RX, b'\x13\x78\x20\x6a\x75\x6d\x70\x73'), + (RX, b'\x14\x20\x6f\x76\x65\x72\x20\x74'), + (RX, b'\x15\x68\x65\x20\x6c\x61\x7a\x79'), + (RX, b'\x16\x20\x64\x6f\x67\x0a\x74\x68'), + (RX, b'\x17\x65\x20\x63\x72\x61\x7a\x79'), + (RX, b'\x18\x20\x66\x6f\x78\x20\x6a\x75'), + (RX, b'\x19\x6d\x70\x73\x20\x6f\x76\x65'), + (RX, b'\x1a\x72\x20\x74\x68\x65\x20\x6c'), + (RX, b'\x1b\x61\x7a\x79\x20\x64\x6f\x67'), + (RX, b'\x1c\x0a\x74\x68\x65\x20\x63\x72'), + (RX, b'\x1d\x61\x7a\x79\x20\x66\x6f\x78'), + (RX, b'\x1e\x20\x6a\x75\x6d\x70\x73\x20'), + (RX, b'\x1f\x6f\x76\x65\x72\x20\x74\x68'), + (RX, b'\x20\x65\x20\x6c\x61\x7a\x79\x20'), + (RX, b'\x21\x64\x6f\x67\x0a\x74\x68\x65'), + (RX, b'\x22\x20\x63\x72\x61\x7a\x79\x20'), + (RX, b'\x23\x66\x6f\x78\x20\x6a\x75\x6d'), + (RX, b'\x24\x70\x73\x20\x6f\x76\x65\x72'), + (RX, b'\x25\x20\x74\x68\x65\x20\x6c\x61'), + (RX, b'\x26\x7a\x79\x20\x64\x6f\x67\x0a'), + (RX, b'\x27\x74\x68\x65\x20\x63\x72\x61'), + (RX, b'\x28\x7a\x79\x20\x66\x6f\x78\x20'), + (RX, b'\x29\x6a\x75\x6d\x70\x73\x20\x6f'), + (RX, b'\x2a\x76\x65\x72\x20\x74\x68\x65'), + (RX, b'\x2b\x20\x6c\x61\x7a\x79\x20\x64'), + (RX, b'\x2c\x6f\x67\x0a\x74\x68\x65\x20'), + (RX, b'\x2d\x63\x72\x61\x7a\x79\x20\x66'), + (RX, b'\x2e\x6f\x78\x20\x6a\x75\x6d\x70'), + (RX, b'\x2f\x73\x20\x6f\x76\x65\x72\x20'), + (RX, b'\x30\x74\x68\x65\x20\x6c\x61\x7a'), + (RX, b'\x31\x79\x20\x64\x6f\x67\x0a\x74'), + (RX, b'\x32\x68\x65\x20\x63\x72\x61\x7a'), + (RX, b'\x34\x79\x20\x66\x6f\x78\x20\x6a'), + (RX, b'\x34\x75\x6d\x70\x73\x20\x6f\x76'), # --> Wrong seqno (x34 instead of x33) + (RX, b'\x35\x65\x72\x20\x74\x68\x65\x20'), # All the following frames until end of block + (RX, b'\x36\x6c\x61\x7a\x79\x20\x64\x6f'), # will be ignored by the client and should be + (RX, b'\x37\x67\x0a\x74\x68\x65\x20\x63'), # resent by server. + (RX, b'\x38\x72\x61\x7a\x79\x20\x66\x6f'), + (RX, b'\x39\x78\x20\x6a\x75\x6d\x70\x73'), + (RX, b'\x3a\x20\x6f\x76\x65\x72\x20\x74'), + (RX, b'\x3b\x68\x65\x20\x6c\x61\x7a\x79'), + (RX, b'\x3c\x20\x64\x6f\x67\x0a\x74\x68'), + (RX, b'\x3d\x65\x20\x63\x72\x61\x7a\x79'), + (RX, b'\x3e\x20\x66\x6f\x78\x20\x6a\x75'), + (RX, b'\x3f\x6d\x70\x73\x20\x6f\x76\x65'), + (RX, b'\x40\x72\x20\x74\x68\x65\x20\x6c'), + (RX, b'\x41\x61\x7a\x79\x20\x64\x6f\x67'), + (RX, b'\x42\x0a\x74\x68\x65\x20\x63\x72'), + (RX, b'\x43\x61\x7a\x79\x20\x66\x6f\x78'), + (RX, b'\x44\x20\x6a\x75\x6d\x70\x73\x20'), + (RX, b'\x45\x6f\x76\x65\x72\x20\x74\x68'), + (RX, b'\x46\x65\x20\x6c\x61\x7a\x79\x20'), + (RX, b'\x47\x64\x6f\x67\x0a\x74\x68\x65'), + (RX, b'\x48\x20\x63\x72\x61\x7a\x79\x20'), + (RX, b'\x49\x66\x6f\x78\x20\x6a\x75\x6d'), + (RX, b'\x4a\x70\x73\x20\x6f\x76\x65\x72'), + (RX, b'\x4b\x20\x74\x68\x65\x20\x6c\x61'), + (RX, b'\x4c\x7a\x79\x20\x64\x6f\x67\x0a'), + (RX, b'\x4d\x74\x68\x65\x20\x63\x72\x61'), + (RX, b'\x4e\x7a\x79\x20\x66\x6f\x78\x20'), + (RX, b'\x4f\x6a\x75\x6d\x70\x73\x20\x6f'), + (RX, b'\x50\x76\x65\x72\x20\x74\x68\x65'), + (RX, b'\x51\x20\x6c\x61\x7a\x79\x20\x64'), + (RX, b'\x52\x6f\x67\x0a\x74\x68\x65\x20'), + (RX, b'\x53\x63\x72\x61\x7a\x79\x20\x66'), + (RX, b'\x54\x6f\x78\x20\x6a\x75\x6d\x70'), + (RX, b'\x55\x73\x20\x6f\x76\x65\x72\x20'), + (RX, b'\x56\x74\x68\x65\x20\x6c\x61\x7a'), + (RX, b'\x57\x79\x20\x64\x6f\x67\x0a\x74'), + (RX, b'\x58\x68\x65\x20\x63\x72\x61\x7a'), + (RX, b'\x59\x79\x20\x66\x6f\x78\x20\x6a'), + (RX, b'\x5a\x75\x6d\x70\x73\x20\x6f\x76'), + (RX, b'\x5b\x65\x72\x20\x74\x68\x65\x20'), + (RX, b'\x5c\x6c\x61\x7a\x79\x20\x64\x6f'), + (RX, b'\x5d\x67\x0a\x74\x68\x65\x20\x63'), + (RX, b'\x5e\x72\x61\x7a\x79\x20\x66\x6f'), + (RX, b'\x5f\x78\x20\x6a\x75\x6d\x70\x73'), + (RX, b'\x60\x20\x6f\x76\x65\x72\x20\x74'), + (RX, b'\x61\x68\x65\x20\x6c\x61\x7a\x79'), + (RX, b'\x62\x20\x64\x6f\x67\x0a\x74\x68'), + (RX, b'\x63\x65\x20\x63\x72\x61\x7a\x79'), + (RX, b'\x64\x20\x66\x6f\x78\x20\x6a\x75'), + (RX, b'\x65\x6d\x70\x73\x20\x6f\x76\x65'), + (RX, b'\x66\x72\x20\x74\x68\x65\x20\x6c'), + (RX, b'\x67\x61\x7a\x79\x20\x64\x6f\x67'), + (RX, b'\x68\x0a\x74\x68\x65\x20\x63\x72'), + (RX, b'\x69\x61\x7a\x79\x20\x66\x6f\x78'), + (RX, b'\x6a\x20\x6a\x75\x6d\x70\x73\x20'), + (RX, b'\x6b\x6f\x76\x65\x72\x20\x74\x68'), + (RX, b'\x6c\x65\x20\x6c\x61\x7a\x79\x20'), + (RX, b'\x6d\x64\x6f\x67\x0a\x74\x68\x65'), + (RX, b'\x6e\x20\x63\x72\x61\x7a\x79\x20'), + (RX, b'\x6f\x66\x6f\x78\x20\x6a\x75\x6d'), + (RX, b'\x70\x70\x73\x20\x6f\x76\x65\x72'), + (RX, b'\x71\x20\x74\x68\x65\x20\x6c\x61'), + (RX, b'\x72\x7a\x79\x20\x64\x6f\x67\x0a'), + (RX, b'\x73\x74\x68\x65\x20\x63\x72\x61'), + (RX, b'\x74\x7a\x79\x20\x66\x6f\x78\x20'), + (RX, b'\x75\x6a\x75\x6d\x70\x73\x20\x6f'), + (RX, b'\x76\x76\x65\x72\x20\x74\x68\x65'), + (RX, b'\x77\x20\x6c\x61\x7a\x79\x20\x64'), + (RX, b'\x78\x6f\x67\x0a\x74\x68\x65\x20'), + (RX, b'\x79\x63\x72\x61\x7a\x79\x20\x66'), + (RX, b'\x7a\x6f\x78\x20\x6a\x75\x6d\x70'), + (RX, b'\x7b\x73\x20\x6f\x76\x65\x72\x20'), + (RX, b'\x7c\x74\x68\x65\x20\x6c\x61\x7a'), + (RX, b'\x7d\x79\x20\x64\x6f\x67\x0a\x74'), + (RX, b'\x7e\x68\x65\x20\x63\x72\x61\x7a'), + (RX, b'\x7f\x79\x20\x66\x6f\x78\x20\x6a'), # --> Last element of block + (TX, b'\xa2\x32\x7f\x00\x00\x00\x00\x00'), # --> Last good seqno (x32) + (RX, b'\x01\x79\x20\x66\x6f\x78\x20\x6a'), # --> Server starts resending from last acknowledged block + (RX, b'\x02\x75\x6d\x70\x73\x20\x6f\x76'), + (RX, b'\x03\x65\x72\x20\x74\x68\x65\x20'), + (RX, b'\x04\x6c\x61\x7a\x79\x20\x64\x6f'), + (RX, b'\x05\x67\x0a\x74\x68\x65\x20\x63'), + (RX, b'\x06\x72\x61\x7a\x79\x20\x66\x6f'), + (RX, b'\x07\x78\x20\x6a\x75\x6d\x70\x73'), + (RX, b'\x08\x20\x6f\x76\x65\x72\x20\x74'), + (RX, b'\x09\x68\x65\x20\x6c\x61\x7a\x79'), + (RX, b'\x0a\x20\x64\x6f\x67\x0a\x74\x68'), + (RX, b'\x0b\x65\x20\x63\x72\x61\x7a\x79'), + (RX, b'\x0c\x20\x66\x6f\x78\x20\x6a\x75'), + (RX, b'\x0d\x6d\x70\x73\x20\x6f\x76\x65'), + (RX, b'\x0e\x72\x20\x74\x68\x65\x20\x6c'), + (RX, b'\x0f\x61\x7a\x79\x20\x64\x6f\x67'), + (RX, b'\x10\x0a\x74\x68\x65\x20\x63\x72'), + (RX, b'\x11\x61\x7a\x79\x20\x66\x6f\x78'), + (RX, b'\x12\x20\x6a\x75\x6d\x70\x73\x20'), + (RX, b'\x13\x6f\x76\x65\x72\x20\x74\x68'), + (RX, b'\x14\x65\x20\x6c\x61\x7a\x79\x20'), + (RX, b'\x15\x64\x6f\x67\x0a\x74\x68\x65'), + (RX, b'\x16\x20\x63\x72\x61\x7a\x79\x20'), + (RX, b'\x17\x66\x6f\x78\x20\x6a\x75\x6d'), + (RX, b'\x18\x70\x73\x20\x6f\x76\x65\x72'), + (RX, b'\x19\x20\x74\x68\x65\x20\x6c\x61'), + (RX, b'\x1a\x7a\x79\x20\x64\x6f\x67\x0a'), + (RX, b'\x1b\x74\x68\x65\x20\x63\x72\x61'), + (RX, b'\x1c\x7a\x79\x20\x66\x6f\x78\x20'), + (RX, b'\x1d\x6a\x75\x6d\x70\x73\x20\x6f'), + (RX, b'\x1e\x76\x65\x72\x20\x74\x68\x65'), + (RX, b'\x1f\x20\x6c\x61\x7a\x79\x20\x64'), + (RX, b'\x20\x6f\x67\x0a\x74\x68\x65\x20'), + (RX, b'\x21\x63\x72\x61\x7a\x79\x20\x66'), + (RX, b'\x22\x6f\x78\x20\x6a\x75\x6d\x70'), + (RX, b'\x23\x73\x20\x6f\x76\x65\x72\x20'), + (RX, b'\x24\x74\x68\x65\x20\x6c\x61\x7a'), + (RX, b'\x25\x79\x20\x64\x6f\x67\x0a\x74'), + (RX, b'\x26\x68\x65\x20\x63\x72\x61\x7a'), + (RX, b'\x27\x79\x20\x66\x6f\x78\x20\x6a'), + (RX, b'\x28\x75\x6d\x70\x73\x20\x6f\x76'), + (RX, b'\x29\x65\x72\x20\x74\x68\x65\x20'), + (RX, b'\x2a\x6c\x61\x7a\x79\x20\x64\x6f'), + (RX, b'\x2b\x67\x0a\x74\x68\x65\x20\x63'), + (RX, b'\x2c\x72\x61\x7a\x79\x20\x66\x6f'), + (RX, b'\x2d\x78\x20\x6a\x75\x6d\x70\x73'), + (RX, b'\x2e\x20\x6f\x76\x65\x72\x20\x74'), + (RX, b'\x2f\x68\x65\x20\x6c\x61\x7a\x79'), + (RX, b'\x30\x20\x64\x6f\x67\x0a\x74\x68'), + (RX, b'\x31\x65\x20\x63\x72\x61\x7a\x79'), + (RX, b'\x32\x20\x66\x6f\x78\x20\x6a\x75'), + (RX, b'\x33\x6d\x70\x73\x20\x6f\x76\x65'), + (RX, b'\x34\x72\x20\x74\x68\x65\x20\x6c'), + (RX, b'\x35\x61\x7a\x79\x20\x64\x6f\x67'), + (RX, b'\x36\x0a\x74\x68\x65\x20\x63\x72'), + (RX, b'\x37\x61\x7a\x79\x20\x66\x6f\x78'), + (RX, b'\x38\x20\x6a\x75\x6d\x70\x73\x20'), + (RX, b'\x39\x6f\x76\x65\x72\x20\x74\x68'), + (RX, b'\x3a\x65\x20\x6c\x61\x7a\x79\x20'), + (RX, b'\x3b\x64\x6f\x67\x0a\x74\x68\x65'), + (RX, b'\x3c\x20\x63\x72\x61\x7a\x79\x20'), + (RX, b'\x3d\x66\x6f\x78\x20\x6a\x75\x6d'), + (RX, b'\x3e\x70\x73\x20\x6f\x76\x65\x72'), + (RX, b'\x3f\x20\x74\x68\x65\x20\x6c\x61'), + (RX, b'\x40\x7a\x79\x20\x64\x6f\x67\x0a'), + (RX, b'\x41\x74\x68\x65\x20\x63\x72\x61'), + (RX, b'\x42\x7a\x79\x20\x66\x6f\x78\x20'), + (RX, b'\x43\x6a\x75\x6d\x70\x73\x20\x6f'), + (RX, b'\x44\x76\x65\x72\x20\x74\x68\x65'), + (RX, b'\x45\x20\x6c\x61\x7a\x79\x20\x64'), + (RX, b'\x46\x6f\x67\x0a\x74\x68\x65\x20'), + (RX, b'\x47\x63\x72\x61\x7a\x79\x20\x66'), + (RX, b'\x48\x6f\x78\x20\x6a\x75\x6d\x70'), + (RX, b'\x49\x73\x20\x6f\x76\x65\x72\x20'), + (RX, b'\x4a\x74\x68\x65\x20\x6c\x61\x7a'), + (RX, b'\x4b\x79\x20\x64\x6f\x67\x0a\x74'), + (RX, b'\x4c\x68\x65\x20\x63\x72\x61\x7a'), + (RX, b'\x4d\x79\x20\x66\x6f\x78\x20\x6a'), + (RX, b'\x4e\x75\x6d\x70\x73\x20\x6f\x76'), + (RX, b'\x4f\x65\x72\x20\x74\x68\x65\x20'), + (RX, b'\x50\x6c\x61\x7a\x79\x20\x64\x6f'), + (RX, b'\x51\x67\x0a\x74\x68\x65\x20\x63'), + (RX, b'\x52\x72\x61\x7a\x79\x20\x66\x6f'), + (RX, b'\x53\x78\x20\x6a\x75\x6d\x70\x73'), + (RX, b'\x54\x20\x6f\x76\x65\x72\x20\x74'), + (RX, b'\x55\x68\x65\x20\x6c\x61\x7a\x79'), + (RX, b'\x56\x20\x64\x6f\x67\x0a\x74\x68'), + (RX, b'\x57\x65\x20\x63\x72\x61\x7a\x79'), + (RX, b'\x58\x20\x66\x6f\x78\x20\x6a\x75'), + (RX, b'\x59\x6d\x70\x73\x20\x6f\x76\x65'), + (RX, b'\x5a\x72\x20\x74\x68\x65\x20\x6c'), + (RX, b'\x5b\x61\x7a\x79\x20\x64\x6f\x67'), + (RX, b'\x5c\x0a\x74\x68\x65\x20\x63\x72'), + (RX, b'\x5d\x61\x7a\x79\x20\x66\x6f\x78'), + (RX, b'\x5e\x20\x6a\x75\x6d\x70\x73\x20'), + (RX, b'\x5f\x6f\x76\x65\x72\x20\x74\x68'), + (RX, b'\x60\x65\x20\x6c\x61\x7a\x79\x20'), + (RX, b'\x61\x64\x6f\x67\x0a\x74\x68\x65'), + (RX, b'\x62\x20\x63\x72\x61\x7a\x79\x20'), + (RX, b'\x63\x66\x6f\x78\x20\x6a\x75\x6d'), + (RX, b'\x64\x70\x73\x20\x6f\x76\x65\x72'), + (RX, b'\x65\x20\x74\x68\x65\x20\x6c\x61'), + (RX, b'\x66\x7a\x79\x20\x64\x6f\x67\x0a'), + (RX, b'\x67\x74\x68\x65\x20\x63\x72\x61'), + (RX, b'\x68\x7a\x79\x20\x66\x6f\x78\x20'), + (RX, b'\x69\x6a\x75\x6d\x70\x73\x20\x6f'), + (RX, b'\x6a\x76\x65\x72\x20\x74\x68\x65'), + (RX, b'\x6b\x20\x6c\x61\x7a\x79\x20\x64'), + (RX, b'\x6c\x6f\x67\x0a\x74\x68\x65\x20'), + (RX, b'\x6d\x63\x72\x61\x7a\x79\x20\x66'), + (RX, b'\x6e\x6f\x78\x20\x6a\x75\x6d\x70'), + (RX, b'\x6f\x73\x20\x6f\x76\x65\x72\x20'), + (RX, b'\x70\x74\x68\x65\x20\x6c\x61\x7a'), + (RX, b'\x71\x79\x20\x64\x6f\x67\x0a\x74'), + (RX, b'\x72\x68\x65\x20\x63\x72\x61\x7a'), + (RX, b'\x73\x79\x20\x66\x6f\x78\x20\x6a'), + (RX, b'\x74\x75\x6d\x70\x73\x20\x6f\x76'), + (RX, b'\x75\x65\x72\x20\x74\x68\x65\x20'), + (RX, b'\x76\x6c\x61\x7a\x79\x20\x64\x6f'), + (RX, b'\x77\x67\x0a\x74\x68\x65\x20\x63'), + (RX, b'\x78\x72\x61\x7a\x79\x20\x66\x6f'), + (RX, b'\x79\x78\x20\x6a\x75\x6d\x70\x73'), + (RX, b'\x7a\x20\x6f\x76\x65\x72\x20\x74'), + (RX, b'\x7b\x68\x65\x20\x6c\x61\x7a\x79'), + (RX, b'\x7c\x20\x64\x6f\x67\x0a\x74\x68'), + (RX, b'\x7d\x65\x20\x63\x72\x61\x7a\x79'), + (RX, b'\x7e\x20\x66\x6f\x78\x20\x6a\x75'), + (RX, b'\x7f\x6d\x70\x73\x20\x6f\x76\x65'), + (TX, b'\xa2\x7f\x7f\x00\x00\x00\x00\x00'), # --> This block is acknlowedged without issues + (RX, b'\x01\x72\x20\x74\x68\x65\x20\x6c'), + (RX, b'\x02\x61\x7a\x79\x20\x64\x6f\x67'), + (RX, b'\x03\x0a\x74\x68\x65\x20\x63\x72'), + (RX, b'\x04\x61\x7a\x79\x20\x66\x6f\x78'), + (RX, b'\x05\x20\x6a\x75\x6d\x70\x73\x20'), + (RX, b'\x06\x6f\x76\x65\x72\x20\x74\x68'), + (RX, b'\x07\x65\x20\x6c\x61\x7a\x79\x20'), + (RX, b'\x08\x64\x6f\x67\x0a\x74\x68\x65'), + (RX, b'\x09\x20\x63\x72\x61\x7a\x79\x20'), + (RX, b'\x0a\x66\x6f\x78\x20\x6a\x75\x6d'), + (RX, b'\x0b\x70\x73\x20\x6f\x76\x65\x72'), + (RX, b'\x0c\x20\x74\x68\x65\x20\x6c\x61'), + (RX, b'\x0d\x7a\x79\x20\x64\x6f\x67\x0a'), + (RX, b'\x0e\x74\x68\x65\x20\x63\x72\x61'), + (RX, b'\x0f\x7a\x79\x20\x66\x6f\x78\x20'), + (RX, b'\x10\x6a\x75\x6d\x70\x73\x20\x6f'), + (RX, b'\x11\x76\x65\x72\x20\x74\x68\x65'), + (RX, b'\x12\x20\x6c\x61\x7a\x79\x20\x64'), + (RX, b'\x13\x6f\x67\x0a\x74\x68\x65\x20'), + (RX, b'\x14\x63\x72\x61\x7a\x79\x20\x66'), + (RX, b'\x15\x6f\x78\x20\x6a\x75\x6d\x70'), + (RX, b'\x16\x73\x20\x6f\x76\x65\x72\x20'), + (RX, b'\x17\x74\x68\x65\x20\x6c\x61\x7a'), + (RX, b'\x18\x79\x20\x64\x6f\x67\x0a\x74'), + (RX, b'\x19\x68\x65\x20\x63\x72\x61\x7a'), + (RX, b'\x1a\x79\x20\x66\x6f\x78\x20\x6a'), + (RX, b'\x1b\x75\x6d\x70\x73\x20\x6f\x76'), + (RX, b'\x1c\x65\x72\x20\x74\x68\x65\x20'), + (RX, b'\x1d\x6c\x61\x7a\x79\x20\x64\x6f'), + (RX, b'\x1e\x67\x0a\x74\x68\x65\x20\x63'), + (RX, b'\x1f\x72\x61\x7a\x79\x20\x66\x6f'), + (RX, b'\x20\x78\x20\x6a\x75\x6d\x70\x73'), + (RX, b'\x21\x20\x6f\x76\x65\x72\x20\x74'), + (RX, b'\x22\x68\x65\x20\x6c\x61\x7a\x79'), + (RX, b'\xa3\x20\x64\x6f\x67\x0a\x00\x00'), + (TX, b'\xa2\x23\x7f\x00\x00\x00\x00\x00'), + (RX, b'\xc9\x3b\x49\x00\x00\x00\x00\x00'), + (TX, b'\xa1\x00\x00\x00\x00\x00\x00\x00'), # --> Transfer ends without issues ] data = [] - with self.network[2].sdo[0x1008].open("r", block_transfer=True) as fp: + with self.network[2].sdo[0x1008].open('r', block_transfer=True) as fp: data = fp.read() assert data == 39 * "the crazy fox jumps over the lazy dog\n" From ff12cb4d35bbd1deab4495be1e19d4c34232b771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Colomb?= Date: Mon, 9 Jun 2025 20:51:18 +0200 Subject: [PATCH 07/11] Use test framework assertion instead of plain assert. Just like the other test cases. Remove unnecessary initialization of local variable. --- test/test_sdo.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/test_sdo.py b/test/test_sdo.py index ada2a9ce..ae9d3822 100644 --- a/test/test_sdo.py +++ b/test/test_sdo.py @@ -471,10 +471,9 @@ def test_sdo_block_upload_retransmit(self): (RX, b'\xc9\x3b\x49\x00\x00\x00\x00\x00'), (TX, b'\xa1\x00\x00\x00\x00\x00\x00\x00'), # --> Transfer ends without issues ] - data = [] with self.network[2].sdo[0x1008].open('r', block_transfer=True) as fp: data = fp.read() - assert data == 39 * "the crazy fox jumps over the lazy dog\n" + self.assertEqual(data, 39 * 'the crazy fox jumps over the lazy dog\n') def test_writable_file(self): self.data = [ From df4af569e345b67b14c66b5a04a67157583d358b Mon Sep 17 00:00:00 2001 From: Samuel Lee Date: Tue, 10 Jun 2025 23:19:09 +0200 Subject: [PATCH 08/11] Fixed : moved comments up (wrong line) --- test/test_sdo.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_sdo.py b/test/test_sdo.py index 7927ef0a..8f9ebf27 100644 --- a/test/test_sdo.py +++ b/test/test_sdo.py @@ -243,11 +243,11 @@ def test_sdo_block_upload_retransmit(self): (RX, b'\x30\x74\x68\x65\x20\x6c\x61\x7a'), (RX, b'\x31\x79\x20\x64\x6f\x67\x0a\x74'), (RX, b'\x32\x68\x65\x20\x63\x72\x61\x7a'), - (RX, b'\x34\x79\x20\x66\x6f\x78\x20\x6a'), - (RX, b'\x34\x75\x6d\x70\x73\x20\x6f\x76'), # --> Wrong seqno (x34 instead of x33) - (RX, b'\x35\x65\x72\x20\x74\x68\x65\x20'), # All the following frames until end of block - (RX, b'\x36\x6c\x61\x7a\x79\x20\x64\x6f'), # will be ignored by the client and should be - (RX, b'\x37\x67\x0a\x74\x68\x65\x20\x63'), # resent by server. + (RX, b'\x34\x79\x20\x66\x6f\x78\x20\x6a'), # --> Wrong seqno (x34 instead of x33) + (RX, b'\x34\x75\x6d\x70\x73\x20\x6f\x76'), # All the following frames until end of block + (RX, b'\x35\x65\x72\x20\x74\x68\x65\x20'), # will be ignored by the client and should be + (RX, b'\x36\x6c\x61\x7a\x79\x20\x64\x6f'), # resent by server. + (RX, b'\x37\x67\x0a\x74\x68\x65\x20\x63'), (RX, b'\x38\x72\x61\x7a\x79\x20\x66\x6f'), (RX, b'\x39\x78\x20\x6a\x75\x6d\x70\x73'), (RX, b'\x3a\x20\x6f\x76\x65\x72\x20\x74'), From 37c6e4b945161e502f0c6a751029f2eb437983e5 Mon Sep 17 00:00:00 2001 From: Samuel Lee Date: Tue, 10 Jun 2025 23:21:51 +0200 Subject: [PATCH 09/11] Changed : replace double x34 with x34/x33 to make it clearer that there was an an inversion, even if it doens't make any difference --- test/test_sdo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_sdo.py b/test/test_sdo.py index 8f9ebf27..45e98df0 100644 --- a/test/test_sdo.py +++ b/test/test_sdo.py @@ -244,7 +244,7 @@ def test_sdo_block_upload_retransmit(self): (RX, b'\x31\x79\x20\x64\x6f\x67\x0a\x74'), (RX, b'\x32\x68\x65\x20\x63\x72\x61\x7a'), (RX, b'\x34\x79\x20\x66\x6f\x78\x20\x6a'), # --> Wrong seqno (x34 instead of x33) - (RX, b'\x34\x75\x6d\x70\x73\x20\x6f\x76'), # All the following frames until end of block + (RX, b'\x33\x75\x6d\x70\x73\x20\x6f\x76'), # All the following frames until end of block (RX, b'\x35\x65\x72\x20\x74\x68\x65\x20'), # will be ignored by the client and should be (RX, b'\x36\x6c\x61\x7a\x79\x20\x64\x6f'), # resent by server. (RX, b'\x37\x67\x0a\x74\x68\x65\x20\x63'), From a0a40b82217080cbfaddde7df6edf8149596b04d Mon Sep 17 00:00:00 2001 From: Samuel Lee Date: Tue, 10 Jun 2025 23:27:09 +0200 Subject: [PATCH 10/11] Changed : reset _ackseq every block --- canopen/sdo/client.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/canopen/sdo/client.py b/canopen/sdo/client.py index a87a12bf..6d92588e 100644 --- a/canopen/sdo/client.py +++ b/canopen/sdo/client.py @@ -561,7 +561,7 @@ def _retransmit(self): response = self.sdo_client.read_response() res_command, = struct.unpack_from("B", response) seqno = res_command & 0x7F - if seqno == 1: + if seqno == self._ackseq + 1: # We should be back in sync self._ackseq = seqno return response @@ -575,8 +575,7 @@ def _ack_block(self): request[1] = self._ackseq request[2] = self.blksize self.sdo_client.send_request(request) - if self._ackseq == self.blksize: - self._ackseq = 0 + self._ackseq = 0 def _end_upload(self): response = self.sdo_client.read_response() From 93ed50b81b4342631e7e7315fa4b3cb2e1f27f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Colomb?= Date: Wed, 11 Jun 2025 09:47:40 +0200 Subject: [PATCH 11/11] Update test/test_sdo.py --- test/test_sdo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_sdo.py b/test/test_sdo.py index 45e98df0..fea52b6a 100644 --- a/test/test_sdo.py +++ b/test/test_sdo.py @@ -448,7 +448,7 @@ def test_sdo_block_upload_retransmit(self): (RX, b'\x7d\x65\x20\x63\x72\x61\x7a\x79'), (RX, b'\x7e\x20\x66\x6f\x78\x20\x6a\x75'), (RX, b'\x7f\x6d\x70\x73\x20\x6f\x76\x65'), - (TX, b'\xa2\x7f\x7f\x00\x00\x00\x00\x00'), # --> This block is acknlowedged without issues + (TX, b'\xa2\x7f\x7f\x00\x00\x00\x00\x00'), # --> This block is acknowledged without issues (RX, b'\x01\x72\x20\x74\x68\x65\x20\x6c'), (RX, b'\x02\x61\x7a\x79\x20\x64\x6f\x67'), (RX, b'\x03\x0a\x74\x68\x65\x20\x63\x72'),