// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #pragma once #include #include #include #include "frc2/command/CommandBase.h" #include "frc2/command/CommandHelper.h" namespace frc2 { /** * A command that allows the user to pass in functions for each of the basic * command methods through the constructor. Useful for inline definitions of * complex commands - note, however, that if a command is beyond a certain * complexity it is usually better practice to write a proper class for it than * to inline it. */ class FunctionalCommand : public CommandHelper { public: /** * Creates a new FunctionalCommand. * * @param onInit the function to run on command initialization * @param onExecute the function to run on command execution * @param onEnd the function to run on command end * @param isFinished the function that determines whether the command has * finished * @param requirements the subsystems required by this command */ FunctionalCommand(std::function onInit, std::function onExecute, std::function onEnd, std::function isFinished, std::initializer_list requirements); /** * Creates a new FunctionalCommand. * * @param onInit the function to run on command initialization * @param onExecute the function to run on command execution * @param onEnd the function to run on command end * @param isFinished the function that determines whether the command has * finished * @param requirements the subsystems required by this command */ FunctionalCommand(std::function onInit, std::function onExecute, std::function onEnd, std::function isFinished, wpi::ArrayRef requirements = {}); FunctionalCommand(FunctionalCommand&& other) = default; FunctionalCommand(const FunctionalCommand& other) = default; void Initialize() override; void Execute() override; void End(bool interrupted) override; bool IsFinished() override; private: std::function m_onInit; std::function m_onExecute; std::function m_onEnd; std::function m_isFinished; }; } // namespace frc2