Sincronizar dos comandos

Importante

Esta documentación describe el uso de la biblioteca dejada basada en comandos. Si bien esta documentación se ha conservado para ayudar a los equipos que aún no lo han hecho, se recomienda encarecidamente a los equipos que migren a la nueva biblioteca <docs/software/commandbased/index:Command-Based Programming>`.

Los comandos se pueden anidar dentro de los grupos de comandos para crear comandos más complejos. Los comandos más simples se pueden agregar a los grupos de comandos para que se ejecuten secuencialmente (cada comando termina antes de que comience el siguiente) o en paralelo (el comando está programado y el siguiente comando también está programado de inmediato). Ocasionalmente, hay momentos en los que desea asegurarse que se completen dos comandos paralelos antes de pasar al siguiente comando. Este artículo describe cómo hacer eso.

CommandGroup con comandos secuenciales y paralelos

public class CoopBridgeAutonomous extends CommandGroup {

    public  CoopBridgeAutonomous() {
       //SmartDashboard.putDouble("Camera Time", 5.0);
       addSequential(new SetTipperState(BridgeTipper.READY_STATE)); // 1
       addParallel(new SetVirtualSetpoint(SetVirtualSetpoint.HYBRID_LOCATION)); // 2
       addSequential(new DriveToBridge()); // 3
       addParallel(new ContinuousCollect());
       addSequential(new SetTipperState(BridgeTipper.DOWN_STATE));

       // addParallel(new WaitThenShoot());

       addSequential(new TurnToTargetLowPassFilterHybrid(4.0));
       addSequential(new FireSequence());
       addSequential(new MoveBallToShooter(true));
    }
}

En este ejemplo ciertos comandos son añadidos en paralelos y otros son añadidos secuencialmente al CommandGroup CoopBridgeAutonomous (1). El primer comando «SetTipperState» es añadido y se completa antes de que comience el comando SetVirtualSetpoint (2). Antes de que se complete el comando SetVirtualSetpoint, el comando DriveToBridge se programa inmediatamente debido a que el SetVirtualSetpoint se agrega en paralelo (3). Este ejemplo podría darle una idea de cómo se programan los comandos.

Ejemplo, Diagrama de Flujo

An example command flow.

Nota

No hay dependencia proveniente de los comandos programados usando «Agregar paralelo», o ambos de estos comandos aún podrían ejecutarse cuando se alcanza el comando MoveBallToShooter.

Aquí está el código que se muestra arriba representado como un diagrama de flujo. Cualquier comando en la secuencia principal (la secuencia de la derecha aquí) que requiera un subsistema en uso por un comando paralelo hará que se cancele el comando paralelo. Por ejemplo, si FireSequence requirió un subsistema en uso por ``SetVirtualSetpoint, el comando SetVirtualSetpoint se cancelará cuando se programe FireSequence.

Esperando por un Comando

A command waiting to go to the next state.

Si hay dos comandos que deben completarse antes de que se programen los siguientes comandos, se pueden colocar en un grupo de comandos por sí mismos, agregando ambos en paralelo. Entonces ese grupo de comandos se puede programar secuencialmente desde un grupo de comandos adjunto. Cuando un grupo de comandos se programa secuencialmente, los comandos dentro de él finalizarán antes de que se programe el siguiente comando externo. De esta manera, puede estar seguro de que una acción que consta de múltiples comandos paralelos se ha completado antes de pasar al siguiente comando.

En este ejemplo, puede ver que la adición de un grupo de comandos «Move to Bridge» que contiene los comandos Set Virtual Setpoint y Drive to Bridge obliga a ambos a completarse antes de que se programen los siguientes comandos.