From fdf57245e213bd1b04481a9302f472e0b01eea84 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" <erlend@python.org> Date: Mon, 2 Sep 2024 14:33:00 +0200 Subject: [PATCH 1/2] TPDO mappings may be read-only --- canopen/pdo/base.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/canopen/pdo/base.py b/canopen/pdo/base.py index f2a7d205..04bc28b5 100644 --- a/canopen/pdo/base.py +++ b/canopen/pdo/base.py @@ -427,15 +427,19 @@ def save(self) -> None: for var in self.map: logger.info("Writing %s (0x%04X:%02X, %d bits) to PDO map", var.name, var.index, var.subindex, var.length) - if getattr(self.pdo_node.node, "curtis_hack", False): - # Curtis HACK: mixed up field order - self.map_array[subindex].raw = (var.index | - var.subindex << 16 | - var.length << 24) - else: - self.map_array[subindex].raw = (var.index << 16 | - var.subindex << 8 | - var.length) + try: + if getattr(self.pdo_node.node, "curtis_hack", False): + # Curtis HACK: mixed up field order + self.map_array[subindex].raw = (var.index | + var.subindex << 16 | + var.length << 24) + else: + self.map_array[subindex].raw = (var.index << 16 | + var.subindex << 8 | + var.length) + except SdoAbortedError as e: + if e.code != 0x06010002: + raise subindex += 1 try: self.map_array[0].raw = len(self.map) From 67a85931f171748ed9eee0be4a037afc3adb08a8 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" <erlend@python.org> Date: Tue, 3 Sep 2024 10:48:27 +0200 Subject: [PATCH 2/2] Address review: heed OD instead of suppressing errors --- canopen/pdo/base.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/canopen/pdo/base.py b/canopen/pdo/base.py index 04bc28b5..64f63fee 100644 --- a/canopen/pdo/base.py +++ b/canopen/pdo/base.py @@ -423,24 +423,20 @@ def save(self) -> None: # mappings for an invalid object 0x0000:00 to overwrite any # excess entries with all-zeros. self._fill_map(self.map_array[0].raw) - subindex = 1 - for var in self.map: + for subindex, var in enumerate(self.map, start=1): + if not var.od.writable: + continue logger.info("Writing %s (0x%04X:%02X, %d bits) to PDO map", var.name, var.index, var.subindex, var.length) - try: - if getattr(self.pdo_node.node, "curtis_hack", False): - # Curtis HACK: mixed up field order - self.map_array[subindex].raw = (var.index | - var.subindex << 16 | - var.length << 24) - else: - self.map_array[subindex].raw = (var.index << 16 | - var.subindex << 8 | - var.length) - except SdoAbortedError as e: - if e.code != 0x06010002: - raise - subindex += 1 + if getattr(self.pdo_node.node, "curtis_hack", False): + # Curtis HACK: mixed up field order + self.map_array[subindex].raw = (var.index | + var.subindex << 16 | + var.length << 24) + else: + self.map_array[subindex].raw = (var.index << 16 | + var.subindex << 8 | + var.length) try: self.map_array[0].raw = len(self.map) except SdoAbortedError as e: