diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/Command.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/Command.java index fbd9973bb9..11241794cc 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/Command.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/Command.java @@ -446,14 +446,15 @@ public interface Command { default void setName(String name) {} /** - * Decorates this Command with a name. Is an inline function for #setName(String); + * Decorates this Command with a name. * * @param name name * @return the decorated Command */ - default Command withName(String name) { - this.setName(name); - return this; + default WrapperCommand withName(String name) { + WrapperCommand wrapper = new WrapperCommand(Command.this) {}; + wrapper.setName(name); + return wrapper; } /** diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/CommandBase.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/CommandBase.java index 30b8686d2b..395322a996 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/CommandBase.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/CommandBase.java @@ -56,12 +56,6 @@ public abstract class CommandBase implements Sendable, Command { SendableRegistry.setName(this, name); } - @Override - public CommandBase withName(String name) { - this.setName(name); - return this; - } - /** * Gets the subsystem name of this Command. * @@ -105,5 +99,8 @@ public abstract class CommandBase implements Sendable, Command { }); builder.addBooleanProperty( ".isParented", () -> CommandScheduler.getInstance().isComposed(this), null); + builder.addStringProperty( + "interruptBehavior", () -> getInterruptionBehavior().toString(), null); + builder.addBooleanProperty("runsWhenDisabled", this::runsWhenDisabled, null); } } diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ConditionalCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ConditionalCommand.java index 585047e93d..782f2179fe 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ConditionalCommand.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ConditionalCommand.java @@ -6,6 +6,7 @@ package edu.wpi.first.wpilibj2.command; import static edu.wpi.first.util.ErrorMessages.requireNonNullParam; +import edu.wpi.first.util.sendable.SendableBuilder; import java.util.function.BooleanSupplier; /** @@ -71,4 +72,21 @@ public class ConditionalCommand extends CommandBase { public boolean runsWhenDisabled() { return m_onTrue.runsWhenDisabled() && m_onFalse.runsWhenDisabled(); } + + @Override + public void initSendable(SendableBuilder builder) { + super.initSendable(builder); + builder.addStringProperty("onTrue", m_onTrue::getName, null); + builder.addStringProperty("onFalse", m_onFalse::getName, null); + builder.addStringProperty( + "selected", + () -> { + if (m_selectedCommand == null) { + return "null"; + } else { + return m_selectedCommand.getName(); + } + }, + null); + } } diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelDeadlineGroup.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelDeadlineGroup.java index 0687ed1a9c..2e62a9f08b 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelDeadlineGroup.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ParallelDeadlineGroup.java @@ -4,6 +4,7 @@ package edu.wpi.first.wpilibj2.command; +import edu.wpi.first.util.sendable.SendableBuilder; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -130,4 +131,11 @@ public class ParallelDeadlineGroup extends CommandGroupBase { public InterruptionBehavior getInterruptionBehavior() { return m_interruptBehavior; } + + @Override + public void initSendable(SendableBuilder builder) { + super.initSendable(builder); + + builder.addStringProperty("deadline", m_deadline::getName, null); + } } diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ProxyCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ProxyCommand.java index 61bd8d2fde..ef6ca5b6ea 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ProxyCommand.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/ProxyCommand.java @@ -6,6 +6,7 @@ package edu.wpi.first.wpilibj2.command; import static edu.wpi.first.util.ErrorMessages.requireNonNullParam; +import edu.wpi.first.util.sendable.SendableBuilder; import java.util.function.Supplier; /** @@ -36,6 +37,7 @@ public class ProxyCommand extends CommandBase { */ public ProxyCommand(Command command) { this(() -> command); + setName("Proxy(" + command.getName() + ")"); } @Override @@ -73,4 +75,11 @@ public class ProxyCommand extends CommandBase { public boolean runsWhenDisabled() { return true; } + + @Override + public void initSendable(SendableBuilder builder) { + super.initSendable(builder); + builder.addStringProperty( + "proxied", () -> m_command == null ? "null" : m_command.getName(), null); + } } diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RamseteCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RamseteCommand.java index 8aedfc6d41..69e271b428 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RamseteCommand.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RamseteCommand.java @@ -14,6 +14,7 @@ import edu.wpi.first.math.kinematics.ChassisSpeeds; import edu.wpi.first.math.kinematics.DifferentialDriveKinematics; import edu.wpi.first.math.kinematics.DifferentialDriveWheelSpeeds; import edu.wpi.first.math.trajectory.Trajectory; +import edu.wpi.first.util.sendable.SendableBuilder; import edu.wpi.first.wpilibj.Timer; import java.util.function.BiConsumer; import java.util.function.Supplier; @@ -211,4 +212,11 @@ public class RamseteCommand extends CommandBase { public boolean isFinished() { return m_timer.hasElapsed(m_trajectory.getTotalTimeSeconds()); } + + @Override + public void initSendable(SendableBuilder builder) { + super.initSendable(builder); + builder.addDoubleProperty("leftVelocity", () -> m_prevSpeeds.leftMetersPerSecond, null); + builder.addDoubleProperty("rightVelocity", () -> m_prevSpeeds.rightMetersPerSecond, null); + } } diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RepeatCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RepeatCommand.java index 3fcbfa7407..6de06c531f 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RepeatCommand.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/RepeatCommand.java @@ -6,6 +6,8 @@ package edu.wpi.first.wpilibj2.command; import static edu.wpi.first.util.ErrorMessages.requireNonNullParam; +import edu.wpi.first.util.sendable.SendableBuilder; + /** * A command that runs another command repeatedly, restarting it when it ends, until this command is * interrupted. Command instances that are passed to it cannot be added to any other groups, or @@ -31,6 +33,7 @@ public class RepeatCommand extends CommandBase { m_command = requireNonNullParam(command, "command", "RepeatCommand"); CommandScheduler.getInstance().registerComposedCommands(command); m_requirements.addAll(command.getRequirements()); + setName("Repeat(" + command.getName() + ")"); } @Override @@ -72,4 +75,10 @@ public class RepeatCommand extends CommandBase { public InterruptionBehavior getInterruptionBehavior() { return m_command.getInterruptionBehavior(); } + + @Override + public void initSendable(SendableBuilder builder) { + super.initSendable(builder); + builder.addStringProperty("command", m_command::getName, null); + } } 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 e7ed93404d..5305115197 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 @@ -6,6 +6,7 @@ package edu.wpi.first.wpilibj2.command; import static edu.wpi.first.util.ErrorMessages.requireNonNullParam; +import edu.wpi.first.util.sendable.SendableBuilder; import java.util.Map; import java.util.function.Supplier; @@ -108,4 +109,12 @@ public class SelectCommand extends CommandBase { public InterruptionBehavior getInterruptionBehavior() { return m_interruptBehavior; } + + @Override + public void initSendable(SendableBuilder builder) { + super.initSendable(builder); + + builder.addStringProperty( + "selected", () -> m_selectedCommand == null ? "null" : m_selectedCommand.getName(), null); + } } diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SequentialCommandGroup.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SequentialCommandGroup.java index 6de02e65f1..892f94ac2c 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SequentialCommandGroup.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/SequentialCommandGroup.java @@ -4,6 +4,7 @@ package edu.wpi.first.wpilibj2.command; +import edu.wpi.first.util.sendable.SendableBuilder; import java.util.ArrayList; import java.util.List; @@ -104,4 +105,11 @@ public class SequentialCommandGroup extends CommandGroupBase { public InterruptionBehavior getInterruptionBehavior() { return m_interruptBehavior; } + + @Override + public void initSendable(SendableBuilder builder) { + super.initSendable(builder); + + builder.addIntegerProperty("index", () -> m_currentCommandIndex, null); + } } diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/WaitCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/WaitCommand.java index e51d23ac0d..647e87e7f2 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/WaitCommand.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/WaitCommand.java @@ -4,6 +4,7 @@ package edu.wpi.first.wpilibj2.command; +import edu.wpi.first.util.sendable.SendableBuilder; import edu.wpi.first.util.sendable.SendableRegistry; import edu.wpi.first.wpilibj.Timer; @@ -47,4 +48,10 @@ public class WaitCommand extends CommandBase { public boolean runsWhenDisabled() { return true; } + + @Override + public void initSendable(SendableBuilder builder) { + super.initSendable(builder); + builder.addDoubleProperty("duration", () -> m_duration, null); + } } diff --git a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/WrapperCommand.java b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/WrapperCommand.java index 3ae055a874..c48871c5f4 100644 --- a/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/WrapperCommand.java +++ b/wpilibNewCommands/src/main/java/edu/wpi/first/wpilibj2/command/WrapperCommand.java @@ -26,6 +26,8 @@ public abstract class WrapperCommand extends CommandBase { protected WrapperCommand(Command command) { CommandScheduler.getInstance().registerComposedCommands(command); m_command = command; + // copy the wrapped command's name + setName(command.getName()); } /** The initial subroutine of a command. Called once when the command is initially scheduled. */ diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/Command.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/Command.cpp index b0b88e4a1b..b173ada496 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/Command.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/Command.cpp @@ -105,8 +105,7 @@ CommandPtr Command::HandleInterrupt(std::function handler) && { } CommandPtr Command::WithName(std::string_view name) && { - SetName(name); - return std::move(*this).ToPtr(); + return std::move(*this).ToPtr().WithName(name); } void Command::Schedule() { diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/CommandBase.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/CommandBase.cpp index 4744dca021..416c78be15 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/CommandBase.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/CommandBase.cpp @@ -64,4 +64,21 @@ void CommandBase::InitSendable(wpi::SendableBuilder& builder) { Cancel(); } }); + builder.AddBooleanProperty( + ".isParented", [this] { return IsComposed(); }, nullptr); + builder.AddStringProperty( + "interruptBehavior", + [this] { + switch (GetInterruptionBehavior()) { + case Command::InterruptionBehavior::kCancelIncoming: + return "kCancelIncoming"; + case Command::InterruptionBehavior::kCancelSelf: + return "kCancelSelf"; + default: + return "Invalid"; + } + }, + nullptr); + builder.AddBooleanProperty( + "runsWhenDisabled", [this] { return RunsWhenDisabled(); }, nullptr); } diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/CommandPtr.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/CommandPtr.cpp index 0399e866b2..44150a297c 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/CommandPtr.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/CommandPtr.cpp @@ -221,8 +221,9 @@ CommandPtr CommandPtr::HandleInterrupt(std::function handler) && { CommandPtr CommandPtr::WithName(std::string_view name) && { AssertValid(); - m_ptr->SetName(name); - return std::move(*this); + WrapperCommand wrapper{std::move(m_ptr)}; + wrapper.SetName(name); + return std::move(wrapper).ToPtr(); } CommandBase* CommandPtr::get() const { diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/ConditionalCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/ConditionalCommand.cpp index 9de3ce9ae5..2610c96b78 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/ConditionalCommand.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/ConditionalCommand.cpp @@ -4,6 +4,8 @@ #include "frc2/command/ConditionalCommand.h" +#include + using namespace frc2; ConditionalCommand::ConditionalCommand(std::unique_ptr&& onTrue, @@ -50,3 +52,21 @@ bool ConditionalCommand::IsFinished() { bool ConditionalCommand::RunsWhenDisabled() const { return m_runsWhenDisabled; } + +void ConditionalCommand::InitSendable(wpi::SendableBuilder& builder) { + CommandBase::InitSendable(builder); + builder.AddStringProperty( + "onTrue", [this] { return m_onTrue->GetName(); }, nullptr); + builder.AddStringProperty( + "onFalse", [this] { return m_onFalse->GetName(); }, nullptr); + builder.AddStringProperty( + "selected", + [this] { + if (m_selectedCommand) { + return m_selectedCommand->GetName(); + } else { + return std::string{"null"}; + } + }, + nullptr); +} diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/ParallelDeadlineGroup.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/ParallelDeadlineGroup.cpp index 93d42baad2..14c28c3a72 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/ParallelDeadlineGroup.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/ParallelDeadlineGroup.cpp @@ -4,6 +4,8 @@ #include "frc2/command/ParallelDeadlineGroup.h" +#include + using namespace frc2; ParallelDeadlineGroup::ParallelDeadlineGroup( @@ -93,3 +95,10 @@ void ParallelDeadlineGroup::SetDeadline(std::unique_ptr&& deadline) { AddRequirements(m_deadline->GetRequirements()); m_runWhenDisabled &= m_deadline->RunsWhenDisabled(); } + +void ParallelDeadlineGroup::InitSendable(wpi::SendableBuilder& builder) { + CommandBase::InitSendable(builder); + + builder.AddStringProperty( + "deadline", [this] { return m_deadline->GetName(); }, nullptr); +} diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/ProxyCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/ProxyCommand.cpp index 0fc7cdf602..cc1b815815 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/ProxyCommand.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/ProxyCommand.cpp @@ -4,13 +4,17 @@ #include "frc2/command/ProxyCommand.h" +#include + using namespace frc2; ProxyCommand::ProxyCommand(wpi::unique_function supplier) : m_supplier(std::move(supplier)) {} ProxyCommand::ProxyCommand(Command* command) - : m_supplier([command] { return command; }) {} + : m_supplier([command] { return command; }) { + SetName(std::string{"Proxy("}.append(command->GetName()).append(")")); +} ProxyCommand::ProxyCommand(std::unique_ptr command) : m_supplier([command = std::move(command)] { return command.get(); }) {} @@ -35,3 +39,17 @@ bool ProxyCommand::IsFinished() { // do whatever we want -- like return true. return m_command == nullptr || !m_command->IsScheduled(); } + +void ProxyCommand::InitSendable(wpi::SendableBuilder& builder) { + CommandBase::InitSendable(builder); + builder.AddStringProperty( + "proxied", + [this] { + if (m_command) { + return m_command->GetName(); + } else { + return std::string{"null"}; + } + }, + nullptr); +} diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/RamseteCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/RamseteCommand.cpp index 24f3922f58..d46cdd0af6 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/RamseteCommand.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/RamseteCommand.cpp @@ -6,6 +6,8 @@ #include +#include + using namespace frc2; RamseteCommand::RamseteCommand( @@ -158,3 +160,11 @@ void RamseteCommand::End(bool interrupted) { bool RamseteCommand::IsFinished() { return m_timer.HasElapsed(m_trajectory.TotalTime()); } + +void RamseteCommand::InitSendable(wpi::SendableBuilder& builder) { + CommandBase::InitSendable(builder); + builder.AddDoubleProperty( + "leftVelocity", [this] { return m_prevSpeeds.left.value(); }, nullptr); + builder.AddDoubleProperty( + "rightVelocity", [this] { return m_prevSpeeds.right.value(); }, nullptr); +} diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/RepeatCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/RepeatCommand.cpp index 9fcbe68711..319a7af46d 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/RepeatCommand.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/RepeatCommand.cpp @@ -4,6 +4,8 @@ #include "frc2/command/RepeatCommand.h" +#include + using namespace frc2; RepeatCommand::RepeatCommand(std::unique_ptr&& command) { @@ -11,6 +13,7 @@ RepeatCommand::RepeatCommand(std::unique_ptr&& command) { m_command = std::move(command); m_command->SetComposed(true); AddRequirements(m_command->GetRequirements()); + SetName(std::string{"Repeat("}.append(m_command->GetName()).append(")")); } void RepeatCommand::Initialize() { @@ -46,3 +49,9 @@ bool RepeatCommand::RunsWhenDisabled() const { Command::InterruptionBehavior RepeatCommand::GetInterruptionBehavior() const { return m_command->GetInterruptionBehavior(); } + +void RepeatCommand::InitSendable(wpi::SendableBuilder& builder) { + CommandBase::InitSendable(builder); + builder.AddStringProperty( + "command", [this] { return m_command->GetName(); }, nullptr); +} diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/SequentialCommandGroup.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/SequentialCommandGroup.cpp index 532614e242..7888c1d175 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/SequentialCommandGroup.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/SequentialCommandGroup.cpp @@ -4,6 +4,8 @@ #include "frc2/command/SequentialCommandGroup.h" +#include + using namespace frc2; SequentialCommandGroup::SequentialCommandGroup( @@ -79,3 +81,9 @@ void SequentialCommandGroup::AddCommands( m_commands.emplace_back(std::move(command)); } } + +void SequentialCommandGroup::InitSendable(wpi::SendableBuilder& builder) { + CommandBase::InitSendable(builder); + builder.AddIntegerProperty( + "index", [this] { return m_currentCommandIndex; }, nullptr); +} diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/WaitCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/WaitCommand.cpp index da03540ac3..94b8b8af02 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/WaitCommand.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/WaitCommand.cpp @@ -6,6 +6,7 @@ #include #include +#include using namespace frc2; @@ -29,3 +30,9 @@ bool WaitCommand::IsFinished() { bool WaitCommand::RunsWhenDisabled() const { return true; } + +void WaitCommand::InitSendable(wpi::SendableBuilder& builder) { + CommandBase::InitSendable(builder); + builder.AddDoubleProperty( + "duration", [this] { return m_duration.value(); }, nullptr); +} diff --git a/wpilibNewCommands/src/main/native/cpp/frc2/command/WrapperCommand.cpp b/wpilibNewCommands/src/main/native/cpp/frc2/command/WrapperCommand.cpp index ff31b7261f..f7928c964e 100644 --- a/wpilibNewCommands/src/main/native/cpp/frc2/command/WrapperCommand.cpp +++ b/wpilibNewCommands/src/main/native/cpp/frc2/command/WrapperCommand.cpp @@ -12,6 +12,8 @@ WrapperCommand::WrapperCommand(std::unique_ptr&& command) { CommandScheduler::GetInstance().RequireUngrouped(command.get()); m_command = std::move(command); m_command->SetComposed(true); + // copy the wrapped command's name + SetName(m_command->GetName()); } void WrapperCommand::Initialize() { diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/Command.h b/wpilibNewCommands/src/main/native/include/frc2/command/Command.h index e1f145d2e9..b657f3d649 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/Command.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/Command.h @@ -282,8 +282,7 @@ safe) semantics. [[nodiscard]] CommandPtr HandleInterrupt(std::function handler) &&; /** - * Decorates this Command with a name. Is an inline function for - * #SetName(std::string_view); + * Decorates this Command with a name. * * @param name name * @return the decorated Command diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/ConditionalCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/ConditionalCommand.h index 61c5d1ddc3..5957950c71 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/ConditionalCommand.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/ConditionalCommand.h @@ -73,6 +73,8 @@ class ConditionalCommand bool RunsWhenDisabled() const override; + void InitSendable(wpi::SendableBuilder& builder) override; + private: std::unique_ptr m_onTrue; std::unique_ptr m_onFalse; diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/ParallelDeadlineGroup.h b/wpilibNewCommands/src/main/native/include/frc2/command/ParallelDeadlineGroup.h index d408867210..cfe4b3ef51 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/ParallelDeadlineGroup.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/ParallelDeadlineGroup.h @@ -96,6 +96,8 @@ class ParallelDeadlineGroup Command::InterruptionBehavior GetInterruptionBehavior() const override; + void InitSendable(wpi::SendableBuilder& builder) override; + private: void AddCommands(std::vector>&& commands) final; diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/ProxyCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/ProxyCommand.h index f553f18776..b4a00a5221 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/ProxyCommand.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/ProxyCommand.h @@ -61,6 +61,8 @@ class ProxyCommand : public CommandHelper { bool IsFinished() override; + void InitSendable(wpi::SendableBuilder& builder) override; + private: wpi::unique_function m_supplier; Command* m_command = nullptr; diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/RamseteCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/RamseteCommand.h index c80589ccb8..d375e11ff6 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/RamseteCommand.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/RamseteCommand.h @@ -174,6 +174,8 @@ class RamseteCommand : public CommandHelper { bool IsFinished() override; + void InitSendable(wpi::SendableBuilder& builder) override; + private: frc::Trajectory m_trajectory; std::function m_pose; diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/RepeatCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/RepeatCommand.h index e0d2ab2e2c..5d353b99a8 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/RepeatCommand.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/RepeatCommand.h @@ -70,6 +70,8 @@ class RepeatCommand : public CommandHelper { Command::InterruptionBehavior GetInterruptionBehavior() const override; + void InitSendable(wpi::SendableBuilder& builder) override; + private: std::unique_ptr m_command; bool m_ended; diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/SelectCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/SelectCommand.h index d35f2f4d02..6b0852b011 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/SelectCommand.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/SelectCommand.h @@ -10,11 +10,14 @@ #endif #include +#include #include #include #include #include +#include + #include "frc2/command/CommandBase.h" #include "frc2/command/PrintCommand.h" @@ -122,6 +125,21 @@ class SelectCommand : public CommandHelper> { return m_interruptBehavior; } + void InitSendable(wpi::SendableBuilder& builder) override { + CommandBase::InitSendable(builder); + + builder.AddStringProperty( + "selected", + [this] { + if (m_selectedCommand) { + return m_selectedCommand->GetName(); + } else { + return std::string{"null"}; + } + }, + nullptr); + } + protected: std::unique_ptr TransferOwnership() && override { return std::make_unique(std::move(*this)); diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/SequentialCommandGroup.h b/wpilibNewCommands/src/main/native/include/frc2/command/SequentialCommandGroup.h index 7bf2a68b08..ba85b6a37e 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/SequentialCommandGroup.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/SequentialCommandGroup.h @@ -91,6 +91,8 @@ class SequentialCommandGroup Command::InterruptionBehavior GetInterruptionBehavior() const override; + void InitSendable(wpi::SendableBuilder& builder) override; + private: void AddCommands(std::vector>&& commands) final; diff --git a/wpilibNewCommands/src/main/native/include/frc2/command/WaitCommand.h b/wpilibNewCommands/src/main/native/include/frc2/command/WaitCommand.h index 4670d53f71..54eddfbe70 100644 --- a/wpilibNewCommands/src/main/native/include/frc2/command/WaitCommand.h +++ b/wpilibNewCommands/src/main/native/include/frc2/command/WaitCommand.h @@ -40,6 +40,8 @@ class WaitCommand : public CommandHelper { bool RunsWhenDisabled() const override; + void InitSendable(wpi::SendableBuilder& builder) override; + protected: frc::Timer m_timer; diff --git a/wpilibNewCommands/src/test/java/edu/wpi/first/wpilibj2/command/CommandDecoratorTest.java b/wpilibNewCommands/src/test/java/edu/wpi/first/wpilibj2/command/CommandDecoratorTest.java index 4296beeb62..392c23ce08 100644 --- a/wpilibNewCommands/src/test/java/edu/wpi/first/wpilibj2/command/CommandDecoratorTest.java +++ b/wpilibNewCommands/src/test/java/edu/wpi/first/wpilibj2/command/CommandDecoratorTest.java @@ -291,4 +291,12 @@ class CommandDecoratorTest extends CommandTestBase { assertEquals(2, second.get()); } } + + @Test + void withNameTest() { + InstantCommand command = new InstantCommand(); + String name = "Named"; + Command named = command.withName(name); + assertEquals(name, named.getName()); + } } diff --git a/wpilibNewCommands/src/test/native/cpp/frc2/command/CommandDecoratorTest.cpp b/wpilibNewCommands/src/test/native/cpp/frc2/command/CommandDecoratorTest.cpp index 3c69fab10e..5ab184cbc9 100644 --- a/wpilibNewCommands/src/test/native/cpp/frc2/command/CommandDecoratorTest.cpp +++ b/wpilibNewCommands/src/test/native/cpp/frc2/command/CommandDecoratorTest.cpp @@ -198,3 +198,10 @@ TEST_F(CommandDecoratorTest, HandleInterrupt) { // if `second == 1`, the second lambda ran before the first one EXPECT_EQ(2, second); } + +TEST_F(CommandDecoratorTest, WithName) { + InstantCommand command; + std::string name{"Named"}; + CommandPtr named = std::move(command).WithName(name); + EXPECT_EQ(name, named.get()->GetName()); +}