Work in progress.
This is a full rewrite from scratch that changes the API entirely, to the point that there are no commonalities with v1. The new version offers a significantly simplified API (the total surface is about one-tenth of the previous version) and supports Cyphal v1.1, which adds decentralized named topics, tunable reliability, and service discovery on top of Cyphal v1.0.
Due to the significant changes, the new version is published under a different name pycyphal2 to allow coexistence
with v1 in the same Python environment.
The v1 generation is being replaced with v2. The new version supports Cyphal v1.1 and offers a completely different API but the versions are wire-compatible on Cyphal/CAN.
- Add set_internal_error_handler - registers a hook, that is called when something goes wrong in pycyphal internals.
- SocketCAN: Add option to disable bit-rate switching (BRS bit) for FD-CAN with uavcan.udp.disable_brs. (#373)
- Add
Lockerfileto prevent race condition when compiling namespaces (#357) - Add
remove_import_hook, renameinstall_import_hooktoadd_import_hook(#356) - Choose the type width based on elements in the source array (#358)
- v1.24.1:
- Install Graphviz 13.x. See (#363)
- v1.24.2:
- Add progress reporting to pycyphal.application.file.FileClient2 (#353).
- Fix
pycyphal.application.file.RemoteFileError(#347). - Add support for the USBtingo CAN interface. This is only available when the python-can-usbtingo package is installed (#348).
- Upgrade to require NumPy v2.2. NumPy v1 is still supported but no longer tested against.
- Add testing against Python 3.12 and 3.13. No changes to the library were needed to enable this.
- Drop testing against Python 3.8 and 3.9.
- Cyphal/UDP: The default node-ID is now None, not zero (#323).
- Add the
py.typedannotation (#343).
- Implement configure_acceptance_filters for socketcan.
- v1.19.1:
- Fix socketcan timestamp on newer 32 bit kernel.
- Add FileClient2 which reports errors by raising exceptions. See (#327) for rationale.
- Move to Nunavut Version 2 See (#318) for details on the internal changes.
- Added support for the Socketcand interface. See (#306) for details on the changes.
- Made PythonCAN support better.
- Updated the Serial frame format to match the UDP frame format. See (#266) for a general description of the changes.
- Cyphal/UDP: Service transfer are also multicast now. Make sure to take into account the updated IP mapping specifications. See (post).
- Add :attr:`pycyphal.application.node_tracker.NodeTracker.get_info_priority`, to allow configuring the node tracker's GetInfo request priority.
- Add
pycyphal.transport.can.CANTransport.spoof_frames()for compatibility with 3rd-party CAN protocols sharing the network interface with PyCyphal.
- Implement DSDL compilation via import hooks (#236).
- Cyphal/CAN: Support GS USB adapter via PythonCAN (#212).
- Cyphal/CAN: Adjust SocketCAN socket behavior to avoid ENOBUFS (#234).
- Cyphal/CAN: Add :mod:
pycyphal.transport.can.media.candumpmedia that reads standard CAN bus log files created by the candump utility (part of SocketCAN).
- Subscription synchronizer added (#65).
- v1.8.1: Port factory methods in :class:`pycyphal.application.Node` that accept direct port-ID always update the registry.
- v1.8.2: Fix error handing in :meth:`pycyphal.transport.redundant.RedundantOutputSession.send`; see #222.
- v1.8.3:
DiagnosticPublisher: do not instantiate the publisher if the local node is anonymous.publish_soon(): Do not log error if closed.ClientandPublisher: fix edge cases related toPortClosedErrorwhen the interface becomes unavailable.- Fix assertion failure during register value coercion.
- SocketCAN: close the media instance automatically on unrecoverable errors like ENODEV, ENXIO, EBADF, EBADFD, etc.
- v1.8.4:
- Actualize the Demo (mostly Yakut-related).
- :class:`pycyphal.application.Node` supports construction of ports (publishers, subscribers, clients, servers) with a directly specified port-ID, bypassing the registry.
- New presentation layer capabilities:
- New overload :meth:`pycyphal.presentation.Client.__call__`
- New method :meth:`pycyphal.presentation.Subscriber.get`
- Support sync callbacks in :meth:`pycyphal.presentation.Subscriber.receive_in_background`
- The library renamed from PyUAVCAN to PyCyphal and republished under the new name.
- Behavior of the redundant output session changed: :meth:`pyuavcan.transport.redundant.RedundantOutputSession.send` returns as soon as at least one inferior is done transmitting, the slower ones keep transmitting in the background. In other words, the redundant transport now operates at the rate of the fastest inferior (used to be the slowest one).
- Implement the DSDL UX improvement described in #147.
- Fully adopt PEP 585 in generated code.
- Support Python 3.10.
- Deprecate property
pyuavcan.transport.Transport.loopand the corresponding constructor argument. The constructor argument is now ignored and the aforementioned property is an alias ofasyncio.get_event_loop(). - Generated classes include convenience aliases of the newest minor version per major version (Nunavut #193).
- Remove the NumPy <= 0.17 version constraint.
- Improve type annotations in generated code thanks to the new NumPy typing support.
- Support assignment of
memoryviewtouint8-typed arrays. - Rename installation extras by replacing underscores with the minus character;
e.g.,
transport_can_pythoncan-->transport-can-pythoncan. - Improve logging and error reporting.
- Fix issues related to UDP packet capture.
pyuavcan.transport.can: Add Python-CAN media driver. The corresponding installation extra istransport_can_pythoncan.- Support packet capture and tracing for all transports (spoofing is implemented for all transports except UAVCAN/UDP). Refactor the unstable capture/tracing API to model the underlying protocols more accurately.
- Add
pyuavcan.application.file.FileServer/FileClientimplementing the standard file serviceuavcan.file. - Constructor parameter
anonymousforUDPTransporthas been deprecated in favor oflocal_node_id. - Refactor the Node API (#154):
- Add factory function
make_node(). - Implement the UAVCAN Register API and add port construction factory methods that take port-ID from the registry. This is a major change that allows applications to avoid hard-coding any port-ID whatsoever. The respective configuration is now sourced from the registers, which in turn are read from environment variables and from persistent register files (i.e., configuration files).
- Support context manager API (
__enter__,__leave__). - Rework the demo accordingly.
- Add factory function
- In
pyuavcan.dsdl: renamegenerate_packageintocompile, addcompile_all.
First stable release. v1.0 was never released for legacy reasons.