From 06e493aa2d8e82ad1e419035b14fcc32d2ad9c6f Mon Sep 17 00:00:00 2001 From: KeshavAnandCode Date: Sat, 1 Nov 2025 12:03:04 -0500 Subject: [PATCH] Added shooter syubsystem --- .../ftc/teamcode/subsystems/Shooter.java | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 TeamCode/src/main/java/org/firstinspires/ftc/teamcode/subsystems/Shooter.java diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/subsystems/Shooter.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/subsystems/Shooter.java new file mode 100644 index 0000000..a466bd0 --- /dev/null +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/subsystems/Shooter.java @@ -0,0 +1,183 @@ +package org.firstinspires.ftc.teamcode.subsystems; + +import com.acmerobotics.dashboard.telemetry.MultipleTelemetry; +import com.arcrobotics.ftclib.controller.PIDController; +import com.qualcomm.robotcore.hardware.DcMotor; +import com.qualcomm.robotcore.hardware.DcMotorEx; +import com.qualcomm.robotcore.hardware.PIDCoefficients; +import com.qualcomm.robotcore.hardware.PIDFCoefficients; +import com.qualcomm.robotcore.hardware.Servo; + +import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit; +import org.firstinspires.ftc.robotcore.external.navigation.CurrentUnit; +import org.firstinspires.ftc.teamcode.utils.Robot; +import org.firstinspires.ftc.teamcode.subsystems.Subsystem; + +import java.util.Objects; + +public class Shooter implements Subsystem { + private final DcMotorEx fly1; + private final DcMotorEx fly2; + private final Servo hoodServo; + + private final MultipleTelemetry telemetry; + + private boolean telemetryOn = false; + + private double manualPower = 0.0; + private double servoPos = 0.0; + private double velocity = 0.0; + private double posPower = 0.0; + + private int targetPosition = 0; + + private double p = 0.0003, i = 0, d = 0.00001; + + private PIDController controller; + + + + + + private String Mode = "MANUAL"; + + public Shooter(Robot robot, MultipleTelemetry TELE) { + this.fly1 = robot.shooter1; + this.fly2 = robot.shooter2; + this.telemetry = TELE; + this.hoodServo = robot.hood; + + // Reset encoders + fly1.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER); + fly2.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER); + + fly1.setMode(DcMotor.RunMode.RUN_USING_ENCODER); + fly1.setMode(DcMotor.RunMode.RUN_USING_ENCODER); + + + controller = new PIDController(p, i, d); + + + controller.setPID(p, i, d); + + + + + + } + + public void telemetryUpdate() { + + // Telemetry + + telemetry.addData("Mode", Mode); + telemetry.addData("ManualPower", manualPower); + telemetry.addData("Position", getPosition()); + telemetry.addData("TargetPosition", targetPosition); + telemetry.addData("Velocity", getVelocity()); + telemetry.addData("TargetVelocity", velocity); + telemetry.addData("ServoPos", getServoPosition()); + telemetry.addData("PID Coefficients", "P: %.6f, I: %.6f, D: %.6f", p, i, d); + telemetry.addData("Current Fly 1", fly1.getCurrent(CurrentUnit.AMPS)); + telemetry.addData("Current Fly 2", fly2.getCurrent(CurrentUnit.AMPS)); + + } + + public double getServoPosition() { + return (hoodServo.getPosition()); + } + + public void setServoPosition(double pos) {servoPos = pos;} + + public double getVelocity() { + return ((double) ((fly1.getVelocity(AngleUnit.DEGREES) + fly2.getVelocity(AngleUnit.DEGREES)) /2)); + } + + public void setVelocity(double vel){velocity = vel;} + + + + public void setPosPower(double power){posPower = power;} + + + public void setTargetPosition(int pos){ + targetPosition = pos; + } + + public void setTolerance(int tolerance){ + controller.setTolerance(tolerance); + } + + public void setControllerCoefficients(double kp, double ki, double kd){ + p = kp; + i = ki; + d = kd; + controller.setPID(p, i, d); + + } + + public PIDCoefficients getControllerCoefficients(){ + + return new PIDCoefficients(p, i, d); + + } + + + + + + + + public void setManualPower(double power){manualPower = power;} + + public String getMode(){return Mode;} + + public double getPosition(){ + return ((double) ((fly1.getCurrentPosition() + fly2.getCurrentPosition()) /2)); + } + + public void setMode(String mode){ Mode = mode;} + + public void setTelemetryOn(boolean state){telemetryOn = state;} + + @Override + public void update() { + + if (Objects.equals(Mode, "MANUAL")){ + fly1.setMode(DcMotor.RunMode.RUN_USING_ENCODER); + fly2.setMode(DcMotor.RunMode.RUN_USING_ENCODER); + + + fly1.setPower(manualPower); + fly2.setPower(manualPower); + } + + else if (Objects.equals(Mode, "VEL")){ + + fly1.setMode(DcMotor.RunMode.RUN_USING_ENCODER); + fly2.setMode(DcMotor.RunMode.RUN_USING_ENCODER); + + + fly1.setVelocity(velocity, AngleUnit.DEGREES); + fly2.setVelocity(velocity, AngleUnit.DEGREES); + } + + else if (Objects.equals(Mode, "POS")){ + + + double powPID = controller.calculate(getPosition(), targetPosition); + + + + fly1.setPower(powPID); + fly2.setPower(powPID); + } + + hoodServo.setPosition(servoPos); + + if (telemetryOn) {telemetryUpdate();} + + + + } +}