package canStateMachine;
import java.util.ArrayList;
import NetworkComm.InputOutputComm;
import edu.wpi.first.wpilibj.DigitalInput;
public class AutoStateMachine {
private DigitalInput autoNetworkSwitch1;
private DigitalInput autoNetworkSwitch2;
private DigitalInput autoNetworkSwitch3;
private boolean autoNetworkEnable = false;
private ArrayList<ArrayList<AutoState>> autoStates;
private ArrayList<ArrayList<Event>> autoEvents;
private AutoState currentState;
public AutoStateMachine()
{
// Switch arrangement: <0> <1> <2> - from the rear of the robot
// ON = toward bumper -- OFF = toward robot center
autoNetworkSwitch1 = new DigitalInput(0);
autoNetworkSwitch2 = new DigitalInput(1);
autoNetworkSwitch3 = new DigitalInput(2);
// create list of lists for states and events
autoStates = new ArrayList<ArrayList<AutoState>>();
autoEvents = new ArrayList<ArrayList<Event>>();
createStateNetworks();
}
private void createStateNetworks()
{
// Eight possible state machine slots (three select switches)
// Default for each slot is... do nothing
//--- STATE MACHINE 0: add a do nothing state machine (auto disabled anyway at 0 index)
createDoNothingSM(0);
//*** STATE MACHINE 1: add a lower arm and shoot state machine (mainly for testing)
createDriveForwardSM_Slow(1);
//createDoNothingSM(1);
//--- STATE MACHINE 2: mover only == add a drive straight (fast & short) state machine
createHalfArmMoveAndDriveForwardSM_Fast(2);
//createDoNothingSM(2);
//--- STATE MACHINE 3: LEFT POSITION SHOOTER == add a drive straight, turn right and shoot state machine
create_ArmMove_Drive_TurnRight_Shoot_SM(3);
//createDoNothingSM(3);
//--- STATE MACHINE 4: add a drive straight, state machine
//screate_TargetFollower_SM(4);
create_ArmMove_Shoot_SM(4);
//createDoNothingSM(4);
//--- STATE MACHINE 5: add a do nothing state machine
createDoNothingSM(5);
//--- STATE MACHINE 6: RIGHT POSITION SHOOTER == add a drive straight, turn left and shoot state machine
create_ArmMove_Drive_TurnLeft_Shoot_SM(6);
//createDoNothingSM(6);
//--- STATE MACHINE 7: CENTER POSITION SHOOTER == add a drive straight and shoot state machine
create_ArmMove_DriveStraight_Shoot_SM(7);
//createDoNothingSM(7);
String myString = new String("autoStates list size = " + autoStates.size() + ", autoEvents list size = " + autoEvents.size());
System.out.println(myString);
InputOutputComm.putString(InputOutputComm.LogTable.kMainLog,"Auto/AutoSM_setup", myString);
}
public AutoState getState() {
return currentState;
}
public void start()
{
// determine if we are running auto or not
int networkIndex = getNetworkIndex();
String myString = new String("autoNetworkEnable = " + autoNetworkEnable + ", networkIndex = " + networkIndex);
System.out.println(myString);
InputOutputComm.putString(InputOutputComm.LogTable.kMainLog,"Auto/AutoSM_network", myString);
if (autoNetworkEnable)
{
// if we have a state network
ArrayList<AutoState> myNetwork = autoStates.get(networkIndex);
if ((myNetwork != null) && (myNetwork.size() > 0))
{
// grab the first state in the selected network and enter it!
currentState = myNetwork.get(0);
//System.out.println("State machine starting with " + currentState.name);
currentState.enter();
}
}
}
public void process() {
if (autoNetworkEnable)
{
AutoState nextState = null;
// process the current state
if (currentState != null)
{
String myString = new String("State = " + currentState.name);
System.out.println(myString);
InputOutputComm.putString(InputOutputComm.LogTable.kMainLog,"Auto/AutoSM_currentState", myString);
nextState = currentState.process();
}
// if the returned next state is non-null, event has triggered a new state!
if (nextState != null)
{
// clean up current state
currentState.exit();
//System.out.println("State machine switching to " + nextState.name);
// switch to next state
currentState = nextState;
currentState.enter();
}
}
}
// computes binary value from digital inputs.
// If all switches are false (zero), auto is disabled
private int getNetworkIndex()
{
int value = 0;
// first switch is binary 1
if (autoNetworkSwitch1.get())
value += 1;
// second switch is binary 2
if (autoNetworkSwitch2.get())
value += 2;
// third switch is binary 4
if (autoNetworkSwitch3.get())
value += 4;
//value = 1; // testing only
if (value == 0)
{
// all switches off means no auto modes selected - auto state machine operation disabled
autoNetworkEnable = false;
}
else
{
// Non-zero network - auto mode selected!
autoNetworkEnable = true;
}
// return index value for network selected
return value;
}
// **** DO NOTHING STATE MACHINE *****
// First (zero index) state machine - does nothing
private void createDoNothingSM(int index) {
IdleState deadEnd = new IdleState("<Dead End State>");
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(deadEnd);
myEvents.add(timer1);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** [ARM MOVE - DRIVE] STATE MACHINE *****
// ** Good for ramparts, rough terrain, rock wall, portcullis
// 1) be idle for a number of sec
// 2) lower arm for a number of sec
// 3) drive forward for a number of sec
// 4) go back to idle and stay there
private void createHalfArmMoveAndDriveForwardSM_Fast(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
ArmMoveState moveArmDown = new ArmMoveState("<Arm Move Down State - Halfway>", 0.35);
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State - Fast>", isPwm, 0.85);
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(1.5); // lower arm timer event
TimeEvent timer3 = new TimeEvent(4.0); // drive forward timer event
// connect each event with a state to move to
timer1.associateNextState(moveArmDown);
timer2.associateNextState(driveForward);
timer3.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
moveArmDown.addEvent(timer2);
driveForward.addEvent(timer3);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(moveArmDown);
myStates.add(driveForward);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(timer3);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** [ARM MOVE - DRIVE STRAIGHT - SHOOT] STATE MACHINE *****
// ** Good for ramparts, rough terrain, rock wall, portcullis
// 1) be idle for a number of sec
// 2) lower arm for a number of sec
// 3) drive forward for a number of sec
// 4) lower arm FURTHER for a number of sec
// 5) run conveyer
// 6) calibrate shooter
// 7) shoot and reset catapult
// 8) go back to idle and stay there
private void create_ArmMove_DriveStraight_Shoot_SM(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
ArmMoveState moveArmDown = new ArmMoveState("<Arm Move Down State>", 0.35);
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State - Fast>", isPwm, 0.85);
ArmMoveState moveArmDownAgain = new ArmMoveState("<Arm Move Down Again State>", 0.35);
ConveyerStartState conveyerIn = new ConveyerStartState("<Conveyer In State>",true);
CalibrateShooterState calShooter = new CalibrateShooterState("<Cal Shooter State>");
ShootAndResetCatapultState shootBallAndReset = new ShootAndResetCatapultState("<Shoot and Reset Catapult State>");
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(1.5); // lower arm timer event
TimeEvent timer3 = new TimeEvent(4.0); // drive forward timer event
TimeEvent timer4 = new TimeEvent(0.5); // lower arm further timer event
TimeEvent timer5 = new TimeEvent(3.0); // timer event for conveyer operation
CalibrateEvent calEvent1 = new CalibrateEvent(true); // shooter calibrated event
//TimeEvent calTimer = new TimeEvent(3.0); // time-out event for shooter calibration
TimeEvent timer6 = new TimeEvent(2.0); // timer event for catapult shoot/reset operation
// connect each event with a state to move to
timer1.associateNextState(moveArmDown);
timer2.associateNextState(driveForward);
timer3.associateNextState(moveArmDownAgain);
timer4.associateNextState(conveyerIn);
timer5.associateNextState(calShooter);
calEvent1.associateNextState(shootBallAndReset);
//calTimer.associateNextState(shootBallAndReset);
timer6.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
moveArmDown.addEvent(timer2);
driveForward.addEvent(timer3);
moveArmDownAgain.addEvent(timer4);
conveyerIn.addEvent(timer5);
calShooter.addEvent(calEvent1);
//calShooter.addEvent(calTimer);
shootBallAndReset.addEvent(timer6);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(moveArmDown);
myStates.add(driveForward);
myStates.add(moveArmDownAgain);
myStates.add(conveyerIn);
myStates.add(calShooter);
myStates.add(shootBallAndReset);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(timer3);
myEvents.add(timer4);
myEvents.add(timer5);
myEvents.add(calEvent1);
//myEvents.add(calTimer);
myEvents.add(timer6);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** [ARM MOVE - DRIVE - TURN RIGHT - SHOOT] STATE MACHINE *****
// ** Good for ramparts, rough terrain, rock wall, portcullis
// 1) be idle for a number of sec
// 2) lower arm for a number of sec
// 3) drive forward for a number of sec
// 4) lower arm FURTHER for a number of sec
// 5) turn right to a number of deg
// 6) drive forward again for a number of sec
// 7) run conveyer
// 8) calibrate shooter
// 9) shoot and reset catapult
// 10) go back to idle and stay there
private void create_ArmMove_Drive_TurnRight_Shoot_SM(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
ArmMoveState moveArmDown = new ArmMoveState("<Arm Move Down State>", 0.35);
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State>", isPwm, 0.85);
ArmMoveState moveArmDownAgain = new ArmMoveState("<Arm Move Down FURTHER State>", 0.35);
TurnState turnRight = new TurnState("<Turn Right State>",45.0, 0.3, isPwm);
DriveForwardState driveForwardAgain = new DriveForwardState("<Drive Forward Again State>", isPwm, 0.85);
ConveyerStartState conveyerIn = new ConveyerStartState("<Conveyer In State>",true);
CalibrateShooterState calShooter = new CalibrateShooterState("<Cal Shooter State>");
ShootAndResetCatapultState shootBallAndReset = new ShootAndResetCatapultState("<Shoot and Reset Catapult State>");
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(1.5); // lower arm timer event
TimeEvent timer3 = new TimeEvent(4.0); // drive forward timer event
TimeEvent timer4 = new TimeEvent(0.5); // lower arm again timer event
GyroAngleEvent gyro1 = new GyroAngleEvent(45.0,GyroAngleEvent.AnglePolarity.kGreaterThan); // 45 deg (right turn) event
TimeEvent timer5 = new TimeEvent(1.5); // drive forward again timer event
TimeEvent timer6 = new TimeEvent(3.0); // timer event for conveyer operation
CalibrateEvent calEvent1 = new CalibrateEvent(true); // shooter calibrated event
//TimeEvent calTimer = new TimeEvent(3.0); // time-out event for shooter calibration
TimeEvent timer7 = new TimeEvent(2.0); // timer event for catapult shoot/reset operation
// connect each event with a state to move to
timer1.associateNextState(moveArmDown);
timer2.associateNextState(driveForward);
timer3.associateNextState(moveArmDownAgain);
timer4.associateNextState(turnRight);
gyro1.associateNextState(driveForwardAgain);
timer5.associateNextState(conveyerIn);
timer6.associateNextState(calShooter);
calEvent1.associateNextState(shootBallAndReset);
//calTimer.associateNextState(shootBallAndReset);
timer7.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
moveArmDown.addEvent(timer2);
driveForward.addEvent(timer3);
moveArmDownAgain.addEvent(timer4);
turnRight.addEvent(gyro1);
driveForwardAgain.addEvent(timer5);
conveyerIn.addEvent(timer6);
calShooter.addEvent(calEvent1);
//calShooter.addEvent(calTimer);
shootBallAndReset.addEvent(timer7);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(moveArmDown);
myStates.add(driveForward);
myStates.add(moveArmDownAgain);
myStates.add(turnRight);
myStates.add(driveForwardAgain);
myStates.add(conveyerIn);
myStates.add(calShooter);
myStates.add(shootBallAndReset);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(timer3);
myEvents.add(timer4);
myEvents.add(gyro1);
myEvents.add(timer5);
myEvents.add(timer6);
myEvents.add(calEvent1);
//myEvents.add(calTimer);
myEvents.add(timer7);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** [ARM MOVE - DRIVE - TURN LEFT - SHOOT] STATE MACHINE *****
// ** Good for ramparts, rough terrain, rock wall, portcullis
// 1) be idle for a number of sec
// 2) lower arm for a number of sec
// 3) drive forward for a number of sec
// 4) lower arm FURTHER for a number of sec
// 5) turn right to a number of deg
// 6) drive forward again for a number of sec
// 7) run conveyer
// 8) calibrate shooter
// 9) shoot and reset catapult
// 10) go back to idle and stay there
private void create_ArmMove_Drive_TurnLeft_Shoot_SM(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
ArmMoveState moveArmDown = new ArmMoveState("<Arm Move Down State>", 0.35);
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State>", isPwm, 0.85);
ArmMoveState moveArmDownAgain = new ArmMoveState("<Arm Move Down FURTHER State>", 0.35);
TurnState turnLeft = new TurnState("<Turn Left State>",-45.0, 0.3, isPwm);
DriveForwardState driveForwardAgain = new DriveForwardState("<Drive Forward AGAIN State>", isPwm, 0.85);
ConveyerStartState conveyerIn = new ConveyerStartState("<Conveyer In State>",true);
CalibrateShooterState calShooter = new CalibrateShooterState("<Cal Shooter State>");
ShootAndResetCatapultState shootBallAndReset = new ShootAndResetCatapultState("<Shoot and Reset Catapult State>");
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(1.5); // lower arm timer event
TimeEvent timer3 = new TimeEvent(4.0); // drive forward timer event
TimeEvent timer4 = new TimeEvent(0.5); // lower arm further timer event
GyroAngleEvent gyro1 = new GyroAngleEvent(-45.0,GyroAngleEvent.AnglePolarity.kLessThan); // -45 deg (left turn) event
TimeEvent timer5 = new TimeEvent(1.5); // drive forward again timer event
TimeEvent timer6 = new TimeEvent(3.0); // timer event for conveyer operation
CalibrateEvent calEvent1 = new CalibrateEvent(true); // shooter calibrated event
//TimeEvent calTimer = new TimeEvent(3.0); // time-out event for shooter calibration
TimeEvent timer7 = new TimeEvent(2.0); // timer event for catapult shoot/reset operation
// connect each event with a state to move to
timer1.associateNextState(moveArmDown);
timer2.associateNextState(driveForward);
timer3.associateNextState(moveArmDownAgain);
timer4.associateNextState(turnLeft);
gyro1.associateNextState(driveForwardAgain);
timer5.associateNextState(conveyerIn);
timer6.associateNextState(calShooter);
calEvent1.associateNextState(shootBallAndReset);
//calTimer.associateNextState(shootBallAndReset);
timer7.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
moveArmDown.addEvent(timer2);
driveForward.addEvent(timer3);
moveArmDownAgain.addEvent(timer4);
turnLeft.addEvent(gyro1);
driveForward.addEvent(timer5);
conveyerIn.addEvent(timer6);
calShooter.addEvent(calEvent1);
//calShooter.addEvent(calTimer);
shootBallAndReset.addEvent(timer7);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(moveArmDown);
myStates.add(driveForward);
myStates.add(moveArmDownAgain);
myStates.add(turnLeft);
myStates.add(driveForwardAgain);
myStates.add(conveyerIn);
myStates.add(calShooter);
myStates.add(shootBallAndReset);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(timer3);
myEvents.add(timer4);
myEvents.add(gyro1);
myEvents.add(timer5);
myEvents.add(timer6);
myEvents.add(calEvent1);
//myEvents.add(calTimer);
myEvents.add(timer7);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** [ARM MOVE - SHOOT] STATE MACHINE - mainly for shooter testing *****
// 1) be idle for a number of sec
// 2) lower arm for a number of sec
// 3) calibrate shooter
// 4) run conveyer
// 5) shoot and reset catapult
// 6) go back to idle and stay there
private void create_ArmMove_Shoot_SM(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
ArmMoveState moveArmDown = new ArmMoveState("<Arm Move Down State>", 0.35);
CalibrateShooterState calShooter = new CalibrateShooterState("<Cal Shooter State>");
ConveyerStartState conveyerIn = new ConveyerStartState("<Conveyer In State>",true);
ShootAndResetCatapultState shootBallAndReset = new ShootAndResetCatapultState("<Shoot and Reset Catapult State>");
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(2.0); // lower arm timer event
CalibrateEvent calEvent1 = new CalibrateEvent(true); // shooter calibrated event
//TimeEvent calTimer = new TimeEvent(3.0); // time-out event for shooter calibration
TimeEvent timer3 = new TimeEvent(3.0); // timer event for conveyer operation
TimeEvent timer4 = new TimeEvent(2.0); // timer event for catapult shoot/reset operation
// connect each event with a state to move to
timer1.associateNextState(moveArmDown);
timer2.associateNextState(calShooter);
calEvent1.associateNextState(conveyerIn);
//calTimer.associateNextState(conveyerIn);
timer3.associateNextState(shootBallAndReset);
timer4.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
moveArmDown.addEvent(timer2);
calShooter.addEvent(calEvent1);
//calShooter.addEvent(calTimer);
conveyerIn.addEvent(timer3);
shootBallAndReset.addEvent(timer4);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(moveArmDown);
myStates.add(calShooter);
myStates.add(conveyerIn);
myStates.add(shootBallAndReset);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(calEvent1);
//myEvents.add(calTimer);
myEvents.add(timer3);
myEvents.add(timer4);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** [FOLLOW TARGET] STATE MACHINE - mainly for autotargeting testing - does not shoot *****
// 1) be idle for a number of sec
// 2) calibrate shooter continuously! Never stop following target! NEVER!
private void create_TargetFollower_SM(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
CalibrateShooterState calShooter = new CalibrateShooterState("<Cal Shooter FOREVER State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
// connect each event with a state to move to
timer1.associateNextState(calShooter);
// add events to each state
startIdle.addEvent(timer1);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(calShooter);
myEvents.add(timer1);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
//******************************* UNUSED (OLD BUT USEFUL) STATE MACHINES **********************//
// **** ARM MOVE DOWN THEN UP STATE MACHINE *****
// ** Test front arm movement in auto - no driving
// 1) be idle for a number of sec
// 2) lower arm for a number of sec
// 3) raise arm for a number of sec
// 4) go back to idle and stay there
private void createMoveArmDownThenUpSM(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
ArmMoveState moveArmDown = new ArmMoveState("<Arm Move Down State>", 0.35);
ArmMoveState moveArmUp = new ArmMoveState("<Arm Move Up State>", -0.35);
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(2.5); // lower arm timer event
TimeEvent timer3 = new TimeEvent(2.5); // raise arm timer event
// connect each event with a state to move to
timer1.associateNextState(moveArmDown);
timer2.associateNextState(moveArmUp);
timer3.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
moveArmDown.addEvent(timer2);
moveArmUp.addEvent(timer3);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(moveArmDown);
myStates.add(moveArmUp);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(timer3);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** MOVE FORWARD STATE MACHINE - slow and steady *****
// ** Good for moat, rough terrain, portcullis
// 1) be idle for a number of sec
// 2) drive forward for a number of sec
// 3) go back to idle and stay there
private void createDriveForwardSM_Slow(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State - Slow>", isPwm, 0.40);
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(25.0); // drive forward timer event
// connect each event with a state to move to
timer1.associateNextState(driveForward);
timer2.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
driveForward.addEvent(timer2);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(driveForward);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** MOVE FORWARD STATE MACHINE - faster, shorter, more power *****
// ** Good for ramparts, rough terrain, stone wall, portcullis
// 1) be idle for a number of sec
// 2) drive forward for a number of sec
// 3) go back to idle and stay there
private void createDriveForwardSM_Fast(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State - Fast>", isPwm, 0.85);
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(4.0); // drive forward timer event
// connect each event with a state to move to
timer1.associateNextState(driveForward);
timer2.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
driveForward.addEvent(timer2);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(driveForward);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** MOVE FORWARD STATE MACHINE - superfast, super short, more power *****
// ** Good for <UNKNOWN>
// 1) be idle for a number of sec
// 2) drive forward for a number of sec
// 3) go back to idle and stay there
private void createDriveForwardSM_SuperFast(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State - SuperFast>", isPwm, 0.95);
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(3.0); // drive forward timer event
// connect each event with a state to move to
timer1.associateNextState(driveForward);
timer2.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
driveForward.addEvent(timer2);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(driveForward);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** ARM MOVE FULL DOWN AND DRIVE FORWARD STATE MACHINE - fast *****
// ** Good for ramparts, rough terrain, rock wall, portcullis
// 1) be idle for a number of sec
// 2) lower arm for a number of sec
// 3) drive forward for a number of sec
// 4) go back to idle and stay there
private void createFullArmMoveAndDriveForwardSM_Fast(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
ArmMoveState moveArmDown = new ArmMoveState("<Arm Move Down State - Full move>", 0.35);
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State - Fast>", isPwm, 0.85);
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(2.5); // lower arm timer event
TimeEvent timer3 = new TimeEvent(4.0); // drive forward timer event
// connect each event with a state to move to
timer1.associateNextState(moveArmDown);
timer2.associateNextState(driveForward);
timer3.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
moveArmDown.addEvent(timer2);
driveForward.addEvent(timer3);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(moveArmDown);
myStates.add(driveForward);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(timer3);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** MOVE FORWARD & SHOOT STATE MACHINE *****
// 1) be idle for a number of sec
// 2) drive forward for a number of sec
// 3) calibrate auto-shooter with target
// 4) drop ball from conveyer into catapult
// 5) shoot and reset catapult
// 6) go back to idle and stay there
private void createDriveForwardAndShootSM(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State>", isPwm, 0.65);
ConveyerStartState conveyerIn = new ConveyerStartState("<Conveyer In State>",true);
CalibrateShooterState calShooter = new CalibrateShooterState("<Cal Shooter State>");
ShootAndResetCatapultState shootBallAndReset = new ShootAndResetCatapultState("<Shoot and Reset Catapult State>");
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // timer event for idle
TimeEvent timer2 = new TimeEvent(7.0); // timer event for drive forward
TimeEvent timer3 = new TimeEvent(2.0); // timer event for conveyer operation
CalibrateEvent calEvent1 = new CalibrateEvent(true); // shooter calibrated event
TimeEvent timer4 = new TimeEvent(5.0); // timer event for catapult fire & reset
// connect each event with a state to move to
timer1.associateNextState(driveForward);
timer2.associateNextState(conveyerIn);
timer3.associateNextState(calShooter);
calEvent1.associateNextState(shootBallAndReset);
timer4.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
driveForward.addEvent(timer2);
conveyerIn.addEvent(timer3);
calShooter.addEvent(calEvent1);
shootBallAndReset.addEvent(timer4);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(driveForward);
myStates.add(conveyerIn);
myStates.add(calShooter);
myStates.add(shootBallAndReset);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(timer3);
myEvents.add(calEvent1);
myEvents.add(timer4);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** DRIVE-TURN-DRIVE-SHOOT (Spybot) STATE MACHINE *****
// 1) be idle for a number of sec
// 2) drive forward for a number of sec
// 3) turn a number of degrees
// 4) drive forward for a number of sec
// 5) drop ball from conveyer into catapult
// 6) calibrate auto-shooter with target
// 7) shoot and reset catapult
// 8) go back to idle and stay there
private void createDriveTurnShootSM(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
DriveForwardState driveForward = new DriveForwardState("<Drive Forward State>", isPwm, 0.65);
TurnState turnLeft = new TurnState("<Turn Left State>",-135.0, 0.3, isPwm);
DriveForwardState driveForward2 = new DriveForwardState("<Drive Forward State 2>", isPwm, 0.65);
ConveyerStartState conveyerIn = new ConveyerStartState("<Conveyer In State>",true);
CalibrateShooterState calShooter = new CalibrateShooterState("<Cal Shooter State>");
ShootAndResetCatapultState shootBallAndReset = new ShootAndResetCatapultState("<Shoot and Reset Catapult State>");
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(0.5); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(3.0); // 0.5s timer event
GyroAngleEvent gyro1 = new GyroAngleEvent(-135.0,GyroAngleEvent.AnglePolarity.kLessThan); // -135 deg (left turn) event
TimeEvent timer3 = new TimeEvent(3.0); // timer event for second drive forward
TimeEvent timer4 = new TimeEvent(2.0); // timer event for conveyer operation
CalibrateEvent calEvent1 = new CalibrateEvent(true); // shooter calibrated event
TimeEvent timer5 = new TimeEvent(5.0); // timer for catapult being fired
// connect each event with a state to move to
timer1.associateNextState(driveForward);
timer2.associateNextState(turnLeft);
timer3.associateNextState(driveForward2);
gyro1.associateNextState(conveyerIn);
timer4.associateNextState(calShooter);
calEvent1.associateNextState(shootBallAndReset);
timer5.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
driveForward.addEvent(timer2);
turnLeft.addEvent(gyro1);
driveForward2.addEvent(timer3);
conveyerIn.addEvent(timer4);
calShooter.addEvent(calEvent1);
shootBallAndReset.addEvent(timer5);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(driveForward);
myStates.add(turnLeft);
myStates.add(driveForward2);
myStates.add(conveyerIn);
myStates.add(calShooter);
myStates.add(shootBallAndReset);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(gyro1);
myEvents.add(timer3);
myEvents.add(timer4);
myEvents.add(calEvent1);
myEvents.add(timer5);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
// **** STOP-START-REPEAT STATE MACHINE ****
// Note: not currently used
private void createStopStartRepeatSM(int index) {
// create states
boolean isPwm = false;
IdleState startIdle = new IdleState("<Start Idle State>");
DriveForwardState driveForward1 = new DriveForwardState("<Drive Forward State 1>", isPwm, 0.5);
IdleState interimIdle1 = new IdleState("<Interim Idle State 1>");
DriveForwardState driveForward2 = new DriveForwardState("<Drive Forward State 2>", isPwm, 0.5);
IdleState interimIdle2 = new IdleState("<Interim Idle State 2>");
DriveForwardState driveForward3 = new DriveForwardState("<Drive Forward State 3>", isPwm, 0.5);
IdleState interimIdle3 = new IdleState("<Interim Idle State 3>");
DriveForwardState driveForward4 = new DriveForwardState("<Drive Forward State 4>", isPwm, 0.5);
IdleState deadEnd = new IdleState("<Dead End State>");
// create events (between the states)
TimeEvent timer1 = new TimeEvent(1.0); // 0.5s timer event
TimeEvent timer2 = new TimeEvent(1.0); // 0.5s timer event
TimeEvent timer3 = new TimeEvent(1.0); // 0.5s timer event
TimeEvent timer4 = new TimeEvent(1.0); // 0.5s timer event
TimeEvent timer5 = new TimeEvent(1.0); // 0.5s timer event
TimeEvent timer6 = new TimeEvent(1.0); // 0.5s timer event
TimeEvent timer7 = new TimeEvent(1.0); // 0.5s timer event
TimeEvent timer8 = new TimeEvent(1.0); // 0.5s timer event
// connect each event with a state to move to
timer1.associateNextState(driveForward1);
timer2.associateNextState(interimIdle1);
timer3.associateNextState(driveForward2);
timer4.associateNextState(interimIdle2);
timer5.associateNextState(driveForward3);
timer6.associateNextState(interimIdle3);
timer7.associateNextState(driveForward4);
timer8.associateNextState(deadEnd);
// add events to each state
startIdle.addEvent(timer1);
driveForward1.addEvent(timer2);
interimIdle1.addEvent(timer3);
driveForward2.addEvent(timer4);
interimIdle2.addEvent(timer5);
driveForward3.addEvent(timer6);
interimIdle3.addEvent(timer7);
driveForward4.addEvent(timer8);
// store everything
ArrayList<AutoState> myStates = new ArrayList<AutoState>();
ArrayList<Event> myEvents = new ArrayList<Event>();
myStates.add(startIdle);
myStates.add(driveForward1);
myStates.add(driveForward2);
myStates.add(driveForward3);
myStates.add(driveForward4);
myStates.add(interimIdle1);
myStates.add(interimIdle2);
myStates.add(interimIdle3);
myStates.add(deadEnd);
myEvents.add(timer1);
myEvents.add(timer2);
myEvents.add(timer3);
myEvents.add(timer4);
myEvents.add(timer5);
myEvents.add(timer6);
myEvents.add(timer7);
myEvents.add(timer8);
// insert into the network arrays
autoStates.add(index, myStates);
autoEvents.add(index, myEvents);
}
}