/*----------------------------------------------------------------------------*/ /* Copyright (c) 2019 FIRST. 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 #include #include #include "CommandGroupBase.h" #include "CommandHelper.h" namespace frc2 { /** * A CommandGroup that runs a set of commands in parallel, ending only when a * specific command (the "deadline") ends, interrupting all other commands that * are still running at that point. * *

As a rule, CommandGroups require the union of the requirements of their * component commands. */ class ParallelDeadlineGroup : public CommandHelper { public: /** * Creates a new ParallelDeadlineGroup. The given commands (including the * deadline) will be executed simultaneously. The CommandGroup will finish * when the deadline finishes, interrupting all other still-running commands. * If the CommandGroup is interrupted, only the commands still running will be * interrupted. * * @param deadline the command that determines when the group ends * @param commands the commands to be executed */ ParallelDeadlineGroup(std::unique_ptr&& deadline, std::vector>&& commands); /** * Creates a new ParallelDeadlineGroup. The given commands (including the * deadline) will be executed simultaneously. The CommandGroup will finish * when the deadline finishes, interrupting all other still-running commands. * If the CommandGroup is interrupted, only the commands still running will be * interrupted. * * @param deadline the command that determines when the group ends * @param commands the commands to be executed */ template >>, typename = std::enable_if_t>...>>> explicit ParallelDeadlineGroup(T&& deadline, Types&&... commands) { SetDeadline(std::make_unique>( std::forward(deadline))); AddCommands(std::forward(commands)...); } ParallelDeadlineGroup(ParallelDeadlineGroup&& other) = default; // No copy constructors for command groups ParallelDeadlineGroup(const ParallelDeadlineGroup&) = delete; template >...>>> void AddCommands(Types&&... commands) { std::vector> foo; ((void)foo.emplace_back(std::make_unique>( std::forward(commands))), ...); AddCommands(std::move(foo)); } void Initialize() override; void Execute() override; void End(bool interrupted) override; bool IsFinished() override; bool RunsWhenDisabled() const override; private: void AddCommands(std::vector>&& commands) override; void SetDeadline(std::unique_ptr&& deadline); std::unordered_map, bool> m_commands; Command* m_deadline; bool m_runWhenDisabled{true}; bool isRunning = false; }; } // namespace frc2