11package frc .robot .subsystems .elevator ;
22
3+ import edu .wpi .first .math .MathUtil ;
4+ import edu .wpi .first .math .controller .ArmFeedforward ;
35import edu .wpi .first .math .controller .ElevatorFeedforward ;
46import edu .wpi .first .math .trajectory .TrapezoidProfile ;
57import edu .wpi .first .wpilibj .DriverStation ;
1113public class Elevator extends SubsystemBase {
1214
1315 private final ElevatorIO elevator ;
16+ private final AmpBarIO ampBar ;
1417
1518 private final ElevatorIOInputsAutoLogged eInputs = new ElevatorIOInputsAutoLogged ();
19+ private final AmpBarIOInputsAutoLogged aInputs = new AmpBarIOInputsAutoLogged ();
1620
1721 private static final LoggedTunableNumber kP = new LoggedTunableNumber ("Elevator/kP" );
1822 private static final LoggedTunableNumber kI = new LoggedTunableNumber ("Elevator/kI" );
@@ -22,18 +26,35 @@ public class Elevator extends SubsystemBase {
2226 private static final LoggedTunableNumber kV = new LoggedTunableNumber ("Elevator/kV" );
2327 private static final LoggedTunableNumber kA = new LoggedTunableNumber ("Elevator/kA" );
2428
29+ // amp bar gains
30+
31+ private static double barkP ;
32+ private static double barkV ;
33+ private static double barkG ;
34+
2535 private TrapezoidProfile extenderProfile ;
2636 private TrapezoidProfile .Constraints extenderConstraints =
2737 new TrapezoidProfile .Constraints (30 , 85 );
2838 private TrapezoidProfile .State extenderGoal = new TrapezoidProfile .State ();
2939 private TrapezoidProfile .State extenderCurrent = new TrapezoidProfile .State ();
3040
31- private double goal ;
41+ private static double maxVelocityRPM ;
42+ private static double maxAccelerationRPM ;
43+
44+ private TrapezoidProfile barProfile ;
45+ private TrapezoidProfile .Constraints barConstraints ;
46+
47+ private TrapezoidProfile .State barGoal = new TrapezoidProfile .State ();
48+ private TrapezoidProfile .State barCurrent = new TrapezoidProfile .State ();
3249
50+ private double goal ;
51+ private double barGoalPos ;
3352 private final ElevatorFeedforward elevatorFFModel ;
53+ private final ArmFeedforward barFFmodel ;
3454
35- public Elevator (ElevatorIO elevator ) {
55+ public Elevator (ElevatorIO elevator , AmpBarIO ampBar ) {
3656 this .elevator = elevator ;
57+ this .ampBar = ampBar ;
3758
3859 switch (Constants .getMode ()) {
3960 case REAL :
@@ -44,6 +65,10 @@ public Elevator(ElevatorIO elevator) {
4465
4566 kP .initDefault (0.44 );
4667 kI .initDefault (0 );
68+
69+ barkP = 0.0 ;
70+ barkV = 0.0 ;
71+ barkG = 0.0 ;
4772 break ;
4873 case REPLAY :
4974 kS .initDefault (0 );
@@ -53,6 +78,10 @@ public Elevator(ElevatorIO elevator) {
5378
5479 kP .initDefault (15 );
5580 kI .initDefault (0 );
81+
82+ barkP = 0.0 ;
83+ barkV = 0.0 ;
84+ barkG = 0.0 ;
5685 break ;
5786 case SIM :
5887 kS .initDefault (0 );
@@ -62,6 +91,10 @@ public Elevator(ElevatorIO elevator) {
6291
6392 kP .initDefault (1 );
6493 kI .initDefault (0 );
94+
95+ barkP = 0.0 ;
96+ barkV = 0.0 ;
97+ barkG = 0.0 ;
6598 break ;
6699 default :
67100 kS .initDefault (0 );
@@ -71,21 +104,40 @@ public Elevator(ElevatorIO elevator) {
71104
72105 kP .initDefault (15 );
73106 kI .initDefault (0 );
107+
108+ barkP = 0.0 ;
109+ barkV = 0.0 ;
110+ barkG = 0.0 ;
74111 break ;
75112 }
76113
77114 setExtenderGoal (0.162 );
78115 extenderProfile = new TrapezoidProfile (extenderConstraints );
79116 extenderCurrent = extenderProfile .calculate (0 , extenderCurrent , extenderGoal );
80117
118+ maxVelocityRPM = 15 ;
119+ maxAccelerationRPM = 1 ;
120+
121+ barConstraints = new TrapezoidProfile .Constraints (maxVelocityRPM , maxAccelerationRPM );
122+ barProfile = new TrapezoidProfile (barConstraints );
123+ barCurrent = barProfile .calculate (0 , barCurrent , barGoal );
124+
81125 this .elevator .configurePID (kP .get (), 0 , 0 );
82126 elevatorFFModel = new ElevatorFeedforward (kS .get (), kG .get (), kV .get (), kA .get ());
127+
128+ ampBar .configurePID (barkP , 0 , 0 );
129+ barFFmodel = new ArmFeedforward (0 , barkG , barkV , 0 );
83130 }
84131
85132 public boolean atGoal () {
86133 return (Math .abs (eInputs .elevatorPosition - goal ) <= Constants .ElevatorConstants .THRESHOLD );
87134 }
88135
136+ public boolean barAtGoal () {
137+ return (Math .abs (aInputs .barPositionRotations - barGoalPos )
138+ <= Constants .ElevatorConstants .BAR_THRESHOLD );
139+ }
140+
89141 public double getElevatorPosition () {
90142 return eInputs .elevatorPosition ;
91143 }
@@ -94,10 +146,50 @@ private double getElevatorError() {
94146 return eInputs .positionSetpoint - eInputs .elevatorPosition ;
95147 }
96148
149+ private double getBarError () {
150+
151+ return aInputs .barPositionSetpointRotations - aInputs .barPositionRotations ;
152+ }
153+
97154 public boolean elevatorAtSetpoint () {
98155 return (Math .abs (getElevatorError ()) <= Constants .ElevatorConstants .THRESHOLD );
99156 }
100157
158+ public boolean ampBarAtSetpoint () {
159+
160+ return (Math .abs (getBarError ()) <= Constants .ElevatorConstants .BAR_THRESHOLD );
161+ }
162+
163+ public void setBarBrakeMode (boolean bool ) {
164+ ampBar .setBrakeMode (bool );
165+ }
166+
167+ public double getBarPositionRotations () {
168+ return aInputs .barPositionRotations ;
169+ }
170+
171+ public void setBarPosition (double positionRotations , double velocityRPM ) {
172+
173+ positionRotations = MathUtil .clamp (positionRotations , -1000 , 1000 );
174+ ampBar .setPositionSetpoint (
175+ positionRotations ,
176+ barFFmodel .calculate (Math .toRadians (positionRotations ), Math .toRadians (velocityRPM )));
177+ }
178+
179+ public void stopAmpBar () {
180+ ampBar .stop ();
181+ }
182+
183+ public void setBarGoal (double setpoint ) {
184+ this .barGoalPos = setpoint ;
185+ barGoal = new TrapezoidProfile .State (setpoint , 0 );
186+ }
187+
188+ public void setbarCurrent (double current ) {
189+
190+ barCurrent = new TrapezoidProfile .State (current , 0 );
191+ }
192+
101193 public void setExtenderGoal (double setpoint ) {
102194 goal = setpoint ;
103195 extenderGoal = new TrapezoidProfile .State (setpoint , 0 );
@@ -133,13 +225,22 @@ public void periodic() {
133225 Logger .recordOutput ("Alliance" , DriverStation .getAlliance ().isPresent ());
134226
135227 elevator .updateInputs (eInputs );
228+ ampBar .updateInputs (aInputs );
136229
137230 extenderCurrent =
138231 extenderProfile .calculate (Constants .LOOP_PERIOD_SECS , extenderCurrent , extenderGoal );
139232
233+ barCurrent = barProfile .calculate (Constants .LOOP_PERIOD_SECS , barCurrent , barGoal );
234+
140235 setPositionExtend (extenderCurrent .position , extenderCurrent .velocity );
141236
237+ setBarPosition (barCurrent .position , barCurrent .velocity );
238+
142239 Logger .processInputs ("Elevator" , eInputs );
240+ Logger .processInputs ("Amp bar inputs" , aInputs );
241+
242+ Logger .recordOutput ("amp bar error" , getBarError ());
243+ Logger .recordOutput ("amp bar goal" , barGoalPos );
143244
144245 if (kP .hasChanged (hashCode ()) || kI .hasChanged (hashCode ())) {
145246 elevator .configurePID (kP .get (), kI .get (), 0 );
0 commit comments