Skip to content

Commit 485b1b4

Browse files
Allow restarting of transmission tasks for socketcan (#1440)
* Allow restarting of transmission tasks for socketcan * Update can/interfaces/socketcan/socketcan.py Co-authored-by: zariiii9003 <[email protected]>
1 parent 44853c5 commit 485b1b4

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

can/interfaces/socketcan/socketcan.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

452462
class MultiRateCyclicSendTask(CyclicSendTask):

0 commit comments

Comments
 (0)