Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Team M RelicTeleOp1 Class
- 2016-2017
- */
- package org.firstinspires.ftc.teamcode;
- import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
- import com.qualcomm.robotcore.hardware.DcMotor;
- import com.qualcomm.robotcore.util.Range;
- import com.qualcomm.robotcore.util.RobotLog;
- import org.firstinspires.ftc.robotcore.external.navigation.RelicRecoveryVuMark;
- import org.firstinspires.ftc.robotcore.internal.files.DataLogger;
- import org.firstinspires.ftc.teamcode.TeamMClasses.TeamMRelic4;
- import java.io.IOException;
- @Autonomous(name="Relic Auto", group="Autonomous") // @Autonomous(...) is the other common choice
- // @Disabled
- public class Autonomous2 extends TeamMRelic4
- {
- DataLogger dl;
- // speeds //////////////////////////////////////////////////////////////////////////////////////
- private final double STONE_DRIVE_SPEED = 0.5;
- private final double FAST_DRIVE_SPEED = 0.9;
- // delays //////////////////////////////////////////////////////////////////////////////////////
- private final double STOP_DELAY = 0.25; // delay before stopping and resetting encoders (sec.)
- private final double HEADING_TURN_OFF_DIST = iTC(3); // distance before end of turn when turning off heading (counts)
- private final int DRIVE_POS_TOLERANCE = iTC(0.1); // distance when we're considered "there" (counts)
- private final double HEADING_TOLERANCE = 1; // (degrees)
- private final double HEADING_TIME = 0.25; // must be at heading this long (sec.)
- // states //////////////////////////////////////////////////////////////////////////////////////
- private final int AUTO_INIT = 0;
- private final int JEWEL_SCORE = 100;
- // red side in which jewels are on different wall as cryptobox
- private final int RED_JUDGES_DRIVE_TO_CRYPTOBOX = 200;
- // red side in which jewels are on same wall as cryptobox
- private final int RED_AUDIENCE_DRIVE_TO_CRYPTOBOX = 300;
- // blue side in which jewels are on different wall as cryptobox
- private final int BLUE_JUDGES_DRIVE_TO_CRYPTOBOX = 400;
- // blue side in which jewels are on same wall as cryptobox
- private final int BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX = 500;
- private final int PLACE_GLYPH = 600;
- private final int GET_PILE_GLYPHS = 650;
- private final int RETURN_FROM_PILE = 675;
- private final int PARK = 700;
- private final int AUTO_STOP = 1000;
- // other ///////////////////////////////////////////////////////////////////////////////////////
- private int leftEncoderEndCounts = 0; // used to do drives w/ one motor
- private int rightEncoderEndCounts = 0;
- private long startTime = 0;
- private long currentTime = 0;
- /*
- * Code to run ONCE when the driver hits INIT
- */
- @Override
- public void init() {
- autonomous = true;
- super.init();
- // initialize servo positions //////////////////////////////////////////////////////////////
- leftIntakePower = LEFT_INTAKE_STOP;
- leftIntakeDirection = LEFT_INTAKE_IN_DIR;
- rightIntakePower = RIGHT_INTAKE_STOP;
- rightIntakeDirection = RIGHT_INTAKE_IN_DIR;
- leftElevatorGearsPower = LEFT_ELEVATOR_GEARS_STOP;
- leftElevatorGearsDirection = LEFT_ELEVATOR_GEARS_UP_DIR;
- rightElevatorGearsPower = RIGHT_ELEVATOR_GEARS_STOP;
- rightElevatorGearsDirection = RIGHT_ELEVATOR_GEARS_UP_DIR;
- leftGlyphTransferPower = LEFT_GLYPH_TRANSFER_STOP;
- leftGlyphTransferDirection = LEFT_GLYPH_TRANSFER_IN_DIR;
- rightGlyphTransferPower = RIGHT_GLYPH_TRANSFER_STOP;
- rightGlyphTransferDirection = RIGHT_GLYPH_TRANSFER_IN_DIR;
- leftElevatorPosition = LEFT_ELEVATOR_CLOSE;
- rightElevatorPosition = RIGHT_ELEVATOR_CLOSE;
- jewelShoulderPosition = JEWEL_SHOULDER_HOME;
- jewelElbowPosition = JEWEL_ELBOW_HOME;
- whiskerPosition = WHISKER_INIT;
- try {
- dl = new DataLogger("telemetryFile");
- dl.addHeaderLine("loop time", "entrance bb", "back bb", "pause bb", "spatula bb",
- "left gears", "right gears", "heading", "angular v", "left enc", "right enc", "typewriter enc",
- "auto state", "glyph align", "glyph place", /*"left runmode", "right runmode", */ "type runmode", "stone heading gain");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /*
- * Code to run REPEATEDLY after the driver hits INIT, but before they hit PLAY
- */
- @Override
- public void init_loop() {
- super.init_loop();
- }
- @Override
- public void start() {
- super.start();
- relicTrackables.activate();
- runVuforia = true;
- }
- /*
- * Code to run REPEATEDLY after the driver hits PLAY but before they hit STOP
- */
- @Override
- public void loop() {
- super.loop();
- currentTime = System.nanoTime();
- // emergency home
- // automatic ingestion + elevation of glyphs ///////////////////////////////////////////////
- if(autoIngestionElevation) {
- autoIngest();
- autoElevator();
- autoSpatula();
- } else {
- intakeEject();
- elevatorGearsStop();
- glyphTransferStop();
- }
- // variables that read sensors/servos //////////////////////////////////////////////////////
- // other variables
- double DRIVE_OFF_STONE_HEADING_GAIN;
- if(blueSide) {
- DRIVE_OFF_STONE_HEADING_GAIN = 0;
- } else {
- DRIVE_OFF_STONE_HEADING_GAIN = 0;
- }
- // state machine
- switch(loopState) {
- case AUTO_INIT:
- startTime = System.nanoTime();
- spatula.setPower(SPATULA_MAX_SPEED);
- spatula.setTargetPosition(SPATULA_HOME_POSITION);
- autoTimeL = System.nanoTime();
- stopAndResetEncoders();
- if((leftDrive.getMode() == DcMotor.RunMode.STOP_AND_RESET_ENCODER) &&
- (rightDrive.getMode() == DcMotor.RunMode.STOP_AND_RESET_ENCODER)) {
- loopState = JEWEL_SCORE; // was jewel_score
- }
- break;
- ////////////////////////////////////////////////////////////////////////////////////////
- // jewel score /////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- case JEWEL_SCORE: // read vuforia
- autoTimeN = System.nanoTime();
- runToPosition();
- if(autoTimeN - autoTimeL > (1.5 * 1e9)) {
- autoTimeL = autoTimeN;
- if((leftDrive.getMode() == DcMotor.RunMode.RUN_TO_POSITION) &&
- (rightDrive.getMode() == DcMotor.RunMode.RUN_TO_POSITION)) {
- loopState++;
- }
- }
- break;
- case JEWEL_SCORE + 1: // move jewel arm out
- jewelShoulderPosition = JEWEL_SHOULDER_OUT;
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (0.4 * 1e9)) { // .4 seconds
- autoTimeL = autoTimeN;
- loopState++;
- }
- break;
- case JEWEL_SCORE + 2: // lower jewel arm
- jewelElbowPosition = JEWEL_ELBOW_DOWN;
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (0.2 * 1e9)) { // .2 seconds
- sumRed = 0;
- sumGreen = 0;
- sumBlue = 0;
- colorLoops = 0;
- loopState++;
- }
- break;
- case JEWEL_SCORE + 3: // integrate colors
- sumRed += readColorRed(jewelColorSensor);
- sumGreen += readColorGreen(jewelColorSensor);
- sumBlue += readColorBlue(jewelColorSensor);
- colorLoops++;
- if(colorLoops >= 5) { // read color sensor 5 times, then figure out color
- jewelRed = sumRed / colorLoops;
- jewelGreen = sumGreen / colorLoops;
- jewelBlue = sumBlue / colorLoops;
- currentJewelColor = determineJewelColor(jewelRed, jewelGreen, jewelBlue);
- autoTimeL = System.nanoTime();
- loopState++;
- }
- break;
- case JEWEL_SCORE + 4: // knock correct glyph
- if(blueSide) {
- if(currentJewelColor == JEWEL_RED) {
- jewelShoulderPosition = JEWEL_SHOULDER_LEFT_JEWEL;
- } else {
- jewelShoulderPosition = JEWEL_SHOULDER_RIGHT_JEWEL;
- }
- } else { // red side
- if (currentJewelColor == JEWEL_BLUE) {
- jewelShoulderPosition = JEWEL_SHOULDER_LEFT_JEWEL;
- } else {
- jewelShoulderPosition = JEWEL_SHOULDER_RIGHT_JEWEL;
- }
- }
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (0.3 * 1e9)) { // .3 seconds
- autoTimeL = autoTimeN;
- loopState++;
- }
- break;
- case JEWEL_SCORE + 5: // move jewel arm back to center
- jewelShoulderPosition = JEWEL_SHOULDER_OUT;
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (0.2 * 1e9)) { // .2 seconds
- relicTrackables.deactivate();
- runVuforia = false; // stop vuforia
- // determine column to place if didn't see vuMark
- if(vuMarkString.equals("")) {
- columnToPlace = MID_COL;
- }
- autoTimeL = autoTimeN;
- loopState++;
- }
- break;
- case JEWEL_SCORE + 6: // retract jewel forearm and starting driving off of stone
- // set targets (only done once)
- if(!blueSide && audienceSide) { // red audience
- leftDrive.setTargetPosition(iTC(29));
- rightDrive.setTargetPosition(iTC(42.5));
- } else if(audienceSide) { // blue audience
- leftDrive.setTargetPosition(iTC(42.5));
- rightDrive.setTargetPosition(iTC(29));
- } else if(!blueSide) { // red judges
- leftDrive.setTargetPosition(iTC(30));
- rightDrive.setTargetPosition(iTC(43.5)); // same turn amount
- } else { // blue judges
- leftDrive.setTargetPosition(iTC(44.5));
- rightDrive.setTargetPosition(iTC(31));
- }
- headingFollow(STONE_DRIVE_SPEED, 0, DRIVE_OFF_STONE_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- jewelElbowPosition = JEWEL_ELBOW_HOME;
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (0.5 * 1e9)) { // .2 seconds
- autoTimeL = autoTimeN;
- loopState++;
- }
- break;
- case JEWEL_SCORE + 7: // retract all of jewel arm and continue driving off of stone
- jewelShoulderPosition = JEWEL_SHOULDER_HOME;
- headingFollow(STONE_DRIVE_SPEED, 0, DRIVE_OFF_STONE_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (0.3 * 1e9)) { // .2 seconds
- autoTimeL = autoTimeN;
- loopState++;
- }
- break;
- case JEWEL_SCORE + 8: // finish drive off of stone
- headingFollow(STONE_DRIVE_SPEED, 0, DRIVE_OFF_STONE_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(has_drive_encoder_average_reached(iTC(17))) {
- loopState++;
- }
- break;
- case JEWEL_SCORE + 9: // NOTE: drive run mode is still run using encoders
- if(blueSide && audienceSide) { // blue audience
- loopState = BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX;
- } else if(blueSide) { // blue judges
- loopState = BLUE_JUDGES_DRIVE_TO_CRYPTOBOX;
- } else if(audienceSide) { // red audience
- loopState = RED_AUDIENCE_DRIVE_TO_CRYPTOBOX;
- } else { // red judges
- loopState = RED_JUDGES_DRIVE_TO_CRYPTOBOX;
- }
- break;
- ////////////////////////////////////////////////////////////////////////////////////////
- // red judges //////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- case RED_JUDGES_DRIVE_TO_CRYPTOBOX: // inherits distance targets from jewel_score
- headingFollow(FAST_DRIVE_SPEED, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(has_drive_encoder_average_reached(iTC(30) - HEADING_TURN_OFF_DIST)) {
- loopState++;
- }
- break;
- case RED_JUDGES_DRIVE_TO_CRYPTOBOX + 1: // turn with no heading gain
- headingFollow(FAST_DRIVE_SPEED, 0, 0, 0);
- if((Math.abs(leftEncoderCount - leftDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE) &&
- (Math.abs(rightEncoderCount - rightDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE)) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- // numbers for long, fast drive toward cryptobox
- leftEncoderEndCounts = leftEncoderCount - iTC(44);
- rightEncoderEndCounts = rightEncoderCount - iTC(35);
- loopState++;
- }
- break;
- case RED_JUDGES_DRIVE_TO_CRYPTOBOX + 2: // long, fast drive toward cryptobox
- leftDrive.setTargetPosition(leftEncoderEndCounts);
- rightDrive.setTargetPosition(rightEncoderEndCounts);
- headingFollow(-FAST_DRIVE_SPEED, -55, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- // left encoder count is negative, left encoder end counts is negative, constant is positive
- if(leftEncoderCount < (leftEncoderEndCounts + HEADING_TURN_OFF_DIST)) {
- loopState++;
- }
- break;
- case RED_JUDGES_DRIVE_TO_CRYPTOBOX + 3: // turn toward cryptobox
- headingFollow(-FAST_DRIVE_SPEED, 0, 0, 0);
- if((Math.abs(leftEncoderCount - leftDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE) &&
- (Math.abs(rightEncoderCount - rightDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE)) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- loopState++;
- }
- break;
- case RED_JUDGES_DRIVE_TO_CRYPTOBOX + 4:
- stopAndResetEncoders();
- if(leftEncoderCount == 0) {
- loopState++;
- }
- break;
- case RED_JUDGES_DRIVE_TO_CRYPTOBOX + 5:
- runUsingEncoders();
- if(leftDrive.getMode() == DcMotor.RunMode.RUN_USING_ENCODER) {
- loopState++;
- }
- break;
- case RED_JUDGES_DRIVE_TO_CRYPTOBOX + 6:
- autoIngestionElevation = true;
- glyphAtSpatula = true;
- autoElevatorState = AUTO_ELEVATOR_SPATULA_STATE; // push glyph into spatula
- autonomousCanPlace = false; // don't place glyph yet
- headingFollow(-0.4, -90, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- loopState++;
- break;
- case RED_JUDGES_DRIVE_TO_CRYPTOBOX + 7:
- if((autoElevatorState == STOP_STATE_MACHINE) && (alignGlyphState == STOP_STATE_MACHINE)) { // start aligning if ready
- alignGlyphState = START_STATE_MACHINE;
- }
- if(has_drive_encoder_average_reached(iTC(2.5))) { // stop after driving enough
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- if(alignGlyphState != STOP_STATE_MACHINE) { // wait for align to start
- loopState = PLACE_GLYPH;
- }
- } else {
- headingFollow(-0.4, -90, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- }
- break;
- ////////////////////////////////////////////////////////////////////////////////////////
- // red audience ////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- case RED_AUDIENCE_DRIVE_TO_CRYPTOBOX: // inherits distance targets from jewel_score
- headingFollow(FAST_DRIVE_SPEED, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(has_drive_encoder_average_reached(iTC(29) - HEADING_TURN_OFF_DIST)) { // 2 inches before turn
- loopState++;
- }
- break;
- case RED_AUDIENCE_DRIVE_TO_CRYPTOBOX + 1: // turn with no heading gain
- headingFollow(FAST_DRIVE_SPEED, 0, 0, 0);
- if((Math.abs(leftEncoderCount - leftDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE) &&
- (Math.abs(rightEncoderCount - rightDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE)) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- // numbers for long, fast drive toward cryptobox
- leftEncoderEndCounts = leftEncoderCount - iTC(40.5);
- rightEncoderEndCounts = rightEncoderCount - iTC(54);
- loopState++;
- }
- break;
- case RED_AUDIENCE_DRIVE_TO_CRYPTOBOX + 2: // long, fast drive toward cryptobox
- leftDrive.setTargetPosition(leftEncoderEndCounts);
- rightDrive.setTargetPosition(rightEncoderEndCounts);
- headingFollow(-FAST_DRIVE_SPEED, -55, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- // left encoder count is negative, left encoder end counts is negative, constant is positive
- if(leftEncoderCount < (leftEncoderEndCounts + HEADING_TURN_OFF_DIST)) {
- loopState++;
- }
- break;
- case RED_AUDIENCE_DRIVE_TO_CRYPTOBOX + 3: // turn toward cryptobox
- headingFollow(-FAST_DRIVE_SPEED, 0, 0, 0);
- if((Math.abs(leftEncoderCount - leftDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE) &&
- (Math.abs(rightEncoderCount - rightDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE)) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- loopState++;
- }
- break;
- case RED_AUDIENCE_DRIVE_TO_CRYPTOBOX + 4:
- stopAndResetEncoders();
- if(leftEncoderCount == 0) {
- loopState++;
- }
- break;
- case RED_AUDIENCE_DRIVE_TO_CRYPTOBOX + 5:
- runUsingEncoders();
- if(leftDrive.getMode() == DcMotor.RunMode.RUN_USING_ENCODER) {
- loopState++;
- }
- break;
- case RED_AUDIENCE_DRIVE_TO_CRYPTOBOX + 6:
- autoIngestionElevation = true;
- glyphAtSpatula = true;
- autoElevatorState = AUTO_ELEVATOR_SPATULA_STATE; // push glyph into spatula
- autonomousCanPlace = false; // don't place glyph yet
- headingFollow(-0.4, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- loopState++;
- break;
- case RED_AUDIENCE_DRIVE_TO_CRYPTOBOX + 7:
- if((autoElevatorState == STOP_STATE_MACHINE) && (alignGlyphState == STOP_STATE_MACHINE)) { // start aligning if ready
- alignGlyphState = START_STATE_MACHINE;
- }
- headingFollow(-0.4, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(has_drive_encoder_average_reached(iTC(14.5))) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- loopState = PLACE_GLYPH;
- }
- break;
- ////////////////////////////////////////////////////////////////////////////////////////
- // blue judges /////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- case BLUE_JUDGES_DRIVE_TO_CRYPTOBOX: // inherits distance targets from jewel_score
- headingFollow(FAST_DRIVE_SPEED, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(has_drive_encoder_average_reached(iTC(31) - HEADING_TURN_OFF_DIST)) {
- loopState++;
- }
- break;
- case BLUE_JUDGES_DRIVE_TO_CRYPTOBOX + 1: // turn with no heading gain
- headingFollow(FAST_DRIVE_SPEED, 0, 0, 0);
- if((Math.abs(leftEncoderCount - leftDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE) &&
- (Math.abs(rightEncoderCount - rightDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE)) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- // numbers for long, fast drive toward cryptobox
- leftEncoderEndCounts = leftEncoderCount - iTC(34);
- rightEncoderEndCounts = rightEncoderCount - iTC(43);
- loopState++;
- }
- break;
- case BLUE_JUDGES_DRIVE_TO_CRYPTOBOX + 2: // long, fast drive toward cryptobox
- leftDrive.setTargetPosition(leftEncoderEndCounts);
- rightDrive.setTargetPosition(rightEncoderEndCounts);
- headingFollow(-FAST_DRIVE_SPEED, -55, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- // left encoder count is negative, left encoder end counts is negative, constant is positive
- if(leftEncoderCount < (leftEncoderEndCounts + HEADING_TURN_OFF_DIST)) {
- loopState++;
- }
- break;
- case BLUE_JUDGES_DRIVE_TO_CRYPTOBOX + 3: // turn toward cryptobox
- headingFollow(-FAST_DRIVE_SPEED, 0, 0, 0);
- if((Math.abs(leftEncoderCount - leftDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE) &&
- (Math.abs(rightEncoderCount - rightDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE)) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- loopState++;
- }
- break;
- case BLUE_JUDGES_DRIVE_TO_CRYPTOBOX + 4:
- stopAndResetEncoders();
- if(leftEncoderCount == 0) {
- loopState++;
- }
- break;
- case BLUE_JUDGES_DRIVE_TO_CRYPTOBOX + 5:
- runUsingEncoders();
- if(leftDrive.getMode() == DcMotor.RunMode.RUN_USING_ENCODER) {
- loopState++;
- }
- break;
- case BLUE_JUDGES_DRIVE_TO_CRYPTOBOX + 6:
- autoIngestionElevation = true;
- glyphAtSpatula = true;
- autoElevatorState = AUTO_ELEVATOR_SPATULA_STATE; // push glyph into spatula
- autonomousCanPlace = false; // don't place glyph yet
- headingFollow(-0.4, 90, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- loopState++;
- break;
- case BLUE_JUDGES_DRIVE_TO_CRYPTOBOX + 7:
- if((autoElevatorState == STOP_STATE_MACHINE) && (alignGlyphState == STOP_STATE_MACHINE)) { // start aligning if ready
- alignGlyphState = START_STATE_MACHINE;
- }
- if(has_drive_encoder_average_reached(iTC(5.5))) { // stop after driving enough
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- if(alignGlyphState != STOP_STATE_MACHINE) { // wait for align to start
- loopState = PLACE_GLYPH;
- }
- } else {
- headingFollow(-0.4, 90, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- }
- break;
- ////////////////////////////////////////////////////////////////////////////////////////
- // blue audience ///////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- case BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX: // inherits distance targets from jewel_score
- headingFollow(FAST_DRIVE_SPEED, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(has_drive_encoder_average_reached(iTC(29) - HEADING_TURN_OFF_DIST)) { // 2 inches before turn
- loopState++;
- }
- break;
- case BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX + 1: // turn with no heading gain
- headingFollow(FAST_DRIVE_SPEED, 0, 0, 0);
- if((Math.abs(leftEncoderCount - leftDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE) &&
- (Math.abs(rightEncoderCount - rightDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE)) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- // numbers for long, fast drive toward cryptobox
- leftEncoderEndCounts = leftEncoderCount - iTC(55);
- rightEncoderEndCounts = rightEncoderCount - iTC(41.5);
- loopState++;
- }
- break;
- case BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX + 2: // long, fast drive toward cryptobox
- leftDrive.setTargetPosition(leftEncoderEndCounts);
- rightDrive.setTargetPosition(rightEncoderEndCounts);
- headingFollow(-FAST_DRIVE_SPEED, -55, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- // left encoder count is negative, left encoder end counts is negative, constant is positive
- if(leftEncoderCount < (leftEncoderEndCounts + HEADING_TURN_OFF_DIST)) {
- loopState++;
- }
- break;
- case BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX + 3: // turn toward cryptobox
- headingFollow(-FAST_DRIVE_SPEED, 0, 0, 0);
- if((Math.abs(leftEncoderCount - leftDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE) &&
- (Math.abs(rightEncoderCount - rightDrive.getTargetPosition()) < DRIVE_POS_TOLERANCE)) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- loopState++;
- }
- break;
- case BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX + 4:
- stopAndResetEncoders();
- if(leftEncoderCount == 0) {
- loopState++;
- }
- break;
- case BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX + 5:
- runUsingEncoders();
- if(leftDrive.getMode() == DcMotor.RunMode.RUN_USING_ENCODER) {
- loopState++;
- }
- break;
- case BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX + 6:
- autoIngestionElevation = true;
- glyphAtSpatula = true;
- autoElevatorState = AUTO_ELEVATOR_SPATULA_STATE; // push glyph into spatula
- autonomousCanPlace = false; // don't place glyph yet
- headingFollow(-0.4, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- loopState++;
- break;
- case BLUE_AUDIENCE_DRIVE_TO_CRYPTOBOX + 7:
- if((autoElevatorState == STOP_STATE_MACHINE) && (alignGlyphState == STOP_STATE_MACHINE)) { // start aligning if ready
- alignGlyphState = START_STATE_MACHINE;
- }
- headingFollow(-0.4, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(has_drive_encoder_average_reached(iTC(12.5))) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- loopState = PLACE_GLYPH;
- }
- break;
- ////////////////////////////////////////////////////////////////////////////////////////
- // place glyph ////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- case PLACE_GLYPH:
- autonomousCanPlace = true; // start dropping
- loopState++;
- break;
- case PLACE_GLYPH + 1:
- stopAndResetEncoders();
- if(leftEncoderCount == 0) { // done lifting glyph
- loopState++;
- }
- break;
- case PLACE_GLYPH + 2:
- runUsingEncoders();
- if(leftDrive.getMode() == DcMotor.RunMode.RUN_USING_ENCODER) {
- loopState++;
- }
- break;
- case PLACE_GLYPH + 3: // square up, align glyph, and place glyph
- /*double alignHeading1 = cryptoboxAlignHeading();
- headingFollow(0, alignHeading1, SQUARE_UP_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);*/
- if(placeGlyphState >= PLACE_GLYPH_VERTICAL_STATE) { // done
- autoTimeL = System.nanoTime();
- loopState = PARK;
- }
- break;
- ////////////////////////////////////////////////////////////////////////////////////////
- // get glyphs from pile ////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- case GET_PILE_GLYPHS:
- columnToPlace = MID_COL;
- autoTimeN = System.nanoTime();
- headingFollow(0.1, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(autoTimeN - autoTimeL > (1 * 1e9)) {
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 1: // go fast initially
- led.setPower(LED_RED);
- headingFollow(FAST_DRIVE_SPEED, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(has_drive_encoder_average_reached(iTC(13))) {
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 2: // finish up slow
- led.setPower(LED_BLUE);
- headingFollow(0.4, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(has_drive_encoder_average_reached(iTC(21))) {
- wiggleState = START_STATE_MACHINE; // start wiggle
- autoIngestionElevation = true; // start ingesting
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 3:
- if(glyphAtBack) {
- wiggleState = STOP_STATE_MACHINE; // stop wiggling
- autoTimeL = System.nanoTime(); // start timer to go straight
- loopState++;
- } else if(has_drive_encoder_average_reached(iTC(33))) {
- wiggleState = STOP_STATE_MACHINE;
- loopState = RETURN_FROM_PILE;
- }
- break;
- case GET_PILE_GLYPHS + 4:
- leftDrive.setPower(FINE_ADJUST_DRIVE_SPEED);
- rightDrive.setPower(FINE_ADJUST_DRIVE_SPEED);
- intakeEject();
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (0.5 * 1e9)) {
- leftDrive.setPower(0.0);
- rightDrive.setPower(0.0);
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 5:
- headingFollow(-0.9, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- intakeEject();
- if(driveEncoderAvg < iTC(10)) { // about 5 inches away
- autoTimeL = System.nanoTime();
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 6: // ram
- headingFollow(-0.4, 0, SQUARE_UP_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- intakeEject();
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (1 * 1e9)) {
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 7:
- stopAndResetEncoders();
- if((autoElevatorState == STOP_STATE_MACHINE) && (alignGlyphState == STOP_STATE_MACHINE)) { // start aligning
- autoIngestionElevation = false;
- alignGlyphState = START_STATE_MACHINE;
- autonomousCanPlace = true; // place right away
- }
- if(leftEncoderCount == 0) {
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 8:
- runUsingEncoders();
- if((autoElevatorState == STOP_STATE_MACHINE) && (alignGlyphState == STOP_STATE_MACHINE)) { // start aligning
- autoIngestionElevation = false;
- alignGlyphState = START_STATE_MACHINE;
- autonomousCanPlace = true; // place right away
- }
- if(leftDrive.getMode() == DcMotor.RunMode.RUN_USING_ENCODER) {
- autoTimeL = System.nanoTime();
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 9:
- headingFollow(0.4, 0, SQUARE_UP_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (0.3 * 1e9)) {
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 10:
- double alignHeading = cryptoboxAlignHeading();
- headingFollow(0, alignHeading, SQUARE_UP_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if((alignGlyphState == STOP_STATE_MACHINE) && (placeGlyphState == STOP_STATE_MACHINE) && !glyphAtSpatula) { // done
- autoTimeL = System.nanoTime();
- loopState++;
- }
- break;
- case GET_PILE_GLYPHS + 11:
- headingFollow(0.4, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- autoTimeN = System.nanoTime();
- if(autoTimeN - autoTimeL > (1 * 1e9)) {
- loopState = AUTO_STOP;
- }
- break;
- case RETURN_FROM_PILE:
- autoIngestionElevation = true;
- intakeEject();
- headingFollow(-0.9, 0, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(driveEncoderAvg < iTC(10)) {
- loopState = AUTO_STOP;
- }
- break;
- ////////////////////////////////////////////////////////////////////////////////////////
- // park ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- case PARK:
- double alignHeading1 = cryptoboxAlignHeading();
- autoTimeN = System.nanoTime();
- headingFollow(0.1, alignHeading1, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(autoTimeN - autoTimeL > (1 * 1e9)) {
- autoTimeL = autoTimeN;
- loopState++;
- }
- break;
- case PARK + 1:
- double alignHeading2 = cryptoboxAlignHeading();
- autoTimeN = System.nanoTime();
- headingFollow(-0.3, alignHeading2, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(autoTimeN - autoTimeL > (1 * 1e9)) {
- autoTimeL = autoTimeN;
- loopState++;
- }
- break;
- case PARK + 2:
- double alignHeading3 = cryptoboxAlignHeading();
- autoTimeN = System.nanoTime();
- headingFollow(0.3, alignHeading3, NORMAL_HEADING_GAIN, NORMAL_RAW_GYRO_GAIN);
- if(autoTimeN - autoTimeL > (1 * 1e9)) {
- loopState = AUTO_STOP;
- }
- break;
- ////////////////////////////////////////////////////////////////////////////////////////
- // abort ///////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////
- case AUTO_STOP:
- leftDrive.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
- rightDrive.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
- homeMotorsState = START_STATE_MACHINE; // home
- loopState++;
- break;
- case AUTO_STOP + 1:
- autoIngestionElevation = false;
- intakeStop();
- break;
- }
- // vuforia /////////////////////////////////////////////////////////////////////////////////
- if(runVuforia) {
- RelicRecoveryVuMark vuMark = RelicRecoveryVuMark.from(relicTemplate);
- if (vuMark != RelicRecoveryVuMark.UNKNOWN) { // we see something
- // store to appropriate column
- if(vuMark == RelicRecoveryVuMark.LEFT) {
- columnToPlace = LEFT_COL;
- }
- if(vuMark == RelicRecoveryVuMark.CENTER) {
- columnToPlace = MID_COL;
- }
- if(vuMark == RelicRecoveryVuMark.RIGHT) {
- columnToPlace = RIGHT_COL;
- }
- // deactivate vuforia
- runVuforia = false;
- relicTrackables.deactivate();
- vuMarkString = vuMark.toString();
- }
- }
- if(alignGlyphState != STOP_STATE_MACHINE) {
- alignGlyph(columnToPlace);
- }
- if(placeGlyphState != STOP_STATE_MACHINE) {
- placeGlyph();
- }
- if(homeMotorsState != STOP_STATE_MACHINE) {
- homeMotors();
- }
- if(wiggleState != STOP_STATE_MACHINE) {
- wiggle(WIGGLE_SPEED, WIGGLE_WIDTH);
- }
- // servos //////////////////////////////////////////////////////////////////////////////////
- // set cr servos
- setCRServo(leftIntake, leftIntakePower, leftIntakeDirection);
- setCRServo(rightIntake, rightIntakePower, rightIntakeDirection);
- setCRServo(leftElevatorGears, leftElevatorGearsPower, leftElevatorGearsDirection);
- setCRServo(rightElevatorGears, rightElevatorGearsPower, rightElevatorGearsDirection);
- setCRServo(leftGlyphTransfer, leftGlyphTransferPower, leftGlyphTransferDirection);
- setCRServo(rightGlyphTransfer, rightGlyphTransferPower, rightGlyphTransferDirection);
- // set regular servos
- jewelShoulderPosition = Range.clip(jewelShoulderPosition, SERVO_MIN_RANGE, SERVO_MAX_RANGE);
- jewelElbowPosition = Range.clip(jewelElbowPosition, SERVO_MIN_RANGE, SERVO_MAX_RANGE);
- leftElevatorPosition = Range.clip(leftElevatorPosition, SERVO_MIN_RANGE, SERVO_MAX_RANGE);
- rightElevatorPosition = Range.clip(rightElevatorPosition, SERVO_MIN_RANGE, SERVO_MAX_RANGE);
- // whiskerPosition = Range.clip(whiskerPosition, SERVO_MIN_RANGE, SERVO_MAX_RANGE);
- jewelShoulder.setPosition(jewelShoulderPosition);
- jewelElbow.setPosition(jewelElbowPosition);
- leftElevator.setPosition(leftElevatorPosition);
- rightElevator.setPosition(rightElevatorPosition);
- // whisker.setPosition(whiskerPosition);
- // telemetry ///////////////////////////////////////////////////////////////////////////////
- telemetry.addData("@", "state: " + String.format("%d", loopState));
- telemetry.addData("5", "vuforia: " + String.format("%s", vuMarkString));
- // log values //////////////////////////////////////////////////////////////////////////////
- try {
- dl.addDataLine(loopTimeMS, !glyphAtEntrance, !glyphAtBack, !glyphAtPause, !glyphAtSpatula,
- leftElevatorGearsPower, rightElevatorGearsPower, heading, angularV, leftEncoderCount, rightEncoderCount, typewriterEncoderCount,
- loopState, alignGlyphState, placeGlyphState, /*leftDriveRunMode, rightDriveRunMode,*/ typewriterRunMode, DRIVE_OFF_STONE_HEADING_GAIN);
- } catch (IOException e) {
- e.printStackTrace();
- }
- RobotLog.vv("M Log", "loop time: %d, BBs: %b, %b, %b, %b, " +
- "elevator gears powers: %.2f, %.2f, heading: %.2f, angular v: %.2f, " +
- "typewriter enc: %d, state: %d, glyph states: %d, %d, typewriter runmode: %s", loopTimeMS,
- !glyphAtEntrance, !glyphAtBack, !glyphAtPause, !glyphAtSpatula,
- leftElevatorGearsPower, rightElevatorGearsPower, heading, angularV, typewriterEncoderCount,
- loopState, alignGlyphState, placeGlyphState, typewriterRunMode);
- }
- /*
- * Code to run ONCE after the driver hits STOP
- */
- @Override
- public void stop() {
- super.stop();
- dl.close();
- }
- // other methods
- }
Advertisement
Add Comment
Please, Sign In to add comment