This repository has been archived by the owner on Sep 6, 2020. It is now read-only.
forked from CircuitOfLifeRobotics/Robot2018-ElGrandeAvocado
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArm.java
148 lines (118 loc) · 3.99 KB
/
Arm.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package com.team3925.frc2018.subsystems;
import com.ctre.phoenix.motorcontrol.ControlMode;
import com.ctre.phoenix.motorcontrol.FeedbackDevice;
import com.ctre.phoenix.motorcontrol.can.TalonSRX;
import com.team3925.frc2018.Constants;
import com.team3925.frc2018.RobotMap;
import edu.wpi.first.wpilibj.command.Subsystem;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
public class Arm extends Subsystem {
public static enum ArmState {
UNKNOWN, FORWARD_EXTENDED, RETRACTED, REVERSE_EXTENDED, SCALE_ANGLE;
}
//***** TUNE ME! *****
private static final double kP = 3.00;
private static final double kI = 0.00;
private static final double kD = 0.00;
private static final double kF = 0.35;
private static final int ACCELERATION = 1500; // 400
private static final int VELOCITY = 3000; //600
private static final int SETPOINT_DEADZONE = 100;
//*********************
private ArmState state = ArmState.UNKNOWN;
private final TalonSRX liftMotor = RobotMap.IntakeMap.LIFT_MOTOR;
private double currentSetpoint = 0;
private static Arm instance;
public static Arm getInstance() {
if (instance == null)
instance = new Arm();
return instance;
}
public Arm() {
liftMotor.configSelectedFeedbackSensor(FeedbackDevice.CTRE_MagEncoder_Relative, Constants.PID_ID_X,
Constants.TIMEOUT_MS);
liftMotor.selectProfileSlot(0, Constants.PID_ID_X);
liftMotor.config_kP(0, kP, Constants.TIMEOUT_MS);
liftMotor.config_kI(0, kI, Constants.TIMEOUT_MS);
liftMotor.config_kD(0, kD, Constants.TIMEOUT_MS);
liftMotor.config_kF(0, kF, Constants.TIMEOUT_MS);
liftMotor.configMotionAcceleration (ACCELERATION, Constants.TIMEOUT_MS);
liftMotor.configMotionCruiseVelocity(VELOCITY, Constants.TIMEOUT_MS);
liftMotor.setInverted (true);
liftMotor.setSensorPhase(false);
liftMotor.overrideLimitSwitchesEnable(true);
}
@Deprecated
public void setRaw(double speed) {
liftMotor.set(ControlMode.PercentOutput, speed);
}
public double getPosition() {
return liftMotor.getSelectedSensorPosition(0);
}
public boolean isAtSetpoint() {
return Math.abs(liftMotor.getSelectedSensorPosition(0) - currentSetpoint) < SETPOINT_DEADZONE;
}
public void zero() {
liftMotor.setSelectedSensorPosition(0, Constants.PID_ID_X, Constants.TIMEOUT_MS);
System.out.println("zeroARM");
}
public void setSetpoint(ArmState state) {
if(state != ArmState.UNKNOWN) {
switch (state) {
case FORWARD_EXTENDED:
setSetpoint(Constants.ArmSetpoints.EXTENDED);
break;
case RETRACTED:
setSetpoint(Constants.ArmSetpoints.RETRACTED);
break;
case REVERSE_EXTENDED:
setSetpoint(Constants.ArmSetpoints.BACKWARDS);
break;
case SCALE_ANGLE:
setSetpoint(Constants.ArmSetpoints.SCALEASSIST);
break;
default:
System.err.println("Failed to set " + state);
break;
}
}
}
public void setState(ArmState state) {
this.state = state;
}
public double positionAtState(ArmState state) {
switch (state) {
case FORWARD_EXTENDED:
return (Constants.ArmSetpoints.EXTENDED);
case RETRACTED:
return (Constants.ArmSetpoints.RETRACTED);
case REVERSE_EXTENDED:
return (Constants.ArmSetpoints.BACKWARDS);
case SCALE_ANGLE:
return (Constants.ArmSetpoints.SCALEASSIST);
default:
System.err.println("Failed to get " + state);
return 0;
}
}
public boolean safeToGoDown() {
if (liftMotor.getSelectedSensorPosition(0) >= Constants.ArmSetpoints.RETRACTED) {
return false;
}
return true;
}
public ArmState getState() {
return state;
}
public void setSetpoint(double setpoint) {
liftMotor.set(ControlMode.MotionMagic, setpoint);
currentSetpoint = setpoint;
}
@Override
protected void initDefaultCommand() {
}
public void log() {
// System.out.println(state + ", " + liftMotor.getSelectedSensorPosition(0));
SmartDashboard.putNumber("ArmPosition", liftMotor.getSelectedSensorPosition(0));
}
}