24#ifndef TAPROOT_GOVERNOR_WITH_FALLBACK_COMMAND_HPP_
25#define TAPROOT_GOVERNOR_WITH_FALLBACK_COMMAND_HPP_
33#include "../command.hpp"
46template <std::
size_t NUM_CONDITIONS>
51 std::vector<Subsystem *> subRequirements,
52 Command &commandWhenGovernorsReady,
54 const std::array<CommandGovernorInterface *, NUM_CONDITIONS> &commandGovernorList,
55 const bool stopFallbackCommandIfGovernorsReady =
false)
56 : commandWhenGovernorsReady(commandWhenGovernorsReady),
57 fallbackCommand(fallbackCommand),
58 commandGovernorList(commandGovernorList),
59 stopFallbackCommandIfGovernorsReady(stopFallbackCommandIfGovernorsReady)
61 std::for_each(subRequirements.begin(), subRequirements.end(), [&](
auto sub) {
62 addSubsystemRequirement(sub);
72 return governedCommandSelected ? commandWhenGovernorsReady.
getName()
78 governedCommandSelected = checkGovernorReadiness();
80 return (governedCommandSelected && commandWhenGovernorsReady.
isReady()) ||
81 (!governedCommandSelected && fallbackCommand.
isReady());
86 if (governedCommandSelected)
98 if (governedCommandSelected)
100 commandWhenGovernorsReady.
execute();
108 void end(
bool interrupted)
override
110 if (governedCommandSelected)
112 commandWhenGovernorsReady.
end(interrupted);
116 fallbackCommand.
end(interrupted);
122 if (governedCommandSelected)
124 return commandWhenGovernorsReady.
isFinished() || checkAnyGovernorFinished();
127 (stopFallbackCommandIfGovernorsReady && checkGovernorReadiness());
131 bool governedCommandSelected =
false;
132 Command &commandWhenGovernorsReady;
135 std::array<CommandGovernorInterface *, NUM_CONDITIONS> commandGovernorList;
136 const bool stopFallbackCommandIfGovernorsReady;
138 bool checkGovernorReadiness()
const
141 commandGovernorList.begin(),
142 commandGovernorList.end(),
143 [](
auto governor) { return governor->isReady(); });
146 bool checkAnyGovernorFinished()
const
149 commandGovernorList.begin(),
150 commandGovernorList.end(),
151 [](
auto governor) { return governor->isFinished(); });
Definition command.hpp:44
virtual void initialize()=0
virtual bool isFinished() const =0
virtual const char * getName() const =0
mockable subsystem_scheduler_bitmap_t getRequirementsBitwise() const
Definition command.hpp:64
virtual bool isReady()
Definition command.cpp:46
virtual void end(bool interrupted)=0
Definition governor_with_fallback_command.hpp:48
void execute() override
Definition governor_with_fallback_command.hpp:96
GovernorWithFallbackCommand(std::vector< Subsystem * > subRequirements, Command &commandWhenGovernorsReady, Command &fallbackCommand, const std::array< CommandGovernorInterface *, NUM_CONDITIONS > &commandGovernorList, const bool stopFallbackCommandIfGovernorsReady=false)
Definition governor_with_fallback_command.hpp:50
const char * getName() const override
Definition governor_with_fallback_command.hpp:70
void end(bool interrupted) override
Definition governor_with_fallback_command.hpp:108
bool isFinished() const override
Definition governor_with_fallback_command.hpp:120
bool isReady() override
Definition governor_with_fallback_command.hpp:76
void initialize() override
Definition governor_with_fallback_command.hpp:84
Definition command_governor_interface.hpp:28