Eventos#

Introdução#

Os eventos permitem iniciar uma função de forma assíncrona. Quando um evento é transmitido, a função de callback do evento é iniciada na sua própria tarefa (thread), permitindo que o seu código principal continue a ser executado em simultâneo.

Importante: Um objeto de evento event armazena um callback. Se registar outra função com o mesmo objeto de evento, esta substituirá o retorno de chamada anterior.

Se pretende que várias coisas aconteçam a partir de um único gatilho, pode:

  • Chamar várias funções auxiliares a partir de um único callback, ou

  • Utilize múltiplos objetos de evento e transmita cada um deles.

  • Use separate threads to run tasks independently.

Para criar e utilizar um evento, siga os seguintes passos pela ordem indicada:

  1. Crie o evento com event.

  2. Defina o callback do evento utilizando o nome do evento (ex: myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Aciona todas as funções registadas num objeto de evento para serem executadas em paralelo.

    • broadcastAndWait — Aciona todas as funções registadas num objeto de evento e espera que terminem antes de continuar.

Construtores de Classes#

1 — Cria um objeto com event elemento sem função de callback.

event();

2 — Cria um objeto com event função de callback.

event( void (* callback)(void) );

3 — Cria um objeto de evento event a partir de outro evento com uma função de callback.

event( 
  event v, 
  void (* callback)(void) );

4 — Creates an event object with a callback function that accepts an argument.

event( void (* callback)(void *), void *arg );

5 — Cria um objeto de evento event a partir de outro evento com uma função de callback que aceita um argumento.

event( event v, void (* callback)(void *), void *arg );

Destrutor de classes#

Destroys the event object and releases associated resources.

~event();

Parâmetros#

Parâmetro

Tipo

Descrição

callback

void (*)(void)

Uma função previamente definida para ser executada quando o evento é transmitido.

v

event

Um objeto de evento existente para copiar.

callback

void (*)(void *)

Uma função que aceita um argumento ponteiro void e é executada quando o evento é transmitido.

arg

void *

Um ponteiro para os dados que serão passados ​​para a função de callback.

Notas#

  • An event object stores one callback. If you register another function with the same event object, it replaces the previous callback.

  • Se pretende que várias coisas aconteçam a partir de um único gatilho, pode:

    • Chamar várias funções auxiliares a partir de um único callback, ou

    • Utilize múltiplos objetos de evento e transmita cada um deles.

    • Utilize threads separados para executar tarefas de forma independente.

Exemplo#

// Create a callback function
void onMyEvent() {
  Brain.Screen.print("Callback function executed!");
}

int main() {
  // Create an event called myEvent and set onMyEvent
  // as the callback function.
  event myEvent(onMyEvent);
}

Funções de membro#

A classe event inclui as seguintes funções membro:

  • operator — Define uma função de chamada de retorno para o evento.

  • broadcast — Aciona a função de callback do evento para ser executada em paralelo.

  • broadcastAndWait — Aciona a função de callback do evento e aguarda a sua conclusão.

Antes de chamar qualquer função membro do evento event ), deve ser criada uma instância do evento event , como se mostra abaixo:

/* This constructor is required when using VS Code.
Event configuration can be created with or without
a callback function as shown in the examples above. */

// Create an event without a callback
event myEvent;

// Or create an event with a callback
event myEvent(onMyEvent);

operator#

Define uma função de retorno de chamada para o evento utilizando o operador de chamada de função.

Available Functions
void operator()( void (* callback)() );

Parameters

Parâmetro

Tipo

Descrição

callback

void (*)(void)

Uma função de chamada de retorno previamente definida que é chamada automaticamente quando o evento é transmitido. A função deve corresponder à assinatura de retorno de chamada necessária. Consulte Funções de retorno de chamada para obter mais informações.

Return Values

Esta função não devolve qualquer valor.

Notes
  • A definição de uma função de retorno de chamada novamente substitui a função de retorno de chamada anterior.

  • A função de retorno de chamada não deve ter parâmetros e deve retornar void.

Examples
void drawSquare() {
  Brain.Screen.clearScreen();
  Brain.Screen.drawRectangle(40, 40, 120, 120);
}

void drawCircle() {
  Brain.Screen.clearScreen();
  Brain.Screen.drawCircle(100, 100, 60);
}

int main() {
  // Create the event drawEvent.
  event drawEvent;

  Brain.Screen.print("Drawing a square...");

  // Set the event to drawSquare.
  drawEvent(drawSquare);

  wait(1, seconds);

  // Trigger the event.
  drawEvent.broadcast();

  wait(1, seconds);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Drawing a circle...");

  // Replace drawSquare with drawCircle.
  drawEvent(drawCircle);

  wait(1, seconds);

  // Trigger the event a second time.
  drawEvent.broadcast();
}

broadcast#

broadcast inicia o retorno de chamada do evento e continua imediatamente.

Member Functions
void broadcast();

Parameters

Esta função não recebe qualquer parâmetro.

Return Values

Esta função não devolve qualquer valor.

Examples
// Create a callback function.
void onMyEvent() {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Event fired!");
}

int main() {
  Brain.Screen.print("Broadcasting in 2 seconds...");

  // Create an event called myEvent and set onMyEvent
  // as the callback function.
  event myEvent(onMyEvent);

  wait(2, seconds);

  // Trigger the event.
  myEvent.broadcast();
}

broadcastAndWait#

Inicia a função de retorno de chamada e aguarda até que esta termine (ou atinja o tempo limite).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Parâmetro

Tipo

Descrição

timeout

int32_t

A quantidade de milissegundos a aguardar antes que o código comece a ser executado novamente (o predefinido é 60000).

Return Values

Esta função não devolve qualquer valor.

Notes
  • Utilize isto apenas com funções de callback que terminam (sem loops infinitos).

  • Esta é uma função de espera que bloqueia a execução até que o retorno de chamada esteja concluído ou o tempo limite expire.

Examples
void startDriving() {
  Drivetrain.drive(forward);
  wait(2, seconds);
}

int main() {
  Brain.Screen.print("Starting drive...");

  event driveEvent(startDriving);

  // Give the event time to be set.
  wait(0.25, seconds);

  // Run the event and wait until it finishes.
  driveEvent.broadcastAndWait();

  // Stop driving after 2 seconds.
  Drivetrain.stop();
  Brain.Screen.clearScreen();
  Brain.Screen.print("Drive complete!");
}