Source code for commands2.proxycommand

# validated: 2024-01-19 DS 192a28af4731 ProxyCommand.java
from __future__ import annotations

from wpiutil import SendableBuilder

from .command import Command


[docs] class ProxyCommand(Command): """ Schedules a given command when this command is initialized and ends when it ends, but does not directly run it. Use this for including a command in a composition without adding its requirements, but only if you know what you are doing. If you are unsure, see `the WPILib docs <https://docs.wpilib.org/en/stable/docs/software/commandbased/command-compositions.html#scheduling-other-commands>`_ for a complete explanation of proxy semantics. Do not proxy a command from a subsystem already required by the composition, or else the composition will cancel itself when the proxy is reached. If this command is interrupted, it will cancel the command. """ _command: Command def __init__(self, command: Command): """ Creates a new ProxyCommand that schedules the given command when initialized, and ends when it is no longer scheduled. :param command: the command to run by proxy """ super().__init__() self.setName(f"Proxy({command.getName()})") self._command = command
[docs] def initialize(self): self._command.schedule()
[docs] def end(self, interrupted: bool): assert self._command is not None if interrupted: self._command.cancel() self._command = None
[docs] def execute(self): pass
[docs] def isFinished(self) -> bool: # because we're between `initialize` and `end`, `self._command` is necessarily not None # but if called otherwise and m_command is None, # it's UB, so we can do whatever we want -- like return true. return self._command is None or not self._command.isScheduled()
[docs] def runsWhenDisabled(self) -> bool: """ Whether the given command should run when the robot is disabled. Override to return true if the command should run when disabled. :returns: true. Otherwise, this proxy would cancel commands that do run when disabled. """ return True
[docs] def initSendable(self, builder: SendableBuilder): super().initSendable(builder) builder.addStringProperty( "proxied", lambda: "null" if self._command is None else self._command.getName(), lambda _: None, )