package com.team254.frc2015.behavior.routines; import com.team254.frc2015.behavior.Commands; import com.team254.frc2015.behavior.RobotSetpoints; import edu.wpi.first.wpilibj.Timer; import java.util.Optional; public class VerticalCanPickupRoutine extends Routine { public enum States { MOVE_TO_POSITION, CLOSE, MOVE_UP, DONE } private States m_state = States.MOVE_TO_POSITION; private boolean m_is_new_state = true; Timer m_state_timer = new Timer(); @Override public void reset() { m_state = States.MOVE_TO_POSITION; m_is_new_state = true; m_state_timer.start(); m_state_timer.reset(); } @Override public RobotSetpoints update(Commands commands, RobotSetpoints setpoints) { States new_state = m_state; switch (m_state) { case MOVE_TO_POSITION: setpoints.claw_action = RobotSetpoints.TopCarriageClawAction.OPEN; setpoints.intake_action = RobotSetpoints.IntakeAction.CLOSE; if (commands.intake_request == Commands.IntakeRequest.OPEN) { setpoints.intake_action = RobotSetpoints.IntakeAction.CLOSE; } if (commands.roller_request == Commands.RollerRequest.INTAKE) { setpoints.roller_action = RobotSetpoints.RollerAction.NONE; } else if (commands.roller_request == Commands.RollerRequest.NONE) { setpoints.roller_action = RobotSetpoints.RollerAction.INTAKE; } if (m_is_new_state) { setpoints.m_elevator_setpoints.bottom_setpoint = Optional.of(0.); setpoints.m_elevator_setpoints.top_setpoint = Optional.of(4.25); } if (m_state_timer.get() > .25 && commands.vertical_can_grab_request == Commands.VerticalCanGrabberRequests.ACTIVATE) { new_state = States.CLOSE; } setpoints.pinball_wizard_action = RobotSetpoints.PinballWizardAction.EXTEND; break; case CLOSE: setpoints.claw_action = RobotSetpoints.TopCarriageClawAction.CLOSE; setpoints.intake_action = RobotSetpoints.IntakeAction.OPEN; if (m_state_timer.get() > .1) { new_state = States.MOVE_UP; } setpoints.pinball_wizard_action = RobotSetpoints.PinballWizardAction.EXTEND; break; case MOVE_UP: setpoints.claw_action = RobotSetpoints.TopCarriageClawAction.CLOSE; setpoints.intake_action = RobotSetpoints.IntakeAction.OPEN; if (m_is_new_state) { setpoints.m_elevator_setpoints.top_setpoint = Optional.of(40.0); } if (!m_is_new_state && (top_carriage.isOnTarget() || m_state_timer.get() > 3.0)) { new_state = States.DONE; } break; } if (commands.intake_request == Commands.IntakeRequest.OPEN) { setpoints.intake_action = RobotSetpoints.IntakeAction.CLOSE; } m_is_new_state = false; if (new_state != m_state) { m_state = new_state; m_state_timer.reset(); m_is_new_state = true; } return setpoints; } @Override public void cancel() { } @Override public boolean isFinished() { return m_state == States.DONE; } @Override public String getName() { return "Vertical Can"; } }