[commands] Fix compose-while-scheduled issue and test all compositions (#5581)

This commit is contained in:
Ryan Blue
2023-12-23 15:12:13 -05:00
committed by GitHub
parent aeb1a4aa33
commit ef1cb3f41e
20 changed files with 146 additions and 83 deletions

View File

@@ -477,6 +477,29 @@ void CommandScheduler::RequireUngrouped(
}
}
void CommandScheduler::RequireUngroupedAndUnscheduled(const Command* command) {
if (IsScheduled(command)) {
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Commands that have been scheduled individually may "
"not be added to another composition!");
}
RequireUngrouped(command);
}
void CommandScheduler::RequireUngroupedAndUnscheduled(
std::span<const std::unique_ptr<Command>> commands) {
for (auto&& command : commands) {
RequireUngroupedAndUnscheduled(command.get());
}
}
void CommandScheduler::RequireUngroupedAndUnscheduled(
std::initializer_list<const Command*> commands) {
for (auto&& command : commands) {
RequireUngroupedAndUnscheduled(command);
}
}
void CommandScheduler::InitSendable(wpi::SendableBuilder& builder) {
builder.SetSmartDashboardType("Scheduler");
builder.AddStringArrayProperty(

View File

@@ -12,7 +12,7 @@ ConditionalCommand::ConditionalCommand(std::unique_ptr<Command>&& onTrue,
std::unique_ptr<Command>&& onFalse,
std::function<bool()> condition)
: m_condition{std::move(condition)} {
CommandScheduler::GetInstance().RequireUngrouped(
CommandScheduler::GetInstance().RequireUngroupedAndUnscheduled(
{onTrue.get(), onFalse.get()});
m_onTrue = std::move(onTrue);

View File

@@ -63,7 +63,7 @@ Command::InterruptionBehavior ParallelCommandGroup::GetInterruptionBehavior()
void ParallelCommandGroup::AddCommands(
std::vector<std::unique_ptr<Command>>&& commands) {
CommandScheduler::GetInstance().RequireUngrouped(commands);
CommandScheduler::GetInstance().RequireUngroupedAndUnscheduled(commands);
if (isRunning) {
throw FRC_MakeError(frc::err::CommandIllegalUse,

View File

@@ -62,7 +62,7 @@ Command::InterruptionBehavior ParallelDeadlineGroup::GetInterruptionBehavior()
void ParallelDeadlineGroup::AddCommands(
std::vector<std::unique_ptr<Command>>&& commands) {
CommandScheduler::GetInstance().RequireUngrouped(commands);
CommandScheduler::GetInstance().RequireUngroupedAndUnscheduled(commands);
if (!m_finished) {
throw FRC_MakeError(frc::err::CommandIllegalUse,

View File

@@ -50,7 +50,7 @@ Command::InterruptionBehavior ParallelRaceGroup::GetInterruptionBehavior()
void ParallelRaceGroup::AddCommands(
std::vector<std::unique_ptr<Command>>&& commands) {
CommandScheduler::GetInstance().RequireUngrouped(commands);
CommandScheduler::GetInstance().RequireUngroupedAndUnscheduled(commands);
if (isRunning) {
throw FRC_MakeError(frc::err::CommandIllegalUse,

View File

@@ -9,7 +9,7 @@
using namespace frc2;
RepeatCommand::RepeatCommand(std::unique_ptr<Command>&& command) {
CommandScheduler::GetInstance().RequireUngrouped(command.get());
CommandScheduler::GetInstance().RequireUngroupedAndUnscheduled(command.get());
m_command = std::move(command);
m_command->SetComposed(true);
AddRequirements(m_command->GetRequirements());

View File

@@ -62,7 +62,7 @@ Command::InterruptionBehavior SequentialCommandGroup::GetInterruptionBehavior()
void SequentialCommandGroup::AddCommands(
std::vector<std::unique_ptr<Command>>&& commands) {
CommandScheduler::GetInstance().RequireUngrouped(commands);
CommandScheduler::GetInstance().RequireUngroupedAndUnscheduled(commands);
if (m_currentCommandIndex != invalid_index) {
throw FRC_MakeError(frc::err::CommandIllegalUse,

View File

@@ -9,7 +9,7 @@
using namespace frc2;
WrapperCommand::WrapperCommand(std::unique_ptr<Command>&& command) {
CommandScheduler::GetInstance().RequireUngrouped(command.get());
CommandScheduler::GetInstance().RequireUngroupedAndUnscheduled(command.get());
m_command = std::move(command);
m_command->SetComposed(true);
// copy the wrapped command's name