Skip to content

Upgrade to WPILib 2027-alpha8 - #190

Merged
tbowers7 merged 10 commits into
developfrom
alpha8
Oct 30, 2026
Merged

tbowers7 merged 10 commits into
developfrom
alpha8

Conversation

@tbowers7

Copy link
Copy Markdown
Collaborator

Summary

Migrate Az-RBSI from develop to WPILib 2027 alpha-8 and the Systemcore deployment model, while retaining the project’s custom build tasks, logging, tests, and documentation.

This PR remains on Commands V2. The separate commands_v3 branch is not part of this merge.

Changes

  • Update GradleRIO and vendordeps for the 2027 alpha toolchain. Use application/classpath deployment and an ordinary application jar instead of ShadowJar. Retain BuildConstants generation, the event-branch deploy task, Spotless, Lombok, protobuf, explicit Jackson and AdvantageKit dependencies, the custom test source set, and JUnit 6.1.3.
  • Adapt robot code to the 2027 WPILib, Phoenix, and REV APIs, including Systemcore CAN ports, Spark encoder and setpoint units, and Choreo trajectory following.
  • Correct timestamp handling for WPILib and NetworkTables nanosecond values. Use WPILib math and timing utilities where they replace local helpers, and read CAN health through RobotController.getCANStatus.
  • Replace the local alert implementation with WPILib alerts. Log Commands V2 lifecycle events and active commands through AdvantageKit while retaining the dashboard field display.
  • Use WPILib’s Systemcore OnboardIMU for acceleration in meters per second squared, and remove the legacy robot-thread priority switching.
  • Restore ChoreoLib integration, update the AdvantageScope layouts, extend Az-FIRST copyright notices through 2027, and add the BIOCORE VS Code theme.
  • Add a supported-configuration guide. The example flywheel is disabled on real hardware by default; its controls and SysId choices require an explicit hardware selection.

Configuration and follow-up

  • Phoenix 6/Pigeon with AutoType.MANUAL is the checked-in configuration. YAGSL runtime remains deferred until its deploy JSON and gyro selection are updated for Systemcore.
  • PathPlanner and Choreo integrations compile, but their example paths or trajectories and robot tuning must be supplied before use on hardware.
  • PhotonVision alpha-2 still references removed WPILib class names. This PR includes a documented, temporary compatibility bridge that should be removed when a compatible PhotonVision release is available.
  • The concurrent interpolation buffer remains in use pending a later review of its thread-safety and range-query needs.
  • Physical drivetrain, vision, acceleration, and mechanism behavior still require validation on the target robot.

Validation

  • Full Gradle test suite passed with the installed WPILib Java 25 toolchain.
  • git diff --check passed.
  • Both root AdvantageScope JSON layouts were parsed successfully.

tbowers7 and others added 10 commits October 30, 2026 11:18
Merge the WPILib-imported project into the existing Az-RBSI tree while
retaining its project-specific build tasks, dependencies, sources, and
editor configuration. Remove the imported copy after bringing its four
new vendor dependencies and required configuration changes into this tree.

Move GradleRIO to 2027.0.0-alpha-8 and switch Systemcore deployment to the
importer's application/classpath model. Replace the ShadowJar deployment
with the ordinary application jar, retaining source, vendordep, and Gradle
backup contents in that jar. Keep generated BuildConstants, the event-branch
deploy commit task, Spotless, Lombok, protobuf, explicit Jackson and
AdvantageKit dependencies, the custom test source set, and JUnit 6.1.3.
Configure JNI debug settings using the alpha-8 GradleRIO properties. Adopt
the imported settings.gradle resolution of the 2027_alpha7 WPILib install,
including the Linux XDG and macOS .wpilib paths. Update WPILib preferences
to team 2486, preserve the original .gitignore, retain the direct Java
launch entry, rename the WPILib debug launch to Systemcore, and add the
imported Java debug CodeLens setting.

Refresh AdvantageKit, Commands V2, PathPlanner, REVLib, and Phoenix 6 vendor
dependencies; replace Phoenix6 26.50.0-alpha-1 with 26.70.0-alpha-2.
Add the imported AprilTag, YAGSL Commands V2, and YAMS Commands V2 vendor
files. Preserve the original-only Autopilot, URCL, and PhotonVision vendor
files while aligning their WPILib year with 2027_alpha7. Keep the imported
changes to the seven robot Java files selected during the merge.

Adapt robot code to the 2027 WPILib APIs: start the robot with a supplier,
move geometry zero constants and SysId/debouncer enum values to their new
names, use Optional rotation angles and the current HID trigger accessors,
map Systemcore CAN bus names to CANPort, and update CTRE generated drivetrain
constants to use CANBus networks. Move RBSI Pair use to org.wpilib.util.Pair.
Replace the local Alert implementation with WPILib alerts and map existing
severity levels to the built-in levels; give per-instance drivetrain and
module alerts unique IDs. Publish the field through Telemetry and migrate
the autonomous and drive-style choices to LoggedNetworkChooser.

Bridge the current PhotonVision alpha-2 binary against the removed AprilTag
and Pair class names. The local AprilTagFieldLayout adapter wraps the new
org.wpilib.fields.Field and reads the existing field-layout JSON schema.
Document the temporary bridge and its removal steps for a future compatible
PhotonVision release.

Complete the REVLib 2027 Spark migration. Convert raw encoder rotations and
RPM to the radians and radians/second expected by ModuleIO, convert drive
velocity and steering setpoints back to controller units, and scale PID and
feedforward gains to preserve their physical units. Apply identical scaling
to high-rate odometry queues and decode CANcoder queue values as rotations.
Remove configuration calls for conversion factors, hall sensor averaging,
and custom position-wrapping range that REVLib removed. Document physical
validation still needed for wheel direction, steering wraparound, odometry,
velocity control, SysId, and possible gain retuning with the new firmware.

Update tests for alpha-8 HAL, rotation, Optional, and CANPort APIs. Add
focused Spark unit-conversion and steering wraparound tests. Verify with
./gradlew test using the installed WPILib JDK and git diff --check; both pass.

Co-authored-by: Codex <codex@openai.com>
Correct timestamp units across robot and vision code after the 2027 API
transition. RobotController.getTime(), NetworkTables Java sample timestamps,
and AdvantageKit's clock now use nanoseconds; the old TimeUtil path treated
raw time as microseconds. Replace TimeUtil call sites with WPILib Timer
seconds, including drive, odometry, accelerometer, simulation, and power
monitoring. Use Timer for Spark and Phoenix odometry sample timestamps. In
Limelight IO, convert NetworkTables sample timestamps from nanoseconds to
seconds, express heartbeat and orientation intervals in nanoseconds, and
handle clock reversal. Apply nanosecond update intervals and an initial-
sample sentinel guard to PhotonVision simulation. Clamp the power monitor's
elapsed time at zero so a clock reset cannot subtract accumulated usage.

Replace the local MathUtil helpers with WPILib applyDeadband,
angleModulus, inputModulus, and lerp at their callers. Remove the unused
GeomUtil, and remove MathUtil and TimeUtil after migrating their call sites.
Keep the concurrent interpolation buffer because Drive currently uses its
thread-safe access and oldest/newest/range queries; add a TODO to recheck
whether a future WPILib buffer can provide those properties.

Replace LoggedTunableNumber callers with AdvantageKit LoggedNetworkNumber
behind DoubleSupplier fields. Preserve the existing /Tuning dashboard paths,
tuning-mode defaults, and recorded-input replay behavior for battery amp-
hours and flywheel speed. Pass the battery supplier into RBSIPowerMonitor.
Keep the monitor's Conduit snapshot, current aggregation, battery estimate,
energy integration, and alerts: WPILib PowerDistribution total power and
energy are unsupported for the configured REV PDH and would return zero.

Read CAN bus utilization, TX-full, receive-error, transmit-error, and
bus-off status through RobotController.getCANStatus on the matching
Systemcore CANPort. Retain the existing CAN log paths below each bus name.
Remove the health-only CANBusLike adapters and simulation stubs from
RBSICANBusRegistry while retaining real Phoenix CANBus instances for CTRE
device constructors. Simplify the simulation/replay registry initializer.
The WPILib receive/transmit error counters may not be directly comparable
to the previous Phoenix REC/TEC values in historical logs.

Refresh both root AdvantageScope layouts for the current swerve telemetry
names and struct types: SwerveChassisVelocities, ChassisVelocities,
SwerveModuleVelocity, and each module's velocity field. Point vision field
traces to TagsSeenThisLoop and per-camera InjectedPose2d, and remove stale
vision debug traces with no current output. Use the current estimated slot
feedforward key. Expand CAN health plotting to the four active Systemcore
buses, can_s1 through can_s4, with their utilization and error counters.

Update unit tests for the WPILib math functions and nanosecond Limelight
sample/heartbeat behavior. Add a simulation smoke check for native
Systemcore CAN status polling. Verify with ./gradlew test, JSON parsing of
both AdvantageScope layouts, and git diff --check.

Co-authored-by: Codex <codex@openai.com>
Update the Az-FIRST copyright year range in all 65 Java source and test
files that carry an Az-FIRST notice. Preserve each file's original start
year: notices that began in 2024 now read 2024-2027, and notices that
began in 2026 now read 2026-2027.

Leave third-party copyright lines and licensing statements intact in
mixed-origin files, including those attributed to Littleton Robotics,
FIRST/WPILib, SleipnirGroup, and FRC 6328. Keep the repository's full GPL
license and per-project BSD license copies. The bundled AdvantageKit and
WPILib license files already match their current upstream Git blobs byte
for byte, so this commit does not alter or invent their copyright years.

Stage only the copyright line changes, separate from the ChoreoLib code
restoration and REVLib vendordep update. Verify the staged diff contains
exactly one notice replacement per file and passes git diff --check.

Co-authored-by: Codex <codex@openai.com>
Add the compatible ChoreoLib 2027.0.0-alpha-3 vendordep supplied for the
Systemcore/WPILib 2027 alpha toolchain. Restore the previously disabled
Choreo imports, AutoFactory, LoggedNetworkChooser, and AutoRoutine wiring
in RobotContainer. Keep separate manual, PathPlanner, and Choreo chooser
initialization paths. Return the selected Choreo command from the Choreo
accessor used by Robot.autonomousInit.

Restore the example two-piece routine: load pickupGamepiece and
scoreGamepiece trajectories, reset odometry before the pickup trajectory,
and chain the scoring trajectory after pickup completes. Keep "Nothing"
as the Choreo chooser default. These example trajectory files are not yet
present under src/main/deploy/choreo, so they still need to be supplied
before the two-piece option can drive a path. The configured AutoType
remains MANUAL until explicitly selected for a robot.

Re-enable Drive's Choreo trajectory followers using the 2027
ChassisVelocities API. Adapt SwerveSample.getChassisSpeeds() to the
current vendordep, add X/Y/heading PID feedback to trajectory feedforward,
and convert field-relative velocities to robot-relative commands. Restore
the reusable ChoreoAutoController implementation with continuous heading
input and reset behavior.

Change RobotContainerTest to construct one container in CHOREO mode and
check that it yields an autonomous command. A second RobotContainer in the
same test process would register duplicate WPILib alert IDs, so the
focused test exercises the restored mode directly. Verify the complete
./gradlew test suite and git diff --check with the installed WPILib JDK.

Co-authored-by: Codex <codex@openai.com>
Advance REVLib from 2027.0.0-alpha-8 to 2027.0.0-alpha-9 in the vendordep
metadata. Keep the existing 2027_alpha7 WPILib year, UUID, Maven URLs,
platform declarations, and library names. Update every dependency version
consistently across REVLib-java, the JNI driver and backend components,
REVLib-cpp, and the corresponding C++ driver/backend entries.

Keep this dependency refresh separate from the Az-FIRST copyright notice
update and the ChoreoLib autonomous reintegration so each change can be
reviewed or reverted independently. Validate the vendordep as JSON and
confirm all eight dependency declarations use the same alpha-9 version.
The complete ./gradlew test suite passed with this vendordep installed and
the restored ChoreoLib code present; git diff --check is clean.

Co-authored-by: Codex <codex@openai.com>
Package version 1.1.0 of the FRC BIOCORE High Contrast theme as a VSIX.
Keep the dark teal foundation and FIRST CANOPY season colors while adding
more distinct syntax colors for control flow, operators, functions, types,
properties, constants, strings, numbers, comments, markup, and regular
expressions. Expand semantic token coverage and define workbench colors
for UI roles previously left to VS Code defaults.

Select the theme in workspace settings and put its extension ID first in
the workspace recommendations. Update the README to point at the new
VSIX and explain that the project selects the theme after installation.
The VSIX remains the only new theme artifact in the repository; it does
not auto-install when the project is opened.

Validate the VSIX archive and its embedded theme/package JSON, the
workspace configuration, and git diff --check.

Co-authored-by: Codex <codex@openai.com>
Change Imu to hold the generated ImuIOInputsAutoLogged type and pass it to
Logger.processInputs immediately after the hardware IO update. This records
connection state, yaw and yaw rate, acceleration, latency, and the timestamped
yaw samples consumed by DriveOdometry. In replay mode, AdvantageKit can now
populate those fields from a new recording instead of leaving the no-op IMU
at its disconnected, zero-yaw defaults. Existing logs made before this change
do not contain the IMU input entry and cannot recover those missing samples.

Stop calling AdvantageKit Logger.recordOutput from the Phoenix and Spark
odometry sampling threads. Keep each dropped-sample count in a volatile field
with a package-local snapshot getter, and publish the same existing log keys
from DriveOdometry's main-thread periodic path in real mode. This follows
AdvantageKit's single-threaded logging contract without changing queue
sampling or the concurrent interpolation buffer.

Verify the generated IMU serializer includes the yaw sample arrays. Run the
full offline Gradle test suite with the installed WPILib Java 25 toolchain and
confirm git diff --check is clean.

Co-authored-by: Codex <codex@openai.com>
Remove the inherited roboRIO-era real-time priority changes from Robot
construction and each robot loop. Retain the existing loop timing outputs,
measuring virtual subsystem and scheduler work directly without priority
transition intervals.

Replace the disconnected roboRIO accelerometer stub with a controller IO
backed by WPILib's Systemcore OnboardIMU. Carry its native meters-per-second-
squared readings through the IO contract without multiplying by gravity.
Timestamp samples in nanoseconds, mark non-finite readings invalid, and
record raw controller inputs through AdvantageKit for replay. Rotate the
onboard axes with a renamed Systemcore orientation constant and derive jerk
from the actual sample interval rather than an assumed 20 ms loop.

Rename acceleration outputs from Accel/Rio to Accel/Systemcore, remove the
obsolete fixed sample-rate constant, and update configuration guidance and
the no-op/units tests. Verify the full offline Gradle test suite with the
installed WPILib Java 25 toolchain and check the diff for whitespace errors.

Co-authored-by: Codex <codex@openai.com>
Make the 2027 Systemcore configuration explicit in a supported-configurations
guide linked from the project front door and documentation index. Record the
checked-in COMPBOT, Phoenix/Pigeon, manual-auto, and PhotonVision selections,
along with the limits of each branch. Explain why YAGSL remains deferred despite
the V3 vendordep, why V3 PathPlanner/Choreo are unavailable, and what remains to
be supplied and tuned for the V2 autonomous integrations. Point to the temporary
PhotonVision compatibility note.

Separate the template flywheel from active robot hardware. Add an explicit
ExampleFlywheelHardware selector that defaults to DISABLED. The REAL container
now constructs no flywheel motor controllers until TALON_FX or SPARK_MAX is
deliberately chosen; simulation retains the simulated IO, and replay retains
the no-op IO. Register the right-bumper flywheel command and flywheel SysId
chooser entries only when the example has a simulated or selected physical IO.
Keep the sample CAN and power-port IDs visibly labeled as examples.

Update the constants, autonomous, and SysId guides so the physical bring-up
steps match the runtime defaults. This avoids publishing a characterization
option for an unconnected example mechanism on a real robot while retaining
the example for simulation and deliberate hardware adoption.

Verification: spotlessApply and the complete offline Gradle test suite passed
with the bundled WPILib Java 25 JDK.

Co-authored-by: Codex <codex@openai.com>
Register the Commands V2 scheduler's initialize, finish, and interrupt
callbacks after starting AdvantageKit and before constructing RobotContainer.
Track active commands from those callbacks and publish the active list to
Commands/Active once per robot loop.

Collect lifecycle transitions in order and write them as a Commands/Events
string array after each scheduler run. Keeping all transitions from a loop
in one array preserves commands that start and finish within a single loop
and avoids overwriting earlier events at the same AdvantageKit key. Include
the interrupting command when the scheduler provides one.

Assign stable per-instance command labels so multiple instances with the
same name can be distinguished without relying on VM identity hash values
that change between runs. Retain the existing Field2d telemetry publication
for dashboard compatibility; this commit changes only command logging.

Verify the full offline Gradle test suite with the installed WPILib Java 25
toolchain and confirm git diff --check is clean.

Co-authored-by: Codex <codex@openai.com>
@tbowers7
tbowers7 merged commit 3f151db into develop Oct 30, 2026
5 checks passed
@tbowers7
tbowers7 deleted the alpha8 branch October 30, 2026 23:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant