package com.team254.frc2015;
import com.team254.frc2015.auto.AutoMode;
import com.team254.frc2015.auto.AutoModeExecuter;
import com.team254.frc2015.auto.AutoModeSelector;
import com.team254.frc2015.behavior.BehaviorManager;
import com.team254.frc2015.subsystems.Drive;
import com.team254.frc2015.subsystems.ElevatorCarriage;
import com.team254.frc2015.subsystems.MotorPeacock;
import com.team254.frc2015.web.WebServer;
import com.team254.lib.util.DriveSignal;
import com.team254.lib.util.Looper;
import com.team254.lib.util.MultiLooper;
import com.team254.lib.util.SystemManager;
import edu.wpi.first.wpilibj.IterativeRobot;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.PowerDistributionPanel;
public class Robot extends IterativeRobot {
public enum RobotState {
DISABLED, AUTONOMOUS, TELEOP
}
public static RobotState s_robot_state = RobotState.DISABLED;
public static RobotState getState() {
return s_robot_state;
}
public static void setState(RobotState state) {
s_robot_state = state;
}
MultiLooper looper = new MultiLooper("Controllers", 1 / 200.0, true);
MultiLooper slowLooper = new MultiLooper("SlowControllers", 1 / 100.0);
Looper logUpdater = new Looper("Updater", new Updater(), 1 / 50.0);
AutoModeExecuter autoModeRunner = new AutoModeExecuter();
Drive drive = HardwareAdaptor.kDrive;
ElevatorCarriage top_carriage = HardwareAdaptor.kTopCarriage;
ElevatorCarriage bottom_carriage = HardwareAdaptor.kBottomCarriage;
MotorPeacock motor_peacock = HardwareAdaptor.kMotorPeacock;
PowerDistributionPanel pdp = HardwareAdaptor.kPDP;
BehaviorManager behavior_manager = new BehaviorManager();
OperatorInterface operator_interface = new OperatorInterface();
CheesyDriveHelper cdh = new CheesyDriveHelper(drive);
Joystick leftStick = HardwareAdaptor.kLeftStick;
Joystick rightStick = HardwareAdaptor.kRightStick;
Joystick buttonBoard = HardwareAdaptor.kButtonBoard;
static {
SystemManager.getInstance().add(new RobotData());
}
@Override
public void robotInit() {
System.out.println("Start robotInit()");
HardwareAdaptor.kGyroThread.start();
WebServer.startServer();
looper.addLoopable(top_carriage);
looper.addLoopable(bottom_carriage);
looper.addLoopable(motor_peacock);
slowLooper.addLoopable(drive);
logUpdater.start();
SystemManager.getInstance().add(behavior_manager);
}
@Override
public void autonomousInit() {
setState(RobotState.AUTONOMOUS);
if (!top_carriage.isInitialized()) {
top_carriage.findHome();
}
HardwareAdaptor.kGyroThread.rezero();
HardwareAdaptor.kGyroThread.reset();
HardwareAdaptor.kLeftDriveEncoder.reset();
HardwareAdaptor.kRightDriveEncoder.reset();
AutoMode mode = AutoModeSelector.getInstance().getAutoMode();
autoModeRunner.setAutoMode(mode);
// Prestart auto mode
mode.prestart();
// Start control loops
autoModeRunner.start();
looper.start();
slowLooper.start();
}
@Override
public void autonomousPeriodic() {
}
@Override
public void teleopInit() {
setState(RobotState.TELEOP);
if (!top_carriage.isInitialized()) {
top_carriage.findHome();
}
System.out.println("Start teleopInit()");
looper.start();
}
@Override
public void teleopPeriodic() {
cdh.cheesyDrive(-leftStick.getY(), rightStick.getX(), rightStick.getRawButton(1), true);
behavior_manager.update(operator_interface.getCommands());
}
@Override
public void disabledInit() {
setState(RobotState.DISABLED);
System.out.println("Start disabledInit()");
// Stop auto mode
autoModeRunner.stop();
// Stop routines
//behavior_manager.reset();
// Stop control loops
looper.stop();
slowLooper.stop();
// Stop controllers
drive.setOpenLoop(DriveSignal.NEUTRAL);
top_carriage.setOpenLoop(0.0, true);
bottom_carriage.setOpenLoop(0.0, true);
// Reload constants
drive.reloadConstants();
top_carriage.reloadConstants();
bottom_carriage.reloadConstants();
System.gc();
System.out.println("end disable init!");
}
@Override
public void disabledPeriodic() {
}
}