-
Notifications
You must be signed in to change notification settings - Fork 659
Description
Describe the bug
If we pass a duration argument to send_periodic, the message transmissions don't stop at the time specified. One extra message is sent.
To Reproduce
To see this, call send_periodic with period argument and duration arguments such that the duration is not simply a multiple of the period. For example, with duration of 2 seconds, specify a period of 0.6 seconds, or 0.8 seconds. In both cases, the final transmitted message will be at 2.4 seconds (which is 0.6 x 4 repeats, or 0.8 x 3 repeats), which is well past the expiry of the 2 seconds duration.
Expected behavior
The messages should stop transmitting when the duration time elapses (give or take a little wiggle-room).
Additional context
We seem to have effectively an off-by-one error that's arising from the way that the ThreadBasedCyclicSendTask has things ordered inside its while loop:
I'm thinking that this means that the final message can be later than the duration by an amount of time up to the size of the period.
OS and version: Windows10
Python version: 3.11.6
python-can version: 4.3.0
python-can interface/s (if applicable):
Sample output where devices on a bus are asked periodically to claim addresses:
With duration 2 seconds, period 0.6 seconds
Timestamp: 15.414987 ID: 18eafffe X Tx DL: 3 00 ee 00 Channel: 1
Timestamp: 16.016019 ID: 18eafffe X Tx DL: 3 00 ee 00 Channel: 1
Timestamp: 16.615183 ID: 18eafffe X Tx DL: 3 00 ee 00 Channel: 1
Timestamp: 17.215543 ID: 18eafffe X Tx DL: 3 00 ee 00 Channel: 1
Timestamp: 17.816031 ID: 18eafffe X Tx DL: 3 00 ee 00 Channel: 1
Time of final transmission after first transmission = 17.816031 - 15.414987 = 2.401044 seconds
With duration 2 seconds, period 0.8 seconds
Timestamp: 19.160761 ID: 18eafffe X Tx DL: 3 00 ee 00 Channel: 1
Timestamp: 19.961824 ID: 18eafffe X Tx DL: 3 00 ee 00 Channel: 1
Timestamp: 20.761057 ID: 18eafffe X Tx DL: 3 00 ee 00 Channel: 1
Timestamp: 21.561177 ID: 18eafffe X Tx DL: 3 00 ee 00 Channel: 1
Time of final transmission after first transmission = 21.561177 - 19.160761 = 2.400416 seconds