diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/Command.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/Command.java
index 255291b933..1364c1f3bd 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/Command.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/Command.java
@@ -13,6 +13,7 @@ import edu.wpi.first.util.function.BooleanConsumer;
import edu.wpi.first.util.sendable.Sendable;
import edu.wpi.first.util.sendable.SendableBuilder;
import edu.wpi.first.util.sendable.SendableRegistry;
+import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.function.BooleanSupplier;
@@ -96,6 +97,19 @@ public abstract class Command implements Sendable {
}
}
+ /**
+ * Adds the specified subsystems to the requirements of the command. The scheduler will prevent
+ * two commands that require the same subsystem from being scheduled simultaneously.
+ *
+ *
Note that the scheduler determines the requirements of a command when it is scheduled, so
+ * this method should normally be called from the command's constructor.
+ *
+ * @param requirements the requirements to add
+ */
+ public final void addRequirements(Collection requirements) {
+ m_requirements.addAll(requirements);
+ }
+
/**
* Gets the name of this Command.
*
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ConditionalCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ConditionalCommand.java
index 42db3f0b99..15c8674da7 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ConditionalCommand.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ConditionalCommand.java
@@ -39,8 +39,8 @@ public class ConditionalCommand extends Command {
CommandScheduler.getInstance().registerComposedCommands(onTrue, onFalse);
- m_requirements.addAll(m_onTrue.getRequirements());
- m_requirements.addAll(m_onFalse.getRequirements());
+ addRequirements(m_onTrue.getRequirements());
+ addRequirements(m_onFalse.getRequirements());
}
@Override
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/PIDCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/PIDCommand.java
index 26627fa30f..fed674413b 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/PIDCommand.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/PIDCommand.java
@@ -7,7 +7,6 @@ package edu.wpi.first.wpilibj2.command;
import static edu.wpi.first.util.ErrorMessages.requireNonNullParam;
import edu.wpi.first.math.controller.PIDController;
-import java.util.Set;
import java.util.function.DoubleConsumer;
import java.util.function.DoubleSupplier;
@@ -55,7 +54,7 @@ public class PIDCommand extends Command {
m_useOutput = useOutput;
m_measurement = measurementSource;
m_setpoint = setpointSource;
- m_requirements.addAll(Set.of(requirements));
+ addRequirements(requirements);
}
/**
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelCommandGroup.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelCommandGroup.java
index 6ea58698c6..cb5dcf0c0e 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelCommandGroup.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelCommandGroup.java
@@ -55,7 +55,7 @@ public class ParallelCommandGroup extends Command {
"Multiple commands in a parallel composition cannot require the same subsystems");
}
m_commands.put(command, false);
- m_requirements.addAll(command.getRequirements());
+ addRequirements(command.getRequirements());
m_runWhenDisabled &= command.runsWhenDisabled();
if (command.getInterruptionBehavior() == InterruptionBehavior.kCancelSelf) {
m_interruptBehavior = InterruptionBehavior.kCancelSelf;
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelDeadlineGroup.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelDeadlineGroup.java
index eb576d7587..fae0542322 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelDeadlineGroup.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelDeadlineGroup.java
@@ -85,7 +85,7 @@ public class ParallelDeadlineGroup extends Command {
"Multiple commands in a parallel group cannot require the same subsystems");
}
m_commands.put(command, false);
- m_requirements.addAll(command.getRequirements());
+ addRequirements(command.getRequirements());
m_runWhenDisabled &= command.runsWhenDisabled();
if (command.getInterruptionBehavior() == InterruptionBehavior.kCancelSelf) {
m_interruptBehavior = InterruptionBehavior.kCancelSelf;
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelRaceGroup.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelRaceGroup.java
index 39fe6114b4..538ab11d5d 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelRaceGroup.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelRaceGroup.java
@@ -56,7 +56,7 @@ public class ParallelRaceGroup extends Command {
"Multiple commands in a parallel composition cannot require the same subsystems");
}
m_commands.add(command);
- m_requirements.addAll(command.getRequirements());
+ addRequirements(command.getRequirements());
m_runWhenDisabled &= command.runsWhenDisabled();
if (command.getInterruptionBehavior() == InterruptionBehavior.kCancelSelf) {
m_interruptBehavior = InterruptionBehavior.kCancelSelf;
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ProfiledPIDCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ProfiledPIDCommand.java
index 4e82811739..39bdf246c1 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ProfiledPIDCommand.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ProfiledPIDCommand.java
@@ -8,7 +8,6 @@ import static edu.wpi.first.math.trajectory.TrapezoidProfile.State;
import static edu.wpi.first.util.ErrorMessages.requireNonNullParam;
import edu.wpi.first.math.controller.ProfiledPIDController;
-import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.DoubleSupplier;
import java.util.function.Supplier;
@@ -58,7 +57,7 @@ public class ProfiledPIDCommand extends Command {
m_useOutput = useOutput;
m_measurement = measurementSource;
m_goal = goalSource;
- m_requirements.addAll(Set.of(requirements));
+ addRequirements(requirements);
}
/**
@@ -86,7 +85,7 @@ public class ProfiledPIDCommand extends Command {
m_useOutput = useOutput;
m_measurement = measurementSource;
m_goal = () -> new State(goalSource.getAsDouble(), 0);
- m_requirements.addAll(Set.of(requirements));
+ addRequirements(requirements);
}
/**
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RepeatCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RepeatCommand.java
index 70ff63c610..6c64b4f2e4 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RepeatCommand.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RepeatCommand.java
@@ -33,7 +33,7 @@ public class RepeatCommand extends Command {
public RepeatCommand(Command command) {
m_command = requireNonNullParam(command, "command", "RepeatCommand");
CommandScheduler.getInstance().registerComposedCommands(command);
- m_requirements.addAll(command.getRequirements());
+ addRequirements(command.getRequirements());
setName("Repeat(" + command.getName() + ")");
}
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SelectCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SelectCommand.java
index 28d06eb085..b888e98eb5 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SelectCommand.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SelectCommand.java
@@ -47,7 +47,7 @@ public class SelectCommand extends Command {
.registerComposedCommands(commands.values().toArray(new Command[] {}));
for (Command command : m_commands.values()) {
- m_requirements.addAll(command.getRequirements());
+ addRequirements(command.getRequirements());
m_runsWhenDisabled &= command.runsWhenDisabled();
if (command.getInterruptionBehavior() == InterruptionBehavior.kCancelSelf) {
m_interruptBehavior = InterruptionBehavior.kCancelSelf;
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SequentialCommandGroup.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SequentialCommandGroup.java
index 87805972c3..905b8a6bbd 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SequentialCommandGroup.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SequentialCommandGroup.java
@@ -49,7 +49,7 @@ public class SequentialCommandGroup extends Command {
for (Command command : commands) {
m_commands.add(command);
- m_requirements.addAll(command.getRequirements());
+ addRequirements(command.getRequirements());
m_runWhenDisabled &= command.runsWhenDisabled();
if (command.getInterruptionBehavior() == InterruptionBehavior.kCancelSelf) {
m_interruptBehavior = InterruptionBehavior.kCancelSelf;