|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
| Thread Tools | Rate Thread | Display Modes |
|
#1
|
|||
|
|||
|
Run a command with conditions
I have 2 sendableChoosers for our Autonomous. One picks the obstacle we are going to attempt. (works well) The other picks the wrist angle of our shooter for High goal or low goal. We came up with the idea after milling over the code shared in the thread More than 1 Sendablechooser where we can run a line of code in a command like
Code:
/* The goalChooser construction
*goalChooser.addDefault("0: No Shoot",0);
*goalChooser.addOption("1: Low goal",1);
*goalChooser.addOption("2: High Goal",2);
*/
protected void initialize() {
Integer goalChoice = (Integer) Robot.goalChooser.getSelected();
angle = findAngle(goalChoice);
Robot.wristSubsystem.setAngle(angle);
}
private double findAngle(integer Choice){
if(Choice == 1){
return 15;
}else if(Choice == 2{
return 75;
}else{
return 90;
}
}
Now comes the trouble I'm trying to resolve. Our AutonomousChooser selects a command group that looks like Code:
addSequential(new drive()); addSequential(new setWristAngle()); //Above code //************* Code Focus ************ addSequential(new Auto_ShootDecide()); //New shoot or Not //addSequential(new shootBall()); //Old always shoots ball //*********************************** Code:
protected void initialize() {
Integer goalChoice = (Integer) Robot.goalChooser.getSelected();
if (goalChoice == 0){//don't shoot
end();
}else{
new shootBall(); This is where the code does not run
}
}
We use shootBall() tied to a button and the code is proven and I don't think I what to add conditions to it to check the goalChoice like "Auto_ShootDecide()". Maybe Auto_ShootDecide() needs to be a mirror of shootBall but with the conditions. I just thought why recreate a chunk of code. What do you think? |
|
#2
|
||||
|
||||
|
Re: Run a command with conditions
Code:
new ShootBall() Code:
Command* c = new ShootBall() c->Start() Code:
m_defenseChooser = new SendableChooser();
//Group A
m_defenseChooser->AddObject("Portcullis", new TraversePortcullisCommandGroup());
m_defenseChooser->AddObject("Cheval de Friese", new TraverseChevalFrieseCommandGroup());
//Group B
m_defenseChooser->AddObject("Moat", new TraverseMoatCommandGroup());
m_defenseChooser->AddObject("Ramparts", new TraverseRampartsCommandGroup());
//Group C
m_defenseChooser->AddObject("Drawbridge", new TraverseDrawbridgeCommandGroup());
m_defenseChooser->AddObject("Sally Port", new TraversePortCommandGroup());
//Group D
m_defenseChooser->AddObject("Rock Wall", new TraverseWallCommandGroup());
m_defenseChooser->AddObject("Rough Terrain", new TraverseTerrainCommandGroup());
m_defenseChooser->AddDefault("Nothing", (void*)0);
SmartDashboard::PutData("Defense Chooser",m_defenseChooser);
m_posChooser = new SendableChooser();
m_posChooser->AddDefault("Nothing", NULL);
// m_posChooser->AddObject("Pos 1 (Low Bar)", (void*)1);
m_posChooser->AddObject("Pos 2", (void*)2);
m_posChooser->AddObject("Pos 3", (void*)3);
m_posChooser->AddObject("Pos 4", (void*)4);
m_posChooser->AddObject("Pos 5", (void*)5);
SmartDashboard::PutData("Position Chooser", m_posChooser);
Code:
void AutonomousInit()
{
autonomousCommand.reset(new GeneratedAutoCommandGroup((Command*)m_defenseChooser->GetSelected(),
(int)m_posChooser->GetSelected(),
(int)m_backChooser->GetSelected()));
if (autonomousCommand != NULL)
autonomousCommand->Start();
}
Code:
class GeneratedAutoCommandGroup: public CommandGroup
{
public:
GeneratedAutoCommandGroup(Command* traverseCommand, int position, int driveBack)
: CommandGroup("GeneratedAutoCommandGroup"){
double angleArray[6] = {0, 0, 30, 0, 0, -25};
if (traverseCommand){
AddSequential(new AutoBlockOneCommandGroup());
AddSequential(traverseCommand);
AddSequential(new RotateToAngleCommand(angleArray[position])); //disabling for middle pos
if (position == 2) {
AddSequential(new LockOnTargetCommand(CameraProcessor::LEFT_TARGET));
} else {
AddSequential(new LockOnTargetCommand(CameraProcessor::RIGHT_TARGET));
}
AddSequential(new AutoBlockTwoCommandGroup());
AddSequential(new RotateToAngleCommand(0));
AddSequential(new DriveDistanceCommand(.5, .5, 2000));
AddSequential(new Rotate180Command());
if (driveBack==1) {
AddSequential(new DriveDistanceCommand(.5, .5, 2000));
AddSequential(traverseCommand);
}
}
}
};
|
|
#3
|
|||
|
|||
|
Re: Run a command with conditions
If you don't want to modify shoot, then copy it to create auto_shoot, and modify that to remove checking the button. What is your reluctance? It may not be elegant, but you have more than enough code space for it.
Last edited by rich2202 : 31-03-2016 at 08:03. |
|
#4
|
|||
|
|||
|
Re: Run a command with conditions
Quote:
Thanks for the direction. |
|
#5
|
|||
|
|||
|
Re: Run a command with conditions
Quote:
Code:
void AutonomousInit() Code:
autonomousCommand->Start() |
|
#6
|
|||
|
|||
|
Re: Run a command with conditions
In an effort to continue down this rabbit hole here is where I sit.
I have continued with one of the original ideas before I attempt to try the build the autonomousCommand just before running it. To better discusse the code here is a link to the Github repo https://github.com/GraniteCiyGearhea...ntsABot_Talahi If we drill to Code:
FIRSTStronghold2016/Copy of SirAntsABot_Talahi/src/org/usfirst/frc3244/SirAntsABot/commands/Auto_22_Demo_03_Drive_N_Score Code:
addSequential(new Auto_Score_Ball_In_Goal()); Now the trouble I'm having is getting the next sequence to continue when Code:
Auto_Score_Ball_In_Goal() Maybe someone can point me to or explain to me the life cycle of a command and what is needed to move onto the next sequence in a command group. |
|
#7
|
||||||
|
||||||
|
Re: Run a command with conditions
Calling end() doesn't cause a command to end. Making isFinished() return true does.
I think the problem is that the commands you are starting are canceling Auto_22_Demo_03_Drive_N_Score because they require the same subsystems. |
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|