//TODO //Add a button on joystick that activates "auto" to drive to 40 inches away and another to shoot when at 40 inches away (use the little joystick on both drive and shooter stick) //Sonar in auto: drive till 40in away (dashboard value) and shoot #include "WPILib.h" #include "SmartDashboard/SmartDashboard.h" //#include "Command.h" #include #include #include #include class RobotDemo : public SimpleRobot { RobotDrive myRobot; float potVal, multiplier, servoXState, servoYState, throttle, ServoXJoyPos, ServoYJoyPos; bool collectorExtended, shooting, compressing; float upLimit; //string cmd; Joystick Rstick, Lstick; Servo Servo1, Servo2; Solenoid collectorSole1, collectorSole2; //Do we need this? TODO - Austen Relay collectorSpike, lightingSpike; Compressor compressor; Jaguar Left1, Left2, Left3, Right1, Right2, Right3, RightArmMotor1, RightArmMotor2, LeftArmMotor1, LeftArmMotor2, CollectorMotor1; AnalogChannel armPot; //Ultrasonic AnalogChannel BallSonicLeft, BallSonicRight, WallSonicLeft, WallSonicRight; DigitalOutput BallLeft, BallRight, WallLeft, WallRight; public: RobotDemo(): //Limit Switches //TODO //Joysticks Rstick(1), Lstick(2), //Pot armPot(6), //Ultrasonic BallSonicLeft(1), BallSonicRight(2), WallSonicLeft(3), WallSonicRight(4), BallLeft(1,4), WallLeft(1,5), BallRight(2,4), WallRight(2,5), //Compressor compressor(2, 5, 1, 1), //Solenoids collectorSole1(1), collectorSole2(2), //Driver Motors Left1(1, 1), Left2(1, 2), Left3(1, 3), Right1(2, 1), Right2(2, 2), Right3(2, 3), //Servos Servo1(1, 7), Servo2(1, 8), //Spikes collectorSpike(2, 7), lightingSpike(2, 8), //Shooter Motors LeftArmMotor1(1, 4), LeftArmMotor2(1, 5), RightArmMotor1(2, 4), RightArmMotor2(2, 5), //Collector Motor CollectorMotor1(1, 6), myRobot(Left1, Left2, Right1, Right2) { GetWatchdog().SetEnabled(false); } void RobotInit() { //Initializing robot DashboardSetup(); servoXState = 90; servoYState = 90; multiplier = 1.0f; upLimit = 130.0; compressor.Start(); shooting = false; compressing = true; throttle=0; } void DashboardSetup() { SmartDashboard::PutNumber("Throttle", throttle); SmartDashboard::PutNumber("upLimit", 120.0f); //SmartDashboard::PutString("Auto", cmd); SmartDashboard::PutNumber("armPot", potToDegrees(armPot.GetAverageVoltage())); SmartDashboard::PutNumber("Log Level", 1); //Ultrasonic SmartDashboard::PutNumber("Wall Left", voltToDistance(WallSonicLeft.GetAverageVoltage(),true)); SmartDashboard::PutNumber("Wall Right", voltToDistance(WallSonicRight.GetAverageVoltage(),true)); SmartDashboard::PutNumber("Ball Left", voltToDistance(BallSonicLeft.GetAverageVoltage())); SmartDashboard::PutNumber("Ball Right", voltToDistance(BallSonicRight.GetAverageVoltage())); SmartDashboard::PutNumber("AutoDistance",350.0f); SmartDashboard::PutNumber("AutoYValue",350.0f); SmartDashboard::PutNumber("AutoPower",0.455f); SmartDashboard::PutNumber("AutoAngle",130.0f); SmartDashboard::PutNumber("AutoCorrection",0.06f); SmartDashboard::PutNumber("ShortRange",0.465f); SmartDashboard::PutNumber("ShooterButtonPower10",0.605f); SmartDashboard::PutNumber("ShooterButtonPower7",1.0f); SmartDashboard::PutNumber("ShooterButtonPower8",0.5f); SmartDashboard::PutBoolean("OneBallAuto",true); SmartDashboard::PutBoolean("Daniel Mode",false); SmartDashboard::PutBoolean("CollectorState",false); } void updateDashboard() { SmartDashboard::PutNumber("Throttle", throttle); SmartDashboard::PutNumber("armPot", potToDegrees(armPot.GetAverageVoltage())); SmartDashboard::PutNumber("Wall Left", voltToDistance(WallSonicLeft.GetAverageVoltage(),true)); SmartDashboard::PutNumber("Wall Right", voltToDistance(WallSonicRight.GetAverageVoltage(),true)); SmartDashboard::PutNumber("Ball Left", voltToDistance(BallSonicLeft.GetAverageVoltage())); SmartDashboard::PutNumber("Ball Right", voltToDistance(BallSonicRight.GetAverageVoltage())); SmartDashboard::PutNumber("upLimit", upLimit); if(upLimit > 167) { upLimit = 167; } } void shootRobot(float power=0) { //Needs a limit to help the driver aim //In this case its checking that we are no more than 15 degrees off //The override is in place in case an ultrasonic becomes damaged and we are unable to validate the distance through software setMotorValue(4, 1, cvt(power)); setMotorValue(5, 1, cvt(power)); setMotorValue(4, 2, cvt(-power)); setMotorValue(5, 2, cvt(-power)); } void logMsg(std::string message, int level) { if((int)SmartDashboard::GetNumber("Log Level") % level == 0) { printf((message+"\n").c_str()); } } void driveRobot(float x, float y) { if(y>1.0f) { y=1.0f; } else if(y!=0.0f&&y<-1.0f) { y=-1.0f; } int leftPower = ((y+x)/2+1)*127+1; int rightPower = ((y-x)/2+1)*127+1; //logMsg("leftPower: "+toString(leftPower),3); //logMsg("rightPower: "+toString(rightPower),3); //logMsg("JoyX: "+toString(Rstick.GetX()),3); //logMsg("JoyY: "+toString(Rstick.GetY()),3); setMotorValue(1, 1, leftPower); setMotorValue(2, 1, leftPower); setMotorValue(3, 1, leftPower); setMotorValue(1, 2, rightPower); setMotorValue(2, 2, rightPower); setMotorValue(3, 2, rightPower); } template string toString(numbertype a) { //TODO stringstream ss; ss<=200+x&&i<=400+x){ //Wait driveRobot(0.0f, 0.0f); shootRobot(0.0f); } else if(i>400+x&&i<500+x&&/*120*/angle>=potToDegrees(armPot.GetAverageVoltage())) { //Shoot driveRobot(0.0f, 0.0f); shootRobot(power); } else if(i>400+x&&i<500+x&&/*120*/angle<=potToDegrees(armPot.GetAverageVoltage())) { //Wait driveRobot(0.0f, 0.0f); shootRobot(0.0f); } else if(i>=500) { //Kill robit driveRobot(0.0f, 0.0f); shootRobot(0.0f); } }else{ int x=SmartDashboard::GetNumber("AutoDistance"); int y=SmartDashboard::GetNumber("AutoYValue"); float power=SmartDashboard::GetNumber("AutoPower"); int angle=SmartDashboard::GetNumber("AutoAngle"); float correction=SmartDashboard::GetNumber("AutoCorrection"); if(i<1700+3*x+2*y){ setMotorValue(6, 1, 1); } if(i<200+x) { //Forward .5s driveRobot(-1.0f,correction); shootRobot(0.0f); }else if(i>=200+x&&i<=400+x){ //Wait driveRobot(0.0f, 0.0f); shootRobot(0.0f); } else if(i>400+x&&i<500+x&&/*120*/angle>=potToDegrees(armPot.GetAverageVoltage())) { //Shoot driveRobot(0.0f, 0.0f); shootRobot(power); } else if(i>400+x&&i<500+x&&/*120*/angle<=potToDegrees(armPot.GetAverageVoltage())) { //Wait driveRobot(0.0f, 0.0f); shootRobot(0.0f); } else if(i>500+x&&i<700+2*x+y) { //Drive backward 1s, Collect ball if(40.0f<=potToDegrees(armPot.GetAverageVoltage())){ shootRobot(-0.30f); } driveRobot(0.6f,correction); shootRobot(0.0f); } else if(i>=700+2*x+y&&i<=1300+2*x+y){ //Wait driveRobot(0.0f,0.0f); shootRobot(0.0f); } else if(i>1300+2*x+y&&i<1500+3*x+2*y) { //Drive forward 1s driveRobot(-1.0f,correction); shootRobot(0.0f); } else if(i>=1500+3*x+2*y&&i<=1600+3*x+2*y){ //Wait driveRobot(0.0f,0.0f); shootRobot(0.0f); } else if(i>1600+3*x+2*y&&i<1700+3*x+2*y&&/*120*/angle>=potToDegrees(armPot.GetAverageVoltage())){ //Shoot driveRobot(0.0f,0.0f); shootRobot(power); } else if(i>1600+3*x+2*y&&i<1700+3*x+2*y&&/*120*/angle<=potToDegrees(armPot.GetAverageVoltage())){ //Wait driveRobot(0.0f,0.0f); shootRobot(0.0f); } else if(i>1700+3*x+2*y&&40.0f<=potToDegrees(armPot.GetAverageVoltage())) { //Stop robot after auto, let down shooter driveRobot(0.0f,0.0f); shootRobot(-0.15); } else if(i>1700+3*x+2*y&&40.0f>=potToDegrees(armPot.GetAverageVoltage())) { //Stop all motors driveRobot(0.0f,0.0f); shootRobot(0.0f); } } updateDashboard(); if(i % 100 == 0 && compressing && compressor.GetPressureSwitchValue() == 1) { compressor.Stop(); compressing = false; logMsg("Stopping the compressor",2); } if(i % 100 == 0 && !compressing && compressor.GetPressureSwitchValue() == 0) { compressor.Start(); compressing = true; logMsg("Starting the compressor",2); } Wait(0.005f); i++; cur++; } i=0; compressing = false; compressor.Stop(); } void OperatorControl() { myRobot.SetSafetyEnabled(false); int i = 0; int cur=0; bool swap=false; collectorSole1.Set(true); collectorSole2.Set(false); compressing = false; logMsg("Starting Teleop",1); SmartDashboard::PutBoolean("CollectorState",false); while(IsEnabled() && IsOperatorControl()) { if(cur==50) { cur=0; WallLeft.Set(swap?1:0); BallRight.Set(swap?1:0); WallRight.Set(swap?0:1); BallRight.Set(swap?0:1); swap=!swap; } if(Lstick.GetRawButton(9)==1){ throttle = (-Lstick.GetRawAxis(4)+1)/2; }else if(Lstick.GetRawButton(10)){ throttle = SmartDashboard::GetNumber("ShooterButtonPower10"); }else if(Lstick.GetRawButton(7)){ throttle = SmartDashboard::GetNumber("ShooterButtonPower7"); }else if(Lstick.GetRawButton(8)){ throttle = SmartDashboard::GetNumber("ShooterButtonPower8"); } if(SmartDashboard::GetBoolean("Daniel Mode")) { driveRobot(-Rstick.GetY(),Rstick.GetZ()+Rstick.GetX()); } else { driveRobot(Rstick.GetY(),Rstick.GetZ()+Rstick.GetX()); } //Log things if(i % 200 == 0) { //logMsg(toString(compressor.GetPressureSwitchValue()),2); //logMsg("armPot value: "+toString(armPot.GetAverageVoltage(),11)); //logMsg("Converted armPot value: "+toString(armPot.GetAverageVoltage(),11)); } if(i % 100 == 0 && compressing && compressor.GetPressureSwitchValue() == 1) { compressor.Stop(); compressing = false; logMsg("Stopping the compressor",2); } if(i % 100 == 0 && !compressing && compressor.GetPressureSwitchValue() == 0) { compressor.Start(); compressing = true; logMsg("Starting the compressor... again",2); } if(Lstick.GetRawButton(3)){ upLimit=100.0f; } if(Lstick.GetRawButton(4)){ upLimit=120.0f; } if(Lstick.GetRawButton(5)){ upLimit=90.0f; } if(Lstick.GetRawButton(6)){ upLimit=130.0f; } //TODO updateDashboard(); if(Lstick.GetRawButton(1)==1&&Lstick.GetRawButton(2)==1){ throttle=SmartDashboard::GetNumber("ShortRange"); if(collectorExtended){ shooting = true; logMsg("Firing",13); logMsg("Collector is extended, going to fire",17); shootRobot(throttle); setMotorValue(6, 1, 1); }else{ shooting = false; logMsg("Collector is NOT extended, not going to fire",17); } }else if(Lstick.GetRawButton(1)==1) { //Move arm motors based on throttle if(collectorExtended == false) { shooting = false; logMsg("Collector is NOT extended, not going to fire",17); } if(collectorExtended == true&&(upLimit>=potToDegrees(armPot.GetAverageVoltage()))) { shooting = true; logMsg("Firing",13); logMsg("Collector is extended, going to fire",17); shootRobot(throttle); setMotorValue(6, 1, 1); } } else if(Lstick.GetRawButton(1)==1&&(upLimit<=potToDegrees(armPot.GetAverageVoltage()))) { shooting = false; logMsg("Stopping shooter motor",13); logMsg("Stopping collector motor",17); shootRobot(0); } else if(Lstick.GetRawButton(2)==1) { //Reverse the arm motors shooting = false; if(collectorExtended == false) { logMsg("Collector is not extended, not going to fire",17); } if(collectorExtended == true) { shootRobot(-0.1f); logMsg("Collector is extended, going to fire",17); } } else { shooting = false; //Stop all motors shootRobot(0); } if(Rstick.GetRawButton(9)==1) { SmartDashboard::PutBoolean("CollectorState",true); collectorExtended = true; collectorSole1.Set(false); collectorSole2.Set(true); } else if(Rstick.GetRawButton(10)==1) { SmartDashboard::PutBoolean("CollectorState",false); collectorExtended = false; collectorSole1.Set(true); collectorSole2.Set(false); } if(Lstick.GetRawButton(11)==1) { setMotorValue(6, 1, 1); } else if(Lstick.GetRawButton(12)==1) { setMotorValue(6, 1, 255); } else if(!shooting) { setMotorValue(6, 1, 0); } cur++; i++; Wait(0.005f); } } }; START_ROBOT_CLASS(RobotDemo);