From 176171f3616cf6dc6187056503d66e932b6e6518 Mon Sep 17 00:00:00 2001 From: TheRealGrayden Date: Sat, 7 Mar 2026 13:33:58 -0500 Subject: [PATCH 1/8] Shooter Subsystem --- src/main/java/frc/robot/Constants.java | 18 ++- .../{Intake.java => IntakeSubsystem.java} | 4 +- .../frc/robot/subsystems/TurretSubsystem.java | 148 ++++++++++++++++++ 3 files changed, 167 insertions(+), 3 deletions(-) rename src/main/java/frc/robot/subsystems/{Intake.java => IntakeSubsystem.java} (96%) create mode 100644 src/main/java/frc/robot/subsystems/TurretSubsystem.java diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 16168d8..5f89a34 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -4,6 +4,10 @@ package frc.robot; +import edu.wpi.first.math.util.Units; +import edu.wpi.first.units.Unit; +import edu.wpi.first.units.measure.Angle; + /** * The Constants class provides a convenient place for teams to hold robot-wide numerical or boolean * constants. This class should not be used for any other purpose. All constants should be declared @@ -65,5 +69,17 @@ public final class Constants { public static final int RETRACT_CHANNEL = 1; public static final int INTAKE_MOTOR_ID = 2; } - + + public static class ShooterConstants { + public static final int LIMIT_CHANNEL = 0; + public static final int TURRET_ID = 1; + public static final int LAUNCHER_ID = 2; + public static final int HOOD_CHANNEL = 3; + public static final int HOOD_ENCODER_ID = 4; + public static final Angle LIMIT_POS = edu.wpi.first.units.Units.Degrees.of(265); + public static final Angle LIMIT_NEG = edu.wpi.first.units.Units.Degrees.of(5); + public static final Angle TARGET_ELEVATION_DIF = edu.wpi.first.units.Units.Degrees.of(1); + public static final Angle LIMIT_ELEVATION_POS = edu.wpi.first.units.Units.Degrees.of(90); + public static final Angle LIMIT_ELEVATION_NEG = edu.wpi.first.units.Units.Degrees.of(0); + } } diff --git a/src/main/java/frc/robot/subsystems/Intake.java b/src/main/java/frc/robot/subsystems/IntakeSubsystem.java similarity index 96% rename from src/main/java/frc/robot/subsystems/Intake.java rename to src/main/java/frc/robot/subsystems/IntakeSubsystem.java index 0ebfee1..ad0381d 100644 --- a/src/main/java/frc/robot/subsystems/Intake.java +++ b/src/main/java/frc/robot/subsystems/IntakeSubsystem.java @@ -14,9 +14,9 @@ import static org.fairportrobotics.frc.posty.assertions.Assertions.*; import edu.wpi.first.wpilibj.DigitalOutput; import edu.wpi.first.wpilibj2.command.Command; -public class Intake extends TestableSubsystem { +public class IntakeSubsystem extends TestableSubsystem { /** Creates a new ExampleSubsystem. */ - public Intake() + public IntakeSubsystem() { extendRelay = new DigitalOutput(Constants.IntakeConstants.EXTEND_CHANNEL); retractRelay = new DigitalOutput(Constants.IntakeConstants.RETRACT_CHANNEL); diff --git a/src/main/java/frc/robot/subsystems/TurretSubsystem.java b/src/main/java/frc/robot/subsystems/TurretSubsystem.java new file mode 100644 index 0000000..6b7c7c2 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/TurretSubsystem.java @@ -0,0 +1,148 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +package frc.robot.subsystems; + +import org.fairportrobotics.frc.posty.TestableSubsystem; +import org.fairportrobotics.frc.posty.test.PostTest; + +import com.ctre.phoenix6.configs.CANcoderConfiguration; +import com.ctre.phoenix6.hardware.CANcoder; +import com.ctre.phoenix6.hardware.TalonFX; + +import static org.fairportrobotics.frc.posty.assertions.Assertions.*; +import frc.robot.Constants; +import edu.wpi.first.units.Units; +import edu.wpi.first.units.measure.Angle; +import edu.wpi.first.wpilibj.DigitalInput; +import edu.wpi.first.wpilibj.Servo; +import edu.wpi.first.wpilibj2.command.Command; + +public class TurretSubsystem extends TestableSubsystem { + public enum ShootyRootyTootyState { + INIT, + HOMING, + MANUAL; + } + + private ShootyRootyTootyState currentState; + private DigitalInput limitSwitch; + private TalonFX turret; + private TalonFX launcher; + private Servo hood; + private CANcoder hoodEncoder; + private Angle limitPos; + private Angle limitNeg; + private boolean turretGoingPos; + private Angle targElev; + + public TurretSubsystem() { + limitSwitch = new DigitalInput(Constants.ShooterConstants.LIMIT_CHANNEL); + turret = new TalonFX(Constants.ShooterConstants.TURRET_ID); + launcher = new TalonFX(Constants.ShooterConstants.LAUNCHER_ID); + hood = new Servo(Constants.ShooterConstants.HOOD_CHANNEL); + hoodEncoder = new CANcoder(Constants.ShooterConstants.HOOD_ENCODER_ID); + currentState = ShootyRootyTootyState.INIT; + limitNeg = Constants.ShooterConstants.LIMIT_NEG; + limitPos = Constants.ShooterConstants.LIMIT_POS; + turretGoingPos = false; + targElev = edu.wpi.first.units.Units.Degrees.of(45); + } + + public void setLauncher(double speed) + { + launcher.set(speed); + } + + public void setTargetElevation(Angle elev) + { + if(elev.gt(Constants.ShooterConstants.LIMIT_ELEVATION_NEG) && elev.lt(Constants.ShooterConstants.LIMIT_ELEVATION_POS)) + { + targElev=elev; + } + } + + private static final double homingSpeed=.35; + public void startHoming() + { + turret.set(homingSpeed); + currentState = ShootyRootyTootyState.HOMING; + } + + public void startRotate(double speed) + { + turretGoingPos=speed>0; + + if(!passedLimit()) + { + turret.set(speed); + } + else + { + turret.set(0); + } + } + + public boolean passedLimit() + { + return ((getTurretAngle().gt(limitPos) && turretGoingPos)||(getTurretAngle().lt(limitNeg) && !turretGoingPos)); + } + + private static final double turretGearRatio=1; + public Angle getTurretAngle() + { + return turret.getPosition().refresh().getValue().times(turretGearRatio); + } + + @Override + public void periodic() { + // This method will be called once per scheduler run + switch (currentState) { + case HOMING: + periodicHoming(); + break; + case MANUAL: + periodicManual(); + break; + + default: + break; + } + } + + private void periodicHoming() + { + if(limitSwitch.get()) + { + currentState = ShootyRootyTootyState.MANUAL; + turret.set(0); + turret.setPosition(0); + } + } + + private void periodicManual() + { + if(passedLimit()) + { + turret.set(0); + } + + Angle curElev = hoodEncoder.getAbsolutePosition().getValue(); + if(targElev.minus(curElev).abs(Units.Degrees)>Constants.ShooterConstants.TARGET_ELEVATION_DIF.in(Units.Degrees)) + { + if(targElev.gt(curElev)) + { + hood.set(50); + } + else + { + hood.set(-50); + } + } + else + { + hood.set(0); + } + } +} From 4105d15a535d77995ca54739da4f1af3f6b9b593 Mon Sep 17 00:00:00 2001 From: TheRealGrayden Date: Sat, 7 Mar 2026 13:38:19 -0500 Subject: [PATCH 2/8] Shooter Subsystem --- src/main/java/frc/robot/Constants.java | 6 ++++++ .../frc/robot/subsystems/HopperSubsystem.java | 19 +++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 5f89a34..6e89275 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -7,6 +7,7 @@ package frc.robot; import edu.wpi.first.math.util.Units; import edu.wpi.first.units.Unit; import edu.wpi.first.units.measure.Angle; +import java.security.PublicKey; /** * The Constants class provides a convenient place for teams to hold robot-wide numerical or boolean @@ -82,4 +83,9 @@ public final class Constants { public static final Angle LIMIT_ELEVATION_POS = edu.wpi.first.units.Units.Degrees.of(90); public static final Angle LIMIT_ELEVATION_NEG = edu.wpi.first.units.Units.Degrees.of(0); } + + public static class HopperConstants { + public static final int KICKER_MOTOR_ID = 0; + public static final int SPINDEXER_MOTOR_ID = 1; + } } diff --git a/src/main/java/frc/robot/subsystems/HopperSubsystem.java b/src/main/java/frc/robot/subsystems/HopperSubsystem.java index bd36015..8dfe649 100644 --- a/src/main/java/frc/robot/subsystems/HopperSubsystem.java +++ b/src/main/java/frc/robot/subsystems/HopperSubsystem.java @@ -10,7 +10,7 @@ import org.fairportrobotics.frc.posty.test.PostTest; import com.ctre.phoenix6.hardware.TalonFX; import static org.fairportrobotics.frc.posty.assertions.Assertions.*; - +import frc.robot.Constants; import edu.wpi.first.wpilibj2.command.Command; public class HopperSubsystem extends TestableSubsystem { @@ -19,28 +19,23 @@ public class HopperSubsystem extends TestableSubsystem { private TalonFX kickerMotor; /** Creates a new HopperSubsystem. */ public HopperSubsystem() { - spindexerMotor = new TalonFX(0); - kickerMotor = new TalonFX(1); + spindexerMotor = new TalonFX(Constants.HopperConstants.SPINDEXER_MOTOR_ID); + kickerMotor = new TalonFX(Constants.HopperConstants.KICKER_MOTOR_ID); } - public void feed(){ - + public void feed() { kickerMotor.set(0.5); } - public void reverse(){ - + public void reverse() { kickerMotor.set(-0.5); - } - public void stop(){ - + public void stop() { kickerMotor.set(0); } - public void spin(double speed){ - + public void spin(double speed) { spindexerMotor.set(speed); } From 3d09d17ab5bea32a7c5918291fde323c6c57435e Mon Sep 17 00:00:00 2001 From: TheRealGrayden Date: Sat, 7 Mar 2026 14:12:12 -0500 Subject: [PATCH 3/8] Changes made --- src/main/java/frc/robot/Constants.java | 6 +++-- .../frc/robot/subsystems/TurretSubsystem.java | 27 +++++++++---------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 6e89275..99f9b8d 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -77,11 +77,13 @@ public final class Constants { public static final int LAUNCHER_ID = 2; public static final int HOOD_CHANNEL = 3; public static final int HOOD_ENCODER_ID = 4; - public static final Angle LIMIT_POS = edu.wpi.first.units.Units.Degrees.of(265); - public static final Angle LIMIT_NEG = edu.wpi.first.units.Units.Degrees.of(5); + public static final Angle LIMIT_AXIMUTH_POS = edu.wpi.first.units.Units.Degrees.of(265); + public static final Angle LIMIT_AXIMUTH_NEG = edu.wpi.first.units.Units.Degrees.of(5); public static final Angle TARGET_ELEVATION_DIF = edu.wpi.first.units.Units.Degrees.of(1); public static final Angle LIMIT_ELEVATION_POS = edu.wpi.first.units.Units.Degrees.of(90); public static final Angle LIMIT_ELEVATION_NEG = edu.wpi.first.units.Units.Degrees.of(0); + public static final double HOMING_SPEED = .35; + public static final double GEAR_RATIO = 1; } public static class HopperConstants { diff --git a/src/main/java/frc/robot/subsystems/TurretSubsystem.java b/src/main/java/frc/robot/subsystems/TurretSubsystem.java index 6b7c7c2..7eb7158 100644 --- a/src/main/java/frc/robot/subsystems/TurretSubsystem.java +++ b/src/main/java/frc/robot/subsystems/TurretSubsystem.java @@ -20,14 +20,14 @@ import edu.wpi.first.wpilibj.Servo; import edu.wpi.first.wpilibj2.command.Command; public class TurretSubsystem extends TestableSubsystem { - public enum ShootyRootyTootyState { + public enum TurretState { INIT, HOMING, MANUAL; } - private ShootyRootyTootyState currentState; - private DigitalInput limitSwitch; + private TurretState currentState; + private DigitalInput turretLimitSwitch; private TalonFX turret; private TalonFX launcher; private Servo hood; @@ -38,12 +38,14 @@ public class TurretSubsystem extends TestableSubsystem { private Angle targElev; public TurretSubsystem() { - limitSwitch = new DigitalInput(Constants.ShooterConstants.LIMIT_CHANNEL); + turretLimitSwitch = new DigitalInput(Constants.ShooterConstants.LIMIT_CHANNEL); turret = new TalonFX(Constants.ShooterConstants.TURRET_ID); + launcher = new TalonFX(Constants.ShooterConstants.LAUNCHER_ID); + hood = new Servo(Constants.ShooterConstants.HOOD_CHANNEL); hoodEncoder = new CANcoder(Constants.ShooterConstants.HOOD_ENCODER_ID); - currentState = ShootyRootyTootyState.INIT; + currentState = TurretState.INIT; limitNeg = Constants.ShooterConstants.LIMIT_NEG; limitPos = Constants.ShooterConstants.LIMIT_POS; turretGoingPos = false; @@ -63,11 +65,10 @@ public class TurretSubsystem extends TestableSubsystem { } } - private static final double homingSpeed=.35; public void startHoming() { - turret.set(homingSpeed); - currentState = ShootyRootyTootyState.HOMING; + turret.set(Constants.ShooterConstants.HOMING_SPEED); + currentState = TurretState.HOMING; } public void startRotate(double speed) @@ -85,14 +86,12 @@ public class TurretSubsystem extends TestableSubsystem { } public boolean passedLimit() - { - return ((getTurretAngle().gt(limitPos) && turretGoingPos)||(getTurretAngle().lt(limitNeg) && !turretGoingPos)); + return (getTurretAngle().gt(limitPos) && turretGoingPos) || (getTurretAngle().lt(limitNeg) && !turretGoingPos); } - private static final double turretGearRatio=1; public Angle getTurretAngle() { - return turret.getPosition().refresh().getValue().times(turretGearRatio); + return turret.getPosition().refresh().getValue().times(Constants.ShooterConstants.GEAR_RATIO); } @Override @@ -113,9 +112,9 @@ public class TurretSubsystem extends TestableSubsystem { private void periodicHoming() { - if(limitSwitch.get()) + if(turretLimitSwitch.get()) { - currentState = ShootyRootyTootyState.MANUAL; + currentState = TurretState.MANUAL; turret.set(0); turret.setPosition(0); } From 07b7d86b5bf7112a3ca205a24953a44c76fd8e33 Mon Sep 17 00:00:00 2001 From: TheRealGrayden Date: Sat, 7 Mar 2026 14:13:52 -0500 Subject: [PATCH 4/8] Fixed the thingie --- src/main/java/frc/robot/subsystems/TurretSubsystem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/frc/robot/subsystems/TurretSubsystem.java b/src/main/java/frc/robot/subsystems/TurretSubsystem.java index 7eb7158..adf6a15 100644 --- a/src/main/java/frc/robot/subsystems/TurretSubsystem.java +++ b/src/main/java/frc/robot/subsystems/TurretSubsystem.java @@ -46,8 +46,8 @@ public class TurretSubsystem extends TestableSubsystem { hood = new Servo(Constants.ShooterConstants.HOOD_CHANNEL); hoodEncoder = new CANcoder(Constants.ShooterConstants.HOOD_ENCODER_ID); currentState = TurretState.INIT; - limitNeg = Constants.ShooterConstants.LIMIT_NEG; - limitPos = Constants.ShooterConstants.LIMIT_POS; + limitNeg = Constants.ShooterConstants.LIMIT_AXIMUTH_NEG; + limitPos = Constants.ShooterConstants.LIMIT_AXIMUTH_POS; turretGoingPos = false; targElev = edu.wpi.first.units.Units.Degrees.of(45); } From 0b71fe97b0f970b1af0e7eb6cca76361dfa0c0be Mon Sep 17 00:00:00 2001 From: TheRealGrayden Date: Sat, 7 Mar 2026 14:24:47 -0500 Subject: [PATCH 5/8] Renamed --- .../frc/robot/subsystems/TurretSubsystem.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/frc/robot/subsystems/TurretSubsystem.java b/src/main/java/frc/robot/subsystems/TurretSubsystem.java index adf6a15..62fe616 100644 --- a/src/main/java/frc/robot/subsystems/TurretSubsystem.java +++ b/src/main/java/frc/robot/subsystems/TurretSubsystem.java @@ -28,8 +28,8 @@ public class TurretSubsystem extends TestableSubsystem { private TurretState currentState; private DigitalInput turretLimitSwitch; - private TalonFX turret; - private TalonFX launcher; + private TalonFX turretMotor; + private TalonFX launcherMotor; private Servo hood; private CANcoder hoodEncoder; private Angle limitPos; @@ -39,9 +39,9 @@ public class TurretSubsystem extends TestableSubsystem { public TurretSubsystem() { turretLimitSwitch = new DigitalInput(Constants.ShooterConstants.LIMIT_CHANNEL); - turret = new TalonFX(Constants.ShooterConstants.TURRET_ID); + turretMotor = new TalonFX(Constants.ShooterConstants.TURRET_ID); - launcher = new TalonFX(Constants.ShooterConstants.LAUNCHER_ID); + launcherMotor = new TalonFX(Constants.ShooterConstants.LAUNCHER_ID); hood = new Servo(Constants.ShooterConstants.HOOD_CHANNEL); hoodEncoder = new CANcoder(Constants.ShooterConstants.HOOD_ENCODER_ID); @@ -54,7 +54,7 @@ public class TurretSubsystem extends TestableSubsystem { public void setLauncher(double speed) { - launcher.set(speed); + launcherMotor.set(speed); } public void setTargetElevation(Angle elev) @@ -67,7 +67,7 @@ public class TurretSubsystem extends TestableSubsystem { public void startHoming() { - turret.set(Constants.ShooterConstants.HOMING_SPEED); + turretMotor.set(Constants.ShooterConstants.HOMING_SPEED); currentState = TurretState.HOMING; } @@ -77,21 +77,21 @@ public class TurretSubsystem extends TestableSubsystem { if(!passedLimit()) { - turret.set(speed); + turretMotor.set(speed); } else { - turret.set(0); + turretMotor.set(0); } } - public boolean passedLimit() + public boolean passedLimit(){ return (getTurretAngle().gt(limitPos) && turretGoingPos) || (getTurretAngle().lt(limitNeg) && !turretGoingPos); } public Angle getTurretAngle() { - return turret.getPosition().refresh().getValue().times(Constants.ShooterConstants.GEAR_RATIO); + return turretMotor.getPosition().refresh().getValue().times(Constants.ShooterConstants.GEAR_RATIO); } @Override @@ -115,8 +115,8 @@ public class TurretSubsystem extends TestableSubsystem { if(turretLimitSwitch.get()) { currentState = TurretState.MANUAL; - turret.set(0); - turret.setPosition(0); + turretMotor.set(0); + turretMotor.setPosition(0); } } @@ -124,7 +124,7 @@ public class TurretSubsystem extends TestableSubsystem { { if(passedLimit()) { - turret.set(0); + turretMotor.set(0); } Angle curElev = hoodEncoder.getAbsolutePosition().getValue(); From e81a580c669cf9e566409297096bdfb75ebca2bc Mon Sep 17 00:00:00 2001 From: TheRealGrayden Date: Sat, 7 Mar 2026 14:26:41 -0500 Subject: [PATCH 6/8] GEAR --- src/main/java/frc/robot/Constants.java | 2 +- src/main/java/frc/robot/subsystems/TurretSubsystem.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 99f9b8d..256dd63 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -83,7 +83,7 @@ public final class Constants { public static final Angle LIMIT_ELEVATION_POS = edu.wpi.first.units.Units.Degrees.of(90); public static final Angle LIMIT_ELEVATION_NEG = edu.wpi.first.units.Units.Degrees.of(0); public static final double HOMING_SPEED = .35; - public static final double GEAR_RATIO = 1; + public static final double TURET_GEAR_RATIO = 1; } public static class HopperConstants { diff --git a/src/main/java/frc/robot/subsystems/TurretSubsystem.java b/src/main/java/frc/robot/subsystems/TurretSubsystem.java index 62fe616..b5e596f 100644 --- a/src/main/java/frc/robot/subsystems/TurretSubsystem.java +++ b/src/main/java/frc/robot/subsystems/TurretSubsystem.java @@ -91,7 +91,7 @@ public class TurretSubsystem extends TestableSubsystem { public Angle getTurretAngle() { - return turretMotor.getPosition().refresh().getValue().times(Constants.ShooterConstants.GEAR_RATIO); + return turretMotor.getPosition().refresh().getValue().times(Constants.ShooterConstants.TURET_GEAR_RATIO); } @Override From 2e6fdccebc7407c8a23e0c70456558b68686fda2 Mon Sep 17 00:00:00 2001 From: TheRealGrayden Date: Sat, 7 Mar 2026 14:28:04 -0500 Subject: [PATCH 7/8] I cant spell --- src/main/java/frc/robot/Constants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 256dd63..aefd7c5 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -83,7 +83,7 @@ public final class Constants { public static final Angle LIMIT_ELEVATION_POS = edu.wpi.first.units.Units.Degrees.of(90); public static final Angle LIMIT_ELEVATION_NEG = edu.wpi.first.units.Units.Degrees.of(0); public static final double HOMING_SPEED = .35; - public static final double TURET_GEAR_RATIO = 1; + public static final double TURRET_GEAR_RATIO = 1; } public static class HopperConstants { From 55f1f13745685b01e0b199aab84826ba585e7d64 Mon Sep 17 00:00:00 2001 From: TheRealGrayden Date: Sat, 7 Mar 2026 14:31:15 -0500 Subject: [PATCH 8/8] I can spell im just stupid --- src/main/java/frc/robot/subsystems/TurretSubsystem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/frc/robot/subsystems/TurretSubsystem.java b/src/main/java/frc/robot/subsystems/TurretSubsystem.java index b5e596f..ccb29d0 100644 --- a/src/main/java/frc/robot/subsystems/TurretSubsystem.java +++ b/src/main/java/frc/robot/subsystems/TurretSubsystem.java @@ -91,7 +91,7 @@ public class TurretSubsystem extends TestableSubsystem { public Angle getTurretAngle() { - return turretMotor.getPosition().refresh().getValue().times(Constants.ShooterConstants.TURET_GEAR_RATIO); + return turretMotor.getPosition().refresh().getValue().times(Constants.ShooterConstants.TURRET_GEAR_RATIO); } @Override