2026-02-19 16:33:09 -05: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.
package frc.robot ;
2026-03-05 10:09:30 -05:00
import java.util.logging.Logger ;
2026-03-05 19:52:32 -05:00
import org.photonvision.PhotonUtils ;
2026-02-21 17:26:10 -05:00
import org.photonvision.targeting.PhotonPipelineResult ;
2026-02-19 16:33:09 -05:00
import com.pathplanner.lib.auto.AutoBuilder ;
2026-03-05 10:09:30 -05:00
import edu.wpi.first.math.geometry.Pose2d ;
2026-02-19 16:33:09 -05:00
import edu.wpi.first.networktables.GenericEntry ;
import edu.wpi.first.networktables.NetworkTable ;
import edu.wpi.first.networktables.NetworkTableInstance ;
2026-03-05 10:09:30 -05:00
import edu.wpi.first.networktables.StructPublisher ;
2026-02-19 16:33:09 -05:00
import edu.wpi.first.wpilibj.DriverStation ;
import edu.wpi.first.wpilibj.TimedRobot ;
import edu.wpi.first.wpilibj.Timer ;
import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard ;
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser ;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard ;
import edu.wpi.first.wpilibj2.command.Command ;
import edu.wpi.first.wpilibj2.command.CommandScheduler ;
2026-03-02 16:25:15 -05:00
import frc.robot.Constants.IntakeConstants ;
2026-03-03 19:35:30 -05:00
import frc.robot.subsystems.ClimberSubsystem ;
2026-03-02 16:25:15 -05:00
import frc.robot.subsystems.IntakeSubsystem ;
2026-03-03 10:27:14 -05:00
import frc.robot.subsystems.LEDSubsystem ;
2026-03-12 19:21:00 -04:00
import frc.robot.subsystems.ShooterSubsystem ;
2026-02-19 16:33:09 -05:00
import frc.robot.subsystems.TargetingSubsystems ;
/ * *
* The VM is configured to automatically run this class , and to call the
* functions corresponding to each mode , as
* described in the TimedRobot documentation . If you change the name of this
* class or the package after creating this
* project , you must also update the build . gradle file in the project .
* /
public class Robot extends TimedRobot {
private static Robot instance ;
private Command m_autonomousCommand ;
private RobotContainer m_robotContainer ;
2026-03-03 10:27:14 -05:00
private LEDSubsystem m_LedSubsystem ;
2026-03-03 19:35:30 -05:00
private ClimberSubsystem m_ClimberSubsystem ;
2026-03-12 19:21:00 -04:00
private ShooterSubsystem m_ShooterSubsystem ;
2026-02-19 16:33:09 -05:00
private Timer disabledTimer ;
private static NetworkTable table ;
2026-03-05 10:09:30 -05:00
private static StructPublisher < Pose2d > advantageScopePublisher = NetworkTableInstance . getDefault ( ) . getStructTopic ( " Robot Pose hahaha " , Pose2d . struct ) . publish ( ) ;
2026-02-21 17:26:10 -05:00
2026-02-19 16:33:09 -05:00
public Robot ( ) {
instance = this ;
}
public static Robot getInstance ( ) {
return instance ;
}
/ * *
* This function is run when the robot is first started up and should be used
* for any initialization code .
* /
@Override
public void robotInit ( ) {
// Instantiate our RobotContainer. This will perform all our button bindings,
// and put our
// autonomous chooser on the dashboard.
2026-03-03 10:27:14 -05:00
m_LedSubsystem = new LEDSubsystem ( ) ;
2026-02-19 16:33:09 -05:00
m_robotContainer = new RobotContainer ( ) ;
2026-03-03 19:35:30 -05:00
m_ClimberSubsystem = new ClimberSubsystem ( ) ;
2026-03-12 19:21:00 -04:00
m_ShooterSubsystem = new ShooterSubsystem ( ) ;
2026-02-19 16:33:09 -05:00
// Create a timer to disable motor brake a few seconds after disable. This will
// let the robot stop
// immediately when disabled, but then also let it be pushed more
disabledTimer = new Timer ( ) ;
if ( isSimulation ( ) ) {
DriverStation . silenceJoystickConnectionWarning ( true ) ;
}
2026-02-21 17:26:10 -05:00
m_robotContainer . getSwerveDrive ( ) . zeroGyroWithAlliance ( ) ;
2026-03-03 10:27:14 -05:00
IntakeSubsystem . resetIntakeRotationEncoder ( ) ;
2026-02-19 16:33:09 -05:00
}
/ * *
* This function is called every 20 ms , no matter the mode . Use this for items
* like diagnostics that you want ran
* during disabled , autonomous , teleoperated and test .
*
* < p >
* This runs after the mode specific periodic functions , but before LiveWindow
* and
* SmartDashboard integrated updating .
* /
@Override
public void robotPeriodic ( ) {
// Runs the Scheduler. This is responsible for polling buttons, adding
// newly-scheduled
// commands, running already-scheduled commands, removing finished or
// interrupted commands,
// and running subsystem periodic() methods. This must be called from the
// robot's periodic
// block in order for anything in the Command-based framework to work.
CommandScheduler . getInstance ( ) . run ( ) ;
2026-03-05 10:09:30 -05:00
TargetingSubsystems . updateShooterRPM ( m_robotContainer . getSwerveDrive ( ) . getPose ( ) ) ;
SmartDashboard . putNumber ( " Estimated Shooter RPM " , Constants . ShooterConstants . SHOOTER_RPM ) ;
2026-03-05 19:52:32 -05:00
SmartDashboard . putNumber ( " Distance From Hub: " , PhotonUtils . getDistanceToPose ( m_robotContainer . getSwerveDrive ( ) . getPose ( ) , Constants . TargetingConstants . allianceHubPose ) ) ;
2026-02-21 17:26:10 -05:00
//Constants.ShooterConstants.getRampAndIndexerMotorSpeed();
//Constants.IntakeConstants.updateIntakeWheelsRPM();
2026-03-05 10:09:30 -05:00
//Constants.ShooterConstants.updateShooterRPM();
2026-03-02 16:25:15 -05:00
TargetingSubsystems . getHubPoseTheta ( m_robotContainer . getSwerveDrive ( ) ) ;
2026-02-21 17:26:10 -05:00
//Constants.ShooterConstants.updateIndexerAndRampMotorRPM();
2026-03-05 10:09:30 -05:00
advantageScopePublisher . set ( m_robotContainer . getSwerveDrive ( ) . getPose ( ) ) ;
2026-02-19 16:33:09 -05:00
}
/ * *
* This function is called once each time the robot enters Disabled mode .
* /
@Override
public void disabledInit ( ) {
m_robotContainer . setMotorBrake ( true ) ;
disabledTimer . reset ( ) ;
disabledTimer . start ( ) ;
}
@Override
public void disabledPeriodic ( ) {
if ( disabledTimer . hasElapsed ( Constants . DrivebaseConstants . WHEEL_LOCK_TIME ) ) {
m_robotContainer . setMotorBrake ( false ) ;
disabledTimer . stop ( ) ;
disabledTimer . reset ( ) ;
}
}
/ * *
* This autonomous runs the autonomous command selected by your
* { @link RobotContainer } class .
* /
@Override
public void autonomousInit ( ) {
2026-03-03 10:27:14 -05:00
// IntakeSubsystem.resetIntakeRotationEncoder();
2026-02-19 16:33:09 -05:00
m_robotContainer . setMotorBrake ( true ) ;
m_autonomousCommand = m_robotContainer . getAutonomousCommand ( ) ;
2026-03-12 19:21:00 -04:00
//ShooterSubsystem.setShooterMotorsRPM(Constants.ShooterConstants.IDLE_SHOOTER_RPM);
2026-02-19 16:33:09 -05:00
// Print the selected autonomous command upon autonomous init
System . out . println ( " Auto selected: " + m_autonomousCommand ) ;
// schedule the autonomous command selected in the autoChooser
if ( m_autonomousCommand ! = null ) {
m_autonomousCommand . schedule ( ) ;
}
2026-03-02 16:25:15 -05:00
2026-02-19 16:33:09 -05:00
}
/ * *
* This function is called periodically during autonomous .
* /
@Override
public void autonomousPeriodic ( ) {
}
@Override
public void teleopInit ( ) {
2026-03-12 19:21:00 -04:00
ClimberSubsystem . lowerRobot ( ) ;
//ShooterSubsystem.setShooterMotorsRPM(Constants.ShooterConstants.IDLE_SHOOTER_RPM);
2026-02-19 16:33:09 -05:00
// This makes sure that the autonomous stops running when
// teleop starts running. If you want the autonomous to
// continue until interrupted by another command, remove
// this line or comment it out.
if ( m_autonomousCommand ! = null ) {
m_autonomousCommand . cancel ( ) ;
} else {
CommandScheduler . getInstance ( ) . cancelAll ( ) ;
}
}
/ * *
* This function is called periodically during operator control .
* /
@Override
public void teleopPeriodic ( ) {
}
@Override
public void testInit ( ) {
// Cancels all running commands at the start of test mode.
CommandScheduler . getInstance ( ) . cancelAll ( ) ;
}
/ * *
* This function is called periodically during test mode .
* /
@Override
public void testPeriodic ( ) {
}
/ * *
* This function is called once when the robot is first started up .
* /
@Override
public void simulationInit ( ) {
}
/ * *
* This function is called periodically whilst in simulation .
* /
@Override
public void simulationPeriodic ( ) {
}
}