Work in progress. This library and its docs are new and still changing, and some parts are not yet tested on a real robot. Something wrong or unclear?Tell us (a GitHub issue).
Coming from last season's code
The library started from the 2025-26 (DECODE) robot code, branch codex/biobuzz-base of the
team’s FtcRobotController repository. This page is for programmers who know that code. New to it?
Start with the Quick start instead.
This table shows where each reusable part went and what changed. Game-specific code (launcher, feed, intake, vision, routes) is NOT in the library.
| Last season | Now | What changed |
|---|---|---|
input/ControllerBindings |
gamepad.ControllerBindings |
Same bindPress/bindHold/bindToggle/bindTriggerPress/bindTriggerAxis. New: bindRelease, bindTriggerHold, setTriggerThreshold, ignoreHeldButtons (replaces the per-button “seeded” press), isDown, GUIDE and TOUCHPAD buttons. Fixed: trigger presses no longer borrow the bumper’s slot. registerExtraButtonReader is now registerExtraButton. |
input/DriveInputScaling.slowScale |
gamepad.StickShaping.slowScale(trigger, slowest) |
The slowest speed is a parameter instead of a static setting. New: curve, shape. |
input/ReverseDriveControl |
drive.ReverseDrive |
No longer binds a button itself; you bind it (see drive.md). |
utils/RumbleNotifier |
gamepad.AimRumble |
Same feel and defaults. setMinMax is now setFeel; setActive is setEnabled. |
utils/ToggleRumble |
gamepad.ToggleRumble |
Pattern is set with setPattern instead of a static config class. isConfirming is now isPlaying. |
drive/MecanumMixer |
drive.MecanumMixer |
Same mix. fieldVector is now fieldDirection. New: fieldToRobot for field-centric TeleOp. |
drive/MecanumDrive |
drive.MecanumDrive |
Takes a DriveConfig object instead of the static RobotConfig. New: driveFieldCentric, setPowers, setBrake. |
drive/Drivebase (Auto helpers) |
drive.AutoDrive |
Settings come from AutoDriveConfig (same default numbers as DriveTuning). moveWithTwist is now moveWithTurn. New: turnTo, a Result for each move. Changes below. |
config/DriveTuning |
drive.AutoDriveConfig |
Fields renamed in plain words, for example TURN_KP is turnKp, AUTO_MOVE_MIN_SPEED is moveMinPower. |
odometry/FieldPose, odometry/PoseStore |
util.FieldPose, util.PoseStore |
setLastKnownPose/consumeLastKnownPose are now save/consume; peek, has and clear remain. |
auto/BaseAuto + AutoSequence |
auto.AutoRoutine, auto.EasyAuto |
Same idea (a chain of named steps, endgame/park reserve, remembered heading). Game steps (fire, intake rows) are gone: mechanisms give their own steps. Steps are mirrored for RED by the routine. |
subsystems/Launcher, control/FiringController, config/AutoRpmConfig |
launcher.Flywheel, launcher.Launcher, launcher.ShotTable |
General versions: RPM with settle time and shot detection; readiness gating with named checks and a give-up reason; distance table with hood angles. |
subsystems/Feed |
launcher.MotorFeeder, launcher.ServoFeeder (Feeder interface) |
One piece per call; the launcher decides when. |
subsystems/Intake jam logic |
mechanism.SpinMotor, safety.JamDetector |
General jam detection and back-out; the DECODE packing states are not included. |
vision/* |
vision.WebcamTags, vision.LimelightTags, vision.AimController |
Rewritten for SDK 12 (single tags and clusters). Bearing is + = left for both cameras. No field localization (BIOBUZZ tags move). |
Alliance, TeleOp_Blue/TeleOp_Red |
match.Alliance, match.MatchMemory |
One TeleOp for both alliances: it reads the alliance autonomous chose. |
| TeleOp auto-stop timer | match.MatchTimer |
Countdown with cues and gamepad buzzes. |
config/* tunables + FTC Dashboard |
tuning.Tunable, tuning.TuningMenu, core.Profile |
Tune from the gamepad, saved on the hub; Dashboard still optional. |
| (new) | drive.TankDrive (standard drive), safety.SafeMotor, control.PidController, control.SlewRateLimiter, telemetry.TelemetryHelper, hardware.* |
New helpers. |
Behavior changes in AutoDrive (on purpose)
Section titled “Behavior changes in AutoDrive (on purpose)”- Power limit:
DriveConfig.powerLimitnow applies to every autonomous move and turn. - Diagonal distance: distance is measured from the real forward and sideways travel. Before, a 45 degree
move stopped short (about 17 of 24 inches), and the strafe correction had no effect on pure strafes.
The sideways power is also raised by
strafeCorrection, so diagonals keep their direction. Re-tunestrafeCorrectionwith the steps in drive.md. - moveWithTurn only finishes its turn after a successful move, and inside the same time limit. Before, a stuck robot could start turning, and the time limit could nearly double.
- Negative distance now drives the opposite way. Before,
move(-10, 0, ...)drove FORWARD 10 inches. - Stall check looks at progress over a time window (0.25 in within 0.4 s by default). Before, it checked each loop, so a fast loop could wrongly decide a slow-moving robot was stuck.
AUTO_STALL_VELOCITY_EPSILONis gone;stallProgressInandstallTimeSecdo the whole job.turnMinPower(new, default 0 = old behavior) can stop turns from stalling just short.- Every move returns
DONE,STALLED,TIMED_OUTorSTOPPED. - Unused leftovers (
setRunToPosition,restoreBaseRunMode, the TeleOpdrive()inside Drivebase) were removed. For TeleOp, useMecanumDrive.