Files
2022NoWayHome/src/main/java/frc4388/robot/RobotContainer.java
T

428 lines
22 KiB
Java
Raw Normal View History

2022-01-11 11:05:52 -07:00
// 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.
2021-11-15 16:26:16 -07:00
package frc4388.robot;
import java.util.Objects;
2022-02-15 11:05:59 -07:00
import java.util.logging.Logger;
2022-01-21 16:50:26 -07:00
2022-01-29 14:39:46 -07:00
import com.pathplanner.lib.PathPlanner;
2022-02-04 19:02:41 -07:00
import com.pathplanner.lib.PathPlannerTrajectory;
2022-02-07 19:49:27 -07:00
import com.pathplanner.lib.PathPlannerTrajectory.PathPlannerState;
2022-02-04 19:02:41 -07:00
import com.pathplanner.lib.commands.PPSwerveControllerCommand;
2022-01-29 14:39:46 -07:00
import edu.wpi.first.math.controller.PIDController;
import edu.wpi.first.math.controller.ProfiledPIDController;
import edu.wpi.first.math.geometry.Pose2d;
2022-01-29 14:39:46 -07:00
import edu.wpi.first.math.geometry.Rotation2d;
2022-02-11 18:53:13 -07:00
import edu.wpi.first.wpilibj.GenericHID;
2022-04-17 01:15:33 -06:00
import edu.wpi.first.wpilibj.Preferences;
import edu.wpi.first.wpilibj.XboxController;
2022-03-24 13:59:59 -06:00
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser;
2022-02-16 22:31:00 -07:00
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
2021-11-15 16:26:16 -07:00
import edu.wpi.first.wpilibj2.command.Command;
2022-04-07 17:09:04 -06:00
import edu.wpi.first.wpilibj2.command.CommandGroupBase;
2022-02-03 20:53:43 -07:00
import edu.wpi.first.wpilibj2.command.InstantCommand;
2022-04-04 17:22:52 -06:00
import edu.wpi.first.wpilibj2.command.ParallelDeadlineGroup;
2021-11-15 16:26:16 -07:00
import edu.wpi.first.wpilibj2.command.RunCommand;
2022-02-03 20:53:43 -07:00
import edu.wpi.first.wpilibj2.command.SequentialCommandGroup;
2022-04-07 17:09:04 -06:00
import edu.wpi.first.wpilibj2.command.WaitCommand;
2021-11-15 16:26:16 -07:00
import edu.wpi.first.wpilibj2.command.button.JoystickButton;
2022-04-17 01:15:33 -06:00
import frc4388.robot.Constants.AutoConstants;
2022-02-11 18:53:13 -07:00
import frc4388.robot.Constants.OIConstants;
2022-03-05 22:57:55 -07:00
import frc4388.robot.Constants.StorageConstants;
import frc4388.robot.Constants.SwerveDriveConstants;
2022-03-08 16:31:42 -07:00
import frc4388.robot.commands.PathRecorder;
2022-03-14 20:10:12 -06:00
import frc4388.robot.commands.ExtenderIntakeCommands.ExtenderIntakeGroup;
2022-04-17 01:15:33 -06:00
import frc4388.robot.commands.shooter.TimedWaitUntilCommand;
import frc4388.robot.commands.shooter.TrackTarget;
2022-04-06 13:22:15 -06:00
import frc4388.robot.commands.shuffleboard.CommandSchedule;
import frc4388.robot.commands.shuffleboard.ShooterTuner;
2022-01-20 18:08:05 -07:00
import frc4388.robot.subsystems.BoomBoom;
2022-03-25 09:15:02 -06:00
import frc4388.robot.subsystems.Camera;
import frc4388.robot.subsystems.Claws;
2022-03-10 16:47:32 -07:00
import frc4388.robot.subsystems.Climber;
2022-03-12 15:05:32 -07:00
import frc4388.robot.subsystems.Extender;
2022-01-20 18:08:05 -07:00
import frc4388.robot.subsystems.Hood;
2022-03-05 15:32:48 -07:00
import frc4388.robot.subsystems.Intake;
2022-04-07 11:35:07 -06:00
import frc4388.robot.subsystems.LED;
2022-01-15 14:20:49 -07:00
import frc4388.robot.subsystems.Serializer;
2022-02-26 15:41:54 -07:00
import frc4388.robot.subsystems.Storage;
2021-12-02 17:51:06 -07:00
import frc4388.robot.subsystems.SwerveDrive;
2022-01-20 18:08:05 -07:00
import frc4388.robot.subsystems.Turret;
2022-03-05 11:29:40 -07:00
import frc4388.robot.subsystems.VisionOdometry;
2022-03-12 17:33:38 -07:00
import frc4388.utility.controller.ButtonBox;
2022-03-22 19:48:40 -06:00
import frc4388.utility.controller.DeadbandedXboxController;
2021-11-15 16:26:16 -07:00
2022-04-17 01:15:33 -06:00
//TODO: Try using ConditionalCommand for subsystem default commands.
//TODO: Replace Path Recorder with Auto Chooser.
//TODO: Add POV button pad bindings as an example.
//XXX: Re-enable extender in autonomous.
2021-11-15 16:26:16 -07:00
/**
2022-04-17 01:15:33 -06:00
* This class is where the bulk of the robot should be declared. Since Command-based is a
* "declarative" paradigm, very little robot logic should actually be handled in the {@link Robot}
* periodic methods (other than the scheduler calls). Instead, the structure of the robot (including
* subsystems, commands, and button mappings) should be declared here.
2021-11-15 16:26:16 -07:00
*/
public class RobotContainer {
2022-02-25 01:33:32 -07:00
private static final Logger LOGGER = Logger.getLogger(RobotContainer.class.getSimpleName());
2022-03-14 20:10:12 -06:00
2022-04-17 01:15:33 -06:00
/* Robot Map */
2022-03-07 15:26:05 -07:00
public final RobotMap m_robotMap = new RobotMap();
2022-01-11 11:05:52 -07:00
2022-03-11 23:25:05 -07:00
/* Subsystems */
2022-03-25 09:15:02 -06:00
public final Camera m_robotCamera = new Camera("driver", 0, 160, 120, 40);
2022-03-20 18:09:16 -06:00
public final Climber m_robotClimber = new Climber(m_robotMap.elbow);
2022-04-17 01:15:33 -06:00
public final Claws m_robotClaws = new Claws(m_robotMap.leftClaw, m_robotMap.rightClaw);
public final SwerveDrive m_robotSwerveDrive = new SwerveDrive(m_robotMap.frontLeft, m_robotMap.frontRight, m_robotMap.backLeft, m_robotMap.backRight, m_robotMap.gyro);
public final Serializer m_robotSerializer = new Serializer(m_robotMap.serializerBelt);
2022-03-14 20:10:12 -06:00
public final Intake m_robotIntake = new Intake(m_robotMap.intakeMotor);
2022-03-12 15:05:32 -07:00
public final Extender m_robotExtender = new Extender(m_robotMap.extenderMotor);
2022-03-07 15:26:05 -07:00
public final Storage m_robotStorage = new Storage(m_robotMap.storageMotor);
2022-04-17 01:15:33 -06:00
public final LED m_robotLED = new LED(m_robotMap.LEDController);
2022-03-07 15:26:05 -07:00
public final BoomBoom m_robotBoomBoom = new BoomBoom(m_robotMap.shooterFalconLeft, m_robotMap.shooterFalconRight);
public final Hood m_robotHood = new Hood(m_robotMap.angleAdjusterMotor);
public final Turret m_robotTurret = new Turret(m_robotMap.shooterTurret);
2022-03-13 19:59:55 -06:00
public final VisionOdometry m_robotVisionOdometry = new VisionOdometry(m_robotSwerveDrive, m_robotTurret);
2022-01-11 11:05:52 -07:00
2022-04-17 01:15:33 -06:00
/* Dashboard Tools */
2022-03-08 16:31:42 -07:00
private final PathRecorder m_pathChooser = new PathRecorder(m_robotSwerveDrive);
2022-04-17 01:15:33 -06:00
private final SendableChooser<Command> autoChooser = new SendableChooser<Command>();
2022-03-25 08:32:58 -06:00
private final ShooterTuner m_shooterTuner = new ShooterTuner(m_robotBoomBoom);
2022-04-07 16:35:07 -06:00
private final CommandSchedule m_commandSchedule = new CommandSchedule(10, 5, false);
2022-04-17 01:15:33 -06:00
/* Controllers */
private final DeadbandedXboxController m_driverXbox = new DeadbandedXboxController(OIConstants.XBOX_DRIVER_ID);
private final DeadbandedXboxController m_operatorXbox = new DeadbandedXboxController(OIConstants.XBOX_OPERATOR_ID);
2022-03-12 19:02:37 -07:00
private final ButtonBox m_buttonBox = new ButtonBox(OIConstants.BUTTON_BOX_ID);
2022-04-17 01:15:33 -06:00
private static boolean softLimits = true;
2022-04-17 01:15:33 -06:00
// control mode switching
private enum ControlMode {
SHOOTER, CLIMBER
}
2022-03-18 17:39:06 -06:00
2022-04-17 01:15:33 -06:00
private ControlMode currentControlMode = ControlMode.SHOOTER;
2022-02-16 22:31:00 -07:00
2022-03-25 10:29:17 -06:00
// drive on off mode switching
2022-04-17 01:15:33 -06:00
private enum DriveMode {
ON, OFF
}
2022-03-24 13:59:59 -06:00
2022-04-17 01:15:33 -06:00
private DriveMode currentDriveMode = DriveMode.ON;
2022-03-24 08:49:37 -06:00
2022-01-11 11:05:52 -07:00
/**
* The container for the robot. Contains subsystems, OI devices, and commands.
*/
public RobotContainer() {
2022-04-17 01:15:33 -06:00
autoChooser.addOption("threeBallPlus", threeBallPlus);
2022-03-24 13:59:59 -06:00
2022-04-07 15:13:24 -06:00
SmartDashboard.putData("AutoChooser", autoChooser);
2022-03-24 13:59:59 -06:00
2022-04-17 01:15:33 -06:00
Preferences.initString("Autonomous", "Three Ball");
2022-01-11 11:05:52 -07:00
configureButtonBindings();
/* Default Commands */
2022-04-04 13:37:20 -06:00
// Swerve Drive with Input
2022-04-17 01:15:33 -06:00
m_robotSwerveDrive.setDefaultCommand(new RunCommand(() -> {
if (currentDriveMode == DriveMode.ON) {
m_robotSwerveDrive.driveWithInput(getDriverController().getLeft(), getDriverController().getRight(), true);
}
if (currentDriveMode == DriveMode.OFF) {
m_robotSwerveDrive.driveWithInput(0, 0, 0, 0, false);
}
}, m_robotSwerveDrive).withName("SwerveDrive DefaultCommand"));
2022-04-04 13:37:20 -06:00
// Intake with Triggers
2022-04-17 01:15:33 -06:00
m_robotIntake.setDefaultCommand(new RunCommand(() -> m_robotIntake.runWithTriggers(getOperatorController().getLeftTriggerAxis(), getOperatorController().getRightTriggerAxis()), m_robotIntake).withName("Intake DefaultCommand"));
// TODO: Comment
m_robotBoomBoom.setDefaultCommand(new RunCommand(() -> m_robotBoomBoom.runDrumShooter(0.45), m_robotBoomBoom).withName("BoomBoom DefaultCommand"));
// Serializer Manual
m_robotSerializer.setDefaultCommand(new RunCommand(() -> m_robotSerializer.setSerializer(getOperatorController().getLeftTriggerAxis() * 0.8), m_robotSerializer).withName("Serializer DefaultCommand"));
// Turret Manual
m_robotTurret.setDefaultCommand(new RunCommand(() -> {
if (currentControlMode == ControlMode.SHOOTER) {
m_robotTurret.runTurretWithInput(getOperatorController().getLeftX());
}
if (currentControlMode == ControlMode.CLIMBER) {
m_robotTurret.runTurretWithInput(0);
}
}, m_robotTurret));
// Hood Manual
m_robotHood.setDefaultCommand(new RunCommand(() -> {
if (currentControlMode == ControlMode.SHOOTER) {
m_robotHood.runHood(getOperatorController().getLeftY());
}
if (currentControlMode == ControlMode.CLIMBER) {
m_robotHood.runHood(0);
}
}, m_robotHood));
// Climber Manual
m_robotClimber.setDefaultCommand(new RunCommand(() -> {
if (currentControlMode == ControlMode.SHOOTER) {
m_robotClimber.setMotors(0.0);
}
if (currentControlMode == ControlMode.CLIMBER) {
m_robotClimber.setMotors(-getOperatorController().getRightY());
}
}, m_robotClimber));
2022-04-17 01:15:33 -06:00
SmartDashboard.putData("Shooter Tuner", m_shooterTuner);
2022-03-25 08:32:58 -06:00
SmartDashboard.putData("Shooter Tuner", m_shooterTuner);
2022-04-06 02:32:17 -06:00
SmartDashboard.putData("Command Schedule", m_commandSchedule);
2022-01-11 11:05:52 -07:00
}
2022-01-15 11:31:15 -07:00
2022-01-11 11:05:52 -07:00
/**
2022-04-17 01:15:33 -06:00
* 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}.
2022-01-11 11:05:52 -07:00
*/
private void configureButtonBindings() {
2022-04-17 01:15:33 -06:00
// ! Driver Buttons
2022-01-11 11:05:52 -07:00
2022-04-17 01:15:33 -06:00
// Start > Calibrate Odometry
new JoystickButton(getDriverController(), XboxController.Button.kBack.value).whenPressed(() -> resetOdometry(new Pose2d(0, 0, new Rotation2d(0))));
2022-03-20 20:18:02 -06:00
2022-04-17 01:15:33 -06:00
// Start > Calibrate Odometry
new JoystickButton(getDriverController(), XboxController.Button.kStart.value).whenPressed(m_robotSwerveDrive::resetGyro);
2022-03-20 20:18:02 -06:00
2022-04-17 01:15:33 -06:00
// Left Bumper > Shift Down
new JoystickButton(getDriverController(), XboxController.Button.kLeftBumper.value).whenPressed(() -> m_robotSwerveDrive.highSpeed(false));
2022-03-20 20:18:02 -06:00
2022-04-17 01:15:33 -06:00
// Right Bumper > Shift Up
new JoystickButton(getDriverController(), XboxController.Button.kRightBumper.value).whenPressed(() -> m_robotSwerveDrive.highSpeed(true));
2022-03-18 23:11:30 -06:00
2022-04-17 01:15:33 -06:00
new JoystickButton(getDriverController(), XboxController.Button.kA.value).whenPressed(new InstantCommand(() -> switchControlMode())).whenReleased(new InstantCommand(() -> switchControlMode()));
2022-03-20 18:09:16 -06:00
2022-04-17 01:15:33 -06:00
new JoystickButton(getDriverController(), XboxController.Button.kB.value).whenPressed(new InstantCommand(() -> switchDriveMode())).whenReleased(new InstantCommand(() -> switchDriveMode()));
2022-03-20 16:22:11 -06:00
2022-04-17 01:15:33 -06:00
// ! Operator Buttons
2022-03-20 20:18:02 -06:00
2022-04-17 01:15:33 -06:00
// Right Bumper > Storage Out
new JoystickButton(getOperatorController(), XboxController.Button.kRightBumper.value).whileHeld(new RunCommand(() -> m_robotStorage.runStorage(-StorageConstants.STORAGE_SPEED))).whenReleased(new RunCommand(() -> m_robotStorage.runStorage(0.0)));
2022-03-20 20:18:02 -06:00
2022-04-17 01:15:33 -06:00
// Left Bumper > Storage In
new JoystickButton(getOperatorController(), XboxController.Button.kLeftBumper.value).whileHeld(new RunCommand(() -> m_robotStorage.runStorage(StorageConstants.STORAGE_SPEED))).whenReleased(new RunCommand(() -> m_robotStorage.runStorage(0.0)));
2022-03-20 20:18:02 -06:00
2022-04-17 01:15:33 -06:00
// B > Toggle claws
new JoystickButton(getOperatorController(), XboxController.Button.kB.value).whenPressed(new InstantCommand(() -> m_robotClaws.toggleClaws(), m_robotClaws));
2022-03-20 14:25:38 -06:00
2022-04-17 01:15:33 -06:00
// X > Toggles extender in and out
new JoystickButton(getOperatorController(), XboxController.Button.kX.value).whenPressed(new ExtenderIntakeGroup(m_robotIntake, m_robotExtender));
2022-03-16 20:16:32 -06:00
2022-04-17 01:15:33 -06:00
// A > Spit Out Ball
new JoystickButton(getOperatorController(), XboxController.Button.kA.value).whileHeld(new RunCommand(() -> m_robotTurret.gotoMidpoint(), m_robotTurret)).whileHeld(new RunCommand(() -> m_robotBoomBoom.runDrumShooter(0.25)));
2022-03-20 20:18:02 -06:00
2022-04-17 01:15:33 -06:00
// Y > Full aim command
2022-03-14 15:16:21 -06:00
// new JoystickButton(getOperatorController(), XboxController.Button.kY.value)
2022-04-17 01:15:33 -06:00
// .whileHeld(new Seek(m_robotSwerveDrive, m_robotBoomBoom, m_robotTurret, m_robotHood,
// m_robotVisionOdometry));
2022-03-20 21:21:45 -06:00
2022-04-17 01:15:33 -06:00
// ! Test Buttons
// new JoystickButton(getOperatorController(), XboxController.Button.kY.value)
2022-04-17 01:15:33 -06:00
// .whenPressed(new Shoot(m_robotSwerveDrive, m_robotBoomBoom, m_robotTurret, m_robotHood,
// m_robotVisionOdometry, false, false));
2022-04-04 17:22:52 -06:00
// new JoystickButton(getOperatorController(), XboxController.Button.kY.value)
2022-04-17 01:15:33 -06:00
// .whenPressed(new RunCommandForTime(new RunCommand(() ->
// m_robotTurret.runShooterRotatePID(-Math.atan2((219.25 / 2.00) - 10, (82.83 / 2.00) - 15.56)),
// m_robotTurret), 1.0));
new JoystickButton(getOperatorController(), XboxController.Button.kY.value).whileHeld(new TrackTarget(m_robotVisionOdometry, m_robotTurret, m_robotHood, m_robotBoomBoom)); // * aim with turret to target);
2022-03-05 22:57:55 -07:00
2022-03-20 20:18:02 -06:00
// new JoystickButton(getOperatorController(), XboxController.Button.kY.value)
2022-04-17 01:15:33 -06:00
// .whileHeld(new RunCommand(() -> m_robotClaws.setOpen(true)));
2022-03-05 22:57:55 -07:00
2022-03-20 20:18:02 -06:00
// new JoystickButton(getOperatorController(), XboxController.Button.kB.value)
2022-04-17 01:15:33 -06:00
// .whileHeld(new RunCommand(() -> m_robotClaws.setOpen(false)));
2022-03-05 22:57:55 -07:00
2022-03-20 20:18:02 -06:00
// new JoystickButton(getOperatorController(), XboxController.Button.kA.value)
2022-04-17 01:15:33 -06:00
// .whenPressed(new Shoot(m_robotSwerveDrive, m_robotBoomBoom, m_robotTurret, m_robotHood));
2022-03-13 17:57:36 -06:00
2022-03-20 20:18:02 -06:00
// new JoystickButton(getOperatorController(), XboxController.Button.kA.value)
2022-04-17 01:15:33 -06:00
// .whenPressed(new RunCommand(() -> m_robotBoomBoom.runDrumShooter(0.25)))
// .whenReleased(new RunCommand(() -> m_robotBoomBoom.runDrumShooter(0.0)));
2022-03-10 16:47:32 -07:00
2022-04-17 01:15:33 -06:00
// ! Button Box Buttons
// Left Switch > Disables soft limits on press, release resets encoders (all for turret, hood,
// climber, and extender)
2022-03-05 22:57:55 -07:00
2022-04-17 01:15:33 -06:00
// SmartDashboard.putData("BB LEFT ON", new SequentialCommandGroup(
// new InstantCommand(() -> m_robotTurret.setTurretSoftLimits(false), m_robotTurret),
// new InstantCommand(() -> m_robotTurret.calibrationSpeed = 0.3, m_robotTurret),
2022-03-05 22:57:55 -07:00
2022-04-17 01:15:33 -06:00
// new InstantCommand(() -> m_robotHood.setHoodSoftLimits(false), m_robotHood),
// new InstantCommand(() -> m_robotHood.calibrationSpeed = 0.3, m_robotHood),
2022-03-25 16:14:32 -06:00
2022-04-17 01:15:33 -06:00
// new InstantCommand(() -> m_robotExtender.setExtenderSoftLimits(false), m_robotExtender)
2022-03-26 10:47:22 -06:00
// ));
2022-04-17 01:15:33 -06:00
2022-03-26 10:47:22 -06:00
// SmartDashboard.putData("BB LEFT OFF", new SequentialCommandGroup(
2022-04-17 01:15:33 -06:00
// new InstantCommand(() -> m_robotTurret.setTurretSoftLimits(true), m_robotTurret),
// new InstantCommand(() -> m_robotTurret.calibrationSpeed = 1.0, m_robotTurret),
// new InstantCommand(() -> m_robotHood.setHoodSoftLimits(true), m_robotHood),
// new InstantCommand(() -> m_robotHood.calibrationSpeed = 1.0, m_robotHood),
// new InstantCommand(() -> m_robotExtender.setExtenderSoftLimits(true), m_robotExtender),
// new InstantCommand(() -> m_robotTurret.m_boomBoomRotateEncoder.setPosition(0), m_robotTurret),
// new InstantCommand(() -> m_robotHood.m_angleEncoder.setPosition(0), m_robotHood),
// new InstantCommand(() -> m_robotExtender.setEncoder(0), m_robotExtender),
// new InstantCommand(() -> ExtenderIntakeGroup.setDirectionToOut(), m_robotIntake,
// m_robotExtender),
// new InstantCommand(() -> m_robotClimber.setEncoders(0), m_robotClimber)
2022-03-26 10:47:22 -06:00
// ));
2022-03-25 16:14:32 -06:00
2022-03-25 16:27:29 -06:00
// new JoystickButton(getButtonBox(), ButtonBox.Button.kLeftSwitch.value)
2022-04-17 01:15:33 -06:00
// .whenPressed(new InstantCommand(() -> m_robotTurret.setTurretSoftLimits(false), m_robotTurret))
// .whenPressed(new InstantCommand(() -> m_robotTurret.calibrationSpeed = 0.3, m_robotTurret))
2022-01-11 11:05:52 -07:00
2022-04-17 01:15:33 -06:00
// .whenPressed(new InstantCommand(() -> m_robotHood.setHoodSoftLimits(false), m_robotHood))
// .whenPressed(new InstantCommand(() -> m_robotHood.calibrationSpeed = 0.3, m_robotHood))
2022-04-17 01:15:33 -06:00
// .whenPressed(new InstantCommand(() -> m_robotExtender.setExtenderSoftLimits(false),
// m_robotExtender))
2022-04-17 01:15:33 -06:00
// .whenReleased(new InstantCommand(() -> m_robotTurret.setTurretSoftLimits(true), m_robotTurret))
// .whenReleased(new InstantCommand(() -> m_robotTurret.calibrationSpeed = 1.0, m_robotTurret))
2022-04-17 01:15:33 -06:00
// .whenReleased(new InstantCommand(() -> m_robotHood.setHoodSoftLimits(true), m_robotHood))
// .whenReleased(new InstantCommand(() -> m_robotHood.calibrationSpeed = 1.0, m_robotHood))
2022-04-17 01:15:33 -06:00
// .whenReleased(new InstantCommand(() -> m_robotExtender.setExtenderSoftLimits(true),
// m_robotExtender))
2022-01-11 11:05:52 -07:00
2022-04-17 01:15:33 -06:00
// .whenReleased(new InstantCommand(() -> m_robotTurret.m_boomBoomRotateEncoder.setPosition(0),
// m_robotTurret))
// .whenReleased(new InstantCommand(() -> m_robotHood.m_angleEncoder.setPosition(0), m_robotHood))
// .whenReleased(new InstantCommand(() -> m_robotExtender.setEncoder(0), m_robotExtender))
// .whenReleased(new InstantCommand(() -> ExtenderIntakeGroup.setDirectionToOut(), m_robotIntake,
// m_robotExtender))
// .whenReleased(new InstantCommand(() -> m_robotClimber.setEncoders(0), m_robotClimber));
2022-03-24 16:58:29 -06:00
2022-04-17 01:15:33 -06:00
// Middle Switch > Climber and Shooter mode switching
// new JoystickButton(getButtonBox(), ButtonBox.Button.kMiddleSwitch.value)
// .whenPressed(new InstantCommand(() -> currentControlMode = ControlMode.CLIMBER))
// .whenReleased(new InstantCommand(() -> currentControlMode = ControlMode.SHOOTER));
// // new JoystickButton(getButtonBox(), ButtonBox.Button.kRightSwitch.value)
// // .whenPressed(new InstantCommand(() -> currentControlMode = ControlMode.))
// // .whenReleased(new InstantCommand(() -> currentControlMode = ControlMode.SHOOTER));
2022-03-24 16:58:29 -06:00
2022-04-17 01:15:33 -06:00
// new JoystickButton(getButtonBox(), ButtonBox.Button.kRightSwitch.value)
// .whileHeld(new InstantCommand(() -> currentDriveMode = DriveMode.OFF))
// .whenReleased(new InstantCommand(() -> currentDriveMode = DriveMode.ON));
2022-04-07 15:13:24 -06:00
2022-04-17 01:15:33 -06:00
// // Left Button > Extender In
new JoystickButton(getDriverController(), XboxController.Button.kX.value).whileHeld(new RunCommand(() -> m_robotExtender.runExtender(1.0), m_robotExtender)).whenReleased(new RunCommand(() -> m_robotExtender.runExtender(0.0), m_robotExtender));
2022-04-07 15:13:24 -06:00
2022-04-17 01:15:33 -06:00
// Left Button > Extender Out
new JoystickButton(getDriverController(), XboxController.Button.kY.value).whileHeld(new RunCommand(() -> m_robotExtender.runExtender(-1.0), m_robotExtender)).whenReleased(new RunCommand(() -> m_robotExtender.runExtender(0.0), m_robotExtender));
2022-04-07 15:13:24 -06:00
}
2022-04-17 01:15:33 -06:00
private boolean isLockedOn() {
return m_robotTurret.isLockedOn() || m_robotHood.isLockedOn() || m_robotBoomBoom.isLockedOn();
2022-04-07 15:13:24 -06:00
}
2022-04-04 19:30:15 -06:00
2022-04-17 01:15:33 -06:00
/**
* Use this to pass the autonomous command to the main {@link Robot} class.
*
* @return the command to run in autonomous
*/
public Command getAutonomousCommand() {
return autoChooser.getSelected();
}
2022-04-17 01:15:33 -06:00
private final CommandGroupBase threeBallPlus = CommandGroupBase.sequence(
2022-04-07 18:52:49 -06:00
new InstantCommand(() -> m_robotBoomBoom.runDrumShooterVelocityPID(8000), m_robotBoomBoom).withName("StartIdlingShooter"),
new InstantCommand(() -> m_robotIntake.runAtOutput(-1), m_robotIntake).withName("StartRunningIntake"),
2022-04-17 01:15:33 -06:00
// new RunExtender(m_robotExtender).withName("DeployExtender"),
2022-04-07 18:52:49 -06:00
new InstantCommand(() -> m_robotSerializer.setSerializer(0.8), m_robotSerializer).withName("StartRunningSerializer"),
2022-04-17 01:15:33 -06:00
// Get Second Ball
new InstantCommand(() -> m_robotTurret.runShooterRotatePID(-180), m_robotTurret).withName("StartTurningShooter"),
2022-04-17 01:15:33 -06:00
makePathingGroup(AutoConstants.PATH_MAX_VEL, AutoConstants.PATH_MAX_ACCEL, "JMove1").withName("JMove1"),
// Shoot Preloaded and Second Ball
makeTimeoutTrackShotGroup(AutoConstants.LOCK_ON_DURATION, AutoConstants.LOCK_ON_TIME_ALLOWANCE, AutoConstants.STORAGE_TIME_TWO_BALLS, "FirstSecondBall"),
// Get Third Ball
2022-04-07 18:52:49 -06:00
new InstantCommand(() -> m_robotBoomBoom.runDrumShooterVelocityPID(8000), m_robotBoomBoom).withName("StartIdlingShooter"),
new InstantCommand(() -> m_robotTurret.runShooterRotatePID(-120), m_robotTurret).withName("StartTurningShooter"),
2022-04-17 01:15:33 -06:00
makePathingGroup(AutoConstants.PATH_MAX_VEL, AutoConstants.PATH_MAX_ACCEL, "JMove2").withName("JMove2"),
// Shoot Third Ball
makeTimeoutTrackShotGroup(AutoConstants.LOCK_ON_DURATION, AutoConstants.LOCK_ON_TIME_ALLOWANCE, AutoConstants.STORAGE_TIME_ONE_BALL, "ThirdBall"),
// Stop
new InstantCommand(() -> m_robotIntake.runAtOutput(0), m_robotIntake).withName("StopRunningIntake"),
2022-04-07 17:03:23 -06:00
new InstantCommand(() -> m_robotSerializer.setSerializer(0.0), m_robotSerializer).withName("StopRunningSerializer"),
new InstantCommand(() -> m_robotStorage.runStorage(0.0)).withName("ThirdBallStopFeed")
);
2022-04-17 01:15:33 -06:00
private ParallelDeadlineGroup makeTimeoutTrackShotGroup(double lockOnDuration, double lockOnTimeAllowance, double storageRunTime, String name) {
return CommandGroupBase.sequence(
new TimedWaitUntilCommand(this::isLockedOn, lockOnDuration).withTimeout(lockOnTimeAllowance).withName(name + "LockOn"),
new InstantCommand(() -> m_robotStorage.runStorage(StorageConstants.STORAGE_SPEED), m_robotStorage).withName(name + "Feed"),
new WaitCommand(storageRunTime).withName(name + "ShootTimer"),
new InstantCommand(() -> m_robotStorage.runStorage(0.0)).withName(name + "StopFeed")).deadlineWith(new TrackTarget(m_robotVisionOdometry, m_robotTurret, m_robotHood, m_robotBoomBoom).withName(name + "Track")
);
}
2022-04-07 15:13:24 -06:00
/**
2022-04-17 01:15:33 -06:00
* Generate autonomous
* @param maxVel max velocity for the path (null to override default value of 5.0)
* @param maxAccel max acceleration for the path (null to override default value of 5.0)
* @param inputs strings (paths) or commands you want to run (in order)
* @return array of commands
2022-04-07 15:13:24 -06:00
*/
2022-04-17 01:15:33 -06:00
private SequentialCommandGroup makePathingGroup(Double maxVel, Double maxAccel, String input) {
PIDController xController = SwerveDriveConstants.X_CONTROLLER;
PIDController yController = SwerveDriveConstants.Y_CONTROLLER;
ProfiledPIDController thetaController = SwerveDriveConstants.THETA_CONTROLLER;
thetaController.enableContinuousInput(-Math.PI, Math.PI);
PathPlannerTrajectory pathTrajectory = PathPlanner.loadPath(input, Objects.requireNonNullElse(maxVel, SwerveDriveConstants.PATH_MAX_VELOCITY), Objects.requireNonNullElse(maxAccel, SwerveDriveConstants.PATH_MAX_ACCELERATION));
PathPlannerState initialState = pathTrajectory.getInitialState();
Pose2d initialPosition = new Pose2d(initialState.poseMeters.getTranslation(), initialState.holonomicRotation);
return new SequentialCommandGroup(
new InstantCommand(() -> m_robotSwerveDrive.resetOdometry(initialPosition), m_robotSwerveDrive),
new PPSwerveControllerCommand(pathTrajectory, m_robotSwerveDrive::getOdometry, m_robotSwerveDrive.m_kinematics, xController, yController, thetaController, m_robotSwerveDrive::setModuleStates, m_robotSwerveDrive),
new InstantCommand(m_robotSwerveDrive::stopModules, m_robotSwerveDrive)
);
2022-01-11 11:05:52 -07:00
}
2022-03-25 16:14:32 -06:00
public void switchControlMode() {
2022-04-17 01:15:33 -06:00
currentControlMode = currentControlMode == ControlMode.SHOOTER ? ControlMode.CLIMBER : ControlMode.SHOOTER;
2022-03-25 16:14:32 -06:00
}
public void switchDriveMode() {
2022-04-17 01:15:33 -06:00
currentDriveMode = currentDriveMode == DriveMode.ON ? DriveMode.OFF : DriveMode.ON;
2022-03-25 16:14:32 -06:00
}
2022-04-17 01:15:33 -06:00
public DeadbandedXboxController getDriverController() {
2022-01-11 11:05:52 -07:00
return m_driverXbox;
}
2022-04-17 01:15:33 -06:00
public DeadbandedXboxController getOperatorController() {
2022-03-21 12:29:03 -06:00
return m_operatorXbox;
}
2022-03-12 19:02:37 -07:00
public ButtonBox getButtonBox() {
return m_buttonBox;
2022-03-12 17:33:38 -07:00
}
2022-01-11 11:05:52 -07:00
/**
2022-02-17 19:52:05 -07:00
* Set odometry to given pose.
2022-03-05 11:12:33 -07:00
*
2022-02-17 19:52:05 -07:00
* @param pose Pose to set odometry to.
2022-01-11 11:05:52 -07:00
*/
2022-02-05 11:50:49 -07:00
public void resetOdometry(Pose2d pose) {
2022-01-29 14:39:46 -07:00
m_robotSwerveDrive.resetOdometry(pose);
}
2021-11-15 16:26:16 -07:00
}