Guys,
I think I understand why this is throwing an error, but I am looking for the correct way to do this. In Brad Miller’s last Robot Builder video on youtube he writes the following java code:
autonomousCommand = (Command) autonomousModes->GetSelected();
Unfortunately, if you write the same code in C++ you get the following error:
C:/WindRiver/workspace/TestProject/Robot.cpp: In member function virtual void Robot::AutonomousInit()': C:/WindRiver/workspace/TestProject/Robot.cpp:40: error: cannot allocate an object of type
Command’
C:/WindRiver/workspace/TestProject/Robot.cpp:40: error: because the following virtual functions are abstract:
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:79: error: virtual void Command::Initialize()
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:84: error: virtual void Command::Execute()
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:95: error: virtual bool Command::IsFinished()
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:101: error: virtual void Command::End()
C:/WindRiver/vxworks-6.3/target/h/WPILib/Commands/Command.h:114: error: virtual void Command::Interrupted()
C:\WindRiver\vxworks-6.3\host\x86-win32\bin\make.exe: *** [CommandBasedRobotTemplate/Debug/Objects/TestProject/Robot.o] Error 1
The idea is to cast to the “Command” type in order to be able to set autonomousCommand equal to the output of a SelectableChooser object (which is set by the user clicking on the desired command on the Smartdashboard) - which is then the command that gets run in autonomous.
Any thoughts? Thanks in advance.
- Bryce
P.S. Here’s the complete code in Robot.cpp
void Robot::RobotInit() {
RobotMap::init();
// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
driveTrain = new DriveTrain();
elevator = new Elevator();
wrist = new Wrist();
claw = new Claw();
// END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
// This MUST be here. If the OI creates Commands (which it very likely
// will), constructing it during the construction of CommandBase (from
// which commands extend), subsystems are not guaranteed to be
// yet. Thus, their requires() statements may grab null pointers. Bad
// news. Don't move it.
oi = new OI();
lw = LiveWindow::GetInstance();
// instantiate the command used for the autonomous period
autonomousModes = new SendableChooser();
autonomousModes->AddDefault("Deliver Cylinder", new DeliverCylinder());
autonomousModes->AddObject("Awesome Autonomous", new AutonomousCommand());
smartDashboard->PutData("Autonomous Modes", autonomousModes);
}
void Robot::AutonomousInit() {
autonomousCommand = (Command) autonomousModes->GetSelected();
if (autonomousCommand != NULL) autonomousCommand->Start();
}