From 65c5bc390e082602bce33e04414a534d06d37a78 Mon Sep 17 00:00:00 2001 From: HeroMaster137 <73035479+HeroMaster137@users.noreply.github.com> Date: Fri, 16 Jan 2026 17:30:04 -0800 Subject: [PATCH 1/6] Added climber code with 3 commands --- src/main/java/frc/robot/RobotContainer.java | 9 +++ .../frc/robot/subsystems/climber/Climber.java | 74 +++++++++++++++++++ .../frc/robot/subsystems/shooter/Shooter.java | 1 - 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/main/java/frc/robot/subsystems/climber/Climber.java diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index a13e5f0..db3dfca 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -40,6 +40,7 @@ import frc.robot.lib.subsystem.angular.AngularIOTalonFX; import frc.robot.lib.subsystem.angular.AngularSubsystem; import frc.robot.subsystems.SuperstructureVisualizer; +import frc.robot.subsystems.climber.Climber; import frc.robot.subsystems.drive.Drive; import frc.robot.subsystems.drive.GyroIO; import frc.robot.subsystems.drive.GyroIOPigeon2; @@ -73,6 +74,7 @@ public class RobotContainer { private final Vision vision; private final Shooter shooter; private final Intake intake; + private final Climber climber; private final RobotSuperstructure superstructure; @@ -133,6 +135,7 @@ public RobotContainer() { FlywheelConstants.kSubsystemConfigReal), drive::getPose, drive::getPoseVelocity); + climber = new Climber(); break; case SIM: @@ -174,6 +177,7 @@ public RobotContainer() { FlywheelConstants.kSubsystemConfigSim), drive::getPose, drive::getPoseVelocity); + climber = new Climber(); break; default: @@ -189,6 +193,7 @@ public RobotContainer() { new Vision(drive::addVisionMeasurement, new VisionIO() {} /* , new VisionIO() {} */); intake = new Intake(); shooter = new Shooter(drive::getPose, drive::getPoseVelocity); + climber = new Climber(); break; } @@ -258,6 +263,10 @@ private void configureButtonBindings() { // Intake controls controller.buttonA.onTrue(superstructure.intakeDeploy()); controller.buttonA.onFalse(superstructure.intakeStowed()); + + controller.buttonY.onTrue(climber.down()); + controller.leftBumper.onTrue(climber.rightUp()); + controller.rightBumper.onTrue(climber.rightUp()); } private void logInit() { diff --git a/src/main/java/frc/robot/subsystems/climber/Climber.java b/src/main/java/frc/robot/subsystems/climber/Climber.java new file mode 100644 index 0000000..28e30bd --- /dev/null +++ b/src/main/java/frc/robot/subsystems/climber/Climber.java @@ -0,0 +1,74 @@ +package frc.robot.subsystems.climber; + +import com.ctre.phoenix6.configs.MotionMagicConfigs; +import com.ctre.phoenix6.configs.Slot0Configs; +import com.ctre.phoenix6.configs.TalonFXConfiguration; +import com.ctre.phoenix6.controls.MotionMagicVoltage; +import com.ctre.phoenix6.hardware.TalonFX; +import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.SubsystemBase; + +public class Climber extends SubsystemBase { + public final TalonFX climber1 = new TalonFX(0); + public final TalonFX climber2 = new TalonFX(0); + + private final TalonFXConfiguration talonFXConfigs = new TalonFXConfiguration(); + private Slot0Configs slot0Configs = talonFXConfigs.Slot0; + private MotionMagicConfigs motionMagicConfigs = talonFXConfigs.MotionMagic; + private final MotionMagicVoltage m_request = new MotionMagicVoltage(0); + + private boolean left = false; + private boolean right = false; + + private double upAngle = 10; + + public Climber() { + slot0Configs.kS = 0; + slot0Configs.kV = 0; + slot0Configs.kA = 0; + slot0Configs.kP = 5; + slot0Configs.kI = 0; + slot0Configs.kD = 0; + + motionMagicConfigs.MotionMagicCruiseVelocity = 80; + motionMagicConfigs.MotionMagicAcceleration = 160; + motionMagicConfigs.MotionMagicJerk = 1600; + + climber1.getConfigurator().apply(talonFXConfigs); + climber2.getConfigurator().apply(talonFXConfigs); + + setDefaultCommand(setAngle()); + } + + private Command setAngle() { + return run( + () -> { + climber1.setControl(m_request.withPosition(left ? upAngle : 0)); + climber2.setControl(m_request.withPosition(right ? upAngle : 0)); + }); + } + + public Command leftUp() { + return runOnce( + () -> { + left = true; + right = false; + }); + } + + public Command rightUp() { + return runOnce( + () -> { + left = false; + right = true; + }); + } + + public Command down() { + return runOnce( + () -> { + left = false; + right = false; + }); + } +} diff --git a/src/main/java/frc/robot/subsystems/shooter/Shooter.java b/src/main/java/frc/robot/subsystems/shooter/Shooter.java index da7c435..5b6f79f 100644 --- a/src/main/java/frc/robot/subsystems/shooter/Shooter.java +++ b/src/main/java/frc/robot/subsystems/shooter/Shooter.java @@ -43,7 +43,6 @@ public class Shooter extends VirtualSubsystem implements AllianceUpdatedObserver private Supplier robotPose; private Supplier robotVel; - /** Creates a new Shooter. */ public Shooter(Supplier robotPose, Supplier robotVel) { this( From 74b9456237740a6f7488f6d6c6dbc7009409d832 Mon Sep 17 00:00:00 2001 From: HeroMaster137 <73035479+HeroMaster137@users.noreply.github.com> Date: Mon, 19 Jan 2026 09:46:03 -0800 Subject: [PATCH 2/6] Changed commands to just up and down --- src/main/java/frc/robot/RobotContainer.java | 5 ++-- .../frc/robot/subsystems/climber/Climber.java | 27 +++++++------------ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index db3dfca..68ef169 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -264,9 +264,8 @@ private void configureButtonBindings() { controller.buttonA.onTrue(superstructure.intakeDeploy()); controller.buttonA.onFalse(superstructure.intakeStowed()); - controller.buttonY.onTrue(climber.down()); - controller.leftBumper.onTrue(climber.rightUp()); - controller.rightBumper.onTrue(climber.rightUp()); + controller.leftBumper.onTrue(climber.down()); + controller.rightBumper.onTrue(climber.up()); } private void logInit() { diff --git a/src/main/java/frc/robot/subsystems/climber/Climber.java b/src/main/java/frc/robot/subsystems/climber/Climber.java index 28e30bd..d340df4 100644 --- a/src/main/java/frc/robot/subsystems/climber/Climber.java +++ b/src/main/java/frc/robot/subsystems/climber/Climber.java @@ -17,8 +17,7 @@ public class Climber extends SubsystemBase { private MotionMagicConfigs motionMagicConfigs = talonFXConfigs.MotionMagic; private final MotionMagicVoltage m_request = new MotionMagicVoltage(0); - private boolean left = false; - private boolean right = false; + private boolean up = false; private double upAngle = 10; @@ -29,6 +28,7 @@ public Climber() { slot0Configs.kP = 5; slot0Configs.kI = 0; slot0Configs.kD = 0; + slot0Configs.kG = 0; motionMagicConfigs.MotionMagicCruiseVelocity = 80; motionMagicConfigs.MotionMagicAcceleration = 160; @@ -37,38 +37,31 @@ public Climber() { climber1.getConfigurator().apply(talonFXConfigs); climber2.getConfigurator().apply(talonFXConfigs); + climber1.setPosition(0); + climber2.setPosition(0); + setDefaultCommand(setAngle()); } private Command setAngle() { return run( () -> { - climber1.setControl(m_request.withPosition(left ? upAngle : 0)); - climber2.setControl(m_request.withPosition(right ? upAngle : 0)); - }); - } - - public Command leftUp() { - return runOnce( - () -> { - left = true; - right = false; + climber1.setControl(m_request.withPosition(up ? upAngle : 0)); + climber2.setControl(m_request.withPosition(up ? upAngle : 0)); }); } - public Command rightUp() { + public Command up() { return runOnce( () -> { - left = false; - right = true; + up = true; }); } public Command down() { return runOnce( () -> { - left = false; - right = false; + up = false; }); } } From aa4bf1c75a43e02d2700deff064b0fd3d96c578c Mon Sep 17 00:00:00 2001 From: Grant Lee Date: Tue, 20 Jan 2026 16:59:51 -0800 Subject: [PATCH 3/6] Made CANdle subsystem commands can get added later --- .../robot/subsystems/CANdle/CANdleSystem.java | 43 +++++ vendordeps/Phoenix5-5.36.0.json | 171 ++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java create mode 100644 vendordeps/Phoenix5-5.36.0.json diff --git a/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java b/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java new file mode 100644 index 0000000..f6ee811 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java @@ -0,0 +1,43 @@ +package frc.robot.subsystems.CANdle; + +import com.ctre.phoenix6.configs.CANdleConfiguration; +import com.ctre.phoenix6.controls.*; +import com.ctre.phoenix6.hardware.CANdle; +import com.ctre.phoenix6.signals.RGBWColor; +import com.ctre.phoenix6.signals.StatusLedWhenActiveValue; +import com.ctre.phoenix6.signals.StripTypeValue; +import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; +import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.SubsystemBase; + +public class CANdleSystem extends SubsystemBase { + + private static final int SlotStartIdx = 8; + private static final int SlotEndIdx = 37; + + private final CANdle m_candle = new CANdle(1, "rio"); + + public CANdleSystem() { + var candleconfig = new CANdleConfiguration(); + + candleconfig.LED.StripType = StripTypeValue.GRB; + candleconfig.LED.BrightnessScalar = 0.5; + + candleconfig.CANdleFeatures.StatusLedWhenActive = StatusLedWhenActiveValue.Disabled; + + m_candle.getConfigurator().apply(candleconfig); + + for (int i = 0; i < 24; ++i) { + m_candle.setControl(new EmptyAnimation(i)); + } + } + + private Command setAnimFlow() { + return run(() -> { + m_candle.setControl( + new ColorFlowAnimation(SlotStartIdx, SlotEndIdx) + .withSlot(0) + .withColor(new RGBWColor(0, 217, 0, 0))); + }); + } +} diff --git a/vendordeps/Phoenix5-5.36.0.json b/vendordeps/Phoenix5-5.36.0.json new file mode 100644 index 0000000..c60dd4c --- /dev/null +++ b/vendordeps/Phoenix5-5.36.0.json @@ -0,0 +1,171 @@ +{ + "fileName": "Phoenix5-5.36.0.json", + "name": "CTRE-Phoenix (v5)", + "version": "5.36.0", + "frcYear": "2026", + "uuid": "ab676553-b602-441f-a38d-f1296eff6537", + "mavenUrls": [ + "https://maven.ctr-electronics.com/release/" + ], + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2026-latest.json", + "requires": [ + { + "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", + "errorMessage": "Phoenix 5 requires low-level libraries from Phoenix 6. Please add the Phoenix 6 vendordep before adding Phoenix 5.", + "offlineFileName": "Phoenix6-frc2026-latest.json", + "onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2026-latest.json" + } + ], + "conflictsWith": [ + { + "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", + "errorMessage": "Users must use the Phoenix 5 replay vendordep when using the Phoenix 6 replay vendordep.", + "offlineFileName": "Phoenix6-replay-frc2026-latest.json" + }, + { + "uuid": "fbc886a4-2cec-40c0-9835-71086a8cc3df", + "errorMessage": "Users cannot have both the replay and regular Phoenix 5 vendordeps in their robot program.", + "offlineFileName": "Phoenix5-replay-frc2026-latest.json" + } + ], + "javaDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "api-java", + "version": "5.36.0" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "wpiapi-java", + "version": "5.36.0" + } + ], + "jniDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "cci", + "version": "5.36.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "cci-sim", + "version": "5.36.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ], + "cppDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "wpiapi-cpp", + "version": "5.36.0", + "libName": "CTRE_Phoenix_WPI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "api-cpp", + "version": "5.36.0", + "libName": "CTRE_Phoenix", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "cci", + "version": "5.36.0", + "libName": "CTRE_PhoenixCCI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "wpiapi-cpp-sim", + "version": "5.36.0", + "libName": "CTRE_Phoenix_WPISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "api-cpp-sim", + "version": "5.36.0", + "libName": "CTRE_PhoenixSim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "cci-sim", + "version": "5.36.0", + "libName": "CTRE_PhoenixCCISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ] +} From 32851e19b7915d91db82807787d22992efb04cc1 Mon Sep 17 00:00:00 2001 From: 0verkil <112268976+0verkil@users.noreply.github.com> Date: Tue, 20 Jan 2026 18:29:54 -0800 Subject: [PATCH 4/6] feat: io layers for CANdle + robot integration --- src/main/java/frc/robot/RobotContainer.java | 7 ++++ .../robot/subsystems/CANdle/CANdleSystem.java | 20 ++++----- .../robot/subsystems/CANdle/io/CANdleIO.java | 19 +++++++++ .../subsystems/CANdle/io/CANdleIOReal.java | 42 +++++++++++++++++++ .../subsystems/CANdle/io/CANdleIOSim.java | 19 +++++++++ 5 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java create mode 100644 src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java create mode 100644 src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 68ef169..7291cb4 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -40,6 +40,9 @@ import frc.robot.lib.subsystem.angular.AngularIOTalonFX; import frc.robot.lib.subsystem.angular.AngularSubsystem; import frc.robot.subsystems.SuperstructureVisualizer; +import frc.robot.subsystems.CANdle.CANdleSystem; +import frc.robot.subsystems.CANdle.io.CANdleIOReal; +import frc.robot.subsystems.CANdle.io.CANdleIOSim; import frc.robot.subsystems.climber.Climber; import frc.robot.subsystems.drive.Drive; import frc.robot.subsystems.drive.GyroIO; @@ -75,6 +78,7 @@ public class RobotContainer { private final Shooter shooter; private final Intake intake; private final Climber climber; + private final CANdleSystem candle; private final RobotSuperstructure superstructure; @@ -136,6 +140,7 @@ public RobotContainer() { drive::getPose, drive::getPoseVelocity); climber = new Climber(); + candle = new CANdleSystem(new CANdleIOReal()); break; case SIM: @@ -178,6 +183,7 @@ public RobotContainer() { drive::getPose, drive::getPoseVelocity); climber = new Climber(); + candle = new CANdleSystem(new CANdleIOSim()); break; default: @@ -194,6 +200,7 @@ public RobotContainer() { intake = new Intake(); shooter = new Shooter(drive::getPose, drive::getPoseVelocity); climber = new Climber(); + candle = new CANdleSystem(); break; } diff --git a/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java b/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java index f6ee811..db9ad14 100644 --- a/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java +++ b/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java @@ -9,32 +9,26 @@ import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.SubsystemBase; +import frc.robot.subsystems.CANdle.io.CANdleIO; public class CANdleSystem extends SubsystemBase { private static final int SlotStartIdx = 8; private static final int SlotEndIdx = 37; - private final CANdle m_candle = new CANdle(1, "rio"); + private final CANdleIO io; public CANdleSystem() { - var candleconfig = new CANdleConfiguration(); - - candleconfig.LED.StripType = StripTypeValue.GRB; - candleconfig.LED.BrightnessScalar = 0.5; - - candleconfig.CANdleFeatures.StatusLedWhenActive = StatusLedWhenActiveValue.Disabled; - - m_candle.getConfigurator().apply(candleconfig); + this(new CANdleIO() {}); + } - for (int i = 0; i < 24; ++i) { - m_candle.setControl(new EmptyAnimation(i)); - } + public CANdleSystem(CANdleIO io) { + this.io = io; } private Command setAnimFlow() { return run(() -> { - m_candle.setControl( + io.setControl( new ColorFlowAnimation(SlotStartIdx, SlotEndIdx) .withSlot(0) .withColor(new RGBWColor(0, 217, 0, 0))); diff --git a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java new file mode 100644 index 0000000..4f8def4 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java @@ -0,0 +1,19 @@ +package frc.robot.subsystems.CANdle.io; + +import org.littletonrobotics.junction.AutoLog; + +import com.ctre.phoenix.led.Animation; +import com.ctre.phoenix6.controls.ControlRequest; + +public interface CANdleIO { + + @AutoLog + static class CANdleIOInputs { + public ControlRequest animation; + } + + default void setControl(ControlRequest request) {}; + + default void updateInputs(CANdleIOInputs inputs) {}; + +} \ No newline at end of file diff --git a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java new file mode 100644 index 0000000..4e89487 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java @@ -0,0 +1,42 @@ +package frc.robot.subsystems.CANdle.io; + +import com.ctre.phoenix6.configs.CANdleConfiguration; +import com.ctre.phoenix6.controls.ControlRequest; +import com.ctre.phoenix6.controls.EmptyAnimation; +import com.ctre.phoenix6.hardware.CANdle; +import com.ctre.phoenix6.signals.StatusLedWhenActiveValue; +import com.ctre.phoenix6.signals.StripTypeValue; + +public class CANdleIOReal implements CANdleIO { + + private final CANdle m_candle = new CANdle(1, "rio"); + private ControlRequest request; + + public CANdleIOReal() { + var candleconfig = new CANdleConfiguration(); + + candleconfig.LED.StripType = StripTypeValue.GRB; + candleconfig.LED.BrightnessScalar = 0.5; + + candleconfig.CANdleFeatures.StatusLedWhenActive = StatusLedWhenActiveValue.Disabled; + + m_candle.getConfigurator().apply(candleconfig); + + for (int i = 0; i < 24; ++i) { + m_candle.setControl(new EmptyAnimation(i)); + } + request = new EmptyAnimation(0); + } + + @Override + public void setControl(ControlRequest request) { + m_candle.setControl(request); + this.request = request; + }; + + @Override + public void updateInputs(CANdleIOInputs inputs) { + inputs.animation = request; + }; + +} diff --git a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java new file mode 100644 index 0000000..0995d66 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java @@ -0,0 +1,19 @@ +package frc.robot.subsystems.CANdle.io; + +import com.ctre.phoenix6.controls.ControlRequest; + +public class CANdleIOSim implements CANdleIO { + + private ControlRequest request; + + @Override + public void setControl(ControlRequest request) { + this.request = request; + }; + + @Override + public void updateInputs(CANdleIOInputs inputs) { + inputs.animation = request; + }; + +} From a65d8400895b59ae77ee29bcbb9b181fa63dd735 Mon Sep 17 00:00:00 2001 From: 0verkil <112268976+0verkil@users.noreply.github.com> Date: Tue, 20 Jan 2026 18:42:26 -0800 Subject: [PATCH 5/6] fix: actually update led inputs --- src/main/java/frc/robot/RobotContainer.java | 2 +- .../robot/subsystems/CANdle/CANdleSystem.java | 16 +++--- .../robot/subsystems/CANdle/io/CANdleIO.java | 21 ++++---- .../subsystems/CANdle/io/CANdleIOReal.java | 49 ++++++++++--------- .../subsystems/CANdle/io/CANdleIOSim.java | 21 ++++---- 5 files changed, 57 insertions(+), 52 deletions(-) diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 7291cb4..99822de 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -39,10 +39,10 @@ import frc.robot.lib.subsystem.angular.AngularIOSim; import frc.robot.lib.subsystem.angular.AngularIOTalonFX; import frc.robot.lib.subsystem.angular.AngularSubsystem; -import frc.robot.subsystems.SuperstructureVisualizer; import frc.robot.subsystems.CANdle.CANdleSystem; import frc.robot.subsystems.CANdle.io.CANdleIOReal; import frc.robot.subsystems.CANdle.io.CANdleIOSim; +import frc.robot.subsystems.SuperstructureVisualizer; import frc.robot.subsystems.climber.Climber; import frc.robot.subsystems.drive.Drive; import frc.robot.subsystems.drive.GyroIO; diff --git a/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java b/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java index db9ad14..9c6d1c4 100644 --- a/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java +++ b/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java @@ -1,15 +1,11 @@ package frc.robot.subsystems.CANdle; -import com.ctre.phoenix6.configs.CANdleConfiguration; import com.ctre.phoenix6.controls.*; -import com.ctre.phoenix6.hardware.CANdle; import com.ctre.phoenix6.signals.RGBWColor; -import com.ctre.phoenix6.signals.StatusLedWhenActiveValue; -import com.ctre.phoenix6.signals.StripTypeValue; -import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.SubsystemBase; import frc.robot.subsystems.CANdle.io.CANdleIO; +import frc.robot.subsystems.CANdle.io.CANdleIOInputsAutoLogged; public class CANdleSystem extends SubsystemBase { @@ -17,6 +13,7 @@ public class CANdleSystem extends SubsystemBase { private static final int SlotEndIdx = 37; private final CANdleIO io; + private final CANdleIOInputsAutoLogged inputs; public CANdleSystem() { this(new CANdleIO() {}); @@ -24,10 +21,17 @@ public CANdleSystem() { public CANdleSystem(CANdleIO io) { this.io = io; + this.inputs = new CANdleIOInputsAutoLogged(); + } + + @Override + public void periodic() { + this.io.updateInputs(inputs); } private Command setAnimFlow() { - return run(() -> { + return run( + () -> { io.setControl( new ColorFlowAnimation(SlotStartIdx, SlotEndIdx) .withSlot(0) diff --git a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java index 4f8def4..d98e70c 100644 --- a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java +++ b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java @@ -1,19 +1,18 @@ package frc.robot.subsystems.CANdle.io; -import org.littletonrobotics.junction.AutoLog; - -import com.ctre.phoenix.led.Animation; import com.ctre.phoenix6.controls.ControlRequest; +import org.littletonrobotics.junction.AutoLog; public interface CANdleIO { - @AutoLog - static class CANdleIOInputs { - public ControlRequest animation; - } - - default void setControl(ControlRequest request) {}; + @AutoLog + static class CANdleIOInputs { + public String animationName; + } - default void updateInputs(CANdleIOInputs inputs) {}; + default void setControl(ControlRequest request) {} + ; -} \ No newline at end of file + default void updateInputs(CANdleIOInputs inputs) {} + ; +} diff --git a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java index 4e89487..6a08902 100644 --- a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java +++ b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java @@ -9,34 +9,35 @@ public class CANdleIOReal implements CANdleIO { - private final CANdle m_candle = new CANdle(1, "rio"); - private ControlRequest request; + private final CANdle m_candle = new CANdle(1, "rio"); + private ControlRequest request; - public CANdleIOReal() { - var candleconfig = new CANdleConfiguration(); + public CANdleIOReal() { + var candleconfig = new CANdleConfiguration(); - candleconfig.LED.StripType = StripTypeValue.GRB; - candleconfig.LED.BrightnessScalar = 0.5; + candleconfig.LED.StripType = StripTypeValue.GRB; + candleconfig.LED.BrightnessScalar = 0.5; - candleconfig.CANdleFeatures.StatusLedWhenActive = StatusLedWhenActiveValue.Disabled; + candleconfig.CANdleFeatures.StatusLedWhenActive = StatusLedWhenActiveValue.Disabled; - m_candle.getConfigurator().apply(candleconfig); + m_candle.getConfigurator().apply(candleconfig); - for (int i = 0; i < 24; ++i) { - m_candle.setControl(new EmptyAnimation(i)); - } - request = new EmptyAnimation(0); + for (int i = 0; i < 24; ++i) { + m_candle.setControl(new EmptyAnimation(i)); } - - @Override - public void setControl(ControlRequest request) { - m_candle.setControl(request); - this.request = request; - }; - - @Override - public void updateInputs(CANdleIOInputs inputs) { - inputs.animation = request; - }; - + request = new EmptyAnimation(0); + } + + @Override + public void setControl(ControlRequest request) { + m_candle.setControl(request); + this.request = request; + } + ; + + @Override + public void updateInputs(CANdleIOInputs inputs) { + inputs.animationName = request.getName(); + } + ; } diff --git a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java index 0995d66..0207b2e 100644 --- a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java +++ b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java @@ -4,16 +4,17 @@ public class CANdleIOSim implements CANdleIO { - private ControlRequest request; + private ControlRequest request; - @Override - public void setControl(ControlRequest request) { - this.request = request; - }; + @Override + public void setControl(ControlRequest request) { + this.request = request; + } + ; - @Override - public void updateInputs(CANdleIOInputs inputs) { - inputs.animation = request; - }; - + @Override + public void updateInputs(CANdleIOInputs inputs) { + inputs.animationName = request.getName(); + } + ; } From 97f791082420014e6c635d046b7350095332beeb Mon Sep 17 00:00:00 2001 From: 0verkil <112268976+0verkil@users.noreply.github.com> Date: Wed, 21 Jan 2026 18:34:15 -0800 Subject: [PATCH 6/6] fix: log inputs and flesh out io --- src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java | 3 +++ src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java | 3 ++- src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java | 1 + src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java b/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java index 9c6d1c4..6470fda 100644 --- a/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java +++ b/src/main/java/frc/robot/subsystems/CANdle/CANdleSystem.java @@ -6,6 +6,7 @@ import edu.wpi.first.wpilibj2.command.SubsystemBase; import frc.robot.subsystems.CANdle.io.CANdleIO; import frc.robot.subsystems.CANdle.io.CANdleIOInputsAutoLogged; +import org.littletonrobotics.junction.Logger; public class CANdleSystem extends SubsystemBase { @@ -27,6 +28,8 @@ public CANdleSystem(CANdleIO io) { @Override public void periodic() { this.io.updateInputs(inputs); + + Logger.processInputs("CANdle", inputs); } private Command setAnimFlow() { diff --git a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java index d98e70c..3d0ff03 100644 --- a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java +++ b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIO.java @@ -6,8 +6,9 @@ public interface CANdleIO { @AutoLog - static class CANdleIOInputs { + class CANdleIOInputs { public String animationName; + public String animation; } default void setControl(ControlRequest request) {} diff --git a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java index 6a08902..ea3aa60 100644 --- a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java +++ b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOReal.java @@ -38,6 +38,7 @@ public void setControl(ControlRequest request) { @Override public void updateInputs(CANdleIOInputs inputs) { inputs.animationName = request.getName(); + inputs.animation = request.toString(); } ; } diff --git a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java index 0207b2e..9256dda 100644 --- a/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java +++ b/src/main/java/frc/robot/subsystems/CANdle/io/CANdleIOSim.java @@ -15,6 +15,7 @@ public void setControl(ControlRequest request) { @Override public void updateInputs(CANdleIOInputs inputs) { inputs.animationName = request.getName(); + inputs.animation = request.toString(); } ; }