Add dependency injection of Subsystem to Command (#1275)

This commit is contained in:
Matt Soucy
2018-08-19 22:43:21 -04:00
committed by Peter Johnson
parent 6df500e726
commit e28295fc7b
12 changed files with 291 additions and 2 deletions

View File

@@ -27,6 +27,10 @@ Command::Command(const wpi::Twine& name) : Command(name, -1.0) {}
Command::Command(double timeout) : Command("", timeout) {}
Command::Command(Subsystem& requirement) : Command("", -1.0) {
Requires(&requirement);
}
Command::Command(const wpi::Twine& name, double timeout) : SendableBase(false) {
// We use -1.0 to indicate no timeout.
if (timeout < 0.0 && timeout != -1.0)
@@ -43,6 +47,21 @@ Command::Command(const wpi::Twine& name, double timeout) : SendableBase(false) {
}
}
Command::Command(const wpi::Twine& name, Subsystem& requirement)
: Command(name, -1.0) {
Requires(&requirement);
}
Command::Command(double timeout, Subsystem& requirement)
: Command("", timeout) {
Requires(&requirement);
}
Command::Command(const wpi::Twine& name, double timeout, Subsystem& requirement)
: Command(name, timeout) {
Requires(&requirement);
}
double Command::TimeSinceInitialized() const {
if (m_startTime < 0.0)
return 0.0;

View File

@@ -11,4 +11,7 @@ using namespace frc;
InstantCommand::InstantCommand(const wpi::Twine& name) : Command(name) {}
InstantCommand::InstantCommand(const wpi::Twine& name, Subsystem& subsystem)
: Command(name, subsystem) {}
bool InstantCommand::IsFinished() { return true; }

View File

@@ -41,6 +41,39 @@ PIDCommand::PIDCommand(double p, double i, double d, double period) {
m_controller = std::make_shared<PIDController>(p, i, d, this, this, period);
}
PIDCommand::PIDCommand(const wpi::Twine& name, double p, double i, double d,
double f, double period, Subsystem& requirement)
: Command(name, requirement) {
m_controller = std::make_shared<PIDController>(p, i, d, this, this, period);
}
PIDCommand::PIDCommand(double p, double i, double d, double f, double period,
Subsystem& requirement) {
m_controller =
std::make_shared<PIDController>(p, i, d, f, this, this, period);
}
PIDCommand::PIDCommand(const wpi::Twine& name, double p, double i, double d,
Subsystem& requirement)
: Command(name) {
m_controller = std::make_shared<PIDController>(p, i, d, this, this);
}
PIDCommand::PIDCommand(const wpi::Twine& name, double p, double i, double d,
double period, Subsystem& requirement)
: Command(name) {
m_controller = std::make_shared<PIDController>(p, i, d, this, this, period);
}
PIDCommand::PIDCommand(double p, double i, double d, Subsystem& requirement) {
m_controller = std::make_shared<PIDController>(p, i, d, this, this);
}
PIDCommand::PIDCommand(double p, double i, double d, double period,
Subsystem& requirement) {
m_controller = std::make_shared<PIDController>(p, i, d, this, this, period);
}
void PIDCommand::_Initialize() { m_controller->Enable(); }
void PIDCommand::_End() { m_controller->Disable(); }

View File

@@ -14,4 +14,11 @@ TimedCommand::TimedCommand(const wpi::Twine& name, double timeout)
TimedCommand::TimedCommand(double timeout) : Command(timeout) {}
TimedCommand::TimedCommand(const wpi::Twine& name, double timeout,
Subsystem& requirement)
: Command(name, timeout, requirement) {}
TimedCommand::TimedCommand(double timeout, Subsystem& requirement)
: Command(timeout, requirement) {}
bool TimedCommand::IsFinished() { return IsTimedOut(); }

View File

@@ -72,6 +72,13 @@ class Command : public ErrorBase, public SendableBase {
*/
explicit Command(double timeout);
/**
* Creates a new command with the given timeout and a default name.
*
* @param requirement the subsystem that the command requires
*/
explicit Command(Subsystem& requirement);
/**
* Creates a new command with the given name and timeout.
*
@@ -81,6 +88,33 @@ class Command : public ErrorBase, public SendableBase {
*/
Command(const wpi::Twine& name, double timeout);
/**
* Creates a new command with the given name and timeout.
*
* @param name the name of the command
* @param requirement the subsystem that the command requires
*/
Command(const wpi::Twine& name, Subsystem& requirement);
/**
* Creates a new command with the given name and timeout.
*
* @param timeout the time (in seconds) before this command "times out"
* @param requirement the subsystem that the command requires
* @see IsTimedOut()
*/
Command(double timeout, Subsystem& requirement);
/**
* Creates a new command with the given name and timeout.
*
* @param name the name of the command
* @param timeout the time (in seconds) before this command "times out"
* @param requirement the subsystem that the command requires
* @see IsTimedOut()
*/
Command(const wpi::Twine& name, double timeout, Subsystem& requirement);
~Command() override = default;
/**

View File

@@ -27,6 +27,14 @@ class InstantCommand : public Command {
*/
explicit InstantCommand(const wpi::Twine& name);
/**
* Creates a new InstantCommand with the given name.
*
* @param name The name for this command
* @param requirement The subsystem that the command requires
*/
InstantCommand(const wpi::Twine& name, Subsystem& requirement);
InstantCommand() = default;
virtual ~InstantCommand() = default;

View File

@@ -28,6 +28,17 @@ class PIDCommand : public Command, public PIDOutput, public PIDSource {
PIDCommand(double p, double i, double d);
PIDCommand(double p, double i, double d, double period);
PIDCommand(double p, double i, double d, double f, double period);
PIDCommand(const wpi::Twine& name, double p, double i, double d,
Subsystem& requirement);
PIDCommand(const wpi::Twine& name, double p, double i, double d,
double period, Subsystem& requirement);
PIDCommand(const wpi::Twine& name, double p, double i, double d, double f,
double period, Subsystem& requirement);
PIDCommand(double p, double i, double d, Subsystem& requirement);
PIDCommand(double p, double i, double d, double period,
Subsystem& requirement);
PIDCommand(double p, double i, double d, double f, double period,
Subsystem& requirement);
virtual ~PIDCommand() = default;
void SetSetpointRelative(double deltaSetpoint);

View File

@@ -35,6 +35,23 @@ class TimedCommand : public Command {
*/
explicit TimedCommand(double timeout);
/**
* Creates a new TimedCommand with the given name and timeout.
*
* @param name the name of the command
* @param timeout the time (in seconds) before this command "times out"
* @param requirement the subsystem that the command requires
*/
TimedCommand(const wpi::Twine& name, double timeout, Subsystem& requirement);
/**
* Creates a new WaitCommand with the given timeout.
*
* @param timeout the time (in seconds) before this command "times out"
* @param requirement the subsystem that the command requires
*/
TimedCommand(double timeout, Subsystem& requirement);
virtual ~TimedCommand() = default;
protected: