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: