package com.team254.frc2015.behavior.routines; import com.team254.frc2015.Constants; import com.team254.frc2015.behavior.Commands; import com.team254.frc2015.behavior.RobotSetpoints; import edu.wpi.first.wpilibj.Timer; import java.util.Optional; public class CoopRoutine extends Routine { public enum States { START, RAISE_TO_HEIGHT, EXHAUST_ME_MAYBE, PUSH_OUT, OPEN_AND_WAIT } public States m_state = States.START; private boolean m_is_new_state = false; Timer m_state_timer = new Timer(); RobotSetpoints setpoints; @Override public void reset() { m_state_timer.start(); m_state_timer.reset(); m_state = States.START; } @Override public RobotSetpoints update(Commands commands, RobotSetpoints existing_setpoints) { RobotSetpoints setpoints = existing_setpoints; States new_state = m_state; switch (m_state) { case START: new_state = States.RAISE_TO_HEIGHT; break; case RAISE_TO_HEIGHT: if (m_is_new_state) { setpoints.m_elevator_setpoints.bottom_setpoint = Optional.of(Constants.kCoopBottomHeight); setpoints.m_elevator_setpoints.top_setpoint = Optional.of(Constants.kCoopTopHeight); } if (!m_is_new_state && bottom_carriage.isOnTarget() && top_carriage.isOnTarget()) { new_state = States.EXHAUST_ME_MAYBE; } break; case EXHAUST_ME_MAYBE: setpoints.intake_action = RobotSetpoints.IntakeAction.PREFER_OPEN; if (commands.roller_request == Commands.RollerRequest.EXHAUST) { new_state = States.PUSH_OUT; } break; case PUSH_OUT: setpoints.roller_action = RobotSetpoints.RollerAction.EXHAUST_COOP; setpoints.intake_action = RobotSetpoints.IntakeAction.CLOSE; setpoints.coop_pusher_action = RobotSetpoints.CoopPusherAction.EXTEND; if (m_state_timer.get() > .75 && commands.roller_request != Commands.RollerRequest.EXHAUST) { new_state = States.OPEN_AND_WAIT; } break; case OPEN_AND_WAIT: setpoints.intake_action = RobotSetpoints.IntakeAction.OPEN; setpoints.roller_action = RobotSetpoints.RollerAction.STOP; if (commands.roller_request == Commands.RollerRequest.EXHAUST) { setpoints.roller_action = RobotSetpoints.RollerAction.EXHAUST_COOP; setpoints.intake_action = RobotSetpoints.IntakeAction.CLOSE; } break; default: break; } 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 false; } @Override public String getName() { return "Co-Op"; } }