diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SelectCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SelectCommand.java index aeb885df9cc..2bffd9775fd 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SelectCommand.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SelectCommand.java @@ -27,6 +27,9 @@ public class SelectCommand extends Command { private boolean m_runsWhenDisabled = true; private InterruptionBehavior m_interruptBehavior = InterruptionBehavior.kCancelIncoming; + private final Command m_defaultCommand = + new PrintCommand("SelectCommand selector value does not correspond to any command!"); + /** * Creates a new SelectCommand. * @@ -37,6 +40,7 @@ public SelectCommand(Map commands, Supplier selector) { m_commands = requireNonNullParam(commands, "commands", "SelectCommand"); m_selector = requireNonNullParam(selector, "selector", "SelectCommand"); + CommandScheduler.getInstance().registerComposedCommands(m_defaultCommand); CommandScheduler.getInstance() .registerComposedCommands(commands.values().toArray(new Command[] {})); @@ -51,12 +55,7 @@ public SelectCommand(Map commands, Supplier selector) { @Override public void initialize() { - if (!m_commands.containsKey(m_selector.get())) { - m_selectedCommand = - new PrintCommand("SelectCommand selector value does not correspond to any command!"); - } else { - m_selectedCommand = m_commands.get(m_selector.get()); - } + m_selectedCommand = m_commands.getOrDefault(m_selector.get(), m_defaultCommand); m_selectedCommand.initialize(); } diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/SelectCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/SelectCommand.h index d8b7a9ca564..d425d76c563 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/SelectCommand.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/SelectCommand.h @@ -54,8 +54,10 @@ class SelectCommand : public CommandHelper> { std::make_unique>(std::move(commands.second))), ...); + m_defaultCommand.SetComposed(true); for (auto&& command : foo) { CommandScheduler::GetInstance().RequireUngrouped(command.second.get()); + command.second.get()->SetComposed(true); } for (auto&& command : foo) { @@ -73,8 +75,10 @@ class SelectCommand : public CommandHelper> { std::function selector, std::vector>>&& commands) : m_selector{std::move(selector)} { + m_defaultCommand.SetComposed(true); for (auto&& command : commands) { CommandScheduler::GetInstance().RequireUngrouped(command.second.get()); + command.second.get()->SetComposed(true); } for (auto&& command : commands) { @@ -139,14 +143,16 @@ class SelectCommand : public CommandHelper> { bool m_runsWhenDisabled = true; Command::InterruptionBehavior m_interruptBehavior{ Command::InterruptionBehavior::kCancelIncoming}; + + PrintCommand m_defaultCommand{ + "SelectCommand selector value does not correspond to any command!"}; }; template void SelectCommand::Initialize() { auto find = m_commands.find(m_selector()); if (find == m_commands.end()) { - m_selectedCommand = new PrintCommand( - "SelectCommand selector value does not correspond to any command!"); + m_selectedCommand = &m_defaultCommand; } else { m_selectedCommand = find->second.get(); }