/*----------------------------------------------------------------------------*/ /* Copyright (c) FIRST 2017. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #pragma once #include #include "Commands/Command.h" #include "Commands/InstantCommand.h" namespace frc { /** * A {@link ConditionalCommand} is a {@link Command} that starts one of two * commands. * *

* A {@link ConditionalCommand} uses m_condition to determine whether it should * run m_onTrue or m_onFalse. *

* *

* A {@link ConditionalCommand} adds the proper {@link Command} to the {@link * Scheduler} during {@link ConditionalCommand#initialize()} and then {@link * ConditionalCommand#isFinished()} will return true once that {@link Command} * has finished executing. *

* *

* If no {@link Command} is specified for m_onFalse, the occurrence of that * condition will be a no-op. *

* * @see Command * @see Scheduler */ class ConditionalCommand : public Command { public: explicit ConditionalCommand(Command* onTrue, Command* onFalse = new InstantCommand()); ConditionalCommand(const std::string& name, Command* onTrue, Command* onFalse = new InstantCommand()); virtual ~ConditionalCommand() = default; protected: /** * The Condition to test to determine which Command to run. * * @return true if m_onTrue should be run or false if m_onFalse should be run. */ virtual bool Condition() = 0; void _Initialize() override; void _Cancel() override; bool IsFinished() override; void Interrupted() override; private: /** * The Command to execute if {@link ConditionalCommand#Condition()} returns * true */ Command* m_onTrue; /** * The Command to execute if {@link ConditionalCommand#Condition()} returns * false */ Command* m_onFalse; /** * Stores command chosen by condition */ Command* m_chosenCommand = nullptr; }; } // namespace frc