diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/InstantCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/InstantCommand.java
index 586a2d57e7..25f7c9a109 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/InstantCommand.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/InstantCommand.java
@@ -4,8 +4,6 @@
package edu.wpi.first.wpilibj2.command;
-import static edu.wpi.first.wpilibj.util.ErrorMessages.requireNonNullParam;
-
/**
* A Command that runs instantly; it will initialize, execute once, and end on the same iteration of
* the scheduler. Users can either pass in a Runnable and a set of requirements, or else subclass
@@ -13,9 +11,7 @@ import static edu.wpi.first.wpilibj.util.ErrorMessages.requireNonNullParam;
*
*
This class is provided by the NewCommands VendorDep
*/
-public class InstantCommand extends CommandBase {
- private final Runnable m_toRun;
-
+public class InstantCommand extends FunctionalCommand {
/**
* Creates a new InstantCommand that runs the given Runnable with the given requirements.
*
@@ -23,9 +19,7 @@ public class InstantCommand extends CommandBase {
* @param requirements the subsystems required by this command
*/
public InstantCommand(Runnable toRun, Subsystem... requirements) {
- m_toRun = requireNonNullParam(toRun, "toRun", "InstantCommand");
-
- addRequirements(requirements);
+ super(toRun, () -> {}, interrupted -> {}, () -> true, requirements);
}
/**
@@ -33,16 +27,6 @@ public class InstantCommand extends CommandBase {
* constructor to call implicitly from subclass constructors.
*/
public InstantCommand() {
- m_toRun = () -> {};
- }
-
- @Override
- public void initialize() {
- m_toRun.run();
- }
-
- @Override
- public final boolean isFinished() {
- return true;
+ this(() -> {});
}
}
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RunCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RunCommand.java
index 2ae1c9214f..c0a17b57c1 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RunCommand.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RunCommand.java
@@ -4,8 +4,6 @@
package edu.wpi.first.wpilibj2.command;
-import static edu.wpi.first.wpilibj.util.ErrorMessages.requireNonNullParam;
-
import java.util.function.BooleanSupplier;
/**
@@ -15,9 +13,7 @@ import java.util.function.BooleanSupplier;
*
*
This class is provided by the NewCommands VendorDep
*/
-public class RunCommand extends CommandBase {
- protected final Runnable m_toRun;
-
+public class RunCommand extends FunctionalCommand {
/**
* Creates a new RunCommand. The Runnable will be run continuously until the command ends. Does
* not run when disabled.
@@ -26,12 +22,6 @@ public class RunCommand extends CommandBase {
* @param requirements the subsystems to require
*/
public RunCommand(Runnable toRun, Subsystem... requirements) {
- m_toRun = requireNonNullParam(toRun, "toRun", "RunCommand");
- addRequirements(requirements);
- }
-
- @Override
- public void execute() {
- m_toRun.run();
+ super(() -> {}, toRun, interrupted -> {}, () -> false, requirements);
}
}
diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/StartEndCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/StartEndCommand.java
index 8c0b99e42a..2ab586ad9a 100644
--- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/StartEndCommand.java
+++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/StartEndCommand.java
@@ -6,6 +6,8 @@ package edu.wpi.first.wpilibj2.command;
import static edu.wpi.first.wpilibj.util.ErrorMessages.requireNonNullParam;
+import java.util.function.Consumer;
+
/**
* A command that runs a given runnable when it is initialized, and another runnable when it ends.
* Useful for running and then stopping a motor, or extending and then retracting a solenoid. Has no
@@ -14,10 +16,7 @@ import static edu.wpi.first.wpilibj.util.ErrorMessages.requireNonNullParam;
*
*
This class is provided by the NewCommands VendorDep
*/
-public class StartEndCommand extends CommandBase {
- protected final Runnable m_onInit;
- protected final Runnable m_onEnd;
-
+public class StartEndCommand extends FunctionalCommand {
/**
* Creates a new StartEndCommand. Will run the given runnables when the command starts and when it
* ends.
@@ -27,19 +26,16 @@ public class StartEndCommand extends CommandBase {
* @param requirements the subsystems required by this command
*/
public StartEndCommand(Runnable onInit, Runnable onEnd, Subsystem... requirements) {
- m_onInit = requireNonNullParam(onInit, "onInit", "StartEndCommand");
- m_onEnd = requireNonNullParam(onEnd, "onEnd", "StartEndCommand");
-
- addRequirements(requirements);
+ super(
+ onInit,
+ () -> {},
+ // we need to do some magic here to null-check `onEnd` before it's captured
+ droppingParameter(requireNonNullParam(onEnd, "onEnd", "StartEndCommand")),
+ () -> false,
+ requirements);
}
- @Override
- public void initialize() {
- m_onInit.run();
- }
-
- @Override
- public void end(boolean interrupted) {
- m_onEnd.run();
+ private static Consumer droppingParameter(Runnable run) {
+ return bool -> run.run();
}
}
diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/InstantCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/InstantCommand.cpp
index 1e9d173c9b..96da37044a 100644
--- a/wpilibNewCommands/src/main/native/cpp/frc2/command/InstantCommand.cpp
+++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/InstantCommand.cpp
@@ -8,22 +8,14 @@ using namespace frc2;
InstantCommand::InstantCommand(std::function toRun,
std::initializer_list requirements)
- : m_toRun{std::move(toRun)} {
- AddRequirements(requirements);
-}
+ : CommandHelper(
+ std::move(toRun), [] {}, [](bool interrupted) {}, [] { return true; },
+ requirements) {}
InstantCommand::InstantCommand(std::function toRun,
wpi::span requirements)
- : m_toRun{std::move(toRun)} {
- AddRequirements(requirements);
-}
+ : CommandHelper(
+ std::move(toRun), [] {}, [](bool interrupted) {}, [] { return true; },
+ requirements) {}
-InstantCommand::InstantCommand() : m_toRun{[] {}} {}
-
-void InstantCommand::Initialize() {
- m_toRun();
-}
-
-bool InstantCommand::IsFinished() {
- return true;
-}
+InstantCommand::InstantCommand() : InstantCommand([] {}) {}
diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/RunCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/RunCommand.cpp
index c63e5d6eb8..067ee372d7 100644
--- a/wpilibNewCommands/src/main/native/cpp/frc2/command/RunCommand.cpp
+++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/RunCommand.cpp
@@ -8,16 +8,10 @@ using namespace frc2;
RunCommand::RunCommand(std::function toRun,
std::initializer_list requirements)
- : m_toRun{std::move(toRun)} {
- AddRequirements(requirements);
-}
+ : CommandHelper([] {}, std::move(toRun), [](bool interrupted) {},
+ [] { return false; }, requirements) {}
RunCommand::RunCommand(std::function toRun,
wpi::span requirements)
- : m_toRun{std::move(toRun)} {
- AddRequirements(requirements);
-}
-
-void RunCommand::Execute() {
- m_toRun();
-}
+ : CommandHelper([] {}, std::move(toRun), [](bool interrupted) {},
+ [] { return false; }, requirements) {}
diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/StartEndCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/StartEndCommand.cpp
index dc40200690..3a59bf0011 100644
--- a/wpilibNewCommands/src/main/native/cpp/frc2/command/StartEndCommand.cpp
+++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/StartEndCommand.cpp
@@ -9,27 +9,15 @@ using namespace frc2;
StartEndCommand::StartEndCommand(std::function onInit,
std::function onEnd,
std::initializer_list requirements)
- : m_onInit{std::move(onInit)}, m_onEnd{std::move(onEnd)} {
- AddRequirements(requirements);
-}
+ : CommandHelper(
+ std::move(onInit), [] {},
+ [onEnd = std::move(onEnd)](bool interrupted) { onEnd(); },
+ [] { return false; }, requirements) {}
StartEndCommand::StartEndCommand(std::function onInit,
std::function onEnd,
wpi::span requirements)
- : m_onInit{std::move(onInit)}, m_onEnd{std::move(onEnd)} {
- AddRequirements(requirements);
-}
-
-StartEndCommand::StartEndCommand(const StartEndCommand& other)
- : CommandHelper(other) {
- m_onInit = other.m_onInit;
- m_onEnd = other.m_onEnd;
-}
-
-void StartEndCommand::Initialize() {
- m_onInit();
-}
-
-void StartEndCommand::End(bool interrupted) {
- m_onEnd();
-}
+ : CommandHelper(
+ std::move(onInit), [] {},
+ [onEnd = std::move(onEnd)](bool interrupted) { onEnd(); },
+ [] { return false; }, requirements) {}
diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/InstantCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/InstantCommand.h
index c2638da8d1..2abc9ceed8 100644
--- a/wpilibNewCommands/src/main/native/include/frc2/command/InstantCommand.h
+++ b/wpilibNewCommands/src/main/native/include/frc2/command/InstantCommand.h
@@ -9,8 +9,8 @@
#include
-#include "frc2/command/CommandBase.h"
#include "frc2/command/CommandHelper.h"
+#include "frc2/command/FunctionalCommand.h"
namespace frc2 {
/**
@@ -20,7 +20,7 @@ namespace frc2 {
*
* This class is provided by the NewCommands VendorDep
*/
-class InstantCommand : public CommandHelper {
+class InstantCommand : public CommandHelper {
public:
/**
* Creates a new InstantCommand that runs the given Runnable with the given
@@ -51,12 +51,5 @@ class InstantCommand : public CommandHelper {
* only as a no-arg constructor to call implicitly from subclass constructors.
*/
InstantCommand();
-
- void Initialize() override;
-
- bool IsFinished() final;
-
- private:
- std::function m_toRun;
};
} // namespace frc2
diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/RunCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/RunCommand.h
index b9e1efd624..596bc48af6 100644
--- a/wpilibNewCommands/src/main/native/include/frc2/command/RunCommand.h
+++ b/wpilibNewCommands/src/main/native/include/frc2/command/RunCommand.h
@@ -9,8 +9,8 @@
#include
-#include "frc2/command/CommandBase.h"
#include "frc2/command/CommandHelper.h"
+#include "frc2/command/FunctionalCommand.h"
namespace frc2 {
/**
@@ -21,7 +21,7 @@ namespace frc2 {
*
* This class is provided by the NewCommands VendorDep
*/
-class RunCommand : public CommandHelper {
+class RunCommand : public CommandHelper {
public:
/**
* Creates a new RunCommand. The Runnable will be run continuously until the
@@ -46,10 +46,5 @@ class RunCommand : public CommandHelper {
RunCommand(RunCommand&& other) = default;
RunCommand(const RunCommand& other) = default;
-
- void Execute() override;
-
- protected:
- std::function m_toRun;
};
} // namespace frc2
diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/StartEndCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/StartEndCommand.h
index e5af2bbc43..4831faaefa 100644
--- a/wpilibNewCommands/src/main/native/include/frc2/command/StartEndCommand.h
+++ b/wpilibNewCommands/src/main/native/include/frc2/command/StartEndCommand.h
@@ -9,8 +9,8 @@
#include
-#include "frc2/command/CommandBase.h"
#include "frc2/command/CommandHelper.h"
+#include "frc2/command/FunctionalCommand.h"
namespace frc2 {
/**
@@ -22,7 +22,8 @@ namespace frc2 {
*
* This class is provided by the NewCommands VendorDep
*/
-class StartEndCommand : public CommandHelper {
+class StartEndCommand
+ : public CommandHelper {
public:
/**
* Creates a new StartEndCommand. Will run the given runnables when the
@@ -48,14 +49,6 @@ class StartEndCommand : public CommandHelper {
StartEndCommand(StartEndCommand&& other) = default;
- StartEndCommand(const StartEndCommand& other);
-
- void Initialize() override;
-
- void End(bool interrupted) override;
-
- protected:
- std::function m_onInit;
- std::function m_onEnd;
+ StartEndCommand(const StartEndCommand& other) = default;
};
} // namespace frc2