From b2d32492e5c98cd4fc1bbcb5bbdb75d6082fb3b2 Mon Sep 17 00:00:00 2001 From: Niosocket11 Date: Fri, 20 Mar 2026 15:18:32 -0700 Subject: [PATCH 1/2] Added rumble --- .../org/carlmontrobotics/RobotContainer.java | 5 ++-- .../ManipulatorCommands/IntakeBalls.java | 23 ++++++++++++++++-- .../carlmontrobotics/subsystems/Intake.java | 24 +++++++++++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/carlmontrobotics/RobotContainer.java b/src/main/java/org/carlmontrobotics/RobotContainer.java index b70f5cd..7c62924 100644 --- a/src/main/java/org/carlmontrobotics/RobotContainer.java +++ b/src/main/java/org/carlmontrobotics/RobotContainer.java @@ -84,6 +84,7 @@ public class RobotContainer implements Sendable { public final GenericHID driverController = new GenericHID(Driver.port); public final XboxController driverRumble = new XboxController(Driver.port); //For rumbling the controller public final GenericHID manipulatorController = new GenericHID(Manipulator.port); + public final XboxController manipulatorRumble = new XboxController(Manipulator.port); public final Limelight limelight = new Limelight(); public final Drivetrain drivetrain = new Drivetrain(limelight); @@ -146,7 +147,7 @@ private void setBindingsManipulator() { .whileTrue(new RunConveyor(intake)); //could be toggle mode instead // .whileTrue(new OuttakeFeeder(outtake)); //could be toggle mode instead new JoystickButton(manipulatorController, Manipulator.INTAKE_BUTTON) - .whileTrue(new IntakeBalls(intake)); + .whileTrue(new IntakeBalls(intake, manipulatorRumble)); new JoystickButton(manipulatorController, Manipulator.OUTTAKE_BUTTON) .whileTrue(new ShootBalls(outtake)); axisTrigger(manipulatorController, Manipulator.SMART_SHOOT_AXIS, OI.JOY_THRESH) @@ -172,7 +173,7 @@ private void setDefaultCommands() { () -> SmartDashboard.getBoolean("Baby Mode", Config.CONFIG.isBabyMode()) )); - intake.setDefaultCommand(new IntakeBalls(intake)); + intake.setDefaultCommand(new IntakeBalls(intake, manipulatorRumble)); } //#endregion //#region getAutoCommand diff --git a/src/main/java/org/carlmontrobotics/commands/ManipulatorCommands/IntakeBalls.java b/src/main/java/org/carlmontrobotics/commands/ManipulatorCommands/IntakeBalls.java index 855c509..1f6f0b9 100644 --- a/src/main/java/org/carlmontrobotics/commands/ManipulatorCommands/IntakeBalls.java +++ b/src/main/java/org/carlmontrobotics/commands/ManipulatorCommands/IntakeBalls.java @@ -8,15 +8,20 @@ import org.carlmontrobotics.subsystems.Intake; +import edu.wpi.first.wpilibj.XboxController; +import edu.wpi.first.wpilibj.GenericHID.RumbleType; +import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; import edu.wpi.first.wpilibj2.command.Command; /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ public class IntakeBalls extends Command { Intake intake; + XboxController manipulatorRumble; /** Creates a new IntakeBalls. */ - public IntakeBalls(Intake intake) { + public IntakeBalls(Intake intake, XboxController manipulatorRumble) { this.intake = intake; + this.manipulatorRumble = manipulatorRumble; addRequirements(intake); // Use addRequirements() here to declare subsystem dependencies. } @@ -29,12 +34,22 @@ public void initialize() { // Called every time the scheduler runs while the command is scheduled. @Override - public void execute() {} + public void execute() { + if (checkIfJammed()) { + SmartDashboard.putBoolean("IntakeJammed", true); + manipulatorRumble.setRumble(RumbleType.kRightRumble, 0.5); + } + else { + SmartDashboard.putBoolean("IntakeJammed", true); + manipulatorRumble.setRumble(RumbleType.kRightRumble, 0); + } + } // Called once the command ends or is interrupted. @Override public void end(boolean interrupted) { intake.stopIntake(); + manipulatorRumble.setRumble(RumbleType.kRightRumble, 0); } // Returns true when the command should end. @@ -42,4 +57,8 @@ public void end(boolean interrupted) { public boolean isFinished() { return false; } + + private boolean checkIfJammed() { + return intake.getIntakeVelocity() < 20; + } } diff --git a/src/main/java/org/carlmontrobotics/subsystems/Intake.java b/src/main/java/org/carlmontrobotics/subsystems/Intake.java index 85fedaf..27d5802 100644 --- a/src/main/java/org/carlmontrobotics/subsystems/Intake.java +++ b/src/main/java/org/carlmontrobotics/subsystems/Intake.java @@ -62,4 +62,28 @@ public void periodic() { // This method will be called once per scheduler run SmartDashboard.putNumber("rpm brr", intakeMotor.getEncoder().getVelocity()); } + + /** + * + * @return Number the RPM of the motor + */ + public double getIntakeVelocity() { + return intakeMotor.getEncoder().getVelocity(); + } + + /** + * + * @return The motor controller's output current in Amps. + */ + public double getIntakeCurrent() { + return intakeMotor.getOutputCurrent(); + } + /** + * + * @return The motor controller's applied output duty cycle. + + */ + public double getIntakeAppliedOutput() { + return intakeMotor.getAppliedOutput(); + } } From 8ef0e4e75801862d4a985c9b3c72429d52e44cdb Mon Sep 17 00:00:00 2001 From: Niosocket11 Date: Fri, 20 Mar 2026 15:21:54 -0700 Subject: [PATCH 2/2] Changed to generic hid --- src/main/java/org/carlmontrobotics/RobotContainer.java | 6 ++---- .../commands/ManipulatorCommands/IntakeBalls.java | 5 +++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/carlmontrobotics/RobotContainer.java b/src/main/java/org/carlmontrobotics/RobotContainer.java index 7c62924..271f901 100644 --- a/src/main/java/org/carlmontrobotics/RobotContainer.java +++ b/src/main/java/org/carlmontrobotics/RobotContainer.java @@ -82,9 +82,7 @@ public class RobotContainer implements Sendable { public final GenericHID driverController = new GenericHID(Driver.port); - public final XboxController driverRumble = new XboxController(Driver.port); //For rumbling the controller public final GenericHID manipulatorController = new GenericHID(Manipulator.port); - public final XboxController manipulatorRumble = new XboxController(Manipulator.port); public final Limelight limelight = new Limelight(); public final Drivetrain drivetrain = new Drivetrain(limelight); @@ -147,7 +145,7 @@ private void setBindingsManipulator() { .whileTrue(new RunConveyor(intake)); //could be toggle mode instead // .whileTrue(new OuttakeFeeder(outtake)); //could be toggle mode instead new JoystickButton(manipulatorController, Manipulator.INTAKE_BUTTON) - .whileTrue(new IntakeBalls(intake, manipulatorRumble)); + .whileTrue(new IntakeBalls(intake, manipulatorController)); new JoystickButton(manipulatorController, Manipulator.OUTTAKE_BUTTON) .whileTrue(new ShootBalls(outtake)); axisTrigger(manipulatorController, Manipulator.SMART_SHOOT_AXIS, OI.JOY_THRESH) @@ -173,7 +171,7 @@ private void setDefaultCommands() { () -> SmartDashboard.getBoolean("Baby Mode", Config.CONFIG.isBabyMode()) )); - intake.setDefaultCommand(new IntakeBalls(intake, manipulatorRumble)); + intake.setDefaultCommand(new IntakeBalls(intake, manipulatorController)); } //#endregion //#region getAutoCommand diff --git a/src/main/java/org/carlmontrobotics/commands/ManipulatorCommands/IntakeBalls.java b/src/main/java/org/carlmontrobotics/commands/ManipulatorCommands/IntakeBalls.java index 1f6f0b9..06145a6 100644 --- a/src/main/java/org/carlmontrobotics/commands/ManipulatorCommands/IntakeBalls.java +++ b/src/main/java/org/carlmontrobotics/commands/ManipulatorCommands/IntakeBalls.java @@ -9,6 +9,7 @@ import org.carlmontrobotics.subsystems.Intake; import edu.wpi.first.wpilibj.XboxController; +import edu.wpi.first.wpilibj.GenericHID; import edu.wpi.first.wpilibj.GenericHID.RumbleType; import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; import edu.wpi.first.wpilibj2.command.Command; @@ -16,10 +17,10 @@ /* You should consider using the more terse Command factories API instead https://docs.wpilib.org/en/stable/docs/software/commandbased/organizing-command-based.html#defining-commands */ public class IntakeBalls extends Command { Intake intake; - XboxController manipulatorRumble; + GenericHID manipulatorRumble; /** Creates a new IntakeBalls. */ - public IntakeBalls(Intake intake, XboxController manipulatorRumble) { + public IntakeBalls(Intake intake, GenericHID manipulatorRumble) { this.intake = intake; this.manipulatorRumble = manipulatorRumble; addRequirements(intake);