Untitled
Elephanf
c_cpp
3 years ago
30 kB
54
No Index
/*----------------------------------------------------------------------------*/
/* */
/* Module: main.cpp */
/* Author: Navin Jayanthi, Prabhas Banerjee */
/* Created: Sep 17 2023 */
/* Description: Competition Template */
/* */
/*----------------------------------------------------------------------------*/
// ---- START VEXCODE CONFIGURED DEVICES ----
// Robot Configuration:
// [Name] [Type] [Port(s)]
// Controller1 controller
// Catapult motor 9
// LF motor 10
// RM motor 17
// RB motor 13
// RF motor 12
// LM motor 14
// LB motor 5
// Wing1 digital_out A
// Wing2 digital_out B
// Hangmech digital_out C
// Intake motor 20
// Inertial inertial 18
// ---- END VEXCODE CONFIGURED DEVICES ----
#include "vex.h"
#include <algorithm>
#include <cmath>
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <string>
using namespace std;
using namespace vex;
// A global instance of competition
competition Competition;
// define your global instances of motors and other devices here
/*---------------------------------------------------------------------------*/
/* Pre-Autonomous Functions */
/* */
/* You may want to perform some actions before the csompetition starts. */
/* Do them in the following function. You must return from this function */
/* or the autonomous and usercontrol tasks will not be started. This */
/* function is only called once after the V5 has been powered on and */
/* not every time that the robot is disabled. */
/*---------------------------------------------------------------------------*/
string intToString(int toString) {
char endString[256];
sprintf(endString, "%d", toString);
return endString;
}
string doubleToString(double toString) {
char endString[256];
sprintf(endString, "%f", toString);
return endString;
}
string boolToString(bool toString) { return toString ? "true" : "false"; }
string append(string s, int i) {
string endString = (s + intToString(i));
return endString;
}
string append(string s, double d) {
string endString = (s + doubleToString(d));
return endString;
}
string append(string s, bool b) {
string endString = (s + boolToString(b));
return endString;
}
bool wingState1 = false;
bool wingState2 = false;
bool hangmechState = false;
bool expoDrive = true;
bool autonSelected = false;
int currentPrints = 0;
int Col = 1;
int autonSelect = 1;
const int Default_cataVelo = 80;
int cataVelo = 80;
const int intakeVelo = 100;
enum turnDir { LEFT, RIGHT };
enum stopType { COAST, HOLD };
enum debugType {
DRIVE,
WING,
STICK,
CATA,
INTAKE,
AUTON,
LOOP_TEST,
INERTIAL
};
enum driveType { EXPO, NORMAL };
enum driveDirection { FORWARD, REVERSE };
enum activationState { TOGGLE, HOLD_BUTTON };
enum wingTrigger { SINGLE, DOUBLE };
enum autoVelocityType { CONSTANT, SCALAR };
enum unitType { DEGS, REVS, INCHES };
enum expoDriveType {QUADRATIC, CUBIC, GEOMETRIC};
const expoDriveType default_DriveScalar = QUADRATIC;
enum autoDriveType {ARC, LOG, OCTIC, QUARTIC};
const autoDriveType default_AutoScalar = QUARTIC;
const autoDriveType default_TurnScalar = LOG;
class CDebug { // fair enough
private:
int driveLine;
int wingLine;
int stickLine;
int cataLine;
int intkLine;
int autonLine;
int loopLine;
int inertialLine;
public:
void processColumn() {
if (1+currentPrints >= 32) {
Col = 15;
}
}
void printsOn() {
Brain.Screen.setCursor(30, 30);
Brain.Screen.print(currentPrints);
processColumn();
}
void Print(debugType d) { // for default
processColumn();
switch (d) {
case DRIVE:
Brain.Screen.setCursor(1 + currentPrints, Col);
Brain.Screen.print(LF.velocity(percent));
Brain.Screen.setCursor(2 + currentPrints, Col);
Brain.Screen.print(LM.velocity(percent));
Brain.Screen.setCursor(3 + currentPrints, Col);
Brain.Screen.print(LB.velocity(percent));
Brain.Screen.setCursor(1 + currentPrints, Col+10);
Brain.Screen.print(RF.velocity(percent));
Brain.Screen.setCursor(2 + currentPrints, Col+10);
Brain.Screen.print(RM.velocity(percent));
Brain.Screen.setCursor(3 + currentPrints, Col+10);
Brain.Screen.print(RB.velocity(percent));
driveLine = 1+currentPrints;
currentPrints += 3;
break;
case WING:
Brain.Screen.setCursor(1+currentPrints, Col);
Brain.Screen.print(boolToString(wingState1).c_str());
Brain.Screen.setCursor(1+currentPrints, Col+10);
Brain.Screen.print(boolToString(wingState2).c_str());
wingLine = 1+currentPrints;
currentPrints +=1 ;
break;
case STICK:
Brain.Screen.setCursor(1 + currentPrints, Col);
Brain.Screen.print(Controller1.Axis3.position(percent));
Brain.Screen.setCursor(1 + currentPrints, Col+10);
Brain.Screen.print(Controller1.Axis4.position(percent));
stickLine = 1+currentPrints;
currentPrints += 1;
break;
case CATA:
Brain.Screen.setCursor(1 + currentPrints, Col);
Brain.Screen.print(append("Cata velocity: ", Catapult.velocity(rpm)).c_str());
cataLine = 1+currentPrints;
currentPrints += 1;
break;
case INTAKE:
Brain.Screen.setCursor(1 + currentPrints, Col);
Brain.Screen.print(append("Intake Velocity: ", Intake.velocity(rpm)).c_str());
intkLine = 1+currentPrints;
currentPrints += 1;
break;
case AUTON:
Brain.Screen.setCursor(1 + currentPrints, Col);
// Brain.Screen.print(append("Auton Actve: ", autonActive).c_str());
// autonLine = 1+currentPrints;
// currentPrints += 1;
break;
case LOOP_TEST:
Brain.Screen.setCursor(1 + currentPrints, Col);
Brain.Screen.print("In loop");
loopLine = 1+currentPrints;
currentPrints += 1;
break;
case INERTIAL:
Brain.Screen.setCursor(1+currentPrints, Col);
Brain.Screen.print(Inertial.heading(deg));
inertialLine = 1+currentPrints;
currentPrints += 1;
}
}
void debugAll() {
Print(DRIVE);
Print(WING);
Print(STICK);
Print(CATA);
Print(INTAKE);
Print(AUTON);
Print(LOOP_TEST);
Print(INERTIAL);
}
void Clear(debugType d) {
switch(d){
case DRIVE:
Brain.Screen.clearLine(driveLine);
Brain.Screen.clearLine(driveLine+1);
Brain.Screen.clearLine(driveLine+2);
currentPrints -= 2;
break;
case WING:
Brain.Screen.clearLine(wingLine);
break;
case STICK:
Brain.Screen.clearLine(stickLine);
break;
case CATA:
Brain.Screen.clearLine(cataLine);
break;
case INTAKE:
Brain.Screen.clearLine(intkLine);
break;
case AUTON:
Brain.Screen.clearLine(autonLine);
break;
case LOOP_TEST:
Brain.Screen.clearLine(loopLine);
break;
case INERTIAL:
Brain.Screen.clearLine(inertialLine);
break;
}
currentPrints -= 1;
processColumn();
}
void clearAll() {
Clear(DRIVE);
Clear(WING);
Clear(STICK);
Clear(CATA);
Clear(INTAKE);
Clear(AUTON);
Clear(LOOP_TEST);
Clear(INERTIAL);
processColumn();
}
};
CDebug Debug;
void clearAll() {
Brain.Screen.clearScreen();
currentPrints = 0;
Debug.processColumn();
}
void clearMostRecent(void) {
Brain.Screen.clearLine(currentPrints);
currentPrints -= 1;
}
void Print(string s) {
Debug.processColumn();
Brain.Screen.setCursor(1+currentPrints, Col);
Brain.Screen.print(s.c_str());
currentPrints +=1;
}
void Print(int i) {
Debug.processColumn();
Brain.Screen.setCursor(1+currentPrints, Col);
Brain.Screen.print(intToString(i).c_str());
currentPrints +=1;
}
void Print(double d) {
Debug.processColumn();
Brain.Screen.setCursor(1+currentPrints, Col);
Brain.Screen.print(doubleToString(d).c_str());
currentPrints +=1;
}
void Print(bool b) {
Debug.processColumn();
Brain.Screen.setCursor(1+currentPrints, Col);
Brain.Screen.print(boolToString(b).c_str());
currentPrints +=1;
}
class CPP_Drivetrain { // congratulations, you made driving more complicated
private:
const float Error = 0.1;
double inchesToRev(double x) { return x / (3.25/M_PI); }
double degsToRev(double x) {return x / 360;}
double gearRatio(double x) { return (72 / 36) * x; }
// double drive_QuarticScalar(double x) {
// if (x < 0) {
// return -1 * abs(pow(x, 4)/1000000);
// } else {
// return abs(pow(x, 4)/1000000);
// }
// }
double quadraticScalar(double x) {
if (x < 0) {
return -1 * abs(pow(x, 2)/100);
} else {
return abs(pow(x, 2)/100);
}
}
double cubicScalar(double x) { return 0.0001*pow(x, 3); }
double geometricScalar(double x) {
if (x >= 0) {
return 1.2*pow(1.043, x) - 1.2 + (0.2*x);
}
else {
x = -x;
x = 1.2*pow(1.043, x) - 1.2 + (0.2*x);
x = -x;
return x;
}
}
double arcScalar(double x) { return sqrt(1 - pow(1.7 * (x) - 1.7 + 1, 2)); }
double logScalar(double x) { return (log10(x+0.03) / log10(35)) + 0.99; }
double octicScalar(double x) {return -1 * (256 * pow(x - 0.5, 8) - 1); }
double quarticScalar(double x) { return -1 * (16*pow(x-0.5, 4) - 1); }
double startDistance = gearRatio((LF.position(rev) + RF.position(rev)) / 2);
double distDriven = gearRatio(((LF.position(rev) + RF.position(rev)) / 2) - startDistance);
double startTurnDistance = Inertial.heading();
double distTurned = Inertial.heading() - startTurnDistance;
void forwardDrive(void) {
LF.spin(vex::forward);
LM.spin(vex::forward);
LB.spin(vex::forward);
RF.spin(vex::forward);
RM.spin(vex::forward);
RB.spin(vex::forward);
}
void reverseDrive(void) {
LF.spin(vex::reverse);
LM.spin(vex::reverse);
LB.spin(vex::reverse);
RF.spin(vex::reverse);
RM.spin(vex::reverse);
RB.spin(vex::reverse);
}
void fullDrive(driveDirection d) {
switch(d){
case FORWARD:
forwardDrive();
break;
case REVERSE:
reverseDrive();
break;
}
}
void fullLeftTurn(void) {
LF.spin(vex::reverse);
LM.spin(vex::reverse);
LB.spin(vex::reverse);
RF.spin(vex::forward);
RM.spin(vex::forward);
RB.spin(vex::forward);
}
void fullRightTurn(void) {
LF.spin(vex::forward);
LM.spin(vex::forward);
LB.spin(vex::forward);
RF.spin(vex::reverse);
RM.spin(vex::reverse);
RB.spin(vex::reverse);
}
void fullTurn(turnDir t) {
switch (t) {
case LEFT:
fullLeftTurn();
break;
case RIGHT:
fullRightTurn();
break;
}
}
public:
double scalarSelect(double x, autoDriveType a) {
switch(a){
case ARC:
return arcScalar(x);
break;
case LOG:
return logScalar(x);
break;
case QUARTIC:
return quarticScalar(x);
break;
case OCTIC:
return octicScalar(x);
break;
}
}
double autoDriveScalar(double x) {
return scalarSelect(x, default_AutoScalar);
}
double autoTurnScalar(double x) {
return scalarSelect(x, default_TurnScalar);
}
double scalarSelect(double x, expoDriveType e) {
double y;
switch(e) {
case QUADRATIC:
y = quadraticScalar(x);
break;
case CUBIC:
y = cubicScalar(x);
break;
case GEOMETRIC:
y = geometricScalar(x);
break;
}
return y;
}
double expoDriveScalar(double x) {
return scalarSelect(x, default_DriveScalar);
}
void Stop(stopType stopType) {
switch (stopType) {
case HOLD:
LF.stop(hold);
LM.stop(hold);
LB.stop(hold);
RF.stop(hold);
RM.stop(hold);
RB.stop(hold);
break;
case COAST:
LF.stop(coast);
LM.stop(coast);
LB.stop(coast);
RF.stop(coast);
RM.stop(coast);
RB.stop(coast);
break;
}
}
void Velocity(double veloPer) {
LF.setVelocity(veloPer, percent);
LM.setVelocity(veloPer, percent);
LB.setVelocity(veloPer, percent);
RF.setVelocity(veloPer, percent);
RM.setVelocity(veloPer, percent);
RB.setVelocity(veloPer, percent);
}
void Turn(turnDir t, double turnDeg, autoVelocityType a) {
switch (a) {
case CONSTANT:
switch (t) {
case LEFT:
LF.spinFor(vex::reverse, gearRatio(turnDeg), degrees, false);
LM.spinFor(vex::reverse, gearRatio(turnDeg), degrees, false);
LB.spinFor(vex::reverse, gearRatio(turnDeg), degrees, false);
RF.spinFor(vex::forward, gearRatio(turnDeg), degrees, false);
RM.spinFor(vex::forward, gearRatio(turnDeg), degrees, false);
RB.spinFor(vex::forward, gearRatio(turnDeg), degrees, false);
Stop(HOLD);
break;
case RIGHT:
LF.spinFor(vex::reverse, gearRatio(turnDeg), degrees, false);
LM.spinFor(vex::reverse, gearRatio(turnDeg), degrees, false);
LB.spinFor(vex::reverse, gearRatio(turnDeg), degrees, false);
RF.spinFor(vex::forward, gearRatio(turnDeg), degrees, false);
RM.spinFor(vex::forward, gearRatio(turnDeg), degrees, false);
RB.spinFor(vex::forward, gearRatio(turnDeg), degrees, false);
Stop(HOLD);
break;
}
break;
case SCALAR:
startTurnDistance = Inertial.heading();
while (distTurned < turnDeg - Error) {
Debug.Print(LOOP_TEST);
Velocity(autoTurnScalar(distTurned / turnDeg) * 100);
fullTurn(t);
distTurned = Inertial.heading() - startTurnDistance;
}
Debug.Clear(LOOP_TEST);
Stop(HOLD);
break;
}
}
void DriveFor(driveDirection d, double driveRev, unitType u, autoVelocityType a) {
if (u == INCHES) {
driveRev = inchesToRev(driveRev);
}
else if (u == DEGS) {
driveRev = degsToRev(driveRev);
}
switch (a) {
case CONSTANT:
if (d == FORWARD) {
LF.spinFor(vex::forward, gearRatio(driveRev), rev, false);
LM.spinFor(vex::forward, gearRatio(driveRev), rev, false);
LB.spinFor(vex::forward, gearRatio(driveRev), rev, false);
RF.spinFor(vex::forward, gearRatio(driveRev), rev, false);
RM.spinFor(vex::forward, gearRatio(driveRev), rev, false);
RB.spinFor(vex::forward, gearRatio(driveRev), rev);
} else if (d == REVERSE) {
LF.spinFor(vex::reverse, gearRatio(driveRev), rev, false);
LM.spinFor(vex::reverse, gearRatio(driveRev), rev, false);
LB.spinFor(vex::reverse, gearRatio(driveRev), rev, false);
RF.spinFor(vex::reverse, gearRatio(driveRev), rev, false);
RM.spinFor(vex::reverse, gearRatio(driveRev), rev, false);
RB.spinFor(vex::reverse, gearRatio(driveRev), rev);
}
break;
case SCALAR:
startDistance = ((LF.position(rev) + RF.position(rev)) / 2);
if (d == REVERSE) {
driveRev *= -1;
distDriven = -1 * (((LF.position(rev) + RF.position(rev)) / 2) - startDistance);
}
while (distDriven < driveRev - Error) {
Velocity(gearRatio(autoDriveScalar(distDriven / driveRev)) * 100);
fullDrive(d);
if (d == FORWARD) {
distDriven =
((LF.position(rev) + RF.position(rev)) / 2) - startDistance;
}
else if (d == REVERSE) {
distDriven =
-1 * (((LF.position(rev) + RF.position(rev)) / 2) - startDistance);
}
}
Stop(HOLD);
}
}
void Drive(driveType d) {
int DTV = -1 * Controller1.Axis3.position(percent);
int DTH = Controller1.Axis4.position(percent);
int RightDrive = DTV + DTH;
int LeftDrive = DTV - DTH;
switch (d) {
case NORMAL:
LF.setVelocity(LeftDrive, percent);
LM.setVelocity(LeftDrive, percent);
LB.setVelocity(LeftDrive, percent);
RF.setVelocity(RightDrive, percent);
RM.setVelocity(RightDrive, percent);
RB.setVelocity(RightDrive, percent);
fullDrive(FORWARD);
break;
case EXPO:
LF.setVelocity(expoDriveScalar(LeftDrive), percent);
LM.setVelocity(expoDriveScalar(LeftDrive), percent);
LB.setVelocity(expoDriveScalar(LeftDrive), percent);
RF.setVelocity(expoDriveScalar(RightDrive), percent);
RM.setVelocity(expoDriveScalar(RightDrive), percent);
RB.setVelocity(expoDriveScalar(RightDrive), percent);
fullDrive(FORWARD);
break;
}
}
};
CPP_Drivetrain Drivetrain;
void wingFunc(wingTrigger t, activationState a) {
switch (t) {
case SINGLE:
switch (a) {
case TOGGLE:
Controller1.ButtonY.pressed([]() -> void{
wingState1 = !wingState1;
wingState2 = !wingState2;
Wing1.set(wingState1);
Wing2.set(wingState2);
});
break;
case HOLD_BUTTON:
if (Controller1.ButtonY.pressing()) {
Wing1.set(true);
Wing2.set(true);
} else {
Wing1.set(false);
Wing2.set(false);
}
break;
}
break;
case DOUBLE:
switch (a) {
case TOGGLE:
Controller1.ButtonL1.pressed([]() -> void {
wingState1 = !wingState1;
Wing1.set(wingState1);
});
Controller1.ButtonR1.pressed([]() -> void {
wingState2 = !wingState2;
Wing2.set(wingState2);
});
break;
case HOLD_BUTTON:
if (Controller1.ButtonL1.pressing()) {
Wing1.set(true);
} else {
Wing1.set(false);
}
if (Controller1.ButtonR1.pressing()) {
Wing2.set(true);
} else {
Wing2.set(false);
}
break;
}
break;
}
}
void setCataVelo(double velo) {
cataVelo = velo;
Catapult.setVelocity(cataVelo, percent);
}
void autonDisplay(void) {
Controller1.Screen.clearLine(3);
Controller1.Screen.setCursor(3, 0);
switch (autonSelect) {
case 1:
Controller1.Screen.print("No Auto");
break;
case 2:
Controller1.Screen.print("Far Auto (AWP)");
break;
case 3:
Controller1.Screen.print("Close Auto (AWP)");
break;
case 4:
Controller1.Screen.print("Far Auto (Elims)");
break;
case 5:
Controller1.Screen.print("Close Auto (Elims)");
break;
case 6:
Controller1.Screen.print("Skills");
break;
}
}
void autonChanger(void) {
if (!autonSelected){
if (autonSelect < 6) {
autonSelect+= 1;
} else if (autonSelect >= 6) {
autonSelect = 1;
}
}
}
void pre_auton(void) {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
Inertial.calibrate();
while (Inertial.isCalibrating()) {
wait(100, msec);
}
autonDisplay();
Wing1.set(wingState1);
Wing2.set(wingState2);
Hangmech.set(hangmechState);
setCataVelo(Default_cataVelo);
// All activities that occur before the competition starts
// Example: clearing encoders, setting servo positions, ...
}
/*---------------------------------------------------------------------------*/
/* */
/* Autonomous Task */
/* */
/* This task is used to control your robot during the autonomous phase of */
/* a VEX Competition. */
/* */
/* You must modify the code to add your own robot specific commands here. */
/*---------------------------------------------------------------------------*/
void autonomous(void) {
//TEST AUTONOMOUS
autonSelected = true;
// preAutonActive = false;
// autonActive = true;
Controller1.Screen.clearLine(3);
clearAll();
switch (autonSelect) {
case 1:
// no auto
Print("No Auto");
wait(20, msec);
break;
case 2:
// far auto AWP
Print("Far Auto AWP");
Drivetrain.DriveFor(FORWARD, 25, INCHES, SCALAR);
wait(0.5, sec);
Drivetrain.Turn(RIGHT, 90, SCALAR);
Intake.spinFor(vex::reverse, 5, rev);
Drivetrain.DriveFor(FORWARD, 5, INCHES, SCALAR);
wait(0.5, sec);
Drivetrain.Turn(RIGHT, 180, SCALAR);
Drivetrain.DriveFor(FORWARD, 5, INCHES, SCALAR);
Intake.spinFor(vex::forward, 3, rev);
wait(0.5, sec);
Drivetrain.Turn(RIGHT, 180, SCALAR);
Intake.spinFor(vex::reverse, 5, rev);
Drivetrain.DriveFor(FORWARD, 5, INCHES, SCALAR);
wait(0.5, sec);
Drivetrain.Turn(RIGHT, 180, SCALAR);
Drivetrain.DriveFor(FORWARD, 10, INCHES, SCALAR);
Intake.spinFor(vex::forward, 3, rev);
wait(0.5, sec);
Drivetrain.Turn(RIGHT, 180, SCALAR);
Intake.spinFor(vex::reverse, 5, rev);
Drivetrain.DriveFor(FORWARD, 10, INCHES, SCALAR);
wait(0.1, sec);
Drivetrain.DriveFor(REVERSE, 15, INCHES, SCALAR);
Drivetrain.Turn(RIGHT, 90, SCALAR);
wait(0.5, sec);
wingState1 = true;
wingState2 = true;
Wing1.set(wingState1);
Wing2.set(wingState2);
Drivetrain.DriveFor(FORWARD, 20, INCHES, SCALAR);
break;
case 3:
// close auto AWP
Print("Close Auto AWP");
wingState2 = true;
Wing2.set(wingState2);
Drivetrain.DriveFor(REVERSE, 3, INCHES, SCALAR);
wait(0.1, sec);
Drivetrain.DriveFor(FORWARD, 6, INCHES, SCALAR);
wingState2 = false;
Wing2.set(wingState2);
wait(0.5, sec);
Drivetrain.Turn(LEFT, 180, SCALAR);
Drivetrain.DriveFor(FORWARD, 9, INCHES, SCALAR);
Drivetrain.Turn(RIGHT, 45, SCALAR);
Drivetrain.DriveFor(FORWARD, 3, INCHES, SCALAR);
Intake.spinFor(vex::reverse, 10, rev);
Drivetrain.DriveFor(REVERSE, 2, INCHES, SCALAR);
Drivetrain.DriveFor(FORWARD, 5, INCHES, SCALAR);
wait(0.5, sec);
Drivetrain.Turn(RIGHT, 135, SCALAR);
Drivetrain.DriveFor(FORWARD, 10, INCHES, SCALAR);
wait(0.3, sec);
Drivetrain.Turn(LEFT, 45, SCALAR);
Drivetrain.DriveFor(FORWARD, 5, INCHES, SCALAR);
break;
// Far Auto ELIMS
Print("Far Auto Elims (do not use)");
break;
case 5:
// close auto ELIMS
Print("Close Auto Elims (do not use)");
break;
case 6:
//skills
Print("Skills");
Drivetrain.DriveFor(FORWARD, 3, INCHES, SCALAR);
wait(0.25, sec);
Drivetrain.Turn(RIGHT, 40, SCALAR);
wait(0.25, sec);
Drivetrain.DriveFor(FORWARD, 14, INCHES, SCALAR);
wait(0.25, sec);
Drivetrain.Turn(LEFT, 45, SCALAR);
wait(0.25, sec);
Drivetrain.DriveFor(FORWARD, 6, INCHES, SCALAR);
wait(0.25, sec);
Catapult.spinFor(vex::forward, 50, rev);
wait(0.25, sec);
Drivetrain.Turn(LEFT, 45, SCALAR);
Drivetrain.DriveFor(FORWARD, 78, INCHES, SCALAR);
wait(0.25, sec);
Drivetrain.Turn(RIGHT, 90, SCALAR);
wait(0.25, sec);
wingState1 = true;
wingState2 = true;
Wing1.set(wingState1);
Wing2.set(wingState2);
Drivetrain.DriveFor(FORWARD, 32.5, INCHES, SCALAR);
wait(0.25, sec);
wingState1 = false;
wingState2 = false;
Wing1.set(wingState1);
Wing1.set(wingState2);
Drivetrain.DriveFor(REVERSE, 9, INCHES, SCALAR);
wait(0.5, sec);
Drivetrain.Turn(RIGHT, 90, SCALAR);
Drivetrain.DriveFor(FORWARD, 9, INCHES, SCALAR);
wait(0.5, sec);
Drivetrain.Turn(LEFT, 135, SCALAR);
wait(0.5, sec);
break;
}
clearMostRecent();
// autonActive = false;
// ..........................................................................
// Insert autonomous user code here.
// ..........................................................................
}
/*---------------------------------------------------------------------------*/
/* */
/* User Control Task */
/* */
/* This task is used to control your robot during the user control phase of */
/* a VEX Competition. */
/* */
/* You must modify the code to add your own robot specific commands here. */
/*---------------------------------------------------------------------------*/
void usercontrol(void) {
while(!autonSelected){
Controller1.ButtonLeft.pressed(autonChanger);
Controller1.ButtonA.pressed([]() -> void {
autonSelected = true;
Controller1.ButtonLeft.pressed([]() -> void {});
Controller1.ButtonA.pressed([]() -> void {});
});
autonDisplay();
wait(100, msec);
}
Controller1.Screen.clearScreen();
Controller1.Screen.setCursor(1, 0);
Controller1.Screen.print(append("Cata velocity %: ", floor(cataVelo)).c_str());
Controller1.Screen.setCursor(2, 0);
Controller1.Screen.print(append("EX Drive: ", expoDrive).c_str());
Debug.Print(WING);
Print("two");
Debug.Print(DRIVE);
Print(2);
Debug.Print(STICK);
Print(2.0);
Print(false);
Debug.Print(CATA);
Debug.Print(INERTIAL);
// User control code here, inside the loop
while (1) {
Catapult.setMaxTorque(100, percent);
// This is the main execution loop for the user control program.
// Each time throughs the loop your program should update motor + servo
// values based on feedback from the joysticks.
bool cataVeloUp = Controller1.ButtonUp.pressing();
if (cataVeloUp && cataVelo < 100) {
cataVelo += 10;
Controller1.Screen.clearLine(1);
Controller1.Screen.setCursor(1, 0);
Controller1.Screen.print(append("Cata velocity %: ", (cataVelo)).c_str());
wait(100, msec);
}
bool cataVeloDown = Controller1.ButtonDown.pressing();
if (cataVeloDown && cataVelo > 10) {
cataVelo -= 10;
Controller1.Screen.clearLine(1);
Controller1.Screen.setCursor(1, 0);
Controller1.Screen.print(append("Cata velocity %: ", (cataVelo)).c_str());
wait(100, msec);
}
// setting velocities
Catapult.setVelocity(cataVelo, percent);
Intake.setVelocity(intakeVelo, percent);
// drive
if (expoDrive == true) {
Drivetrain.Drive(EXPO);
} else if (expoDrive == false) {
Drivetrain.Drive(NORMAL);
}
Controller1.ButtonRight.pressed([]() -> void {
Controller1.Screen.clearLine(2);
expoDrive = !expoDrive;
Controller1.Screen.setCursor(2, 0);
Controller1.Screen.print(append("EX Drive: ", expoDrive).c_str());
wait(500, msec);
});
// catapult
if (Controller1.ButtonR1.pressing()) {
Catapult.spin(vex::forward);
} else {
Catapult.stop(hold);
}
// wings
wingFunc(SINGLE, TOGGLE);
// intake
if (Controller1.ButtonA.pressing()) {
Intake.spin(vex::forward);
} else if (Controller1.ButtonB.pressing()) {
Intake.spin(vex::reverse);
} else {
Intake.stop(hold);
}
// endgame
Controller1.ButtonX.pressed([]() -> void {
hangmechState = !hangmechState;
Hangmech.set(hangmechState);
});
// ........................................................................
// Insert user code here. This is where you use the joystick values to
// update your motors, etc.
// ........................................................................
wait(20, msec); // Sleep the task for a short amount of time to
// prevent wasted resources.
}
}
//
// Main will set up the competition functions and callbacks.
//
int main() {
// Set up callbacks for autonomous and driver control periods.
Competition.autonomous(autonomous);
Competition.drivercontrol(usercontrol);
// Run the pre-autonomous function.
pre_auton();
// Prevent main from exiting with an infinite loop.
while (true) {
wait(100, msec);
}
}
Editor is loading...