package Systems;
import edu.wpi.first.wpilibj.CANTalon;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.Utility;
public class FrontArmAssembly {
private static boolean initialized = false;
// minimum increment (for joystick dead zone)
private static final double ARM_DEADZONE = 0.1;
private static final double ROLLER_DEADZONE = 0.1;
// limits
// forward arm gear is 208:1 - for quarter turn of arm, about 50 motor revs
private static final double SOFT_ENCODER_LIMIT_1 = (4096.0*40.0); // about a quarter turn
private static final double SOFT_ENCODER_LIMIT_2 = 0.0;
private static final double ARM_SPEED_MULTIPLIER = 200.0;
//private static final double ARM_SPEED_MULTIPLIER = 1024.0;
private static final double ARM_ROLLER_MULTIPLIER = 0.5;
private static final double ARM_MULTIPLIER = -0.5;
// controller gamepad ID - assumes no other controllers connected
private static final int GAMEPAD_ID = 2;
// control objects
private static Joystick gamepad;
// motor ids
//private static final int FRONT_ARM_MOTOR_ID = 11;
private static final int FRONT_ARM_MOTOR_ID = 9;
private static final int FRONT_ARM_ROLLER_ID = 12;
private static CANTalon frontArmMotor, frontArmRollerMotor;
private static long initTime;
private static boolean teleopMode;
// static initializer
public static void initialize()
{
if (!initialized) {
gamepad = new Joystick(GAMEPAD_ID);
initialized = true;
teleopMode = false;
// create and initialize arm motor
frontArmMotor = new CANTalon(FRONT_ARM_MOTOR_ID);
if (frontArmMotor != null) {
System.out.println("Initializing front arm motor (position control)...");
// VERY IMPORTANT - resets talon faults to render them usable again!!
frontArmMotor.clearStickyFaults();
frontArmMotor.setFeedbackDevice(CANTalon.FeedbackDevice.QuadEncoder);
frontArmMotor.changeControlMode(CANTalon.TalonControlMode.PercentVbus);
// set brake mode
frontArmMotor.enableBrakeMode(true);
// initializes encoder to zero
frontArmMotor.setPosition(0);
}
else
System.out.println("ERROR: Front Arm motor not initialized!");
// create and initialize roller motor
frontArmRollerMotor = new CANTalon(FRONT_ARM_ROLLER_ID);
if (frontArmRollerMotor != null) {
System.out.println("Initializing front arm roller motor (PercentVbus control)...");
frontArmRollerMotor.clearStickyFaults();
// set up roller motor for percent Vbus control mode
frontArmRollerMotor.changeControlMode(CANTalon.TalonControlMode.PercentVbus);
frontArmRollerMotor.enableBrakeMode(false);
// initializes speed of rollers to zero
frontArmRollerMotor.set(0);
}
else
System.out.println("ERROR: Front Arm roller motor not initialized!");
}
}
public static void autoInit()
{
teleopMode = false;
}
public static void autoPeriodic(boolean liftCommand)
{
}
public static void autoStop()
{
// nothing to clean up here
}
public static void teleopInit() {
teleopMode = true;
}
public static void teleopPeriodic()
{
/*
double newArmPos = gamepad.getRawAxis(1);
if(Math.abs(newArmPos) <= ARM_DEADZONE) {
newArmPos = 0.0;
}
double newMotorPos = (newArmPos * ARM_SPEED_MULTIPLIER) + frontArmMotor.getPosition();
//double newMotorPos = (newArmPos * ARM_SPEED_MULTIPLIER);
frontArmMotor.set(newMotorPos);
System.out.println("input = " + newArmPos + " target pos = " + newMotorPos + " enc pos = " + frontArmMotor.getPosition());
*/
// PercentVbus test ONLY!!
double armSpeed = gamepad.getRawAxis(1);
if (Math.abs(armSpeed) < ARM_DEADZONE) {
armSpeed = 0.0f;
}
armSpeed *= ARM_MULTIPLIER;
double pos= frontArmMotor.getPosition();
if (((pos > SOFT_ENCODER_LIMIT_1) && armSpeed < 0.0) || ((pos < SOFT_ENCODER_LIMIT_2) && armSpeed > 0.0))
armSpeed = 0.0;
frontArmMotor.set(armSpeed);
System.out.println("armSpeed = " + armSpeed + " enc pos = " + frontArmMotor.getPosition());
// check for roller motion (right gamepad joystick)
double rollerSpeed = gamepad.getRawAxis(3);
if (Math.abs(rollerSpeed) < ROLLER_DEADZONE) {
rollerSpeed = 0.0f;
}
rollerSpeed *= ARM_ROLLER_MULTIPLIER;
frontArmRollerMotor.set(rollerSpeed);
}
public static void disabledInit()
{
if (!initialized)
initialize();
// if exiting from teleop mode (game is over)...
if (teleopMode)
{
System.out.println("FrontArmAssembly: exiting teleop, moving to coast mode");
// relax front arm motor (coast mode)
frontArmMotor.enableBrakeMode(false);
}
}
}