001// Copyright (c) FIRST and other WPILib contributors.
002// Open Source Software; you can modify and/or share it under the terms of
003// the WPILib BSD license file in the root directory of this project.
004
005package edu.wpi.first.wpilibj2.command;
006
007import java.util.Set;
008
009/**
010 * Schedules the given commands when this command is initialized, and ends when all the commands are
011 * no longer scheduled. Useful for forking off from CommandGroups. If this command is interrupted,
012 * it will cancel all of the commands.
013 *
014 * <p>This class is provided by the NewCommands VendorDep
015 */
016public class ProxyScheduleCommand extends CommandBase {
017  private final Set<Command> m_toSchedule;
018  private boolean m_finished;
019
020  /**
021   * Creates a new ProxyScheduleCommand that schedules the given commands when initialized, and ends
022   * when they are all no longer scheduled.
023   *
024   * @param toSchedule the commands to schedule
025   * @deprecated Replace with {@link ProxyCommand}, composing multiple of them in a {@link
026   *     ParallelRaceGroup} if needed.
027   */
028  @Deprecated
029  public ProxyScheduleCommand(Command... toSchedule) {
030    m_toSchedule = Set.of(toSchedule);
031  }
032
033  @Override
034  public void initialize() {
035    for (Command command : m_toSchedule) {
036      command.schedule();
037    }
038  }
039
040  @Override
041  public void end(boolean interrupted) {
042    if (interrupted) {
043      for (Command command : m_toSchedule) {
044        command.cancel();
045      }
046    }
047  }
048
049  @Override
050  public void execute() {
051    m_finished = true;
052    for (Command command : m_toSchedule) {
053      m_finished &= !command.isScheduled();
054    }
055  }
056
057  @Override
058  public boolean isFinished() {
059    return m_finished;
060  }
061}