From bb850f4971d83c85f7c197d2ae94a6a1b5672633 Mon Sep 17 00:00:00 2001 From: yummy-yummers Date: Wed, 1 Oct 2025 20:21:03 -0700 Subject: [PATCH 1/3] Added basic shooter subsystems with IO pattern --- .../main/java/frc/robot/RobotContainer.java | 14 ++++++++-- .../frc/robot/subsystems/shooter/Shooter.java | 28 +++++++++++++++++++ .../subsystems/shooter/ShooterIOSim.java | 4 ++- .../subsystems/shooter/ShooterIOTalonFX.java | 7 ++++- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java b/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java index 4a1f5c7..1145d90 100644 --- a/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java +++ b/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java @@ -10,11 +10,12 @@ public class RobotContainer { private final CommandJoystick joystick = new CommandJoystick(0); - // private final Shooter shooter; + private final Shooter shooter; public RobotContainer() { // Use real or sim ShooterIO - // shooter = new Shooter(RobotBase.isReal() ? new ShooterIOTalonFX() : new ShooterIOSim()); + shooter = new Shooter(RobotBase.isReal() ? new ShooterIOTalonFX() : new ShooterIOSim()); + configureBindings(); } @@ -22,11 +23,18 @@ public RobotContainer() { private void configureBindings() { // Example binding: spin shooter at 50% while holding button 1 // Once the shooter is implemented, you should see the motor spinning at 3000rpm when button 1 is held down - /* + /* joystick .button(1) .whileTrue(Commands.run(() -> shooter.spin(0.5), shooter)) .onFalse(Commands.run(() -> shooter.stop(), shooter)); */ + + joystick + .button(1) + .whileTrue(Commands.run(() -> shooter.spin(1.0), shooter)) + .onFalse(Commands.run(() -> shooter.stop(), shooter)); + + } } diff --git a/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/Shooter.java b/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/Shooter.java index 8e170c4..97fb883 100644 --- a/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/Shooter.java +++ b/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/Shooter.java @@ -1,27 +1,55 @@ package frc.robot.subsystems.shooter; +import edu.wpi.first.wpilibj.RobotBase; import edu.wpi.first.wpilibj2.command.SubsystemBase; +import frc.robot.subsystems.shooter.ShooterIO.ShooterIOInputs; // Main Shooter subsystem logic public class Shooter extends SubsystemBase { // TODO: Add a private field for your ShooterIO instance + private ShooterIO io; + // TODO: Add a private field for your ShooterIOInputs instance and initialize it + private ShooterIO.ShooterIOInputs inputs = new ShooterIO.ShooterIOInputs(); + // TODO: Create the constructor that takes a ShooterIO instance as a parameter // public Shooter(ShooterIO io) { ... } + public Shooter(ShooterIO io) { + this.io = io; + } + @Override public void periodic() { // This method will be called once per scheduler run // TODO: Call the updateInputs method on your ShooterIO instance + io.updateInputs(inputs); + if (!RobotBase.isReal()) { + if (true) { + spin(0.5); + } else { + stop(); + }} + + System.out.println(inputs.motorRPM); } // TODO: Add a public method to spin the shooter motor at a given percentage output // public void spin(double percent) { ... } + public void spin(double percent) { + io.setMotorPercentOutput(percent); + } // TODO: Add a public method to stop the shooter motor // public void stop() { ... } + public void stop() { + io.setMotorPercentOutput(0.0); + } // TODO: Add a public method to return the current motor RPM // public double getCurrentRPM() { ... } + public double getCurrentRPM() { + return inputs.motorRPM; + } } diff --git a/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/ShooterIOSim.java b/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/ShooterIOSim.java index 5e92fa6..b7680ba 100644 --- a/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/ShooterIOSim.java +++ b/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/ShooterIOSim.java @@ -6,15 +6,17 @@ public class ShooterIOSim implements ShooterIO { private static final double MAX_RPM = 6000.0; // TODO: Add a private field `simulatedMotorPercent` to store the simulated motor percentage + private double simulatedMotorPercent; @Override public void updateInputs(ShooterIOInputs inputs) { // TODO: Simulate motorRPM by multiplying the stored simulatedMotorPercent by the max RPM - inputs.motorRPM = 0.0; // Placeholder - replace 0.0 + inputs.motorRPM = simulatedMotorPercent * MAX_RPM; // Placeholder - replace 0.0 } @Override public void setMotorPercentOutput(double percent) { // TODO: Store the given `percent` in your simulated motor percentage field + simulatedMotorPercent = percent; } } diff --git a/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/ShooterIOTalonFX.java b/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/ShooterIOTalonFX.java index eec4fbb..b01ac53 100644 --- a/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/ShooterIOTalonFX.java +++ b/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/ShooterIOTalonFX.java @@ -27,13 +27,18 @@ public ShooterIOTalonFX() { public void updateInputs(ShooterIOInputs inputs) { // TODO: Read the motor’s velocity (rotations per second) as a double using // motor.getVelocity().getValueAsDouble() - + double rps = motor.getVelocity().getValueAsDouble(); + // TODO: Save the RPM to inputs.motorRPM (convert from rotations per second) + inputs.motorRPM = rps * 60; + + } @Override public void setMotorPercentOutput(double percent) { // TODO: Use motor.setControl and the dutyCycleOut variable to set the motor’s percent output // Tip: Search up documentation for DutyCycleOut methods + motor.setControl(dutyCycleOut.withOutput(percent)); } } From 21694bf1b12aefbece2a1cc785634141f44e1672 Mon Sep 17 00:00:00 2001 From: yummy-yummers Date: Sat, 4 Oct 2025 15:25:35 -0700 Subject: [PATCH 2/3] progress update --- tasks/lesson3-shooter-task/simgui-ds.json | 8 ++++++++ .../src/main/java/frc/robot/RobotContainer.java | 6 ++---- .../java/frc/robot/subsystems/shooter/Shooter.java | 12 +++--------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tasks/lesson3-shooter-task/simgui-ds.json b/tasks/lesson3-shooter-task/simgui-ds.json index 69b1a3c..2296812 100644 --- a/tasks/lesson3-shooter-task/simgui-ds.json +++ b/tasks/lesson3-shooter-task/simgui-ds.json @@ -1,4 +1,9 @@ { + "Keyboard 0 Settings": { + "window": { + "visible": true + } + }, "keyboardJoysticks": [ { "axisConfig": [ @@ -92,6 +97,9 @@ "robotJoysticks": [ { "guid": "Keyboard0" + }, + { + "guid": "Keyboard1" } ] } diff --git a/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java b/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java index 1145d90..052b496 100644 --- a/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java +++ b/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java @@ -11,12 +11,10 @@ public class RobotContainer { private final CommandJoystick joystick = new CommandJoystick(0); private final Shooter shooter; - + public RobotContainer() { // Use real or sim ShooterIO shooter = new Shooter(RobotBase.isReal() ? new ShooterIOTalonFX() : new ShooterIOSim()); - - configureBindings(); } @@ -32,7 +30,7 @@ private void configureBindings() { joystick .button(1) - .whileTrue(Commands.run(() -> shooter.spin(1.0), shooter)) + .whileTrue(Commands.run(() -> shooter.spin(0.5), shooter)) .onFalse(Commands.run(() -> shooter.stop(), shooter)); diff --git a/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/Shooter.java b/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/Shooter.java index 97fb883..5c209fd 100644 --- a/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/Shooter.java +++ b/tasks/lesson3-shooter-task/src/main/java/frc/robot/subsystems/shooter/Shooter.java @@ -3,6 +3,8 @@ import edu.wpi.first.wpilibj.RobotBase; import edu.wpi.first.wpilibj2.command.SubsystemBase; import frc.robot.subsystems.shooter.ShooterIO.ShooterIOInputs; +import static edu.wpi.first.units.Units.RPM; +import static edu.wpi.first.units.Units.Percent; // Main Shooter subsystem logic public class Shooter extends SubsystemBase { @@ -12,7 +14,6 @@ public class Shooter extends SubsystemBase { // TODO: Add a private field for your ShooterIOInputs instance and initialize it private ShooterIO.ShooterIOInputs inputs = new ShooterIO.ShooterIOInputs(); - // TODO: Create the constructor that takes a ShooterIO instance as a parameter // public Shooter(ShooterIO io) { ... } public Shooter(ShooterIO io) { @@ -25,14 +26,7 @@ public void periodic() { // This method will be called once per scheduler run // TODO: Call the updateInputs method on your ShooterIO instance io.updateInputs(inputs); - if (!RobotBase.isReal()) { - if (true) { - spin(0.5); - } else { - stop(); - }} - - System.out.println(inputs.motorRPM); + System.out.println("Current motor RPM: " + inputs.motorRPM); } // TODO: Add a public method to spin the shooter motor at a given percentage output From 4139192d15ddd2fe178ca69ca6389c2776b5ad5b Mon Sep 17 00:00:00 2001 From: yummy-yummers Date: Sat, 4 Oct 2025 17:29:45 -0700 Subject: [PATCH 3/3] this is FINAL shooter project --- tasks/lesson3-shooter-task/simgui-ds.json | 9 +++++++-- .../src/main/java/frc/robot/RobotContainer.java | 6 ++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tasks/lesson3-shooter-task/simgui-ds.json b/tasks/lesson3-shooter-task/simgui-ds.json index 2296812..6b7aa03 100644 --- a/tasks/lesson3-shooter-task/simgui-ds.json +++ b/tasks/lesson3-shooter-task/simgui-ds.json @@ -1,7 +1,12 @@ { - "Keyboard 0 Settings": { + "Joysticks": { "window": { - "visible": true + "visible": false + } + }, + "System Joysticks": { + "window": { + "visible": false } }, "keyboardJoysticks": [ diff --git a/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java b/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java index 052b496..e92edcb 100644 --- a/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java +++ b/tasks/lesson3-shooter-task/src/main/java/frc/robot/RobotContainer.java @@ -11,10 +11,12 @@ public class RobotContainer { private final CommandJoystick joystick = new CommandJoystick(0); private final Shooter shooter; - + public RobotContainer() { // Use real or sim ShooterIO shooter = new Shooter(RobotBase.isReal() ? new ShooterIOTalonFX() : new ShooterIOSim()); + if (!RobotBase.isReal()) { + shooter.spin(0.0);} configureBindings(); } @@ -31,7 +33,7 @@ private void configureBindings() { joystick .button(1) .whileTrue(Commands.run(() -> shooter.spin(0.5), shooter)) - .onFalse(Commands.run(() -> shooter.stop(), shooter)); + .whileFalse(Commands.run(() -> shooter.stop(), shooter)); }