Changelog¶
All notable changes to ValleyLib. Versions correspond to Git tags consumed through JitPack.
2.0.0 — 2026-09-19¶
The first ValleyLib release for BIOBUZZ, the 2026-2027 FIRST Tech Challenge season. Start the season here: 1.0.8 and earlier target the previous season's Pedro Pathing and FTC SDK.
Moves the pedro package to Pedro Pathing 3. Pedro 3 is a breaking rewrite of the pathing API, so this release is breaking too — see the Pedro 2 → Pedro 3 table for the full mapping. ValleyLib 1.0.8 remains the release for teams staying on Pedro 2.x.
Changed¶
- FTC SDK 11.1.0 → 12.0.0, the BIOBUZZ-season SDK. It stays
compileOnly, so your TeamCode project still supplies the SDK at build time — but ValleyLib now compiles against the same season's API you do. - Dependencies:
com.pedropathing:ftc:2.0.6→com.pedropathing:core:3.0.1+com.pedropathing:revhub:3.0.1(Pedro 3 split the platform-agnostic follower from the REV-hub hardware layer). Both resolve from Maven Central, so themaven.pedropathing.comrepository is no longer needed. PathChain→PaththroughoutPedroSubsystem,FollowPathCommand,PedroCommands, andPedroAutoDsl.maxPower→maxSpeed, and it means what it says. Pedro 3 removedFollower.setMaxPower; a cap is nowmaxPathSpeed, a fraction of the robot's maximum achievable velocity.follow(path, maxSpeed)attaches it to the path as a Pedro modifier, so Pedro reverts it when the path ends — an interrupted path can no longer leave the robot permanently slow.setMaxPower(p)is nowsetMaxSpeed(p).follow(path)no longer forces full power. It attaches no cap at all, leaving whatever your Pedro configuration sets.PedroSubsystem.stop()is a plain action;stopCommand()is the command form. (The oldsetMaxPowerwas the only command factory with this shape, anddrive::stopinfinallyDo(...)silently built a command instead of stopping.)PedroMigrationSampleandSampleAutosrebuilt on the Pedro 3PathsAPI.
Fixed¶
- An interrupted
FollowPathCommandnow stops the follower. Because the follower lives in the subsystem andperiodic()updates it every cycle, a preempted path used to keep driving — a teleop path binding that lost its requirement carried on to the end of its path. waitUntilIdle()no longer hangs. Pedro 3 clears the follower's busy flag only while it holds the end of a path; withholdEnd = false, or afterstop()ormanual(...), the flag never clears and the old!follower.isBusy()check waited forever. The rule now also reads the follower's mode.
Added¶
FollowerState.isIdle(follower)— the "is the drive done?" rule in one place, with tests against a real Pedro 3Follower.PedroSubsystem.isIdle(),getPose(),withSpeedLimit(path, maxSpeed).
Removed¶
com.pedropathing:telemetry:1.0.0from theapidependencies. It is a Pedro 2-era artifact that ValleyLib never referenced. Pedro 3's companion iscom.pedropathing:tuning; add it to your TeamCode project directly if you want Pedro's tuners.
1.0.8 — 2026-09-11¶
Added¶
StateMachinecommand (core.fsm): enum-keyed finite state machine with per-state commands,onEnter/onExithooks, condition / finish / timeout / global transitions, terminal states, transition listeners,forceState, and an allocation-free hot path. See Finite State Machines.- Controllable time (
core.time):Clock,RobotClock, andManualClock. Every timed behavior (WaitCommand,withTimeout,StateMachine,Trigger.debounce,TimedCommand,PIDFController,Motor.Encoder) now readsRobotClock, making it deterministic under a manual clock in tests. FunctionalCommand: lambda-per-phase command with requirements; the primitive behind all factories.- Command names:
Command.getName()/withName(...),NamedCommand. Factory commands are named (Intake.startEnd,Wait(0.5s),StateMachine[SCORE]); decorators preserve the inner name;FtcCommandLoggerlogs names. Commands.runEnd(...)andSubsystem...requirement overloads onCommands.runOnce/run/startEnd/runEnd.Subsystem.idle()andSubsystem.getName().- GitHub Pages deployment of the documentation site on every push to
master.
Changed¶
TimedCommandno longer depends on Pedro Pathing'sTimer.- Removed the orphaned
app/Android application module and templateExample*Teststubs.
1.0.7 — 2026-08-23¶
Fixed¶
- Decorator interruption semantics: commands cut short by
withTimeout,until,onlyWhile, a lostraceWith, or a completeddeadlineWithnow receiveend(true); natural finishes receiveend(false)exactly once. FixesRaceCommand,TimeoutCommand,UntilCommand,OnlyWhileCommand,UnlessCommand, andDeadlineCommand. CommandOpMode.init()fully resets the scheduler, closing a cross-OpMode leak of subsystems, default commands, and listeners.- JUnit 5 discovery in the FTC module (its tests had never run).
PIDFController.setSetPointNaN/Infinity velocity error before the firstcalculate().Motor.Encodervelocity/acceleration timestamp corruption.
Added¶
- Subsystem command factories:
runOnce,run,startEnd,runEnd(requirement-carrying). - Trigger auto-registration with
TriggerManager.getDefault();TriggerimplementsBooleanSupplier; idempotentbind(). - Full gamepad button coverage (
start,back,guide, stick clicks) with PlayStation aliases; cast-free fluent configuration. CommandOpMode.initLoop()andonStart()hooks with init-phase telemetry flushing.CommandScheduler.getScheduledCommands()/requiring(); allocation-free run loop.FtcTelemetryBus.clear().- Complete MkDocs documentation site; CI workflow.
1.0.6¶
- Last release before the documentation site. Usable.
1.0.2¶
- Usable but deprecated.
1.0.0 – 1.0.5 (except 1.0.2)¶
- Packaging defects; do not use.