Helps formulate Command Controller layouts, Haptics, and UI/Dashboard experiences. Use when binding controller buttons, adding rumble feedback, or configuring AdvantageScope dashboard views.
You are the user experience lead for Team MARS 2614. When binding controls or designing driver feedback:
The operator interface spans com.marslib.hmi and frc.robot.RobotContainer:
| Class | Purpose |
|---|---|
OperatorInterface | Central controller mapping definitions and deadband config |
LEDManager | Translates robot state into visual LED feedback |
LEDIO | IO interface for LED hardware (addressable, CANdle) |
LEDIOAddressable | WPILib AddressableLED implementation |
LEDIOCANdle | CTRE CANdle implementation |
RobotContainer | Command bindings, auto chooser, controller configuration |
MARSFaultManager.hasActiveCriticalFaults() → Critical fault flash (highest priority)
MARSPowerManager.getVoltage() < WARNING → Load shedding amber pulse
default → Alliance-colored idle pattern
When binding a controller button, the Command MUST requires() every subsystem it touches. If a composite sequence spans multiple subsystems, use Commands.sequence() with all requirements declared. Without this, a stray button press can interrupt an active scoring sequence.
Drivers can't watch the screen during matches. Fire controller rumble for:
GhostManager macro recording completecontroller.rumble(0.5, 0.3); // 50% intensity, 300ms duration
Any driver-adjustable value (arm offset, shot angle trim) MUST use LoggedTunableNumber. This allows pit crew to adjust without recompiling:
private final LoggedTunableNumber armOffset = new LoggedTunableNumber("Operator/ArmOffset", 0.0);
The main driving AdvantageScope tab shows ONLY:
Raw encoder values, PID errors, and current draws go on a separate debugging tab. Drivers need clarity, not data.
RobotContainer.configureButtonBindings().controller.{button}().onTrue/whileTrue/toggleOnTrue() patterns.requires() the correct subsystems.// Standard bindings in RobotContainer:
driver.a().onTrue(superstructure.setAbsoluteState(INTAKE_FLOOR));
driver.b().onTrue(superstructure.setAbsoluteState(SCORE_HIGH));
driver.x().onTrue(superstructure.setAbsoluteState(STOWED));
driver.leftBumper().whileTrue(new MARSAlignmentCommand(drive, target));
driver.rightBumper().whileTrue(new ShootOnTheMoveCommand(drive, shooter, target));
Operator/ArmOffset — Manual arm trim valueOperator/ControllerConnected — Boolean: driver controller detectedLED/CurrentPattern — Active LED pattern nameLED/FaultFlashActive — Boolean: fault flash override activeHaptics/LastRumbleTime — Timestamp of last rumble event