package Systems; import edu.wpi.first.wpilibj.CANTalon; import edu.wpi.first.wpilibj.Joystick; import edu.wpi.first.wpilibj.Utility; public class CatapultAssembly { private static boolean initialized = false; // joystick device ids private static final int LEFT_JOYSTICK_ID = 0; private static final int RIGHT_JOYSTICK_ID = 1; // control objects private static Joystick leftJoy, rightJoy; // catapult reset motor private static final int CATAPULT_MOTOR_ID = 9; //private static final int CATAPULT_MOTOR_ID = 11; private static final double NUM_TICKS_PER_REV = 4096; private static final double VERSAPLANETARY_RATIO = 100; private static final double CHOO_CHOO_GEAR_RATIO = 84.0/18.0; private static final double FIRE_ROTATION_BACKOFF_REV = 0.25; private static final double CATAPULT_FIRE_INCREMENT = FIRE_ROTATION_BACKOFF_REV*NUM_TICKS_PER_REV*VERSAPLANETARY_RATIO*CHOO_CHOO_GEAR_RATIO; private static final double CATAPULT_READY_POSITION = (NUM_TICKS_PER_REV*VERSAPLANETARY_RATIO*CHOO_CHOO_GEAR_RATIO) - CATAPULT_FIRE_INCREMENT; private static final int TRIGGER_CYCLE_WAIT_US = 1000000; private static CANTalon catapultMotor; private static boolean pressed; private static boolean catapultFired; private static boolean teleopMode; private static double initTriggerTime; // static initializer public static void initialize() { if (!initialized) { leftJoy = new Joystick(LEFT_JOYSTICK_ID); rightJoy = new Joystick(RIGHT_JOYSTICK_ID); initialized = true; catapultFired = true; pressed = false; teleopMode = false; System.out.println("Creating catapult motor object..."); // initialize master catapult motor catapultMotor = new CANTalon(CATAPULT_MOTOR_ID); if (catapultMotor != null) { System.out.println("Initializing catapult motor (position mode)..."); // VERY IMPORTANT - resets talon faults to render them usable again!! //catapultMotor.clearStickyFaults(); // set up motor for position control mode catapultMotor.enableControl(); // enables PID control catapultMotor.changeControlMode(CANTalon.TalonControlMode.Position); catapultMotor.setFeedbackDevice(CANTalon.FeedbackDevice.QuadEncoder); catapultMotor.setPID(0.1, 0, 0.0); //catapultMotor.set(catapultMotor.getPosition()); // set motor to current position catapultMotor.setPosition(0); // initializes encoder to zero // set brake mode //catapultMotor.enableBrakeMode(true); } else System.out.println("ERROR: Catapult 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; pressed = false; initTriggerTime = Utility.getFPGATime(); } public static void teleopPeriodic() { double currentTime = Utility.getFPGATime(); if ((currentTime - initTriggerTime) < TRIGGER_CYCLE_WAIT_US) return; // check for catapult triggers if (leftJoy.getTrigger() && rightJoy.getTrigger() && !pressed) { pressed = true; System.out.println("trigger pressed!"); // reset trigger init time initTriggerTime = Utility.getFPGATime(); // check for catapult trigger if (pressed) { if (!catapultFired) shoot(); else reset(); } pressed = false; } } public static void disabledInit() { if (!initialized) initialize(); // if we are exiting teleop mode... if (teleopMode) { // fire catapult if ready to fire if (!catapultFired) shoot(); } } public static void shoot() { // fire catapult catapultMotor.setPosition(0); catapultMotor.set(CATAPULT_FIRE_INCREMENT); System.out.println("Catapult Fired! new pos = " + catapultMotor.getPosition()); // set fired flag catapultFired = true; pressed = false; } public static void reset() { // reset catapult motor catapultMotor.setPosition(0); catapultMotor.set(CATAPULT_READY_POSITION); System.out.println("Catapult Reset! new pos = " + catapultMotor.getPosition()); // reset fired flag catapultFired = false; pressed = false; } }