Eventos#

Introducción#

Los eventos permiten ejecutar funciones en paralelo mediante objetos de evento. En lugar de llamar a las funciones secuencialmente, los eventos permiten registrarlas y activarlas todas a la vez. Cada función registrada se ejecuta en su propio hilo, lo que permite que el robot realice varias acciones simultáneamente, como hacer parpadear los LED y conducir.

A continuación se muestra una lista de métodos y constructores disponibles:

  • event – Creates a new event object.

  • Register Functions to an Event – Registers a function to the event object.

  • broadcast – Triggers all registered functions in an event object to run in parallel.

  • broadcastAndWait – Triggers all registered functions in an event object and waits for them to finish before continuing.

Create an Event Object#

The event constructor is used to create an event object that manages function execution in separate threads.

Usage:
event(callback);

Parámetro

Descripción

callback

Opcional. Una función que se define previamente para ejecutarse cuando se transmite el evento.

// Blink the screen while moving forward
// Create moveEvent as an event object
event moveEvent = event();

void blinkScreen() {
  while (true) {
    Brain.Screen.clearScreen(red);
    wait(0.5, seconds);
    Brain.Screen.clearScreen();
    wait(0.5, seconds);
  }
}

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  moveEvent(blinkScreen);
  moveEvent.broadcast();
  Drivetrain.drive(forward);
}

// Blink the screen while moving forward
// Create moveEvent as an event object
void blinkScreen() {
  while (true) {
    Brain.Screen.clearScreen(red);
    wait(0.5, seconds);
    Brain.Screen.clearScreen();
    wait(0.5, seconds);
  }
}

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  event moveEvent = event(blinkScreen);
  moveEvent.broadcast();
  Drivetrain.drive(forward);
}

Register Functions to an Event#

Cuando se registra una función en un evento, se ejecutará en un hilo separado cuando se transmita el evento.

Usage:
eventName(callback);

Parámetro

Descripción

eventName

El nombre del objeto de evento creado previamente.

callback

Una función que se define previamente para ejecutarse cuando se transmite el evento.

// Blink the screen while turning
event moveEvent = event();

void blinkScreen() {
  while (true) {
    Brain.Screen.clearScreen(red);
    wait(0.5, seconds);
    Brain.Screen.clearScreen();
    wait(0.5, seconds);
  }
}

void turning() {
  Drivetrain.turn(right);
}
int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Register multiple functions to the event object
  moveEvent(blinkScreen);
  moveEvent(turning);

  moveEvent.broadcast();
}

broadcast#

broadcast() triggers an event, starting all registered functions in separate threads. This method does not pause execution of any subsequent functions.

Usage:
myEvent.broadcast();

Parámetro

Descripción

myEvent

El nombre del objeto de evento creado previamente.

// Blink the screen while moving forward
// Create moveEvent as an event object
event moveEvent = event();

void blinkScreen() {
  while (true) {
    Brain.Screen.clearScreen(red);
    wait(0.5, seconds);
    Brain.Screen.clearScreen();
    wait(0.5, seconds);
  }
}

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  moveEvent(blinkScreen);
  moveEvent.broadcast();
  Drivetrain.drive(forward);
}

broadcastAndWait#

broadcastAndWait() starts an event but waits for all registered functions to finish before continuing with subsequent functions.

Usage:
myEvent.broadcastAndWait();

Parámetro

Descripción

myEvent

El nombre del objeto de evento creado previamente.

// Move after the left button is pressed
event moveEvent = event();

void moveAndTurn() {
  Drivetrain.driveFor(forward, 150, mm);
  Drivetrain.turnFor(right, 90, degrees);
}

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  moveEvent(moveAndTurn);
  while (true) {
    if (Brain.buttonLeft.pressing()) {
      moveEvent.broadcastAndWait();
      break;
    }
    wait(20, msec);
  }
  Brain.Screen.print("Movement done.");
}