From d98b66253abe65695df6698d6526aa14c3c8e0bb Mon Sep 17 00:00:00 2001 From: anishb77 Date: Thu, 15 Jan 2026 20:28:53 -0500 Subject: [PATCH 1/8] Prototyped config and IO files --- .../intakeFeederwheelConfig.java | 5 +++++ .../intakeFeederwheel/intakeFeederwheelIO.java | 15 +++++++++++++++ .../intakeFeederwheelTalonFX.java | 4 ++++ 3 files changed, 24 insertions(+) create mode 100644 src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelConfig.java create mode 100644 src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java create mode 100644 src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelConfig.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelConfig.java new file mode 100644 index 0000000..7428e61 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelConfig.java @@ -0,0 +1,5 @@ +package frc.robot.subsystems.intakeFeederwheel; + +public class intakeFeederwheelConfig { + static final int FeederwheelMotorID = 20; +} diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java new file mode 100644 index 0000000..4c7cc2b --- /dev/null +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java @@ -0,0 +1,15 @@ +package frc.robot.subsystems.intakeFeederwheel; + +import org.littletonrobotics.junction.AutoLog; + +public class intakeFeederwheelIO { + @AutoLog + public static class intakeFeederwheelIOInputs { + public double velocity = 0.0; + } + + public void updateInputs(intakeFeederwheelIOInputs inputs) {} + + public void setPower(double power) {} + +} diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java new file mode 100644 index 0000000..6e20ba4 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java @@ -0,0 +1,4 @@ +package frc.robot.subsystems.intakeFeederwheel; + +public class intakeFeederwheelTalonFX { +} From 38c60620df09b158079c160aca0a257851b65fad Mon Sep 17 00:00:00 2001 From: anishb77 Date: Thu, 15 Jan 2026 21:00:51 -0500 Subject: [PATCH 2/8] Prototyped TalonFX and Subsystem --- build.gradle | 10 ++++++-- settings.gradle | 6 +++++ src/main/java/frc/robot/RobotContainer.java | 1 + .../intakeFeederwheelIO.java | 6 ++--- .../intakeFeederwheelSubsystem.java | 23 +++++++++++++++++++ .../intakeFeederwheelTalonFX.java | 20 +++++++++++++++- 6 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelSubsystem.java diff --git a/build.gradle b/build.gradle index f60b9a4..7004f2d 100644 --- a/build.gradle +++ b/build.gradle @@ -5,11 +5,10 @@ plugins { id "edu.wpi.first.GradleRIO" version "2025.2.1" id "idea" id 'com.diffplug.spotless' version '6.25.0' + id 'org.jetbrains.kotlin.jvm' } java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 } def ROBOT_MAIN_CLASS = "frc.robot.Main" @@ -85,6 +84,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } test { @@ -179,3 +179,9 @@ spotless { tasks.build.dependsOn('spotlessApply') tasks.deploy.dependsOn('spotlessApply') +repositories { + mavenCentral() +} +kotlin { + jvmToolchain(17) +} diff --git a/settings.gradle b/settings.gradle index 969c7b0..54fb99e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -24,6 +24,12 @@ pluginManagement { url frcHomeMaven } } + plugins { + id 'org.jetbrains.kotlin.jvm' version '2.2.0' + } +} +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } Properties props = System.getProperties(); diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 6b2016e..a774bf2 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -36,6 +36,7 @@ public class RobotContainer { // Subsystems private final Drive drive; + // Controller private final CommandXboxController controller = new CommandXboxController(0); diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java index 4c7cc2b..5eff33e 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java @@ -2,14 +2,14 @@ import org.littletonrobotics.junction.AutoLog; -public class intakeFeederwheelIO { +public interface intakeFeederwheelIO { @AutoLog public static class intakeFeederwheelIOInputs { public double velocity = 0.0; } - public void updateInputs(intakeFeederwheelIOInputs inputs) {} + public default void updateInputs(intakeFeederwheelIOInputs inputs) {} - public void setPower(double power) {} + public default void setPower(double power) {} } diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelSubsystem.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelSubsystem.java new file mode 100644 index 0000000..7c02b9b --- /dev/null +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelSubsystem.java @@ -0,0 +1,23 @@ +package frc.robot.subsystems.intakeFeederwheel; + +import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.SubsystemBase; +import org.littletonrobotics.junction.Logger; + +public class intakeFeederwheelSubsystem extends SubsystemBase { + private intakeFeederwheelIO io; + private intakeFeederwheelIOInputsAutoLogged inputs = new intakeFeederwheelIOInputsAutoLogged; + + public intakeFeederwheelSubsystem(intakeFeederwheelIO io) {this.io = io;} + + @Override + public void periodic() { + io.updateInputs(inputs); + Logger.processInputs("Intake Feederwheel", inputs); + } + + public Command rollIn(double power) { + return runEnd(() -> io.setPower(power), () -> io.setPower(0)); + } + +} diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java index 6e20ba4..23829e4 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java @@ -1,4 +1,22 @@ package frc.robot.subsystems.intakeFeederwheel; -public class intakeFeederwheelTalonFX { +import com.ctre.phoenix6.hardware.TalonFX; + +public class intakeFeederwheelTalonFX implements intakeFeederwheelIO { + private TalonFX feederwheelMotor; + + public intakeFeederwheelTalonFX() { + feederwheelMotor = new TalonFX(intakeFeederwheelConfig.FeederwheelMotorID); + } + + + @Override + public void updateInputs(intakeFeederwheelIOInputs inputs) { + inputs.velocity = feederwheelMotor.getVelocity().getValueAsDouble(); + } + + @Override + public void setPower(double power) { + feederwheelMotor.set(power); + } } From 93ee5188d4d78d107cf0d782d2dabb8d2872e5d4 Mon Sep 17 00:00:00 2001 From: anishb77 Date: Sat, 17 Jan 2026 10:24:58 -0500 Subject: [PATCH 3/8] Updated pascal case and auto logged inputs based on PR, created IO Sim and started on robot container (sorry for doing so much in one commit) --- src/main/java/frc/robot/RobotContainer.java | 20 +++++++++++++--- ...nfig.java => IntakeFeederwheelConfig.java} | 2 +- ...rwheelIO.java => IntakeFeederwheelIO.java} | 6 ++--- .../IntakeFeederwheelIOSim.java | 24 +++++++++++++++++++ ...m.java => IntakeFeederwheelSubsystem.java} | 8 +++---- ...nFX.java => IntakeFeederwheelTalonFX.java} | 8 +++---- 6 files changed, 53 insertions(+), 15 deletions(-) rename src/main/java/frc/robot/subsystems/intakeFeederwheel/{intakeFeederwheelConfig.java => IntakeFeederwheelConfig.java} (71%) rename src/main/java/frc/robot/subsystems/intakeFeederwheel/{intakeFeederwheelIO.java => IntakeFeederwheelIO.java} (58%) create mode 100644 src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIOSim.java rename src/main/java/frc/robot/subsystems/intakeFeederwheel/{intakeFeederwheelSubsystem.java => IntakeFeederwheelSubsystem.java} (64%) rename src/main/java/frc/robot/subsystems/intakeFeederwheel/{intakeFeederwheelTalonFX.java => IntakeFeederwheelTalonFX.java} (61%) diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index a774bf2..5d74cc8 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -11,10 +11,12 @@ import edu.wpi.first.math.geometry.Pose2d; import edu.wpi.first.math.geometry.Rotation2d; import edu.wpi.first.wpilibj.GenericHID; +import edu.wpi.first.wpilibj.Joystick; import edu.wpi.first.wpilibj.XboxController; import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.Commands; import edu.wpi.first.wpilibj2.command.button.CommandXboxController; +import edu.wpi.first.wpilibj2.command.button.JoystickButton; import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; import frc.robot.commands.DriveCommands; import frc.robot.generated.TunerConstants; @@ -24,6 +26,10 @@ import frc.robot.subsystems.drive.ModuleIO; import frc.robot.subsystems.drive.ModuleIOSim; import frc.robot.subsystems.drive.ModuleIOTalonFX; +import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelIO; +import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelIOSim; +import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelTalonFX; +import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelSubsystem; import org.littletonrobotics.junction.networktables.LoggedDashboardChooser; /** @@ -35,7 +41,7 @@ public class RobotContainer { // Subsystems private final Drive drive; - + private IntakeFeederwheelSubsystem intakeFeederwheel; // Controller private final CommandXboxController controller = new CommandXboxController(0); @@ -72,6 +78,9 @@ public RobotContainer() { // new ModuleIOTalonFXS(TunerConstants.FrontRight), // new ModuleIOTalonFXS(TunerConstants.BackLeft), // new ModuleIOTalonFXS(TunerConstants.BackRight)); + + intakeFeederwheel = new IntakeFeederwheelSubsystem(new IntakeFeederwheelTalonFX()); + break; case SIM: @@ -83,6 +92,9 @@ public RobotContainer() { new ModuleIOSim(TunerConstants.FrontRight), new ModuleIOSim(TunerConstants.BackLeft), new ModuleIOSim(TunerConstants.BackRight)); + + intakeFeederwheel = new IntakeFeederwheelSubsystem(new IntakeFeederwheelIOSim()); + break; default: @@ -95,6 +107,8 @@ public RobotContainer() { new ModuleIO() {}, new ModuleIO() {}); break; + + intakeFeederwheel = new IntakeFeederwheelSubsystem(new IntakeFeederwheelIO() {}); } // Set up auto routines @@ -127,8 +141,8 @@ public RobotContainer() { /** * Use this method to define your button->command mappings. Buttons can be created by * instantiating a {@link GenericHID} or one of its subclasses ({@link - * edu.wpi.first.wpilibj.Joystick} or {@link XboxController}), and then passing it to a {@link - * edu.wpi.first.wpilibj2.command.button.JoystickButton}. + * Joystick} or {@link XboxController}), and then passing it to a {@link + * JoystickButton}. */ private void configureButtonBindings() { // Default command, normal field-relative drive diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelConfig.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelConfig.java similarity index 71% rename from src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelConfig.java rename to src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelConfig.java index 7428e61..a904b5b 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelConfig.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelConfig.java @@ -1,5 +1,5 @@ package frc.robot.subsystems.intakeFeederwheel; -public class intakeFeederwheelConfig { +public class IntakeFeederwheelConfig { static final int FeederwheelMotorID = 20; } diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java similarity index 58% rename from src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java rename to src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java index 5eff33e..9ebc364 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelIO.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java @@ -2,13 +2,13 @@ import org.littletonrobotics.junction.AutoLog; -public interface intakeFeederwheelIO { +public interface IntakeFeederwheelIO { @AutoLog - public static class intakeFeederwheelIOInputs { + public static class IntakeFeederwheelIOInputs { public double velocity = 0.0; } - public default void updateInputs(intakeFeederwheelIOInputs inputs) {} + public default void updateInputs(IntakeFeederwheelIOInputs inputs) {} public default void setPower(double power) {} diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIOSim.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIOSim.java new file mode 100644 index 0000000..62f0b8e --- /dev/null +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIOSim.java @@ -0,0 +1,24 @@ +package frc.robot.subsystems.intakeFeederwheel; + +import com.ctre.phoenix6.hardware.TalonFX; +import frc.robot.util.sim.PhysicsSim; + +public class IntakeFeederwheelIOSim implements IntakeFeederwheelIO { + private final TalonFX feederwheelMotor; + + public IntakeFeederwheelIOSim() { + feederwheelMotor = new TalonFX(IntakeFeederwheelConfig.FeederwheelMotorID); + PhysicsSim.getInstance().addTalonFX(feederwheelMotor); + } + + + @Override + public void updateInputs(IntakeFeederwheelIOInputs inputs) { + inputs.velocity = feederwheelMotor.getVelocity().getValueAsDouble(); + } + + @Override + public void setPower(double power) { + feederwheelMotor.set(power); + } +} diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelSubsystem.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java similarity index 64% rename from src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelSubsystem.java rename to src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java index 7c02b9b..f8a132b 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelSubsystem.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java @@ -4,11 +4,11 @@ import edu.wpi.first.wpilibj2.command.SubsystemBase; import org.littletonrobotics.junction.Logger; -public class intakeFeederwheelSubsystem extends SubsystemBase { - private intakeFeederwheelIO io; - private intakeFeederwheelIOInputsAutoLogged inputs = new intakeFeederwheelIOInputsAutoLogged; +public class IntakeFeederwheelSubsystem extends SubsystemBase { + private IntakeFeederwheelIO io; + private IntakeFeederwheelIOInputsAutoLogged inputs = new IntakeFeederwheelIOInputsAutoLogged(); - public intakeFeederwheelSubsystem(intakeFeederwheelIO io) {this.io = io;} + public IntakeFeederwheelSubsystem(IntakeFeederwheelIO io) {this.io = io;} @Override public void periodic() { diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java similarity index 61% rename from src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java rename to src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java index 23829e4..91434b2 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/intakeFeederwheelTalonFX.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java @@ -2,16 +2,16 @@ import com.ctre.phoenix6.hardware.TalonFX; -public class intakeFeederwheelTalonFX implements intakeFeederwheelIO { +public class IntakeFeederwheelTalonFX implements IntakeFeederwheelIO { private TalonFX feederwheelMotor; - public intakeFeederwheelTalonFX() { - feederwheelMotor = new TalonFX(intakeFeederwheelConfig.FeederwheelMotorID); + public IntakeFeederwheelTalonFX() { + feederwheelMotor = new TalonFX(IntakeFeederwheelConfig.FeederwheelMotorID); } @Override - public void updateInputs(intakeFeederwheelIOInputs inputs) { + public void updateInputs(IntakeFeederwheelIOInputs inputs) { inputs.velocity = feederwheelMotor.getVelocity().getValueAsDouble(); } From b198409b997f7e7f7cc3edf40d30ca20f7810688 Mon Sep 17 00:00:00 2001 From: anishb77 Date: Sat, 17 Jan 2026 14:18:27 -0500 Subject: [PATCH 4/8] Combined IO Sim and Talon FX into one --- src/main/java/frc/robot/RobotContainer.java | 8 ++++++- .../IntakeFeederwheelIO.java | 4 ++-- .../IntakeFeederwheelIOSim.java | 24 ------------------- .../IntakeFeederwheelTalonFX.java | 5 ++++ 4 files changed, 14 insertions(+), 27 deletions(-) delete mode 100644 src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIOSim.java diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 5d74cc8..b9232c8 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -27,7 +27,6 @@ import frc.robot.subsystems.drive.ModuleIOSim; import frc.robot.subsystems.drive.ModuleIOTalonFX; import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelIO; -import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelIOSim; import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelTalonFX; import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelSubsystem; import org.littletonrobotics.junction.networktables.LoggedDashboardChooser; @@ -178,6 +177,13 @@ private void configureButtonBindings() { Rotation2d.kZero)), drive) .ignoringDisable(true)); + + controller. + rightTrigger(). + whileTrue( + () -> intakeFeederwheel.startFeeders(0.5), + () -> intakeFeederwheel.stopFeeders()); + } /** diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java index 9ebc364..6e73307 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java @@ -4,11 +4,11 @@ public interface IntakeFeederwheelIO { @AutoLog - public static class IntakeFeederwheelIOInputs { + public static class intakeFeederwheelIOInputs { public double velocity = 0.0; } - public default void updateInputs(IntakeFeederwheelIOInputs inputs) {} + public default void updateInputs(intakeFeederwheelIOInputs inputs) {} public default void setPower(double power) {} diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIOSim.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIOSim.java deleted file mode 100644 index 62f0b8e..0000000 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIOSim.java +++ /dev/null @@ -1,24 +0,0 @@ -package frc.robot.subsystems.intakeFeederwheel; - -import com.ctre.phoenix6.hardware.TalonFX; -import frc.robot.util.sim.PhysicsSim; - -public class IntakeFeederwheelIOSim implements IntakeFeederwheelIO { - private final TalonFX feederwheelMotor; - - public IntakeFeederwheelIOSim() { - feederwheelMotor = new TalonFX(IntakeFeederwheelConfig.FeederwheelMotorID); - PhysicsSim.getInstance().addTalonFX(feederwheelMotor); - } - - - @Override - public void updateInputs(IntakeFeederwheelIOInputs inputs) { - inputs.velocity = feederwheelMotor.getVelocity().getValueAsDouble(); - } - - @Override - public void setPower(double power) { - feederwheelMotor.set(power); - } -} diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java index 91434b2..764874e 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java @@ -1,12 +1,17 @@ package frc.robot.subsystems.intakeFeederwheel; import com.ctre.phoenix6.hardware.TalonFX; +import frc.robot.Robot; +import frc.robot.util.sim.PhysicsSim; public class IntakeFeederwheelTalonFX implements IntakeFeederwheelIO { private TalonFX feederwheelMotor; public IntakeFeederwheelTalonFX() { feederwheelMotor = new TalonFX(IntakeFeederwheelConfig.FeederwheelMotorID); + if (Robot.isSimulation()) { + PhysicsSim.getInstance().addTalonFX(feederwheelMotor); + } } From e9bb69030ad849184259e4f51e594dec9ce6f8bc Mon Sep 17 00:00:00 2001 From: anishb77 Date: Sat, 17 Jan 2026 16:06:53 -0500 Subject: [PATCH 5/8] Fixed errors in robot container should build now! --- src/main/java/frc/robot/Robot.java | 1 - src/main/java/frc/robot/RobotContainer.java | 19 ++---- .../IntakeFeederwheelIO.java | 5 +- .../IntakeFeederwheelSubsystem.java | 5 +- .../IntakeFeederwheelTalonFX.java | 1 - .../java/frc/robot/util/sim/Mechanisms.java | 11 +++ .../java/frc/robot/util/sim/PhysicsSim.java | 68 +++++++++++++++++++ .../robot/util/sim/SimulatableMechanism.java | 9 +++ .../frc/robot/util/sim/TalonFXSimProfile.java | 67 ++++++++++++++++++ 9 files changed, 167 insertions(+), 19 deletions(-) create mode 100644 src/main/java/frc/robot/util/sim/Mechanisms.java create mode 100644 src/main/java/frc/robot/util/sim/PhysicsSim.java create mode 100644 src/main/java/frc/robot/util/sim/SimulatableMechanism.java create mode 100644 src/main/java/frc/robot/util/sim/TalonFXSimProfile.java diff --git a/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java index 68c00ed..a670d71 100644 --- a/src/main/java/frc/robot/Robot.java +++ b/src/main/java/frc/robot/Robot.java @@ -137,4 +137,3 @@ public void simulationInit() {} @Override public void simulationPeriodic() {} } - diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index b9232c8..b33c3f4 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -27,8 +27,8 @@ import frc.robot.subsystems.drive.ModuleIOSim; import frc.robot.subsystems.drive.ModuleIOTalonFX; import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelIO; -import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelTalonFX; import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelSubsystem; +import frc.robot.subsystems.intakeFeederwheel.IntakeFeederwheelTalonFX; import org.littletonrobotics.junction.networktables.LoggedDashboardChooser; /** @@ -92,7 +92,7 @@ public RobotContainer() { new ModuleIOSim(TunerConstants.BackLeft), new ModuleIOSim(TunerConstants.BackRight)); - intakeFeederwheel = new IntakeFeederwheelSubsystem(new IntakeFeederwheelIOSim()); + intakeFeederwheel = new IntakeFeederwheelSubsystem(new IntakeFeederwheelTalonFX()); break; @@ -105,9 +105,10 @@ public RobotContainer() { new ModuleIO() {}, new ModuleIO() {}, new ModuleIO() {}); - break; intakeFeederwheel = new IntakeFeederwheelSubsystem(new IntakeFeederwheelIO() {}); + + break; } // Set up auto routines @@ -139,9 +140,8 @@ public RobotContainer() { /** * Use this method to define your button->command mappings. Buttons can be created by - * instantiating a {@link GenericHID} or one of its subclasses ({@link - * Joystick} or {@link XboxController}), and then passing it to a {@link - * JoystickButton}. + * instantiating a {@link GenericHID} or one of its subclasses ({@link Joystick} or {@link + * XboxController}), and then passing it to a {@link JoystickButton}. */ private void configureButtonBindings() { // Default command, normal field-relative drive @@ -178,12 +178,7 @@ private void configureButtonBindings() { drive) .ignoringDisable(true)); - controller. - rightTrigger(). - whileTrue( - () -> intakeFeederwheel.startFeeders(0.5), - () -> intakeFeederwheel.stopFeeders()); - + controller.rightTrigger().onTrue(intakeFeederwheel.rollIn(0.5)); } /** diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java index 6e73307..3b5b248 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java @@ -4,12 +4,11 @@ public interface IntakeFeederwheelIO { @AutoLog - public static class intakeFeederwheelIOInputs { + public static class IntakeFeederwheelIOInputs { public double velocity = 0.0; } - public default void updateInputs(intakeFeederwheelIOInputs inputs) {} + public default void updateInputs(IntakeFeederwheelIOInputs inputs) {} public default void setPower(double power) {} - } diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java index f8a132b..b4e6492 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java @@ -8,7 +8,9 @@ public class IntakeFeederwheelSubsystem extends SubsystemBase { private IntakeFeederwheelIO io; private IntakeFeederwheelIOInputsAutoLogged inputs = new IntakeFeederwheelIOInputsAutoLogged(); - public IntakeFeederwheelSubsystem(IntakeFeederwheelIO io) {this.io = io;} + public IntakeFeederwheelSubsystem(IntakeFeederwheelIO io) { + this.io = io; + } @Override public void periodic() { @@ -19,5 +21,4 @@ public void periodic() { public Command rollIn(double power) { return runEnd(() -> io.setPower(power), () -> io.setPower(0)); } - } diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java index 764874e..a3b2489 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java @@ -14,7 +14,6 @@ public IntakeFeederwheelTalonFX() { } } - @Override public void updateInputs(IntakeFeederwheelIOInputs inputs) { inputs.velocity = feederwheelMotor.getVelocity().getValueAsDouble(); diff --git a/src/main/java/frc/robot/util/sim/Mechanisms.java b/src/main/java/frc/robot/util/sim/Mechanisms.java new file mode 100644 index 0000000..8934f6e --- /dev/null +++ b/src/main/java/frc/robot/util/sim/Mechanisms.java @@ -0,0 +1,11 @@ +package frc.robot.util.sim; + +import edu.wpi.first.epilogue.Logged; + +@Logged +public class Mechanisms { + + public Mechanisms() {} + + public void publishComponentPoses() {} +} diff --git a/src/main/java/frc/robot/util/sim/PhysicsSim.java b/src/main/java/frc/robot/util/sim/PhysicsSim.java new file mode 100644 index 0000000..8316ddd --- /dev/null +++ b/src/main/java/frc/robot/util/sim/PhysicsSim.java @@ -0,0 +1,68 @@ +package frc.robot.util.sim; + +import com.ctre.phoenix6.Utils; +import com.ctre.phoenix6.hardware.CANcoder; +import com.ctre.phoenix6.hardware.TalonFX; +import java.util.ArrayList; + +/** Manages physics simulation for CTRE products. */ +public class PhysicsSim { + private static final PhysicsSim sim = new PhysicsSim(); + private final ArrayList simProfiles = new ArrayList<>(); + + /** Gets the robot simulator instance. */ + public static PhysicsSim getInstance() { + return sim; + } + + /** + * Adds a TalonFX controller to the simulator. + * + * @param talonFX The TalonFX device + */ + public void addTalonFX(TalonFX talonFX) { + if (talonFX != null) { + TalonFXSimProfile simTalonFX = new TalonFXSimProfile(talonFX, 0.001); + simProfiles.add(simTalonFX); + } + } + + public void addTalonFX(TalonFX talonFX, CANcoder cancoder) { + if (talonFX != null && cancoder != null) { + TalonFXSimProfile simTalonFX = new TalonFXSimProfile(talonFX, 0.001, cancoder); + simProfiles.add(simTalonFX); + } + } + + /** Runs the simulator: - enable the robot - simulate sensors */ + public void run() { + // Simulate devices + for (SimProfile simProfile : simProfiles) { + simProfile.run(); + } + } + + /** Holds information about a simulated device. */ + static class SimProfile { + private double _lastTime; + private boolean _running = false; + + /** Runs the simulation profile. Implemented by device-specific profiles. */ + public void run() {} + + /** Returns the time since last call, in seconds. */ + protected double getPeriod() { + // set the start time if not yet running + if (!_running) { + _lastTime = Utils.getCurrentTimeSeconds(); + _running = true; + } + + double now = Utils.getCurrentTimeSeconds(); + final double period = now - _lastTime; + _lastTime = now; + + return period; + } + } +} diff --git a/src/main/java/frc/robot/util/sim/SimulatableMechanism.java b/src/main/java/frc/robot/util/sim/SimulatableMechanism.java new file mode 100644 index 0000000..7e3f2ff --- /dev/null +++ b/src/main/java/frc/robot/util/sim/SimulatableMechanism.java @@ -0,0 +1,9 @@ +package frc.robot.util.sim; + +import edu.wpi.first.units.measure.Angle; + +public interface SimulatableMechanism { + Angle getCurrentPosition(); + + Angle getTargetPosition(); +} diff --git a/src/main/java/frc/robot/util/sim/TalonFXSimProfile.java b/src/main/java/frc/robot/util/sim/TalonFXSimProfile.java new file mode 100644 index 0000000..67a98f2 --- /dev/null +++ b/src/main/java/frc/robot/util/sim/TalonFXSimProfile.java @@ -0,0 +1,67 @@ +package frc.robot.util.sim; + +import com.ctre.phoenix6.hardware.CANcoder; +import com.ctre.phoenix6.hardware.TalonFX; +import com.ctre.phoenix6.sim.CANcoderSimState; +import com.ctre.phoenix6.sim.TalonFXSimState; +import edu.wpi.first.math.system.plant.DCMotor; +import edu.wpi.first.math.system.plant.LinearSystemId; +import edu.wpi.first.math.util.Units; +import edu.wpi.first.wpilibj.simulation.DCMotorSim; + +/** Holds information about a simulated TalonFX. */ +class TalonFXSimProfile extends PhysicsSim.SimProfile { + private static final double MOTOR_RESISTANCE = + 0.002; // Assume 2mOhm resistance for voltage drop calculation + + private final DCMotorSim motorSim; + private final TalonFXSimState talonFXSim; + private CANcoderSimState cancoderSimState; + + /** + * Creates a new simulation profile for a TalonFX device. + * + * @param talonFX The TalonFX device + * @param rotorInertia Rotational Inertia of the mechanism at the rotor + */ + public TalonFXSimProfile(final TalonFX talonFX, final double rotorInertia) { + var gearbox = DCMotor.getKrakenX60Foc(1); + this.motorSim = + new DCMotorSim( + LinearSystemId.createDCMotorSystem(gearbox, rotorInertia, 1.0), gearbox); + this.talonFXSim = talonFX.getSimState(); + } + + public TalonFXSimProfile(final TalonFX talonFX, final double rotorInertia, CANcoder cancoder) { + this(talonFX, rotorInertia); + cancoderSimState = cancoder.getSimState(); + } + + /** + * Runs the simulation profile. + * + *

This uses very rudimentary physics simulation and exists to allow users to test features + * of our products in simulation using our examples out of the box. Users may modify this to + * utilize more accurate physics simulation. + */ + public void run() { + /// DEVICE SPEED SIMULATION + + motorSim.setInputVoltage(talonFXSim.getMotorVoltage()); + + motorSim.update(getPeriod()); + + /// SET SIM PHYSICS INPUTS + final double position_rot = motorSim.getAngularPositionRotations(); + final double velocity_rps = Units.radiansToRotations(motorSim.getAngularVelocityRPM()); + + if (cancoderSimState != null) { + cancoderSimState.setRawPosition(position_rot); + cancoderSimState.setVelocity(velocity_rps); + } + talonFXSim.setRawRotorPosition(position_rot); + talonFXSim.setRotorVelocity(velocity_rps); + + talonFXSim.setSupplyVoltage(12 - talonFXSim.getSupplyCurrent() * MOTOR_RESISTANCE); + } +} From bfe699f145aec53fb236e83443e24ba8fb832af7 Mon Sep 17 00:00:00 2001 From: anishb77 Date: Sat, 17 Jan 2026 17:05:40 -0500 Subject: [PATCH 6/8] Added Voltage Out control requests --- .../intakeFeederwheel/IntakeFeederwheelIO.java | 3 ++- .../intakeFeederwheel/IntakeFeederwheelTalonFX.java | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java index 3b5b248..c7f2dcb 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelIO.java @@ -5,7 +5,8 @@ public interface IntakeFeederwheelIO { @AutoLog public static class IntakeFeederwheelIOInputs { - public double velocity = 0.0; + public double voltage = 0.0; + public double RPM = 0.0; } public default void updateInputs(IntakeFeederwheelIOInputs inputs) {} diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java index a3b2489..7f289ca 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelTalonFX.java @@ -1,5 +1,6 @@ package frc.robot.subsystems.intakeFeederwheel; +import com.ctre.phoenix6.controls.VoltageOut; import com.ctre.phoenix6.hardware.TalonFX; import frc.robot.Robot; import frc.robot.util.sim.PhysicsSim; @@ -7,6 +8,8 @@ public class IntakeFeederwheelTalonFX implements IntakeFeederwheelIO { private TalonFX feederwheelMotor; + private final VoltageOut voltageRequest = new VoltageOut(0); + public IntakeFeederwheelTalonFX() { feederwheelMotor = new TalonFX(IntakeFeederwheelConfig.FeederwheelMotorID); if (Robot.isSimulation()) { @@ -16,11 +19,12 @@ public IntakeFeederwheelTalonFX() { @Override public void updateInputs(IntakeFeederwheelIOInputs inputs) { - inputs.velocity = feederwheelMotor.getVelocity().getValueAsDouble(); + inputs.voltage = feederwheelMotor.getMotorVoltage().getValueAsDouble(); + inputs.RPM = feederwheelMotor.getVelocity().getValueAsDouble(); } @Override - public void setPower(double power) { - feederwheelMotor.set(power); + public void setPower(double volts) { + feederwheelMotor.setControl(voltageRequest.withOutput(volts)); } } From 59b7adf72cacc10a2565fb8a6ec3b0f4e829bfb0 Mon Sep 17 00:00:00 2001 From: anishb77 Date: Sat, 17 Jan 2026 20:41:33 -0500 Subject: [PATCH 7/8] build.gradle and settings.gradle should be reverted now --- build.gradle | 12 +++--------- settings.gradle | 8 +------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index 92d6153..ec38979 100644 --- a/build.gradle +++ b/build.gradle @@ -5,10 +5,11 @@ plugins { id "edu.wpi.first.GradleRIO" version "2025.2.1" id "idea" id 'com.diffplug.spotless' version '6.25.0' - id 'org.jetbrains.kotlin.jvm' } java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } def ROBOT_MAIN_CLASS = "frc.robot.Main" @@ -84,7 +85,6 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } test { @@ -186,10 +186,4 @@ spotless { } tasks.build.dependsOn('spotlessApply') -tasks.deploy.dependsOn('spotlessApply') -repositories { - mavenCentral() -} -kotlin { - jvmToolchain(17) -} +tasks.deploy.dependsOn('spotlessApply') \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 54fb99e..4a1d5ef 100644 --- a/settings.gradle +++ b/settings.gradle @@ -24,13 +24,7 @@ pluginManagement { url frcHomeMaven } } - plugins { - id 'org.jetbrains.kotlin.jvm' version '2.2.0' - } -} -plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } Properties props = System.getProperties(); -props.setProperty("org.gradle.internal.native.headers.unresolved.dependencies.ignore", "true"); +props.setProperty("org.gradle.internal.native.headers.unresolved.dependencies.ignore", "true"); \ No newline at end of file From e2fc090519b3fd087a9154fab097ad4eae157faa Mon Sep 17 00:00:00 2001 From: anishb77 Date: Sat, 17 Jan 2026 20:44:39 -0500 Subject: [PATCH 8/8] hard coded 0.5 for the rollIn command --- build.gradle | 2 +- settings.gradle | 2 +- src/main/java/frc/robot/RobotContainer.java | 2 +- .../intakeFeederwheel/IntakeFeederwheelSubsystem.java | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index ec38979..28287ce 100644 --- a/build.gradle +++ b/build.gradle @@ -186,4 +186,4 @@ spotless { } tasks.build.dependsOn('spotlessApply') -tasks.deploy.dependsOn('spotlessApply') \ No newline at end of file +tasks.deploy.dependsOn('spotlessApply') diff --git a/settings.gradle b/settings.gradle index 4a1d5ef..969c7b0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -27,4 +27,4 @@ pluginManagement { } Properties props = System.getProperties(); -props.setProperty("org.gradle.internal.native.headers.unresolved.dependencies.ignore", "true"); \ No newline at end of file +props.setProperty("org.gradle.internal.native.headers.unresolved.dependencies.ignore", "true"); diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index b33c3f4..20469d2 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -178,7 +178,7 @@ private void configureButtonBindings() { drive) .ignoringDisable(true)); - controller.rightTrigger().onTrue(intakeFeederwheel.rollIn(0.5)); + controller.rightTrigger().onTrue(intakeFeederwheel.rollIn()); } /** diff --git a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java index b4e6492..08cccac 100644 --- a/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java +++ b/src/main/java/frc/robot/subsystems/intakeFeederwheel/IntakeFeederwheelSubsystem.java @@ -18,7 +18,7 @@ public void periodic() { Logger.processInputs("Intake Feederwheel", inputs); } - public Command rollIn(double power) { - return runEnd(() -> io.setPower(power), () -> io.setPower(0)); + public Command rollIn() { + return runEnd(() -> io.setPower(0.5), () -> io.setPower(0)); } }