1515if TYPE_CHECKING :
1616 from canopen import LocalNode , RemoteNode
1717 from canopen .pdo import RPDO , TPDO
18- from canopen .sdo import SdoRecord
18+ from canopen .sdo import SdoRecord , SdoVariable
1919
2020
2121PDO_NOT_VALID = 1 << 31
@@ -404,18 +404,22 @@ def save(self) -> None:
404404 return
405405 logger .info ("Setting COB-ID 0x%X and temporarily disabling PDO" , self .cob_id )
406406 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
407+
408+ def _set_com_record (
409+ subindex : int , value : Optional [int ], log_fmt : str , log_factor : int = 1
410+ ):
411+ if value is None :
412+ return
413+ if self .com_record [subindex ].writable :
414+ logger .info (f"Setting { log_fmt } " , value * log_factor )
415+ self .com_record [subindex ].raw = value
416+ else :
417+ logger .info (f"Cannot set { log_fmt } , not writable" , value * log_factor )
418+
419+ _set_com_record (2 , self .trans_type , "transmission type to %d" )
420+ _set_com_record (3 , self .inhibit_time , "inhibit time to %d us" , 100 )
421+ _set_com_record (5 , self .event_timer , "event timer to %d ms" )
422+ _set_com_record (6 , self .sync_start_value , "SYNC start value to %d" )
419423
420424 try :
421425 self .map_array [0 ].raw = 0
@@ -425,20 +429,16 @@ def save(self) -> None:
425429 # mappings for an invalid object 0x0000:00 to overwrite any
426430 # excess entries with all-zeros.
427431 self ._fill_map (self .map_array [0 ].raw )
428- subindex = 1
429- for var in self .map :
432+ for var , entry in zip (self .map , self .map_array ):
433+ if not entry .writable :
434+ continue
430435 logger .info ("Writing %s (0x%04X:%02X, %d bits) to PDO map" ,
431436 var .name , var .index , var .subindex , var .length )
432437 if getattr (self .pdo_node .node , "curtis_hack" , False ):
433438 # Curtis HACK: mixed up field order
434- self .map_array [subindex ].raw = (var .index |
435- var .subindex << 16 |
436- var .length << 24 )
439+ entry .raw = var .index | var .subindex << 16 | var .length << 24
437440 else :
438- self .map_array [subindex ].raw = (var .index << 16 |
439- var .subindex << 8 |
440- var .length )
441- subindex += 1
441+ entry .raw = var .index << 16 | var .subindex << 8 | var .length
442442 try :
443443 self .map_array [0 ].raw = len (self .map )
444444 except SdoAbortedError as e :
0 commit comments