44import logging
55import math
66import threading
7- from collections .abc import Mapping
8- from typing import Callable , Dict , Iterator , List , Optional , TYPE_CHECKING , Union
7+ from collections .abc import Iterator , Mapping
8+ from typing import Callable , Optional , TYPE_CHECKING , Union
99
1010import canopen .network
1111from canopen import objectdictionary
@@ -150,7 +150,7 @@ def __init__(self, com_offset, map_offset, pdo_node: PdoBase, cob_base=None):
150150 :param pdo_node:
151151 :param cob_base:
152152 """
153- self .maps : Dict [int , PdoMap ] = {}
153+ self .maps : dict [int , PdoMap ] = {}
154154 for map_no in range (512 ):
155155 if com_offset + map_no in pdo_node .node .object_dictionary :
156156 new_map = PdoMap (
@@ -196,7 +196,7 @@ def __init__(self, pdo_node, com_record, map_array):
196196 #: Ignores SYNC objects up to this SYNC counter value (optional)
197197 self .sync_start_value : Optional [int ] = None
198198 #: List of variables mapped to this PDO
199- self .map : List [PdoVariable ] = []
199+ self .map : list [PdoVariable ] = []
200200 self .length : int = 0
201201 #: Current message data
202202 self .data = bytearray ()
@@ -403,19 +403,27 @@ def save(self) -> None:
403403 logger .info ("Skip saving %s: COB-ID was never set" , self .com_record .od .name )
404404 return
405405 logger .info ("Setting COB-ID 0x%X and temporarily disabling PDO" , self .cob_id )
406- self .com_record [1 ].raw = self .cob_id | PDO_NOT_VALID | (RTR_NOT_ALLOWED if not self .rtr_allowed else 0x0 )
407- if self .trans_type is not None :
408- logger .info ("Setting transmission type to %d" , self .trans_type )
409- self .com_record [2 ].raw = self .trans_type
410- if self .inhibit_time is not None :
411- logger .info ("Setting inhibit time to %d us" , (self .inhibit_time * 100 ))
412- self .com_record [3 ].raw = self .inhibit_time
413- if self .event_timer is not None :
414- logger .info ("Setting event timer to %d ms" , self .event_timer )
415- self .com_record [5 ].raw = self .event_timer
416- if self .sync_start_value is not None :
417- logger .info ("Setting SYNC start value to %d" , self .sync_start_value )
418- self .com_record [6 ].raw = self .sync_start_value
406+ self .com_record [1 ].raw = (
407+ self .cob_id
408+ | PDO_NOT_VALID
409+ | (RTR_NOT_ALLOWED if not self .rtr_allowed else 0 )
410+ )
411+
412+ def _set_com_record (
413+ subindex : int , value : Optional [int ], log_fmt : str , log_factor : int = 1
414+ ):
415+ if value is None :
416+ return
417+ if self .com_record [subindex ].writable :
418+ logger .info (f"Setting { log_fmt } " , value * log_factor )
419+ self .com_record [subindex ].raw = value
420+ else :
421+ logger .info (f"Cannot set { log_fmt } , not writable" , value * log_factor )
422+
423+ _set_com_record (2 , self .trans_type , "transmission type to %d" )
424+ _set_com_record (3 , self .inhibit_time , "inhibit time to %d us" , 100 )
425+ _set_com_record (5 , self .event_timer , "event timer to %d ms" )
426+ _set_com_record (6 , self .sync_start_value , "SYNC start value to %d" )
419427
420428 try :
421429 self .map_array [0 ].raw = 0
@@ -425,20 +433,21 @@ def save(self) -> None:
425433 # mappings for an invalid object 0x0000:00 to overwrite any
426434 # excess entries with all-zeros.
427435 self ._fill_map (self .map_array [0 ].raw )
428- subindex = 1
429- for var in self .map :
430- logger .info ("Writing %s (0x%04X:%02X, %d bits) to PDO map" ,
431- var .name , var .index , var .subindex , var .length )
436+ for var , entry in zip (self .map , self .map_array .values ()):
437+ if not entry .od .writable :
438+ continue
439+ logger .info (
440+ "Writing %s (0x%04X:%02X, %d bits) to PDO map" ,
441+ var .name ,
442+ var .index ,
443+ var .subindex ,
444+ var .length ,
445+ )
432446 if getattr (self .pdo_node .node , "curtis_hack" , False ):
433447 # Curtis HACK: mixed up field order
434- self .map_array [subindex ].raw = (var .index |
435- var .subindex << 16 |
436- var .length << 24 )
448+ entry .raw = var .index | var .subindex << 16 | var .length << 24
437449 else :
438- self .map_array [subindex ].raw = (var .index << 16 |
439- var .subindex << 8 |
440- var .length )
441- subindex += 1
450+ entry .raw = var .index << 16 | var .subindex << 8 | var .length
442451 try :
443452 self .map_array [0 ].raw = len (self .map )
444453 except SdoAbortedError as e :
0 commit comments