[commands] Allow unsetting a subsystem's default command (#4621)

This commit is contained in:
Colin Wong
2022-11-28 16:03:14 -06:00
committed by GitHub
parent 2b2aa8eef7
commit ec124bb662
3 changed files with 38 additions and 0 deletions

View File

@@ -367,6 +367,10 @@ public final class CommandScheduler implements NTSendable, AutoCloseable {
DriverStation.reportWarning("Tried to register a null subsystem", true);
continue;
}
if (m_subsystems.containsKey(subsystem)) {
DriverStation.reportWarning("Tried to register an already-registered subsystem", true);
continue;
}
m_subsystems.put(subsystem, null);
}
}
@@ -416,6 +420,22 @@ public final class CommandScheduler implements NTSendable, AutoCloseable {
m_subsystems.put(subsystem, defaultCommand);
}
/**
* Removes the default command for a subsystem. The current default command will run until another
* command is scheduled that requires the subsystem, at which point the current default command
* will not be re-scheduled.
*
* @param subsystem the subsystem whose default command will be removed
*/
public void removeDefaultCommand(Subsystem subsystem) {
if (subsystem == null) {
DriverStation.reportWarning("Tried to remove a default command for a null subsystem", true);
return;
}
m_subsystems.put(subsystem, null);
}
/**
* Gets the default command associated with this subsystem. Null if this subsystem has no default
* command associated with it.

View File

@@ -258,6 +258,11 @@ void CommandScheduler::Run() {
}
void CommandScheduler::RegisterSubsystem(Subsystem* subsystem) {
if (m_impl->subsystems.find(subsystem) != m_impl->subsystems.end()) {
std::puts("Tried to register an already-registered subsystem");
return;
}
m_impl->subsystems[subsystem] = nullptr;
}
@@ -306,6 +311,10 @@ void CommandScheduler::SetDefaultCommand(Subsystem* subsystem,
SetDefaultCommandImpl(subsystem, std::move(defaultCommand).Unwrap());
}
void CommandScheduler::RemoveDefaultCommand(Subsystem* subsystem) {
m_impl->subsystems[subsystem] = nullptr;
}
Command* CommandScheduler::GetDefaultCommand(const Subsystem* subsystem) const {
auto&& find = m_impl->subsystems.find(subsystem);
if (find != m_impl->subsystems.end()) {

View File

@@ -200,6 +200,15 @@ class CommandScheduler final : public nt::NTSendable,
*/
void SetDefaultCommand(Subsystem* subsystem, CommandPtr&& defaultCommand);
/**
* Removes the default command for a subsystem. The current default command
* will run until another command is scheduled that requires the subsystem, at
* which point the current default command will not be re-scheduled.
*
* @param subsystem the subsystem whose default command will be removed
*/
void RemoveDefaultCommand(Subsystem* subsystem);
/**
* Gets the default command associated with this subsystem. Null if this
* subsystem has no default command associated with it.