[commands] Refactor lambda-based commands to inherit FunctionalCommand (#4451)

This commit is contained in:
Starlight220
2022-10-07 01:49:27 +03:00
committed by GitHub
parent b2276e47de
commit 5cf961edb9
9 changed files with 44 additions and 119 deletions

View File

@@ -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;
*
* <p>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(() -> {});
}
}

View File

@@ -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;
*
* <p>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);
}
}

View File

@@ -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;
*
* <p>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<Boolean> droppingParameter(Runnable run) {
return bool -> run.run();
}
}