44import static edu .wpi .first .units .Units .RotationsPerSecond ;
55
66import edu .wpi .first .math .geometry .Pose2d ;
7+ import edu .wpi .first .units .measure .Angle ;
78import edu .wpi .first .wpilibj .DriverStation .Alliance ;
89import edu .wpi .first .wpilibj .Timer ;
910import frc .robot .constants .DriveConstants ;
@@ -78,6 +79,7 @@ public class RobotStateSubsystem extends MeasurableSubsystem {
7879 private boolean hasElevatorAutoCoralPrestaged = false ;
7980
8081 private Timer scoringTimer = new Timer ();
82+ private Angle nextBiscuitSetpoint ;
8183
8284 public RobotStateSubsystem (
8385 AlgaeSubsystem algaeSubsystem ,
@@ -240,6 +242,14 @@ public void toggleGetAlgaeOnCycle() {
240242 ledSubsystem .setGetAlgeaLights (getAlgaeOnCycle );
241243 }
242244
245+ public void setBiscuitTransfer (Angle setpoint , boolean overrideThreshold ) {
246+ if (overrideThreshold
247+ || elevatorSubsystem .getPosition ().gt (ElevatorConstants .kBiscuitSafeThreshold )) {
248+ biscuitSubsystem .setPosition (setpoint , hasAlgae ());
249+ }
250+ nextBiscuitSetpoint = setpoint ;
251+ }
252+
243253 public void setCurrentLimiting (boolean isCurrentLimiting ) {
244254 this .isCurrentLimiting = isCurrentLimiting ;
245255 ledSubsystem .setCurrentLimiting (isCurrentLimiting );
@@ -301,7 +311,7 @@ public void toStow() {
301311 driveSubsystem .setIgnoreSticks (false );
302312
303313 if (biscuitSubsystem .isSafeToStow ()) {
304- biscuitSubsystem . setPosition (RobotConstants .kStowSetpoint , hasAlgae () );
314+ setBiscuitTransfer (RobotConstants .kStowSetpoint , true );
305315 elevatorSubsystem .setPosition (RobotConstants .kElevatorStowSetpoint );
306316 algaeSubsystem .hold ();
307317
@@ -312,7 +322,7 @@ public void toStow() {
312322 }
313323
314324 public void toStowSafe () {
315- biscuitSubsystem . setPosition (RobotConstants .kStowSetpoint , hasAlgae () );
325+ setBiscuitTransfer (RobotConstants .kStowSetpoint , true );
316326 driveSubsystem .removeDriveMultiplier ();
317327 driveSubsystem .setIgnoreSticks (false );
318328 algaeSubsystem .hold ();
@@ -321,7 +331,7 @@ public void toStowSafe() {
321331 }
322332
323333 public void toStowSequential () {
324- biscuitSubsystem . setPosition (RobotConstants .kStowSetpoint , hasAlgae () );
334+ setBiscuitTransfer (RobotConstants .kStowSetpoint , true );
325335 driveSubsystem .removeDriveMultiplier ();
326336 driveSubsystem .setIgnoreSticks (false );
327337 algaeSubsystem .hold ();
@@ -331,23 +341,23 @@ public void toStowSequential() {
331341
332342 public void toAutonPrestage () {
333343 coralLoc = CoralLoc .CORAL ;
334- biscuitSubsystem . setPosition (RobotConstants .kPrestageSetpoint , hasAlgae () );
344+ setBiscuitTransfer (RobotConstants .kPrestageSetpoint , false );
335345 elevatorSubsystem .setPosition (ElevatorConstants .kAutoPrestageSetpoint );
336346 funnelSubsystem .stopMotor ();
337347
338348 setState (RobotStates .PRESTAGE , true );
339349 }
340350
341351 public void toFunnelLoad () {
342- biscuitSubsystem . setPosition (RobotConstants .kFunnelSetpoint , hasAlgae () );
352+ setBiscuitTransfer (RobotConstants .kFunnelSetpoint , true );
343353 coralSubsystem .intake ();
344354 elevatorSubsystem .setPosition (RobotConstants .kElevatorFunnelSetpoint );
345355
346356 setState (RobotStates .FUNNEL_LOAD , true );
347357 }
348358
349359 private void toPrestage () {
350- biscuitSubsystem . setPosition (RobotConstants .kPrestageSetpoint , hasAlgae () );
360+ setBiscuitTransfer (RobotConstants .kPrestageSetpoint , false );
351361
352362 prestagingForAlgae = getAlgaeOnCycle ;
353363
@@ -415,7 +425,7 @@ private void toReefAlign(boolean getAlgae, boolean drive) {
415425
416426 if (wantAlgae && !algaeSafe ) {
417427 algaeSubsystem .intake ();
418- biscuitSubsystem . setPosition (RobotConstants .kPrestageAlgaeSetpoint , hasAlgae () );
428+ setBiscuitTransfer (RobotConstants .kPrestageAlgaeSetpoint , true );
419429
420430 switch (getAlgaeLevel ()) {
421431 case L2 -> {
@@ -442,11 +452,11 @@ private void toReefAlign(boolean getAlgae, boolean drive) {
442452
443453 switch (getAlgaeLevel ()) {
444454 case L2 -> {
445- biscuitSubsystem . setPosition (RobotConstants .kL2AlgaeSetpoint , hasAlgae () );
455+ setBiscuitTransfer (RobotConstants .kL2AlgaeSetpoint , true );
446456 elevatorSubsystem .setPosition (ElevatorConstants .kL2AlgaeSetpoint );
447457 }
448458 case L3 -> {
449- biscuitSubsystem . setPosition (RobotConstants .kL3AlgaeSetpoint , hasAlgae () );
459+ setBiscuitTransfer (RobotConstants .kL3AlgaeSetpoint , true );
450460 elevatorSubsystem .setPosition (ElevatorConstants .kL3AlgaeSetpoint );
451461 }
452462 default -> logger .error ("Invalid algae level: {}" , getAlgaeLevel ());
@@ -467,19 +477,19 @@ private void toReefAlign(boolean getAlgae, boolean drive) {
467477 currentLevel = scoringLevel ;
468478 switch (scoringLevel ) {
469479 case L1 -> {
470- biscuitSubsystem . setPosition (RobotConstants .kL1CoralSetpoint , hasAlgae () );
480+ setBiscuitTransfer (RobotConstants .kL1CoralSetpoint , true );
471481 elevatorSubsystem .setPosition (ElevatorConstants .kL1CoralSetpoint );
472482 }
473483 case L2 -> {
474- biscuitSubsystem . setPosition (RobotConstants .kL2CoralSetpoint , hasAlgae () );
484+ setBiscuitTransfer (RobotConstants .kL2CoralSetpoint , true );
475485 elevatorSubsystem .setPosition (ElevatorConstants .kL2CoralSetpoint );
476486 }
477487 case L3 -> {
478- biscuitSubsystem . setPosition (RobotConstants .kL3CoralSetpoint , hasAlgae () );
488+ setBiscuitTransfer (RobotConstants .kL3CoralSetpoint , true );
479489 elevatorSubsystem .setPosition (ElevatorConstants .kL3CoralSetpoint );
480490 }
481491 case L4 -> {
482- biscuitSubsystem . setPosition (RobotConstants .kL4CoralSetpoint , hasAlgae () );
492+ setBiscuitTransfer (RobotConstants .kL4CoralSetpoint , true );
483493 elevatorSubsystem .setPosition (ElevatorConstants .kL4CoralSetpoint );
484494 }
485495 }
@@ -526,7 +536,7 @@ public void toAlgaeFloorPickup() {
526536 return ;
527537 }
528538
529- biscuitSubsystem . setPosition (RobotConstants .kFloorAlgaeSetpoint , hasAlgae () );
539+ setBiscuitTransfer (RobotConstants .kFloorAlgaeSetpoint , true );
530540 elevatorSubsystem .setPosition (ElevatorConstants .kFloorAlgaeSetpoint );
531541
532542 setState (RobotStates .FLOOR_ALGAE , true );
@@ -536,7 +546,7 @@ public void toAlgaeFloorPickup() {
536546 return ;
537547 }
538548
539- biscuitSubsystem . setPosition (RobotConstants .kMicAlgaeSetpoint , hasAlgae () );
549+ setBiscuitTransfer (RobotConstants .kMicAlgaeSetpoint , true );
540550 elevatorSubsystem .setPosition (ElevatorConstants .kMicAlgaeSetpoint );
541551
542552 setState (RobotStates .MIC_ALGAE , true );
@@ -598,6 +608,7 @@ public void releaseAlgae() {
598608
599609 processorReleasePose = driveSubsystem .getPoseMeters ();
600610 Logger .recordOutput ("RobotState/Processor Release Pose" , processorReleasePose );
611+ driveSubsystem .removeDriveMultiplier ();
601612
602613 switch (algaeHeight ) {
603614 case LOW -> {
@@ -623,7 +634,7 @@ public void toHpAlgae() {
623634
624635 algaeSubsystem .intake ();
625636
626- biscuitSubsystem . setPosition (RobotConstants .kHpAlgaeSetpoint , hasAlgae () );
637+ setBiscuitTransfer (RobotConstants .kHpAlgaeSetpoint , false );
627638 elevatorSubsystem .setPosition (ElevatorConstants .kHpAlgaeSetpoint );
628639
629640 setState (RobotStates .HP_ALGAE , true );
@@ -640,7 +651,7 @@ private void toProcessor() {
640651 return ;
641652 }
642653
643- biscuitSubsystem . setPosition (RobotConstants .kProcessorSetpoint , hasAlgae () );
654+ setBiscuitTransfer (RobotConstants .kProcessorSetpoint , true );
644655 elevatorSubsystem .setPosition (ElevatorConstants .kProcessorSetpoint );
645656
646657 setState (RobotStates .PROCESSOR_ALGAE , true );
@@ -672,7 +683,7 @@ public void toPrepClimb() {
672683 return ;
673684 }
674685
675- biscuitSubsystem . setPosition (RobotConstants .kStowSetpoint , hasAlgae () );
686+ setBiscuitTransfer (RobotConstants .kStowSetpoint , true );
676687 elevatorSubsystem .setPosition (RobotConstants .kElevatorStowSetpoint );
677688
678689 climbSubsystem .prepClimb ();
@@ -714,6 +725,9 @@ public void periodic() {
714725
715726 switch (curState ) {
716727 case TRANSFER -> {
728+ if (elevatorSubsystem .getPosition ().gt (ElevatorConstants .kBiscuitSafeThreshold )) {
729+ biscuitSubsystem .setPosition (nextBiscuitSetpoint , hasAlgae ());
730+ }
717731 if (biscuitSubsystem .isFinished () && elevatorSubsystem .isFinished ()
718732 || ((nextState == RobotStates .PREP_CLIMB || nextState == RobotStates .CLIMB )
719733 && elevatorSubsystem .getPosition ().in (Rotations )
@@ -774,11 +788,15 @@ public void periodic() {
774788 biscuitSubsystem .setIsRemovingAlgae (true );
775789 switch (getAlgaeLevel ()) {
776790 case L2 -> {
777- biscuitSubsystem .setPosition (RobotConstants .kL2AlgaeRemovalSetpoint , true );
791+ biscuitSubsystem .setPosition (
792+ RobotConstants .kL2AlgaeRemovalSetpoint ,
793+ true ); // not using setBiscuitTransfer() to ensure hasAlgae is true
778794 elevatorSubsystem .setPosition (ElevatorConstants .kL2AlgaeRemovalSetpoint );
779795 }
780796 case L3 -> {
781- biscuitSubsystem .setPosition (RobotConstants .kL3AlgaeRemovalSetpoint , true );
797+ biscuitSubsystem .setPosition (
798+ RobotConstants .kL3AlgaeRemovalSetpoint ,
799+ true ); // not using setBiscuitTransfer() to ensure hasAlgae is true
782800 elevatorSubsystem .setPosition (ElevatorConstants .kL3AlgaeRemovalSetpoint );
783801 }
784802 default -> logger .error ("Invalid algae level: {}" , getAlgaeLevel ());
@@ -892,7 +910,9 @@ public void periodic() {
892910 }
893911 case TO_BARGE_ALGAE -> {
894912 if (elevatorSubsystem .isHigherThan (ElevatorConstants .kBargeHigherThan )) {
895- biscuitSubsystem .setPosition (RobotConstants .kBargeSetpoint , hasAlgae ());
913+ biscuitSubsystem .setPosition (
914+ RobotConstants .kBargeSetpoint ,
915+ hasAlgae ()); // not using setBiscuitTransfer(), moves biscuit at higher threshold
896916 curState = RobotStates .BARGE_ALGAE ;
897917 }
898918 }
0 commit comments