New for 2026 ============ Engineering never stops, and neither do we. At CTR Electronics, we are constantly analyzing and reflecting on our software, documentation and hardware integration. This past year, we've made immense investments in our differential stack, data analysis with Tuner, data logging and replay pipeline and much more. We are proud to present our new for 2026 changelog! Firmware for the 2026 release of Phoenix 6 can be found by selecting "2026" in the firmware selection menu. The API vendordep for 2026 is available under ``https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2026-latest.json``. Users will need to update both firmware and API to make use of these features. .. note:: This changelog is intended to highlight the major additions to the Phoenix 6 ecosystem. For a detailed list of changes and bug fixes, visit the `API changelog `__. API --- Breaking Changes ^^^^^^^^^^^^^^^^ - The ``new (int id, String canbus)`` constructors are now deprecated and will be removed in 2027. Use the ``new (int id, CANBus canbus)`` constructors instead. This change is intended to prepare users for 2027, where an explicit CAN bus declaration is necessary. - The minimum supported C++ version is now C++ 20, and the minimum Linux requirement is Ubuntu 22.04 / Debian Bookworm. Linux ARM32 is no longer supported. - C++: Improved robot project compilation times. This results in the following breaking changes: The ``ctre/phoenix6/configs/Configs.hpp`` header has been split into separate files. In generated swerve projects, ``TunerConstants.h`` must now explicitly include the motor controllers and encoder used. - ``DifferentialMechanism`` and ``SimpleDifferentialMechanism`` have been reworked to more closely align with the swerve API. The behavior of the difference axis has also been adjusted. Signal Logger Improvements & Behavior Changes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. image:: images/hoot-struct-support.gif :alt: Picture showing playing back the pose signal in AdvantageScope Signal logger has had quite a few changes over the off-season. Signal Logger now has support for `Protobuf `__ and `WPILib Structs `__, arbitrarily sized user signals, and annotation-based logging as an :doc:`Epilogue Backend `. The behavior of the signal logger auto-start functionality has also been changed in response to user feedback to make the experience consistent between at-home testing and events. Signal Logging auto start is **only enabled** on the roboRIO 1 if a flash drive is present, and otherwise enabled by default on the roboRIO 2. Signal logging is started by any of the following (whichever occurs first): - It has been at least 1 second since program startup (allowing for calls to ``setPath``), and the robot is enabled. - It has been at least 5 seconds since program startup (allowing for calls to ``setPath``), and the Driver Station is connected to the robot. Additionally, ``OptimizeBusUtilization()`` now defaults to setting optimized signals to 4 Hz instead of 0 Hz, preserving data for hoot logs. Users can still get the old behavior by explicitly passing in 0 Hz. .. dropdown:: Miscellaneous Changes - Logs from the same robot program instance / FRC match will now be grouped into a subdirectory named after the match and the date/time of the start of the match. - The list of :ref:`docs/api-reference/api-usage/signal-logging:free signals` (including custom user signals) is no longer limited to WPILOG export and can now be exported to MCAP. Hoot Replay Improvements ^^^^^^^^^^^^^^^^^^^^^^^^ Hoot replay has been enhanced to simplify use cases beyond status signal playback. A ``HootAutoReplay`` API has been added to easily register custom "input" signals for logging on hardware and playback in replay. This also enables easy replay of the robot FPGA timestamp and joystick information. .. code-block:: java private final Camera camera = new Camera(...); private PoseEstimate cameraPoseEst = new PoseEstimate(); private final HootAutoReplay autoReplay = new HootAutoReplay() .withTimestampReplay() .withJoystickReplay() .withStruct( "CameraPoseEst/pose", Pose2d.struct, /* getter lambda returns the value to log */ () -> cameraPoseEst.pose, /* setter lambda applies the value from the log */ val -> cameraPoseEst.pose = val.value ) .withDouble( "CameraPoseEst/timestamp", () -> cameraPoseEst.timestamp, val -> cameraPoseEst.timestamp = val.value ); private void fetchInputs() { cameraPoseEst = camera.getPoseEstimate(); } @Override public void robotPeriodic() { if (!Utils.isReplay()) { fetchInputs(); } autoReplay.update(); } We highly recommend reading over the :doc:`improved hoot replay ` documentation for understanding how to integrate hoot replay into your robot program. Additionally, the Signal Logger is now supported in Hoot Replay with the following behavior: - Signal Logger is always enabled during replay. As a result, ``SignalLogger::Start()`` and ``SignalLogger::Stop()`` are ignored. - The replayed log will always be written to a ``replay__