Veranstaltungen#

Einführung#

Ereignisse ermöglichen es Ihnen, eine Funktion asynchron zu starten. Wenn ein Ereignis ausgelöst wird, wird die Callback-Funktion des Ereignisses in einem eigenen Task (Thread) gestartet, sodass Ihr Hauptcode gleichzeitig weiter ausgeführt werden kann.

Wichtig: Ein event Objekt speichert genau eine Callback-Funktion. Wenn Sie eine weitere Funktion mit demselben Ereignisobjekt registrieren, ersetzt diese die vorherige Callback-Funktion.

Wenn Sie möchten, dass mehrere Dinge durch einen einzigen Auslöser geschehen, haben Sie folgende Möglichkeiten:

  • Mehrere Hilfsfunktionen aus einem einzigen Callback aufrufen, oder

  • Verwenden Sie mehrere Ereignisobjekte und senden Sie jedes einzelne an die Öffentlichkeit.

  • Verwenden Sie separate Threads, um Aufgaben unabhängig voneinander auszuführen.

Um ein Ereignis zu erstellen und anschließend zu verwenden, befolgen Sie diese Schritte in dieser Reihenfolge:

  1. Erstelle das Ereignis mit event.

  2. Setzen Sie die Rückruffunktion des Ereignisses mithilfe des Ereignisnamens (z. B.: myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Löst aus, dass alle registrierten Funktionen in einem Ereignisobjekt parallel ausgeführt werden.

    • broadcastAndWait — Löst alle registrierten Funktionen in einem Ereignisobjekt aus und wartet, bis diese abgeschlossen sind, bevor fortgefahren wird.

Klassenkonstruktoren#

1 — Erstellt ein event Objekt ohne Callback-Funktion.

event();

2 — Erstellt ein event Objekt mit einer Callback-Funktion.

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

3 — Erzeugt ein event Objekt aus einem anderen Ereignis mit einer Callback-Funktion.

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

4 — Erstellt ein event Objekt mit einer Callback-Funktion, die ein Argument akzeptiert.

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

5 — Erzeugt ein event Objekt aus einem anderen Ereignis mit einer Rückruffunktion, die ein Argument akzeptiert.

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

Klassendestruktor#

Zerstört das Ereignisobjekt event zugehörigen Ressourcen frei.

~event();

Parameter#

Parameter

Typ

Beschreibung

callback

void (*)(void)

Eine Funktion, die zuvor definiert wurde und ausgeführt werden soll, wenn das Ereignis übertragen wird.

v

event

Ein vorhandenes Ereignisobjekt zum Kopieren.

callback

void (*)(void *)

Eine Funktion, die einen Void-Pointer als Argument akzeptiert und ausgeführt wird, wenn das Ereignis übertragen wird.

arg

void *

Ein Zeiger auf Daten, die an die Callback-Funktion übergeben werden.

Anmerkungen#

  • Ein event Objekt speichert genau eine Callback-Funktion. Wenn Sie eine weitere Funktion mit demselben Ereignisobjekt registrieren, ersetzt diese die vorherige Callback-Funktion.

  • Wenn Sie möchten, dass mehrere Dinge durch einen einzigen Auslöser geschehen, haben Sie folgende Möglichkeiten:

    • Mehrere Hilfsfunktionen aus einem einzigen Callback aufrufen, oder

    • Verwenden Sie mehrere Ereignisobjekte und senden Sie jedes einzelne an die Öffentlichkeit.

    • Verwenden Sie separate Threads, um Aufgaben unabhängig voneinander auszuführen.

Beispiel#

// 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);
}

Mitgliedsfunktionen#

Die Klasse event enthält die folgenden Memberfunktionen:

  • operator — Legt eine Rückruffunktion für das Ereignis fest.

  • broadcast — Löst aus, dass die Callback-Funktion des Ereignisses parallel ausgeführt wird.

  • broadcastAndWait — Löst die Callback-Funktion des Ereignisses aus und wartet auf deren Abschluss.

Bevor event Memberfunktionen aufgerufen werden können, muss eine event Instanz erstellt werden, wie unten dargestellt:

/* 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#

Legt mithilfe des Funktionsaufrufoperators eine Rückruffunktion für das Ereignis fest.

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

Parameters

Parameter

Typ

Beschreibung

callback

void (*)(void)

Eine zuvor definierte Callback-Funktion, die automatisch aufgerufen wird, wenn das Ereignis übertragen wird. Die Funktion muss der erforderlichen Callback-Signatur entsprechen. Weitere Informationen finden Sie unter Callback-Funktionen.

Return Values

Diese Funktion gibt keinen Wert zurück.

Notes
  • Das erneute Festlegen einer Callback-Funktion ersetzt die vorherige Callback-Funktion.

  • Die Callback-Funktion darf keine Parameter haben und muss void zurückgeben.

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 startet den Rückruf des Ereignisses und wird sofort fortgesetzt.

Member Functions
void broadcast();

Parameters

Diese Funktion benötigt keine Parameter.

Return Values

Diese Funktion gibt keinen Wert zurück.

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#

Startet den Callback und wartet, bis er beendet ist (oder ein Timeout auftritt).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Parameter

Typ

Beschreibung

timeout

int32_t

Die Anzahl der Millisekunden, die gewartet werden soll, bevor der Code erneut ausgeführt wird (Standardwert: 60000).

Return Values

Diese Funktion gibt keinen Wert zurück.

Notes
  • Verwenden Sie dies nur mit Callbacks, die beendet werden (keine Endlosschleifen).

  • Dies ist eine Wartefunktion, die die Ausführung blockiert, bis der Callback abgeschlossen ist oder ein Timeout auftritt.

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!");
}