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 0420301ead..86ba4d7858 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 @@ -252,11 +252,29 @@ public interface Command { * decorated without issue. * * @return the decorated command + * @deprecated use {@link #endlessly()} instead. */ + @Deprecated(forRemoval = true, since = "2023") default PerpetualCommand perpetually() { return new PerpetualCommand(this); } + /** + * Decorates this command to run endlessly, ignoring its ordinary end conditions. The decorated + * command can still be interrupted or canceled. + * + *
Note: This decorator works by composing this command within a CommandGroup. The command + * cannot be used independently after being decorated, or be re-decorated with a different + * decorator, unless it is manually cleared from the list of grouped commands with {@link + * CommandGroupBase#clearGroupedCommand(Command)}. The decorated command can, however, be further + * decorated without issue. + * + * @return the decorated command + */ + default EndlessCommand endlessly() { + return new EndlessCommand(this); + } + /** * Decorates this command to run repeatedly, restarting it when it ends, until this command is * interrupted. The decorated command can still be canceled. diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/EndlessCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/EndlessCommand.java new file mode 100644 index 0000000000..3f2e3ffb00 --- /dev/null +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/EndlessCommand.java @@ -0,0 +1,60 @@ +// 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. + +package edu.wpi.first.wpilibj2.command; + +import static edu.wpi.first.wpilibj2.command.CommandGroupBase.registerGroupedCommands; +import static edu.wpi.first.wpilibj2.command.CommandGroupBase.requireUngrouped; + +/** + * A command that runs another command endlessly, ignoring that command's end conditions. While this + * class does not extend {@link CommandGroupBase}, it is still considered a CommandGroup, as it + * allows one to compose another command within it; the command instances that are passed to it + * cannot be added to any other groups, or scheduled individually. + * + *
As a rule, CommandGroups require the union of the requirements of their component commands. + * + *
This class is provided by the NewCommands VendorDep + */ +public class EndlessCommand extends CommandBase { + protected final Command m_command; + + /** + * Creates a new EndlessCommand. Will run another command endlessly, ignoring that command's end + * conditions, unless this command itself is interrupted. + * + * @param command the command to run endlessly + */ + public EndlessCommand(Command command) { + requireUngrouped(command); + registerGroupedCommands(command); + m_command = command; + m_requirements.addAll(command.getRequirements()); + } + + @Override + public void initialize() { + m_command.initialize(); + } + + @Override + public void execute() { + m_command.execute(); + } + + @Override + public void end(boolean interrupted) { + m_command.end(interrupted); + } + + @Override + public boolean runsWhenDisabled() { + return m_command.runsWhenDisabled(); + } + + @Override + public EndlessCommand endlessly() { + return this; + } +} diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/PerpetualCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/PerpetualCommand.java index 7113be674b..4ecda74876 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/PerpetualCommand.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/PerpetualCommand.java @@ -16,7 +16,10 @@ import static edu.wpi.first.wpilibj2.command.CommandGroupBase.requireUngrouped; *
As a rule, CommandGroups require the union of the requirements of their component commands. * *
This class is provided by the NewCommands VendorDep
+ *
+ * @deprecated Replaced by {@link EndlessCommand}.
*/
+@Deprecated(forRemoval = true, since = "2023")
public class PerpetualCommand extends CommandBase {
protected final Command m_command;
diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/Command.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/Command.cpp
index 93510513d0..04d315222d 100644
--- a/wpilibNewCommands/src/main/native/cpp/frc2/command/Command.cpp
+++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/Command.cpp
@@ -5,6 +5,7 @@
#include "frc2/command/Command.h"
#include "frc2/command/CommandScheduler.h"
+#include "frc2/command/EndlessCommand.h"
#include "frc2/command/InstantCommand.h"
#include "frc2/command/ParallelCommandGroup.h"
#include "frc2/command/ParallelDeadlineGroup.h"
@@ -88,6 +89,10 @@ PerpetualCommand Command::Perpetually() && {
return PerpetualCommand(std::move(*this).TransferOwnership());
}
+EndlessCommand Command::Endlessly() && {
+ return EndlessCommand(std::move(*this).TransferOwnership());
+}
+
RepeatCommand Command::Repeat() && {
return RepeatCommand(std::move(*this).TransferOwnership());
}
diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/EndlessCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/EndlessCommand.cpp
new file mode 100644
index 0000000000..a7d28c9e6c
--- /dev/null
+++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/EndlessCommand.cpp
@@ -0,0 +1,32 @@
+// 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.
+
+#include "frc2/command/EndlessCommand.h"
+
+using namespace frc2;
+
+EndlessCommand::EndlessCommand(std::unique_ptr As a rule, CommandGroups require the union of the requirements of their
+ * component commands.
+ *
+ * This class is provided by the NewCommands VendorDep
+ */
+class EndlessCommand : public CommandHelper