Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pycyphal/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.24.3"
__version__ = "1.24.4"
30 changes: 10 additions & 20 deletions pycyphal/transport/can/media/pythoncan/_pythoncan.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ async def send(self, frames: typing.Iterable[Envelope], monotonic_deadline: floa
is_extended_id=(f.frame.format == FrameFormat.EXTENDED),
data=f.frame.data,
is_fd=self._is_fd,
bitrate_switch=self._is_fd,
)
try:
desired_timeout = monotonic_deadline - loop.time()
Expand Down Expand Up @@ -491,32 +492,21 @@ def _construct_pcan(parameters: _InterfaceParameters) -> can.ThreadSafeBus:
if isinstance(parameters, _FDInterfaceParameters):
if parameters.bitrate[0] == 0 or parameters.bitrate[1] == 0:
raise InvalidMediaConfigurationError("Bitrate must be non-zero")
# These magic numbers come from the settings of PCAN adapter.
# They don't allow any direct baudrate settings, you have to set all lengths and value of the main frequency.
# Bit lengths below are very universal and can be applied for almost every popular baudrate.
# There is probably a better solution here, but it needs significantly more time to implement it.
f_clock = 40000000
nom_tseg1, nom_tseg2, nom_sjw = 3, 1, 1
data_tseg1, data_tseg2, data_sjw = 3, 1, 1

nom_br = int(f_clock / parameters.bitrate[0] / (nom_tseg1 + nom_tseg2 + nom_sjw))
data_br = int(f_clock / parameters.bitrate[1] / (data_tseg1 + data_tseg2 + data_sjw))
# TODO: validate the result and see if it is within an acceptable range

timing = can.BitTimingFd.from_sample_point(
f_clock=80_000_000, # TODO: 80 MHz is a good choice for high data rates, what about lower ones?
nom_bitrate=parameters.bitrate[0],
nom_sample_point=80,
data_bitrate=parameters.bitrate[1],
data_sample_point=80,
)
_logger.debug("PCAN timing solution: %s", timing)
return (
PythonCANBusOptions(),
can.ThreadSafeBus(
interface=parameters.interface_name,
channel=parameters.channel_name,
f_clock=f_clock,
nom_brp=nom_br,
data_brp=data_br,
nom_tseg1=nom_tseg1,
nom_tseg2=nom_tseg2,
nom_sjw=nom_sjw,
data_tseg1=data_tseg1,
data_tseg2=data_tseg2,
data_sjw=data_sjw,
timing=timing,
fd=True,
),
)
Expand Down