1 package org
.usfirst
.frc
.team3501
.robot
.subsystems
;
3 import org
.usfirst
.frc
.team3501
.robot
.Constants
;
4 import org
.usfirst
.frc
.team3501
.robot
.MathLib
;
5 import org
.usfirst
.frc
.team3501
.robot
.utils
.HallEffectSensor
;
7 import com
.ctre
.CANTalon
;
9 import edu
.wpi
.first
.wpilibj
.DoubleSolenoid
;
10 import edu
.wpi
.first
.wpilibj
.DoubleSolenoid
.Value
;
11 import edu
.wpi
.first
.wpilibj
.command
.Subsystem
;
13 public class Shooter
extends Subsystem
{
14 public double wheelP
= 0.0001, wheelI
= 0, wheelD
= 0.0004;
15 private static Shooter shooter
;
16 private static HallEffectSensor hallEffect
;
17 private final CANTalon flyWheel1
, flyWheel2
, indexWheel
;
19 private static final double DEFAULT_INDEXING_SPEED
= -0.75;
20 private static final double DEFAULT_SHOOTING_SPEED
= 2800; // rpm
21 private static final double SHOOTING_SPEED_INCREMENT
= 25;
22 private static final int ACCEPTABLE_SHOOTING_DEVIATION
= 300;
24 private double currentShootingSpeed
= DEFAULT_SHOOTING_SPEED
;
26 private final DoubleSolenoid piston
;
29 flyWheel1
= new CANTalon(Constants
.Shooter
.FLY_WHEEL1
);
30 flyWheel2
= new CANTalon(Constants
.Shooter
.FLY_WHEEL2
);
31 indexWheel
= new CANTalon(Constants
.Shooter
.INDEX_WHEEL
);
33 hallEffect
= new HallEffectSensor(Constants
.Shooter
.HALL_EFFECT_PORT
, 1);
35 piston
= new DoubleSolenoid(Constants
.Shooter
.PISTON_MODULE
,
36 Constants
.Shooter
.PISTON_FORWARD
, Constants
.Shooter
.PISTON_REVERSE
);
40 * Returns shooter object
42 * @return Shooter object
44 public static Shooter
getShooter() {
45 if (shooter
== null) {
46 shooter
= new Shooter();
52 * Sets fly wheel motor value to input.
55 * motor value from -1 to 1(fastest forward)
57 public void setFlyWheelMotorVal(double val
) {
58 val
= MathLib
.restrictToRange(val
, 0.0, 1.0);
64 * Stops fly wheel motor.
66 public void stopFlyWheel() {
72 * Sets index wheel motor value to input.
75 * motor value from -1 to 1(fastest forward)
77 public void setIndexWheelMotorVal(double val
) {
78 val
= MathLib
.restrictToRange(val
, -1.0, 1.0);
83 * Stops index wheel motor.
85 public void stopIndexWheel() {
90 protected void initDefaultCommand() {
94 public double getShooterRPM() {
95 return hallEffect
.getRPM();
98 public void setCurrentShootingSpeed(double Value
) {
99 currentShootingSpeed
= Value
;
102 public void decrementCurrentShootingSpeed() {
103 this.currentShootingSpeed
-= this.SHOOTING_SPEED_INCREMENT
;
106 public void incrementCurrentShootingSpeed() {
107 this.currentShootingSpeed
+= this.SHOOTING_SPEED_INCREMENT
;
110 public void resetCurrentShootingSpeed() {
111 this.currentShootingSpeed
= this.DEFAULT_SHOOTING_SPEED
;
114 public double getCurrentShootingSpeed() {
115 return currentShootingSpeed
;
118 public void reverseIndexWheel() {
119 this.setIndexWheelMotorVal(-DEFAULT_INDEXING_SPEED
);
122 public void runIndexWheel() {
123 this.setIndexWheelMotorVal(DEFAULT_INDEXING_SPEED
);
126 public Value
getPistonValue() {
130 public void setHighGear() {
131 changeGear(Constants
.Shooter
.HIGH_GEAR
);
134 public void setLowGear() {
135 changeGear(Constants
.Shooter
.LOW_GEAR
);
138 private void changeGear(DoubleSolenoid
.Value gear
) {
142 public boolean isShooterRPMAtTargetSpeed() {
143 return isShooterRPMWithinRangeOfTargetSpeed(ACCEPTABLE_SHOOTING_DEVIATION
);
146 public boolean isShooterRPMWithinRangeOfTargetSpeed(int acceptableRPMError
) {
147 double shooterSpeed
= getShooterRPM();
148 if (shooterSpeed
> DEFAULT_SHOOTING_SPEED
- acceptableRPMError
149 && shooterSpeed
< DEFAULT_SHOOTING_SPEED
+ acceptableRPMError
) {