mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
[robotpy] Mirror robotpy's commands-v2 (#8369)
Project import generated by Copybara. GitOrigin-RevId: 715c8e8372d936f447f2937aab6b1a22dc619126
This commit is contained in:
71
commandsv2/src/main/python/commands2/deferredcommand.py
Normal file
71
commandsv2/src/main/python/commands2/deferredcommand.py
Normal file
@@ -0,0 +1,71 @@
|
||||
# validated: 2024-01-24 DS 192a28af4731 DeferredCommand.java
|
||||
from typing import Callable
|
||||
|
||||
from wpiutil import SendableBuilder
|
||||
|
||||
from .command import Command
|
||||
from .commandscheduler import CommandScheduler
|
||||
from .printcommand import PrintCommand
|
||||
from .subsystem import Subsystem
|
||||
|
||||
|
||||
class DeferredCommand(Command):
|
||||
"""
|
||||
Defers Command construction to runtime. Runs the command returned by a supplier when this command
|
||||
is initialized, and ends when it ends. Useful for performing runtime tasks before creating a new
|
||||
command. If this command is interrupted, it will cancel the command.
|
||||
|
||||
Note that the supplier *must* create a new Command each call. For selecting one of a
|
||||
preallocated set of commands, use :class:`commands2.SelectCommand`.
|
||||
"""
|
||||
|
||||
def __init__(self, supplier: Callable[[], Command], *requirements: Subsystem):
|
||||
"""
|
||||
|
||||
Creates a new DeferredCommand that directly runs the supplied command when initialized, and
|
||||
ends when it ends. Useful for lazily creating commands when the DeferredCommand is initialized,
|
||||
such as if the supplied command depends on runtime state. The Supplier will be called
|
||||
each time this command is initialized. The Supplier *must* create a new Command each call.
|
||||
|
||||
:param supplier: The command supplier
|
||||
:param requirements: The command requirements.
|
||||
"""
|
||||
super().__init__()
|
||||
|
||||
assert callable(supplier)
|
||||
|
||||
self._null_command = PrintCommand(
|
||||
f"[DeferredCommand] Supplied command (from {supplier!r} was None!"
|
||||
)
|
||||
self._supplier = supplier
|
||||
self._command = self._null_command
|
||||
self.addRequirements(*requirements)
|
||||
|
||||
def initialize(self):
|
||||
cmd = self._supplier()
|
||||
if cmd is not None:
|
||||
self._command = cmd
|
||||
CommandScheduler.getInstance().registerComposedCommands([self._command])
|
||||
self._command.initialize()
|
||||
|
||||
def execute(self):
|
||||
self._command.execute()
|
||||
|
||||
def isFinished(self):
|
||||
return self._command.isFinished()
|
||||
|
||||
def end(self, interrupted):
|
||||
self._command.end(interrupted)
|
||||
self._command = self._null_command
|
||||
|
||||
def initSendable(self, builder: SendableBuilder):
|
||||
super().initSendable(builder)
|
||||
builder.addStringProperty(
|
||||
"deferred",
|
||||
lambda: (
|
||||
"null"
|
||||
if self._command is self._null_command
|
||||
else self._command.getName()
|
||||
),
|
||||
lambda _: None,
|
||||
)
|
||||
Reference in New Issue
Block a user