@@ -349,7 +349,9 @@ def __init__(
349349 self .task_id = task_id
350350 self ._tx_setup (self .messages )
351351
352- def _tx_setup (self , messages : Sequence [Message ]) -> None :
352+ def _tx_setup (
353+ self , messages : Sequence [Message ], raise_if_task_exists : bool = True
354+ ) -> None :
353355 # Create a low level packed frame to pass to the kernel
354356 body = bytearray ()
355357 self .flags = CAN_FD_FRAME if messages [0 ].is_fd else 0
@@ -363,7 +365,8 @@ def _tx_setup(self, messages: Sequence[Message]) -> None:
363365 ival1 = 0.0
364366 ival2 = self .period
365367
366- self ._check_bcm_task ()
368+ if raise_if_task_exists :
369+ self ._check_bcm_task ()
367370
368371 header = build_bcm_transmit_header (
369372 self .task_id , count , ival1 , ival2 , self .flags , nframes = len (messages )
@@ -375,7 +378,7 @@ def _tx_setup(self, messages: Sequence[Message]) -> None:
375378
376379 def _check_bcm_task (self ) -> None :
377380 # Do a TX_READ on a task ID, and check if we get EINVAL. If so,
378- # then we are referring to a CAN message with the existing ID
381+ # then we are referring to a CAN message with an existing ID
379382 check_header = build_bcm_header (
380383 opcode = CAN_BCM_TX_READ ,
381384 flags = 0 ,
@@ -387,12 +390,19 @@ def _check_bcm_task(self) -> None:
387390 can_id = self .task_id ,
388391 nframes = 0 ,
389392 )
393+ log .debug (
394+ f"Reading properties of (cyclic) transmission task id={ self .task_id } " ,
395+ )
390396 try :
391397 self .bcm_socket .send (check_header )
392398 except OSError as error :
393399 if error .errno != errno .EINVAL :
394400 raise can .CanOperationError ("failed to check" , error .errno ) from error
401+ else :
402+ log .debug ("Invalid argument - transmission task not known to kernel" )
395403 else :
404+ # No exception raised - transmission task with this ID exists in kernel.
405+ # Existence of an existing transmission task might not be a problem!
396406 raise can .CanOperationError (
397407 f"A periodic task for task ID { self .task_id } is already in progress "
398408 "by the SocketCAN Linux layer"
@@ -438,15 +448,15 @@ def modify_data(self, messages: Union[Sequence[Message], Message]) -> None:
438448 send_bcm (self .bcm_socket , header + body )
439449
440450 def start (self ) -> None :
441- """Start a periodic task by sending TX_SETUP message to Linux kernel.
451+ """Restart a periodic task by sending TX_SETUP message to Linux kernel.
442452
443453 It verifies presence of the particular BCM task through sending TX_READ
444454 message to Linux kernel prior to scheduling.
445455
446456 :raises ValueError:
447457 If the task referenced by ``task_id`` is already running.
448458 """
449- self ._tx_setup (self .messages )
459+ self ._tx_setup (self .messages , raise_if_task_exists = False )
450460
451461
452462class MultiRateCyclicSendTask (CyclicSendTask ):
0 commit comments